From 89e2a4195887cecaa24ef1f69edc9c92badc828c Mon Sep 17 00:00:00 2001 From: Claude Bot Date: Tue, 27 Jan 2026 14:49:37 +0000 Subject: [PATCH] fix(worker_threads): receiveMessageOnPort handles falsy values The `receiveMessageOnPort` function was using `if (!res)` to check for no message available, which incorrectly treated falsy message values (0, false, '', null) as "no message" and returned undefined. Changed to `if (res === undefined)` to correctly distinguish between "no message available" (undefined from native code) and "message with a falsy value". Fixes #26501 Co-Authored-By: Claude Opus 4.5 --- src/js/node/worker_threads.ts | 2 +- test/regression/issue/26501.test.ts | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 test/regression/issue/26501.test.ts diff --git a/src/js/node/worker_threads.ts b/src/js/node/worker_threads.ts index c6d0633dde..bd34946c4b 100644 --- a/src/js/node/worker_threads.ts +++ b/src/js/node/worker_threads.ts @@ -121,7 +121,7 @@ let workerData = _workerData; let threadId = _threadId; function receiveMessageOnPort(port: MessagePort) { let res = _receiveMessageOnPort(port); - if (!res) return undefined; + if (res === undefined) return undefined; return { message: res, }; diff --git a/test/regression/issue/26501.test.ts b/test/regression/issue/26501.test.ts new file mode 100644 index 0000000000..a640bdc3dd --- /dev/null +++ b/test/regression/issue/26501.test.ts @@ -0,0 +1,24 @@ +import { expect, test } from "bun:test"; +import { MessageChannel, receiveMessageOnPort } from "node:worker_threads"; + +test("receiveMessageOnPort handles falsy values correctly", () => { + const { port1, port2 } = new MessageChannel(); + + const values = [0, 1, false, true, "", "hello world", null]; + for (const value of values) { + port1.postMessage(value); + } + + const received: unknown[] = []; + for (let i = 0; i < values.length; i++) { + const result = receiveMessageOnPort(port2); + if (result !== undefined) { + received.push(result.message); + } + } + + expect(received).toEqual(values); + + // Extra call should return undefined (no more messages) + expect(receiveMessageOnPort(port2)).toBeUndefined(); +});