From 1950aaef3f699e3a7d58dfa62486cfe5d9fb90f1 Mon Sep 17 00:00:00 2001 From: Julian Vennen Date: Wed, 26 Nov 2025 11:00:21 +0100 Subject: [PATCH 1/4] Schedule reconnects using setTimeout instead of setInterval --- src/Websocket/WebsocketClient.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Websocket/WebsocketClient.js b/src/Websocket/WebsocketClient.js index 510b4b7..4808a65 100644 --- a/src/Websocket/WebsocketClient.js +++ b/src/Websocket/WebsocketClient.js @@ -51,8 +51,6 @@ export default class WebsocketClient extends EventEmitter { */ reconnectTimeout = 3000; - #reconnectInterval; - /** * @type {boolean} */ @@ -119,14 +117,12 @@ export default class WebsocketClient extends EventEmitter { this.#shouldConnect = false; this.#websocket.close(); this.#streams = {}; - clearInterval(this.#reconnectInterval); clearInterval(this.streamRetryInterval); this.streamRetryInterval = null; } onOpen() { this.#connected = true; - clearInterval(this.#reconnectInterval); this.emit('open'); } @@ -134,7 +130,7 @@ export default class WebsocketClient extends EventEmitter { this.emit('close'); this.#ready = false; if (this.autoReconnect && this.#shouldConnect) { - this.#reconnectInterval = setInterval(this.connect.bind(this), this.reconnectTimeout); + setTimeout(this.connect.bind(this), this.reconnectTimeout); } else { this.#connected = false; } From 0c11a9bb5805f4159ebcf1a82bf05463d302a757 Mon Sep 17 00:00:00 2001 From: Julian Vennen Date: Wed, 26 Nov 2025 11:09:05 +0100 Subject: [PATCH 2/4] Prevent multiple subscribe calls from trying to start concurrent connection attempts --- src/Websocket/WebsocketClient.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Websocket/WebsocketClient.js b/src/Websocket/WebsocketClient.js index 4808a65..13aa5cd 100644 --- a/src/Websocket/WebsocketClient.js +++ b/src/Websocket/WebsocketClient.js @@ -108,6 +108,7 @@ export default class WebsocketClient extends EventEmitter { if (!this.streamRetryInterval) { this.streamRetryInterval = setInterval(this.tryToStartStreams.bind(this), 15000); } + this.#connected = true; } /** @@ -122,7 +123,6 @@ export default class WebsocketClient extends EventEmitter { } onOpen() { - this.#connected = true; this.emit('open'); } @@ -177,6 +177,7 @@ export default class WebsocketClient extends EventEmitter { } /** + * This method returns true if the websocket is connected (or trying to connect). * @return {boolean} */ isConnected() { From c298b08ffed761e6deaf300074cc68b2878d6f7c Mon Sep 17 00:00:00 2001 From: Julian Vennen Date: Wed, 26 Nov 2025 13:32:45 +0100 Subject: [PATCH 3/4] Clear reconnect timeout on disconnect --- src/Websocket/WebsocketClient.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Websocket/WebsocketClient.js b/src/Websocket/WebsocketClient.js index 13aa5cd..fc7bb7d 100644 --- a/src/Websocket/WebsocketClient.js +++ b/src/Websocket/WebsocketClient.js @@ -51,6 +51,12 @@ export default class WebsocketClient extends EventEmitter { */ reconnectTimeout = 3000; + /** + * Timeout for reconnecting to the websocket + * @type {number|null} + */ + #reconnectTimeout = null; + /** * @type {boolean} */ @@ -118,6 +124,10 @@ export default class WebsocketClient extends EventEmitter { this.#shouldConnect = false; this.#websocket.close(); this.#streams = {}; + + clearTimeout(this.#reconnectTimeout); + this.#reconnectTimeout = null; + clearInterval(this.streamRetryInterval); this.streamRetryInterval = null; } @@ -130,7 +140,7 @@ export default class WebsocketClient extends EventEmitter { this.emit('close'); this.#ready = false; if (this.autoReconnect && this.#shouldConnect) { - setTimeout(this.connect.bind(this), this.reconnectTimeout); + this.#reconnectTimeout = setTimeout(this.connect.bind(this), this.reconnectTimeout); } else { this.#connected = false; } From 7287445209eda8275ea0512ad440e50b8fb4b4cd Mon Sep 17 00:00:00 2001 From: Julian Vennen Date: Wed, 26 Nov 2025 13:48:22 +0100 Subject: [PATCH 4/4] Prevent multiple connect calls from trying new connections --- src/Websocket/WebsocketClient.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Websocket/WebsocketClient.js b/src/Websocket/WebsocketClient.js index fc7bb7d..62f7a91 100644 --- a/src/Websocket/WebsocketClient.js +++ b/src/Websocket/WebsocketClient.js @@ -102,9 +102,15 @@ export default class WebsocketClient extends EventEmitter { } /** - * Connect to websocket + * Connect to websocket if not already connected */ connect() { + if (!this.#shouldConnect) { + this.#connect(); + } + } + + #connect() { this.#shouldConnect = true; this.#websocket = new WebSocket(this.url, {headers: {authorization: "Bearer " + this.#client.getAPIToken()}}); this.#websocket.on('open', this.onOpen.bind(this)); @@ -140,7 +146,7 @@ export default class WebsocketClient extends EventEmitter { this.emit('close'); this.#ready = false; if (this.autoReconnect && this.#shouldConnect) { - this.#reconnectTimeout = setTimeout(this.connect.bind(this), this.reconnectTimeout); + this.#reconnectTimeout = setTimeout(this.#connect.bind(this), this.reconnectTimeout); } else { this.#connected = false; }