From e79f2c9d229ecbdac6ba2df9fe96988683adbfc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=B1=D0=B5=D0=B4=D0=B5=D0=B2=20=D0=9A=D0=BE?= =?UTF-8?q?=D0=BD=D1=81=D1=82=D0=B0=D0=BD=D1=82=D0=B8=D0=BD?= Date: Thu, 5 Dec 2024 09:43:49 +0300 Subject: [PATCH 1/2] fix: pass `WebSocket` instead of Connection to `applyAwarenessUpdate` --- packages/server/src/MessageReceiver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/src/MessageReceiver.ts b/packages/server/src/MessageReceiver.ts index 1c9883b51..6a7401e0f 100644 --- a/packages/server/src/MessageReceiver.ts +++ b/packages/server/src/MessageReceiver.ts @@ -65,7 +65,7 @@ export class MessageReceiver { category: 'Update', }) - applyAwarenessUpdate(document.awareness, message.readVarUint8Array(), connection) + applyAwarenessUpdate(document.awareness, message.readVarUint8Array(), connection?.webSocket) break } From 42aa1ed1bbfe08ec869d774750c35fecabd29ca6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=B1=D0=B5=D0=B4=D0=B5=D0=B2=20=D0=9A=D0=BE?= =?UTF-8?q?=D0=BD=D1=81=D1=82=D0=B0=D0=BD=D1=82=D0=B8=D0=BD?= Date: Tue, 11 Feb 2025 22:44:24 +0300 Subject: [PATCH 2/2] fix(server): message handling order when using `beforeHandleMessage` (#880) --- packages/server/src/Connection.ts | 33 ++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/packages/server/src/Connection.ts b/packages/server/src/Connection.ts index 592fd9a70..7f07be829 100644 --- a/packages/server/src/Connection.ts +++ b/packages/server/src/Connection.ts @@ -41,6 +41,10 @@ export class Connection { logger: Debugger + private beforeHandleMessageQueue: Uint8Array[] = [] + + private beforeHandleMessageProcessing = false + /** * Constructor. */ @@ -216,21 +220,40 @@ export class Connection { * @public */ public handleMessage(data: Uint8Array): void { + if (this.beforeHandleMessageQueue.length > 0 || this.beforeHandleMessageProcessing) { + this.beforeHandleMessageQueue.push(data) + return + } + + this.processBeforeHandleMessage(data) + } + + /** Process an incoming message */ + private processBeforeHandleMessage(data: Uint8Array): void { + this.beforeHandleMessageProcessing = true + const message = new IncomingMessage(data) const documentName = message.readVarString() - if (documentName !== this.document.name) return + if (documentName !== this.document.name) { + this.nextProcessBeforeHandleMessage() + return + } message.writeVarString(documentName) this.callbacks.beforeHandleMessage(this, data) .then(() => { + this.nextProcessBeforeHandleMessage() + new MessageReceiver( message, this.logger, ).apply(this.document, this) }) .catch((e: any) => { + this.nextProcessBeforeHandleMessage() + console.log('closing connection because of exception', e) this.close({ code: 'code' in e ? e.code : Forbidden.code, @@ -239,6 +262,14 @@ export class Connection { }) } + /** Process next an incoming message */ + private nextProcessBeforeHandleMessage(): void { + this.beforeHandleMessageProcessing = false + + if (this.beforeHandleMessageQueue.length > 0) { + this.processBeforeHandleMessage(this.beforeHandleMessageQueue.shift()!) + } + } } export default Connection