// Functions for change notifications and automatic reload via websockets const startup_websocket = function () { function htmlEscape(str) { return str.toString() .replace(/&/g, '&') .replace(/"/g, '"') .replace(/'/g, ''') .replace(//g, '>'); } var stateSC = null; var stateValidation = null; var stateReload = null; var stateCommit = null; var statePing = false; var firstMessage = true; var commsLog = document.getElementById("commsLog"); var commsNot = document.getElementById("comm-notifications"); var socket; var scheme = document.location.protocol === "https:" ? "wss" : "ws"; var port = document.location.port ? (":" + document.location.port) : ""; var wsPingInterval; var connectionUrl = scheme + "://" + document.location.hostname + port + "/WS"; socket = new WebSocket(connectionUrl); socket.onopen = function (event) { socket.send("Hello"); wsPingInterval = setInterval(() => { socket.send("Ping"); }, 30000); updateMessage(); }; socket.onclose = function (event) { clearInterval(wsPingInterval); updateMessage(); }; socket.onerror = updateMessage; socket.onmessage = function (event) { var msg = JSON.parse(event.data); if (msg.ValidationState != null) { stateValidation = msg.ValidationState; console.log(msg.ValidationState); switch (msg.ValidationState) { case 0: commsNot.classList.remove("loading"); commsNot.classList.remove("green"); if (!commsNot.classList.contains("red")) { commsNot.classList.add("red"); } updateMessage(); break; case 1: if (!commsNot.classList.contains("loading")) { commsNot.classList.add("loading"); } updateMessage(); break; case 2: commsNot.classList.remove("red"); commsNot.classList.remove("loading"); if (!commsNot.classList.contains("green")) { commsNot.classList.add("green"); } updateMessage(); break; } } else if (msg.Commit != null) { stateCommit = msg; updateMessage(); } else if (msg.reload != null) { stateReload = msg.reload; if (msg.reload) { commsLog.innerHTML = 'Seite wird neu geladen.'; commsNot.classList.add("imp"); setTimeout(() => { commsNot.remove(); socket.close(1000, "bye"); location.reload(); }, 2000); } } else if (msg.SC != null) { stateSC = msg.SC; } else if (msg.Ping != null) { statePing = true; } else { commsLog.innerHTML = htmlEscape(event.data); } }; function updateMessage() { function disable() { commsNot.classList.remove("red"); commsNot.classList.remove("loading"); commsNot.classList.remove("green"); } function enable() { } if (!socket) { disable(); } else { switch (socket.readyState) { case WebSocket.CLOSED: commsLog.innerHTML = "Keine Verbindung"; disable(); break; case WebSocket.CLOSING: commsLog.innerHTML = "Verbindung wird geschlossen..."; disable(); break; case WebSocket.CONNECTING: commsLog.innerHTML = "Verbinden..."; disable(); break; case WebSocket.OPEN: commsLog.innerHTML = ""; // TODO: decide on state what the message is if (stateValidation == 0) { commsLog.innerHTML = 'Der angezeigte Stand ist nicht aktuell. ' + 'Fehler beheben'; if (!firstMessage) commsNot.classList.add("imp"); } else if (stateValidation == 1) { commsLog.innerHTML = "Der Server arbeitet..."; } else { if (stateCommit != null) { commsLog.innerHTML = "commit " + stateCommit.Commit.substring(0, 7) + " geladen" } else { commsLog.innerHTML = "OK."; } } firstMessage = false; enable(); break; default: commsLog.innerHTML = "Unknown WebSocket State: " + htmlEscape(socket.readyState); disable(); break; } } } }; export { startup_websocket };