mirror of
https://github.com/denoland/deno.git
synced 2025-01-12 00:54:02 -05:00
fix(ext/node): add support for MessagePort.removeListener/off (#23598)
Closes https://github.com/denoland/deno/issues/23564
This commit is contained in:
parent
021a0dc9b1
commit
455cf1743f
5 changed files with 47 additions and 0 deletions
|
@ -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) {
|
function webMessagePortToNodeMessagePort(port: MessagePort) {
|
||||||
port.on = port.addListener = function (this: MessagePort, name, listener) {
|
port.on = port.addListener = function (this: MessagePort, name, listener) {
|
||||||
// deno-lint-ignore no-explicit-any
|
// deno-lint-ignore no-explicit-any
|
||||||
|
@ -486,6 +492,24 @@ function webMessagePortToNodeMessagePort(port: MessagePort) {
|
||||||
} else {
|
} else {
|
||||||
throw new Error(`Unknown event: "${name}"`);
|
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;
|
return this;
|
||||||
};
|
};
|
||||||
port[nodeWorkerThreadCloseCb] = () => {
|
port[nodeWorkerThreadCloseCb] = () => {
|
||||||
|
|
|
@ -190,6 +190,11 @@ class MessagePort extends EventTarget {
|
||||||
this[_enabled] = true;
|
this[_enabled] = true;
|
||||||
while (true) {
|
while (true) {
|
||||||
if (this[_id] === null) break;
|
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;
|
let data;
|
||||||
try {
|
try {
|
||||||
data = await op_message_port_recv_message(
|
data = await op_message_port_recv_message(
|
||||||
|
|
8
tests/specs/node/worker_threads/__test__.jsonc
Normal file
8
tests/specs/node/worker_threads/__test__.jsonc
Normal file
|
@ -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!
|
Loading…
Reference in a new issue