From 42acde9c5bffe96d244b10c7cbcd55a88a5e28a8 Mon Sep 17 00:00:00 2001 From: kpal Date: Tue, 28 Oct 2025 14:37:31 +0000 Subject: [PATCH 1/3] feat: removed extra unsubscribe when destroying --- src/realtime/asset.ts | 1 - src/realtime/scene.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/src/realtime/asset.ts b/src/realtime/asset.ts index db2f298..30472d2 100644 --- a/src/realtime/asset.ts +++ b/src/realtime/asset.ts @@ -61,7 +61,6 @@ class RealtimeAsset extends Events { unload() { if (!this._document) return; - this._document.unsubscribe(); this._document.destroy(); this._document = null; this._loaded = false; diff --git a/src/realtime/scene.ts b/src/realtime/scene.ts index 7edf3f5..23675c2 100644 --- a/src/realtime/scene.ts +++ b/src/realtime/scene.ts @@ -61,7 +61,6 @@ class RealtimeScene extends Events { unload() { if (!this._document) return; - this._document.unsubscribe(); this._document.destroy(); this._document = null; this._loaded = false; From 64dbb86bbb48ad440b4e5c7265ced4a5d0b56580 Mon Sep 17 00:00:00 2001 From: kpal Date: Tue, 28 Oct 2025 14:38:49 +0000 Subject: [PATCH 2/3] fix: fixed sharedb reconnection failing --- src/realtime/connection.ts | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/realtime/connection.ts b/src/realtime/connection.ts index 557c4dd..ad272fd 100644 --- a/src/realtime/connection.ts +++ b/src/realtime/connection.ts @@ -117,6 +117,17 @@ class RealtimeConnection extends Events { onmessage.call(socket, msg); }; + // intercept send to queue and forward messages + const send = socket.send; + socket.send = (data: string) => { + // if not open use latest send + if (socket.readyState !== WebSocket.OPEN) { + this.send(data); + return; + } + send.call(socket, data); + }; + // allow sending messages this._active.resolve(socket); @@ -144,33 +155,37 @@ class RealtimeConnection extends Events { // create new socket const socket = new WebSocket(url); - socket.onopen = () => { + socket.addEventListener('open', () => { this._connected = true; this._reconnectAttempts = 0; socket.send(`auth${JSON.stringify({ accessToken: api.accessToken })}`); this._realtime.emit('connected'); - }; + }); - socket.onmessage = (msg) => { + const onmessage = (msg: Parameters[0]) => { if (msg.data.toString().startsWith('auth')) { // clear this handler - socket.onmessage = null; + socket.removeEventListener('message', onmessage); this._onauth(socket); } }; + socket.addEventListener('message', onmessage); + + // ! use event listener as sharedb overrides socket.on* handlers + socket.addEventListener('close', (reason) => { + console.log('closed'); - socket.onclose = (reason) => { // block sending messages this._active = new Deferred(); // clear keep alive - if (this._alive) { - clearInterval(this._alive); - this._alive = null; - } + // if (this._alive) { + // clearInterval(this._alive); + // this._alive = null; + // } this._connected = false; this._authenticated = false; @@ -184,7 +199,7 @@ class RealtimeConnection extends Events { this.connect(this._url); }, this._reconnectInterval * 1000); } - }; + }); document.addEventListener('visibilitychange', this._domEvtVisibilityChange); From 66dea8f1853535b515fc61a85fe8f8643cc701f9 Mon Sep 17 00:00:00 2001 From: kpal Date: Tue, 28 Oct 2025 14:39:37 +0000 Subject: [PATCH 3/3] fix: clean up socket close event handling and remove commented code --- src/realtime/connection.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/realtime/connection.ts b/src/realtime/connection.ts index ad272fd..a60bbd1 100644 --- a/src/realtime/connection.ts +++ b/src/realtime/connection.ts @@ -176,16 +176,14 @@ class RealtimeConnection extends Events { // ! use event listener as sharedb overrides socket.on* handlers socket.addEventListener('close', (reason) => { - console.log('closed'); - // block sending messages this._active = new Deferred(); // clear keep alive - // if (this._alive) { - // clearInterval(this._alive); - // this._alive = null; - // } + if (this._alive) { + clearInterval(this._alive); + this._alive = null; + } this._connected = false; this._authenticated = false;