UNPKG

@ng-web-apis/workers

Version:
68 lines 9.69 kB
import { EMPTY, fromEvent, merge, Observable, Subject, take, takeUntil, tap } from 'rxjs'; import { WORKER_BLANK_FN } from '../consts/worker-fn-template'; export class WebWorker extends Observable { worker; url; destroy$; constructor(url, options) { let worker; let error; try { worker = new Worker(url, options); } catch (e) { error = e; } super((subscriber) => { let eventStream$ = EMPTY; if (error) { subscriber.error(error); } else if (this.destroy$.isStopped) { subscriber.complete(); } else if (worker) { eventStream$ = merge(fromEvent(worker, 'message').pipe(tap((event) => subscriber.next(event))), fromEvent(worker, 'error').pipe(tap((event) => subscriber.error(event)))).pipe(takeUntil(this.destroy$)); } eventStream$.subscribe().add(subscriber); }); this.worker = worker; this.url = url; this.destroy$ = new Subject(); } static fromFunction(fn, options) { return new WebWorker(WebWorker.createFnUrl(fn), options); } static async execute(fn, data) { const worker = WebWorker.fromFunction(fn); // eslint-disable-next-line rxjs/no-topromise const promise = worker.pipe(take(1)).toPromise(); worker.postMessage(data); return promise.then((result) => { worker.terminate(); return result; }); } static createFnUrl(fn) { const script = `(${WORKER_BLANK_FN})(${fn});`; const blob = new Blob([script], { type: 'text/javascript' }); return URL.createObjectURL(blob); } terminate() { if (this.destroy$.isStopped) { return; } if (this.worker) { this.worker.terminate(); } URL.revokeObjectURL(this.url); this.destroy$.next(); this.destroy$.complete(); } postMessage(value) { if (this.worker) { this.worker.postMessage(value); } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLXdvcmtlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29ya2Vycy9zcmMvd29ya2VyL2NsYXNzZXMvd2ViLXdvcmtlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUV4RixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFJN0QsTUFBTSxPQUFPLFNBQTRCLFNBQVEsVUFBZ0M7SUFDNUQsTUFBTSxDQUFxQjtJQUMzQixHQUFHLENBQVM7SUFDWixRQUFRLENBQWdCO0lBRXpDLFlBQVksR0FBVyxFQUFFLE9BQXVCO1FBQzVDLElBQUksTUFBMEIsQ0FBQztRQUMvQixJQUFJLEtBQVUsQ0FBQztRQUVmLElBQUk7WUFDQSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ3JDO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDUixLQUFLLEdBQUcsQ0FBQyxDQUFDO1NBQ2I7UUFFRCxLQUFLLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUNqQixJQUFJLFlBQVksR0FBa0QsS0FBSyxDQUFDO1lBRXhFLElBQUksS0FBSyxFQUFFO2dCQUNQLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDM0I7aUJBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRTtnQkFDaEMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBQ3pCO2lCQUFNLElBQUksTUFBTSxFQUFFO2dCQUNmLFlBQVksR0FBRyxLQUFLLENBQ2hCLFNBQVMsQ0FBdUIsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FDbkQsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ3pDLEVBQ0QsU0FBUyxDQUFhLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQ3ZDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUMxQyxDQUNKLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQzthQUNwQztZQUVELFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUN4QyxDQUFDO0lBRU0sTUFBTSxDQUFDLFlBQVksQ0FDdEIsRUFBd0IsRUFDeEIsT0FBdUI7UUFFdkIsT0FBTyxJQUFJLFNBQVMsQ0FBTyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FDdkIsRUFBd0IsRUFDeEIsSUFBTztRQUVQLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUMsNkNBQTZDO1FBQzdDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFakQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV6QixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUMzQixNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFFbkIsT0FBTyxNQUF5QyxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBa0I7UUFDekMsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLEtBQUssRUFBRSxJQUFJLENBQUM7UUFFOUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBQyxDQUFDLENBQUM7UUFFM0QsT0FBTyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTSxTQUFTO1FBQ1osSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRTtZQUN6QixPQUFPO1NBQ1Y7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQzNCO1FBRUQsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTSxXQUFXLENBQUMsS0FBUTtRQUN2QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNsQztJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RU1QVFksIGZyb21FdmVudCwgbWVyZ2UsIE9ic2VydmFibGUsIFN1YmplY3QsIHRha2UsIHRha2VVbnRpbCwgdGFwfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtXT1JLRVJfQkxBTktfRk59IGZyb20gJy4uL2NvbnN0cy93b3JrZXItZm4tdGVtcGxhdGUnO1xuaW1wb3J0IHR5cGUge1R5cGVkTWVzc2FnZUV2ZW50fSBmcm9tICcuLi90eXBlcy90eXBlZC1tZXNzYWdlLWV2ZW50JztcbmltcG9ydCB0eXBlIHtXb3JrZXJGdW5jdGlvbn0gZnJvbSAnLi4vdHlwZXMvd29ya2VyLWZ1bmN0aW9uJztcblxuZXhwb3J0IGNsYXNzIFdlYldvcmtlcjxUID0gYW55LCBSID0gYW55PiBleHRlbmRzIE9ic2VydmFibGU8VHlwZWRNZXNzYWdlRXZlbnQ8Uj4+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdvcmtlcjogV29ya2VyIHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JDogU3ViamVjdDx2b2lkPjtcblxuICAgIGNvbnN0cnVjdG9yKHVybDogc3RyaW5nLCBvcHRpb25zPzogV29ya2VyT3B0aW9ucykge1xuICAgICAgICBsZXQgd29ya2VyOiBXb3JrZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBlcnJvcjogYW55O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3b3JrZXIgPSBuZXcgV29ya2VyKHVybCwgb3B0aW9ucyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGVycm9yID0gZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyKChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICAgICAgICBsZXQgZXZlbnRTdHJlYW0kOiBPYnNlcnZhYmxlPEVycm9yRXZlbnQgfCBUeXBlZE1lc3NhZ2VFdmVudDxSPj4gPSBFTVBUWTtcblxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGVzdHJveSQuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh3b3JrZXIpIHtcbiAgICAgICAgICAgICAgICBldmVudFN0cmVhbSQgPSBtZXJnZShcbiAgICAgICAgICAgICAgICAgICAgZnJvbUV2ZW50PFR5cGVkTWVzc2FnZUV2ZW50PFI+Pih3b3JrZXIsICdtZXNzYWdlJykucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcCgoZXZlbnQpID0+IHN1YnNjcmliZXIubmV4dChldmVudCkpLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBmcm9tRXZlbnQ8RXJyb3JFdmVudD4od29ya2VyLCAnZXJyb3InKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFwKChldmVudCkgPT4gc3Vic2NyaWJlci5lcnJvcihldmVudCkpLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBldmVudFN0cmVhbSQuc3Vic2NyaWJlKCkuYWRkKHN1YnNjcmliZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLndvcmtlciA9IHdvcmtlcjtcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgICAgIHRoaXMuZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUZ1bmN0aW9uPFQsIFI+KFxuICAgICAgICBmbjogV29ya2VyRnVuY3Rpb248VCwgUj4sXG4gICAgICAgIG9wdGlvbnM/OiBXb3JrZXJPcHRpb25zLFxuICAgICk6IFdlYldvcmtlcjxULCBSPiB7XG4gICAgICAgIHJldHVybiBuZXcgV2ViV29ya2VyPFQsIFI+KFdlYldvcmtlci5jcmVhdGVGblVybChmbiksIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZXhlY3V0ZTxULCBSPihcbiAgICAgICAgZm46IFdvcmtlckZ1bmN0aW9uPFQsIFI+LFxuICAgICAgICBkYXRhOiBULFxuICAgICk6IFByb21pc2U8VHlwZWRNZXNzYWdlRXZlbnQ8Uj4+IHtcbiAgICAgICAgY29uc3Qgd29ya2VyID0gV2ViV29ya2VyLmZyb21GdW5jdGlvbihmbik7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByeGpzL25vLXRvcHJvbWlzZVxuICAgICAgICBjb25zdCBwcm9taXNlID0gd29ya2VyLnBpcGUodGFrZSgxKSkudG9Qcm9taXNlKCk7XG5cbiAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKGRhdGEpO1xuXG4gICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0IGFzIHVua25vd24gYXMgVHlwZWRNZXNzYWdlRXZlbnQ8Uj47XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNyZWF0ZUZuVXJsKGZuOiBXb3JrZXJGdW5jdGlvbik6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGAoJHtXT1JLRVJfQkxBTktfRk59KSgke2ZufSk7YDtcblxuICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3NjcmlwdF0sIHt0eXBlOiAndGV4dC9qYXZhc2NyaXB0J30pO1xuXG4gICAgICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0ZXJtaW5hdGUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRlc3Ryb3kkLmlzU3RvcHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMud29ya2VyKSB7XG4gICAgICAgICAgICB0aGlzLndvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodGhpcy51cmwpO1xuXG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHBvc3RNZXNzYWdlKHZhbHVlOiBUKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLndvcmtlcikge1xuICAgICAgICAgICAgdGhpcy53b3JrZXIucG9zdE1lc3NhZ2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19