From eb96e2cdb84e7a1dcc7acc8ff16dc008b4abdeef Mon Sep 17 00:00:00 2001 From: kpal Date: Thu, 20 Nov 2025 17:24:59 +0000 Subject: [PATCH 1/2] feat: discard connect method if already connecting --- src/realtime/connection.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/realtime/connection.ts b/src/realtime/connection.ts index a60bbd1..10d7d4c 100644 --- a/src/realtime/connection.ts +++ b/src/realtime/connection.ts @@ -34,6 +34,8 @@ class RealtimeConnection extends Events { private _reconnectInterval: number = RECONNECT_INTERVAL; + private _connecting: boolean = false; + private _connected: boolean = false; private _authenticated: boolean = false; @@ -142,7 +144,13 @@ class RealtimeConnection extends Events { * @param url - The server URL */ connect(url: string) { + if (this._connecting) { + console.warn('already connecting to realtime server'); + return; + } + this._url = url; + this._connecting = true; if (this._reconnectAttempts > MAX_ATTEMPTS) { this._realtime.emit('cannotConnect'); @@ -156,6 +164,7 @@ class RealtimeConnection extends Events { const socket = new WebSocket(url); socket.addEventListener('open', () => { + this._connecting = false; this._connected = true; this._reconnectAttempts = 0; @@ -185,6 +194,7 @@ class RealtimeConnection extends Events { this._alive = null; } + this._connecting = false; this._connected = false; this._authenticated = false; From 549f1e2ca99ca8cc9e04a19281dee002ac1d70d9 Mon Sep 17 00:00:00 2001 From: kpal Date: Thu, 20 Nov 2025 17:26:58 +0000 Subject: [PATCH 2/2] refactor: unify connection state management using a single state variable --- src/realtime/connection.ts | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/realtime/connection.ts b/src/realtime/connection.ts index 10d7d4c..35da5d2 100644 --- a/src/realtime/connection.ts +++ b/src/realtime/connection.ts @@ -34,9 +34,7 @@ class RealtimeConnection extends Events { private _reconnectInterval: number = RECONNECT_INTERVAL; - private _connecting: boolean = false; - - private _connected: boolean = false; + private _state: 'connecting' | 'connected' | 'disconnected' = 'disconnected'; private _authenticated: boolean = false; @@ -59,7 +57,7 @@ class RealtimeConnection extends Events { if (document.hidden) { return; } - if (!this.connected && this._url) { + if (this._state === 'disconnected' && this._url) { this.connect(this._url); } }; @@ -144,13 +142,13 @@ class RealtimeConnection extends Events { * @param url - The server URL */ connect(url: string) { - if (this._connecting) { + if (this._state === 'connecting') { console.warn('already connecting to realtime server'); return; } this._url = url; - this._connecting = true; + this._state = 'connecting'; if (this._reconnectAttempts > MAX_ATTEMPTS) { this._realtime.emit('cannotConnect'); @@ -164,8 +162,7 @@ class RealtimeConnection extends Events { const socket = new WebSocket(url); socket.addEventListener('open', () => { - this._connecting = false; - this._connected = true; + this._state = 'connected'; this._reconnectAttempts = 0; socket.send(`auth${JSON.stringify({ accessToken: api.accessToken })}`); @@ -194,8 +191,7 @@ class RealtimeConnection extends Events { this._alive = null; } - this._connecting = false; - this._connected = false; + this._state = 'disconnected'; this._authenticated = false; this._realtime.emit('disconnect', reason); @@ -274,7 +270,7 @@ class RealtimeConnection extends Events { * Whether the user is connected to the server */ get connected() { - return this._connected; + return this._state === 'connected'; } /**