mirror of
https://github.com/oven-sh/bun
synced 2026-02-16 22:01:47 +00:00
worker lifecycle port test
This commit is contained in:
@@ -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<string>();
|
||||
|
||||
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();
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user