From f11e9257566f41f96460f112e802667385efe58c Mon Sep 17 00:00:00 2001 From: Alistair Smith Date: Fri, 30 May 2025 00:00:13 -0700 Subject: [PATCH] worker lifecycle port test --- .../worker-lifecycle-message-port.test.ts | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 test/js/node/worker_threads/worker-lifecycle-message-port.test.ts diff --git a/test/js/node/worker_threads/worker-lifecycle-message-port.test.ts b/test/js/node/worker_threads/worker-lifecycle-message-port.test.ts new file mode 100644 index 0000000000..7a4287c3ec --- /dev/null +++ b/test/js/node/worker_threads/worker-lifecycle-message-port.test.ts @@ -0,0 +1,49 @@ +import assert from "node:assert"; +import { test } from "node:test"; +import { fileURLToPath } from "node:url"; +import { isMainThread, MessageChannel, MessagePort, parentPort, Worker } from "node:worker_threads"; + +interface StartupMessage { + port: MessagePort; +} + +if (isMainThread) { + test("worker lifecycle message port", async () => { + const worker = new Worker(fileURLToPath(import.meta.url)); + + const { port1, port2 } = new MessageChannel(); + + const { promise, resolve, reject } = Promise.withResolvers(); + + port1.on("message", (message: string) => { + console.log("Received message:", message); + assert.equal(message, "hello"); + worker.terminate(); + resolve(message); + }); + + worker.on("online", () => { + console.log("Worker is online"); + const startupMessage: StartupMessage = { port: port2 }; + worker.postMessage(startupMessage, [port2]); + }); + + worker.on("exit", () => { + console.log("Worker exited"); + reject(); + }); + + worker.on("error", err => { + reject(err); + }); + + assert.equal(await promise, "hello"); + }); +} else { + parentPort!.on("message", (message: StartupMessage) => { + console.log("Worker received startup message"); + + message.port.postMessage("hello"); + message.port.close(); + }); +}