{"version":3,"file":"workerUtils.mjs","sources":["../../../src/lib/utils/workerUtils.ts"],"sourcesContent":["/**\n * @file Worker Utilities\n * @description Web Worker management utilities including worker pooling,\n * task distribution, and typed worker communication\n */\n\nimport { logger } from './logging';\nimport { defer, type Deferred } from './asyncUtils';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Worker message types\n */\nexport interface WorkerMessage<T = unknown> {\n  id: string;\n  type: string;\n  payload: T;\n  timestamp: number;\n}\n\n/**\n * Worker response types\n */\nexport interface WorkerResponse<T = unknown> {\n  id: string;\n  type: 'success' | 'error' | 'progress';\n  payload: T;\n  error?: string;\n  progress?: number;\n  timestamp: number;\n}\n\n/**\n * Worker task definition\n */\nexport interface WorkerTask<TInput = unknown, TOutput = unknown> {\n  id: string;\n  type: string;\n  input: TInput;\n  priority?: number;\n  timeout?: number;\n  transferables?: Transferable[];\n  onProgress?: (progress: number) => void;\n  resolve: (value: TOutput) => void;\n  reject: (error: Error) => void;\n}\n\n/**\n * Worker pool configuration\n */\nexport interface WorkerPoolConfig {\n  /** Maximum number of workers in pool */\n  maxWorkers?: number;\n  /** Idle timeout before terminating worker (ms) */\n  idleTimeout?: number;\n  /** Task timeout (ms) */\n  taskTimeout?: number;\n  /** Enable warm-up workers on creation */\n  warmUp?: boolean;\n}\n\n/**\n * Worker status\n */\nexport type WorkerStatus = 'idle' | 'busy' | 'terminated';\n\n/**\n * Worker info\n */\nexport interface WorkerInfo {\n  id: string;\n  status: WorkerStatus;\n  currentTask: string | null;\n  tasksCompleted: number;\n  errorCount: number;\n  createdAt: number;\n  lastActiveAt: number;\n}\n\n// ============================================================================\n// Typed Worker Wrapper\n// ============================================================================\n\n/**\n * Type-safe worker wrapper with promise-based communication\n */\nexport class TypedWorker<TInput, TOutput> {\n  private worker: Worker;\n  private pendingTasks = new Map<string, Deferred<TOutput>>();\n  private progressCallbacks = new Map<string, (progress: number) => void>();\n  private messageCounter = 0;\n  private terminated = false;\n\n  constructor(workerUrl: string | URL, options: WorkerOptions = {}) {\n    this.worker = new Worker(workerUrl, options);\n    this.setupListeners();\n  }\n\n  /**\n   * Post task to worker\n   */\n  async postTask(\n    type: string,\n    payload: TInput,\n    options: {\n      timeout?: number;\n      transferables?: Transferable[];\n      onProgress?: (progress: number) => void;\n    } = {}\n  ): Promise<TOutput> {\n    if (this.terminated) {\n      throw new Error('Worker has been terminated');\n    }\n\n    const id = `${Date.now()}-${++this.messageCounter}`;\n    const deferred = defer<TOutput>();\n\n    this.pendingTasks.set(id, deferred);\n    if (options.onProgress) {\n      this.progressCallbacks.set(id, options.onProgress);\n    }\n\n    const message: WorkerMessage<TInput> = {\n      id,\n      type,\n      payload,\n      timestamp: Date.now(),\n    };\n\n    if (options.transferables) {\n      this.worker.postMessage(message, options.transferables);\n    } else {\n      this.worker.postMessage(message);\n    }\n\n    // Setup timeout\n    if (options.timeout !== undefined && options.timeout > 0) {\n      setTimeout(() => {\n        if (this.pendingTasks.has(id)) {\n          this.pendingTasks.delete(id);\n          this.progressCallbacks.delete(id);\n          deferred.reject(new Error('Worker task timeout'));\n        }\n      }, options.timeout);\n    }\n\n    return deferred.promise;\n  }\n\n  /**\n   * Terminate worker\n   */\n  terminate(): void {\n    if (this.terminated) return;\n\n    this.terminated = true;\n    this.worker.terminate();\n\n    // Reject all pending tasks\n    for (const [id, deferred] of this.pendingTasks) {\n      deferred.reject(new Error('Worker terminated'));\n      this.pendingTasks.delete(id);\n    }\n    this.progressCallbacks.clear();\n\n    logger.debug('[Worker] Terminated');\n  }\n\n  /**\n   * Check if worker is terminated\n   */\n  isTerminated(): boolean {\n    return this.terminated;\n  }\n\n  /**\n   * Get pending task count\n   */\n  getPendingCount(): number {\n    return this.pendingTasks.size;\n  }\n\n  /**\n   * Setup message listeners\n   */\n  private setupListeners(): void {\n    this.worker.onmessage = (event: MessageEvent<WorkerResponse<TOutput>>) => {\n      const response = event.data;\n      const deferred = this.pendingTasks.get(response.id);\n\n      if (!deferred) {\n        logger.warn('[Worker] Received response for unknown task', { id: response.id });\n        return;\n      }\n\n      if (response.type === 'progress') {\n        const callback = this.progressCallbacks.get(response.id);\n        if (callback && response.progress !== undefined) {\n          callback(response.progress);\n        }\n        return;\n      }\n\n      this.pendingTasks.delete(response.id);\n      this.progressCallbacks.delete(response.id);\n\n      if (response.type === 'error') {\n        deferred.reject(new Error(response.error ?? 'Worker error'));\n      } else {\n        deferred.resolve(response.payload);\n      }\n    };\n\n    this.worker.onerror = (event: ErrorEvent) => {\n      logger.error('[Worker] Error', { message: event.message });\n\n      // Reject all pending tasks\n      for (const [id, deferred] of this.pendingTasks) {\n        deferred.reject(new Error(`Worker error: ${event.message}`));\n        this.pendingTasks.delete(id);\n        this.progressCallbacks.delete(id);\n      }\n    };\n\n    this.worker.onmessageerror = (event: MessageEvent) => {\n      logger.error('[Worker] Message error', { event });\n    };\n  }\n}\n\n// ============================================================================\n// Worker Pool\n// ============================================================================\n\n/**\n * Pool worker entry\n */\ninterface PoolWorker {\n  id: string;\n  worker: Worker;\n  status: WorkerStatus;\n  currentTaskId: string | null;\n  tasksCompleted: number;\n  errorCount: number;\n  createdAt: number;\n  lastActiveAt: number;\n  idleTimeoutId: ReturnType<typeof setTimeout> | null;\n}\n\n/**\n * Worker pool for distributing tasks across multiple workers\n */\nexport class WorkerPool<TInput = unknown, TOutput = unknown> {\n  private config: Required<WorkerPoolConfig>;\n  private readonly workerUrl: string | URL;\n  private readonly workerOptions: WorkerOptions;\n  private workers = new Map<string, PoolWorker>();\n  private taskQueue: WorkerTask<TInput, TOutput>[] = [];\n  private pendingResponses = new Map<string, Deferred<TOutput>>();\n  private progressCallbacks = new Map<string, (progress: number) => void>();\n  private workerCounter = 0;\n  private disposed = false;\n\n  constructor(\n    workerUrl: string | URL,\n    config: WorkerPoolConfig = {},\n    workerOptions: WorkerOptions = {}\n  ) {\n    this.workerUrl = workerUrl;\n    this.workerOptions = workerOptions;\n    this.config = {\n      maxWorkers: config.maxWorkers ?? Math.max(2, navigator.hardwareConcurrency - 1),\n      idleTimeout: config.idleTimeout ?? 30000,\n      taskTimeout: config.taskTimeout ?? 60000,\n      warmUp: config.warmUp ?? false,\n    };\n\n    if (this.config.warmUp) {\n      this.warmUp();\n    }\n  }\n\n  /**\n   * Execute a task\n   */\n  async execute(\n    type: string,\n    input: TInput,\n    options: {\n      priority?: number;\n      timeout?: number;\n      transferables?: Transferable[];\n      onProgress?: (progress: number) => void;\n    } = {}\n  ): Promise<TOutput> {\n    if (this.disposed) {\n      throw new Error('Worker pool has been disposed');\n    }\n\n    return new Promise((resolve, reject) => {\n      const task: WorkerTask<TInput, TOutput> = {\n        id: `task-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n        type,\n        input,\n        priority: options.priority ?? 0,\n        timeout: options.timeout,\n        transferables: options.transferables,\n        onProgress: options.onProgress,\n        resolve,\n        reject,\n      };\n\n      this.taskQueue.push(task);\n      this.processQueue();\n    });\n  }\n\n  /**\n   * Get pool statistics\n   */\n  getStats(): {\n    totalWorkers: number;\n    idleWorkers: number;\n    busyWorkers: number;\n    queuedTasks: number;\n    totalTasksCompleted: number;\n    totalErrors: number;\n  } {\n    let idleWorkers = 0;\n    let busyWorkers = 0;\n    let totalTasksCompleted = 0;\n    let totalErrors = 0;\n\n    for (const worker of this.workers.values()) {\n      if (worker.status === 'idle') idleWorkers++;\n      if (worker.status === 'busy') busyWorkers++;\n      totalTasksCompleted += worker.tasksCompleted;\n      totalErrors += worker.errorCount;\n    }\n\n    return {\n      totalWorkers: this.workers.size,\n      idleWorkers,\n      busyWorkers,\n      queuedTasks: this.taskQueue.length,\n      totalTasksCompleted,\n      totalErrors,\n    };\n  }\n\n  /**\n   * Get worker info\n   */\n  getWorkerInfo(): WorkerInfo[] {\n    return Array.from(this.workers.values()).map((w) => ({\n      id: w.id,\n      status: w.status,\n      currentTask: w.currentTaskId,\n      tasksCompleted: w.tasksCompleted,\n      errorCount: w.errorCount,\n      createdAt: w.createdAt,\n      lastActiveAt: w.lastActiveAt,\n    }));\n  }\n\n  /**\n   * Resize pool\n   */\n  resize(maxWorkers: number): void {\n    this.config.maxWorkers = maxWorkers;\n\n    // Terminate excess idle workers\n    while (this.workers.size > maxWorkers) {\n      const idleWorker = this.getAvailableWorker();\n      if (idleWorker) {\n        this.terminateWorker(idleWorker.id);\n      } else {\n        break;\n      }\n    }\n  }\n\n  /**\n   * Dispose pool\n   */\n  dispose(): void {\n    if (this.disposed) return;\n\n    this.disposed = true;\n\n    // Reject all queued tasks\n    for (const task of this.taskQueue) {\n      task.reject(new Error('Worker pool disposed'));\n    }\n    this.taskQueue = [];\n\n    // Reject all pending responses\n    for (const [_id, deferred] of this.pendingResponses) {\n      deferred.reject(new Error('Worker pool disposed'));\n    }\n    this.pendingResponses.clear();\n    this.progressCallbacks.clear();\n\n    // Terminate all workers\n    for (const workerId of this.workers.keys()) {\n      this.terminateWorker(workerId);\n    }\n\n    logger.info('[WorkerPool] Disposed');\n  }\n\n  /**\n   * Warm up pool by creating minimum workers\n   */\n  private warmUp(): void {\n    const warmUpCount = Math.min(2, this.config.maxWorkers);\n    for (let i = 0; i < warmUpCount; i++) {\n      this.createWorker();\n    }\n  }\n\n  /**\n   * Create a new worker\n   */\n  private createWorker(): PoolWorker | null {\n    if (this.workers.size >= this.config.maxWorkers) {\n      return null;\n    }\n\n    const id = `worker-${++this.workerCounter}`;\n    const worker = new Worker(this.workerUrl, this.workerOptions);\n\n    const poolWorker: PoolWorker = {\n      id,\n      worker,\n      status: 'idle',\n      currentTaskId: null,\n      tasksCompleted: 0,\n      errorCount: 0,\n      createdAt: Date.now(),\n      lastActiveAt: Date.now(),\n      idleTimeoutId: null,\n    };\n\n    this.setupWorkerListeners(poolWorker);\n    this.workers.set(id, poolWorker);\n    this.scheduleIdleTimeout(poolWorker);\n\n    logger.debug('[WorkerPool] Created worker', { id, total: this.workers.size });\n\n    return poolWorker;\n  }\n\n  /**\n   * Setup worker event listeners\n   */\n  private setupWorkerListeners(poolWorker: PoolWorker): void {\n    poolWorker.worker.onmessage = (event: MessageEvent<WorkerResponse<TOutput>>) => {\n      const response = event.data;\n\n      if (response.type === 'progress') {\n        const callback = this.progressCallbacks.get(response.id);\n        if (callback !== undefined && response.progress !== undefined) {\n          callback(response.progress);\n        }\n        return;\n      }\n\n      const deferred = this.pendingResponses.get(response.id);\n      if (!deferred) return;\n\n      this.pendingResponses.delete(response.id);\n      this.progressCallbacks.delete(response.id);\n\n      if (response.type === 'error') {\n        poolWorker.errorCount++;\n        deferred.reject(new Error(response.error ?? 'Worker error'));\n      } else {\n        poolWorker.tasksCompleted++;\n        deferred.resolve(response.payload);\n      }\n\n      // Mark worker as idle and process queue\n      poolWorker.status = 'idle';\n      poolWorker.currentTaskId = null;\n      poolWorker.lastActiveAt = Date.now();\n\n      this.scheduleIdleTimeout(poolWorker);\n      this.processQueue();\n    };\n\n    poolWorker.worker.onerror = (event: ErrorEvent) => {\n      logger.error('[WorkerPool] Worker error', {\n        workerId: poolWorker.id,\n        message: event.message,\n      });\n\n      poolWorker.errorCount++;\n\n      // If worker has current task, reject it\n      if (poolWorker.currentTaskId !== null && poolWorker.currentTaskId !== undefined) {\n        const deferred = this.pendingResponses.get(poolWorker.currentTaskId);\n        if (deferred !== undefined) {\n          this.pendingResponses.delete(poolWorker.currentTaskId);\n          this.progressCallbacks.delete(poolWorker.currentTaskId);\n          deferred.reject(new Error(`Worker error: ${event.message}`));\n        }\n      }\n\n      // Terminate and recreate worker if too many errors\n      if (poolWorker.errorCount > 3) {\n        this.terminateWorker(poolWorker.id);\n        if (this.taskQueue.length > 0) {\n          this.createWorker();\n        }\n      } else {\n        poolWorker.status = 'idle';\n        poolWorker.currentTaskId = null;\n        this.processQueue();\n      }\n    };\n  }\n\n  /**\n   * Schedule idle timeout for worker\n   */\n  private scheduleIdleTimeout(poolWorker: PoolWorker): void {\n    if (poolWorker.idleTimeoutId) {\n      clearTimeout(poolWorker.idleTimeoutId);\n    }\n\n    // Keep at least one worker alive\n    if (this.workers.size <= 1) return;\n\n    poolWorker.idleTimeoutId = setTimeout(() => {\n      if (poolWorker.status === 'idle' && this.workers.size > 1) {\n        this.terminateWorker(poolWorker.id);\n      }\n    }, this.config.idleTimeout);\n  }\n\n  /**\n   * Get an available worker\n   */\n  private getAvailableWorker(): PoolWorker | null {\n    for (const worker of this.workers.values()) {\n      if (worker.status === 'idle') {\n        return worker;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Process task queue\n   */\n  private processQueue(): void {\n    if (this.disposed || this.taskQueue.length === 0) return;\n\n    // Get available worker or create new one\n    let worker = this.getAvailableWorker();\n    worker ??= this.createWorker();\n\n    if (!worker) return;\n\n    // Get highest priority task\n    this.taskQueue.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n    const task = this.taskQueue.shift();\n\n    if (!task) return;\n\n    // Clear idle timeout\n    if (worker.idleTimeoutId) {\n      clearTimeout(worker.idleTimeoutId);\n      worker.idleTimeoutId = null;\n    }\n\n    // Execute task\n    worker.status = 'busy';\n    worker.currentTaskId = task.id;\n\n    const message: WorkerMessage<TInput> = {\n      id: task.id,\n      type: task.type,\n      payload: task.input,\n      timestamp: Date.now(),\n    };\n\n    const deferred = defer<TOutput>();\n    deferred.promise.then(task.resolve, task.reject);\n\n    this.pendingResponses.set(task.id, deferred);\n    if (task.onProgress) {\n      this.progressCallbacks.set(task.id, task.onProgress);\n    }\n\n    // Setup task timeout\n    const timeout = task.timeout ?? this.config.taskTimeout;\n    setTimeout(() => {\n      if (this.pendingResponses.has(task.id)) {\n        this.pendingResponses.delete(task.id);\n        this.progressCallbacks.delete(task.id);\n        task.reject(new Error('Task timeout'));\n\n        // Reset worker\n        if (worker !== undefined) {\n          worker.status = 'idle';\n          worker.currentTaskId = null;\n          this.processQueue();\n        }\n      }\n    }, timeout);\n\n    if (task.transferables) {\n      worker.worker.postMessage(message, task.transferables);\n    } else {\n      worker.worker.postMessage(message);\n    }\n\n    logger.debug('[WorkerPool] Task dispatched', {\n      taskId: task.id,\n      workerId: worker.id,\n      type: task.type,\n    });\n\n    // Process more tasks if there are available workers\n    if (this.taskQueue.length > 0) {\n      this.processQueue();\n    }\n  }\n\n  /**\n   * Terminate a specific worker\n   */\n  private terminateWorker(workerId: string): void {\n    const worker = this.workers.get(workerId);\n    if (!worker) return;\n\n    if (worker.idleTimeoutId) {\n      clearTimeout(worker.idleTimeoutId);\n    }\n\n    worker.worker.terminate();\n    worker.status = 'terminated';\n    this.workers.delete(workerId);\n\n    logger.debug('[WorkerPool] Worker terminated', {\n      workerId,\n      remaining: this.workers.size,\n    });\n  }\n}\n\n// ============================================================================\n// Inline Worker\n// ============================================================================\n\n/**\n * Create an inline worker from a function\n */\nexport function createInlineWorker<TInput, TOutput>(\n  handler: (message: WorkerMessage<TInput>) => TOutput | Promise<TOutput>\n): TypedWorker<TInput, TOutput> {\n  const workerCode = `\n    const handler = ${handler.toString()};\n    \n    self.onmessage = async (event) => {\n      const message = event.data;\n      try {\n        const result = await handler(message);\n        self.postMessage({\n          id: message.id,\n          type: 'success',\n          payload: result,\n          timestamp: Date.now()\n        });\n      } catch (error) {\n        self.postMessage({\n          id: message.id,\n          type: 'error',\n          error: error.message,\n          timestamp: Date.now()\n        });\n      }\n    };\n  `;\n\n  const blob = new Blob([workerCode], { type: 'application/javascript' });\n  const url = URL.createObjectURL(blob);\n\n  const worker = new TypedWorker<TInput, TOutput>(url);\n\n  // Clean up blob URL when worker is terminated\n  const originalTerminate = worker.terminate.bind(worker);\n  worker.terminate = () => {\n    URL.revokeObjectURL(url);\n    originalTerminate();\n  };\n\n  return worker;\n}\n\n// ============================================================================\n// Transfer Utilities\n// ============================================================================\n\n/**\n * Check if value is transferable\n */\nexport function isTransferable(value: unknown): value is Transferable {\n  return (\n    value instanceof ArrayBuffer ||\n    value instanceof MessagePort ||\n    (typeof ImageBitmap !== 'undefined' && value instanceof ImageBitmap) ||\n    (typeof OffscreenCanvas !== 'undefined' && value instanceof OffscreenCanvas) ||\n    (typeof ReadableStream !== 'undefined' && value instanceof ReadableStream) ||\n    (typeof WritableStream !== 'undefined' && value instanceof WritableStream) ||\n    (typeof TransformStream !== 'undefined' && value instanceof TransformStream)\n  );\n}\n\n/**\n * Check if value is an ArrayBufferView\n */\nfunction isArrayBufferView(value: unknown): value is ArrayBufferView {\n  return ArrayBuffer.isView(value);\n}\n\n/**\n * Extract transferables from an object\n */\nexport function extractTransferables(obj: unknown): Transferable[] {\n  const transferables: Transferable[] = [];\n\n  function traverse(value: unknown): void {\n    if (Array.isArray(value)) {\n      value.forEach(traverse);\n      return;\n    }\n\n    // Check ArrayBufferView first since its buffer is transferable\n    if (isArrayBufferView(value)) {\n      transferables.push(value.buffer);\n      return;\n    }\n\n    if (isTransferable(value)) {\n      transferables.push(value);\n      return;\n    }\n\n    if (value !== null && typeof value === 'object') {\n      Object.values(value).forEach(traverse);\n    }\n  }\n\n  traverse(obj);\n  return transferables;\n}\n\n// ============================================================================\n// SharedWorker Wrapper (if supported)\n// ============================================================================\n\n/**\n * Shared worker wrapper\n */\nexport class TypedSharedWorker<TInput, TOutput> {\n  private readonly worker: SharedWorker | null = null;\n  private pendingTasks = new Map<string, Deferred<TOutput>>();\n  private messageCounter = 0;\n\n  constructor(workerUrl: string | URL) {\n    if (typeof SharedWorker === 'undefined') {\n      logger.warn('[SharedWorker] SharedWorker not supported');\n      return;\n    }\n\n    this.worker = new SharedWorker(workerUrl);\n    this.setupListeners();\n  }\n\n  /**\n   * Check if shared worker is supported\n   */\n  isSupported(): boolean {\n    return this.worker !== null;\n  }\n\n  /**\n   * Post task\n   */\n  async postTask(type: string, payload: TInput): Promise<TOutput> {\n    if (!this.worker) {\n      throw new Error('SharedWorker not supported');\n    }\n\n    const id = `${Date.now()}-${++this.messageCounter}`;\n    const deferred = defer<TOutput>();\n\n    this.pendingTasks.set(id, deferred);\n\n    const message: WorkerMessage<TInput> = {\n      id,\n      type,\n      payload,\n      timestamp: Date.now(),\n    };\n\n    this.worker.port.postMessage(message);\n\n    return deferred.promise;\n  }\n\n  /**\n   * Setup listeners\n   */\n  private setupListeners(): void {\n    if (!this.worker) return;\n\n    this.worker.port.onmessage = (event: MessageEvent<WorkerResponse<TOutput>>) => {\n      const response = event.data;\n      const deferred = this.pendingTasks.get(response.id);\n\n      if (!deferred) return;\n\n      this.pendingTasks.delete(response.id);\n\n      if (response.type === 'error') {\n        deferred.reject(new Error(response.error ?? 'Worker error'));\n      } else {\n        deferred.resolve(response.payload);\n      }\n    };\n\n    this.worker.port.start();\n  }\n}\n\n// ============================================================================\n// Worker Registry\n// ============================================================================\n\n/**\n * Registry for managing multiple worker pools\n */\nclass WorkerRegistry {\n  private pools = new Map<string, WorkerPool>();\n\n  /**\n   * Register a worker pool\n   */\n  register<TInput, TOutput>(\n    name: string,\n    workerUrl: string | URL,\n    config?: WorkerPoolConfig\n  ): WorkerPool<TInput, TOutput> {\n    if (this.pools.has(name)) {\n      throw new Error(`Worker pool \"${name}\" already registered`);\n    }\n\n    const pool = new WorkerPool<TInput, TOutput>(workerUrl, config);\n    this.pools.set(name, pool as unknown as WorkerPool);\n    return pool;\n  }\n\n  /**\n   * Get a worker pool\n   */\n  get<TInput, TOutput>(name: string): WorkerPool<TInput, TOutput> | undefined {\n    const pool = this.pools.get(name);\n    return pool !== undefined ? (pool as WorkerPool<TInput, TOutput>) : undefined;\n  }\n\n  /**\n   * Unregister a worker pool\n   */\n  unregister(name: string): void {\n    const pool = this.pools.get(name);\n    if (pool) {\n      pool.dispose();\n      this.pools.delete(name);\n    }\n  }\n\n  /**\n   * Dispose all pools\n   */\n  disposeAll(): void {\n    for (const pool of this.pools.values()) {\n      pool.dispose();\n    }\n    this.pools.clear();\n  }\n\n  /**\n   * Get all pool stats\n   */\n  getAllStats(): Record<string, ReturnType<WorkerPool['getStats']>> {\n    const stats: Record<string, ReturnType<WorkerPool['getStats']>> = {};\n    for (const [name, pool] of this.pools) {\n      stats[name] = pool.getStats();\n    }\n    return stats;\n  }\n}\n\n/**\n * Global worker registry\n */\nexport const workerRegistry = new WorkerRegistry();\n"],"names":["TypedWorker","workerUrl","options","type","payload","id","deferred","defer","message","logger","event","response","callback","WorkerPool","config","workerOptions","input","resolve","reject","task","idleWorkers","busyWorkers","totalTasksCompleted","totalErrors","worker","w","maxWorkers","idleWorker","_id","workerId","warmUpCount","i","poolWorker","b","timeout","createInlineWorker","handler","workerCode","blob","url","originalTerminate","isTransferable","value","isArrayBufferView","extractTransferables","obj","transferables","traverse","TypedSharedWorker","WorkerRegistry","name","pool","stats","workerRegistry"],"mappings":"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"}