From 6e5cfa1eb4d98d4a99d4e87574f5b281aaa3494e Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Tue, 3 Feb 2026 14:24:04 +0700 Subject: [PATCH] refactor: simplify relay ws message normalization --- packages/relay/src/node-adapter.ts | 70 +++++++++++++++++++----------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/packages/relay/src/node-adapter.ts b/packages/relay/src/node-adapter.ts index 0cf63b768..b8d79be74 100644 --- a/packages/relay/src/node-adapter.ts +++ b/packages/relay/src/node-adapter.ts @@ -76,32 +76,7 @@ export function createRelayServer(config: NodeRelayServerConfig): RelayServer { relay.addConnection(sessionId, role, connection); ws.on("message", (data, isBinary) => { - if (isBinary) { - const message = - data instanceof ArrayBuffer - ? data - : bufferToArrayBuffer( - data instanceof Buffer - ? data - : ArrayBuffer.isView(data) - ? Buffer.from(data.buffer, data.byteOffset, data.byteLength) - : Buffer.from(String(data), "utf8") - ); - relay.forward(sessionId, role, message); - return; - } - - const text = - typeof data === "string" - ? data - : data instanceof Buffer - ? data.toString("utf8") - : data instanceof ArrayBuffer - ? Buffer.from(data).toString("utf8") - : ArrayBuffer.isView(data) - ? Buffer.from(data.buffer, data.byteOffset, data.byteLength).toString("utf8") - : String(data); - relay.forward(sessionId, role, text); + relay.forward(sessionId, role, normalizeWsMessageForRelay(data, isBinary)); }); ws.on("close", () => { @@ -160,3 +135,46 @@ function bufferToArrayBuffer(buffer: Buffer): ArrayBuffer { out.set(buffer); return out.buffer; } + +function normalizeWsMessageForRelay(data: unknown, isBinary: boolean): string | ArrayBuffer { + if (isBinary) { + return normalizeWsBinaryMessage(data); + } + return normalizeWsTextMessage(data); +} + +function normalizeWsBinaryMessage(data: unknown): ArrayBuffer { + if (data instanceof ArrayBuffer) { + return data; + } + return bufferToArrayBuffer(bufferFromWsData(data)); +} + +function normalizeWsTextMessage(data: unknown): string { + if (typeof data === "string") { + return data; + } + return bufferFromWsData(data).toString("utf8"); +} + +function bufferFromWsData(data: unknown): Buffer { + if (Buffer.isBuffer(data)) return data; + + if (Array.isArray(data)) { + return Buffer.concat(data.map(bufferFromWsData)); + } + + if (data instanceof ArrayBuffer) { + return Buffer.from(data); + } + + if (ArrayBuffer.isView(data)) { + return Buffer.from(data.buffer, data.byteOffset, data.byteLength); + } + + if (typeof data === "string") { + return Buffer.from(data, "utf8"); + } + + return Buffer.from(String(data), "utf8"); +}