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/connection.ts b/src/realtime/connection.ts index 557c4dd..a60bbd1 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,25 +155,27 @@ 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); - socket.onclose = (reason) => { + // ! use event listener as sharedb overrides socket.on* handlers + socket.addEventListener('close', (reason) => { // block sending messages this._active = new Deferred(); @@ -184,7 +197,7 @@ class RealtimeConnection extends Events { this.connect(this._url); }, this._reconnectInterval * 1000); } - }; + }); document.addEventListener('visibilitychange', this._domEvtVisibilityChange); 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;