From d7709daaa09ebd40b5756a2ce6d3e1c0c3bf7984 Mon Sep 17 00:00:00 2001 From: Marvin Hagemeister Date: Mon, 20 May 2024 15:01:40 +0200 Subject: fix(node): patch MessagePort in worker_thread message (#23871) Our `MessagePort` to Node's `MessagePort` conversion logic was missing the case where a `MessagePort` is sent _inside_ the message. This broke `tinypool` which is used by `vitest` as it relies on some node specific methods on `MessagePort`. Fixes https://github.com/denoland/deno/issues/23854 , Fixes https://github.com/denoland/deno/pull/23871 --- tests/unit_node/worker_threads_test.ts | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'tests/unit_node/worker_threads_test.ts') diff --git a/tests/unit_node/worker_threads_test.ts b/tests/unit_node/worker_threads_test.ts index e16bc8966..9991e5787 100644 --- a/tests/unit_node/worker_threads_test.ts +++ b/tests/unit_node/worker_threads_test.ts @@ -562,3 +562,31 @@ Deno.test({ port1.close(); }, }); + +// Test for https://github.com/denoland/deno/issues/23854 +Deno.test({ + name: "[node/worker_threads] MessagePort.addListener is present", + async fn() { + const channel = new workerThreads.MessageChannel(); + const worker = new workerThreads.Worker( + ` + import { parentPort } from "node:worker_threads"; + parentPort.addListener("message", message => { + if (message.foo) { + const success = typeof message.foo.bar.addListener === "function"; + parentPort.postMessage(success ? "it works" : "it doesn't work") + } + }) + `, + { + eval: true, + }, + ); + worker.postMessage({ foo: { bar: channel.port1 } }, [channel.port1]); + + assertEquals((await once(worker, "message"))[0], "it works"); + worker.terminate(); + channel.port1.close(); + channel.port2.close(); + }, +}); -- cgit v1.2.3