fix(ext/node): support multiple message listeners on MessagePort (#23600)

Closes https://github.com/denoland/deno/issues/23561
This commit is contained in:
Satya Rohith 2024-04-30 16:59:39 +05:30 committed by GitHub
parent ce4a7773cc
commit 0156f82e73
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 31 additions and 2 deletions

View file

@ -484,9 +484,17 @@ function webMessagePortToNodeMessagePort(port: MessagePort) {
// deno-lint-ignore no-explicit-any
const _listener = (ev: any) => listener(ev.data);
if (name == "message") {
port.onmessage = _listener;
if (port.onmessage === null) {
port.onmessage = _listener;
} else {
port.addEventListener("message", _listener);
}
} else if (name == "messageerror") {
port.onmessageerror = _listener;
if (port.onmessageerror === null) {
port.onmessageerror = _listener;
} else {
port.addEventListener("messageerror", _listener);
}
} else if (name == "close") {
port.addEventListener("close", _listener);
} else {

View file

@ -515,3 +515,24 @@ Deno.test({
await worker.terminate();
},
});
Deno.test({
name:
"[node/worker_threads] MessagePort.on all message listeners are invoked",
async fn() {
const output: string[] = [];
const deferred = Promise.withResolvers<void>();
const { port1, port2 } = new workerThreads.MessageChannel();
port1.on("message", (msg) => output.push(msg));
port1.on("message", (msg) => output.push(msg + 2));
port1.on("message", (msg) => {
output.push(msg + 3);
deferred.resolve();
});
port2.postMessage("hi!");
await deferred.promise;
assertEquals(output, ["hi!", "hi!2", "hi!3"]);
port2.close();
port1.close();
},
});