summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSatya Rohith <me@satyarohith.com>2024-04-30 16:59:39 +0530
committerGitHub <noreply@github.com>2024-04-30 16:59:39 +0530
commit0156f82e7334f9ef31ff60b579baa4ba10bcd226 (patch)
treed692f9b82b7244b4f6c5672479a84d552ea7fe7c
parentce4a7773ccb606c51c824881e37043bc937c94f2 (diff)
fix(ext/node): support multiple message listeners on MessagePort (#23600)
Closes https://github.com/denoland/deno/issues/23561
-rw-r--r--ext/node/polyfills/worker_threads.ts12
-rw-r--r--tests/unit_node/worker_threads_test.ts21
2 files changed, 31 insertions, 2 deletions
diff --git a/ext/node/polyfills/worker_threads.ts b/ext/node/polyfills/worker_threads.ts
index e88e6368b..71999dd62 100644
--- a/ext/node/polyfills/worker_threads.ts
+++ b/ext/node/polyfills/worker_threads.ts
@@ -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 {
diff --git a/tests/unit_node/worker_threads_test.ts b/tests/unit_node/worker_threads_test.ts
index bc2becd66..f46d982fe 100644
--- a/tests/unit_node/worker_threads_test.ts
+++ b/tests/unit_node/worker_threads_test.ts
@@ -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();
+ },
+});