@ng-web-apis/workers
Version:
A library for comfortable use of Web Workers API in Angular
1 lines • 8.81 kB
Source Map (JSON)
{"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 WaWebWorker<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 ): WaWebWorker<T, R> {\n return new WaWebWorker<T, R>(WaWebWorker.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 = WaWebWorker.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 {map, type OperatorFunction} 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, Pipe, type PipeTransform} from '@angular/core';\nimport {type Observable} from 'rxjs';\n\nimport {WaWebWorker} from '../classes/web-worker';\nimport {toData} from '../operators/to-data';\nimport {type WorkerFunction} from '../types/worker-function';\n\n@Pipe({name: 'waWorker'})\nexport class WaWorkerPipe implements PipeTransform, OnDestroy {\n private fn!: WorkerFunction;\n private worker!: WaWebWorker;\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 as WaWebWorker | undefined) {\n this.worker.terminate();\n }\n }\n\n private initNewWorker<T, R>(fn: WorkerFunction<T, R>): void {\n this.fn = fn;\n this.worker = WaWebWorker.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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"}