From c41029326b21256ef3a54aa9ca47a0645bd40e50 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Sun, 2 Nov 2025 17:13:54 +0100 Subject: [PATCH] fix(examples): properly handle ws raw data MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- .../ws-cluster/src/utils.ts | 16 ++++++++++++++++ .../ws-cluster/src/worker.ts | 3 ++- .../websocket-server-pool/ws-hybrid/src/utils.ts | 16 ++++++++++++++++ .../ws-hybrid/src/websocket-server-worker.ts | 3 ++- .../ws-worker_threads/src/main.ts | 3 ++- .../ws-worker_threads/src/utils.ts | 16 ++++++++++++++++ src/circular-buffer.ts | 1 + 7 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 examples/typescript/websocket-server-pool/ws-cluster/src/utils.ts create mode 100644 examples/typescript/websocket-server-pool/ws-hybrid/src/utils.ts create mode 100644 examples/typescript/websocket-server-pool/ws-worker_threads/src/utils.ts diff --git a/examples/typescript/websocket-server-pool/ws-cluster/src/utils.ts b/examples/typescript/websocket-server-pool/ws-cluster/src/utils.ts new file mode 100644 index 000000000..22f67e108 --- /dev/null +++ b/examples/typescript/websocket-server-pool/ws-cluster/src/utils.ts @@ -0,0 +1,16 @@ +import type { RawData } from 'ws' + +/** + * Converts WebSocket RawData to string safely + * @param message - The RawData from WebSocket + * @returns String representation of the message + */ +export function rawDataToString (message: RawData): string { + if (message instanceof Buffer) { + return message.toString() + } + if (Array.isArray(message)) { + return Buffer.concat(message).toString() + } + return new TextDecoder().decode(message as ArrayBuffer) +} diff --git a/examples/typescript/websocket-server-pool/ws-cluster/src/worker.ts b/examples/typescript/websocket-server-pool/ws-cluster/src/worker.ts index 4cc808875..090ba60e7 100644 --- a/examples/typescript/websocket-server-pool/ws-cluster/src/worker.ts +++ b/examples/typescript/websocket-server-pool/ws-cluster/src/worker.ts @@ -8,6 +8,7 @@ import { type WorkerData, type WorkerResponse, } from './types.js' +import { rawDataToString } from './utils.js' class WebSocketServerWorker extends ClusterWorker { private static wss: WebSocketServer @@ -48,7 +49,7 @@ class WebSocketServerWorker extends ClusterWorker { ws.on('error', console.error) ws.on('message', (message: RawData) => { const { data, type } = JSON.parse( - message.toString() + rawDataToString(message) ) as MessagePayload switch (type) { case MessageType.echo: diff --git a/examples/typescript/websocket-server-pool/ws-hybrid/src/utils.ts b/examples/typescript/websocket-server-pool/ws-hybrid/src/utils.ts new file mode 100644 index 000000000..22f67e108 --- /dev/null +++ b/examples/typescript/websocket-server-pool/ws-hybrid/src/utils.ts @@ -0,0 +1,16 @@ +import type { RawData } from 'ws' + +/** + * Converts WebSocket RawData to string safely + * @param message - The RawData from WebSocket + * @returns String representation of the message + */ +export function rawDataToString (message: RawData): string { + if (message instanceof Buffer) { + return message.toString() + } + if (Array.isArray(message)) { + return Buffer.concat(message).toString() + } + return new TextDecoder().decode(message as ArrayBuffer) +} diff --git a/examples/typescript/websocket-server-pool/ws-hybrid/src/websocket-server-worker.ts b/examples/typescript/websocket-server-pool/ws-hybrid/src/websocket-server-worker.ts index 86a0c8f8d..f055a2b37 100644 --- a/examples/typescript/websocket-server-pool/ws-hybrid/src/websocket-server-worker.ts +++ b/examples/typescript/websocket-server-pool/ws-hybrid/src/websocket-server-worker.ts @@ -14,6 +14,7 @@ import { type ThreadWorkerData, type ThreadWorkerResponse, } from './types.js' +import { rawDataToString } from './utils.js' const emptyFunction = (): void => { /* Intentional */ @@ -66,7 +67,7 @@ class WebSocketServerWorker extends ClusterWorker< ws.on('error', console.error) ws.on('message', (message: RawData) => { const { data, type } = JSON.parse( - message.toString() + rawDataToString(message) ) as MessagePayload switch (type) { case MessageType.echo: diff --git a/examples/typescript/websocket-server-pool/ws-worker_threads/src/main.ts b/examples/typescript/websocket-server-pool/ws-worker_threads/src/main.ts index 38ea9d956..58bb65411 100644 --- a/examples/typescript/websocket-server-pool/ws-worker_threads/src/main.ts +++ b/examples/typescript/websocket-server-pool/ws-worker_threads/src/main.ts @@ -2,6 +2,7 @@ import { type RawData, WebSocketServer } from 'ws' import { requestHandlerPool } from './pool.js' import { type DataPayload, type MessagePayload, MessageType } from './types.js' +import { rawDataToString } from './utils.js' const port = 8080 const wss = new WebSocketServer({ port }, () => { @@ -18,7 +19,7 @@ wss.on('connection', ws => { ws.on('error', console.error) ws.on('message', (message: RawData) => { const { data, type } = JSON.parse( - message.toString() + rawDataToString(message) ) as MessagePayload switch (type) { case MessageType.echo: diff --git a/examples/typescript/websocket-server-pool/ws-worker_threads/src/utils.ts b/examples/typescript/websocket-server-pool/ws-worker_threads/src/utils.ts new file mode 100644 index 000000000..22f67e108 --- /dev/null +++ b/examples/typescript/websocket-server-pool/ws-worker_threads/src/utils.ts @@ -0,0 +1,16 @@ +import type { RawData } from 'ws' + +/** + * Converts WebSocket RawData to string safely + * @param message - The RawData from WebSocket + * @returns String representation of the message + */ +export function rawDataToString (message: RawData): string { + if (message instanceof Buffer) { + return message.toString() + } + if (Array.isArray(message)) { + return Buffer.concat(message).toString() + } + return new TextDecoder().decode(message as ArrayBuffer) +} diff --git a/src/circular-buffer.ts b/src/circular-buffer.ts index 63fa44563..7748cf56c 100644 --- a/src/circular-buffer.ts +++ b/src/circular-buffer.ts @@ -15,6 +15,7 @@ export class CircularBuffer { private writeIdx: number /** + * CircularBuffer constructor. * @param size - Buffer size. * @defaultValue defaultBufferSize * @returns CircularBuffer. -- 2.43.0