site-manual-notifier/static/js/sharedWebSocket.js

64 lines
1.6 KiB
JavaScript

var joinRoomCmd = `@joinRoom:${document.location.hash.substr(1)}`;
function restartWebSocket() {
var old_ws = ws_connection;
old_ws.close();
sendThroughWebSocket(joinRoomCmd);
try {
ws_connection = new WebSocket('wss://broadcaster.sfner.com');
} catch (e) {
ws_connection = old_ws;
setTimeout(restartWebSocket, 10);
console.error(e);
return;
}
ws_connection.onopen = old_ws.onopen;
ws_connection.onclose = old_ws.onclose;
ws_connection.onmessage = old_ws.onmessage;
}
function configureWebSocket() {
console.info('WebSocket is ready.');
ensureWebSocketQueueIsEmpty();
}
function onMessageFromWebSocket(message) {
try {
handleMessage(JSON.parse(message.data));
} catch (e) {
console.error(message);
console.error(e);
}
}
function onBeforeUnload() {
ws_connection.onclose = function () { };
ws_connection.close();
}
var ws_connection = { close: () => { }, readyState: WebSocket.CLOSED };
ws_connection.onopen = configureWebSocket;
ws_connection.onclose = restartWebSocket;
ws_connection.onmessage = onMessageFromWebSocket;
window.onbeforeunload = onBeforeUnload;
var webSocketQueue = [];
function sendThroughWebSocket(data) {
webSocketQueue.push(data);
ensureWebSocketQueueIsEmpty();
}
function ensureWebSocketQueueIsEmpty() {
while (webSocketQueue.length > 0) {
if (ws_connection.readyState == WebSocket.OPEN) {
var data = webSocketQueue.shift();
ws_connection.send(data);
} else {
break;
}
}
}
sendThroughWebSocket(joinRoomCmd);
setTimeout(restartWebSocket, 10);