0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-02-13 01:06:00 -05:00

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.
This commit is contained in:
Satya Rohith 2024-04-03 16:42:16 +05:30
parent 4649005648
commit dba1c58933
No known key found for this signature in database
GPG key ID: B2705CF40523EB05
3 changed files with 19 additions and 22 deletions

View file

@ -343,14 +343,7 @@ internals.__initWorkerThreads = (
defaultExport.parentPort = parentPort; defaultExport.parentPort = parentPort;
defaultExport.threadId = threadId; defaultExport.threadId = threadId;
for (const obj in workerData as Record<string, unknown>) { workerData = patchMessagePortIfFound(workerData);
if (ObjectPrototypeIsPrototypeOf(MessagePortPrototype, workerData[obj])) {
workerData[obj] = webMessagePortToNodeMessagePort(
workerData[obj] as MessagePort,
);
break;
}
}
parentPort.off = parentPort.removeListener = function ( parentPort.off = parentPort.removeListener = function (
this: ParentPort, this: ParentPort,
@ -369,18 +362,7 @@ internals.__initWorkerThreads = (
// deno-lint-ignore no-explicit-any // deno-lint-ignore no-explicit-any
const _listener = (ev: any) => { const _listener = (ev: any) => {
let message = ev.data; let message = ev.data;
if (ObjectPrototypeIsPrototypeOf(MessagePortPrototype, message)) { message = patchMessagePortIfFound(message);
message = webMessagePortToNodeMessagePort(message);
} else {
for (const obj in message) {
if (
ObjectPrototypeIsPrototypeOf(MessagePortPrototype, message[obj])
) {
message[obj] = webMessagePortToNodeMessagePort(message[obj]);
break;
}
}
}
return listener(message); return listener(message);
}; };
listeners.set(listener, _listener); listeners.set(listener, _listener);
@ -481,6 +463,21 @@ function webMessagePortToNodeMessagePort(port: MessagePort) {
return port; 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 { export {
BroadcastChannel, BroadcastChannel,
MessagePort, MessagePort,

View file

@ -9,7 +9,7 @@ const deferred = createDeferred();
const worker = new workerThreads.Worker( const worker = new workerThreads.Worker(
import.meta.resolve("./node_worker_message_port_1.cjs"), import.meta.resolve("./node_worker_message_port_1.cjs"),
{ {
workerData: { workerPort }, workerData: workerPort,
transferList: [workerPort], transferList: [workerPort],
}, },
); );

View file

@ -1,7 +1,7 @@
const { parentPort, workerData } = require("worker_threads"); const { parentPort, workerData } = require("worker_threads");
parentPort.on("message", (msg) => { parentPort.on("message", (msg) => {
const workerPort = workerData.workerPort; const workerPort = workerData;
parentPort.postMessage("Hello from worker on parentPort!"); parentPort.postMessage("Hello from worker on parentPort!");
workerPort.postMessage("Hello from worker on workerPort!"); workerPort.postMessage("Hello from worker on workerPort!");
workerPort.on("close", () => console.log("worker port closed")); workerPort.on("close", () => console.log("worker port closed"));