@ariestools/threads 8.2.0 → 8.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/browser/index-browser.mjs +75 -35
- package/dist/browser/index-browser.mjs.map +4 -4
- package/dist/browser/master/index-browser.mjs +75 -35
- package/dist/browser/master/index-browser.mjs.map +4 -4
- package/dist/browser/master/pool-browser.d.ts +10 -1
- package/dist/browser/master/pool-browser.d.ts.map +1 -1
- package/dist/browser/master/pool-browser.mjs +34 -26
- package/dist/browser/master/pool-browser.mjs.map +3 -3
- package/dist/browser/master/pool-node.d.ts +10 -1
- package/dist/browser/master/pool-node.d.ts.map +1 -1
- package/dist/browser/master/pool-types.d.ts +21 -26
- package/dist/browser/master/pool-types.d.ts.map +1 -1
- package/dist/browser/types/master.d.ts +11 -11
- package/dist/browser/types/master.d.ts.map +1 -1
- package/dist/browser/types/messages.d.ts +23 -25
- package/dist/browser/types/messages.d.ts.map +1 -1
- package/dist/browser/worker/worker.browser.mjs +29 -8
- package/dist/browser/worker/worker.browser.mjs.map +3 -3
- package/dist/neutral/master/pool-browser.d.ts +10 -1
- package/dist/neutral/master/pool-browser.d.ts.map +1 -1
- package/dist/neutral/master/pool-node.d.ts +10 -1
- package/dist/neutral/master/pool-node.d.ts.map +1 -1
- package/dist/neutral/master/pool-types.d.ts +21 -26
- package/dist/neutral/master/pool-types.d.ts.map +1 -1
- package/dist/neutral/master/spawn.mjs +41 -9
- package/dist/neutral/master/spawn.mjs.map +4 -4
- package/dist/neutral/types/master.d.ts +11 -11
- package/dist/neutral/types/master.d.ts.map +1 -1
- package/dist/neutral/types/messages.d.ts +23 -25
- package/dist/neutral/types/messages.d.ts.map +1 -1
- package/dist/neutral/types/messages.mjs +19 -13
- package/dist/neutral/types/messages.mjs.map +3 -3
- package/dist/node/index-node.mjs +75 -35
- package/dist/node/index-node.mjs.map +4 -4
- package/dist/node/master/index-node.mjs +75 -35
- package/dist/node/master/index-node.mjs.map +4 -4
- package/dist/node/master/pool-browser.d.ts +10 -1
- package/dist/node/master/pool-browser.d.ts.map +1 -1
- package/dist/node/master/pool-node.d.ts +10 -1
- package/dist/node/master/pool-node.d.ts.map +1 -1
- package/dist/node/master/pool-node.mjs +34 -26
- package/dist/node/master/pool-node.mjs.map +3 -3
- package/dist/node/master/pool-types.d.ts +21 -26
- package/dist/node/master/pool-types.d.ts.map +1 -1
- package/dist/node/types/master.d.ts +11 -11
- package/dist/node/types/master.d.ts.map +1 -1
- package/dist/node/types/messages.d.ts +23 -25
- package/dist/node/types/messages.d.ts.map +1 -1
- package/dist/node/worker/worker.node.mjs +29 -8
- package/dist/node/worker/worker.node.mjs.map +3 -3
- package/package.json +8 -8
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/serializers.ts", "../../src/common.ts", "../../src/master/get-bundle-url.browser.ts", "../../src/master/implementation.browser.ts", "../../src/master/pool-browser.ts", "../../src/master/pool-types.ts", "../../src/symbols.ts", "../../src/master/thread.ts", "../../src/master/spawn.ts", "../../src/promise.ts", "../../src/master/invocation-proxy.ts", "../../src/observable-promise.ts", "../../src/transferable.ts", "../../src/master/index-browser.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { SerializedError } from './types/messages.ts'\n\n/** A serializer that can convert between a message format and an input type. */\nexport interface Serializer<Msg = JsonSerializable, Input = any> {\n /** Restore an input value from its message representation. */\n deserialize(message: Msg): Input\n /** Convert an input value to its message representation. */\n serialize(input: Input): Msg\n}\n\n/** A serializer implementation that receives a fallback (default) serializer for chaining. */\nexport interface SerializerImplementation<Msg = JsonSerializable, Input = any> {\n /** Restore a value, delegating unsupported messages to the fallback. */\n deserialize(message: Msg, defaultDeserialize: (msg: Msg) => Input): Input\n /** Serialize a value, delegating unsupported inputs to the fallback. */\n serialize(input: Input, defaultSerialize: (inp: Input) => Msg): Msg\n}\n\n/**\n * Extend a base serializer with an additional serializer implementation, creating a chain.\n * @param extend - The base serializer to extend.\n * @param implementation - The new serializer implementation that wraps the base.\n * @returns A new serializer combining both behaviors.\n */\nexport function extendSerializer<MessageType, InputType = any>(\n extend: Serializer<MessageType, InputType>,\n implementation: SerializerImplementation<MessageType, InputType>,\n): Serializer<MessageType, InputType> {\n const fallbackDeserializer = extend.deserialize.bind(extend)\n const fallbackSerializer = extend.serialize.bind(extend)\n\n return {\n deserialize: (message: MessageType): InputType => implementation.deserialize(message, fallbackDeserializer),\n\n serialize: (input: InputType): MessageType => implementation.serialize(input, fallbackSerializer),\n }\n}\n\ntype JsonSerializablePrimitive = string | number | boolean | null\n\ntype JsonSerializableObject = {\n [key: string]: JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[] | undefined\n}\n\n/** A JSON-compatible value that can be serialized for worker message passing. */\nexport type JsonSerializable = JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[]\n\nconst DefaultErrorSerializer: Serializer<SerializedError, Error> = {\n deserialize: (message: SerializedError): Error => {\n const error = Object.create(Error.prototype) as Error\n error.message = message.message\n error.name = message.name\n error.stack = message.stack\n return error\n },\n serialize: (error: Error): SerializedError => ({\n __error_marker: '$$error',\n message: error.message,\n name: error.name,\n stack: error.stack,\n }),\n}\n\nconst isSerializedError = (thing: any): thing is SerializedError =>\n thing != null && typeof thing === 'object' && '__error_marker' in thing && thing.__error_marker === '$$error'\n\n/** Default serializer that handles Error instances and passes other values through. */\nexport const DefaultSerializer: Serializer<JsonSerializable> = {\n deserialize: (message: JsonSerializable): any => isSerializedError(message) ? DefaultErrorSerializer.deserialize(message) : message,\n serialize: (input: any): JsonSerializable => input instanceof Error ? (DefaultErrorSerializer.serialize(input) as any as JsonSerializable) : input,\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {\n JsonSerializable, Serializer, SerializerImplementation,\n} from './serializers.ts'\nimport { DefaultSerializer, extendSerializer } from './serializers.ts'\n\ndeclare global {\n var registeredSerializer: Serializer<JsonSerializable>\n}\n\nglobalThis.registeredSerializer = globalThis.registeredSerializer ?? DefaultSerializer\n\n/**\n * Register a custom serializer to extend the default serialization behavior for worker messages.\n * @param serializer - The serializer implementation to register.\n */\n/** Register a custom serializer to extend the default serialization behavior for worker messages.\n * @param serializer - The serializer implementation to register.\n */\nexport function registerSerializer(serializer: SerializerImplementation<JsonSerializable>) {\n globalThis.registeredSerializer = extendSerializer(globalThis.registeredSerializer, serializer)\n}\n\n/**\n * Deserialize a message using the registered serializer.\n * @param message - The serialized message to deserialize.\n * @returns The deserialized value.\n */\nexport function deserialize(message: JsonSerializable): unknown {\n return globalThis.registeredSerializer.deserialize(message)\n}\n\n/**\n * Serialize an input value using the registered serializer.\n * @param input - The value to serialize.\n * @returns The serialized message.\n */\n/** Serialize an input value using the registered serializer.\n * @param input - The value to serialize.\n * @returns The serialized message.\n */\nexport function serialize(input: any): JsonSerializable {\n return globalThis.registeredSerializer.serialize(input)\n}\n", "// Source: <https://github.com/parcel-bundler/parcel/blob/master/packages/core/parcel-bundler/src/builtins/bundle-url.js>\n\nlet bundleURL: string | undefined\n\nfunction getBundleURLCached(): string {\n if (bundleURL === undefined) {\n bundleURL = getBundleURL()\n }\n\n return bundleURL\n}\n\nfunction getBundleURL(): string {\n // Attempt to find the URL of the current script and use that as the base URL\n try {\n throw new Error('getBundleURL failed')\n } catch (ex) {\n const err = ex as Error\n const matches = ('' + err.stack).match(/(https?|file|ftp|chrome-extension|moz-extension):\\/\\/[^\\n)]+/g)\n if (matches) {\n return getBaseURL(matches[0])\n }\n }\n\n return '/'\n}\n\nfunction getBaseURL(url: string): string {\n return ('' + url).replace(/^((?:https?|file|ftp|chrome-extension|moz-extension):\\/\\/.+)?\\/[^/]+(?:\\?.*)?$/, '$1') + '/'\n}\n\n/** Returns the cached bundle URL of the current script, used to resolve relative worker paths in browser environments. */\nexport { getBundleURLCached as getBundleURL }\n", "import type { ImplementationExport, ThreadsWorkerOptions } from '../types/master.ts'\nimport { getBundleURL } from './get-bundle-url.browser.ts'\n\n/** Default thread pool size based on available hardware concurrency, falling back to 4. */\nexport const defaultPoolSize = typeof navigator !== 'undefined' && navigator.hardwareConcurrency !== 0 ? navigator.hardwareConcurrency : 4\n\nconst isAbsoluteURL = (value: string) => /^[A-Za-z][\\d+.A-Za-z\\-]*:/.test(value)\n\nfunction createSourceBlobURL(code: string): string {\n const blob = new Blob([code], { type: 'application/javascript' })\n return URL.createObjectURL(blob)\n}\n\nfunction selectWorkerImplementation(): ImplementationExport {\n if (typeof Worker === 'undefined') {\n // Might happen on Safari, for instance\n // The idea is to only fail if the constructor is actually used\n return class NoWebWorker {\n constructor() {\n throw new Error(\n \"No web worker implementation available. You might have tried to spawn a worker within a worker in a browser that doesn't support workers in workers.\",\n )\n }\n } as unknown as ImplementationExport\n }\n\n class WebWorker extends Worker {\n constructor(url: string | URL, options?: ThreadsWorkerOptions) {\n if (typeof url === 'string' && options?._baseURL !== undefined && options._baseURL !== '') {\n url = new URL(url, options._baseURL)\n } else if (typeof url === 'string' && !isAbsoluteURL(url) && /^file:\\/\\//i.test(getBundleURL())) {\n url = new URL(url, getBundleURL().replace(/\\/[^/]+$/, '/'))\n if (options?.CORSWorkaround ?? true) {\n url = createSourceBlobURL(`importScripts(${JSON.stringify(url)});`)\n }\n }\n if (\n typeof url === 'string'\n && isAbsoluteURL(url) // Create source code blob loading JS file via `importScripts()`\n // to circumvent worker CORS restrictions\n && (options?.CORSWorkaround ?? true)\n ) {\n url = createSourceBlobURL(`importScripts(${JSON.stringify(url)});`)\n }\n super(url, options)\n }\n }\n\n class BlobWorker extends WebWorker {\n constructor(blob: Blob, options?: ThreadsWorkerOptions) {\n const url = globalThis.URL.createObjectURL(blob)\n super(url, options)\n }\n\n static fromText(source: string, options?: ThreadsWorkerOptions): WebWorker {\n const blob = new globalThis.Blob([source], { type: 'text/javascript' })\n return new BlobWorker(blob, options)\n }\n }\n\n return {\n blob: BlobWorker,\n default: WebWorker,\n }\n}\n\nlet implementation: ImplementationExport\n\n/**\n * Get the browser-specific worker implementation, lazily initializing it on first call.\n * @returns The platform-specific worker implementation export.\n */\nexport function getWorkerImplementation(): ImplementationExport {\n if (implementation === undefined) {\n implementation = selectWorkerImplementation()\n }\n return implementation\n}\n\n/**\n * Check whether the current code is running inside a web worker context.\n * @returns True if running in a worker, false otherwise.\n */\nexport function isWorkerRuntime() {\n const isWindowContext = typeof globalThis !== 'undefined' && typeof Window !== 'undefined' && globalThis instanceof Window\n const workerGlobal = globalThis as typeof globalThis & { postMessage?: unknown }\n return typeof globalThis !== 'undefined' && typeof workerGlobal.postMessage === 'function' && !isWindowContext\n}\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.browser.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\n/** Types and constants associated with browser worker pools. */\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): 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: 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: 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 const debug = this.debug\n const workers = this.workers\n void (async () => {\n try {\n await Promise.all(workers.map(worker => worker.init))\n this.eventSubject.next({\n size: workers.length,\n type: PoolEventType.initialized,\n })\n } catch (error) {\n const initError = error instanceof Error ? error : new Error(String(error))\n debug('Error while initializing pool worker:', initError)\n this.eventSubject.error(initError)\n this.initErrors.push(initError)\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 = false): Promise<Error[]> {\n if (this.initErrors.length > 0) {\n throw this.initErrors[0]\n }\n if (allowResolvingImmediately && this.taskQueue.length === 0) {\n await Promise.allSettled(flatMap(this.workers, worker => worker.runningTasks))\n return []\n }\n\n const getCurrentlyRunningTasks = () => flatMap(this.workers, worker => worker.runningTasks)\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 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 return\n }\n\n subscription.unsubscribe()\n resolve(void 0)\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 = 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 = 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 void (async () => {\n try {\n await taskCompletion\n } 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\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 !== true) {\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-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 /** All workers in the pool have initialized. */\n initialized = 'initialized',\n /** A queued task was canceled before execution. */\n taskCanceled = 'taskCanceled',\n /** A task completed successfully. */\n taskCompleted = 'taskCompleted',\n /** A task failed during execution. */\n taskFailed = 'taskFailed',\n /** A task was added to the queue. */\n taskQueued = 'taskQueued',\n /** The pool has no remaining queued tasks. */\n taskQueueDrained = 'taskQueueDrained',\n /** A worker started executing a task. */\n taskStart = 'taskStart',\n /** The pool and its workers were terminated. */\n terminated = 'terminated',\n}\n\n/** A function that runs a task on a worker thread and returns a promise of the result. */\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: QueuedTask<ThreadType, any>[]\n }\n\n/** Descriptor for a worker in a pool, tracking its initialization and running tasks. */\nexport interface WorkerDescriptor<ThreadType extends Thread> {\n /** Promise resolving to the initialized thread. */\n init: Promise<ThreadType>\n /** Tasks currently executing on the worker. */\n runningTasks: 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", "/** Symbol key for accessing a thread's error observable. */\nexport const $errors = Symbol('thread.errors')\n/** Symbol key for accessing a thread's event observable. */\nexport const $events = Symbol('thread.events')\n/** Symbol key for accessing a thread's terminate function. */\nexport const $terminate = Symbol('thread.terminate')\n/** Symbol key for marking an object as a transferable descriptor. */\nexport const $transferable = Symbol('thread.transferable')\n/** Symbol key for accessing the underlying worker instance of a thread. */\nexport const $worker = Symbol('thread.worker')\n", "import type { Observable } from 'observable-fns'\n\nimport {\n $errors, $events, $terminate,\n} from '../symbols.ts'\nimport type {\n PrivateThreadProps, Thread as ThreadType, WorkerEvent,\n} from '../types/master.ts'\n\nfunction fail(message: string): never {\n throw new Error(message)\n}\n\nfunction readPrivateThreadProp<K extends keyof PrivateThreadProps>(\n thread: ThreadType,\n key: K,\n): PrivateThreadProps[K] | undefined {\n return Reflect.get(thread, key)\n}\n\n/** Re-exported Thread type from the master types module. */\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 readPrivateThreadProp(thread, $errors) ?? fail('Error observable not found. Make sure to pass a thread instance as returned by the spawn() promise.'),\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 readPrivateThreadProp(thread, $events) ?? fail('Events observable not found. Make sure to pass a thread instance as returned by the spawn() promise.'),\n /** Terminate a thread. Remember to terminate every thread when you are done using it. */\n terminate: <ThreadT extends ThreadType>(thread: ThreadT) =>\n readPrivateThreadProp(thread, $terminate)?.() ?? fail('Terminate function not found. Make sure to pass a thread instance as returned by the spawn() promise.'),\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport DebugLogger from 'debug'\nimport { Observable } from 'observable-fns'\n\nimport { deserialize } from '../common.ts'\nimport { createPromiseWithResolver } from '../promise.ts'\nimport {\n $errors, $events, $terminate, $worker,\n} from '../symbols.ts'\nimport type {\n FunctionThread,\n ModuleThread,\n PrivateThreadProps,\n StripAsync,\n Worker as WorkerType,\n WorkerEvent,\n WorkerInternalErrorEvent,\n WorkerMessageEvent,\n WorkerTerminationEvent,\n} from '../types/master.ts'\nimport { WorkerEventType } from '../types/master.ts'\nimport type { WorkerInitMessage, WorkerUncaughtErrorMessage } from '../types/messages.ts'\nimport type { WorkerFunction, WorkerModule } from '../types/worker.ts'\nimport { createProxyFunction, createProxyModule } from './invocation-proxy.ts'\n\ntype ArbitraryWorkerInterface = WorkerFunction & WorkerModule<string> & { somekeythatisneverusedinproductioncode123: 'magicmarker123' }\ntype ArbitraryThreadType = FunctionThread<any, any> & ModuleThread<any>\n\ninterface ProcessEnvGlobal {\n process?: {\n env?: {\n THREADS_WORKER_INIT_TIMEOUT?: string\n }\n }\n}\n\n/** Maps a worker's exposed API type to its corresponding thread type (`FunctionThread` or `ModuleThread`). */\nexport type ExposedToThreadType<Exposed extends WorkerFunction | WorkerModule<any>>\n = Exposed extends ArbitraryWorkerInterface ? ArbitraryThreadType\n : Exposed extends WorkerFunction ? FunctionThread<Parameters<Exposed>, StripAsync<ReturnType<Exposed>>>\n : Exposed extends WorkerModule<any> ? ModuleThread<Exposed>\n : never\n\nconst debugMessages = DebugLogger('threads:master:messages')\nconst debugSpawn = DebugLogger('threads:master:spawn')\nconst debugThreadUtils = DebugLogger('threads:master:thread-utils')\n\nconst isInitMessage = (data: any): data is WorkerInitMessage => data?.type === 'init' as const\nconst isUncaughtErrorMessage = (data: any): data is WorkerUncaughtErrorMessage => data?.type === 'uncaughtError' as const\nconst workerInitTimeout = (globalThis as ProcessEnvGlobal).process?.env?.THREADS_WORKER_INIT_TIMEOUT\n\nconst initMessageTimeout\n = workerInitTimeout !== undefined && workerInitTimeout !== ''\n ? Number(workerInitTimeout)\n : 10_000\n\nasync function withTimeout<T>(promise: Promise<T>, timeoutInMs: number, errorMessage: string): Promise<T> {\n let timeoutHandle: any\n\n const timeout = new Promise<never>((resolve, reject) => {\n timeoutHandle = setTimeout(() => reject(new Error(errorMessage)), timeoutInMs)\n })\n const result = await Promise.race([promise, timeout])\n\n clearTimeout(timeoutHandle)\n return result\n}\n\nfunction receiveInitMessage(worker: WorkerType): Promise<WorkerInitMessage> {\n return new Promise((resolve, reject) => {\n const messageHandler = ((event: MessageEvent) => {\n debugMessages('Message from worker before finishing initialization:', event.data)\n if (isInitMessage(event.data)) {\n worker.removeEventListener('message', messageHandler)\n resolve(event.data)\n } else if (isUncaughtErrorMessage(event.data)) {\n worker.removeEventListener('message', messageHandler)\n reject(deserialize(event.data.error))\n }\n }) as EventListener\n worker.addEventListener('message', messageHandler)\n })\n}\n\nfunction createEventObservable(worker: WorkerType, workerTermination: Promise<any>): Observable<WorkerEvent> {\n return new Observable<WorkerEvent>((observer) => {\n const messageHandler = ((messageEvent: MessageEvent) => {\n const workerEvent: WorkerMessageEvent<any> = {\n data: messageEvent.data,\n type: WorkerEventType.message,\n }\n observer.next(workerEvent)\n }) as EventListener\n const rejectionHandler = ((errorEvent: PromiseRejectionEvent) => {\n debugThreadUtils('Unhandled promise rejection event in thread:', errorEvent)\n const workerEvent: WorkerInternalErrorEvent = {\n error: new Error(errorEvent.reason),\n type: WorkerEventType.internalError,\n }\n observer.next(workerEvent)\n }) as EventListener\n worker.addEventListener('message', messageHandler)\n worker.addEventListener('unhandledrejection', rejectionHandler)\n\n void (async () => {\n await workerTermination\n const terminationEvent: WorkerTerminationEvent = { type: WorkerEventType.termination }\n worker.removeEventListener('message', messageHandler)\n worker.removeEventListener('unhandledrejection', rejectionHandler)\n observer.next(terminationEvent)\n observer.complete()\n })()\n })\n}\n\nfunction createTerminator(worker: WorkerType): { terminate: () => Promise<void>; termination: Promise<void> } {\n const [termination, resolver] = createPromiseWithResolver<void>()\n const terminate = async () => {\n debugThreadUtils('Terminating worker')\n // Newer versions of worker_threads workers return a promise\n await worker.terminate()\n resolver()\n }\n return { terminate, termination }\n}\n\nfunction setPrivateThreadProps<T>(\n raw: T,\n worker: WorkerType,\n workerEvents: Observable<WorkerEvent>,\n terminate: () => Promise<void>,\n): T & PrivateThreadProps {\n const workerErrors = workerEvents\n .filter(event => event.type === WorkerEventType.internalError)\n .map(errorEvent => (errorEvent as WorkerInternalErrorEvent).error)\n\n const result = raw as T & PrivateThreadProps\n const privateProps: [symbol, PropertyDescriptor][] = [\n [$errors, { enumerable: false, value: workerErrors }],\n [$events, { enumerable: false, value: workerEvents }],\n [$terminate, { enumerable: false, value: terminate }],\n [$worker, { enumerable: false, value: worker }],\n ]\n for (const [key, descriptor] of privateProps) {\n Object.defineProperty(result, key, descriptor)\n }\n return result\n}\n\n/**\n * Spawn a new thread. Takes a fresh worker instance, wraps it in a thin\n * abstraction layer to provide the transparent API and verifies that\n * the worker has initialized successfully.\n *\n * @param worker Instance of `Worker`. Either a web worker or `worker_threads` worker.\n * @param [options]\n * @param [options.timeout] Init message timeout. Default: 10000 or set by environment variable.\n */\nexport async function spawn<Exposed extends WorkerFunction | WorkerModule<any> = ArbitraryWorkerInterface>(\n worker: WorkerType,\n options?: { timeout?: number },\n): Promise<ExposedToThreadType<Exposed>> {\n debugSpawn('Initializing new thread')\n\n const timeout = options?.timeout ?? initMessageTimeout\n const initMessage = await withTimeout(\n receiveInitMessage(worker),\n timeout,\n `Timeout: Did not receive an init message from worker after ${timeout}ms. Make sure the worker calls expose().`,\n )\n const exposed = initMessage.exposed\n\n const { termination, terminate } = createTerminator(worker)\n const events = createEventObservable(worker, termination)\n\n if (exposed.type === 'function') {\n const proxy = createProxyFunction(worker)\n return setPrivateThreadProps(proxy, worker, events, terminate) as ExposedToThreadType<Exposed>\n }\n if (exposed.type === 'module') {\n const proxy = createProxyModule(worker, exposed.methods)\n return setPrivateThreadProps(proxy, worker, events, terminate) as ExposedToThreadType<Exposed>\n }\n const type = (exposed as WorkerInitMessage['exposed']).type\n throw new Error(`Worker init message states unexpected type of expose(): ${type}`)\n}\n", "// eslint-disable-next-line unicorn/no-useless-undefined\nconst doNothing = () => undefined\n\n/**\n * Creates a new promise and exposes its resolver function.\n * Use with care!\n */\nexport function createPromiseWithResolver<T>(): [Promise<T>, (result: T) => void] {\n let alreadyResolved = false\n let resolvedTo: T\n let resolver: (value: T | PromiseLike<T>) => void = doNothing\n\n const promise = new Promise<T>((resolve) => {\n if (alreadyResolved) {\n resolve(resolvedTo)\n } else {\n resolver = resolve\n }\n })\n const exposedResolver = (value: T) => {\n alreadyResolved = true\n resolvedTo = value\n resolver(resolvedTo)\n }\n return [promise, exposedResolver]\n}\n", "/// <reference lib=\"webworker\" />\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/*\n * This source file contains the code for proxying calls in the master thread to calls in the workers\n * by `.postMessage()`-ing.\n *\n * Keep in mind that this code can make or break the program's performance! Need to optimize more\u2026\n */\n\nimport DebugLogger from 'debug'\nimport { multicast, Observable } from 'observable-fns'\n\nimport { deserialize, serialize } from '../common.ts'\nimport { ObservablePromise } from '../observable-promise.ts'\nimport { isTransferDescriptor } from '../transferable.ts'\nimport type {\n ModuleMethods, ModuleProxy, ProxyableFunction, Worker as WorkerType,\n} from '../types/master.ts'\nimport type {\n MasterJobCancelMessage,\n MasterJobRunMessage,\n WorkerJobErrorMessage,\n WorkerJobResultMessage,\n WorkerJobStartMessage,\n} from '../types/messages.ts'\nimport {\n MasterMessageType,\n WorkerMessageType,\n} from '../types/messages.ts'\n\nconst debugMessages = DebugLogger('threads:master:messages')\n\nlet nextJobUID = 1\n\nconst dedupe = <T>(array: T[]): T[] => [...new Set(array)]\n\nconst isJobErrorMessage = (data: any): data is WorkerJobErrorMessage => data?.type === WorkerMessageType.error\nconst isJobResultMessage = (data: any): data is WorkerJobResultMessage => data?.type === WorkerMessageType.result\nconst isJobStartMessage = (data: any): data is WorkerJobStartMessage => data?.type === WorkerMessageType.running\n\nfunction createObservableForJob<ResultType>(worker: WorkerType, jobUID: number): Observable<ResultType> {\n return new Observable((observer) => {\n let asyncType: 'observable' | 'promise' | undefined\n\n const messageHandler = ((event: MessageEvent) => {\n debugMessages('Message from worker:', event.data)\n if (event.data?.uid !== jobUID) return\n\n if (isJobStartMessage(event.data)) {\n asyncType = event.data.resultType\n } else if (isJobResultMessage(event.data)) {\n if (asyncType === 'promise') {\n if (event.data.payload !== undefined) {\n observer.next(deserialize(event.data.payload) as ResultType)\n }\n observer.complete()\n worker.removeEventListener('message', messageHandler)\n } else {\n if (event.data.payload !== undefined) {\n observer.next(deserialize(event.data.payload) as ResultType)\n }\n if (event.data.complete) {\n observer.complete()\n worker.removeEventListener('message', messageHandler)\n }\n }\n } else if (isJobErrorMessage(event.data)) {\n const error = deserialize(event.data.error as any)\n if (asyncType === 'promise' || asyncType === undefined) {\n observer.error(error)\n } else {\n observer.error(error)\n }\n worker.removeEventListener('message', messageHandler)\n }\n }) as EventListener\n\n worker.addEventListener('message', messageHandler)\n\n return () => {\n if (asyncType === 'observable' || asyncType === undefined) {\n const cancelMessage: MasterJobCancelMessage = {\n type: MasterMessageType.cancel,\n uid: jobUID,\n }\n worker.postMessage(cancelMessage)\n }\n worker.removeEventListener('message', messageHandler)\n }\n })\n}\n\nfunction prepareArguments(rawArgs: any[]): { args: any[]; transferables: Transferable[] } {\n if (rawArgs.length === 0) {\n // Exit early if possible\n return {\n args: [],\n transferables: [],\n }\n }\n\n const args: any[] = []\n const transferables: Transferable[] = []\n\n for (const arg of rawArgs) {\n if (isTransferDescriptor(arg)) {\n args.push(serialize(arg.send))\n transferables.push(...arg.transferables)\n } else {\n args.push(serialize(arg))\n }\n }\n\n return {\n args,\n transferables: transferables.length === 0 ? transferables : dedupe(transferables),\n }\n}\n\n/**\n * Create a proxy function that forwards calls to a worker thread via postMessage.\n * @param worker - The worker to send messages to.\n * @param method - Optional method name for module-style workers.\n * @returns A proxied function that returns an `ObservablePromise`.\n */\nexport function createProxyFunction<Args extends any[], ReturnType>(worker: WorkerType, method?: string) {\n return ((...rawArgs: Args) => {\n const uid = nextJobUID++\n const { args, transferables } = prepareArguments(rawArgs)\n const runMessage: MasterJobRunMessage = {\n args,\n method,\n type: MasterMessageType.run,\n uid,\n }\n\n debugMessages('Sending command to run function to worker:', runMessage)\n\n try {\n worker.postMessage(runMessage, transferables)\n } catch (error) {\n return ObservablePromise.from(Promise.reject(error))\n }\n\n return ObservablePromise.from(multicast(createObservableForJob<ReturnType>(worker, uid)))\n }) as any as ProxyableFunction<Args, ReturnType>\n}\n\n/**\n * Create a proxy module that maps method names to proxy functions forwarding calls to a worker.\n * @param worker - The worker to send messages to.\n * @param methodNames - The method names exposed by the worker module.\n * @returns A proxy object with methods matching the worker module's API.\n */\nexport function createProxyModule<Methods extends ModuleMethods>(worker: WorkerType, methodNames: string[]): ModuleProxy<Methods> {\n const proxy: any = {}\n\n for (const methodName of methodNames) {\n proxy[methodName] = createProxyFunction(worker, methodName)\n }\n\n return proxy\n}\n", "/* eslint-disable unicorn/no-thenable */\n/* eslint-disable @typescript-eslint/member-ordering */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-this-alias */\n/* eslint-disable unicorn/no-this-assignment */\nimport type { ObservableLike, SubscriptionObserver } from 'observable-fns'\nimport { Observable } from 'observable-fns'\n\ntype OnFulfilled<T, Result = void> = (value: T) => Result\ntype OnRejected<Result = void> = (error: Error) => Result\n\ntype Initializer<T> = (observer: SubscriptionObserver<T>) => UnsubscribeFn | void\n\ntype Thenable<T> = { then: (onFulfilled?: (value: T) => any, onRejected?: (error: any) => any) => any }\n\ntype UnsubscribeFn = () => void\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst doNothing = () => {}\nconst returnInput = <T>(input: T): T => input\nconst runDeferred = (fn: () => void) => {\n void (async () => {\n await Promise.resolve()\n fn()\n })()\n}\n\nfunction fail(error: Error): never {\n throw error\n}\n\nfunction isThenable(thing: any): thing is Thenable<any> {\n return thing != null && typeof thing.then === 'function'\n}\n\n/**\n * Creates a hybrid, combining the APIs of an Observable and a Promise.\n *\n * It is used to proxy async process states when we are initially not sure\n * if that async process will yield values once (-> Promise) or multiple\n * times (-> Observable).\n *\n * Note that the observable promise inherits some of the observable's characteristics:\n * The `init` function will be called *once for every time anyone subscribes to it*.\n *\n * If this is undesired, derive a hot observable from it using `makeHot()` and\n * subscribe to that.\n */\nexport class ObservablePromise<T> extends Observable<T> implements Promise<T> {\n /** Standard object tag identifying this hybrid promise. */\n readonly [Symbol.toStringTag] = '[object ObservablePromise]'\n private initHasRun = false\n private fulfillmentCallbacks: OnFulfilled<T>[] = []\n private rejectionCallbacks: OnRejected[] = []\n\n private firstValue: T | undefined\n private firstValueSet = false\n private rejection: Error | undefined\n private state: 'fulfilled' | 'pending' | 'rejected' = 'pending'\n\n /**\n * Create an observable promise.\n * @param init Initializes each observable subscription.\n */\n constructor(init: Initializer<T>) {\n super((originalObserver: SubscriptionObserver<T>) => {\n const self = this\n const observer: SubscriptionObserver<T> = {\n ...originalObserver,\n complete() {\n originalObserver.complete()\n self.onCompletion()\n },\n error(error: Error) {\n originalObserver.error(error)\n self.onError(error)\n },\n next(value: T) {\n originalObserver.next(value)\n self.onNext(value)\n },\n }\n\n try {\n this.initHasRun = true\n return init(observer)\n } catch (error) {\n observer.error(error)\n }\n })\n }\n\n private onNext(value: T) {\n if (this.firstValueSet) {\n return\n }\n\n this.firstValue = value\n this.firstValueSet = true\n }\n\n private onError(error: Error) {\n this.state = 'rejected'\n this.rejection = error\n\n for (const onRejected of this.rejectionCallbacks) {\n // Promisifying the call to turn errors into unhandled promise rejections\n // instead of them failing sync and cancelling the iteration\n runDeferred(() => onRejected(error))\n }\n }\n\n private onCompletion() {\n this.state = 'fulfilled'\n\n for (const onFulfilled of this.fulfillmentCallbacks) {\n // Promisifying the call to turn errors into unhandled promise rejections\n // instead of them failing sync and cancelling the iteration\n runDeferred(() => onFulfilled(this.firstValue as T))\n }\n }\n\n private createPromise<TResult1 = T, TResult2 = never>(\n onFulfilledRaw?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onRejectedRaw?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n const onFulfilled: OnFulfilled<T, TResult1> = onFulfilledRaw || (returnInput as any)\n const onRejected = onRejectedRaw || fail\n let onRejectedCalled = false\n\n return new Promise<TResult1 | TResult2>((resolve, reject) => {\n const rejectionCallback = (error: Error) => {\n if (onRejectedCalled) return\n onRejectedCalled = true\n\n try {\n resolve(onRejected(error))\n } catch (anotherError) {\n reject(anotherError)\n }\n }\n const fulfillmentCallback = (value: T) => {\n try {\n resolve(onFulfilled(value))\n } catch (ex) {\n const error = ex as Error\n rejectionCallback(error)\n }\n }\n if (!this.initHasRun) {\n this.subscribe({ error: rejectionCallback })\n }\n if (this.state === 'fulfilled') {\n return resolve(onFulfilled(this.firstValue as T))\n }\n if (this.state === 'rejected') {\n onRejectedCalled = true\n return resolve(onRejected(this.rejection!))\n }\n this.fulfillmentCallbacks.push(fulfillmentCallback)\n this.rejectionCallbacks.push(rejectionCallback)\n })\n }\n\n /** Register handlers for the first emitted value or a rejection. */\n then<TResult1 = T, TResult2 = never>(\n onFulfilledRaw?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onRejectedRaw?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n return this.createPromise(onFulfilledRaw, onRejectedRaw)\n }\n\n /** Register a rejection handler. */\n catch<Result = never>(onRejected: ((error: Error) => Promise<Result> | Result) | null | undefined) {\n return this.createPromise(undefined, onRejected)\n }\n\n /** Register a handler invoked after fulfillment or rejection. */\n finally(onCompleted?: (() => void) | null) {\n const handler = onCompleted || doNothing\n return this.createPromise(\n (value: T) => {\n handler()\n return value\n },\n () => handler(),\n ) as Promise<T>\n }\n\n /** Convert an observable, thenable, or array-like value to an observable promise. */\n static override from<T>(thing: Observable<T> | ObservableLike<T> | ArrayLike<T> | Thenable<T>): ObservablePromise<T> {\n return isThenable(thing)\n ? new ObservablePromise((observer) => {\n void (async () => {\n try {\n const value = await thing\n observer.next(value)\n observer.complete()\n } catch (error) {\n observer.error(error)\n }\n })()\n })\n : (super.from(thing) as ObservablePromise<T>)\n }\n}\n", "/// <reference lib=\"webworker\" />\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { $transferable } from './symbols.ts'\n\n/** Descriptor wrapping a value with its associated transferable objects for zero-copy messaging. */\nexport interface TransferDescriptor<T = any> {\n /** Marker identifying the object as a transfer descriptor. */\n [$transferable]: true\n /** Payload sent to the receiving thread. */\n send: T\n /** Objects whose ownership is transferred with the payload. */\n transferables: Transferable[]\n}\n\nfunction isTransferable(thing: any): thing is Transferable {\n if (thing == null || typeof thing !== 'object') return false\n // Don't check too thoroughly, since the list of transferable things in JS might grow over time\n return true\n}\n\n/**\n * Check whether a value is a `TransferDescriptor` created by `Transfer()`.\n * @param thing - The value to check.\n * @returns True if the value is a transfer descriptor.\n */\nexport function isTransferDescriptor(thing: any): thing is TransferDescriptor {\n return thing != null && typeof thing === 'object' && Reflect.get(thing, $transferable) === true\n}\n\n/**\n * Mark a transferable object as such, so it will no be serialized and\n * deserialized on messaging with the main thread, but to transfer\n * ownership of it to the receiving thread.\n *\n * Only works with array buffers, message ports and few more special\n * types of objects, but it's much faster than serializing and\n * deserializing them.\n *\n * Note:\n * The transferable object cannot be accessed by this thread again\n * unless the receiving thread transfers it back again!\n *\n * @see <https://developers.google.com/web/updates/2011/12/Transferable-Objects-Lightning-Fast>\n */\nexport function Transfer(transferable: Transferable): TransferDescriptor\n\n/**\n * Mark transferable objects within an arbitrary object or array as\n * being a transferable object. They will then not be serialized\n * and deserialized on messaging with the main thread, but ownership\n * of them will be tranferred to the receiving thread.\n *\n * Only array buffers, message ports and few more special types of\n * objects can be transferred, but it's much faster than serializing and\n * deserializing them.\n *\n * Note:\n * The transferable object cannot be accessed by this thread again\n * unless the receiving thread transfers it back again!\n *\n * @param payload Value sent to the receiving thread.\n * @param transferables Array buffers, message ports, or similar objects transferred with the payload.\n * @see <https://developers.google.com/web/updates/2011/12/Transferable-Objects-Lightning-Fast>\n */\nexport function Transfer<T>(payload: T, transferables: Transferable[]): TransferDescriptor\n\n/** Create a transfer descriptor for a payload and its transferable objects. */\nexport function Transfer<T>(payload: T, transferables?: Transferable[]): TransferDescriptor {\n console.log('Transfer')\n if (!transferables) {\n if (!isTransferable(payload)) throw new Error('Not transferable')\n transferables = [payload]\n }\n\n const descriptor = {\n send: payload,\n transferables,\n } as TransferDescriptor\n\n Object.defineProperty(descriptor, $transferable, { value: true })\n return descriptor\n}\n", "import type { BlobWorker as BlobWorkerClass, Worker as WorkerType } from '../types/master.ts'\nimport * as BrowserImplementation from './implementation.browser.ts'\n\nexport type { FunctionThread, ModuleThread } from '../types/master.ts'\nexport { Pool } from './pool-browser.ts'\nexport { spawn } from './spawn.ts'\nexport { Thread } from './thread.ts'\n\n/** Constructor type for the browser blob-worker implementation. */\nexport type BlobWorker = typeof BlobWorkerClass\n/** Browser worker instance type used by spawned threads. */\nexport type Worker = WorkerType\n\n/** Separate class to spawn workers from source code blobs or strings. */\nexport const BlobWorker = BrowserImplementation.getWorkerImplementation().blob\n\n/** Worker implementation. Either web worker or a Node.js Worker class. */\nexport const Worker = BrowserImplementation.getWorkerImplementation().default\n\nexport { isWorkerRuntime } from './implementation.browser.ts'\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["implementation", "BlobWorker", "
|
|
3
|
+
"sources": ["../../src/serializers.ts", "../../src/common.ts", "../../src/master/get-bundle-url.browser.ts", "../../src/master/implementation.browser.ts", "../../src/master/pool-browser.ts", "../../src/master/pool-types.ts", "../../src/symbols.ts", "../../src/master/thread.ts", "../../src/master/spawn.ts", "../../src/promise.ts", "../../src/types/master.ts", "../../src/master/invocation-proxy.ts", "../../src/observable-promise.ts", "../../src/transferable.ts", "../../src/types/messages.ts", "../../src/master/index-browser.ts"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { SerializedError } from './types/messages.ts'\n\n/** A serializer that can convert between a message format and an input type. */\nexport interface Serializer<Msg = JsonSerializable, Input = any> {\n /** Restore an input value from its message representation. */\n deserialize(message: Msg): Input\n /** Convert an input value to its message representation. */\n serialize(input: Input): Msg\n}\n\n/** A serializer implementation that receives a fallback (default) serializer for chaining. */\nexport interface SerializerImplementation<Msg = JsonSerializable, Input = any> {\n /** Restore a value, delegating unsupported messages to the fallback. */\n deserialize(message: Msg, defaultDeserialize: (msg: Msg) => Input): Input\n /** Serialize a value, delegating unsupported inputs to the fallback. */\n serialize(input: Input, defaultSerialize: (inp: Input) => Msg): Msg\n}\n\n/**\n * Extend a base serializer with an additional serializer implementation, creating a chain.\n * @param extend - The base serializer to extend.\n * @param implementation - The new serializer implementation that wraps the base.\n * @returns A new serializer combining both behaviors.\n */\nexport function extendSerializer<MessageType, InputType = any>(\n extend: Serializer<MessageType, InputType>,\n implementation: SerializerImplementation<MessageType, InputType>,\n): Serializer<MessageType, InputType> {\n const fallbackDeserializer = extend.deserialize.bind(extend)\n const fallbackSerializer = extend.serialize.bind(extend)\n\n return {\n deserialize: (message: MessageType): InputType => implementation.deserialize(message, fallbackDeserializer),\n\n serialize: (input: InputType): MessageType => implementation.serialize(input, fallbackSerializer),\n }\n}\n\ntype JsonSerializablePrimitive = string | number | boolean | null\n\ntype JsonSerializableObject = {\n [key: string]: JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[] | undefined\n}\n\n/** A JSON-compatible value that can be serialized for worker message passing. */\nexport type JsonSerializable = JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[]\n\nconst DefaultErrorSerializer: Serializer<SerializedError, Error> = {\n deserialize: (message: SerializedError): Error => {\n const error = Object.create(Error.prototype) as Error\n error.message = message.message\n error.name = message.name\n error.stack = message.stack\n return error\n },\n serialize: (error: Error): SerializedError => ({\n __error_marker: '$$error',\n message: error.message,\n name: error.name,\n stack: error.stack,\n }),\n}\n\nconst isSerializedError = (thing: any): thing is SerializedError =>\n thing != null && typeof thing === 'object' && '__error_marker' in thing && thing.__error_marker === '$$error'\n\n/** Default serializer that handles Error instances and passes other values through. */\nexport const DefaultSerializer: Serializer<JsonSerializable> = {\n deserialize: (message: JsonSerializable): any => isSerializedError(message) ? DefaultErrorSerializer.deserialize(message) : message,\n serialize: (input: any): JsonSerializable => input instanceof Error ? (DefaultErrorSerializer.serialize(input) as any as JsonSerializable) : input,\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {\n JsonSerializable, Serializer, SerializerImplementation,\n} from './serializers.ts'\nimport { DefaultSerializer, extendSerializer } from './serializers.ts'\n\ndeclare global {\n var registeredSerializer: Serializer<JsonSerializable>\n}\n\nglobalThis.registeredSerializer = globalThis.registeredSerializer ?? DefaultSerializer\n\n/**\n * Register a custom serializer to extend the default serialization behavior for worker messages.\n * @param serializer - The serializer implementation to register.\n */\n/** Register a custom serializer to extend the default serialization behavior for worker messages.\n * @param serializer - The serializer implementation to register.\n */\nexport function registerSerializer(serializer: SerializerImplementation<JsonSerializable>) {\n globalThis.registeredSerializer = extendSerializer(globalThis.registeredSerializer, serializer)\n}\n\n/**\n * Deserialize a message using the registered serializer.\n * @param message - The serialized message to deserialize.\n * @returns The deserialized value.\n */\nexport function deserialize(message: JsonSerializable): unknown {\n return globalThis.registeredSerializer.deserialize(message)\n}\n\n/**\n * Serialize an input value using the registered serializer.\n * @param input - The value to serialize.\n * @returns The serialized message.\n */\n/** Serialize an input value using the registered serializer.\n * @param input - The value to serialize.\n * @returns The serialized message.\n */\nexport function serialize(input: any): JsonSerializable {\n return globalThis.registeredSerializer.serialize(input)\n}\n", "// Source: <https://github.com/parcel-bundler/parcel/blob/master/packages/core/parcel-bundler/src/builtins/bundle-url.js>\n\nlet bundleURL: string | undefined\n\nfunction getBundleURLCached(): string {\n if (bundleURL === undefined) {\n bundleURL = getBundleURL()\n }\n\n return bundleURL\n}\n\nfunction getBundleURL(): string {\n // Attempt to find the URL of the current script and use that as the base URL\n try {\n throw new Error('getBundleURL failed')\n } catch (ex) {\n const err = ex as Error\n const matches = ('' + err.stack).match(/(https?|file|ftp|chrome-extension|moz-extension):\\/\\/[^\\n)]+/g)\n if (matches) {\n return getBaseURL(matches[0])\n }\n }\n\n return '/'\n}\n\nfunction getBaseURL(url: string): string {\n return ('' + url).replace(/^((?:https?|file|ftp|chrome-extension|moz-extension):\\/\\/.+)?\\/[^/]+(?:\\?.*)?$/, '$1') + '/'\n}\n\n/** Returns the cached bundle URL of the current script, used to resolve relative worker paths in browser environments. */\nexport { getBundleURLCached as getBundleURL }\n", "import type { ImplementationExport, ThreadsWorkerOptions } from '../types/master.ts'\nimport { getBundleURL } from './get-bundle-url.browser.ts'\n\n/** Default thread pool size based on available hardware concurrency, falling back to 4. */\nexport const defaultPoolSize = typeof navigator !== 'undefined' && navigator.hardwareConcurrency !== 0 ? navigator.hardwareConcurrency : 4\n\nconst isAbsoluteURL = (value: string) => /^[A-Za-z][\\d+.A-Za-z\\-]*:/.test(value)\n\nfunction createSourceBlobURL(code: string): string {\n const blob = new Blob([code], { type: 'application/javascript' })\n return URL.createObjectURL(blob)\n}\n\nfunction selectWorkerImplementation(): ImplementationExport {\n if (typeof Worker === 'undefined') {\n // Might happen on Safari, for instance\n // The idea is to only fail if the constructor is actually used\n return class NoWebWorker {\n constructor() {\n throw new Error(\n \"No web worker implementation available. You might have tried to spawn a worker within a worker in a browser that doesn't support workers in workers.\",\n )\n }\n } as unknown as ImplementationExport\n }\n\n class WebWorker extends Worker {\n constructor(url: string | URL, options?: ThreadsWorkerOptions) {\n if (typeof url === 'string' && options?._baseURL !== undefined && options._baseURL !== '') {\n url = new URL(url, options._baseURL)\n } else if (typeof url === 'string' && !isAbsoluteURL(url) && /^file:\\/\\//i.test(getBundleURL())) {\n url = new URL(url, getBundleURL().replace(/\\/[^/]+$/, '/'))\n if (options?.CORSWorkaround ?? true) {\n url = createSourceBlobURL(`importScripts(${JSON.stringify(url)});`)\n }\n }\n if (\n typeof url === 'string'\n && isAbsoluteURL(url) // Create source code blob loading JS file via `importScripts()`\n // to circumvent worker CORS restrictions\n && (options?.CORSWorkaround ?? true)\n ) {\n url = createSourceBlobURL(`importScripts(${JSON.stringify(url)});`)\n }\n super(url, options)\n }\n }\n\n class BlobWorker extends WebWorker {\n constructor(blob: Blob, options?: ThreadsWorkerOptions) {\n const url = globalThis.URL.createObjectURL(blob)\n super(url, options)\n }\n\n static fromText(source: string, options?: ThreadsWorkerOptions): WebWorker {\n const blob = new globalThis.Blob([source], { type: 'text/javascript' })\n return new BlobWorker(blob, options)\n }\n }\n\n return {\n blob: BlobWorker,\n default: WebWorker,\n }\n}\n\nlet implementation: ImplementationExport\n\n/**\n * Get the browser-specific worker implementation, lazily initializing it on first call.\n * @returns The platform-specific worker implementation export.\n */\nexport function getWorkerImplementation(): ImplementationExport {\n if (implementation === undefined) {\n implementation = selectWorkerImplementation()\n }\n return implementation\n}\n\n/**\n * Check whether the current code is running inside a web worker context.\n * @returns True if running in a worker, false otherwise.\n */\nexport function isWorkerRuntime() {\n const isWindowContext = typeof globalThis !== 'undefined' && typeof Window !== 'undefined' && globalThis instanceof Window\n const workerGlobal = globalThis as typeof globalThis & { postMessage?: unknown }\n return typeof globalThis !== 'undefined' && typeof workerGlobal.postMessage === 'function' && !isWindowContext\n}\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.browser.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\n/** Types and constants associated with browser worker pools. */\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): 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: 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: 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 const debug = this.debug\n const workers = this.workers\n void (async () => {\n try {\n await Promise.all(workers.map(worker => worker.init))\n this.eventSubject.next({\n size: workers.length,\n type: PoolEventType.initialized,\n })\n } catch (error) {\n const initError = error instanceof Error ? error : new Error(String(error))\n debug('Error while initializing pool worker:', initError)\n this.eventSubject.error(initError)\n this.initErrors.push(initError)\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 = false): Promise<Error[]> {\n if (this.initErrors.length > 0) {\n throw this.initErrors[0]\n }\n if (allowResolvingImmediately && this.taskQueue.length === 0) {\n await Promise.allSettled(flatMap(this.workers, worker => worker.runningTasks))\n return []\n }\n\n const getCurrentlyRunningTasks = () => flatMap(this.workers, worker => worker.runningTasks)\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 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 return\n }\n\n subscription.unsubscribe()\n resolve(void 0)\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 = 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 = 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 void (async () => {\n try {\n await taskCompletion\n } 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\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 !== true) {\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-explicit-any */\n/* eslint-disable @typescript-eslint/member-ordering */\nimport { Enum, type EnumValue } from '@ariestools/sdk/enum'\n\nimport type { Thread } from './thread.ts'\n\n/** Pool event type. Specifies the type of each `PoolEvent`. */\nexport const PoolEventType = Enum({\n /** All workers in the pool have initialized. */\n initialized: 'initialized',\n /** A queued task was canceled before execution. */\n taskCanceled: 'taskCanceled',\n /** A task completed successfully. */\n taskCompleted: 'taskCompleted',\n /** A task failed during execution. */\n taskFailed: 'taskFailed',\n /** A task was added to the queue. */\n taskQueued: 'taskQueued',\n /** The pool has no remaining queued tasks. */\n taskQueueDrained: 'taskQueueDrained',\n /** A worker started executing a task. */\n taskStart: 'taskStart',\n /** The pool and its workers were terminated. */\n terminated: 'terminated',\n} as const)\n/** Pool event type. Specifies the type of each `PoolEvent`. */\nexport type PoolEventType = EnumValue<typeof PoolEventType>\n\n/** A function that runs a task on a worker thread and returns a promise of the result. */\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: (typeof PoolEventType)['initialized']\n size: number\n }\n | {\n type: (typeof PoolEventType)['taskQueued']\n taskID: number\n }\n | {\n type: (typeof PoolEventType)['taskQueueDrained']\n }\n | {\n type: (typeof PoolEventType)['taskStart']\n taskID: number\n workerID: number\n }\n | {\n type: (typeof PoolEventType)['taskCompleted']\n returnValue: any\n taskID: number\n workerID: number\n }\n | {\n type: (typeof PoolEventType)['taskFailed']\n error: Error\n taskID: number\n workerID: number\n }\n | {\n type: (typeof PoolEventType)['taskCanceled']\n taskID: number\n }\n | {\n type: (typeof PoolEventType)['terminated']\n remainingQueue: QueuedTask<ThreadType, any>[]\n }\n\n/** Descriptor for a worker in a pool, tracking its initialization and running tasks. */\nexport interface WorkerDescriptor<ThreadType extends Thread> {\n /** Promise resolving to the initialized thread. */\n init: Promise<ThreadType>\n /** Tasks currently executing on the worker. */\n runningTasks: 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", "/** Symbol key for accessing a thread's error observable. */\nexport const $errors = Symbol('thread.errors')\n/** Symbol key for accessing a thread's event observable. */\nexport const $events = Symbol('thread.events')\n/** Symbol key for accessing a thread's terminate function. */\nexport const $terminate = Symbol('thread.terminate')\n/** Symbol key for marking an object as a transferable descriptor. */\nexport const $transferable = Symbol('thread.transferable')\n/** Symbol key for accessing the underlying worker instance of a thread. */\nexport const $worker = Symbol('thread.worker')\n", "import type { Observable } from 'observable-fns'\n\nimport {\n $errors, $events, $terminate,\n} from '../symbols.ts'\nimport type {\n PrivateThreadProps, Thread as ThreadType, WorkerEvent,\n} from '../types/master.ts'\n\nfunction fail(message: string): never {\n throw new Error(message)\n}\n\nfunction readPrivateThreadProp<K extends keyof PrivateThreadProps>(\n thread: ThreadType,\n key: K,\n): PrivateThreadProps[K] | undefined {\n return Reflect.get(thread, key)\n}\n\n/** Re-exported Thread type from the master types module. */\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 readPrivateThreadProp(thread, $errors) ?? fail('Error observable not found. Make sure to pass a thread instance as returned by the spawn() promise.'),\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 readPrivateThreadProp(thread, $events) ?? fail('Events observable not found. Make sure to pass a thread instance as returned by the spawn() promise.'),\n /** Terminate a thread. Remember to terminate every thread when you are done using it. */\n terminate: <ThreadT extends ThreadType>(thread: ThreadT) =>\n readPrivateThreadProp(thread, $terminate)?.() ?? fail('Terminate function not found. Make sure to pass a thread instance as returned by the spawn() promise.'),\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport DebugLogger from 'debug'\nimport { Observable } from 'observable-fns'\n\nimport { deserialize } from '../common.ts'\nimport { createPromiseWithResolver } from '../promise.ts'\nimport {\n $errors, $events, $terminate, $worker,\n} from '../symbols.ts'\nimport type {\n FunctionThread,\n ModuleThread,\n PrivateThreadProps,\n StripAsync,\n Worker as WorkerType,\n WorkerEvent,\n WorkerInternalErrorEvent,\n WorkerMessageEvent,\n WorkerTerminationEvent,\n} from '../types/master.ts'\nimport { WorkerEventType } from '../types/master.ts'\nimport type { WorkerInitMessage, WorkerUncaughtErrorMessage } from '../types/messages.ts'\nimport type { WorkerFunction, WorkerModule } from '../types/worker.ts'\nimport { createProxyFunction, createProxyModule } from './invocation-proxy.ts'\n\ntype ArbitraryWorkerInterface = WorkerFunction & WorkerModule<string> & { somekeythatisneverusedinproductioncode123: 'magicmarker123' }\ntype ArbitraryThreadType = FunctionThread<any, any> & ModuleThread<any>\n\ninterface ProcessEnvGlobal {\n process?: {\n env?: {\n THREADS_WORKER_INIT_TIMEOUT?: string\n }\n }\n}\n\n/** Maps a worker's exposed API type to its corresponding thread type (`FunctionThread` or `ModuleThread`). */\nexport type ExposedToThreadType<Exposed extends WorkerFunction | WorkerModule<any>>\n = Exposed extends ArbitraryWorkerInterface ? ArbitraryThreadType\n : Exposed extends WorkerFunction ? FunctionThread<Parameters<Exposed>, StripAsync<ReturnType<Exposed>>>\n : Exposed extends WorkerModule<any> ? ModuleThread<Exposed>\n : never\n\nconst debugMessages = DebugLogger('threads:master:messages')\nconst debugSpawn = DebugLogger('threads:master:spawn')\nconst debugThreadUtils = DebugLogger('threads:master:thread-utils')\n\nconst isInitMessage = (data: any): data is WorkerInitMessage => data?.type === 'init' as const\nconst isUncaughtErrorMessage = (data: any): data is WorkerUncaughtErrorMessage => data?.type === 'uncaughtError' as const\nconst workerInitTimeout = (globalThis as ProcessEnvGlobal).process?.env?.THREADS_WORKER_INIT_TIMEOUT\n\nconst initMessageTimeout\n = workerInitTimeout !== undefined && workerInitTimeout !== ''\n ? Number(workerInitTimeout)\n : 10_000\n\nasync function withTimeout<T>(promise: Promise<T>, timeoutInMs: number, errorMessage: string): Promise<T> {\n let timeoutHandle: any\n\n const timeout = new Promise<never>((resolve, reject) => {\n timeoutHandle = setTimeout(() => reject(new Error(errorMessage)), timeoutInMs)\n })\n const result = await Promise.race([promise, timeout])\n\n clearTimeout(timeoutHandle)\n return result\n}\n\nfunction receiveInitMessage(worker: WorkerType): Promise<WorkerInitMessage> {\n return new Promise((resolve, reject) => {\n const messageHandler = ((event: MessageEvent) => {\n debugMessages('Message from worker before finishing initialization:', event.data)\n if (isInitMessage(event.data)) {\n worker.removeEventListener('message', messageHandler)\n resolve(event.data)\n } else if (isUncaughtErrorMessage(event.data)) {\n worker.removeEventListener('message', messageHandler)\n reject(deserialize(event.data.error))\n }\n }) as EventListener\n worker.addEventListener('message', messageHandler)\n })\n}\n\nfunction createEventObservable(worker: WorkerType, workerTermination: Promise<any>): Observable<WorkerEvent> {\n return new Observable<WorkerEvent>((observer) => {\n const messageHandler = ((messageEvent: MessageEvent) => {\n const workerEvent: WorkerMessageEvent<any> = {\n data: messageEvent.data,\n type: WorkerEventType.message,\n }\n observer.next(workerEvent)\n }) as EventListener\n const rejectionHandler = ((errorEvent: PromiseRejectionEvent) => {\n debugThreadUtils('Unhandled promise rejection event in thread:', errorEvent)\n const workerEvent: WorkerInternalErrorEvent = {\n error: new Error(errorEvent.reason),\n type: WorkerEventType.internalError,\n }\n observer.next(workerEvent)\n }) as EventListener\n worker.addEventListener('message', messageHandler)\n worker.addEventListener('unhandledrejection', rejectionHandler)\n\n void (async () => {\n await workerTermination\n const terminationEvent: WorkerTerminationEvent = { type: WorkerEventType.termination }\n worker.removeEventListener('message', messageHandler)\n worker.removeEventListener('unhandledrejection', rejectionHandler)\n observer.next(terminationEvent)\n observer.complete()\n })()\n })\n}\n\nfunction createTerminator(worker: WorkerType): { terminate: () => Promise<void>; termination: Promise<void> } {\n const [termination, resolver] = createPromiseWithResolver<void>()\n const terminate = async () => {\n debugThreadUtils('Terminating worker')\n // Newer versions of worker_threads workers return a promise\n await worker.terminate()\n resolver()\n }\n return { terminate, termination }\n}\n\nfunction setPrivateThreadProps<T>(\n raw: T,\n worker: WorkerType,\n workerEvents: Observable<WorkerEvent>,\n terminate: () => Promise<void>,\n): T & PrivateThreadProps {\n const workerErrors = workerEvents\n .filter(event => event.type === WorkerEventType.internalError)\n .map(errorEvent => (errorEvent as WorkerInternalErrorEvent).error)\n\n const result = raw as T & PrivateThreadProps\n const privateProps: [symbol, PropertyDescriptor][] = [\n [$errors, { enumerable: false, value: workerErrors }],\n [$events, { enumerable: false, value: workerEvents }],\n [$terminate, { enumerable: false, value: terminate }],\n [$worker, { enumerable: false, value: worker }],\n ]\n for (const [key, descriptor] of privateProps) {\n Object.defineProperty(result, key, descriptor)\n }\n return result\n}\n\n/**\n * Spawn a new thread. Takes a fresh worker instance, wraps it in a thin\n * abstraction layer to provide the transparent API and verifies that\n * the worker has initialized successfully.\n *\n * @param worker Instance of `Worker`. Either a web worker or `worker_threads` worker.\n * @param [options]\n * @param [options.timeout] Init message timeout. Default: 10000 or set by environment variable.\n */\nexport async function spawn<Exposed extends WorkerFunction | WorkerModule<any> = ArbitraryWorkerInterface>(\n worker: WorkerType,\n options?: { timeout?: number },\n): Promise<ExposedToThreadType<Exposed>> {\n debugSpawn('Initializing new thread')\n\n const timeout = options?.timeout ?? initMessageTimeout\n const initMessage = await withTimeout(\n receiveInitMessage(worker),\n timeout,\n `Timeout: Did not receive an init message from worker after ${timeout}ms. Make sure the worker calls expose().`,\n )\n const exposed = initMessage.exposed\n\n const { termination, terminate } = createTerminator(worker)\n const events = createEventObservable(worker, termination)\n\n if (exposed.type === 'function') {\n const proxy = createProxyFunction(worker)\n return setPrivateThreadProps(proxy, worker, events, terminate) as ExposedToThreadType<Exposed>\n }\n if (exposed.type === 'module') {\n const proxy = createProxyModule(worker, exposed.methods)\n return setPrivateThreadProps(proxy, worker, events, terminate) as ExposedToThreadType<Exposed>\n }\n const type = (exposed as WorkerInitMessage['exposed']).type\n throw new Error(`Worker init message states unexpected type of expose(): ${type}`)\n}\n", "// eslint-disable-next-line unicorn/no-useless-undefined\nconst doNothing = () => undefined\n\n/**\n * Creates a new promise and exposes its resolver function.\n * Use with care!\n */\nexport function createPromiseWithResolver<T>(): [Promise<T>, (result: T) => void] {\n let alreadyResolved = false\n let resolvedTo: T\n let resolver: (value: T | PromiseLike<T>) => void = doNothing\n\n const promise = new Promise<T>((resolve) => {\n if (alreadyResolved) {\n resolve(resolvedTo)\n } else {\n resolver = resolve\n }\n })\n const exposedResolver = (value: T) => {\n alreadyResolved = true\n resolvedTo = value\n resolver(resolvedTo)\n }\n return [promise, exposedResolver]\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n/// <reference lib=\"dom\" />\n\n// Cannot use `compilerOptions.esModuleInterop` and default import syntax\n// See <https://github.com/microsoft/TypeScript/issues/28009>\nimport { Enum, type EnumValue } from '@ariestools/sdk/enum'\nimport type { Observable } from 'observable-fns'\n\nimport type { ObservablePromise } from '../observable-promise.ts'\nimport type {\n $errors, $events, $terminate, $worker,\n} from '../symbols.ts'\nimport type { TransferDescriptor } from '../transferable.ts'\n\ninterface ObservableLikeSubscription {\n unsubscribe(): any\n}\ninterface ObservableLike<T> {\n subscribe(onNext: (value: T) => any, onError?: (error: any) => any, onComplete?: () => any): ObservableLikeSubscription\n subscribe(listeners: { complete?(): any; error?(error: any): any; next?(value: T): any }): ObservableLikeSubscription\n}\n\n/** Unwraps `Promise<T>` or `ObservableLike<T>` to their inner type `T`. */\nexport type StripAsync<Type>\n = Type extends Promise<infer PromiseBaseType> ? PromiseBaseType\n : Type extends ObservableLike<infer ObservableBaseType> ? ObservableBaseType\n : Type\n\ntype StripTransfer<Type> = Type extends TransferDescriptor<infer BaseType> ? BaseType : Type\n\n/** An object whose keys are method names and values are functions, representing a worker module's methods. */\nexport type ModuleMethods = Record<string, (...args: any) => any>\n\ntype ProxyableArgs<Args extends any[]>\n = Args extends [arg0: infer Arg0, ...rest: infer RestArgs] ? [Arg0 extends Transferable ? Arg0 | TransferDescriptor<Arg0> : Arg0, ...RestArgs] : Args\n\n/** A function proxied from a worker thread, returning an `ObservablePromise` of the unwrapped result. */\nexport type ProxyableFunction<Args extends any[], ReturnType>\n = Args extends [] ? () => ObservablePromise<StripTransfer<StripAsync<ReturnType>>>\n : (...args: ProxyableArgs<Args>) => ObservablePromise<StripTransfer<StripAsync<ReturnType>>>\n\n/** Proxy object mapping a worker module's methods to their proxied counterparts. */\nexport type ModuleProxy<Methods extends ModuleMethods> = {\n [method in keyof Methods]: ProxyableFunction<Parameters<Methods[method]>, ReturnType<Methods[method]>>\n}\n\n/** Internal symbol-keyed properties attached to every spawned thread. */\nexport interface PrivateThreadProps {\n /** Observable stream of worker errors. */\n [$errors]: Observable<Error>\n /** Observable stream of worker lifecycle events. */\n [$events]: Observable<WorkerEvent>\n /** Terminates the backing worker. */\n [$terminate]: () => Promise<void>\n /** Worker backing the thread proxy. */\n [$worker]: Worker\n}\n\n/** A thread wrapping a single exposed function. */\nexport type FunctionThread<Args extends any[] = any[], ReturnType = any> = ProxyableFunction<Args, ReturnType> & PrivateThreadProps\n/** A thread wrapping an exposed module of functions. */\nexport type ModuleThread<Methods extends ModuleMethods = any> = ModuleProxy<Methods> & PrivateThreadProps\n\n// We have those extra interfaces to keep the general non-specific `Thread` type\n// as an interface, so it's displayed concisely in any TypeScript compiler output.\ninterface AnyFunctionThread extends PrivateThreadProps {\n (...args: any[]): ObservablePromise<any>\n}\n\ninterface AnyModuleThread extends PrivateThreadProps {\n // Not specifying an index signature here as that would make `ModuleThread` incompatible\n}\n\n/** Worker thread. Either a `FunctionThread` or a `ModuleThread`. */\nexport type Thread = AnyFunctionThread | AnyModuleThread\n\n/** List of `Transferable` objects to be transferred with a message. */\nexport type TransferList = Transferable[]\n\n/** Worker instance. Either a web worker or a Node.js Worker provided by `worker_threads`. */\nexport interface Worker extends EventTarget {\n /** Send a value and optional transfer list to the worker. */\n postMessage(value: any, transferList?: TransferList): void\n /** In Node.js return type is Promise while in browser return type is void */\n terminate(callback?: (error?: Error, exitCode?: number) => void): void | Promise<number>\n}\n/** Options for configuring a worker thread, extending the standard `WorkerOptions`. */\nexport interface ThreadsWorkerOptions extends WorkerOptions {\n /** Whether to apply CORS protection workaround. Defaults to true. */\n CORSWorkaround?: boolean\n /** Prefix for the path passed to the Worker constructor. Web worker only. */\n _baseURL?: string\n /** Resource limits passed on to Node worker_threads */\n resourceLimits?: {\n /** The size of a pre-allocated memory range used for generated code. */\n codeRangeSizeMb?: number\n /** The maximum size of the main heap in MB. */\n maxOldGenerationSizeMb?: number\n /** The maximum size of a heap space for recently created objects. */\n maxYoungGenerationSizeMb?: number\n }\n /** Data passed on to Node.js worker_threads. */\n workerData?: any\n}\n\n/** Worker implementation. Either web worker or a Node.js Worker class. */\nexport declare class WorkerImplementation extends EventTarget implements Worker {\n /** Create a worker for the given script path. */\n constructor(path: string, options?: ThreadsWorkerOptions)\n /** Send a value and optional transfer list to the worker. */\n postMessage(value: any, transferList?: TransferList): void\n /** Terminate the worker. */\n terminate(): void | Promise<number>\n}\n\n/** Class to spawn workers from a blob or source string. */\nexport declare class BlobWorker extends WorkerImplementation {\n /** Create a worker from a source blob. */\n constructor(blob: Blob, options?: ThreadsWorkerOptions)\n /** Create a worker from JavaScript source text. */\n static fromText(source: string, options?: ThreadsWorkerOptions): WorkerImplementation\n}\n\n/** Export shape for platform-specific worker implementations. */\nexport interface ImplementationExport {\n /** Constructor used for blob-backed workers. */\n blob: typeof BlobWorker\n /** Default constructor used for path-backed workers. */\n default: typeof WorkerImplementation\n}\n\n/** Event as emitted by worker thread. Subscribe to using `Thread.events(thread)`. */\nexport const WorkerEventType = Enum({\n /** The threads implementation encountered an internal error. */\n internalError: 'internalError',\n /** The worker emitted a message. */\n message: 'message',\n /** The worker terminated. */\n termination: 'termination',\n} as const)\n/** Event as emitted by worker thread. Subscribe to using `Thread.events(thread)`. */\nexport type WorkerEventType = EnumValue<typeof WorkerEventType>\n\n/** Event indicating an internal error occurred in the worker. */\nexport interface WorkerInternalErrorEvent {\n /** Error raised by the worker implementation. */\n error: Error\n /** Event discriminant. */\n type: (typeof WorkerEventType)['internalError']\n}\n\n/** Event containing a message received from the worker. */\nexport interface WorkerMessageEvent<Data> {\n /** Message data received from the worker. */\n data: Data\n /** Event discriminant. */\n type: (typeof WorkerEventType)['message']\n}\n\n/** Event indicating the worker has been terminated. */\nexport interface WorkerTerminationEvent {\n /** Event discriminant. */\n type: (typeof WorkerEventType)['termination']\n}\n\n/** Union of all possible worker event types. */\nexport type WorkerEvent = WorkerInternalErrorEvent | WorkerMessageEvent<any> | WorkerTerminationEvent\n", "/// <reference lib=\"webworker\" />\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/*\n * This source file contains the code for proxying calls in the master thread to calls in the workers\n * by `.postMessage()`-ing.\n *\n * Keep in mind that this code can make or break the program's performance! Need to optimize more\u2026\n */\n\nimport DebugLogger from 'debug'\nimport { multicast, Observable } from 'observable-fns'\n\nimport { deserialize, serialize } from '../common.ts'\nimport { ObservablePromise } from '../observable-promise.ts'\nimport { isTransferDescriptor } from '../transferable.ts'\nimport type {\n ModuleMethods, ModuleProxy, ProxyableFunction, Worker as WorkerType,\n} from '../types/master.ts'\nimport type {\n MasterJobCancelMessage,\n MasterJobRunMessage,\n WorkerJobErrorMessage,\n WorkerJobResultMessage,\n WorkerJobStartMessage,\n} from '../types/messages.ts'\nimport {\n MasterMessageType,\n WorkerMessageType,\n} from '../types/messages.ts'\n\nconst debugMessages = DebugLogger('threads:master:messages')\n\nlet nextJobUID = 1\n\nconst dedupe = <T>(array: T[]): T[] => [...new Set(array)]\n\nconst isJobErrorMessage = (data: any): data is WorkerJobErrorMessage => data?.type === WorkerMessageType.error\nconst isJobResultMessage = (data: any): data is WorkerJobResultMessage => data?.type === WorkerMessageType.result\nconst isJobStartMessage = (data: any): data is WorkerJobStartMessage => data?.type === WorkerMessageType.running\n\nfunction createObservableForJob<ResultType>(worker: WorkerType, jobUID: number): Observable<ResultType> {\n return new Observable((observer) => {\n let asyncType: 'observable' | 'promise' | undefined\n\n const messageHandler = ((event: MessageEvent) => {\n debugMessages('Message from worker:', event.data)\n if (event.data?.uid !== jobUID) return\n\n if (isJobStartMessage(event.data)) {\n asyncType = event.data.resultType\n } else if (isJobResultMessage(event.data)) {\n if (asyncType === 'promise') {\n if (event.data.payload !== undefined) {\n observer.next(deserialize(event.data.payload) as ResultType)\n }\n observer.complete()\n worker.removeEventListener('message', messageHandler)\n } else {\n if (event.data.payload !== undefined) {\n observer.next(deserialize(event.data.payload) as ResultType)\n }\n if (event.data.complete) {\n observer.complete()\n worker.removeEventListener('message', messageHandler)\n }\n }\n } else if (isJobErrorMessage(event.data)) {\n const error = deserialize(event.data.error as any)\n if (asyncType === 'promise' || asyncType === undefined) {\n observer.error(error)\n } else {\n observer.error(error)\n }\n worker.removeEventListener('message', messageHandler)\n }\n }) as EventListener\n\n worker.addEventListener('message', messageHandler)\n\n return () => {\n if (asyncType === 'observable' || asyncType === undefined) {\n const cancelMessage: MasterJobCancelMessage = {\n type: MasterMessageType.cancel,\n uid: jobUID,\n }\n worker.postMessage(cancelMessage)\n }\n worker.removeEventListener('message', messageHandler)\n }\n })\n}\n\nfunction prepareArguments(rawArgs: any[]): { args: any[]; transferables: Transferable[] } {\n if (rawArgs.length === 0) {\n // Exit early if possible\n return {\n args: [],\n transferables: [],\n }\n }\n\n const args: any[] = []\n const transferables: Transferable[] = []\n\n for (const arg of rawArgs) {\n if (isTransferDescriptor(arg)) {\n args.push(serialize(arg.send))\n transferables.push(...arg.transferables)\n } else {\n args.push(serialize(arg))\n }\n }\n\n return {\n args,\n transferables: transferables.length === 0 ? transferables : dedupe(transferables),\n }\n}\n\n/**\n * Create a proxy function that forwards calls to a worker thread via postMessage.\n * @param worker - The worker to send messages to.\n * @param method - Optional method name for module-style workers.\n * @returns A proxied function that returns an `ObservablePromise`.\n */\nexport function createProxyFunction<Args extends any[], ReturnType>(worker: WorkerType, method?: string) {\n return ((...rawArgs: Args) => {\n const uid = nextJobUID++\n const { args, transferables } = prepareArguments(rawArgs)\n const runMessage: MasterJobRunMessage = {\n args,\n method,\n type: MasterMessageType.run,\n uid,\n }\n\n debugMessages('Sending command to run function to worker:', runMessage)\n\n try {\n worker.postMessage(runMessage, transferables)\n } catch (error) {\n return ObservablePromise.from(Promise.reject(error))\n }\n\n return ObservablePromise.from(multicast(createObservableForJob<ReturnType>(worker, uid)))\n }) as any as ProxyableFunction<Args, ReturnType>\n}\n\n/**\n * Create a proxy module that maps method names to proxy functions forwarding calls to a worker.\n * @param worker - The worker to send messages to.\n * @param methodNames - The method names exposed by the worker module.\n * @returns A proxy object with methods matching the worker module's API.\n */\nexport function createProxyModule<Methods extends ModuleMethods>(worker: WorkerType, methodNames: string[]): ModuleProxy<Methods> {\n const proxy: any = {}\n\n for (const methodName of methodNames) {\n proxy[methodName] = createProxyFunction(worker, methodName)\n }\n\n return proxy\n}\n", "/* eslint-disable unicorn/no-thenable */\n/* eslint-disable @typescript-eslint/member-ordering */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-this-alias */\n/* eslint-disable unicorn/no-this-assignment */\nimport type { ObservableLike, SubscriptionObserver } from 'observable-fns'\nimport { Observable } from 'observable-fns'\n\ntype OnFulfilled<T, Result = void> = (value: T) => Result\ntype OnRejected<Result = void> = (error: Error) => Result\n\ntype Initializer<T> = (observer: SubscriptionObserver<T>) => UnsubscribeFn | void\n\ntype Thenable<T> = { then: (onFulfilled?: (value: T) => any, onRejected?: (error: any) => any) => any }\n\ntype UnsubscribeFn = () => void\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst doNothing = () => {}\nconst returnInput = <T>(input: T): T => input\nconst runDeferred = (fn: () => void) => {\n void (async () => {\n await Promise.resolve()\n fn()\n })()\n}\n\nfunction fail(error: Error): never {\n throw error\n}\n\nfunction isThenable(thing: any): thing is Thenable<any> {\n return thing != null && typeof thing.then === 'function'\n}\n\n/**\n * Creates a hybrid, combining the APIs of an Observable and a Promise.\n *\n * It is used to proxy async process states when we are initially not sure\n * if that async process will yield values once (-> Promise) or multiple\n * times (-> Observable).\n *\n * Note that the observable promise inherits some of the observable's characteristics:\n * The `init` function will be called *once for every time anyone subscribes to it*.\n *\n * If this is undesired, derive a hot observable from it using `makeHot()` and\n * subscribe to that.\n */\nexport class ObservablePromise<T> extends Observable<T> implements Promise<T> {\n /** Standard object tag identifying this hybrid promise. */\n readonly [Symbol.toStringTag] = '[object ObservablePromise]'\n private initHasRun = false\n private fulfillmentCallbacks: OnFulfilled<T>[] = []\n private rejectionCallbacks: OnRejected[] = []\n\n private firstValue: T | undefined\n private firstValueSet = false\n private rejection: Error | undefined\n private state: 'fulfilled' | 'pending' | 'rejected' = 'pending'\n\n /**\n * Create an observable promise.\n * @param init Initializes each observable subscription.\n */\n constructor(init: Initializer<T>) {\n super((originalObserver: SubscriptionObserver<T>) => {\n const self = this\n const observer: SubscriptionObserver<T> = {\n ...originalObserver,\n complete() {\n originalObserver.complete()\n self.onCompletion()\n },\n error(error: Error) {\n originalObserver.error(error)\n self.onError(error)\n },\n next(value: T) {\n originalObserver.next(value)\n self.onNext(value)\n },\n }\n\n try {\n this.initHasRun = true\n return init(observer)\n } catch (error) {\n observer.error(error)\n }\n })\n }\n\n private onNext(value: T) {\n if (this.firstValueSet) {\n return\n }\n\n this.firstValue = value\n this.firstValueSet = true\n }\n\n private onError(error: Error) {\n this.state = 'rejected'\n this.rejection = error\n\n for (const onRejected of this.rejectionCallbacks) {\n // Promisifying the call to turn errors into unhandled promise rejections\n // instead of them failing sync and cancelling the iteration\n runDeferred(() => onRejected(error))\n }\n }\n\n private onCompletion() {\n this.state = 'fulfilled'\n\n for (const onFulfilled of this.fulfillmentCallbacks) {\n // Promisifying the call to turn errors into unhandled promise rejections\n // instead of them failing sync and cancelling the iteration\n runDeferred(() => onFulfilled(this.firstValue as T))\n }\n }\n\n private createPromise<TResult1 = T, TResult2 = never>(\n onFulfilledRaw?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onRejectedRaw?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n const onFulfilled: OnFulfilled<T, TResult1> = onFulfilledRaw || (returnInput as any)\n const onRejected = onRejectedRaw || fail\n let onRejectedCalled = false\n\n return new Promise<TResult1 | TResult2>((resolve, reject) => {\n const rejectionCallback = (error: Error) => {\n if (onRejectedCalled) return\n onRejectedCalled = true\n\n try {\n resolve(onRejected(error))\n } catch (anotherError) {\n reject(anotherError)\n }\n }\n const fulfillmentCallback = (value: T) => {\n try {\n resolve(onFulfilled(value))\n } catch (ex) {\n const error = ex as Error\n rejectionCallback(error)\n }\n }\n if (!this.initHasRun) {\n this.subscribe({ error: rejectionCallback })\n }\n if (this.state === 'fulfilled') {\n return resolve(onFulfilled(this.firstValue as T))\n }\n if (this.state === 'rejected') {\n onRejectedCalled = true\n return resolve(onRejected(this.rejection!))\n }\n this.fulfillmentCallbacks.push(fulfillmentCallback)\n this.rejectionCallbacks.push(rejectionCallback)\n })\n }\n\n /** Register handlers for the first emitted value or a rejection. */\n then<TResult1 = T, TResult2 = never>(\n onFulfilledRaw?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onRejectedRaw?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n return this.createPromise(onFulfilledRaw, onRejectedRaw)\n }\n\n /** Register a rejection handler. */\n catch<Result = never>(onRejected: ((error: Error) => Promise<Result> | Result) | null | undefined) {\n return this.createPromise(undefined, onRejected)\n }\n\n /** Register a handler invoked after fulfillment or rejection. */\n finally(onCompleted?: (() => void) | null) {\n const handler = onCompleted || doNothing\n return this.createPromise(\n (value: T) => {\n handler()\n return value\n },\n () => handler(),\n ) as Promise<T>\n }\n\n /** Convert an observable, thenable, or array-like value to an observable promise. */\n static override from<T>(thing: Observable<T> | ObservableLike<T> | ArrayLike<T> | Thenable<T>): ObservablePromise<T> {\n return isThenable(thing)\n ? new ObservablePromise((observer) => {\n void (async () => {\n try {\n const value = await thing\n observer.next(value)\n observer.complete()\n } catch (error) {\n observer.error(error)\n }\n })()\n })\n : (super.from(thing) as ObservablePromise<T>)\n }\n}\n", "/// <reference lib=\"webworker\" />\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { $transferable } from './symbols.ts'\n\n/** Descriptor wrapping a value with its associated transferable objects for zero-copy messaging. */\nexport interface TransferDescriptor<T = any> {\n /** Marker identifying the object as a transfer descriptor. */\n [$transferable]: true\n /** Payload sent to the receiving thread. */\n send: T\n /** Objects whose ownership is transferred with the payload. */\n transferables: Transferable[]\n}\n\nfunction isTransferable(thing: any): thing is Transferable {\n if (thing == null || typeof thing !== 'object') return false\n // Don't check too thoroughly, since the list of transferable things in JS might grow over time\n return true\n}\n\n/**\n * Check whether a value is a `TransferDescriptor` created by `Transfer()`.\n * @param thing - The value to check.\n * @returns True if the value is a transfer descriptor.\n */\nexport function isTransferDescriptor(thing: any): thing is TransferDescriptor {\n return thing != null && typeof thing === 'object' && Reflect.get(thing, $transferable) === true\n}\n\n/**\n * Mark a transferable object as such, so it will no be serialized and\n * deserialized on messaging with the main thread, but to transfer\n * ownership of it to the receiving thread.\n *\n * Only works with array buffers, message ports and few more special\n * types of objects, but it's much faster than serializing and\n * deserializing them.\n *\n * Note:\n * The transferable object cannot be accessed by this thread again\n * unless the receiving thread transfers it back again!\n *\n * @see <https://developers.google.com/web/updates/2011/12/Transferable-Objects-Lightning-Fast>\n */\nexport function Transfer(transferable: Transferable): TransferDescriptor\n\n/**\n * Mark transferable objects within an arbitrary object or array as\n * being a transferable object. They will then not be serialized\n * and deserialized on messaging with the main thread, but ownership\n * of them will be tranferred to the receiving thread.\n *\n * Only array buffers, message ports and few more special types of\n * objects can be transferred, but it's much faster than serializing and\n * deserializing them.\n *\n * Note:\n * The transferable object cannot be accessed by this thread again\n * unless the receiving thread transfers it back again!\n *\n * @param payload Value sent to the receiving thread.\n * @param transferables Array buffers, message ports, or similar objects transferred with the payload.\n * @see <https://developers.google.com/web/updates/2011/12/Transferable-Objects-Lightning-Fast>\n */\nexport function Transfer<T>(payload: T, transferables: Transferable[]): TransferDescriptor\n\n/** Create a transfer descriptor for a payload and its transferable objects. */\nexport function Transfer<T>(payload: T, transferables?: Transferable[]): TransferDescriptor {\n console.log('Transfer')\n if (!transferables) {\n if (!isTransferable(payload)) throw new Error('Not transferable')\n transferables = [payload]\n }\n\n const descriptor = {\n send: payload,\n transferables,\n } as TransferDescriptor\n\n Object.defineProperty(descriptor, $transferable, { value: true })\n return descriptor\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/member-ordering */\nimport { Enum, type EnumValue } from '@ariestools/sdk/enum'\n\n/** Serialized representation of an Error for transmission between threads. */\nexport interface SerializedError {\n /** Marker distinguishing serialized errors from ordinary values. */\n __error_marker: '$$error'\n /** Error message. */\n message: string\n /** Error class name. */\n name: string\n /** Captured stack trace, when available. */\n stack?: string\n}\n\n/////////////////////////////\n// Messages sent by master:\n\n/** Types of messages that the master thread can send to a worker. */\nexport const MasterMessageType = Enum({\n /** Cancel a previously submitted job. */\n cancel: 'cancel',\n /** Run a job in the worker. */\n run: 'run',\n} as const)\n/** Types of messages that the master thread can send to a worker. */\nexport type MasterMessageType = EnumValue<typeof MasterMessageType>\n\n/** Message sent by the master to cancel a running job. */\nexport type MasterJobCancelMessage = {\n /** Message discriminant. */\n type: (typeof MasterMessageType)['cancel']\n /** Unique identifier of the job to cancel. */\n uid: number\n}\n\n/** Message sent by the master to run a function in the worker. */\nexport type MasterJobRunMessage = {\n /** Message discriminant. */\n type: (typeof MasterMessageType)['run']\n /** Unique identifier assigned to the job. */\n uid: number\n /** Exposed module method to invoke, or omitted for an exposed function. */\n method?: string\n /** Arguments passed to the exposed function or method. */\n args: any[]\n}\n\n////////////////////////////\n// Messages sent by worker:\n\n/** Types of messages that a worker thread can send to the master. */\nexport const WorkerMessageType = Enum({\n /** A job failed. */\n error: 'error',\n /** The worker exposed its callable API. */\n init: 'init',\n /** A job produced a result. */\n result: 'result',\n /** A job started running. */\n running: 'running',\n /** An error escaped the worker job handler. */\n uncaughtError: 'uncaughtError',\n} as const)\n/** Types of messages that a worker thread can send to the master. */\nexport type WorkerMessageType = EnumValue<typeof WorkerMessageType>\n\n/** Message sent by a worker when an uncaught error occurs. */\nexport type WorkerUncaughtErrorMessage = {\n /** Message discriminant. */\n type: (typeof WorkerMessageType)['uncaughtError']\n /** Uncaught error details. */\n error: {\n message: string\n name: string\n stack?: string\n }\n}\n\n/** Message sent by a worker after calling `expose()` to signal its API to the master. */\nexport type WorkerInitMessage = {\n /** Message discriminant. */\n type: (typeof WorkerMessageType)['init']\n /** Shape of the function or module exposed by the worker. */\n exposed: { type: 'function' } | { type: 'module'; methods: string[] }\n}\n\n/** Message sent by a worker when a job encounters an error. */\nexport type WorkerJobErrorMessage = {\n /** Message discriminant. */\n type: (typeof WorkerMessageType)['error']\n /** Unique identifier of the failed job. */\n uid: number\n /** Serialized failure raised by the job. */\n error: SerializedError\n}\n\n/** Message sent by a worker containing a job's result value. */\nexport type WorkerJobResultMessage = {\n /** Message discriminant. */\n type: (typeof WorkerMessageType)['result']\n /** Unique identifier of the completed or updated job. */\n uid: number\n /** Whether an observable job has finished emitting values. */\n complete?: true\n /** Result value or observable emission. */\n payload?: any\n}\n\n/** Message sent by a worker when a job starts executing. */\nexport type WorkerJobStartMessage = {\n /** Message discriminant. */\n type: (typeof WorkerMessageType)['running']\n /** Unique identifier of the started job. */\n uid: number\n /** Asynchronous result protocol used by the job. */\n resultType: 'observable' | 'promise'\n}\n", "import type { BlobWorker as BlobWorkerClass, Worker as WorkerType } from '../types/master.ts'\nimport * as BrowserImplementation from './implementation.browser.ts'\n\nexport type { FunctionThread, ModuleThread } from '../types/master.ts'\nexport { Pool } from './pool-browser.ts'\nexport { spawn } from './spawn.ts'\nexport { Thread } from './thread.ts'\n\n/** Constructor type for the browser blob-worker implementation. */\nexport type BlobWorker = typeof BlobWorkerClass\n/** Browser worker instance type used by spawned threads. */\nexport type Worker = WorkerType\n\n/** Separate class to spawn workers from source code blobs or strings. */\nexport const BlobWorker = BrowserImplementation.getWorkerImplementation().blob\n\n/** Worker implementation. Either web worker or a Node.js Worker class. */\nexport const Worker = BrowserImplementation.getWorkerImplementation().default\n\nexport { isWorkerRuntime } from './implementation.browser.ts'\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["implementation", "BlobWorker", "DebugLogger", "Observable", "Enum", "DebugLogger", "multicast", "Observable", "Observable", "doNothing", "fail", "Enum", "DebugLogger", "Observable", "multicast", "debugMessages", "DebugLogger", "Observable", "Worker"]
|
|
7
7
|
}
|