@xylabs/threads
Version:
Web workers & worker threads as simple as a function call
1 lines • 45 kB
Source Map (JSON)
{"version":3,"sources":["../../../src/master/spawn.ts","../../../src/serializers.ts","../../../src/common.ts","../../../src/promise.ts","../../../src/symbols.ts","../../../src/types/master.ts","../../../src/master/invocation-proxy.ts","../../../src/observable-promise.ts","../../../src/transferable.ts","../../../src/types/messages.ts"],"sourcesContent":["/* eslint-disable import-x/no-internal-modules */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-floating-promises */\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\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 && data.type === ('init' as const)\nconst isUncaughtErrorMessage = (data: any): data is WorkerUncaughtErrorMessage => data && data.type === ('uncaughtError' as const)\n\nconst initMessageTimeout\n = typeof process !== 'undefined' && process.env !== undefined && process.env.THREADS_WORKER_INIT_TIMEOUT\n ? Number.parseInt(process.env.THREADS_WORKER_INIT_TIMEOUT, 10)\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 workerTermination.then(() => {\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 return Object.assign(raw as any, {\n [$errors]: workerErrors,\n [$events]: workerEvents,\n [$terminate]: terminate,\n [$worker]: worker,\n })\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, `worker_threads` worker or `tiny-worker` 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 && options.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 } else if (exposed.type === 'module') {\n const proxy = createProxyModule(worker, exposed.methods)\n return setPrivateThreadProps(proxy, worker, events, terminate) as ExposedToThreadType<Exposed>\n } else {\n const type = (exposed as WorkerInitMessage['exposed']).type\n throw new Error(`Worker init message states unexpected type of expose(): ${type}`)\n }\n}\n","/* eslint-disable import-x/no-internal-modules */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { SerializedError } from './types/messages.ts'\n\nexport interface Serializer<Msg = JsonSerializable, Input = any> {\n deserialize(message: Msg): Input\n serialize(input: Input): Msg\n}\n\nexport interface SerializerImplementation<Msg = JsonSerializable, Input = any> {\n deserialize(message: Msg, defaultDeserialize: (msg: Msg) => Input): Input\n serialize(input: Input, defaultSerialize: (inp: Input) => Msg): Msg\n}\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 {\n return implementation.deserialize(message, fallbackDeserializer)\n },\n\n serialize(input: InputType): MessageType {\n return implementation.serialize(input, fallbackSerializer)\n },\n }\n}\n\ntype JsonSerializablePrimitive = string | number | boolean | null\n\ntype JsonSerializableObject = {\n [key: string]: JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[] | undefined\n}\n\nexport type JsonSerializable = JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[]\n\nconst DefaultErrorSerializer: Serializer<SerializedError, Error> = {\n deserialize(message: SerializedError): Error {\n return Object.assign(new Error(message.message), {\n name: message.name,\n stack: message.stack,\n })\n },\n serialize(error: Error): SerializedError {\n return {\n __error_marker: '$$error',\n message: error.message,\n name: error.name,\n stack: error.stack,\n }\n },\n}\n\nconst isSerializedError = (thing: any): thing is SerializedError =>\n thing && typeof thing === 'object' && '__error_marker' in thing && thing.__error_marker === '$$error'\n\nexport const DefaultSerializer: Serializer<JsonSerializable> = {\n deserialize(message: JsonSerializable): any {\n return isSerializedError(message) ? DefaultErrorSerializer.deserialize(message) : message\n },\n serialize(input: any): JsonSerializable {\n return input instanceof Error ? (DefaultErrorSerializer.serialize(input) as any as JsonSerializable) : input\n },\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\nexport function registerSerializer(serializer: SerializerImplementation<JsonSerializable>) {\n globalThis.registeredSerializer = extendSerializer(globalThis.registeredSerializer, serializer)\n}\n\nexport function deserialize(message: JsonSerializable): any {\n return globalThis.registeredSerializer.deserialize(message)\n}\n\nexport function serialize(input: any): JsonSerializable {\n return globalThis.registeredSerializer.serialize(input)\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","export const $errors = Symbol('thread.errors')\nexport const $events = Symbol('thread.events')\nexport const $terminate = Symbol('thread.terminate')\nexport const $transferable = Symbol('thread.transferable')\nexport const $worker = Symbol('thread.worker')\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/// <reference lib=\"dom\" />\n// tslint:disable max-classes-per-file\n\n// Cannot use `compilerOptions.esModuleInterop` and default import syntax\n// See <https://github.com/microsoft/TypeScript/issues/28009>\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\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\nexport type ModuleMethods = { [methodName: 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\nexport type ProxyableFunction<Args extends any[], ReturnType> =\n Args extends [] ? () => ObservablePromise<StripTransfer<StripAsync<ReturnType>>>\n : (...args: ProxyableArgs<Args>) => ObservablePromise<StripTransfer<StripAsync<ReturnType>>>\n\nexport type ModuleProxy<Methods extends ModuleMethods> = {\n [method in keyof Methods]: ProxyableFunction<Parameters<Methods[method]>, ReturnType<Methods[method]>>\n}\n\nexport interface PrivateThreadProps {\n [$errors]: Observable<Error>\n [$events]: Observable<WorkerEvent>\n [$terminate]: () => Promise<void>\n [$worker]: Worker\n}\n\nexport type FunctionThread<Args extends any[] = any[], ReturnType = any> = ProxyableFunction<Args, ReturnType> & PrivateThreadProps\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\n// tslint:disable-next-line no-empty-interface\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\nexport type TransferList = Transferable[]\n\n/** Worker instance. Either a web worker or a node.js Worker provided by `worker_threads` or `tiny-worker`. */\nexport interface Worker extends EventTarget {\n postMessage(value: any, transferList?: TransferList): void\n /** In nodejs 10+ return type is Promise while with tiny-worker and in browser return type is void */\n terminate(callback?: (error?: Error, exitCode?: number) => void): void | Promise<number>\n}\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 constructor(path: string, options?: ThreadsWorkerOptions)\n postMessage(value: any, transferList?: TransferList): void\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 constructor(blob: Blob, options?: ThreadsWorkerOptions)\n static fromText(source: string, options?: ThreadsWorkerOptions): WorkerImplementation\n}\n\nexport interface ImplementationExport {\n blob: typeof BlobWorker\n default: typeof WorkerImplementation\n}\n\n/** Event as emitted by worker thread. Subscribe to using `Thread.events(thread)`. */\nexport enum WorkerEventType {\n internalError = 'internalError',\n message = 'message',\n termination = 'termination',\n}\n\nexport interface WorkerInternalErrorEvent {\n error: Error\n type: WorkerEventType.internalError\n}\n\nexport interface WorkerMessageEvent<Data> {\n data: Data\n type: WorkerEventType.message\n}\n\nexport interface WorkerTerminationEvent {\n type: WorkerEventType.termination\n}\n\nexport type WorkerEvent = WorkerInternalErrorEvent | WorkerMessageEvent<any> | WorkerTerminationEvent\n","/// <reference lib=\"webworker\" />\n\n/* eslint-disable import-x/no-internal-modules */\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…\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 && data.type === WorkerMessageType.error\nconst isJobResultMessage = (data: any): data is WorkerJobResultMessage => data && data.type === WorkerMessageType.result\nconst isJobStartMessage = (data: any): data is WorkerJobStartMessage => data && 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 || 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))\n }\n observer.complete()\n worker.removeEventListener('message', messageHandler)\n } else {\n if (event.data.payload) {\n observer.next(deserialize(event.data.payload))\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) {\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) {\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\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\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-floating-promises */\n\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\nconst doNothing = () => {}\nconst returnInput = <T>(input: T): T => input\nconst runDeferred = (fn: () => void) => Promise.resolve().then(fn)\n\nfunction fail(error: Error): never {\n throw error\n}\n\nfunction isThenable(thing: any): thing is Thenable<any> {\n return thing && 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 readonly [Symbol.toStringTag] = '[object ObservablePromise]'\n private initHasRun = false\n private fulfillmentCallbacks: Array<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 constructor(init: Initializer<T>) {\n super((originalObserver: SubscriptionObserver<T>) => {\n // tslint:disable-next-line no-this-assignment\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 this.firstValue = value\n this.firstValueSet = true\n }\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 then<TResult1 = T, TResult2 = never>(\n onFulfilledRaw?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,\n onRejectedRaw?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | 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 as Error))\n }\n this.fulfillmentCallbacks.push(fulfillmentCallback)\n this.rejectionCallbacks.push(rejectionCallback)\n })\n }\n\n catch<Result = never>(onRejected: ((error: Error) => Promise<Result> | Result) | null | undefined) {\n return this.then(undefined, onRejected) as Promise<Result>\n }\n\n finally(onCompleted?: (() => void) | null | undefined) {\n const handler = onCompleted || doNothing\n return this.then(\n (value: T) => {\n handler()\n return value\n },\n () => handler(),\n ) as Promise<T>\n }\n\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 const onFulfilled = (value: T) => {\n observer.next(value)\n observer.complete()\n }\n const onRejected = (error: any) => {\n observer.error(error)\n }\n thing.then(onFulfilled, onRejected)\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\nexport interface TransferDescriptor<T = any> {\n [$transferable]: true\n send: T\n transferables: Transferable[]\n}\n\nfunction isTransferable(thing: any): thing is Transferable {\n if (!thing || 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\nexport function isTransferDescriptor(thing: any): thing is TransferDescriptor {\n return thing && typeof thing === 'object' && thing[$transferable]\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 * @param transferable Array buffer, message port or similar.\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 transferable Array buffer, message port or similar.\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\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 return {\n [$transferable]: true,\n send: payload,\n transferables,\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/member-ordering */\nexport interface SerializedError {\n __error_marker: '$$error'\n message: string\n name: string\n stack?: string\n}\n\n/////////////////////////////\n// Messages sent by master:\n\nexport enum MasterMessageType {\n cancel = 'cancel',\n run = 'run',\n}\n\nexport type MasterJobCancelMessage = {\n type: MasterMessageType.cancel\n uid: number\n}\n\nexport type MasterJobRunMessage = {\n type: MasterMessageType.run\n uid: number\n method?: string\n args: any[]\n}\n\n////////////////////////////\n// Messages sent by worker:\n\nexport enum WorkerMessageType {\n error = 'error',\n init = 'init',\n result = 'result',\n running = 'running',\n uncaughtError = 'uncaughtError',\n}\n\nexport type WorkerUncaughtErrorMessage = {\n type: WorkerMessageType.uncaughtError\n error: {\n message: string\n name: string\n stack?: string\n }\n}\n\nexport type WorkerInitMessage = {\n type: WorkerMessageType.init\n exposed: { type: 'function' } | { type: 'module'; methods: string[] }\n}\n\nexport type WorkerJobErrorMessage = {\n type: WorkerMessageType.error\n uid: number\n error: SerializedError\n}\n\nexport type WorkerJobResultMessage = {\n type: WorkerMessageType.result\n uid: number\n complete?: true\n payload?: any\n}\n\nexport type WorkerJobStartMessage = {\n type: WorkerMessageType.running\n uid: number\n resultType: 'observable' | 'promise'\n}\n"],"mappings":"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","names":["DebugLogger","Observable","DefaultErrorSerializer","deserialize","message","Object","assign","Error","name","stack","serialize","error","__error_marker","isSerializedError","thing","DefaultSerializer","input","globalThis","registeredSerializer","DefaultSerializer","deserialize","message","globalThis","registeredSerializer","serialize","input","doNothing","undefined","createPromiseWithResolver","alreadyResolved","resolvedTo","resolver","promise","Promise","resolve","exposedResolver","value","$errors","Symbol","$events","$terminate","$transferable","$worker","WorkerEventType","DebugLogger","multicast","Observable","Observable","doNothing","returnInput","input","runDeferred","fn","Promise","resolve","then","fail","error","isThenable","thing","ObservablePromise","Observable","Symbol","toStringTag","initHasRun","fulfillmentCallbacks","rejectionCallbacks","firstValue","firstValueSet","rejection","state","init","originalObserver","self","observer","complete","onCompletion","onError","next","value","onNext","onRejected","onFulfilled","onFulfilledRaw","onRejectedRaw","onRejectedCalled","reject","rejectionCallback","anotherError","fulfillmentCallback","ex","subscribe","push","catch","undefined","finally","onCompleted","handler","from","isTransferDescriptor","thing","$transferable","MasterMessageType","WorkerMessageType","debugMessages","DebugLogger","nextJobUID","dedupe","array","Set","isJobErrorMessage","data","type","WorkerMessageType","error","isJobResultMessage","result","isJobStartMessage","running","createObservableForJob","worker","jobUID","Observable","observer","asyncType","messageHandler","event","uid","resultType","payload","undefined","next","deserialize","complete","removeEventListener","addEventListener","cancelMessage","MasterMessageType","cancel","postMessage","prepareArguments","rawArgs","length","args","transferables","arg","isTransferDescriptor","push","serialize","send","createProxyFunction","method","runMessage","run","ObservablePromise","from","Promise","reject","multicast","createProxyModule","methodNames","proxy","methodName","debugMessages","DebugLogger","debugSpawn","debugThreadUtils","isInitMessage","data","type","isUncaughtErrorMessage","initMessageTimeout","process","env","undefined","THREADS_WORKER_INIT_TIMEOUT","Number","parseInt","withTimeout","promise","timeoutInMs","errorMessage","timeoutHandle","timeout","Promise","resolve","reject","setTimeout","Error","result","race","clearTimeout","receiveInitMessage","worker","messageHandler","event","removeEventListener","deserialize","error","addEventListener","createEventObservable","workerTermination","Observable","observer","messageEvent","workerEvent","WorkerEventType","message","next","rejectionHandler","errorEvent","reason","internalError","then","terminationEvent","termination","complete","createTerminator","resolver","createPromiseWithResolver","terminate","setPrivateThreadProps","raw","workerEvents","workerErrors","filter","map","Object","assign","$errors","$events","$terminate","$worker","spawn","options","initMessage","exposed","events","proxy","createProxyFunction","createProxyModule","methods"]}