From 9a81db8e6c25c3707294cc01549287ef0d692375 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 19 Nov 2024 23:00:28 +0000 Subject: [PATCH] fix acceleration websocket ping error --- backend/src/api/services/acceleration.ts | 27 +++++++++++++++++------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/backend/src/api/services/acceleration.ts b/backend/src/api/services/acceleration.ts index e4edab791..43624e19b 100644 --- a/backend/src/api/services/acceleration.ts +++ b/backend/src/api/services/acceleration.ts @@ -246,11 +246,11 @@ class AccelerationApi { this.startedWebsocketLoop = true; if (!this.ws) { this.ws = new WebSocket(this.websocketPath); - this.websocketConnected = true; this.lastPing = 0; this.ws.on('open', () => { logger.info(`Acceleration websocket opened to ${this.websocketPath}`); + this.websocketConnected = true; this.ws?.send(JSON.stringify({ 'watch-accelerations': true })); @@ -286,17 +286,28 @@ class AccelerationApi { logger.debug('received pong from acceleration websocket server'); this.lastPong = Date.now(); }); - } else { + } else if (this.websocketConnected) { if (this.lastPing && this.lastPing > this.lastPong && (Date.now() - this.lastPing > 10000)) { logger.warn('No pong received within 10 seconds, terminating connection'); - this.ws.terminate(); - this.ws = null; - this.websocketConnected = false; - this.lastPing = 0; + try { + this.ws?.terminate(); + } catch (e) { + logger.warn('failed to terminate acceleration websocket connection: ' + (e instanceof Error ? e.message : e)); + } finally { + this.ws = null; + this.websocketConnected = false; + this.lastPing = 0; + } } else if (!this.lastPing || (Date.now() - this.lastPing > 30000)) { logger.debug('sending ping to acceleration websocket server'); - this.ws.ping(); - this.lastPing = Date.now(); + if (this.ws?.readyState === WebSocket.OPEN) { + try { + this.ws?.ping(); + this.lastPing = Date.now(); + } catch (e) { + logger.warn('failed to send ping to acceleration websocket server: ' + (e instanceof Error ? e.message : e)); + } + } } } await new Promise(resolve => setTimeout(resolve, 5000));