UNPKG

@ng-web-apis/workers

Version:
1 lines 9.29 kB
{"version":3,"file":"ng-web-apis-workers.mjs","sources":["../../../libs/workers/src/worker/consts/worker-fn-template.ts","../../../libs/workers/src/worker/classes/web-worker.ts","../../../libs/workers/src/worker/operators/to-data.ts","../../../libs/workers/src/worker/pipes/worker.pipe.ts","../../../libs/workers/src/ng-web-apis-workers.ts"],"sourcesContent":["// throw an error using the `setTimeout` function\n// because web worker doesn't emit ErrorEvent from promises\nexport const WORKER_BLANK_FN = `\nfunction(fn){\n function isFunction(type){\n return type === 'function';\n }\n\n self.addEventListener('message', function(e) {\n var result = fn.call(null, e.data);\n if (result && [typeof result.then, typeof result.catch].every(isFunction)){\n result\n .then(postMessage)\n .catch(function(error) {\n setTimeout(function(){throw error}, 0)\n })\n } else {\n postMessage(result);\n }\n })\n}\n`;\n","import {EMPTY, fromEvent, merge, Observable, Subject, take, takeUntil, tap} from 'rxjs';\n\nimport {WORKER_BLANK_FN} from '../consts/worker-fn-template';\nimport type {TypedMessageEvent} from '../types/typed-message-event';\nimport type {WorkerFunction} from '../types/worker-function';\n\nexport class WebWorker<T = any, R = any> extends Observable<TypedMessageEvent<R>> {\n private readonly worker: Worker | undefined;\n private readonly url: string;\n private readonly destroy$: Subject<void>;\n\n constructor(url: string, options?: WorkerOptions) {\n let worker: Worker | undefined;\n let error: any;\n\n try {\n worker = new Worker(url, options);\n } catch (e) {\n error = e;\n }\n\n super((subscriber) => {\n let eventStream$: Observable<ErrorEvent | TypedMessageEvent<R>> = EMPTY;\n\n if (error) {\n subscriber.error(error);\n } else if (this.destroy$.isStopped) {\n subscriber.complete();\n } else if (worker) {\n eventStream$ = merge(\n fromEvent<TypedMessageEvent<R>>(worker, 'message').pipe(\n tap((event) => subscriber.next(event)),\n ),\n fromEvent<ErrorEvent>(worker, 'error').pipe(\n tap((event) => subscriber.error(event)),\n ),\n ).pipe(takeUntil(this.destroy$));\n }\n\n eventStream$.subscribe().add(subscriber);\n });\n\n this.worker = worker;\n this.url = url;\n this.destroy$ = new Subject<void>();\n }\n\n public static fromFunction<T, R>(\n fn: WorkerFunction<T, R>,\n options?: WorkerOptions,\n ): WebWorker<T, R> {\n return new WebWorker<T, R>(WebWorker.createFnUrl(fn), options);\n }\n\n public static async execute<T, R>(\n fn: WorkerFunction<T, R>,\n data: T,\n ): Promise<TypedMessageEvent<R>> {\n const worker = WebWorker.fromFunction(fn);\n // eslint-disable-next-line rxjs/no-topromise\n const promise = worker.pipe(take(1)).toPromise();\n\n worker.postMessage(data);\n\n return promise.then((result) => {\n worker.terminate();\n\n return result as unknown as TypedMessageEvent<R>;\n });\n }\n\n private static createFnUrl(fn: WorkerFunction): string {\n const script = `(${WORKER_BLANK_FN})(${fn});`;\n\n const blob = new Blob([script], {type: 'text/javascript'});\n\n return URL.createObjectURL(blob);\n }\n\n public terminate(): void {\n if (this.destroy$.isStopped) {\n return;\n }\n\n if (this.worker) {\n this.worker.terminate();\n }\n\n URL.revokeObjectURL(this.url);\n\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n public postMessage(value: T): void {\n if (this.worker) {\n this.worker.postMessage(value);\n }\n }\n}\n","import type {OperatorFunction} from 'rxjs';\nimport {map} from 'rxjs';\n\nimport type {TypedMessageEvent} from '../types/typed-message-event';\n\nexport function toData<T>(): OperatorFunction<TypedMessageEvent<T>, T> {\n return map<TypedMessageEvent<T>, T>(({data}) => data);\n}\n","import type {OnDestroy, PipeTransform} from '@angular/core';\nimport {Pipe} from '@angular/core';\nimport type {Observable} from 'rxjs';\n\nimport {WebWorker} from '../classes/web-worker';\nimport {toData} from '../operators/to-data';\nimport type {WorkerFunction} from '../types/worker-function';\n\n@Pipe({\n standalone: true,\n name: 'waWorker',\n})\nexport class WorkerPipe implements PipeTransform, OnDestroy {\n private fn!: WorkerFunction;\n private worker!: WebWorker;\n private observer!: Observable<any>;\n\n public transform<T, R>(value: T, fn: WorkerFunction<T, R>): Observable<R> {\n if (this.fn !== fn) {\n this.terminateWorker();\n this.initNewWorker(fn);\n }\n\n this.worker.postMessage(value);\n\n return this.observer;\n }\n\n public ngOnDestroy(): void {\n this.terminateWorker();\n }\n\n private terminateWorker(): void {\n if (this.worker) {\n this.worker.terminate();\n }\n }\n\n private initNewWorker<T, R>(fn: WorkerFunction<T, R>): void {\n this.fn = fn;\n this.worker = WebWorker.fromFunction(fn);\n this.observer = this.worker.pipe(toData());\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}