@ng-web-apis/workers
Version:
A library for comfortable use of Web Workers API in Angular
68 lines • 9.69 kB
JavaScript
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