Skip to content

Commit

Permalink
fix(ext/node): add support for MessagePort.removeListener/off (#23598)
Browse files Browse the repository at this point in the history
Closes #23564
  • Loading branch information
satyarohith committed Apr 29, 2024
1 parent 021a0dc commit 455cf17
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 0 deletions.
24 changes: 24 additions & 0 deletions ext/node/polyfills/worker_threads.ts
Expand Up @@ -473,6 +473,12 @@ class NodeMessageChannel {
}
}

const listeners = new SafeWeakMap<
// deno-lint-ignore no-explicit-any
(...args: any[]) => void,
// deno-lint-ignore no-explicit-any
(ev: any) => any
>();
function webMessagePortToNodeMessagePort(port: MessagePort) {
port.on = port.addListener = function (this: MessagePort, name, listener) {
// deno-lint-ignore no-explicit-any
Expand All @@ -486,6 +492,24 @@ function webMessagePortToNodeMessagePort(port: MessagePort) {
} else {
throw new Error(`Unknown event: "${name}"`);
}
listeners.set(listener, _listener);
return this;
};
port.off = port.removeListener = function (
this: MessagePort,
name,
listener,
) {
if (name == "message") {
port.removeEventListener("message", listeners.get(listener)!);
} else if (name == "messageerror") {
port.removeEventListener("messageerror", listeners.get(listener)!);
} else if (name == "close") {
port.removeEventListener("close", listeners.get(listener)!);
} else {
throw new Error(`Unknown event: "${name}"`);
}
listeners.delete(listener);
return this;
};
port[nodeWorkerThreadCloseCb] = () => {
Expand Down
5 changes: 5 additions & 0 deletions ext/web/13_message_port.js
Expand Up @@ -190,6 +190,11 @@ class MessagePort extends EventTarget {
this[_enabled] = true;
while (true) {
if (this[_id] === null) break;
// Exit if no message event listeners are present in Node compat mode.
if (
typeof this[nodeWorkerThreadCloseCb] == "function" &&
messageEventListenerCount === 0
) break;
let data;
try {
data = await op_message_port_recv_message(
Expand Down
8 changes: 8 additions & 0 deletions tests/specs/node/worker_threads/__test__.jsonc
@@ -0,0 +1,8 @@
{
"steps": [{
"args": "run message_port_removelistener.mjs",
"output": "message_port_removelistener.mjs.out",
// Note: successful exit asserts that the test passed
"exitCode": 0
}]
}
@@ -0,0 +1,9 @@
import { MessageChannel } from "node:worker_threads";

const { port1, port2 } = new MessageChannel();
const listener = (message) => {
console.log(message);
port1.off("message", listener);
};
port1.on("message", listener);
port2.postMessage("Hello World!");
@@ -0,0 +1 @@
Hello World!

0 comments on commit 455cf17

Please sign in to comment.