{"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        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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"}