@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.
Files changed (33) hide show
  1. package/dist/browser/index-browser.mjs +119 -209
  2. package/dist/browser/index-browser.mjs.map +1 -1
  3. package/dist/browser/master/implementation.browser.mjs +11 -36
  4. package/dist/browser/master/implementation.browser.mjs.map +1 -1
  5. package/dist/browser/master/index-browser.mjs +117 -201
  6. package/dist/browser/master/index-browser.mjs.map +1 -1
  7. package/dist/browser/master/pool-browser.mjs +53 -65
  8. package/dist/browser/master/pool-browser.mjs.map +1 -1
  9. package/dist/browser/worker/worker.browser.mjs +43 -79
  10. package/dist/browser/worker/worker.browser.mjs.map +1 -1
  11. package/dist/neutral/master/register.mjs +62 -121
  12. package/dist/neutral/master/register.mjs.map +1 -1
  13. package/dist/neutral/master/spawn.mjs +53 -106
  14. package/dist/neutral/master/spawn.mjs.map +1 -1
  15. package/dist/neutral/master/thread.mjs +0 -4
  16. package/dist/neutral/master/thread.mjs.map +1 -1
  17. package/dist/neutral/observable-promise.mjs +20 -27
  18. package/dist/neutral/observable-promise.mjs.map +1 -1
  19. package/dist/neutral/observable.mjs +3 -12
  20. package/dist/neutral/observable.mjs.map +1 -1
  21. package/dist/neutral/types/messages.mjs +4 -4
  22. package/dist/neutral/types/messages.mjs.map +1 -1
  23. package/dist/node/index-node.mjs +169 -293
  24. package/dist/node/index-node.mjs.map +1 -1
  25. package/dist/node/master/implementation.node.mjs +62 -121
  26. package/dist/node/master/implementation.node.mjs.map +1 -1
  27. package/dist/node/master/index-node.mjs +168 -286
  28. package/dist/node/master/index-node.mjs.map +1 -1
  29. package/dist/node/master/pool-node.mjs +115 -183
  30. package/dist/node/master/pool-node.mjs.map +1 -1
  31. package/dist/node/worker/worker.node.mjs +43 -80
  32. package/dist/node/worker/worker.node.mjs.map +1 -1
  33. 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":";;;;;;;;;;;;;;AAAA;;;AAEA,QAAIA,eAAe,2BAAA;AAAc,eAASC,iBAAiBC,QAAQC,OAAK;AAAI,iBAASC,IAAI,GAAGA,IAAID,MAAME,QAAQD,KAAK;AAAE,cAAIE,aAAaH,MAAMC,CAAAA;AAAIE,qBAAWC,aAAaD,WAAWC,cAAc;AAAOD,qBAAWE,eAAe;AAAM,cAAI,WAAWF,WAAYA,YAAWG,WAAW;AAAMC,iBAAOC,eAAeT,QAAQI,WAAWM,KAAKN,UAAAA;QAAa;MAAE;AAAlTL;AAAoT,aAAO,SAAUY,aAAaC,YAAYC,aAAW;AAAI,YAAID,WAAYb,kBAAiBY,YAAYG,WAAWF,UAAAA;AAAa,YAAIC,YAAad,kBAAiBY,aAAaE,WAAAA;AAAc,eAAOF;MAAa;IAAG,EAAA;AAEhjB,aAASI,gBAAgBC,UAAUL,aAAW;AAAI,UAAI,EAAEK,oBAAoBL,cAAc;AAAE,cAAM,IAAIM,UAAU,mCAAA;MAAsC;IAAE;AAA/IF;AAET,QAAIG,QAAOC,UAAQ,MAAA;AAAnB,QACIC,OAAOD,UAAQ,eAAA,EAAiBC;AADpC,QAEIC,SAASH,MAAKI,KAAKC,WAAW,WAAA;AAFlC,QAGIC,SAAS;AAHb,QAIIC,eAAe;MAAEC,SAAS;MAAMC,OAAO;IAAK;AAChD,QAAIC,QAAQ;MAAEC,KAAK;MAAGC,KAAK;IAAI;AAE/B,QAAIC,SAAS,WAAA;AACZ,eAASA,QAAOC,KAAG;AAClB,YAAIC,QAAQ;AAEZ,YAAIC,OAAOC,UAAUhC,SAAS,KAAKgC,UAAU,CAAA,MAAOC,SAAYD,UAAU,CAAA,IAAK,CAAA;AAC/E,YAAIE,UAAUF,UAAUhC,SAAS,KAAKgC,UAAU,CAAA,MAAOC,SAAYD,UAAU,CAAA,IAAK;UAAEG,KAAKC,QAAQD,IAAG;QAAG;AAEvGvB,wBAAgB,MAAMgB,OAAAA;AAEtB,YAAIS,OAAO,OAAOR,QAAQ,YACtBS,QAAQD,OAAOR,IAAIU,SAAQ,IAAKV;AAEpC,YAAI,CAACK,QAAQC,KAAK;AACjBD,kBAAQC,MAAMC,QAAQD,IAAG;QAC1B;AAGA,YAAIK,YAAYJ,QAAQK,SAASC,OAAO,SAAUC,SAAO;AACxD,iBAAQ,kBAAkBC,KAAKD,OAAAA;QAEhC,CAAA;AACA,YAAIH,UAAUxC,SAAS,KAAK,CAACkC,QAAQW,oBAAoB;AACxD,cAAI,CAACX,QAAQO,UAAU;AAEtBD,wBAAYM,MAAMC,KAAKX,QAAQK,QAAQ;AACvCP,oBAAQO,WAAW,CAAA;UACpB;AAEA,cAAIO,eAAeR,UAAUS,UAAU,SAAUC,UAAQ;AAExD,mBAAQ,4BAA4BN,KAAKM,QAAAA;UAE1C,CAAA;AAEA,cAAIC,aAAaX,UAAUS,UAAU,SAAUC,UAAQ;AAEtD,mBAAQ,0BAA0BN,KAAKM,QAAAA;UAExC,CAAA;AAEA,cAAIE,YAAYJ,gBAAgB,IAAIA,eAAeG;AAEnD,cAAIC,aAAa,GAAG;AACnB,gBAAIC,QAAQ,0CAA0CC,KAAKd,UAAUY,SAAAA,CAAU;AAC/E,gBAAIG,OAAOjC,aAAa+B,MAAM,CAAA,CAAE;AAChC,gBAAIA,MAAM,CAAA,GAAI;AACbE,qBAAOC,SAASH,MAAM,CAAA,CAAE;YACzB;AACAb,sBAAUY,SAAAA,IAAa,OAAOC,MAAM,CAAA,IAAK,OAAOE,OAAO9B,MAAMC,MAAM+B,KAAKC,MAAMD,KAAKE,OAAM,KAAMlC,MAAME,MAAMF,MAAMC,IAAE;AAEnH,gBAAIyB,cAAc,KAAKA,eAAeC,WAAW;AAEhDC,sBAAQ,0BAA0BC,KAAKd,UAAUW,UAAAA,CAAW;AAC5DX,wBAAUW,UAAAA,IAAcE,MAAM,CAAA,KAAMA,MAAM,CAAA,IAAKA,MAAM,CAAA,IAAK;YAC3D;UACD;AACAnB,kBAAQO,WAAWP,QAAQO,SAASmB,OAAOpB,SAAAA;QAC5C;AAEA,eAAON,QAAQW;AAEf,aAAKgB,QAAQ5C,KAAKC,QAAQa,MAAMG,OAAAA;AAChC,aAAK4B,UAAU7B;AACf,aAAK8B,YAAY9B;AAEjB,aAAK4B,MAAMG,GAAG,SAAS,SAAUC,GAAC;AACjC,cAAInC,MAAMgC,SAAS;AAClBhC,kBAAMgC,QAAQI,KAAKpC,OAAOmC,CAAAA;UAC3B;QACD,CAAA;AAEA,aAAKJ,MAAMG,GAAG,WAAW,SAAUG,KAAG;AACrC,cAAIC,UAAUC,KAAKC,MAAMH,GAAAA;AACzB,cAAII,QAAQ;AAEZ,cAAI,CAACH,QAAQG,SAASzC,MAAMiC,WAAW;AACtCjC,kBAAMiC,UAAUG,KAAKpC,OAAOsC,OAAAA;UAC7B;AAEA,cAAIA,QAAQG,SAASzC,MAAMgC,SAAS;AACnCS,oBAAQ,IAAIC,MAAMJ,QAAQG,KAAK;AAC/BA,kBAAME,QAAQL,QAAQK;AAEtB3C,kBAAMgC,QAAQI,KAAKpC,OAAOyC,KAAAA;UAC3B;QACD,CAAA;AAEA,aAAKV,MAAMa,KAAK;UAAEpC;UAAcD;UAAYF,KAAKD,QAAQC;UAAKwC,KAAKzC,QAAQyC;QAAI,CAAA;MAChF;AAvFS/C,aAAAA,SAAAA;AAyFTjC,mBAAaiC,SAAQ;QAAC;UACrBrB,KAAK;UACLqE,OAAO,gCAASC,iBAAiBC,OAAOC,IAAE;AACzC,gBAAI1D,OAAOuB,KAAKkC,KAAAA,GAAQ;AACvB,mBAAK,OAAOA,KAAAA,IAASC;YACtB;UACD,GAJO;QAKR;QAAG;UACFxE,KAAK;UACLqE,OAAO,gCAASI,YAAYb,KAAG;AAC9B,iBAAKN,MAAMa,KAAKL,KAAKY,UAAU;cAAEC,MAAMf;YAAI,GAAG,MAAM,CAAA,CAAA;UACrD,GAFO;QAGR;QAAG;UACF5D,KAAK;UACLqE,OAAO,gCAASO,YAAAA;AACf,iBAAKtB,MAAMuB,KAAK,QAAA;UACjB,GAFO;QAGR;SAAI;QAAC;UACJ7E,KAAK;UACLqE,OAAO,gCAASS,SAAS3D,KAAKC,KAAG;AAChC,gBAAID,OAAOC,KAAK;AACf,qBAAO;YACR;AACAF,kBAAMC,MAAMA;AACZD,kBAAME,MAAMA;AAEZ,mBAAO;UACR,GARO;QASR;OAAE;AAEF,aAAOC;IACR,EAAA;AAEA0D,WAAOC,UAAU3D;;;;;AC9HjB,OAAO4D,iBAAiB;AACxB,SACEC,WAAWC,YAAYC,eAClB;;;ACNP,SAASC,oBAAoB;AAC7B,SAASC,YAAY;AACrB,OAAOC,UAAU;AACjB,SAASC,WAAW;AACpB,SAASC,UAAUC,oBAAoB;AAWhC,IAAMC,kBAAkBC,KAAAA,EAAOC;AAEtC,SAASC,kBAAkBC,YAAoBC,SAA4B;AACzE,QAAMC,eAAe,wBAACC,aAAAA;AACpB,WAAOC,KAAKC,WAAWF,QAAAA,IAAYA,WAAWC,KAAKE,KAAKL,WAAWM,IAAAA,GAAOJ,QAAAA;EAC5E,GAFqB;AAIrB,QAAMK,eAAeN,aAAaF,UAAAA;AAClC,SAAOQ;AACT;AAPST;AAST,SAASU,0BAAAA;AACP,MAAIC,aAAkC,CAAA;AAEtC,MAAMC,SAAN,MAAMA,eAAeC,aAAAA;IApCvB,OAoCuBA;;;IACXC;IAER,YAAYb,YAAoBc,SAA0D;AACxF,YAAMC,qBAAqBD,WAAWA,QAAQE,aAAa,OAAOjB,kBAAkBC,aAAac,WAAW,CAAC,GAAGG,QAAQ;AACxH,UAAIF,oBAAoB;AACtB,cAAMA,oBAAoBD,OAAAA;MAC5B,OAAO;AAEL,cAAMI,aAAalB;AACnB,cAAMkB,YAAY;UAAE,GAAGJ;UAASK,MAAM;QAAK,CAAA;MAC7C;AAEA,WAAKN,uBAAuB,oBAAIO,QAAAA;AAChCV,iBAAWW,KAAK,IAAI;IACtB;IAEAC,iBAAiBC,WAAmBC,aAA4B;AAC9D,YAAMC,WAAW,wBAACC,YAAAA;AAChBF,oBAAY;UAAEG,MAAMD;QAAQ,CAAA;MAC9B,GAFiB;AAGjB,WAAKb,qBAAqBe,IAAIJ,aAAaC,QAAAA;AAC3C,WAAKI,GAAGN,WAAWE,QAAAA;IACrB;IAEAK,oBAAoBP,WAAmBC,aAA4B;AACjE,YAAMC,WAAW,KAAKZ,qBAAqBkB,IAAIP,WAAAA,KAAgBA;AAC/D,WAAKQ,IAAIT,WAAWE,QAAAA;IACtB;EACF;AAEA,QAAMQ,4BAA4B,6BAAA;AAEhCC,YAAQC,IAAIzB,WAAW0B,IAAIC,CAAAA,WAAUA,OAAOC,UAAS,CAAA,CAAA,EAAKC,KACxD,MAAMC,QAAQC,KAAK,CAAA,GACnB,MAAMD,QAAQC,KAAK,CAAA,CAAA;AAErB/B,iBAAa,CAAA;EACf,GAPkC;AAUlC8B,UAAQX,GAAG,UAAU,MAAMI,0BAAAA,CAAAA;AAC3BO,UAAQX,GAAG,WAAW,MAAMI,0BAAAA,CAAAA;AAE5B,MAAMS,aAAN,MAAMA,mBAAmB/B,OAAAA;IAhF3B,OAgF2BA;;;IACvB,YAAYgC,MAAkB7B,SAAgC;AAC5D,YAAM8B,OAAOC,KAAKF,IAAAA,EAAMG,SAAS,OAAA,GAAU;QAAE,GAAGhC;QAASE,YAAY;MAAK,CAAA;IAC5E;IAEA,OAAO+B,SAASC,QAAgBlC,SAAsD;AACpF,aAAO,IAAIH,OAAOqC,QAAQ;QAAE,GAAGlC;QAASE,YAAY;MAAK,CAAA;IAC3D;EACF;AAEA,SAAO;IACL2B,MAAMD;IACNO,SAAStC;EACX;AACF;AA7DSF;AA+DT,SAASyC,iBAAAA;AACP,QAAMC,aAAaC;AAEnB,MAAI1C,aAAuC,CAAA;AAE3C,MAAMC,SAAN,MAAMA,eAAewC,WAAAA;IArGvB,OAqGuBA;;;IACXE;IAER,YAAYrD,YAAoBc,SAA2D;AAGzF,YAAMC,qBACFD,WAAWA,QAAQE,aACjB,OACAwB,QAAQc,aAAa,UACnB,WAAWvD,kBAAkBC,UAAAA,EAAYuD,WAAW,MAAM,GAAA,CAAA,KAC1DxD,kBAAkBC,UAAAA;AAE1B,UAAIe,oBAAoB;AACtB,cAAMA,oBAAoB,CAAA,GAAI;UAAEyC,KAAK;QAAK,CAAA;MAC5C,OAAO;AAEL,cAAMtC,aAAalB;AACnB,cAAM,IAAIyD,SAASvC,UAAAA,GAAa,CAAA,GAAI;UAAEsC,KAAK;QAAK,CAAA;MAClD;AAEA9C,iBAAWW,KAAK,IAAI;AAEpB,WAAKgC,UAAU,IAAIK,aAAAA;AACnB,WAAKC,UAAU,CAACC,UAAiB,KAAKP,QAAQQ,KAAK,SAASD,KAAAA;AAC5D,WAAKE,YAAY,CAACpC,YAA0B,KAAK2B,QAAQQ,KAAK,WAAWnC,OAAAA;IAC3E;IAEAJ,iBAAiBC,WAA4BE,UAAyB;AACpE,WAAK4B,QAAQU,YAAYxC,WAAWE,QAAAA;IACtC;IAEAK,oBAAoBP,WAA4BE,UAAyB;AACvE,WAAK4B,QAAQW,eAAezC,WAAWE,QAAAA;IACzC;IAEAa,YAAY;AACV5B,mBAAaA,WAAWuD,OAAO5B,CAAAA,WAAUA,WAAW,IAAI;AACxD,aAAO,MAAMC,UAAAA;IACf;EACF;AAEA,QAAML,4BAA4B,6BAAA;AAEhCC,YAAQC,IAAIzB,WAAW0B,IAAIC,CAAAA,WAAUA,OAAOC,UAAS,CAAA,CAAA,EAAKC,KACxD,MAAMC,QAAQC,KAAK,CAAA,GACnB,MAAMD,QAAQC,KAAK,CAAA,CAAA;AAErB/B,iBAAa,CAAA;EACf,GAPkC;AAWlC8B,UAAQX,GAAG,UAAU,MAAMI,0BAAAA,CAAAA;AAC3BO,UAAQX,GAAG,WAAW,MAAMI,0BAAAA,CAAAA;AAE5B,MAAMS,aAAN,MAAMA,mBAAmB/B,OAAAA;IA7J3B,OA6J2BA;;;IACvB,YAAYgC,MAAkB7B,SAAgC;AAC5D,YAAM8B,OAAOC,KAAKF,IAAAA,EAAMG,SAAS,OAAA,GAAU;QAAE,GAAGhC;QAASE,YAAY;MAAK,CAAA;IAC5E;IAEA,OAAO+B,SAASC,QAAgBlC,SAAsD;AACpF,aAAO,IAAIH,OAAOqC,QAAQ;QAAE,GAAGlC;QAASE,YAAY;MAAK,CAAA;IAC3D;EACF;AAEA,SAAO;IACL2B,MAAMD;IACNO,SAAStC;EACX;AACF;AA3ESuC;AA6ET,IAAIgB;AACJ,IAAIC;AAEJ,SAASC,6BAAAA;AACP,MAAI;AACFD,mBAAe;AACf,WAAO1D,wBAAAA;EACT,SAAS4D,IAAI;AACXC,YAAQV,MAAMS,EAAAA;AAEdC,YAAQC,MAAM,mFAAA;AACdJ,mBAAe;AACf,WAAOjB,eAAAA;EACT;AACF;AAXSkB;AAaF,SAASI,0BAAAA;AACd,MAAI,CAACN,gBAAgB;AACnBA,qBAAiBE,2BAAAA;EACnB;AACA,SAAOF;AACT;AALgBM;AAOT,SAASC,kBAAAA;AACd,MAAIN,cAAc;AAChB,WAAOO,eAAeC,UAAaC,KAAK,aAAA,IAAiB,OAAO;EAClE,OAAO;AAEL,UAAMC,eACF,OAAOC,4BAA4B,aACjCA,wBAAwB,gBAAA,EAAkBD,eAC1C1D,KAAK,SAAA,EAAW,gBAAA,EAAkB0D;AACxC,WAAO,CAACA;EACV;AACF;AAXgBJ;;;AC/LT,IAAKM,gBAAAA,yBAAAA,gBAAAA;;;;;;;;;SAAAA;;;;ACLL,IAAMC,UAAUC,OAAO,eAAA;AACvB,IAAMC,UAAUD,OAAO,eAAA;AACvB,IAAME,aAAaF,OAAO,kBAAA;AAC1B,IAAMG,gBAAgBH,OAAO,qBAAA;AAC7B,IAAMI,UAAUJ,OAAO,eAAA;;;ACI9B,SAASK,KAAKC,SAAe;AAC3B,QAAM,IAAIC,MAAMD,OAAAA;AAClB;AAFSD;AAOF,IAAMG,SAAS;;EAEpBC,OAAmCC,QAAe;AAChD,WAAOA,OAAOC,OAAAA,KAAYN,KAAK,qGAAA;EACjC;;EAEAO,OAAmCF,QAAe;AAChD,WAAOA,OAAOG,OAAAA,KAAYR,KAAK,sGAAA;EACjC;;EAEAS,UAAsCJ,QAAe;AACnD,WAAOA,OAAOK,UAAAA,EAAW;EAC3B;AACF;;;AJDA,IAAIC,aAAa;AAEjB,SAASC,YAAYC,MAAY;AAC/B,QAAMC,QAAkB,CAAA;AACxB,WAASC,QAAQ,GAAGA,QAAQF,MAAME,SAAS;AACzCD,UAAME,KAAKD,KAAAA;EACb;AACA,SAAOD;AACT;AANSF;AAQT,SAASK,MAAMC,IAAU;AACvB,SAAO,IAAIC,QAAQC,CAAAA,YAAWC,WAAWD,SAASF,EAAAA,CAAAA;AACpD;AAFSD;AAIT,SAASK,QAAiBR,OAAaS,QAA8B;AACnE,SAAOT,MAAMU,OAAc,CAACC,WAAWC,YAAY;OAAID;OAAcF,OAAOG,OAAAA;KAAW,CAAA,CAAE;AAC3F;AAFSJ;AAIT,SAASK,QAAQC,MAAY;AAC3B,SAAOA,KAAKC,WAAW,OAAO,GAAA,EAAKC,KAAI,EAAGD,WAAW,QAAQ,GAAA;AAC/D;AAFSF;AAIT,SAASI,aAAwCC,aAAwCC,OAAa;AACpG,SAAOrB,YAAYqB,KAAAA,EAAOC,IACxB,OAAqC;IACnCC,MAAMH,YAAAA;IACNI,cAAc,CAAA;EAChB,EAAA;AAEJ;AAPSL;AAkET,IAAMM,aAAN,MAAMA,YAAAA;EAnHN,OAmHMA;;;EACJ,OAAOC,YAAYC;EAEFC;EACAC;EACAC;EACAC;EAEAC,eAAe,IAAIC,QAAAA;EAC5BC,aAAsB,CAAA;EACtBC,YAAY;EACZC,aAAa;EACbC,YAAgD,CAAA;EAExD,YAAYjB,aAAwCkB,eAAsC;AACxF,UAAMR,UAAuB,OAAOQ,kBAAkB,WAAW;MAAErC,MAAMqC;IAAc,IAAIA,iBAAiB,CAAC;AAE7G,UAAM,EAAErC,OAAOsC,gBAAe,IAAKT;AAEnC,SAAKF,QAAQY,YAAY,gBAAgBzB,QAAQe,QAAQW,QAAQC,OAAO3C,YAAAA,CAAAA,CAAAA,EAAgB;AACxF,SAAK+B,UAAUA;AACf,SAAKC,UAAUZ,aAAaC,aAAanB,IAAAA;AAEzC,SAAK4B,kBAAkBc,UAAUC,WAAWC,KAAK,KAAKb,YAAY,CAAA;AAElEzB,YAAQuC,IAAI,KAAKf,QAAQT,IAAIyB,CAAAA,WAAUA,OAAOxB,IAAI,CAAA,EAAGyB,KACnD,MACE,KAAKhB,aAAaiB,KAAK;MACrBhD,MAAM,KAAK8B,QAAQmB;MACnBC,MAAMxB,cAAcyB;IACtB,CAAA,GACF,CAACC,UAAAA;AACC,WAAKzB,MAAM,yCAAyCyB,KAAAA;AACpD,WAAKrB,aAAaqB,MAAMA,KAAAA;AACxB,WAAKnB,WAAW9B,KAAKiD,KAAAA;IACvB,CAAA;EAEJ;EAEQC,mBAA6D;AACnE,UAAM,EAAEC,cAAc,EAAC,IAAK,KAAKzB;AACjC,WAAO,KAAKC,QAAQyB,KAAKT,CAAAA,WAAUA,OAAOvB,aAAa0B,SAASK,WAAAA;EAClE;EAEA,MAAcE,YAAYV,QAAsCW,MAAmC;AACjG,UAAMC,WAAW,KAAK5B,QAAQ6B,QAAQb,MAAAA,IAAU;AAEhD,SAAKnB,MAAM,iBAAiB8B,KAAKG,EAAE,eAAeF,QAAAA,KAAa;AAC/D,SAAK3B,aAAaiB,KAAK;MACrBa,QAAQJ,KAAKG;MACbV,MAAMxB,cAAcoC;MACpBJ;IACF,CAAA;AAEA,QAAI;AACF,YAAMK,cAAc,MAAMN,KAAKO,IAAI,MAAMlB,OAAOxB,IAAI;AAEpD,WAAKK,MAAM,SAAS8B,KAAKG,EAAE,yBAAyB;AACpD,WAAK7B,aAAaiB,KAAK;QACrBe;QACAF,QAAQJ,KAAKG;QACbV,MAAMxB,cAAcuC;QACpBP;MACF,CAAA;IACF,SAASQ,IAAI;AACX,YAAMd,QAAQc;AACd,WAAKvC,MAAM,SAAS8B,KAAKG,EAAE,SAAS;AACpC,WAAK7B,aAAaiB,KAAK;QACrBI;QACAS,QAAQJ,KAAKG;QACbV,MAAMxB,cAAcyC;QACpBT;MACF,CAAA;IACF;EACF;EAEQM,IAAIlB,QAAsCW,MAAmC;AACnF,UAAMW,cAAc,YAAA;AAClB,YAAMC,oCAAoC,6BAAA;AACxCvB,eAAOvB,eAAeuB,OAAOvB,aAAa+C,OAAOC,CAAAA,mBAAkBA,mBAAmBH,UAAAA;MACxF,GAF0C;AAK1C,YAAMhE,MAAM,CAAA;AAEZ,UAAI;AACF,cAAM,KAAKoD,YAAYV,QAAQW,IAAAA;MACjC,UAAA;AACEY,0CAAAA;AAEA,YAAI,CAAC,KAAKnC,WAAW;AACnB,eAAKsC,aAAY;QACnB;MACF;IACF,GAAA;AAEA1B,WAAOvB,aAAapB,KAAKiE,UAAAA;EAC3B;EAEQI,eAAe;AACrB,SAAK7C,MAAM,kDAAA;AAEX,UAAM8C,kBAAkB,KAAKpB,iBAAgB;AAC7C,QAAI,CAACoB,gBAAiB;AAEtB,UAAMC,WAAW,KAAKtC,UAAUuC,MAAK;AACrC,QAAI,CAACD,UAAU;AACb,WAAK/C,MAAM,qBAAA;AACX,WAAKI,aAAaiB,KAAK;QAAEE,MAAMxB,cAAckD;MAAiB,CAAA;AAC9D;IACF;AAEA,SAAKZ,IAAIS,iBAAiBC,QAAAA;EAC5B;EAEQG,eAAehB,QAAgB;AACrC,WAAO,IAAIvD,QAAa,CAACC,SAASuE,WAAAA;AAChC,YAAMC,oBAAoB,KAAKC,OAAM,EAAGC,UAAU,CAACC,UAAAA;AACjD,YAAIA,MAAMhC,SAASxB,cAAcuC,iBAAiBiB,MAAMrB,WAAWA,QAAQ;AACzEkB,4BAAkBI,YAAW;AAC7B5E,kBAAQ2E,MAAMnB,WAAW;QAC3B,WAAWmB,MAAMhC,SAASxB,cAAcyC,cAAce,MAAMrB,WAAWA,QAAQ;AAC7EkB,4BAAkBI,YAAW;AAC7BL,iBAAOI,MAAM9B,KAAK;QACpB,WAAW8B,MAAMhC,SAASxB,cAAc0D,YAAY;AAClDL,4BAAkBI,YAAW;AAC7BL,iBAAO,IAAIO,MAAM,+CAAA,CAAA;QACnB;MACF,CAAA;IACF,CAAA;EACF;EAEA,MAAMC,QAAQC,4BAAqC,OAAyB;AAC1E,UAAMC,2BAA2B,6BAAM/E,QAAQ,KAAKqB,SAASgB,CAAAA,WAAUA,OAAOvB,YAAY,GAAzD;AAEjC,UAAMkE,eAAwB,CAAA;AAE9B,UAAMC,sBAAsB,KAAK9D,gBAAgBqD,UAAU,CAACC,UAAAA;AAC1D,UAAIA,MAAMhC,SAASxB,cAAcyC,YAAY;AAC3CsB,qBAAatF,KAAK+E,MAAM9B,KAAK;MAC/B;IACF,CAAA;AAEA,QAAI,KAAKnB,WAAWgB,SAAS,GAAG;AAC9B,YAAM,KAAKhB,WAAW,CAAA;IACxB;AACA,QAAIsD,6BAA6B,KAAKnD,UAAUa,WAAW,GAAG;AAC5D,YAAM3C,QAAQqF,WAAWH,yBAAAA,CAAAA;AACzB,aAAOC;IACT;AAEA,UAAM,IAAInF,QAAc,CAACC,SAASuE,WAAAA;AAChC,YAAMc,eAAe,KAAKhE,gBAAgBqD,UAAU;QAClD7B,OAAO0B;QACP9B,KAAKkC,OAAK;AACR,cAAIA,MAAMhC,SAASxB,cAAckD,kBAAkB;AACjDgB,yBAAaT,YAAW;AACxB5E,oBAAQ,MAAK;UACf;QACF;MACF,CAAA;IACF,CAAA;AAEA,UAAMD,QAAQqF,WAAWH,yBAAAA,CAAAA;AACzBE,wBAAoBP,YAAW;AAE/B,WAAOM;EACT;EAEA,MAAMI,UAAUN,4BAAqC,OAAO;AAC1D,UAAMO,oBAAoB,KAAKR,QAAQC,yBAAAA;AAEvC,UAAMQ,mBAAmB,IAAIzF,QAAiB,CAACC,SAASuE,WAAAA;AACtD,YAAMc,eAAe,KAAKhE,gBAAgBqD,UAAU;QAClD7B,OAAO0B;QACP9B,KAAKkC,OAAK;AACR,cAAIA,MAAMhC,SAASxB,cAAckD,kBAAkB;AACjDgB,yBAAaT,YAAW;AACxB5E,oBAAQuF,iBAAAA;UACV,WAAWZ,MAAMhC,SAASxB,cAAcyC,YAAY;AAClDyB,yBAAaT,YAAW;AACxBL,mBAAOI,MAAM9B,KAAK;UACpB;QACF;MACF,CAAA;IACF,CAAA;AAEA,UAAM4C,SAAS,MAAM1F,QAAQ2F,KAAK;MAACH;MAAmBC;KAAiB;AAEvE,QAAIC,OAAO/C,SAAS,GAAG;AACrB,YAAM+C,OAAO,CAAA;IACf;EACF;EAEAhB,SAAS;AACP,WAAO,KAAKpD;EACd;EAEAsE,MAAMC,cAAgD;AACpD,UAAM,EAAEC,gBAAgBC,OAAOC,kBAAiB,IAAK,KAAKzE;AAE1D,QAAI,KAAKK,WAAW;AAClB,YAAM,IAAImD,MAAM,+DAAA;IAClB;AACA,QAAI,KAAKpD,WAAWgB,SAAS,GAAG;AAC9B,YAAM,KAAKhB,WAAW,CAAA;IACxB;AAEA,UAAM4B,SAAS,KAAK1B;AACpB,UAAM0C,iBAAiB,KAAKA,eAAehB,MAAAA;AAE3CgB,mBAAe0B,MAAM,CAACnD,UAAAA;AAGpB,WAAKzB,MAAM,SAASkC,MAAAA,aAAmBT,KAAAA;IACzC,CAAA;AAEA,UAAMK,OAAoC;MACxC+C,QAAQ,6BAAA;AACN,YAAI,CAAC,KAAKpE,UAAUqE,SAAShD,IAAAA,EAAO;AACpC,aAAKrB,YAAY,KAAKA,UAAUkC,OAAOoC,CAAAA,aAAYA,aAAajD,IAAAA;AAChE,aAAK1B,aAAaiB,KAAK;UACrBa,QAAQJ,KAAKG;UACbV,MAAMxB,cAAciF;QACtB,CAAA;MACF,GAPQ;MAQR/C,IAAIC;MACJG,KAAKmC;MACLpD,MAAM8B,eAAe9B,KAAK6D,KAAK/B,cAAAA;IACjC;AAEA,QAAI,KAAKzC,UAAUa,UAAUmD,eAAe;AAC1C,YAAM,IAAIf,MACR,qNAEE;IAEN;AAEA,SAAK1D,MAAM,kBAAkB8B,KAAKG,EAAE,KAAK;AACzC,SAAKxB,UAAUjC,KAAKsD,IAAAA;AAEpB,SAAK1B,aAAaiB,KAAK;MACrBa,QAAQJ,KAAKG;MACbV,MAAMxB,cAAcmF;IACtB,CAAA;AAEA,SAAKrC,aAAY;AACjB,WAAOf;EACT;EAEA,MAAMqD,UAAUC,OAAiB;AAC/B,SAAK7E,YAAY;AACjB,QAAI,CAAC6E,OAAO;AACV,YAAM,KAAKlB,UAAU,IAAA;IACvB;AACA,SAAK9D,aAAaiB,KAAK;MACrBgE,gBAAgB;WAAI,KAAK5E;;MACzBc,MAAMxB,cAAc0D;IACtB,CAAA;AACA,SAAKrD,aAAakF,SAAQ;AAC1B,UAAM3G,QAAQuC,IAAI,KAAKf,QAAQT,IAAI,OAAMyB,WAAUoE,OAAOJ,UAAU,MAAMhE,OAAOxB,IAAI,CAAA,CAAA;EACvF;AACF;AAKA,SAAS6F,gBAA2ChG,aAAwCkB,eAAoC;AAG9H,SAAO,IAAIb,WAAWL,aAAakB,aAAAA;AACrC;AAJS8E;AAMPA,gBAAwB1F,YAAYC;AAK/B,IAAM0F,OAAOD;","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":";;;;;;;;;;;;AAAA;AAAA;AAAA;AAEA,QAAI,eAAe,2BAAY;AAAE,eAAS,iBAAiB,QAAQ,OAAO;AAAE,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AAAE,cAAI,aAAa,MAAM,CAAC;AAAG,qBAAW,aAAa,WAAW,cAAc;AAAO,qBAAW,eAAe;AAAM,cAAI,WAAW,WAAY,YAAW,WAAW;AAAM,iBAAO,eAAe,QAAQ,WAAW,KAAK,UAAU;AAAA,QAAG;AAAA,MAAE;AAAE,aAAO,SAAU,aAAa,YAAY,aAAa;AAAE,YAAI,WAAY,kBAAiB,YAAY,WAAW,UAAU;AAAG,YAAI,YAAa,kBAAiB,aAAa,WAAW;AAAG,eAAO;AAAA,MAAa;AAAA,IAAG,EAAE;AAEljB,aAAS,gBAAgB,UAAU,aAAa;AAAE,UAAI,EAAE,oBAAoB,cAAc;AAAE,cAAM,IAAI,UAAU,mCAAmC;AAAA,MAAG;AAAA,IAAE;AAExJ,QAAIA,QAAO,UAAQ,MAAM;AAAzB,QACI,OAAO,UAAQ,eAAe,EAAE;AADpC,QAEI,SAASA,MAAK,KAAK,WAAW,WAAW;AAF7C,QAGI,SAAS;AAHb,QAII,eAAe,EAAE,SAAS,MAAM,OAAO,KAAK;AAChD,QAAI,QAAQ,EAAE,KAAK,GAAG,KAAK,IAAI;AAE/B,QAAI,SAAS,WAAY;AACxB,eAASC,QAAO,KAAK;AACpB,YAAI,QAAQ;AAEZ,YAAI,OAAO,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAC;AAChF,YAAI,UAAU,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE;AAEvG,wBAAgB,MAAMA,OAAM;AAE5B,YAAI,OAAO,OAAO,QAAQ,YACtB,QAAQ,OAAO,IAAI,SAAS,IAAI;AAEpC,YAAI,CAAC,QAAQ,KAAK;AACjB,kBAAQ,MAAM,QAAQ,IAAI;AAAA,QAC3B;AAGA,YAAI,YAAY,QAAQ,SAAS,OAAO,SAAU,SAAS;AAC1D,iBAAQ,kBAAkB,KAAK,OAAO;AAAA,QAEvC,CAAC;AACD,YAAI,UAAU,SAAS,KAAK,CAAC,QAAQ,oBAAoB;AACxD,cAAI,CAAC,QAAQ,UAAU;AAEtB,wBAAY,MAAM,KAAK,QAAQ,QAAQ;AACvC,oBAAQ,WAAW,CAAC;AAAA,UACrB;AAEA,cAAI,eAAe,UAAU,UAAU,SAAU,UAAU;AAE1D,mBAAQ,4BAA4B,KAAK,QAAQ;AAAA,UAElD,CAAC;AAED,cAAI,aAAa,UAAU,UAAU,SAAU,UAAU;AAExD,mBAAQ,0BAA0B,KAAK,QAAQ;AAAA,UAEhD,CAAC;AAED,cAAI,YAAY,gBAAgB,IAAI,eAAe;AAEnD,cAAI,aAAa,GAAG;AACnB,gBAAI,QAAQ,0CAA0C,KAAK,UAAU,SAAS,CAAC;AAC/E,gBAAI,OAAO,aAAa,MAAM,CAAC,CAAC;AAChC,gBAAI,MAAM,CAAC,GAAG;AACb,qBAAO,SAAS,MAAM,CAAC,CAAC;AAAA,YACzB;AACA,sBAAU,SAAS,IAAI,OAAO,MAAM,CAAC,IAAI,OAAO,OAAO,MAAM,MAAM,KAAK,MAAM,KAAK,OAAO,KAAK,MAAM,MAAM,MAAM,IAAI;AAErH,gBAAI,cAAc,KAAK,eAAe,WAAW;AAEhD,sBAAQ,0BAA0B,KAAK,UAAU,UAAU,CAAC;AAC5D,wBAAU,UAAU,IAAI,MAAM,CAAC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI;AAAA,YAC3D;AAAA,UACD;AACA,kBAAQ,WAAW,QAAQ,SAAS,OAAO,SAAS;AAAA,QACrD;AAEA,eAAO,QAAQ;AAEf,aAAK,QAAQ,KAAK,QAAQ,MAAM,OAAO;AACvC,aAAK,UAAU;AACf,aAAK,YAAY;AAEjB,aAAK,MAAM,GAAG,SAAS,SAAU,GAAG;AACnC,cAAI,MAAM,SAAS;AAClB,kBAAM,QAAQ,KAAK,OAAO,CAAC;AAAA,UAC5B;AAAA,QACD,CAAC;AAED,aAAK,MAAM,GAAG,WAAW,SAAU,KAAK;AACvC,cAAI,UAAU,KAAK,MAAM,GAAG;AAC5B,cAAI,QAAQ;AAEZ,cAAI,CAAC,QAAQ,SAAS,MAAM,WAAW;AACtC,kBAAM,UAAU,KAAK,OAAO,OAAO;AAAA,UACpC;AAEA,cAAI,QAAQ,SAAS,MAAM,SAAS;AACnC,oBAAQ,IAAI,MAAM,QAAQ,KAAK;AAC/B,kBAAM,QAAQ,QAAQ;AAEtB,kBAAM,QAAQ,KAAK,OAAO,KAAK;AAAA,UAChC;AAAA,QACD,CAAC;AAED,aAAK,MAAM,KAAK,EAAE,OAAc,MAAY,KAAK,QAAQ,KAAK,KAAK,QAAQ,IAAI,CAAC;AAAA,MACjF;AAEA,mBAAaA,SAAQ,CAAC;AAAA,QACrB,KAAK;AAAA,QACL,OAAO,SAAS,iBAAiB,OAAO,IAAI;AAC3C,cAAI,OAAO,KAAK,KAAK,GAAG;AACvB,iBAAK,OAAO,KAAK,IAAI;AAAA,UACtB;AAAA,QACD;AAAA,MACD,GAAG;AAAA,QACF,KAAK;AAAA,QACL,OAAO,SAAS,YAAY,KAAK;AAChC,eAAK,MAAM,KAAK,KAAK,UAAU,EAAE,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC;AAAA,QACvD;AAAA,MACD,GAAG;AAAA,QACF,KAAK;AAAA,QACL,OAAO,SAAS,YAAY;AAC3B,eAAK,MAAM,KAAK,QAAQ;AAAA,QACzB;AAAA,MACD,CAAC,GAAG,CAAC;AAAA,QACJ,KAAK;AAAA,QACL,OAAO,SAAS,SAAS,KAAK,KAAK;AAClC,cAAI,OAAO,KAAK;AACf,mBAAO;AAAA,UACR;AACA,gBAAM,MAAM;AACZ,gBAAM,MAAM;AAEZ,iBAAO;AAAA,QACR;AAAA,MACD,CAAC,CAAC;AAEF,aAAOA;AAAA,IACR,EAAE;AAEF,WAAO,UAAU;AAAA;AAAA;;;AC9HjB,OAAO,iBAAiB;AACxB;AAAA,EACE;AAAA,EAAW;AAAA,EAAY;AAAA,OAClB;;;ACNP,SAAS,oBAAoB;AAC7B,SAAS,YAAY;AACrB,OAAO,UAAU;AACjB,SAAS,WAAW;AACpB,SAAS,UAAU,oBAAoB;AAWhC,IAAM,kBAAkB,KAAK,EAAE;AAEtC,SAAS,kBAAkB,YAAoB,SAA8B;AAC3E,QAAM,eAAe,CAAC,aAAqB;AACzC,WAAO,KAAK,WAAW,QAAQ,IAAI,WAAW,KAAK,KAAK,WAAW,IAAI,GAAG,QAAQ;AAAA,EACpF;AAEA,QAAM,eAAe,aAAa,UAAU;AAC5C,SAAO;AACT;AAEA,SAAS,0BAAgD;AACvD,MAAI,aAAkC,CAAC;AAAA,EAEvC,MAAM,eAAe,aAAa;AAAA,IACxB;AAAA,IAER,YAAY,YAAoB,SAA0D;AACxF,YAAM,qBAAqB,WAAW,QAAQ,aAAa,OAAO,kBAAkB,aAAa,WAAW,CAAC,GAAG,QAAQ;AACxH,UAAI,oBAAoB;AACtB,cAAM,oBAAoB,OAAO;AAAA,MACnC,OAAO;AAEL,cAAM,aAAa;AACnB,cAAM,YAAY,EAAE,GAAG,SAAS,MAAM,KAAK,CAAC;AAAA,MAC9C;AAEA,WAAK,uBAAuB,oBAAI,QAAQ;AACxC,iBAAW,KAAK,IAAI;AAAA,IACtB;AAAA,IAEA,iBAAiB,WAAmB,aAA4B;AAC9D,YAAM,WAAW,CAAC,YAAiB;AACjC,oBAAY,EAAE,MAAM,QAAQ,CAAQ;AAAA,MACtC;AACA,WAAK,qBAAqB,IAAI,aAAa,QAAQ;AACnD,WAAK,GAAG,WAAW,QAAQ;AAAA,IAC7B;AAAA,IAEA,oBAAoB,WAAmB,aAA4B;AACjE,YAAM,WAAW,KAAK,qBAAqB,IAAI,WAAW,KAAK;AAC/D,WAAK,IAAI,WAAW,QAAQ;AAAA,IAC9B;AAAA,EACF;AAEA,QAAM,4BAA4B,MAAM;AAEtC,YAAQ,IAAI,WAAW,IAAI,YAAU,OAAO,UAAU,CAAC,CAAC,EAAE;AAAA,MACxD,MAAM,QAAQ,KAAK,CAAC;AAAA,MACpB,MAAM,QAAQ,KAAK,CAAC;AAAA,IACtB;AACA,iBAAa,CAAC;AAAA,EAChB;AAGA,UAAQ,GAAG,UAAU,MAAM,0BAA0B,CAAC;AACtD,UAAQ,GAAG,WAAW,MAAM,0BAA0B,CAAC;AAAA,EAEvD,MAAM,mBAAmB,OAAO;AAAA,IAC9B,YAAY,MAAkB,SAAgC;AAC5D,YAAM,OAAO,KAAK,IAAI,EAAE,SAAS,OAAO,GAAG,EAAE,GAAG,SAAS,YAAY,KAAK,CAAC;AAAA,IAC7E;AAAA,IAEA,OAAO,SAAS,QAAgB,SAAsD;AACpF,aAAO,IAAI,OAAO,QAAQ,EAAE,GAAG,SAAS,YAAY,KAAK,CAAC;AAAA,IAC5D;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;AAEA,SAAS,iBAAuC;AAC9C,QAAM,aAAa;AAEnB,MAAI,aAAuC,CAAC;AAAA,EAE5C,MAAM,eAAe,WAAW;AAAA,IACtB;AAAA,IAER,YAAY,YAAoB,SAA2D;AAGzF,YAAM,qBACF,WAAW,QAAQ,aACjB,OACA,QAAQ,aAAa,UACnB,WAAW,kBAAkB,UAAU,EAAE,WAAW,MAAM,GAAG,CAAC,KAC9D,kBAAkB,UAAU;AAEpC,UAAI,oBAAoB;AACtB,cAAM,oBAAoB,CAAC,GAAG,EAAE,KAAK,KAAK,CAAC;AAAA,MAC7C,OAAO;AAEL,cAAM,aAAa;AACnB,cAAM,IAAI,SAAS,UAAU,GAAG,CAAC,GAAG,EAAE,KAAK,KAAK,CAAC;AAAA,MACnD;AAEA,iBAAW,KAAK,IAAI;AAEpB,WAAK,UAAU,IAAI,aAAa;AAChC,WAAK,UAAU,CAAC,UAAiB,KAAK,QAAQ,KAAK,SAAS,KAAK;AACjE,WAAK,YAAY,CAAC,YAA0B,KAAK,QAAQ,KAAK,WAAW,OAAO;AAAA,IAClF;AAAA,IAEA,iBAAiB,WAA4B,UAAyB;AACpE,WAAK,QAAQ,YAAY,WAAW,QAAQ;AAAA,IAC9C;AAAA,IAEA,oBAAoB,WAA4B,UAAyB;AACvE,WAAK,QAAQ,eAAe,WAAW,QAAQ;AAAA,IACjD;AAAA,IAEA,YAAY;AACV,mBAAa,WAAW,OAAO,YAAU,WAAW,IAAI;AACxD,aAAO,MAAM,UAAU;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,4BAA4B,MAAM;AAEtC,YAAQ,IAAI,WAAW,IAAI,YAAU,OAAO,UAAU,CAAC,CAAC,EAAE;AAAA,MACxD,MAAM,QAAQ,KAAK,CAAC;AAAA,MACpB,MAAM,QAAQ,KAAK,CAAC;AAAA,IACtB;AACA,iBAAa,CAAC;AAAA,EAChB;AAIA,UAAQ,GAAG,UAAU,MAAM,0BAA0B,CAAC;AACtD,UAAQ,GAAG,WAAW,MAAM,0BAA0B,CAAC;AAAA,EAEvD,MAAM,mBAAmB,OAAO;AAAA,IAC9B,YAAY,MAAkB,SAAgC;AAC5D,YAAM,OAAO,KAAK,IAAI,EAAE,SAAS,OAAO,GAAG,EAAE,GAAG,SAAS,YAAY,KAAK,CAAC;AAAA,IAC7E;AAAA,IAEA,OAAO,SAAS,QAAgB,SAAsD;AACpF,aAAO,IAAI,OAAO,QAAQ,EAAE,GAAG,SAAS,YAAY,KAAK,CAAC;AAAA,IAC5D;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;AAEA,IAAI;AACJ,IAAI;AAEJ,SAAS,6BAAmD;AAC1D,MAAI;AACF,mBAAe;AACf,WAAO,wBAAwB;AAAA,EACjC,SAAS,IAAI;AACX,YAAQ,MAAM,EAAE;AAEhB,YAAQ,MAAM,mFAAmF;AACjG,mBAAe;AACf,WAAO,eAAe;AAAA,EACxB;AACF;AAEO,SAAS,0BAAgD;AAC9D,MAAI,CAAC,gBAAgB;AACnB,qBAAiB,2BAA2B;AAAA,EAC9C;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB;AAChC,MAAI,cAAc;AAChB,WAAO,eAAe,UAAa,KAAK,aAAa,IAAI,OAAO;AAAA,EAClE,OAAO;AAEL,UAAM,eACF,OAAO,4BAA4B,aACjC,wBAAwB,gBAAgB,EAAE,eAC1C,KAAK,SAAS,EAAE,gBAAgB,EAAE;AACxC,WAAO,CAAC;AAAA,EACV;AACF;;;AC1MO,IAAK,gBAAL,kBAAKC,mBAAL;AACL,EAAAA,eAAA,iBAAc;AACd,EAAAA,eAAA,kBAAe;AACf,EAAAA,eAAA,mBAAgB;AAChB,EAAAA,eAAA,gBAAa;AACb,EAAAA,eAAA,gBAAa;AACb,EAAAA,eAAA,sBAAmB;AACnB,EAAAA,eAAA,eAAY;AACZ,EAAAA,eAAA,gBAAa;AARH,SAAAA;AAAA,GAAA;;;ACLL,IAAM,UAAU,OAAO,eAAe;AACtC,IAAM,UAAU,OAAO,eAAe;AACtC,IAAM,aAAa,OAAO,kBAAkB;AAC5C,IAAM,gBAAgB,OAAO,qBAAqB;AAClD,IAAM,UAAU,OAAO,eAAe;;;ACI7C,SAAS,KAAK,SAAwB;AACpC,QAAM,IAAI,MAAM,OAAO;AACzB;AAKO,IAAM,SAAS;AAAA;AAAA,EAEpB,OAAmC,QAAoC;AACrE,WAAO,OAAO,OAAO,KAAK,KAAK,qGAAqG;AAAA,EACtI;AAAA;AAAA,EAEA,OAAmC,QAA0C;AAC3E,WAAO,OAAO,OAAO,KAAK,KAAK,sGAAsG;AAAA,EACvI;AAAA;AAAA,EAEA,UAAsC,QAAiB;AACrD,WAAO,OAAO,UAAU,EAAE;AAAA,EAC5B;AACF;;;AJDA,IAAI,aAAa;AAEjB,SAAS,YAAY,MAAwB;AAC3C,QAAM,QAAkB,CAAC;AACzB,WAAS,QAAQ,GAAG,QAAQ,MAAM,SAAS;AACzC,UAAM,KAAK,KAAK;AAAA,EAClB;AACA,SAAO;AACT;AAEA,SAAS,MAAM,IAAY;AACzB,SAAO,IAAI,QAAQ,aAAW,WAAW,SAAS,EAAE,CAAC;AACvD;AAEA,SAAS,QAAiB,OAAa,QAAuC;AAC5E,SAAO,MAAM,OAAc,CAAC,WAAW,YAAY,CAAC,GAAG,WAAW,GAAG,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;AAC3F;AAEA,SAAS,QAAQ,MAAc;AAC7B,SAAO,KAAK,WAAW,OAAO,GAAG,EAAE,KAAK,EAAE,WAAW,QAAQ,GAAG;AAClE;AAEA,SAAS,aAAwC,aAAwC,OAAoD;AAC3I,SAAO,YAAY,KAAK,EAAE;AAAA,IACxB,OAAqC;AAAA,MACnC,MAAM,YAAY;AAAA,MAClB,cAAc,CAAC;AAAA,IACjB;AAAA,EACF;AACF;AA2DA,IAAM,aAAN,MAAwE;AAAA,EACtE,OAAO,YAAY;AAAA,EAEF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,eAAe,IAAI,QAA+B;AAAA,EAC3D,aAAsB,CAAC;AAAA,EACvB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,YAAgD,CAAC;AAAA,EAEzD,YAAY,aAAwC,eAAsC;AACxF,UAAM,UAAuB,OAAO,kBAAkB,WAAW,EAAE,MAAM,cAAc,IAAI,iBAAiB,CAAC;AAE7G,UAAM,EAAE,OAAO,gBAAgB,IAAI;AAEnC,SAAK,QAAQ,YAAY,gBAAgB,QAAQ,QAAQ,QAAQ,OAAO,YAAY,CAAC,CAAC,EAAE;AACxF,SAAK,UAAU;AACf,SAAK,UAAU,aAAa,aAAa,IAAI;AAE7C,SAAK,kBAAkB,UAAU,WAAW,KAAK,KAAK,YAAY,CAAC;AAEnE,YAAQ,IAAI,KAAK,QAAQ,IAAI,YAAU,OAAO,IAAI,CAAC,EAAE;AAAA,MACnD,MACE,KAAK,aAAa,KAAK;AAAA,QACrB,MAAM,KAAK,QAAQ;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,MACH,CAAC,UAAU;AACT,aAAK,MAAM,yCAAyC,KAAK;AACzD,aAAK,aAAa,MAAM,KAAK;AAC7B,aAAK,WAAW,KAAK,KAAK;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBAA6D;AACnE,UAAM,EAAE,cAAc,EAAE,IAAI,KAAK;AACjC,WAAO,KAAK,QAAQ,KAAK,YAAU,OAAO,aAAa,SAAS,WAAW;AAAA,EAC7E;AAAA,EAEA,MAAc,YAAY,QAAsC,MAAmC;AACjG,UAAM,WAAW,KAAK,QAAQ,QAAQ,MAAM,IAAI;AAEhD,SAAK,MAAM,iBAAiB,KAAK,EAAE,eAAe,QAAQ,KAAK;AAC/D,SAAK,aAAa,KAAK;AAAA,MACrB,QAAQ,KAAK;AAAA,MACb;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI;AACF,YAAM,cAAc,MAAM,KAAK,IAAI,MAAM,OAAO,IAAI;AAEpD,WAAK,MAAM,SAAS,KAAK,EAAE,yBAAyB;AACpD,WAAK,aAAa,KAAK;AAAA,QACrB;AAAA,QACA,QAAQ,KAAK;AAAA,QACb;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,SAAS,IAAI;AACX,YAAM,QAAQ;AACd,WAAK,MAAM,SAAS,KAAK,EAAE,SAAS;AACpC,WAAK,aAAa,KAAK;AAAA,QACrB;AAAA,QACA,QAAQ,KAAK;AAAA,QACb;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,IAAI,QAAsC,MAAmC;AACnF,UAAM,cAAc,YAAY;AAC9B,YAAM,oCAAoC,MAAM;AAC9C,eAAO,eAAe,OAAO,aAAa,OAAO,oBAAkB,mBAAmB,UAAU;AAAA,MAClG;AAGA,YAAM,MAAM,CAAC;AAEb,UAAI;AACF,cAAM,KAAK,YAAY,QAAQ,IAAI;AAAA,MACrC,UAAE;AACA,0CAAkC;AAElC,YAAI,CAAC,KAAK,WAAW;AACnB,eAAK,aAAa;AAAA,QACpB;AAAA,MACF;AAAA,IACF,GAAG;AAEH,WAAO,aAAa,KAAK,UAAU;AAAA,EACrC;AAAA,EAEQ,eAAe;AACrB,SAAK,MAAM,kDAAkD;AAE7D,UAAM,kBAAkB,KAAK,iBAAiB;AAC9C,QAAI,CAAC,gBAAiB;AAEtB,UAAM,WAAW,KAAK,UAAU,MAAM;AACtC,QAAI,CAAC,UAAU;AACb,WAAK,MAAM,qBAAqB;AAChC,WAAK,aAAa,KAAK,EAAE,gDAAqC,CAAC;AAC/D;AAAA,IACF;AAEA,SAAK,IAAI,iBAAiB,QAAQ;AAAA,EACpC;AAAA,EAEQ,eAAe,QAAgB;AACrC,WAAO,IAAI,QAAa,CAAC,SAAS,WAAW;AAC3C,YAAM,oBAAoB,KAAK,OAAO,EAAE,UAAU,CAAC,UAAU;AAC3D,YAAI,MAAM,gDAAwC,MAAM,WAAW,QAAQ;AACzE,4BAAkB,YAAY;AAC9B,kBAAQ,MAAM,WAAW;AAAA,QAC3B,WAAW,MAAM,0CAAqC,MAAM,WAAW,QAAQ;AAC7E,4BAAkB,YAAY;AAC9B,iBAAO,MAAM,KAAK;AAAA,QACpB,WAAW,MAAM,wCAAmC;AAClD,4BAAkB,YAAY;AAC9B,iBAAO,IAAI,MAAM,+CAA+C,CAAC;AAAA,QACnE;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QAAQ,4BAAqC,OAAyB;AAC1E,UAAM,2BAA2B,MAAM,QAAQ,KAAK,SAAS,YAAU,OAAO,YAAY;AAE1F,UAAM,eAAwB,CAAC;AAE/B,UAAM,sBAAsB,KAAK,gBAAgB,UAAU,CAAC,UAAU;AACpE,UAAI,MAAM,wCAAmC;AAC3C,qBAAa,KAAK,MAAM,KAAK;AAAA,MAC/B;AAAA,IACF,CAAC;AAED,QAAI,KAAK,WAAW,SAAS,GAAG;AAC9B,YAAM,KAAK,WAAW,CAAC;AAAA,IACzB;AACA,QAAI,6BAA6B,KAAK,UAAU,WAAW,GAAG;AAC5D,YAAM,QAAQ,WAAW,yBAAyB,CAAC;AACnD,aAAO;AAAA,IACT;AAEA,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,YAAM,eAAe,KAAK,gBAAgB,UAAU;AAAA,QAClD,OAAO;AAAA,QACP,KAAK,OAAO;AACV,cAAI,MAAM,oDAAyC;AACjD,yBAAa,YAAY;AACzB,oBAAQ,MAAM;AAAA,UAChB;AAAA,QACF;AAAA;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,UAAM,QAAQ,WAAW,yBAAyB,CAAC;AACnD,wBAAoB,YAAY;AAEhC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAU,4BAAqC,OAAO;AAC1D,UAAM,oBAAoB,KAAK,QAAQ,yBAAyB;AAEhE,UAAM,mBAAmB,IAAI,QAAiB,CAAC,SAAS,WAAW;AACjE,YAAM,eAAe,KAAK,gBAAgB,UAAU;AAAA,QAClD,OAAO;AAAA,QACP,KAAK,OAAO;AACV,cAAI,MAAM,oDAAyC;AACjD,yBAAa,YAAY;AACzB,oBAAQ,iBAAiB;AAAA,UAC3B,WAAW,MAAM,wCAAmC;AAClD,yBAAa,YAAY;AACzB,mBAAO,MAAM,KAAK;AAAA,UACpB;AAAA,QACF;AAAA;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,UAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,mBAAmB,gBAAgB,CAAC;AAEvE,QAAI,OAAO,SAAS,GAAG;AACrB,YAAM,OAAO,CAAC;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,SAAS;AACP,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,cAAgD;AACpD,UAAM,EAAE,gBAAgB,OAAO,kBAAkB,IAAI,KAAK;AAE1D,QAAI,KAAK,WAAW;AAClB,YAAM,IAAI,MAAM,+DAA+D;AAAA,IACjF;AACA,QAAI,KAAK,WAAW,SAAS,GAAG;AAC9B,YAAM,KAAK,WAAW,CAAC;AAAA,IACzB;AAEA,UAAM,SAAS,KAAK;AACpB,UAAM,iBAAiB,KAAK,eAAe,MAAM;AAEjD,mBAAe,MAAM,CAAC,UAAU;AAG9B,WAAK,MAAM,SAAS,MAAM,aAAa,KAAK;AAAA,IAC9C,CAAC;AAED,UAAM,OAAoC;AAAA,MACxC,QAAQ,MAAM;AACZ,YAAI,CAAC,KAAK,UAAU,SAAS,IAAI,EAAG;AACpC,aAAK,YAAY,KAAK,UAAU,OAAO,cAAY,aAAa,IAAI;AACpE,aAAK,aAAa,KAAK;AAAA,UACrB,QAAQ,KAAK;AAAA,UACb;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,MAAM,eAAe,KAAK,KAAK,cAAc;AAAA,IAC/C;AAEA,QAAI,KAAK,UAAU,UAAU,eAAe;AAC1C,YAAM,IAAI;AAAA,QACR;AAAA,MAGF;AAAA,IACF;AAEA,SAAK,MAAM,kBAAkB,KAAK,EAAE,KAAK;AACzC,SAAK,UAAU,KAAK,IAAI;AAExB,SAAK,aAAa,KAAK;AAAA,MACrB,QAAQ,KAAK;AAAA,MACb;AAAA,IACF,CAAC;AAED,SAAK,aAAa;AAClB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAU,OAAiB;AAC/B,SAAK,YAAY;AACjB,QAAI,CAAC,OAAO;AACV,YAAM,KAAK,UAAU,IAAI;AAAA,IAC3B;AACA,SAAK,aAAa,KAAK;AAAA,MACrB,gBAAgB,CAAC,GAAG,KAAK,SAAS;AAAA,MAClC;AAAA,IACF,CAAC;AACD,SAAK,aAAa,SAAS;AAC3B,UAAM,QAAQ,IAAI,KAAK,QAAQ,IAAI,OAAM,WAAU,OAAO,UAAU,MAAM,OAAO,IAAI,CAAC,CAAC;AAAA,EACzF;AACF;AAKA,SAAS,gBAA2C,aAAwC,eAAsC;AAGhI,SAAO,IAAI,WAAW,aAAa,aAAa;AAClD;AAEE,gBAAwB,YAAY;AAK/B,IAAM,OAAO;","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 = /* @__PURE__ */ __name((thing) => thing && typeof thing === "object" && "__error_marker" in thing && thing.__error_marker === "$$error", "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 = /* @__PURE__ */ __name((value) => value && value.error, "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 = /* @__PURE__ */ __name((thing) => thing && thing.type === MasterMessageType.cancel, "isMasterJobCancelMessage");
120
- const isMasterJobRunMessage = /* @__PURE__ */ __name((thing) => thing && thing.type === MasterMessageType.run, "isMasterJobRunMessage");
121
- const isObservable = /* @__PURE__ */ __name((thing) => isSomeObservable(thing) || isZenObservable(thing), "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
- type: "function"
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: WorkerMessageType.init
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: WorkerMessageType.error,
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: WorkerMessageType.result,
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: WorkerMessageType.running,
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: WorkerMessageType.uncaughtError
149
+ type: "uncaughtError" /* uncaughtError */
192
150
  };
193
151
  implementation.postMessageToMaster(errorMessage);
194
152
  } catch (subError) {
195
- console.error("Not reporting uncaught error back to master thread as it occured while reporting an uncaught error already.\nLatest error:", subError, "\nOriginal error:", 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((value) => postJobResultMessage(jobUID, false, serialize(value)), (error) => {
211
- postJobErrorMessage(jobUID, serialize(error));
212
- activeSubscriptions.delete(jobUID);
213
- }, () => {
214
- postJobResultMessage(jobUID, true);
215
- activeSubscriptions.delete(jobUID);
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
- __name(runFunction, "runFunction");
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
- }, "expose");
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
- __name(assertMessagePort, "assertMessagePort");
299
- var isWorkerRuntime = /* @__PURE__ */ __name(function isWorkerRuntime2() {
262
+ var isWorkerRuntime = function isWorkerRuntime2() {
300
263
  return true;
301
- }, "isWorkerRuntime");
302
- var postMessageToMaster = /* @__PURE__ */ __name(function postMessageToMaster2(data, transferList) {
264
+ };
265
+ var postMessageToMaster = function postMessageToMaster2(data, transferList) {
303
266
  assertMessagePort(parentPort).postMessage(data, transferList);
304
- }, "postMessageToMaster");
305
- var subscribeToMasterMessages = /* @__PURE__ */ __name(function subscribeToMasterMessages2(onMessage) {
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 = /* @__PURE__ */ __name((message) => {
272
+ const messageHandler = (message) => {
310
273
  onMessage(message);
311
- }, "messageHandler");
312
- const unsubscribe = /* @__PURE__ */ __name(() => {
274
+ };
275
+ const unsubscribe = () => {
313
276
  assertMessagePort(parentPort).off("message", messageHandler);
314
- }, "unsubscribe");
277
+ };
315
278
  assertMessagePort(parentPort).on("message", messageHandler);
316
279
  return unsubscribe;
317
- }, "subscribeToMasterMessages");
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);