feat: add heartbeat to the moonraker websocket (#2003)

This commit is contained in:
Stefan Dej 2024-09-11 22:44:39 +02:00 committed by GitHub
parent 55ae60c3b9
commit f4bbe45c25
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -14,6 +14,7 @@ export class WebSocketClient {
timerId: number | null = null
store: Store<RootState> | null = null
waits: Wait[] = []
heartbeatTimer: number | null = null
constructor(options: WebSocketPluginOptions) {
this.url = options.url
@ -89,7 +90,7 @@ export class WebSocketClient {
isConnecting: true,
})
await this.instance?.close()
this.instance?.close()
this.instance = new WebSocket(this.url)
this.instance.onopen = () => {
@ -116,14 +117,19 @@ export class WebSocketClient {
this.instance.onmessage = (msg) => {
if (this.store === null) return
// websocket is alive
this.heartbeat()
const data = JSON.parse(msg.data)
if (Array.isArray(data)) {
for (const message of data) {
this.handleMessage(message)
}
} else {
this.handleMessage(data)
return
}
this.handleMessage(data)
}
}
@ -194,6 +200,17 @@ export class WebSocketClient {
this.instance.send(JSON.stringify(body))
}
heartbeat(): void {
if (this.heartbeatTimer) clearInterval(this.heartbeatTimer)
this.heartbeatTimer = window.setTimeout(() => {
if (this.instance?.readyState !== WebSocket.OPEN || !this.store) return
this.close()
this.store?.dispatch('socket/onClose')
}, 10000)
}
}
export function WebSocketPlugin(Vue: typeof _Vue, options: WebSocketPluginOptions): void {