feat: add heartbeat to the moonraker websocket (#2003)
This commit is contained in:
parent
55ae60c3b9
commit
f4bbe45c25
@ -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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user