{"version":3,"file":"observable-webworker.mjs","sources":["../../../projects/observable-webworker/src/lib/run-worker.ts","../../../projects/observable-webworker/src/lib/observable-worker.decorator.ts","../../../projects/observable-webworker/src/lib/from-worker.ts","../../../projects/observable-webworker/src/lib/from-worker-pool.ts"],"sourcesContent":["import { from, fromEvent, Notification, Observable, Subscription } from 'rxjs';\nimport { concatMap, dematerialize, map, materialize } from 'rxjs/operators';\nimport { DoTransferableWork, DoWork, DoWorkUnit, WorkerMessageNotification } from './observable-worker.types';\n\nexport type ObservableWorkerConstructor<I = any, O = any> = new (...args: any[]) => DoWork<I, O> | DoWorkUnit<I, O>;\n\n/** @internal */\nexport type WorkerPostMessageNotification<T> = (message: Notification<T>, tranferables?: Transferable[]) => void;\n\n/** @internal */\nexport function workerIsTransferableType<I, O>(\n  worker: DoWork<I, O> | DoWorkUnit<I, O>,\n): worker is DoTransferableWork<I, O> {\n  return !!worker.selectTransferables;\n}\n\n/** @internal */\nexport function workerIsUnitType<I, O>(worker: DoWork<I, O> | DoWorkUnit<I, O>): worker is DoWorkUnit<I, O> {\n  return !!(worker as DoWorkUnit<I, O>).workUnit;\n}\n\n/** @internal */\nexport function getWorkerResult<I, O>(\n  worker: DoWork<I, O> | DoWorkUnit<I, O>,\n  incomingMessages$: Observable<WorkerMessageNotification<I>>,\n): Observable<Notification<O>> {\n  const input$ = incomingMessages$.pipe(\n    map(\n      (e: WorkerMessageNotification<I>): Notification<I> => new Notification(e.data.kind, e.data.value, e.data.error),\n    ),\n    dematerialize(),\n  );\n\n  return workerIsUnitType(worker)\n    ? // note we intentionally materialize the inner observable so the main thread can reassemble the multiple stream values per input observable\n      input$.pipe(concatMap(input => from(worker.workUnit(input)).pipe(materialize())))\n    : worker.work(input$).pipe(materialize());\n}\n\nexport function runWorker<I, O>(workerConstructor: ObservableWorkerConstructor<I, O>): Subscription {\n  const worker = new workerConstructor();\n\n  const incomingMessages$ = fromEvent<WorkerMessageNotification<I>>(self, 'message');\n\n  return getWorkerResult(worker, incomingMessages$).subscribe((notification: Notification<O>) => {\n    // type to workaround typescript trying to compile as non-webworker context\n    const workerPostMessage = (postMessage as unknown) as WorkerPostMessageNotification<O>;\n\n    if (workerIsTransferableType(worker) && notification.hasValue) {\n      workerPostMessage(notification, worker.selectTransferables(notification.value as O));\n    } else {\n      workerPostMessage(notification);\n    }\n  });\n}\n","import { ObservableWorkerConstructor, runWorker } from './run-worker';\n\n/**\n * @deprecated - use the `runWorker(YourWorkerClass)` strategy instead, for\n * compatibility with future webpack versions, and a slightly smaller bundle\n * @see https://github.com/cloudnc/observable-webworker#decorator-deprecation-notice\n */\nexport function ObservableWorker() {\n  return <I, O>(workerConstructor: ObservableWorkerConstructor<I, O>): void => {\n    runWorker(workerConstructor);\n  };\n}\n","import { Notification, Observable, Observer, Subscription } from 'rxjs';\nimport { dematerialize, map, materialize, tap } from 'rxjs/operators';\nimport { WorkerMessageNotification } from './observable-worker.types';\n\nexport interface WorkerOptions {\n  terminateOnComplete: boolean;\n}\n\nexport function fromWorker<Input, Output>(\n  workerFactory: () => Worker,\n  input$: Observable<Input>,\n  selectTransferables?: (input: Input) => Transferable[],\n  options: WorkerOptions = { terminateOnComplete: true },\n): Observable<Output> {\n  return new Observable((responseObserver: Observer<Notification<Output>>) => {\n    let worker: Worker;\n    let subscription: Subscription;\n\n    try {\n      worker = workerFactory();\n      worker.onmessage = (ev: WorkerMessageNotification<Output>) => responseObserver.next(ev.data);\n      worker.onerror = (ev: ErrorEvent) => responseObserver.error(ev);\n\n      subscription = input$\n        .pipe(\n          materialize(),\n          tap(input => {\n            if (selectTransferables && input.hasValue) {\n              const transferables = selectTransferables(input.value as Input);\n              worker.postMessage(input, transferables);\n            } else {\n              worker.postMessage(input);\n            }\n          }),\n        )\n        .subscribe();\n    } catch (error) {\n      responseObserver.error(error);\n    }\n\n    return () => {\n      if (subscription) {\n        subscription.unsubscribe();\n      }\n      if (worker && options.terminateOnComplete) {\n        worker.terminate();\n      }\n    };\n  }).pipe(\n    map(({ kind, value, error }) => new Notification(kind, value, error)),\n    dematerialize(),\n  );\n}\n","import { concat, NEVER, Observable, ObservableInput, of, Subject, zip } from 'rxjs';\nimport { finalize, map, mergeAll, tap } from 'rxjs/operators';\nimport { fromWorker } from './from-worker';\n\ninterface LazyWorker {\n  factory: () => Worker;\n  terminate: () => void;\n  processing: boolean;\n  index: number;\n}\n\nexport interface WorkerPoolOptions<I, O> {\n  workerCount?: number;\n  fallbackWorkerCount?: number;\n  flattenOperator?: (input$: Observable<Observable<O>>) => Observable<O>;\n  selectTransferables?: (input: I) => Transferable[];\n}\n\nexport function fromWorkerPool<I, O>(\n  workerConstructor: (index: number) => Worker,\n  workUnitIterator: ObservableInput<I>,\n  options?: WorkerPoolOptions<I, O>,\n): Observable<O> {\n  const {\n    // eslint-disable-next-line no-undef-init\n    selectTransferables = undefined,\n    workerCount = navigator.hardwareConcurrency ? navigator.hardwareConcurrency - 1 : null,\n    fallbackWorkerCount = 3,\n    flattenOperator = mergeAll<O>(),\n  } = options || {};\n\n  return new Observable<O>(resultObserver => {\n    const idleWorker$$: Subject<LazyWorker> = new Subject();\n\n    let completed = 0;\n    let sent = 0;\n    let finished = false;\n\n    const lazyWorkers: LazyWorker[] = Array.from({\n      length: workerCount !== null ? workerCount : fallbackWorkerCount,\n    }).map((_, index) => {\n      let cachedWorker: Worker | null = null;\n      return {\n        factory() {\n          if (!cachedWorker) {\n            cachedWorker = workerConstructor(index);\n          }\n          return cachedWorker;\n        },\n        terminate() {\n          if (!this.processing && cachedWorker) {\n            cachedWorker.terminate();\n          }\n        },\n        processing: false,\n        index,\n      };\n    });\n\n    const processor$ = zip(idleWorker$$, workUnitIterator).pipe(\n      tap(([worker]) => {\n        sent++;\n        worker.processing = true;\n      }),\n      finalize(() => {\n        idleWorker$$.complete();\n        finished = true;\n        lazyWorkers.forEach(worker => worker.terminate());\n      }),\n      map(\n        ([worker, unitWork]): Observable<O> => {\n          // input should not complete to ensure the worker doesn't send back completion notifications when work unit is\n          // processed, otherwise these would cause the fromWorker to unsubscribe from the result.\n          const input$ = concat(of(unitWork), NEVER);\n          // const input$ = of(unitWork);\n          return fromWorker<I, O>(() => worker.factory(), input$, selectTransferables, {\n            terminateOnComplete: false,\n          }).pipe(\n            finalize(() => {\n              completed++;\n\n              worker.processing = false;\n\n              if (!finished) {\n                idleWorker$$.next(worker);\n              } else {\n                worker.terminate();\n              }\n\n              if (finished && completed === sent) {\n                resultObserver.complete();\n              }\n            }),\n          );\n        },\n      ),\n      flattenOperator,\n    );\n\n    const sub = processor$.subscribe(resultObserver);\n\n    lazyWorkers.forEach(w => idleWorker$$.next(w));\n\n    return () => sub.unsubscribe();\n  });\n}\n"],"names":[],"mappings":"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"}