Files
OliveTin/webui.dev/js/websocket.js
James Read daa48b5a73 feature: OliveTin now relies on websocket, and will show a big error if it isn't available (#323)
* feature: OliveTin now relies on websocket, and will show a big error if it isnt available

* feature: OliveTin now relies on websocket, and will show a big error if it isnt available
2024-05-26 18:21:54 +00:00

79 lines
1.9 KiB
JavaScript

import {
refreshServerConnectionLabel
} from './marshaller.js'
window.ws = null
export function checkWebsocketConnection () {
if (window.ws === null || window.ws.readyState === 3) {
reconnectWebsocket()
}
}
function reconnectWebsocket () {
window.websocketAvailable = false
const websocketConnectionUrl = new URL(window.location.toString())
websocketConnectionUrl.hash = ''
websocketConnectionUrl.pathname += 'websocket'
if (window.location.protocol === 'https:') {
websocketConnectionUrl.protocol = 'wss'
} else {
websocketConnectionUrl.protocol = 'ws'
}
window.websocketConnectionUrl = websocketConnectionUrl
const ws = window.ws = new WebSocket(websocketConnectionUrl.toString())
ws.addEventListener('open', websocketOnOpen)
ws.addEventListener('message', websocketOnMessage)
ws.addEventListener('error', websocketOnError)
ws.addEventListener('close', websocketOnClose)
}
function websocketOnOpen (evt) {
window.websocketAvailable = true
window.ws.send('monitor')
refreshServerConnectionLabel()
window.refreshLoop()
}
function websocketOnMessage (msg) {
// FIXME check msg status is OK
const j = JSON.parse(msg.data)
const e = new Event(j.type)
e.payload = j.payload
switch (j.type) {
case 'EventConfigChanged':
case 'EventExecutionFinished':
case 'EventEntityChanged':
window.dispatchEvent(e)
break
default:
window.showBigError('ws-unhandled-message', 'handling websocket message', 'Unhandled websocket message type from server: ' + j.type, true)
}
}
function websocketOnError (err) {
window.websocketAvailable = false
window.refreshLoop()
console.log(err)
window.showBigError('ws-connect-error', 'connecting to the websocket', 'Please see your browser console for debugging information.', true)
refreshServerConnectionLabel()
}
function websocketOnClose () {
window.websocketAvailable = false
refreshServerConnectionLabel()
}