@xylabs/threads 5.0.13 → 5.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index-browser.mjs +119 -209
- package/dist/browser/index-browser.mjs.map +1 -1
- package/dist/browser/master/implementation.browser.mjs +11 -36
- package/dist/browser/master/implementation.browser.mjs.map +1 -1
- package/dist/browser/master/index-browser.mjs +117 -201
- package/dist/browser/master/index-browser.mjs.map +1 -1
- package/dist/browser/master/pool-browser.mjs +53 -65
- package/dist/browser/master/pool-browser.mjs.map +1 -1
- package/dist/browser/worker/worker.browser.mjs +43 -79
- package/dist/browser/worker/worker.browser.mjs.map +1 -1
- package/dist/neutral/master/register.mjs +62 -121
- package/dist/neutral/master/register.mjs.map +1 -1
- package/dist/neutral/master/spawn.mjs +53 -106
- package/dist/neutral/master/spawn.mjs.map +1 -1
- package/dist/neutral/master/thread.mjs +0 -4
- package/dist/neutral/master/thread.mjs.map +1 -1
- package/dist/neutral/observable-promise.mjs +20 -27
- package/dist/neutral/observable-promise.mjs.map +1 -1
- package/dist/neutral/observable.mjs +3 -12
- package/dist/neutral/observable.mjs.map +1 -1
- package/dist/neutral/types/messages.mjs +4 -4
- package/dist/neutral/types/messages.mjs.map +1 -1
- package/dist/node/index-node.mjs +169 -293
- package/dist/node/index-node.mjs.map +1 -1
- package/dist/node/master/implementation.node.mjs +62 -121
- package/dist/node/master/implementation.node.mjs.map +1 -1
- package/dist/node/master/index-node.mjs +168 -286
- package/dist/node/master/index-node.mjs.map +1 -1
- package/dist/node/master/pool-node.mjs +115 -183
- package/dist/node/master/pool-node.mjs.map +1 -1
- package/dist/node/worker/worker.node.mjs +43 -80
- package/dist/node/worker/worker.node.mjs.map +1 -1
- package/package.json +3 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../node_modules/.store/tiny-worker-npm-2.3.0-38c7100e1d/package/lib/index.js","../../../src/master/pool-node.ts","../../../src/master/implementation.node.ts","../../../src/master/pool-types.ts","../../../src/symbols.ts","../../../src/master/thread.ts"],"sourcesContent":["\"use strict\";\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar path = require(\"path\"),\n fork = require(\"child_process\").fork,\n worker = path.join(__dirname, \"worker.js\"),\n events = /^(error|message)$/,\n defaultPorts = { inspect: 9229, debug: 5858 };\nvar range = { min: 1, max: 300 };\n\nvar Worker = function () {\n\tfunction Worker(arg) {\n\t\tvar _this = this;\n\n\t\tvar args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n\t\tvar options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : { cwd: process.cwd() };\n\n\t\t_classCallCheck(this, Worker);\n\n\t\tvar isfn = typeof arg === \"function\",\n\t\t input = isfn ? arg.toString() : arg;\n\n\t\tif (!options.cwd) {\n\t\t\toptions.cwd = process.cwd();\n\t\t}\n\n\t\t//get all debug related parameters\n\t\tvar debugVars = process.execArgv.filter(function (execArg) {\n\t\t\treturn (/(debug|inspect)/.test(execArg)\n\t\t\t);\n\t\t});\n\t\tif (debugVars.length > 0 && !options.noDebugRedirection) {\n\t\t\tif (!options.execArgv) {\n\t\t\t\t//if no execArgs are given copy all arguments\n\t\t\t\tdebugVars = Array.from(process.execArgv);\n\t\t\t\toptions.execArgv = [];\n\t\t\t}\n\n\t\t\tvar inspectIndex = debugVars.findIndex(function (debugArg) {\n\t\t\t\t//get index of inspect parameter\n\t\t\t\treturn (/^--inspect(-brk)?(=\\d+)?$/.test(debugArg)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tvar debugIndex = debugVars.findIndex(function (debugArg) {\n\t\t\t\t//get index of debug parameter\n\t\t\t\treturn (/^--debug(-brk)?(=\\d+)?$/.test(debugArg)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tvar portIndex = inspectIndex >= 0 ? inspectIndex : debugIndex; //get index of port, inspect has higher priority\n\n\t\t\tif (portIndex >= 0) {\n\t\t\t\tvar match = /^--(debug|inspect)(?:-brk)?(?:=(\\d+))?$/.exec(debugVars[portIndex]); //get port\n\t\t\t\tvar port = defaultPorts[match[1]];\n\t\t\t\tif (match[2]) {\n\t\t\t\t\tport = parseInt(match[2]);\n\t\t\t\t}\n\t\t\t\tdebugVars[portIndex] = \"--\" + match[1] + \"=\" + (port + range.min + Math.floor(Math.random() * (range.max - range.min))); //new parameter\n\n\t\t\t\tif (debugIndex >= 0 && debugIndex !== portIndex) {\n\t\t\t\t\t//remove \"-brk\" from debug if there\n\t\t\t\t\tmatch = /^(--debug)(?:-brk)?(.*)/.exec(debugVars[debugIndex]);\n\t\t\t\t\tdebugVars[debugIndex] = match[1] + (match[2] ? match[2] : \"\");\n\t\t\t\t}\n\t\t\t}\n\t\t\toptions.execArgv = options.execArgv.concat(debugVars);\n\t\t}\n\n\t\tdelete options.noDebugRedirection;\n\n\t\tthis.child = fork(worker, args, options);\n\t\tthis.onerror = undefined;\n\t\tthis.onmessage = undefined;\n\n\t\tthis.child.on(\"error\", function (e) {\n\t\t\tif (_this.onerror) {\n\t\t\t\t_this.onerror.call(_this, e);\n\t\t\t}\n\t\t});\n\n\t\tthis.child.on(\"message\", function (msg) {\n\t\t\tvar message = JSON.parse(msg);\n\t\t\tvar error = void 0;\n\n\t\t\tif (!message.error && _this.onmessage) {\n\t\t\t\t_this.onmessage.call(_this, message);\n\t\t\t}\n\n\t\t\tif (message.error && _this.onerror) {\n\t\t\t\terror = new Error(message.error);\n\t\t\t\terror.stack = message.stack;\n\n\t\t\t\t_this.onerror.call(_this, error);\n\t\t\t}\n\t\t});\n\n\t\tthis.child.send({ input: input, isfn: isfn, cwd: options.cwd, esm: options.esm });\n\t}\n\n\t_createClass(Worker, [{\n\t\tkey: \"addEventListener\",\n\t\tvalue: function addEventListener(event, fn) {\n\t\t\tif (events.test(event)) {\n\t\t\t\tthis[\"on\" + event] = fn;\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: \"postMessage\",\n\t\tvalue: function postMessage(msg) {\n\t\t\tthis.child.send(JSON.stringify({ data: msg }, null, 0));\n\t\t}\n\t}, {\n\t\tkey: \"terminate\",\n\t\tvalue: function terminate() {\n\t\t\tthis.child.kill(\"SIGINT\");\n\t\t}\n\t}], [{\n\t\tkey: \"setRange\",\n\t\tvalue: function setRange(min, max) {\n\t\t\tif (min >= max) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\trange.min = min;\n\t\t\trange.max = max;\n\n\t\t\treturn true;\n\t\t}\n\t}]);\n\n\treturn Worker;\n}();\n\nmodule.exports = Worker;\n","/* eslint-disable import-x/export */\n/* eslint-disable unicorn/no-thenable */\n\n/* eslint-disable @typescript-eslint/member-ordering */\n/* eslint-disable unicorn/no-array-reduce */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-namespace */\n\n/// <reference lib=\"esnext\" />\n\nimport DebugLogger from 'debug'\nimport {\n multicast, Observable, Subject,\n} from 'observable-fns'\n\nimport { defaultPoolSize } from './implementation.node.ts'\nimport type {\n PoolEvent, QueuedTask, TaskRunFunction, WorkerDescriptor,\n} from './pool-types.ts'\nimport { PoolEventType } from './pool-types.ts'\nimport { Thread } from './thread.ts'\n\nexport declare namespace Pool {\n type Event<ThreadType extends Thread = any> = PoolEvent<ThreadType>\n type EventType = PoolEventType\n}\n\nlet nextPoolID = 1\n\nfunction createArray(size: number): number[] {\n const array: number[] = []\n for (let index = 0; index < size; index++) {\n array.push(index)\n }\n return array\n}\n\nfunction delay(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n\nfunction flatMap<In, Out>(array: In[], mapper: (element: In) => Out[]): Out[] {\n return array.reduce<Out[]>((flattened, element) => [...flattened, ...mapper(element)], [])\n}\n\nfunction slugify(text: string) {\n return text.replaceAll(/\\W/g, ' ').trim().replaceAll(/\\s+/g, '-')\n}\n\nfunction spawnWorkers<ThreadType extends Thread>(spawnWorker: () => Promise<ThreadType>, count: number): Array<WorkerDescriptor<ThreadType>> {\n return createArray(count).map(\n (): WorkerDescriptor<ThreadType> => ({\n init: spawnWorker(),\n runningTasks: [],\n }),\n )\n}\n\n/**\n * Thread pool managing a set of worker threads.\n * Use it to queue tasks that are run on those threads with limited\n * concurrency.\n */\nexport interface Pool<ThreadType extends Thread> {\n /**\n * Returns a promise that resolves once the task queue is emptied.\n * Promise will be rejected if any task fails.\n *\n * @param allowResolvingImmediately Set to `true` to resolve immediately if task queue is currently empty.\n */\n completed(allowResolvingImmediately?: boolean): Promise<any>\n\n /**\n * Returns a promise that resolves once the task queue is emptied.\n * Failing tasks will not cause the promise to be rejected.\n *\n * @param allowResolvingImmediately Set to `true` to resolve immediately if task queue is currently empty.\n */\n settled(allowResolvingImmediately?: boolean): Promise<Error[]>\n\n /**\n * Returns an observable that yields pool events.\n */\n events(): Observable<PoolEvent<ThreadType>>\n\n /**\n * Queue a task and return a promise that resolves once the task has been dequeued,\n * started and finished.\n *\n * @param task An async function that takes a thread instance and invokes it.\n */\n queue<Return>(task: TaskRunFunction<ThreadType, Return>): QueuedTask<ThreadType, Return>\n\n /**\n * Terminate all pool threads.\n *\n * @param force Set to `true` to kill the thread even if it cannot be stopped gracefully.\n */\n terminate(force?: boolean): Promise<void>\n}\n\ninterface PoolOptions {\n /** Maximum no. of tasks to run on one worker thread at a time. Defaults to one. */\n concurrency?: number\n\n /** Maximum no. of jobs to be queued for execution before throwing an error. */\n maxQueuedJobs?: number\n\n /** Gives that pool a name to be used for debug logging, letting you distinguish between log output of different pools. */\n name?: string\n\n /** No. of worker threads to spawn and to be managed by the pool. */\n size?: number\n}\n\nclass WorkerPool<ThreadType extends Thread> implements Pool<ThreadType> {\n static EventType = PoolEventType\n\n private readonly debug: DebugLogger.Debugger\n private readonly eventObservable: Observable<PoolEvent<ThreadType>>\n private readonly options: PoolOptions\n private readonly workers: Array<WorkerDescriptor<ThreadType>>\n\n private readonly eventSubject = new Subject<PoolEvent<ThreadType>>()\n private initErrors: Error[] = []\n private isClosing = false\n private nextTaskID = 1\n private taskQueue: Array<QueuedTask<ThreadType, any>> = []\n\n constructor(spawnWorker: () => Promise<ThreadType>, optionsOrSize?: number | PoolOptions) {\n const options: PoolOptions = typeof optionsOrSize === 'number' ? { size: optionsOrSize } : optionsOrSize || {}\n\n const { size = defaultPoolSize } = options\n\n this.debug = DebugLogger(`threads:pool:${slugify(options.name || String(nextPoolID++))}`)\n this.options = options\n this.workers = spawnWorkers(spawnWorker, size)\n\n this.eventObservable = multicast(Observable.from(this.eventSubject))\n\n Promise.all(this.workers.map(worker => worker.init)).then(\n () =>\n this.eventSubject.next({\n size: this.workers.length,\n type: PoolEventType.initialized,\n }),\n (error) => {\n this.debug('Error while initializing pool worker:', error)\n this.eventSubject.error(error)\n this.initErrors.push(error)\n },\n )\n }\n\n private findIdlingWorker(): WorkerDescriptor<ThreadType> | undefined {\n const { concurrency = 1 } = this.options\n return this.workers.find(worker => worker.runningTasks.length < concurrency)\n }\n\n private async runPoolTask(worker: WorkerDescriptor<ThreadType>, task: QueuedTask<ThreadType, any>) {\n const workerID = this.workers.indexOf(worker) + 1\n\n this.debug(`Running task #${task.id} on worker #${workerID}...`)\n this.eventSubject.next({\n taskID: task.id,\n type: PoolEventType.taskStart,\n workerID,\n })\n\n try {\n const returnValue = await task.run(await worker.init)\n\n this.debug(`Task #${task.id} completed successfully`)\n this.eventSubject.next({\n returnValue,\n taskID: task.id,\n type: PoolEventType.taskCompleted,\n workerID,\n })\n } catch (ex) {\n const error = ex as Error\n this.debug(`Task #${task.id} failed`)\n this.eventSubject.next({\n error,\n taskID: task.id,\n type: PoolEventType.taskFailed,\n workerID,\n })\n }\n }\n\n private run(worker: WorkerDescriptor<ThreadType>, task: QueuedTask<ThreadType, any>) {\n const runPromise = (async () => {\n const removeTaskFromWorkersRunningTasks = () => {\n worker.runningTasks = worker.runningTasks.filter(someRunPromise => someRunPromise !== runPromise)\n }\n\n // Defer task execution by one tick to give handlers time to subscribe\n await delay(0)\n\n try {\n await this.runPoolTask(worker, task)\n } finally {\n removeTaskFromWorkersRunningTasks()\n\n if (!this.isClosing) {\n this.scheduleWork()\n }\n }\n })()\n\n worker.runningTasks.push(runPromise)\n }\n\n private scheduleWork() {\n this.debug('Attempt de-queueing a task in order to run it...')\n\n const availableWorker = this.findIdlingWorker()\n if (!availableWorker) return\n\n const nextTask = this.taskQueue.shift()\n if (!nextTask) {\n this.debug('Task queue is empty')\n this.eventSubject.next({ type: PoolEventType.taskQueueDrained })\n return\n }\n\n this.run(availableWorker, nextTask)\n }\n\n private taskCompletion(taskID: number) {\n return new Promise<any>((resolve, reject) => {\n const eventSubscription = this.events().subscribe((event) => {\n if (event.type === PoolEventType.taskCompleted && event.taskID === taskID) {\n eventSubscription.unsubscribe()\n resolve(event.returnValue)\n } else if (event.type === PoolEventType.taskFailed && event.taskID === taskID) {\n eventSubscription.unsubscribe()\n reject(event.error)\n } else if (event.type === PoolEventType.terminated) {\n eventSubscription.unsubscribe()\n reject(new Error('Pool has been terminated before task was run.'))\n }\n })\n })\n }\n\n async settled(allowResolvingImmediately: boolean = false): Promise<Error[]> {\n const getCurrentlyRunningTasks = () => flatMap(this.workers, worker => worker.runningTasks)\n\n const taskFailures: Error[] = []\n\n const failureSubscription = this.eventObservable.subscribe((event) => {\n if (event.type === PoolEventType.taskFailed) {\n taskFailures.push(event.error)\n }\n })\n\n if (this.initErrors.length > 0) {\n throw this.initErrors[0]\n }\n if (allowResolvingImmediately && this.taskQueue.length === 0) {\n await Promise.allSettled(getCurrentlyRunningTasks())\n return taskFailures\n }\n\n await new Promise<void>((resolve, reject) => {\n const subscription = this.eventObservable.subscribe({\n error: reject,\n next(event) {\n if (event.type === PoolEventType.taskQueueDrained) {\n subscription.unsubscribe()\n resolve(void 0)\n }\n }, // make a pool-wide error reject the completed() result promise\n })\n })\n\n await Promise.allSettled(getCurrentlyRunningTasks())\n failureSubscription.unsubscribe()\n\n return taskFailures\n }\n\n async completed(allowResolvingImmediately: boolean = false) {\n const settlementPromise = this.settled(allowResolvingImmediately)\n\n const earlyExitPromise = new Promise<Error[]>((resolve, reject) => {\n const subscription = this.eventObservable.subscribe({\n error: reject,\n next(event) {\n if (event.type === PoolEventType.taskQueueDrained) {\n subscription.unsubscribe()\n resolve(settlementPromise)\n } else if (event.type === PoolEventType.taskFailed) {\n subscription.unsubscribe()\n reject(event.error)\n }\n }, // make a pool-wide error reject the completed() result promise\n })\n })\n\n const errors = await Promise.race([settlementPromise, earlyExitPromise])\n\n if (errors.length > 0) {\n throw errors[0]\n }\n }\n\n events() {\n return this.eventObservable\n }\n\n queue(taskFunction: TaskRunFunction<ThreadType, any>) {\n const { maxQueuedJobs = Number.POSITIVE_INFINITY } = this.options\n\n if (this.isClosing) {\n throw new Error('Cannot schedule pool tasks after terminate() has been called.')\n }\n if (this.initErrors.length > 0) {\n throw this.initErrors[0]\n }\n\n const taskID = this.nextTaskID++\n const taskCompletion = this.taskCompletion(taskID)\n\n taskCompletion.catch((error) => {\n // Prevent unhandled rejections here as we assume the user will use\n // `pool.completed()`, `pool.settled()` or `task.catch()` to handle errors\n this.debug(`Task #${taskID} errored:`, error)\n })\n\n const task: QueuedTask<ThreadType, any> = {\n cancel: () => {\n if (!this.taskQueue.includes(task)) return\n this.taskQueue = this.taskQueue.filter(someTask => someTask !== task)\n this.eventSubject.next({\n taskID: task.id,\n type: PoolEventType.taskCanceled,\n })\n },\n id: taskID,\n run: taskFunction,\n then: taskCompletion.then.bind(taskCompletion),\n }\n\n if (this.taskQueue.length >= maxQueuedJobs) {\n throw new Error(\n 'Maximum number of pool tasks queued. Refusing to queue another one.\\n'\n + 'This usually happens for one of two reasons: We are either at peak '\n + \"workload right now or some tasks just won't finish, thus blocking the pool.\",\n )\n }\n\n this.debug(`Queueing task #${task.id}...`)\n this.taskQueue.push(task)\n\n this.eventSubject.next({\n taskID: task.id,\n type: PoolEventType.taskQueued,\n })\n\n this.scheduleWork()\n return task\n }\n\n async terminate(force?: boolean) {\n this.isClosing = true\n if (!force) {\n await this.completed(true)\n }\n this.eventSubject.next({\n remainingQueue: [...this.taskQueue],\n type: PoolEventType.terminated,\n })\n this.eventSubject.complete()\n await Promise.all(this.workers.map(async worker => Thread.terminate(await worker.init)))\n }\n}\n\n/**\n * Thread pool constructor. Creates a new pool and spawns its worker threads.\n */\nfunction PoolConstructor<ThreadType extends Thread>(spawnWorker: () => Promise<ThreadType>, optionsOrSize?: number | PoolOptions) {\n // The function exists only so we don't need to use `new` to create a pool (we still can, though).\n // If the Pool is a class or not is an implementation detail that should not concern the user.\n return new WorkerPool(spawnWorker, optionsOrSize)\n}\n\n;(PoolConstructor as any).EventType = PoolEventType\n\n/**\n * Thread pool constructor. Creates a new pool and spawns its worker threads.\n */\nexport const Pool = PoolConstructor as typeof PoolConstructor & { EventType: typeof PoolEventType }\n\nexport type { PoolEvent, QueuedTask } from './pool-types.ts'\nexport { PoolEventType } from './pool-types.ts'\nexport { Thread } from './thread.ts'\n","/* eslint-disable @typescript-eslint/no-require-imports */\n\n/* eslint-disable unicorn/prefer-add-event-listener */\n/* eslint-disable unicorn/prefer-event-target */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable unicorn/text-encoding-identifier-case */\n\nimport { EventEmitter } from 'node:events'\nimport { cpus } from 'node:os'\nimport path from 'node:path'\nimport { cwd } from 'node:process'\nimport { Worker as NativeWorker } from 'node:worker_threads'\n\nimport type {\n ImplementationExport, ThreadsWorkerOptions, WorkerImplementation,\n// eslint-disable-next-line import-x/no-internal-modules\n} from '../types/master.ts'\n\ndeclare const __non_webpack_require__: typeof require\n\ntype WorkerEventName = 'error' | 'message'\n\nexport const defaultPoolSize = cpus().length\n\nfunction resolveScriptPath(scriptPath: string, baseURL?: string | undefined) {\n const makeAbsolute = (filePath: string) => {\n return path.isAbsolute(filePath) ? filePath : path.join(baseURL ?? cwd(), filePath)\n }\n\n const absolutePath = makeAbsolute(scriptPath)\n return absolutePath\n}\n\nfunction initWorkerThreadsWorker(): ImplementationExport {\n let allWorkers: Array<NativeWorker> = []\n\n class Worker extends NativeWorker {\n private mappedEventListeners: WeakMap<EventListener, EventListener>\n\n constructor(scriptPath: string, options?: ThreadsWorkerOptions & { fromSource: boolean }) {\n const resolvedScriptPath = options && options.fromSource ? null : resolveScriptPath(scriptPath, (options ?? {})._baseURL)\n if (resolvedScriptPath) {\n super(resolvedScriptPath, options)\n } else {\n // `options.fromSource` is true\n const sourceCode = scriptPath\n super(sourceCode, { ...options, eval: true })\n }\n\n this.mappedEventListeners = new WeakMap()\n allWorkers.push(this)\n }\n\n addEventListener(eventName: string, rawListener: EventListener) {\n const listener = (message: any) => {\n rawListener({ data: message } as any)\n }\n this.mappedEventListeners.set(rawListener, listener)\n this.on(eventName, listener)\n }\n\n removeEventListener(eventName: string, rawListener: EventListener) {\n const listener = this.mappedEventListeners.get(rawListener) || rawListener\n this.off(eventName, listener)\n }\n }\n\n const terminateWorkersAndMaster = () => {\n // we should terminate all workers and then gracefully shutdown self process\n Promise.all(allWorkers.map(worker => worker.terminate())).then(\n () => process.exit(0),\n () => process.exit(1),\n )\n allWorkers = []\n }\n\n // Take care to not leave orphaned processes behind. See #147.\n process.on('SIGINT', () => terminateWorkersAndMaster())\n process.on('SIGTERM', () => terminateWorkersAndMaster())\n\n class BlobWorker extends Worker {\n constructor(blob: Uint8Array, options?: ThreadsWorkerOptions) {\n super(Buffer.from(blob).toString('utf-8'), { ...options, fromSource: true })\n }\n\n static fromText(source: string, options?: ThreadsWorkerOptions): WorkerImplementation {\n return new Worker(source, { ...options, fromSource: true }) as any\n }\n }\n\n return {\n blob: BlobWorker as any,\n default: Worker as any,\n }\n}\n\nfunction initTinyWorker(): ImplementationExport {\n const TinyWorker = require('tiny-worker')\n\n let allWorkers: Array<typeof TinyWorker> = []\n\n class Worker extends TinyWorker {\n private emitter: EventEmitter\n\n constructor(scriptPath: string, options?: ThreadsWorkerOptions & { fromSource?: boolean }) {\n // Need to apply a work-around for Windows or it will choke upon the absolute path\n // (`Error [ERR_INVALID_PROTOCOL]: Protocol 'c:' not supported`)\n const resolvedScriptPath\n = options && options.fromSource\n ? null\n : process.platform === 'win32'\n ? `file:///${resolveScriptPath(scriptPath).replaceAll('\\\\', '/')}`\n : resolveScriptPath(scriptPath)\n\n if (resolvedScriptPath) {\n super(resolvedScriptPath, [], { esm: true })\n } else {\n // `options.fromSource` is true\n const sourceCode = scriptPath\n super(new Function(sourceCode), [], { esm: true })\n }\n\n allWorkers.push(this)\n\n this.emitter = new EventEmitter()\n this.onerror = (error: Error) => this.emitter.emit('error', error)\n this.onmessage = (message: MessageEvent) => this.emitter.emit('message', message)\n }\n\n addEventListener(eventName: WorkerEventName, listener: EventListener) {\n this.emitter.addListener(eventName, listener)\n }\n\n removeEventListener(eventName: WorkerEventName, listener: EventListener) {\n this.emitter.removeListener(eventName, listener)\n }\n\n terminate() {\n allWorkers = allWorkers.filter(worker => worker !== this)\n return super.terminate()\n }\n }\n\n const terminateWorkersAndMaster = () => {\n // we should terminate all workers and then gracefully shutdown self process\n Promise.all(allWorkers.map(worker => worker.terminate())).then(\n () => process.exit(0),\n () => process.exit(1),\n )\n allWorkers = []\n }\n\n // Take care to not leave orphaned processes behind\n // See <https://github.com/avoidwork/tiny-worker#faq>\n process.on('SIGINT', () => terminateWorkersAndMaster())\n process.on('SIGTERM', () => terminateWorkersAndMaster())\n\n class BlobWorker extends Worker {\n constructor(blob: Uint8Array, options?: ThreadsWorkerOptions) {\n super(Buffer.from(blob).toString('utf-8'), { ...options, fromSource: true })\n }\n\n static fromText(source: string, options?: ThreadsWorkerOptions): WorkerImplementation {\n return new Worker(source, { ...options, fromSource: true }) as any\n }\n }\n\n return {\n blob: BlobWorker as any,\n default: Worker as any,\n }\n}\n\nlet implementation: ImplementationExport\nlet isTinyWorker: boolean\n\nfunction selectWorkerImplementation(): ImplementationExport {\n try {\n isTinyWorker = false\n return initWorkerThreadsWorker()\n } catch (ex) {\n console.error(ex)\n // tslint:disable-next-line no-console\n console.debug('Node worker_threads not available. Trying to fall back to tiny-worker polyfill...')\n isTinyWorker = true\n return initTinyWorker()\n }\n}\n\nexport function getWorkerImplementation(): ImplementationExport {\n if (!implementation) {\n implementation = selectWorkerImplementation()\n }\n return implementation\n}\n\nexport function isWorkerRuntime() {\n if (isTinyWorker) {\n return globalThis !== undefined && self['postMessage'] ? true : false\n } else {\n // Webpack hack\n const isMainThread\n = typeof __non_webpack_require__ === 'function'\n ? __non_webpack_require__('worker_threads').isMainThread\n : eval('require')('worker_threads').isMainThread\n return !isMainThread\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/member-ordering */\nimport type { Thread } from './thread.ts'\n\n/** Pool event type. Specifies the type of each `PoolEvent`. */\nexport enum PoolEventType {\n initialized = 'initialized',\n taskCanceled = 'taskCanceled',\n taskCompleted = 'taskCompleted',\n taskFailed = 'taskFailed',\n taskQueued = 'taskQueued',\n taskQueueDrained = 'taskQueueDrained',\n taskStart = 'taskStart',\n terminated = 'terminated',\n}\n\nexport type TaskRunFunction<ThreadType extends Thread, Return> = (worker: ThreadType) => Promise<Return>\n\n/** Pool event. Subscribe to those events using `pool.events()`. Useful for debugging. */\nexport type PoolEvent<ThreadType extends Thread> =\n | {\n type: PoolEventType.initialized\n size: number\n }\n | {\n type: PoolEventType.taskQueued\n taskID: number\n }\n | {\n type: PoolEventType.taskQueueDrained\n }\n | {\n type: PoolEventType.taskStart\n taskID: number\n workerID: number\n }\n | {\n type: PoolEventType.taskCompleted\n returnValue: any\n taskID: number\n workerID: number\n }\n | {\n type: PoolEventType.taskFailed\n error: Error\n taskID: number\n workerID: number\n }\n | {\n type: PoolEventType.taskCanceled\n taskID: number\n }\n | {\n type: PoolEventType.terminated\n remainingQueue: Array<QueuedTask<ThreadType, any>>\n }\n\nexport interface WorkerDescriptor<ThreadType extends Thread> {\n init: Promise<ThreadType>\n runningTasks: Array<Promise<any>>\n}\n\n/**\n * Task that has been `pool.queued()`-ed.\n */\nexport interface QueuedTask<ThreadType extends Thread, Return> {\n /** @private */\n id: number\n\n /** @private */\n run: TaskRunFunction<ThreadType, Return>\n\n /**\n * Queued tasks can be cancelled until the pool starts running them on a worker thread.\n */\n cancel(): void\n\n /**\n * `QueuedTask` is thenable, so you can `await` it.\n * Resolves when the task has successfully been executed. Rejects if the task fails.\n */\n then: Promise<Return>['then']\n}\n","export const $errors = Symbol('thread.errors')\nexport const $events = Symbol('thread.events')\nexport const $terminate = Symbol('thread.terminate')\nexport const $transferable = Symbol('thread.transferable')\nexport const $worker = Symbol('thread.worker')\n","/* eslint-disable import-x/no-internal-modules */\nimport type { Observable } from 'observable-fns'\n\nimport {\n $errors, $events, $terminate,\n} from '../symbols.ts'\nimport type { Thread as ThreadType, WorkerEvent } from '../types/master.ts'\n\nfunction fail(message: string): never {\n throw new Error(message)\n}\n\nexport type Thread = ThreadType\n\n/** Thread utility functions. Use them to manage or inspect a `spawn()`-ed thread. */\nexport const Thread = {\n /** Return an observable that can be used to subscribe to all errors happening in the thread. */\n errors<ThreadT extends ThreadType>(thread: ThreadT): Observable<Error> {\n return thread[$errors] || fail('Error observable not found. Make sure to pass a thread instance as returned by the spawn() promise.')\n },\n /** Return an observable that can be used to subscribe to internal events happening in the thread. Useful for debugging. */\n events<ThreadT extends ThreadType>(thread: ThreadT): Observable<WorkerEvent> {\n return thread[$events] || fail('Events observable not found. Make sure to pass a thread instance as returned by the spawn() promise.')\n },\n /** Terminate a thread. Remember to terminate every thread when you are done using it. */\n terminate<ThreadT extends ThreadType>(thread: ThreadT) {\n return thread[$terminate]()\n },\n}\n"],"mappings":"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","names":["_createClass","defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","Constructor","protoProps","staticProps","prototype","_classCallCheck","instance","TypeError","path","require","fork","worker","join","__dirname","events","defaultPorts","inspect","debug","range","min","max","Worker","arg","_this","args","arguments","undefined","options","cwd","process","isfn","input","toString","debugVars","execArgv","filter","execArg","test","noDebugRedirection","Array","from","inspectIndex","findIndex","debugArg","debugIndex","portIndex","match","exec","port","parseInt","Math","floor","random","concat","child","onerror","onmessage","on","e","call","msg","message","JSON","parse","error","Error","stack","send","esm","value","addEventListener","event","fn","postMessage","stringify","data","terminate","kill","setRange","module","exports","DebugLogger","multicast","Observable","Subject","EventEmitter","cpus","path","cwd","Worker","NativeWorker","defaultPoolSize","cpus","length","resolveScriptPath","scriptPath","baseURL","makeAbsolute","filePath","path","isAbsolute","join","cwd","absolutePath","initWorkerThreadsWorker","allWorkers","Worker","NativeWorker","mappedEventListeners","options","resolvedScriptPath","fromSource","_baseURL","sourceCode","eval","WeakMap","push","addEventListener","eventName","rawListener","listener","message","data","set","on","removeEventListener","get","off","terminateWorkersAndMaster","Promise","all","map","worker","terminate","then","process","exit","BlobWorker","blob","Buffer","from","toString","fromText","source","default","initTinyWorker","TinyWorker","require","emitter","platform","replaceAll","esm","Function","EventEmitter","onerror","error","emit","onmessage","addListener","removeListener","filter","implementation","isTinyWorker","selectWorkerImplementation","ex","console","debug","getWorkerImplementation","isWorkerRuntime","globalThis","undefined","self","isMainThread","__non_webpack_require__","PoolEventType","$errors","Symbol","$events","$terminate","$transferable","$worker","fail","message","Error","Thread","errors","thread","$errors","events","$events","terminate","$terminate","nextPoolID","createArray","size","array","index","push","delay","ms","Promise","resolve","setTimeout","flatMap","mapper","reduce","flattened","element","slugify","text","replaceAll","trim","spawnWorkers","spawnWorker","count","map","init","runningTasks","WorkerPool","EventType","PoolEventType","debug","eventObservable","options","workers","eventSubject","Subject","initErrors","isClosing","nextTaskID","taskQueue","optionsOrSize","defaultPoolSize","DebugLogger","name","String","multicast","Observable","from","all","worker","then","next","length","type","initialized","error","findIdlingWorker","concurrency","find","runPoolTask","task","workerID","indexOf","id","taskID","taskStart","returnValue","run","taskCompleted","ex","taskFailed","runPromise","removeTaskFromWorkersRunningTasks","filter","someRunPromise","scheduleWork","availableWorker","nextTask","shift","taskQueueDrained","taskCompletion","reject","eventSubscription","events","subscribe","event","unsubscribe","terminated","Error","settled","allowResolvingImmediately","getCurrentlyRunningTasks","taskFailures","failureSubscription","allSettled","subscription","completed","settlementPromise","earlyExitPromise","errors","race","queue","taskFunction","maxQueuedJobs","Number","POSITIVE_INFINITY","catch","cancel","includes","someTask","taskCanceled","bind","taskQueued","terminate","force","remainingQueue","complete","Thread","PoolConstructor","Pool"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../node_modules/.store/tiny-worker-npm-2.3.0-38c7100e1d/package/lib/index.js","../../../src/master/pool-node.ts","../../../src/master/implementation.node.ts","../../../src/master/pool-types.ts","../../../src/symbols.ts","../../../src/master/thread.ts"],"sourcesContent":["\"use strict\";\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar path = require(\"path\"),\n fork = require(\"child_process\").fork,\n worker = path.join(__dirname, \"worker.js\"),\n events = /^(error|message)$/,\n defaultPorts = { inspect: 9229, debug: 5858 };\nvar range = { min: 1, max: 300 };\n\nvar Worker = function () {\n\tfunction Worker(arg) {\n\t\tvar _this = this;\n\n\t\tvar args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n\t\tvar options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : { cwd: process.cwd() };\n\n\t\t_classCallCheck(this, Worker);\n\n\t\tvar isfn = typeof arg === \"function\",\n\t\t input = isfn ? arg.toString() : arg;\n\n\t\tif (!options.cwd) {\n\t\t\toptions.cwd = process.cwd();\n\t\t}\n\n\t\t//get all debug related parameters\n\t\tvar debugVars = process.execArgv.filter(function (execArg) {\n\t\t\treturn (/(debug|inspect)/.test(execArg)\n\t\t\t);\n\t\t});\n\t\tif (debugVars.length > 0 && !options.noDebugRedirection) {\n\t\t\tif (!options.execArgv) {\n\t\t\t\t//if no execArgs are given copy all arguments\n\t\t\t\tdebugVars = Array.from(process.execArgv);\n\t\t\t\toptions.execArgv = [];\n\t\t\t}\n\n\t\t\tvar inspectIndex = debugVars.findIndex(function (debugArg) {\n\t\t\t\t//get index of inspect parameter\n\t\t\t\treturn (/^--inspect(-brk)?(=\\d+)?$/.test(debugArg)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tvar debugIndex = debugVars.findIndex(function (debugArg) {\n\t\t\t\t//get index of debug parameter\n\t\t\t\treturn (/^--debug(-brk)?(=\\d+)?$/.test(debugArg)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tvar portIndex = inspectIndex >= 0 ? inspectIndex : debugIndex; //get index of port, inspect has higher priority\n\n\t\t\tif (portIndex >= 0) {\n\t\t\t\tvar match = /^--(debug|inspect)(?:-brk)?(?:=(\\d+))?$/.exec(debugVars[portIndex]); //get port\n\t\t\t\tvar port = defaultPorts[match[1]];\n\t\t\t\tif (match[2]) {\n\t\t\t\t\tport = parseInt(match[2]);\n\t\t\t\t}\n\t\t\t\tdebugVars[portIndex] = \"--\" + match[1] + \"=\" + (port + range.min + Math.floor(Math.random() * (range.max - range.min))); //new parameter\n\n\t\t\t\tif (debugIndex >= 0 && debugIndex !== portIndex) {\n\t\t\t\t\t//remove \"-brk\" from debug if there\n\t\t\t\t\tmatch = /^(--debug)(?:-brk)?(.*)/.exec(debugVars[debugIndex]);\n\t\t\t\t\tdebugVars[debugIndex] = match[1] + (match[2] ? match[2] : \"\");\n\t\t\t\t}\n\t\t\t}\n\t\t\toptions.execArgv = options.execArgv.concat(debugVars);\n\t\t}\n\n\t\tdelete options.noDebugRedirection;\n\n\t\tthis.child = fork(worker, args, options);\n\t\tthis.onerror = undefined;\n\t\tthis.onmessage = undefined;\n\n\t\tthis.child.on(\"error\", function (e) {\n\t\t\tif (_this.onerror) {\n\t\t\t\t_this.onerror.call(_this, e);\n\t\t\t}\n\t\t});\n\n\t\tthis.child.on(\"message\", function (msg) {\n\t\t\tvar message = JSON.parse(msg);\n\t\t\tvar error = void 0;\n\n\t\t\tif (!message.error && _this.onmessage) {\n\t\t\t\t_this.onmessage.call(_this, message);\n\t\t\t}\n\n\t\t\tif (message.error && _this.onerror) {\n\t\t\t\terror = new Error(message.error);\n\t\t\t\terror.stack = message.stack;\n\n\t\t\t\t_this.onerror.call(_this, error);\n\t\t\t}\n\t\t});\n\n\t\tthis.child.send({ input: input, isfn: isfn, cwd: options.cwd, esm: options.esm });\n\t}\n\n\t_createClass(Worker, [{\n\t\tkey: \"addEventListener\",\n\t\tvalue: function addEventListener(event, fn) {\n\t\t\tif (events.test(event)) {\n\t\t\t\tthis[\"on\" + event] = fn;\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: \"postMessage\",\n\t\tvalue: function postMessage(msg) {\n\t\t\tthis.child.send(JSON.stringify({ data: msg }, null, 0));\n\t\t}\n\t}, {\n\t\tkey: \"terminate\",\n\t\tvalue: function terminate() {\n\t\t\tthis.child.kill(\"SIGINT\");\n\t\t}\n\t}], [{\n\t\tkey: \"setRange\",\n\t\tvalue: function setRange(min, max) {\n\t\t\tif (min >= max) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\trange.min = min;\n\t\t\trange.max = max;\n\n\t\t\treturn true;\n\t\t}\n\t}]);\n\n\treturn Worker;\n}();\n\nmodule.exports = Worker;\n","/* eslint-disable import-x/export */\n/* eslint-disable unicorn/no-thenable */\n\n/* eslint-disable @typescript-eslint/member-ordering */\n/* eslint-disable unicorn/no-array-reduce */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-namespace */\n\n/// <reference lib=\"esnext\" />\n\nimport DebugLogger from 'debug'\nimport {\n multicast, Observable, Subject,\n} from 'observable-fns'\n\nimport { defaultPoolSize } from './implementation.node.ts'\nimport type {\n PoolEvent, QueuedTask, TaskRunFunction, WorkerDescriptor,\n} from './pool-types.ts'\nimport { PoolEventType } from './pool-types.ts'\nimport { Thread } from './thread.ts'\n\nexport declare namespace Pool {\n type Event<ThreadType extends Thread = any> = PoolEvent<ThreadType>\n type EventType = PoolEventType\n}\n\nlet nextPoolID = 1\n\nfunction createArray(size: number): number[] {\n const array: number[] = []\n for (let index = 0; index < size; index++) {\n array.push(index)\n }\n return array\n}\n\nfunction delay(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n\nfunction flatMap<In, Out>(array: In[], mapper: (element: In) => Out[]): Out[] {\n return array.reduce<Out[]>((flattened, element) => [...flattened, ...mapper(element)], [])\n}\n\nfunction slugify(text: string) {\n return text.replaceAll(/\\W/g, ' ').trim().replaceAll(/\\s+/g, '-')\n}\n\nfunction spawnWorkers<ThreadType extends Thread>(spawnWorker: () => Promise<ThreadType>, count: number): Array<WorkerDescriptor<ThreadType>> {\n return createArray(count).map(\n (): WorkerDescriptor<ThreadType> => ({\n init: spawnWorker(),\n runningTasks: [],\n }),\n )\n}\n\n/**\n * Thread pool managing a set of worker threads.\n * Use it to queue tasks that are run on those threads with limited\n * concurrency.\n */\nexport interface Pool<ThreadType extends Thread> {\n /**\n * Returns a promise that resolves once the task queue is emptied.\n * Promise will be rejected if any task fails.\n *\n * @param allowResolvingImmediately Set to `true` to resolve immediately if task queue is currently empty.\n */\n completed(allowResolvingImmediately?: boolean): Promise<any>\n\n /**\n * Returns a promise that resolves once the task queue is emptied.\n * Failing tasks will not cause the promise to be rejected.\n *\n * @param allowResolvingImmediately Set to `true` to resolve immediately if task queue is currently empty.\n */\n settled(allowResolvingImmediately?: boolean): Promise<Error[]>\n\n /**\n * Returns an observable that yields pool events.\n */\n events(): Observable<PoolEvent<ThreadType>>\n\n /**\n * Queue a task and return a promise that resolves once the task has been dequeued,\n * started and finished.\n *\n * @param task An async function that takes a thread instance and invokes it.\n */\n queue<Return>(task: TaskRunFunction<ThreadType, Return>): QueuedTask<ThreadType, Return>\n\n /**\n * Terminate all pool threads.\n *\n * @param force Set to `true` to kill the thread even if it cannot be stopped gracefully.\n */\n terminate(force?: boolean): Promise<void>\n}\n\ninterface PoolOptions {\n /** Maximum no. of tasks to run on one worker thread at a time. Defaults to one. */\n concurrency?: number\n\n /** Maximum no. of jobs to be queued for execution before throwing an error. */\n maxQueuedJobs?: number\n\n /** Gives that pool a name to be used for debug logging, letting you distinguish between log output of different pools. */\n name?: string\n\n /** No. of worker threads to spawn and to be managed by the pool. */\n size?: number\n}\n\nclass WorkerPool<ThreadType extends Thread> implements Pool<ThreadType> {\n static EventType = PoolEventType\n\n private readonly debug: DebugLogger.Debugger\n private readonly eventObservable: Observable<PoolEvent<ThreadType>>\n private readonly options: PoolOptions\n private readonly workers: Array<WorkerDescriptor<ThreadType>>\n\n private readonly eventSubject = new Subject<PoolEvent<ThreadType>>()\n private initErrors: Error[] = []\n private isClosing = false\n private nextTaskID = 1\n private taskQueue: Array<QueuedTask<ThreadType, any>> = []\n\n constructor(spawnWorker: () => Promise<ThreadType>, optionsOrSize?: number | PoolOptions) {\n const options: PoolOptions = typeof optionsOrSize === 'number' ? { size: optionsOrSize } : optionsOrSize || {}\n\n const { size = defaultPoolSize } = options\n\n this.debug = DebugLogger(`threads:pool:${slugify(options.name || String(nextPoolID++))}`)\n this.options = options\n this.workers = spawnWorkers(spawnWorker, size)\n\n this.eventObservable = multicast(Observable.from(this.eventSubject))\n\n Promise.all(this.workers.map(worker => worker.init)).then(\n () =>\n this.eventSubject.next({\n size: this.workers.length,\n type: PoolEventType.initialized,\n }),\n (error) => {\n this.debug('Error while initializing pool worker:', error)\n this.eventSubject.error(error)\n this.initErrors.push(error)\n },\n )\n }\n\n private findIdlingWorker(): WorkerDescriptor<ThreadType> | undefined {\n const { concurrency = 1 } = this.options\n return this.workers.find(worker => worker.runningTasks.length < concurrency)\n }\n\n private async runPoolTask(worker: WorkerDescriptor<ThreadType>, task: QueuedTask<ThreadType, any>) {\n const workerID = this.workers.indexOf(worker) + 1\n\n this.debug(`Running task #${task.id} on worker #${workerID}...`)\n this.eventSubject.next({\n taskID: task.id,\n type: PoolEventType.taskStart,\n workerID,\n })\n\n try {\n const returnValue = await task.run(await worker.init)\n\n this.debug(`Task #${task.id} completed successfully`)\n this.eventSubject.next({\n returnValue,\n taskID: task.id,\n type: PoolEventType.taskCompleted,\n workerID,\n })\n } catch (ex) {\n const error = ex as Error\n this.debug(`Task #${task.id} failed`)\n this.eventSubject.next({\n error,\n taskID: task.id,\n type: PoolEventType.taskFailed,\n workerID,\n })\n }\n }\n\n private run(worker: WorkerDescriptor<ThreadType>, task: QueuedTask<ThreadType, any>) {\n const runPromise = (async () => {\n const removeTaskFromWorkersRunningTasks = () => {\n worker.runningTasks = worker.runningTasks.filter(someRunPromise => someRunPromise !== runPromise)\n }\n\n // Defer task execution by one tick to give handlers time to subscribe\n await delay(0)\n\n try {\n await this.runPoolTask(worker, task)\n } finally {\n removeTaskFromWorkersRunningTasks()\n\n if (!this.isClosing) {\n this.scheduleWork()\n }\n }\n })()\n\n worker.runningTasks.push(runPromise)\n }\n\n private scheduleWork() {\n this.debug('Attempt de-queueing a task in order to run it...')\n\n const availableWorker = this.findIdlingWorker()\n if (!availableWorker) return\n\n const nextTask = this.taskQueue.shift()\n if (!nextTask) {\n this.debug('Task queue is empty')\n this.eventSubject.next({ type: PoolEventType.taskQueueDrained })\n return\n }\n\n this.run(availableWorker, nextTask)\n }\n\n private taskCompletion(taskID: number) {\n return new Promise<any>((resolve, reject) => {\n const eventSubscription = this.events().subscribe((event) => {\n if (event.type === PoolEventType.taskCompleted && event.taskID === taskID) {\n eventSubscription.unsubscribe()\n resolve(event.returnValue)\n } else if (event.type === PoolEventType.taskFailed && event.taskID === taskID) {\n eventSubscription.unsubscribe()\n reject(event.error)\n } else if (event.type === PoolEventType.terminated) {\n eventSubscription.unsubscribe()\n reject(new Error('Pool has been terminated before task was run.'))\n }\n })\n })\n }\n\n async settled(allowResolvingImmediately: boolean = false): Promise<Error[]> {\n const getCurrentlyRunningTasks = () => flatMap(this.workers, worker => worker.runningTasks)\n\n const taskFailures: Error[] = []\n\n const failureSubscription = this.eventObservable.subscribe((event) => {\n if (event.type === PoolEventType.taskFailed) {\n taskFailures.push(event.error)\n }\n })\n\n if (this.initErrors.length > 0) {\n throw this.initErrors[0]\n }\n if (allowResolvingImmediately && this.taskQueue.length === 0) {\n await Promise.allSettled(getCurrentlyRunningTasks())\n return taskFailures\n }\n\n await new Promise<void>((resolve, reject) => {\n const subscription = this.eventObservable.subscribe({\n error: reject,\n next(event) {\n if (event.type === PoolEventType.taskQueueDrained) {\n subscription.unsubscribe()\n resolve(void 0)\n }\n }, // make a pool-wide error reject the completed() result promise\n })\n })\n\n await Promise.allSettled(getCurrentlyRunningTasks())\n failureSubscription.unsubscribe()\n\n return taskFailures\n }\n\n async completed(allowResolvingImmediately: boolean = false) {\n const settlementPromise = this.settled(allowResolvingImmediately)\n\n const earlyExitPromise = new Promise<Error[]>((resolve, reject) => {\n const subscription = this.eventObservable.subscribe({\n error: reject,\n next(event) {\n if (event.type === PoolEventType.taskQueueDrained) {\n subscription.unsubscribe()\n resolve(settlementPromise)\n } else if (event.type === PoolEventType.taskFailed) {\n subscription.unsubscribe()\n reject(event.error)\n }\n }, // make a pool-wide error reject the completed() result promise\n })\n })\n\n const errors = await Promise.race([settlementPromise, earlyExitPromise])\n\n if (errors.length > 0) {\n throw errors[0]\n }\n }\n\n events() {\n return this.eventObservable\n }\n\n queue(taskFunction: TaskRunFunction<ThreadType, any>) {\n const { maxQueuedJobs = Number.POSITIVE_INFINITY } = this.options\n\n if (this.isClosing) {\n throw new Error('Cannot schedule pool tasks after terminate() has been called.')\n }\n if (this.initErrors.length > 0) {\n throw this.initErrors[0]\n }\n\n const taskID = this.nextTaskID++\n const taskCompletion = this.taskCompletion(taskID)\n\n taskCompletion.catch((error) => {\n // Prevent unhandled rejections here as we assume the user will use\n // `pool.completed()`, `pool.settled()` or `task.catch()` to handle errors\n this.debug(`Task #${taskID} errored:`, error)\n })\n\n const task: QueuedTask<ThreadType, any> = {\n cancel: () => {\n if (!this.taskQueue.includes(task)) return\n this.taskQueue = this.taskQueue.filter(someTask => someTask !== task)\n this.eventSubject.next({\n taskID: task.id,\n type: PoolEventType.taskCanceled,\n })\n },\n id: taskID,\n run: taskFunction,\n then: taskCompletion.then.bind(taskCompletion),\n }\n\n if (this.taskQueue.length >= maxQueuedJobs) {\n throw new Error(\n 'Maximum number of pool tasks queued. Refusing to queue another one.\\n'\n + 'This usually happens for one of two reasons: We are either at peak '\n + \"workload right now or some tasks just won't finish, thus blocking the pool.\",\n )\n }\n\n this.debug(`Queueing task #${task.id}...`)\n this.taskQueue.push(task)\n\n this.eventSubject.next({\n taskID: task.id,\n type: PoolEventType.taskQueued,\n })\n\n this.scheduleWork()\n return task\n }\n\n async terminate(force?: boolean) {\n this.isClosing = true\n if (!force) {\n await this.completed(true)\n }\n this.eventSubject.next({\n remainingQueue: [...this.taskQueue],\n type: PoolEventType.terminated,\n })\n this.eventSubject.complete()\n await Promise.all(this.workers.map(async worker => Thread.terminate(await worker.init)))\n }\n}\n\n/**\n * Thread pool constructor. Creates a new pool and spawns its worker threads.\n */\nfunction PoolConstructor<ThreadType extends Thread>(spawnWorker: () => Promise<ThreadType>, optionsOrSize?: number | PoolOptions) {\n // The function exists only so we don't need to use `new` to create a pool (we still can, though).\n // If the Pool is a class or not is an implementation detail that should not concern the user.\n return new WorkerPool(spawnWorker, optionsOrSize)\n}\n\n;(PoolConstructor as any).EventType = PoolEventType\n\n/**\n * Thread pool constructor. Creates a new pool and spawns its worker threads.\n */\nexport const Pool = PoolConstructor as typeof PoolConstructor & { EventType: typeof PoolEventType }\n\nexport type { PoolEvent, QueuedTask } from './pool-types.ts'\nexport { PoolEventType } from './pool-types.ts'\nexport { Thread } from './thread.ts'\n","/* eslint-disable @typescript-eslint/no-require-imports */\n\n/* eslint-disable unicorn/prefer-add-event-listener */\n/* eslint-disable unicorn/prefer-event-target */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable unicorn/text-encoding-identifier-case */\n\nimport { EventEmitter } from 'node:events'\nimport { cpus } from 'node:os'\nimport path from 'node:path'\nimport { cwd } from 'node:process'\nimport { Worker as NativeWorker } from 'node:worker_threads'\n\nimport type {\n ImplementationExport, ThreadsWorkerOptions, WorkerImplementation,\n// eslint-disable-next-line import-x/no-internal-modules\n} from '../types/master.ts'\n\ndeclare const __non_webpack_require__: typeof require\n\ntype WorkerEventName = 'error' | 'message'\n\nexport const defaultPoolSize = cpus().length\n\nfunction resolveScriptPath(scriptPath: string, baseURL?: string | undefined) {\n const makeAbsolute = (filePath: string) => {\n return path.isAbsolute(filePath) ? filePath : path.join(baseURL ?? cwd(), filePath)\n }\n\n const absolutePath = makeAbsolute(scriptPath)\n return absolutePath\n}\n\nfunction initWorkerThreadsWorker(): ImplementationExport {\n let allWorkers: Array<NativeWorker> = []\n\n class Worker extends NativeWorker {\n private mappedEventListeners: WeakMap<EventListener, EventListener>\n\n constructor(scriptPath: string, options?: ThreadsWorkerOptions & { fromSource: boolean }) {\n const resolvedScriptPath = options && options.fromSource ? null : resolveScriptPath(scriptPath, (options ?? {})._baseURL)\n if (resolvedScriptPath) {\n super(resolvedScriptPath, options)\n } else {\n // `options.fromSource` is true\n const sourceCode = scriptPath\n super(sourceCode, { ...options, eval: true })\n }\n\n this.mappedEventListeners = new WeakMap()\n allWorkers.push(this)\n }\n\n addEventListener(eventName: string, rawListener: EventListener) {\n const listener = (message: any) => {\n rawListener({ data: message } as any)\n }\n this.mappedEventListeners.set(rawListener, listener)\n this.on(eventName, listener)\n }\n\n removeEventListener(eventName: string, rawListener: EventListener) {\n const listener = this.mappedEventListeners.get(rawListener) || rawListener\n this.off(eventName, listener)\n }\n }\n\n const terminateWorkersAndMaster = () => {\n // we should terminate all workers and then gracefully shutdown self process\n Promise.all(allWorkers.map(worker => worker.terminate())).then(\n () => process.exit(0),\n () => process.exit(1),\n )\n allWorkers = []\n }\n\n // Take care to not leave orphaned processes behind. See #147.\n process.on('SIGINT', () => terminateWorkersAndMaster())\n process.on('SIGTERM', () => terminateWorkersAndMaster())\n\n class BlobWorker extends Worker {\n constructor(blob: Uint8Array, options?: ThreadsWorkerOptions) {\n super(Buffer.from(blob).toString('utf-8'), { ...options, fromSource: true })\n }\n\n static fromText(source: string, options?: ThreadsWorkerOptions): WorkerImplementation {\n return new Worker(source, { ...options, fromSource: true }) as any\n }\n }\n\n return {\n blob: BlobWorker as any,\n default: Worker as any,\n }\n}\n\nfunction initTinyWorker(): ImplementationExport {\n const TinyWorker = require('tiny-worker')\n\n let allWorkers: Array<typeof TinyWorker> = []\n\n class Worker extends TinyWorker {\n private emitter: EventEmitter\n\n constructor(scriptPath: string, options?: ThreadsWorkerOptions & { fromSource?: boolean }) {\n // Need to apply a work-around for Windows or it will choke upon the absolute path\n // (`Error [ERR_INVALID_PROTOCOL]: Protocol 'c:' not supported`)\n const resolvedScriptPath\n = options && options.fromSource\n ? null\n : process.platform === 'win32'\n ? `file:///${resolveScriptPath(scriptPath).replaceAll('\\\\', '/')}`\n : resolveScriptPath(scriptPath)\n\n if (resolvedScriptPath) {\n super(resolvedScriptPath, [], { esm: true })\n } else {\n // `options.fromSource` is true\n const sourceCode = scriptPath\n super(new Function(sourceCode), [], { esm: true })\n }\n\n allWorkers.push(this)\n\n this.emitter = new EventEmitter()\n this.onerror = (error: Error) => this.emitter.emit('error', error)\n this.onmessage = (message: MessageEvent) => this.emitter.emit('message', message)\n }\n\n addEventListener(eventName: WorkerEventName, listener: EventListener) {\n this.emitter.addListener(eventName, listener)\n }\n\n removeEventListener(eventName: WorkerEventName, listener: EventListener) {\n this.emitter.removeListener(eventName, listener)\n }\n\n terminate() {\n allWorkers = allWorkers.filter(worker => worker !== this)\n return super.terminate()\n }\n }\n\n const terminateWorkersAndMaster = () => {\n // we should terminate all workers and then gracefully shutdown self process\n Promise.all(allWorkers.map(worker => worker.terminate())).then(\n () => process.exit(0),\n () => process.exit(1),\n )\n allWorkers = []\n }\n\n // Take care to not leave orphaned processes behind\n // See <https://github.com/avoidwork/tiny-worker#faq>\n process.on('SIGINT', () => terminateWorkersAndMaster())\n process.on('SIGTERM', () => terminateWorkersAndMaster())\n\n class BlobWorker extends Worker {\n constructor(blob: Uint8Array, options?: ThreadsWorkerOptions) {\n super(Buffer.from(blob).toString('utf-8'), { ...options, fromSource: true })\n }\n\n static fromText(source: string, options?: ThreadsWorkerOptions): WorkerImplementation {\n return new Worker(source, { ...options, fromSource: true }) as any\n }\n }\n\n return {\n blob: BlobWorker as any,\n default: Worker as any,\n }\n}\n\nlet implementation: ImplementationExport\nlet isTinyWorker: boolean\n\nfunction selectWorkerImplementation(): ImplementationExport {\n try {\n isTinyWorker = false\n return initWorkerThreadsWorker()\n } catch (ex) {\n console.error(ex)\n // tslint:disable-next-line no-console\n console.debug('Node worker_threads not available. Trying to fall back to tiny-worker polyfill...')\n isTinyWorker = true\n return initTinyWorker()\n }\n}\n\nexport function getWorkerImplementation(): ImplementationExport {\n if (!implementation) {\n implementation = selectWorkerImplementation()\n }\n return implementation\n}\n\nexport function isWorkerRuntime() {\n if (isTinyWorker) {\n return globalThis !== undefined && self['postMessage'] ? true : false\n } else {\n // Webpack hack\n const isMainThread\n = typeof __non_webpack_require__ === 'function'\n ? __non_webpack_require__('worker_threads').isMainThread\n : eval('require')('worker_threads').isMainThread\n return !isMainThread\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/member-ordering */\nimport type { Thread } from './thread.ts'\n\n/** Pool event type. Specifies the type of each `PoolEvent`. */\nexport enum PoolEventType {\n initialized = 'initialized',\n taskCanceled = 'taskCanceled',\n taskCompleted = 'taskCompleted',\n taskFailed = 'taskFailed',\n taskQueued = 'taskQueued',\n taskQueueDrained = 'taskQueueDrained',\n taskStart = 'taskStart',\n terminated = 'terminated',\n}\n\nexport type TaskRunFunction<ThreadType extends Thread, Return> = (worker: ThreadType) => Promise<Return>\n\n/** Pool event. Subscribe to those events using `pool.events()`. Useful for debugging. */\nexport type PoolEvent<ThreadType extends Thread> =\n | {\n type: PoolEventType.initialized\n size: number\n }\n | {\n type: PoolEventType.taskQueued\n taskID: number\n }\n | {\n type: PoolEventType.taskQueueDrained\n }\n | {\n type: PoolEventType.taskStart\n taskID: number\n workerID: number\n }\n | {\n type: PoolEventType.taskCompleted\n returnValue: any\n taskID: number\n workerID: number\n }\n | {\n type: PoolEventType.taskFailed\n error: Error\n taskID: number\n workerID: number\n }\n | {\n type: PoolEventType.taskCanceled\n taskID: number\n }\n | {\n type: PoolEventType.terminated\n remainingQueue: Array<QueuedTask<ThreadType, any>>\n }\n\nexport interface WorkerDescriptor<ThreadType extends Thread> {\n init: Promise<ThreadType>\n runningTasks: Array<Promise<any>>\n}\n\n/**\n * Task that has been `pool.queued()`-ed.\n */\nexport interface QueuedTask<ThreadType extends Thread, Return> {\n /** @private */\n id: number\n\n /** @private */\n run: TaskRunFunction<ThreadType, Return>\n\n /**\n * Queued tasks can be cancelled until the pool starts running them on a worker thread.\n */\n cancel(): void\n\n /**\n * `QueuedTask` is thenable, so you can `await` it.\n * Resolves when the task has successfully been executed. Rejects if the task fails.\n */\n then: Promise<Return>['then']\n}\n","export const $errors = Symbol('thread.errors')\nexport const $events = Symbol('thread.events')\nexport const $terminate = Symbol('thread.terminate')\nexport const $transferable = Symbol('thread.transferable')\nexport const $worker = Symbol('thread.worker')\n","/* eslint-disable import-x/no-internal-modules */\nimport type { Observable } from 'observable-fns'\n\nimport {\n $errors, $events, $terminate,\n} from '../symbols.ts'\nimport type { Thread as ThreadType, WorkerEvent } from '../types/master.ts'\n\nfunction fail(message: string): never {\n throw new Error(message)\n}\n\nexport type Thread = ThreadType\n\n/** Thread utility functions. Use them to manage or inspect a `spawn()`-ed thread. */\nexport const Thread = {\n /** Return an observable that can be used to subscribe to all errors happening in the thread. */\n errors<ThreadT extends ThreadType>(thread: ThreadT): Observable<Error> {\n return thread[$errors] || fail('Error observable not found. Make sure to pass a thread instance as returned by the spawn() promise.')\n },\n /** Return an observable that can be used to subscribe to internal events happening in the thread. Useful for debugging. */\n events<ThreadT extends ThreadType>(thread: ThreadT): Observable<WorkerEvent> {\n return thread[$events] || fail('Events observable not found. Make sure to pass a thread instance as returned by the spawn() promise.')\n },\n /** Terminate a thread. Remember to terminate every thread when you are done using it. */\n terminate<ThreadT extends ThreadType>(thread: ThreadT) {\n return thread[$terminate]()\n },\n}\n"],"mappings":"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","names":["path","Worker","PoolEventType"]}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
-
|
|
4
1
|
// src/worker/worker.node.ts
|
|
5
2
|
import { parentPort as optionalParentPort } from "worker_threads";
|
|
6
3
|
import { assertEx } from "@xylabs/assert";
|
|
@@ -21,7 +18,6 @@ function extendSerializer(extend, implementation) {
|
|
|
21
18
|
}
|
|
22
19
|
};
|
|
23
20
|
}
|
|
24
|
-
__name(extendSerializer, "extendSerializer");
|
|
25
21
|
var DefaultErrorSerializer = {
|
|
26
22
|
deserialize(message) {
|
|
27
23
|
return Object.assign(new Error(message.message), {
|
|
@@ -38,7 +34,7 @@ var DefaultErrorSerializer = {
|
|
|
38
34
|
};
|
|
39
35
|
}
|
|
40
36
|
};
|
|
41
|
-
var isSerializedError =
|
|
37
|
+
var isSerializedError = (thing) => thing && typeof thing === "object" && "__error_marker" in thing && thing.__error_marker === "$$error";
|
|
42
38
|
var DefaultSerializer = {
|
|
43
39
|
deserialize(message) {
|
|
44
40
|
return isSerializedError(message) ? DefaultErrorSerializer.deserialize(message) : message;
|
|
@@ -53,15 +49,12 @@ globalThis.registeredSerializer = globalThis.registeredSerializer ?? DefaultSeri
|
|
|
53
49
|
function registerSerializer(serializer) {
|
|
54
50
|
globalThis.registeredSerializer = extendSerializer(globalThis.registeredSerializer, serializer);
|
|
55
51
|
}
|
|
56
|
-
__name(registerSerializer, "registerSerializer");
|
|
57
52
|
function deserialize(message) {
|
|
58
53
|
return globalThis.registeredSerializer.deserialize(message);
|
|
59
54
|
}
|
|
60
|
-
__name(deserialize, "deserialize");
|
|
61
55
|
function serialize(input) {
|
|
62
56
|
return globalThis.registeredSerializer.serialize(input);
|
|
63
57
|
}
|
|
64
|
-
__name(serialize, "serialize");
|
|
65
58
|
|
|
66
59
|
// src/symbols.ts
|
|
67
60
|
var $errors = Symbol("thread.errors");
|
|
@@ -75,18 +68,14 @@ function isTransferable(thing) {
|
|
|
75
68
|
if (!thing || typeof thing !== "object") return false;
|
|
76
69
|
return true;
|
|
77
70
|
}
|
|
78
|
-
__name(isTransferable, "isTransferable");
|
|
79
71
|
function isTransferDescriptor(thing) {
|
|
80
72
|
return thing && typeof thing === "object" && thing[$transferable];
|
|
81
73
|
}
|
|
82
|
-
__name(isTransferDescriptor, "isTransferDescriptor");
|
|
83
74
|
function Transfer(payload, transferables) {
|
|
84
75
|
console.log("Transfer");
|
|
85
76
|
if (!transferables) {
|
|
86
77
|
if (!isTransferable(payload)) throw new Error("Not transferable");
|
|
87
|
-
transferables = [
|
|
88
|
-
payload
|
|
89
|
-
];
|
|
78
|
+
transferables = [payload];
|
|
90
79
|
}
|
|
91
80
|
return {
|
|
92
81
|
[$transferable]: true,
|
|
@@ -94,108 +83,81 @@ function Transfer(payload, transferables) {
|
|
|
94
83
|
transferables
|
|
95
84
|
};
|
|
96
85
|
}
|
|
97
|
-
__name(Transfer, "Transfer");
|
|
98
|
-
|
|
99
|
-
// src/types/messages.ts
|
|
100
|
-
var MasterMessageType = /* @__PURE__ */ function(MasterMessageType2) {
|
|
101
|
-
MasterMessageType2["cancel"] = "cancel";
|
|
102
|
-
MasterMessageType2["run"] = "run";
|
|
103
|
-
return MasterMessageType2;
|
|
104
|
-
}({});
|
|
105
|
-
var WorkerMessageType = /* @__PURE__ */ function(WorkerMessageType2) {
|
|
106
|
-
WorkerMessageType2["error"] = "error";
|
|
107
|
-
WorkerMessageType2["init"] = "init";
|
|
108
|
-
WorkerMessageType2["result"] = "result";
|
|
109
|
-
WorkerMessageType2["running"] = "running";
|
|
110
|
-
WorkerMessageType2["uncaughtError"] = "uncaughtError";
|
|
111
|
-
return WorkerMessageType2;
|
|
112
|
-
}({});
|
|
113
86
|
|
|
114
87
|
// src/worker/expose.ts
|
|
115
|
-
var isErrorEvent =
|
|
88
|
+
var isErrorEvent = (value) => value && value.error;
|
|
116
89
|
function createExpose(implementation, self) {
|
|
117
90
|
let exposeCalled = false;
|
|
118
91
|
const activeSubscriptions = /* @__PURE__ */ new Map();
|
|
119
|
-
const isMasterJobCancelMessage =
|
|
120
|
-
const isMasterJobRunMessage =
|
|
121
|
-
const isObservable =
|
|
92
|
+
const isMasterJobCancelMessage = (thing) => thing && thing.type === "cancel" /* cancel */;
|
|
93
|
+
const isMasterJobRunMessage = (thing) => thing && thing.type === "run" /* run */;
|
|
94
|
+
const isObservable = (thing) => isSomeObservable(thing) || isZenObservable(thing);
|
|
122
95
|
function isZenObservable(thing) {
|
|
123
96
|
return thing && typeof thing === "object" && typeof thing.subscribe === "function";
|
|
124
97
|
}
|
|
125
|
-
__name(isZenObservable, "isZenObservable");
|
|
126
98
|
function deconstructTransfer(thing) {
|
|
127
|
-
return isTransferDescriptor(thing) ? {
|
|
128
|
-
payload: thing.send,
|
|
129
|
-
transferables: thing.transferables
|
|
130
|
-
} : {
|
|
131
|
-
payload: thing,
|
|
132
|
-
transferables: void 0
|
|
133
|
-
};
|
|
99
|
+
return isTransferDescriptor(thing) ? { payload: thing.send, transferables: thing.transferables } : { payload: thing, transferables: void 0 };
|
|
134
100
|
}
|
|
135
|
-
__name(deconstructTransfer, "deconstructTransfer");
|
|
136
101
|
function postFunctionInitMessage() {
|
|
137
102
|
const initMessage = {
|
|
138
|
-
exposed: {
|
|
139
|
-
|
|
140
|
-
},
|
|
141
|
-
type: WorkerMessageType.init
|
|
103
|
+
exposed: { type: "function" },
|
|
104
|
+
type: "init" /* init */
|
|
142
105
|
};
|
|
143
106
|
implementation.postMessageToMaster(initMessage);
|
|
144
107
|
}
|
|
145
|
-
__name(postFunctionInitMessage, "postFunctionInitMessage");
|
|
146
108
|
function postModuleInitMessage(methodNames) {
|
|
147
109
|
const initMessage = {
|
|
148
110
|
exposed: {
|
|
149
111
|
methods: methodNames,
|
|
150
112
|
type: "module"
|
|
151
113
|
},
|
|
152
|
-
type:
|
|
114
|
+
type: "init" /* init */
|
|
153
115
|
};
|
|
154
116
|
implementation.postMessageToMaster(initMessage);
|
|
155
117
|
}
|
|
156
|
-
__name(postModuleInitMessage, "postModuleInitMessage");
|
|
157
118
|
function postJobErrorMessage(uid, rawError) {
|
|
158
119
|
const { payload: error, transferables } = deconstructTransfer(rawError);
|
|
159
120
|
const errorMessage = {
|
|
160
121
|
error: serialize(error),
|
|
161
|
-
type:
|
|
122
|
+
type: "error" /* error */,
|
|
162
123
|
uid
|
|
163
124
|
};
|
|
164
125
|
implementation.postMessageToMaster(errorMessage, transferables);
|
|
165
126
|
}
|
|
166
|
-
__name(postJobErrorMessage, "postJobErrorMessage");
|
|
167
127
|
function postJobResultMessage(uid, completed, resultValue) {
|
|
168
128
|
const { payload, transferables } = deconstructTransfer(resultValue);
|
|
169
129
|
const resultMessage = {
|
|
170
130
|
complete: completed ? true : void 0,
|
|
171
131
|
payload,
|
|
172
|
-
type:
|
|
132
|
+
type: "result" /* result */,
|
|
173
133
|
uid
|
|
174
134
|
};
|
|
175
135
|
implementation.postMessageToMaster(resultMessage, transferables);
|
|
176
136
|
}
|
|
177
|
-
__name(postJobResultMessage, "postJobResultMessage");
|
|
178
137
|
function postJobStartMessage(uid, resultType) {
|
|
179
138
|
const startMessage = {
|
|
180
139
|
resultType,
|
|
181
|
-
type:
|
|
140
|
+
type: "running" /* running */,
|
|
182
141
|
uid
|
|
183
142
|
};
|
|
184
143
|
implementation.postMessageToMaster(startMessage);
|
|
185
144
|
}
|
|
186
|
-
__name(postJobStartMessage, "postJobStartMessage");
|
|
187
145
|
function postUncaughtErrorMessage(error) {
|
|
188
146
|
try {
|
|
189
147
|
const errorMessage = {
|
|
190
148
|
error: serialize(error),
|
|
191
|
-
type:
|
|
149
|
+
type: "uncaughtError" /* uncaughtError */
|
|
192
150
|
};
|
|
193
151
|
implementation.postMessageToMaster(errorMessage);
|
|
194
152
|
} catch (subError) {
|
|
195
|
-
console.error(
|
|
153
|
+
console.error(
|
|
154
|
+
"Not reporting uncaught error back to master thread as it occured while reporting an uncaught error already.\nLatest error:",
|
|
155
|
+
subError,
|
|
156
|
+
"\nOriginal error:",
|
|
157
|
+
error
|
|
158
|
+
);
|
|
196
159
|
}
|
|
197
160
|
}
|
|
198
|
-
__name(postUncaughtErrorMessage, "postUncaughtErrorMessage");
|
|
199
161
|
async function runFunction(jobUID, fn, args) {
|
|
200
162
|
let syncResult;
|
|
201
163
|
try {
|
|
@@ -207,13 +169,17 @@ function createExpose(implementation, self) {
|
|
|
207
169
|
const resultType = isObservable(syncResult) ? "observable" : "promise";
|
|
208
170
|
postJobStartMessage(jobUID, resultType);
|
|
209
171
|
if (isObservable(syncResult)) {
|
|
210
|
-
const subscription = syncResult.subscribe(
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
172
|
+
const subscription = syncResult.subscribe(
|
|
173
|
+
(value) => postJobResultMessage(jobUID, false, serialize(value)),
|
|
174
|
+
(error) => {
|
|
175
|
+
postJobErrorMessage(jobUID, serialize(error));
|
|
176
|
+
activeSubscriptions.delete(jobUID);
|
|
177
|
+
},
|
|
178
|
+
() => {
|
|
179
|
+
postJobResultMessage(jobUID, true);
|
|
180
|
+
activeSubscriptions.delete(jobUID);
|
|
181
|
+
}
|
|
182
|
+
);
|
|
217
183
|
activeSubscriptions.set(jobUID, subscription);
|
|
218
184
|
} else {
|
|
219
185
|
try {
|
|
@@ -224,8 +190,7 @@ function createExpose(implementation, self) {
|
|
|
224
190
|
}
|
|
225
191
|
}
|
|
226
192
|
}
|
|
227
|
-
|
|
228
|
-
const expose2 = /* @__PURE__ */ __name((exposed) => {
|
|
193
|
+
const expose2 = (exposed) => {
|
|
229
194
|
if (!implementation.isWorkerRuntime()) {
|
|
230
195
|
throw new Error("expose() called in the master thread.");
|
|
231
196
|
}
|
|
@@ -261,7 +226,7 @@ function createExpose(implementation, self) {
|
|
|
261
226
|
}
|
|
262
227
|
}
|
|
263
228
|
});
|
|
264
|
-
}
|
|
229
|
+
};
|
|
265
230
|
if (typeof globalThis !== "undefined" && typeof self.addEventListener === "function" && implementation.isWorkerRuntime()) {
|
|
266
231
|
self.addEventListener("error", (event) => {
|
|
267
232
|
setTimeout(() => postUncaughtErrorMessage(isErrorEvent(event) ? event.error : event), 250);
|
|
@@ -285,7 +250,6 @@ function createExpose(implementation, self) {
|
|
|
285
250
|
}
|
|
286
251
|
return expose2;
|
|
287
252
|
}
|
|
288
|
-
__name(createExpose, "createExpose");
|
|
289
253
|
|
|
290
254
|
// src/worker/worker.node.ts
|
|
291
255
|
var parentPort = assertEx(optionalParentPort, () => "Invariant violation: MessagePort to parent is not available.");
|
|
@@ -295,26 +259,25 @@ function assertMessagePort(port) {
|
|
|
295
259
|
}
|
|
296
260
|
return port;
|
|
297
261
|
}
|
|
298
|
-
|
|
299
|
-
var isWorkerRuntime = /* @__PURE__ */ __name(function isWorkerRuntime2() {
|
|
262
|
+
var isWorkerRuntime = function isWorkerRuntime2() {
|
|
300
263
|
return true;
|
|
301
|
-
}
|
|
302
|
-
var postMessageToMaster =
|
|
264
|
+
};
|
|
265
|
+
var postMessageToMaster = function postMessageToMaster2(data, transferList) {
|
|
303
266
|
assertMessagePort(parentPort).postMessage(data, transferList);
|
|
304
|
-
}
|
|
305
|
-
var subscribeToMasterMessages =
|
|
267
|
+
};
|
|
268
|
+
var subscribeToMasterMessages = function subscribeToMasterMessages2(onMessage) {
|
|
306
269
|
if (!parentPort) {
|
|
307
270
|
throw new Error("Invariant violation: MessagePort to parent is not available.");
|
|
308
271
|
}
|
|
309
|
-
const messageHandler =
|
|
272
|
+
const messageHandler = (message) => {
|
|
310
273
|
onMessage(message);
|
|
311
|
-
}
|
|
312
|
-
const unsubscribe =
|
|
274
|
+
};
|
|
275
|
+
const unsubscribe = () => {
|
|
313
276
|
assertMessagePort(parentPort).off("message", messageHandler);
|
|
314
|
-
}
|
|
277
|
+
};
|
|
315
278
|
assertMessagePort(parentPort).on("message", messageHandler);
|
|
316
279
|
return unsubscribe;
|
|
317
|
-
}
|
|
280
|
+
};
|
|
318
281
|
var addEventListener = parentPort?.on.bind(parentPort);
|
|
319
282
|
var postMessage = parentPort?.postMessage.bind(parentPort);
|
|
320
283
|
var removeEventListener = parentPort?.off.bind(parentPort);
|