Trying to create a custom Websockets server to process real-time notifications

Robbie Lacivita
Tera Guru

Good Afternoon,

I have a requirement to create real-time notifications in a user's browser. We would do this via websockets, but ServiceNow does not support websockets OotB.

In researching for this, I stumbled across the Buzzpost.io application from ELIN Software (https://buzzpost.io/). This is exactly what I'm looking to create with a few modifications, however this was built around AWS, which we don't have access to. The only way we can get this same functionality is to create a custom server to act as a message broker and handle the websocket connection.

My thought process here is to send a payload to this server via REST. However, I'm struggling with how exactly I would create this server, as webserver development isn't my strong suit.

Does anyone have good resources on how I could create a websocket server to integrate into Servicenow, or have any experience with actually getting this to work already?

Thank you,

Robbie

3 REPLIES 3

Robbie Lacivita
Tera Guru

Also, I found this test page mentioned in the Madrid documentation. Unsure what to make of it, as its protected.

WebSockets

WebSockets are turned on by default. WebSockets connections may be limited by your network configuration. You can check your browser's compatibility by entering the following URL (you do not have to be logged on to an instance): https://yourinstance.service-now.com/$websocket_test.do.

The code for the page is:

Line 3: <meta charset="utf-8" />
Line 4: <title>WebSocket Test</title>
Line 5: <script language="javascript" type="text/javascript">

Line 8: 	var protocolPrefix = (window.location.protocol === 'https:') ? 'wss://' : 'ws://';
Line 9: 	var websocketEchoEndpoint = protocolPrefix + window.location.host + "/websocket_echo_test";
Line 10: 	var messageToSendToServer = Math.floor((Math.random() * 10000) + 1).toString();
Line 11: 	var timeoutId;
Line 12: 	var websocket;
Line 13: 
Line 14: 	function initializeWebsocketTesting()
Line 15: 	{
Line 16: 		outScreen = document.getElementById("outScreen");
Line 17: 		testWebSocket();
Line 18: 	}
Line 19: 
Line 20: 	function testWebSocket()
Line 21: 	{
Line 22: 		if(typeof WebSocket == "undefined"){
Line 23: 			appendToScreen('WEBSOCKETS ARE NOT SUPPORTED BY THIS BROWSER');

Line 25: 		else {
Line 26: 			websocket = new WebSocket(websocketEchoEndpoint);
Line 27: 			appendToScreen('WEBSOCKET UPGRADE REQUEST SENT FROM CLIENT TO SERVER');
Line 28: 			timeoutId = window.setTimeout(function(){webSocketUpgradeRequestTimedOut(websocket)}, packetTimeoutValue);
Line 29: 
Line 30: 			websocket.onopen = function(websocketEvent) { onOpen(websocketEvent, websocket) };
Line 31: 			websocket.onclose = function(websocketEvent) { onClose(websocketEvent) };
Line 32: 			websocket.onmessage = function(websocketEvent) { onMessage(websocketEvent, websocket) };
Line 33: 			websocket.onerror = function(websocketEvent) { onError(websocketEvent) };

Line 36: 
Line 37: 	function onOpen(websocketEvent, websocket)
Line 38: 	{
Line 39: 		window.clearTimeout(timeoutId);
Line 40: 		appendToScreen('WEBSOCKET UPGRADE REQUEST ACCEPTED BY SERVER');
Line 41: 		sendFrameToServer(messageToSendToServer);
Line 42: 		timeoutId = window.setTimeout(function(){websocketFrameTimeoutError(websocket)}, packetTimeoutValue);
Line 43: 	}
Line 44: 
Line 45: 	function onClose(websocketEvent)
Line 46: 	{
Line 47: 		appendToScreen('WEBSOCKET CONNECTION CLOSED');
Line 48: 		if(websocketEvent.code)
Line 49: 			appendToScreen('CLOSE CODE: [' + websocketEvent.code + ']');
Line 50: 		if(websocketEvent.reason)
Line 51: 			appendToScreen('CLOSE REASON: [' + websocketEvent.reason + ']');
Line 52: 		if(websocketEvent.wasClean)
Line 53: 			appendToScreen('DID THIS CONNECTION CLOSE IN A CLEAN MANNER: [' + websocketEvent.wasClean + ']');
Line 54: 	}
Line 55: 
Line 56: 	function onMessage(websocketEvent, websocket)
Line 57: 	{
Line 58: 		window.clearTimeout(timeoutId);
Line 59: 		appendToScreen('<span style="color: blue;">SERVER RESPONDED WITH FRAME: [ ' + websocketEvent.data + ' ]</span>');
Line 60: 		if(messageToSendToServer == websocketEvent.data) {
Line 61: 			appendToScreen('<span style="color: green;">THE NETWORK TOPOLOGY IS WEBSOCKET FRIENDLY AND WEBSOCKET FRAMES ARE PROPERLY TRANSMITTED</span>');
Line 62: 			appendToScreen('<span style="color: green;">SUCCESS!</span>');

Line 64: 		else {
Line 65: 			appendToScreen('<span style="color: red;">THE WEBSOCKET FRAME THE SERVER RESPONDED WITH IS CORRUPT</span>');
Line 66: 			networkTopologyNotWebsocketFriendly();
Line 67: 		}
Line 68: 		websocket.close();
Line 69: 	}
Line 70: 
Line 71: 	function onError(websocketEvent)
Line 72: 	{

Line 74: 			window.clearTimeout(timeoutId);
Line 75: 		appendToScreen('<span style="color: red;">AN ERROR OCCURED DURING WEBSOCKET CONNECTION</span>');
Line 76: 		console.log('WebSocket diagnostic page OnError event: ' + websocketEvent.data);
Line 77: 		websocket.close();
Line 78: 	}

Line 81: 	{
Line 82: 		appendToScreen('<span style="color: blue;">SENDING A WEBSOCKET FRAME TO THE SERVER: [ ' + message + ' ]</span>');
Line 83: 		websocket.send(message);

Line 92: 
Line 93: 	function websocketFrameTimeoutError (websocket)
Line 94: 	{
Line 95:       	appendToScreen('<span style="color: red;">THE ECHO ENDPOINT DID NOT RESPOND WITHIN ' + packetTimeoutValue  + ' MS</span>');
Line 96: 	   	networkTopologyNotWebsocketFriendly();
Line 97: 	   	websocket.close();

Line 99: 
Line 100: 	function webSocketUpgradeRequestTimedOut (websocket)
Line 101: 	{
Line 102:        	appendToScreen('<span style="color: red;">THE WEBSOCKET UPGRADE RESPONSE DID NOT COME BACK FROM THE SERVER WITHIN ' + packetTimeoutValue +' MS</span>');
Line 103:        	networkTopologyNotWebsocketFriendly();
Line 104:        	websocket.close();
Line 105: 	}
Line 106: 
Line 107: 	function networkTopologyNotWebsocketFriendly ()
Line 108: 	{
Line 109: 		appendToScreen('<span style="color: red;">THE NETWORK TOPOLOGY IS NOT WEBSOCKET FRIENDLY</span>');
Line 110: 		appendToScreen('<span style="color: red;">FAILURE!</span>');

Line 114: 
Line 115: 	window.addEventListener("load", initializeWebsocketTesting, false);
Line 116: 

Line 118: 
Line 119: <h2>WebSocket Test</h2>
Line 120: <h5>[Testing sequence]</h5>
Line 121: <h5> 	1) Send a WebSocket Upgrade Request to the echo endpoint</h5>
Line 122: <h5> 	2) If the server responds with a WebSocket upgrade response, send a frame and start a timer of 3 seconds</h5>
Line 123: <h5>[WebSocket network assertion]</h5>
Line 124: <h5> 	If a WebSocket frame does not echo within the 3 second timeout, then WebSockets is considered not to work in this environment</h5>
Line 125: <h5> 	else if a WebSocket frame comes back but is not the same as what was sent, then WebSockets is considered not to work</h5>
Line 126: <h5> 	If a frame comes back within the 3 second time and is the same, WebSockets is working okay in this environment</h5>

 

 

Hi Robbie, 

We are also trying to establish similar functionality in notifications using websockets. Our requirement is when user clicks on approve/reject hyperlink in email, it should establish connection with another tool and get response back to servicenow.

Did you find any solution for your query?

Mohini,

 

I have not gotten this to work without AWS yet. The only working method I've found is to use AWS as the message broker.

 

Thanks,

 

Robbie