summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSatya Rohith <me@satyarohith.com>2024-04-03 16:42:16 +0530
committerGitHub <noreply@github.com>2024-04-03 11:12:16 +0000
commit86bc7a43810846fc66bf06b7577490f01ead1918 (patch)
treeab0061bb1c35010363f36ebe86ea97e55f7c507b
parent92a8ada7194ac013f8c34824f435f09b1f52ca5b (diff)
fix(ext/node): patch MessagePort if provided as workerData (#23198)
MessagePort if directly assigned to workerData property instead of embedding it in an object then it is not patched to a NodeMessagePort. This commit fixes the bug.
-rw-r--r--ext/node/polyfills/worker_threads.ts37
-rw-r--r--tests/testdata/workers/node_worker_message_port.mjs2
-rw-r--r--tests/testdata/workers/node_worker_message_port_1.cjs2
3 files changed, 19 insertions, 22 deletions
diff --git a/ext/node/polyfills/worker_threads.ts b/ext/node/polyfills/worker_threads.ts
index 49562d892..c34f1fe23 100644
--- a/ext/node/polyfills/worker_threads.ts
+++ b/ext/node/polyfills/worker_threads.ts
@@ -343,14 +343,7 @@ internals.__initWorkerThreads = (
defaultExport.parentPort = parentPort;
defaultExport.threadId = threadId;
- for (const obj in workerData as Record<string, unknown>) {
- if (ObjectPrototypeIsPrototypeOf(MessagePortPrototype, workerData[obj])) {
- workerData[obj] = webMessagePortToNodeMessagePort(
- workerData[obj] as MessagePort,
- );
- break;
- }
- }
+ workerData = patchMessagePortIfFound(workerData);
parentPort.off = parentPort.removeListener = function (
this: ParentPort,
@@ -369,18 +362,7 @@ internals.__initWorkerThreads = (
// deno-lint-ignore no-explicit-any
const _listener = (ev: any) => {
let message = ev.data;
- if (ObjectPrototypeIsPrototypeOf(MessagePortPrototype, message)) {
- message = webMessagePortToNodeMessagePort(message);
- } else {
- for (const obj in message) {
- if (
- ObjectPrototypeIsPrototypeOf(MessagePortPrototype, message[obj])
- ) {
- message[obj] = webMessagePortToNodeMessagePort(message[obj]);
- break;
- }
- }
- }
+ message = patchMessagePortIfFound(message);
return listener(message);
};
listeners.set(listener, _listener);
@@ -481,6 +463,21 @@ function webMessagePortToNodeMessagePort(port: MessagePort) {
return port;
}
+// deno-lint-ignore no-explicit-any
+function patchMessagePortIfFound(data: any) {
+ if (ObjectPrototypeIsPrototypeOf(MessagePortPrototype, data)) {
+ data = webMessagePortToNodeMessagePort(data);
+ } else {
+ for (const obj in data as Record<string, unknown>) {
+ if (ObjectPrototypeIsPrototypeOf(MessagePortPrototype, data[obj])) {
+ data[obj] = webMessagePortToNodeMessagePort(data[obj] as MessagePort);
+ break;
+ }
+ }
+ }
+ return data;
+}
+
export {
BroadcastChannel,
MessagePort,
diff --git a/tests/testdata/workers/node_worker_message_port.mjs b/tests/testdata/workers/node_worker_message_port.mjs
index 71640fb40..91c7e062d 100644
--- a/tests/testdata/workers/node_worker_message_port.mjs
+++ b/tests/testdata/workers/node_worker_message_port.mjs
@@ -9,7 +9,7 @@ const deferred = createDeferred();
const worker = new workerThreads.Worker(
import.meta.resolve("./node_worker_message_port_1.cjs"),
{
- workerData: { workerPort },
+ workerData: workerPort,
transferList: [workerPort],
},
);
diff --git a/tests/testdata/workers/node_worker_message_port_1.cjs b/tests/testdata/workers/node_worker_message_port_1.cjs
index 01739c51e..3f78cd539 100644
--- a/tests/testdata/workers/node_worker_message_port_1.cjs
+++ b/tests/testdata/workers/node_worker_message_port_1.cjs
@@ -1,7 +1,7 @@
const { parentPort, workerData } = require("worker_threads");
parentPort.on("message", (msg) => {
- const workerPort = workerData.workerPort;
+ const workerPort = workerData;
parentPort.postMessage("Hello from worker on parentPort!");
workerPort.postMessage("Hello from worker on workerPort!");
workerPort.on("close", () => console.log("worker port closed"));