diff --git a/.changeset/tall-beers-remain.md b/.changeset/tall-beers-remain.md new file mode 100644 index 00000000..51002de5 --- /dev/null +++ b/.changeset/tall-beers-remain.md @@ -0,0 +1,5 @@ +--- +'@hono/node-ws': patch +--- + +Fixed wrong byteLength on binary messages diff --git a/packages/node-ws/src/index.test.ts b/packages/node-ws/src/index.test.ts index 0033a3d9..5ab99312 100644 --- a/packages/node-ws/src/index.test.ts +++ b/packages/node-ws/src/index.test.ts @@ -3,6 +3,7 @@ import type { ServerType } from '@hono/node-server/dist/types' import { Hono } from 'hono' import { WebSocket } from 'ws' import { createNodeWebSocket } from '.' +import type { WSMessageReceive } from 'hono/ws' describe('WebSocket helper', () => { let app: Hono @@ -106,4 +107,31 @@ describe('WebSocket helper', () => { connections.forEach((ws) => ws.close()) }) + + it('Should be able to send and receive binary content with good length', async () => { + const mainPromise = new Promise((resolve) => + app.get( + '/', + upgradeWebSocket(() => ({ + onMessage(data) { + resolve(data.data) + }, + })) + ) + ) + + const binaryData = new Uint8Array(Array.from({ length: 16 }).map((_, i) => i ** 2)) + + const ws = new WebSocket('ws://localhost:3030/') + await new Promise((resolve) => ws.on('open', resolve)) + ws.send(binaryData) + + const receivedMessage = await mainPromise; + expect(receivedMessage).toBeInstanceOf(Buffer) + expect((receivedMessage as Buffer).byteLength).toBe(binaryData.length) + + binaryData.forEach((val, idx) => { + expect((receivedMessage as Buffer).at(idx)).toBe(val) + }) + }) }) diff --git a/packages/node-ws/src/index.ts b/packages/node-ws/src/index.ts index 2fd7f165..d95f704b 100644 --- a/packages/node-ws/src/index.ts +++ b/packages/node-ws/src/index.ts @@ -94,10 +94,9 @@ export const createNodeWebSocket = (init: NodeWebSocketInit): NodeWebSocket => { ws.on('message', (data, isBinary) => { const datas = Array.isArray(data) ? data : [data] for (const data of datas) { - const buff: Buffer = Buffer.from(data) events.onMessage?.( new MessageEvent('message', { - data: isBinary ? buff.buffer : buff.toString('utf-8'), + data: isBinary ? data : data.toString('utf-8'), }), ctx )