diff options
Diffstat (limited to 'ext/node/polyfills/worker_threads.ts')
-rw-r--r-- | ext/node/polyfills/worker_threads.ts | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/ext/node/polyfills/worker_threads.ts b/ext/node/polyfills/worker_threads.ts index 8f531368a..e88e6368b 100644 --- a/ext/node/polyfills/worker_threads.ts +++ b/ext/node/polyfills/worker_threads.ts @@ -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 @@ -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] = () => { |