diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2024-03-16 00:59:18 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-16 01:59:18 +0100 |
commit | 92576fdcfd3e32dce63b533ab20d4974136b097d (patch) | |
tree | 6f3b61c4d1d10569e4bb54f8ee59fb5f1ff274da /tests/unit_node/worker_threads_test.ts | |
parent | ebbc897b69f906d88a99768a2fff7661e2894670 (diff) |
fix(ext/node): support MessagePort in `WorkerOptions.workerData` (#22950)
This commit fixes passing `MessagePort` instances to
`WorkerOptions.workerData`.
Before they were not serialized and deserialized properly when spawning
a worker thread.
Closes https://github.com/denoland/deno/issues/22935
Diffstat (limited to 'tests/unit_node/worker_threads_test.ts')
-rw-r--r-- | tests/unit_node/worker_threads_test.ts | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/tests/unit_node/worker_threads_test.ts b/tests/unit_node/worker_threads_test.ts index 1ded9a591..f2ce00c84 100644 --- a/tests/unit_node/worker_threads_test.ts +++ b/tests/unit_node/worker_threads_test.ts @@ -238,3 +238,52 @@ Deno.test({ }, sanitizeResources: false, }); + +Deno.test({ + name: "[worker_threads] Worker workerData with MessagePort", + async fn() { + const { port1: mainPort, port2: workerPort } = new workerThreads + .MessageChannel(); + const deferred = Promise.withResolvers<void>(); + const worker = new workerThreads.Worker( + ` + import { + isMainThread, + MessageChannel, + parentPort, + receiveMessageOnPort, + Worker, + workerData, + } from "node:worker_threads"; + parentPort.on("message", (msg) => { + console.log("message from main", msg); + parentPort.postMessage("Hello from worker on parentPort!"); + workerData.workerPort.postMessage("Hello from worker on workerPort!"); + }); + `, + { + eval: true, + workerData: { workerPort }, + transferList: [workerPort], + }, + ); + + worker.on("message", (data) => { + assertEquals(data, "Hello from worker on parentPort!"); + // TODO(bartlomieju): it would be better to use `mainPort.on("message")`, + // but we currently don't support it. + // https://github.com/denoland/deno/issues/22951 + // Wait a bit so the message can arrive. + setTimeout(() => { + const msg = workerThreads.receiveMessageOnPort(mainPort)!.message; + assertEquals(msg, "Hello from worker on workerPort!"); + deferred.resolve(); + }, 500); + }); + + worker.postMessage("Hello from parent"); + await deferred.promise; + await worker.terminate(); + mainPort.close(); + }, +}); |