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