{"version":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"],"sourcesContent":["/* 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","// 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) {\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\nexport { getBundleURLCached as getBundleURL }\n","/* eslint-disable @stylistic/max-len */\n/* eslint-disable import-x/no-internal-modules */\n// tslint:disable max-classes-per-file\n\nimport type { ImplementationExport, ThreadsWorkerOptions } from '../types/master.ts'\nimport { getBundleURL } from './get-bundle-url.browser.ts'\n\nexport const defaultPoolSize = typeof navigator !== 'undefined' && navigator.hardwareConcurrency ? 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 && 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\nexport function getWorkerImplementation(): ImplementationExport {\n  if (!implementation) {\n    implementation = selectWorkerImplementation()\n  }\n  return implementation\n}\n\nexport function isWorkerRuntime() {\n  const isWindowContext = typeof globalThis !== 'undefined' && typeof Window !== 'undefined' && globalThis instanceof Window\n  return typeof globalThis !== 'undefined' && self['postMessage'] && !isWindowContext ? true : false\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\nexport declare namespace Pool {\n  type Event<ThreadType extends Thread = any> = PoolEvent<ThreadType>\n  type EventType = PoolEventType\n}\n\nlet nextPoolID = 1\n\nfunction createArray(size: number): number[] {\n  const array: number[] = []\n  for (let index = 0; index < size; index++) {\n    array.push(index)\n  }\n  return array\n}\n\nfunction delay(ms: number) {\n  return new Promise(resolve => setTimeout(resolve, ms))\n}\n\nfunction flatMap<In, Out>(array: In[], mapper: (element: In) => Out[]): Out[] {\n  return array.reduce<Out[]>((flattened, element) => [...flattened, ...mapper(element)], [])\n}\n\nfunction slugify(text: string) {\n  return text.replaceAll(/\\W/g, ' ').trim().replaceAll(/\\s+/g, '-')\n}\n\nfunction spawnWorkers<ThreadType extends Thread>(spawnWorker: () => Promise<ThreadType>, count: number): Array<WorkerDescriptor<ThreadType>> {\n  return createArray(count).map(\n    (): WorkerDescriptor<ThreadType> => ({\n      init: spawnWorker(),\n      runningTasks: [],\n    }),\n  )\n}\n\n/**\n * Thread pool managing a set of worker threads.\n * Use it to queue tasks that are run on those threads with limited\n * concurrency.\n */\nexport interface Pool<ThreadType extends Thread> {\n  /**\n   * Returns a promise that resolves once the task queue is emptied.\n   * Promise will be rejected if any task fails.\n   *\n   * @param allowResolvingImmediately Set to `true` to resolve immediately if task queue is currently empty.\n   */\n  completed(allowResolvingImmediately?: boolean): Promise<any>\n\n  /**\n   * Returns a promise that resolves once the task queue is emptied.\n   * Failing tasks will not cause the promise to be rejected.\n   *\n   * @param allowResolvingImmediately Set to `true` to resolve immediately if task queue is currently empty.\n   */\n  settled(allowResolvingImmediately?: boolean): Promise<Error[]>\n\n  /**\n   * Returns an observable that yields pool events.\n   */\n  events(): Observable<PoolEvent<ThreadType>>\n\n  /**\n   * Queue a task and return a promise that resolves once the task has been dequeued,\n   * started and finished.\n   *\n   * @param task An async function that takes a thread instance and invokes it.\n   */\n  queue<Return>(task: TaskRunFunction<ThreadType, Return>): QueuedTask<ThreadType, Return>\n\n  /**\n   * Terminate all pool threads.\n   *\n   * @param force Set to `true` to kill the thread even if it cannot be stopped gracefully.\n   */\n  terminate(force?: boolean): Promise<void>\n}\n\ninterface PoolOptions {\n  /** Maximum no. of tasks to run on one worker thread at a time. Defaults to one. */\n  concurrency?: number\n\n  /** Maximum no. of jobs to be queued for execution before throwing an error. */\n  maxQueuedJobs?: number\n\n  /** Gives that pool a name to be used for debug logging, letting you distinguish between log output of different pools. */\n  name?: string\n\n  /** No. of worker threads to spawn and to be managed by the pool. */\n  size?: number\n}\n\nclass WorkerPool<ThreadType extends Thread> implements Pool<ThreadType> {\n  static EventType = PoolEventType\n\n  private readonly debug: DebugLogger.Debugger\n  private readonly eventObservable: Observable<PoolEvent<ThreadType>>\n  private readonly options: PoolOptions\n  private readonly workers: Array<WorkerDescriptor<ThreadType>>\n\n  private readonly eventSubject = new Subject<PoolEvent<ThreadType>>()\n  private initErrors: Error[] = []\n  private isClosing = false\n  private nextTaskID = 1\n  private taskQueue: Array<QueuedTask<ThreadType, any>> = []\n\n  constructor(spawnWorker: () => Promise<ThreadType>, optionsOrSize?: number | PoolOptions) {\n    const options: PoolOptions = typeof optionsOrSize === 'number' ? { size: optionsOrSize } : optionsOrSize || {}\n\n    const { size = defaultPoolSize } = options\n\n    this.debug = DebugLogger(`threads:pool:${slugify(options.name || String(nextPoolID++))}`)\n    this.options = options\n    this.workers = spawnWorkers(spawnWorker, size)\n\n    this.eventObservable = multicast(Observable.from(this.eventSubject))\n\n    Promise.all(this.workers.map(worker => worker.init)).then(\n      () =>\n        this.eventSubject.next({\n          size: this.workers.length,\n          type: PoolEventType.initialized,\n        }),\n      (error) => {\n        this.debug('Error while initializing pool worker:', error)\n        this.eventSubject.error(error)\n        this.initErrors.push(error)\n      },\n    )\n  }\n\n  private findIdlingWorker(): WorkerDescriptor<ThreadType> | undefined {\n    const { concurrency = 1 } = this.options\n    return this.workers.find(worker => worker.runningTasks.length < concurrency)\n  }\n\n  private async runPoolTask(worker: WorkerDescriptor<ThreadType>, task: QueuedTask<ThreadType, any>) {\n    const workerID = this.workers.indexOf(worker) + 1\n\n    this.debug(`Running task #${task.id} on worker #${workerID}...`)\n    this.eventSubject.next({\n      taskID: task.id,\n      type: PoolEventType.taskStart,\n      workerID,\n    })\n\n    try {\n      const returnValue = await task.run(await worker.init)\n\n      this.debug(`Task #${task.id} completed successfully`)\n      this.eventSubject.next({\n        returnValue,\n        taskID: task.id,\n        type: PoolEventType.taskCompleted,\n        workerID,\n      })\n    } catch (ex) {\n      const error = ex as Error\n      this.debug(`Task #${task.id} failed`)\n      this.eventSubject.next({\n        error,\n        taskID: task.id,\n        type: PoolEventType.taskFailed,\n        workerID,\n      })\n    }\n  }\n\n  private run(worker: WorkerDescriptor<ThreadType>, task: QueuedTask<ThreadType, any>) {\n    const runPromise = (async () => {\n      const removeTaskFromWorkersRunningTasks = () => {\n        worker.runningTasks = worker.runningTasks.filter(someRunPromise => someRunPromise !== runPromise)\n      }\n\n      // Defer task execution by one tick to give handlers time to subscribe\n      await delay(0)\n\n      try {\n        await this.runPoolTask(worker, task)\n      } finally {\n        removeTaskFromWorkersRunningTasks()\n\n        if (!this.isClosing) {\n          this.scheduleWork()\n        }\n      }\n    })()\n\n    worker.runningTasks.push(runPromise)\n  }\n\n  private scheduleWork() {\n    this.debug('Attempt de-queueing a task in order to run it...')\n\n    const availableWorker = this.findIdlingWorker()\n    if (!availableWorker) return\n\n    const nextTask = this.taskQueue.shift()\n    if (!nextTask) {\n      this.debug('Task queue is empty')\n      this.eventSubject.next({ type: PoolEventType.taskQueueDrained })\n      return\n    }\n\n    this.run(availableWorker, nextTask)\n  }\n\n  private taskCompletion(taskID: number) {\n    return new Promise<any>((resolve, reject) => {\n      const eventSubscription = this.events().subscribe((event) => {\n        if (event.type === PoolEventType.taskCompleted && event.taskID === taskID) {\n          eventSubscription.unsubscribe()\n          resolve(event.returnValue)\n        } else if (event.type === PoolEventType.taskFailed && event.taskID === taskID) {\n          eventSubscription.unsubscribe()\n          reject(event.error)\n        } else if (event.type === PoolEventType.terminated) {\n          eventSubscription.unsubscribe()\n          reject(new Error('Pool has been terminated before task was run.'))\n        }\n      })\n    })\n  }\n\n  async settled(allowResolvingImmediately: boolean = false): Promise<Error[]> {\n    const getCurrentlyRunningTasks = () => flatMap(this.workers, worker => worker.runningTasks)\n\n    const taskFailures: Error[] = []\n\n    const failureSubscription = this.eventObservable.subscribe((event) => {\n      if (event.type === PoolEventType.taskFailed) {\n        taskFailures.push(event.error)\n      }\n    })\n\n    if (this.initErrors.length > 0) {\n      throw this.initErrors[0]\n    }\n    if (allowResolvingImmediately && this.taskQueue.length === 0) {\n      await Promise.allSettled(getCurrentlyRunningTasks())\n      return taskFailures\n    }\n\n    await new Promise<void>((resolve, reject) => {\n      const subscription = this.eventObservable.subscribe({\n        error: reject,\n        next(event) {\n          if (event.type === PoolEventType.taskQueueDrained) {\n            subscription.unsubscribe()\n            resolve(void 0)\n          }\n        }, // make a pool-wide error reject the completed() result promise\n      })\n    })\n\n    await Promise.allSettled(getCurrentlyRunningTasks())\n    failureSubscription.unsubscribe()\n\n    return taskFailures\n  }\n\n  async completed(allowResolvingImmediately: boolean = false) {\n    const settlementPromise = this.settled(allowResolvingImmediately)\n\n    const earlyExitPromise = new Promise<Error[]>((resolve, reject) => {\n      const subscription = this.eventObservable.subscribe({\n        error: reject,\n        next(event) {\n          if (event.type === PoolEventType.taskQueueDrained) {\n            subscription.unsubscribe()\n            resolve(settlementPromise)\n          } else if (event.type === PoolEventType.taskFailed) {\n            subscription.unsubscribe()\n            reject(event.error)\n          }\n        }, // make a pool-wide error reject the completed() result promise\n      })\n    })\n\n    const errors = await Promise.race([settlementPromise, earlyExitPromise])\n\n    if (errors.length > 0) {\n      throw errors[0]\n    }\n  }\n\n  events() {\n    return this.eventObservable\n  }\n\n  queue(taskFunction: TaskRunFunction<ThreadType, any>) {\n    const { maxQueuedJobs = Number.POSITIVE_INFINITY } = this.options\n\n    if (this.isClosing) {\n      throw new Error('Cannot schedule pool tasks after terminate() has been called.')\n    }\n    if (this.initErrors.length > 0) {\n      throw this.initErrors[0]\n    }\n\n    const taskID = this.nextTaskID++\n    const taskCompletion = this.taskCompletion(taskID)\n\n    taskCompletion.catch((error) => {\n      // Prevent unhandled rejections here as we assume the user will use\n      // `pool.completed()`, `pool.settled()` or `task.catch()` to handle errors\n      this.debug(`Task #${taskID} errored:`, error)\n    })\n\n    const task: QueuedTask<ThreadType, any> = {\n      cancel: () => {\n        if (!this.taskQueue.includes(task)) return\n        this.taskQueue = this.taskQueue.filter(someTask => someTask !== task)\n        this.eventSubject.next({\n          taskID: task.id,\n          type: PoolEventType.taskCanceled,\n        })\n      },\n      id: taskID,\n      run: taskFunction,\n      then: taskCompletion.then.bind(taskCompletion),\n    }\n\n    if (this.taskQueue.length >= maxQueuedJobs) {\n      throw new Error(\n        'Maximum number of pool tasks queued. Refusing to queue another one.\\n'\n        + 'This usually happens for one of two reasons: We are either at peak '\n        + \"workload right now or some tasks just won't finish, thus blocking the pool.\",\n      )\n    }\n\n    this.debug(`Queueing task #${task.id}...`)\n    this.taskQueue.push(task)\n\n    this.eventSubject.next({\n      taskID: task.id,\n      type: PoolEventType.taskQueued,\n    })\n\n    this.scheduleWork()\n    return task\n  }\n\n  async terminate(force?: boolean) {\n    this.isClosing = true\n    if (!force) {\n      await this.completed(true)\n    }\n    this.eventSubject.next({\n      remainingQueue: [...this.taskQueue],\n      type: PoolEventType.terminated,\n    })\n    this.eventSubject.complete()\n    await Promise.all(this.workers.map(async worker => Thread.terminate(await worker.init)))\n  }\n}\n\n/**\n * Thread pool constructor. Creates a new pool and spawns its worker threads.\n */\nfunction PoolConstructor<ThreadType extends Thread>(spawnWorker: () => Promise<ThreadType>, optionsOrSize?: number | PoolOptions) {\n  // The function exists only so we don't need to use `new` to create a pool (we still can, though).\n  // If the Pool is a class or not is an implementation detail that should not concern the user.\n  return new WorkerPool(spawnWorker, optionsOrSize)\n}\n\n;(PoolConstructor as any).EventType = PoolEventType\n\n/**\n * Thread pool constructor. Creates a new pool and spawns its worker threads.\n */\nexport const Pool = PoolConstructor as typeof PoolConstructor & { EventType: typeof PoolEventType }\n\nexport type { PoolEvent, QueuedTask } from './pool-types.ts'\nexport { PoolEventType } from './pool-types.ts'\nexport { Thread } from './thread.ts'\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/member-ordering */\nimport type { Thread } from './thread.ts'\n\n/** Pool event type. Specifies the type of each `PoolEvent`. */\nexport enum PoolEventType {\n  initialized = 'initialized',\n  taskCanceled = 'taskCanceled',\n  taskCompleted = 'taskCompleted',\n  taskFailed = 'taskFailed',\n  taskQueued = 'taskQueued',\n  taskQueueDrained = 'taskQueueDrained',\n  taskStart = 'taskStart',\n  terminated = 'terminated',\n}\n\nexport type TaskRunFunction<ThreadType extends Thread, Return> = (worker: ThreadType) => Promise<Return>\n\n/** Pool event. Subscribe to those events using `pool.events()`. Useful for debugging. */\nexport type PoolEvent<ThreadType extends Thread> =\n  | {\n    type: PoolEventType.initialized\n    size: number\n  }\n  | {\n    type: PoolEventType.taskQueued\n    taskID: number\n  }\n  | {\n    type: PoolEventType.taskQueueDrained\n  }\n  | {\n    type: PoolEventType.taskStart\n    taskID: number\n    workerID: number\n  }\n  | {\n    type: PoolEventType.taskCompleted\n    returnValue: any\n    taskID: number\n    workerID: number\n  }\n  | {\n    type: PoolEventType.taskFailed\n    error: Error\n    taskID: number\n    workerID: number\n  }\n  | {\n    type: PoolEventType.taskCanceled\n    taskID: number\n  }\n  | {\n    type: PoolEventType.terminated\n    remainingQueue: Array<QueuedTask<ThreadType, any>>\n  }\n\nexport interface WorkerDescriptor<ThreadType extends Thread> {\n  init: Promise<ThreadType>\n  runningTasks: Array<Promise<any>>\n}\n\n/**\n * Task that has been `pool.queued()`-ed.\n */\nexport interface QueuedTask<ThreadType extends Thread, Return> {\n  /** @private */\n  id: number\n\n  /** @private */\n  run: TaskRunFunction<ThreadType, Return>\n\n  /**\n   * Queued tasks can be cancelled until the pool starts running them on a worker thread.\n   */\n  cancel(): void\n\n  /**\n   * `QueuedTask` is thenable, so you can `await` it.\n   * Resolves when the task has successfully been executed. Rejects if the task fails.\n   */\n  then: Promise<Return>['then']\n}\n","export const $errors = Symbol('thread.errors')\nexport const $events = Symbol('thread.events')\nexport const $terminate = Symbol('thread.terminate')\nexport const $transferable = Symbol('thread.transferable')\nexport const $worker = Symbol('thread.worker')\n","/* eslint-disable import-x/no-internal-modules */\nimport type { Observable } from 'observable-fns'\n\nimport {\n  $errors, $events, $terminate,\n} from '../symbols.ts'\nimport type { Thread as ThreadType, WorkerEvent } from '../types/master.ts'\n\nfunction fail(message: string): never {\n  throw new Error(message)\n}\n\nexport type Thread = ThreadType\n\n/** Thread utility functions. Use them to manage or inspect a `spawn()`-ed thread. */\nexport const Thread = {\n  /** Return an observable that can be used to subscribe to all errors happening in the thread. */\n  errors<ThreadT extends ThreadType>(thread: ThreadT): Observable<Error> {\n    return thread[$errors] || fail('Error observable not found. Make sure to pass a thread instance as returned by the spawn() promise.')\n  },\n  /** Return an observable that can be used to subscribe to internal events happening in the thread. Useful for debugging. */\n  events<ThreadT extends ThreadType>(thread: ThreadT): Observable<WorkerEvent> {\n    return thread[$events] || fail('Events observable not found. Make sure to pass a thread instance as returned by the spawn() promise.')\n  },\n  /** Terminate a thread. Remember to terminate every thread when you are done using it. */\n  terminate<ThreadT extends ThreadType>(thread: ThreadT) {\n    return thread[$terminate]()\n  },\n}\n","/* 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-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 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","/* 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 import-x/no-internal-modules */\nimport 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\nexport type BlobWorker = typeof BlobWorkerClass\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"],"mappings":"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","names":["implementation","BlobWorker","PoolEventType","DebugLogger","Observable","DebugLogger","multicast","Observable","Observable","doNothing","fail","self","DebugLogger","Observable","multicast","debugMessages","DebugLogger","Observable","Worker"]}