diff options
Diffstat (limited to 'ext/node/polyfills/worker_threads.ts')
-rw-r--r-- | ext/node/polyfills/worker_threads.ts | 72 |
1 files changed, 29 insertions, 43 deletions
diff --git a/ext/node/polyfills/worker_threads.ts b/ext/node/polyfills/worker_threads.ts index 2e379cfaf..15b51aeb4 100644 --- a/ext/node/polyfills/worker_threads.ts +++ b/ext/node/polyfills/worker_threads.ts @@ -22,7 +22,7 @@ import { import * as webidl from "ext:deno_webidl/00_webidl.js"; import { log } from "ext:runtime/06_util.js"; import { notImplemented } from "ext:deno_node/_utils.ts"; -import { EventEmitter, once } from "node:events"; +import { EventEmitter } from "node:events"; import { BroadcastChannel } from "ext:deno_broadcast_channel/01_broadcast_channel.js"; import { isAbsolute, resolve } from "node:path"; @@ -42,7 +42,6 @@ const { SafeRegExp, SafeMap, TypeError, - PromisePrototypeThen, } = primordials; export interface WorkerOptions { @@ -196,6 +195,13 @@ class NodeWorker extends EventEmitter { name = "[worker eval]"; } this.#name = name; + this.threadId = ++threads; + + const serializedWorkerMetadata = serializeJsMessageData({ + workerData: options?.workerData, + environmentData: environmentData, + threadId: this.threadId, + }, options?.transferList ?? []); const id = op_create_worker( { // deno-lint-ignore prefer-primordials @@ -206,16 +212,11 @@ class NodeWorker extends EventEmitter { name: this.#name, workerType: "module", }, + serializedWorkerMetadata, ); this.#id = id; this.#pollControl(); this.#pollMessages(); - - this.postMessage({ - environmentData, - threadId: (this.threadId = ++threads), - workerData: options?.workerData, - }, options?.transferList || []); // https://nodejs.org/api/worker_threads.html#event-online this.emit("online"); } @@ -387,7 +388,10 @@ type ParentPort = typeof self & NodeEventTarget; // deno-lint-ignore no-explicit-any let parentPort: ParentPort = null as any; -internals.__initWorkerThreads = (runningOnMainThread: boolean) => { +internals.__initWorkerThreads = ( + runningOnMainThread: boolean, + maybeWorkerMetadata, +) => { isMainThread = runningOnMainThread; defaultExport.isMainThread = isMainThread; @@ -409,29 +413,15 @@ internals.__initWorkerThreads = (runningOnMainThread: boolean) => { >(); parentPort = self as ParentPort; + if (typeof maybeWorkerMetadata !== "undefined") { + const { 0: metadata, 1: _ } = maybeWorkerMetadata; + workerData = metadata.workerData; + environmentData = metadata.environmentData; + threadId = metadata.threadId; + } + defaultExport.workerData = workerData; defaultExport.parentPort = parentPort; - - const initPromise = PromisePrototypeThen( - once( - parentPort, - "message", - ), - (result) => { - // TODO(bartlomieju): just so we don't error out here. It's still racy, - // but should be addressed by https://github.com/denoland/deno/issues/22783 - // shortly. - const data = result[0].data ?? {}; - // TODO(kt3k): The below values are set asynchronously - // using the first message from the parent. - // This should be done synchronously. - threadId = data.threadId; - workerData = data.workerData; - environmentData = data.environmentData; - - defaultExport.threadId = threadId; - defaultExport.workerData = workerData; - }, - ); + defaultExport.threadId = threadId; parentPort.off = parentPort.removeListener = function ( this: ParentPort, @@ -447,22 +437,18 @@ internals.__initWorkerThreads = (runningOnMainThread: boolean) => { name, listener, ) { - PromisePrototypeThen(initPromise, () => { - // deno-lint-ignore no-explicit-any - const _listener = (ev: any) => listener(ev.data); - listeners.set(listener, _listener); - this.addEventListener(name, _listener); - }); + // deno-lint-ignore no-explicit-any + const _listener = (ev: any) => listener(ev.data); + listeners.set(listener, _listener); + this.addEventListener(name, _listener); return this; }; parentPort.once = function (this: ParentPort, name, listener) { - PromisePrototypeThen(initPromise, () => { - // deno-lint-ignore no-explicit-any - const _listener = (ev: any) => listener(ev.data); - listeners.set(listener, _listener); - this.addEventListener(name, _listener); - }); + // deno-lint-ignore no-explicit-any + const _listener = (ev: any) => listener(ev.data); + listeners.set(listener, _listener); + this.addEventListener(name, _listener); return this; }; |