Skip to content
This repository was archived by the owner on May 29, 2023. It is now read-only.

Commit ef49ea9

Browse files
authored
Merge pull request #4 from ng-web-apis/bugfix/pipe-destroy
fix: add termination of unused workers
2 parents 8acee38 + ac1a2d2 commit ef49ea9

File tree

2 files changed

+39
-11
lines changed

2 files changed

+39
-11
lines changed

projects/workers/src/worker/pipes/worker.pipe.spec.ts

+14
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,18 @@ describe('WorkerPipe', () => {
3232

3333
expect(worker).not.toEqual(differentWorker);
3434
});
35+
36+
it('should terminate a previous worker', async () => {
37+
const worker = await pipe.transform('a', (data: unknown) => data);
38+
39+
await pipe.transform('a', (data: unknown) => data);
40+
await expectAsync(worker.toPromise()).toBeResolved();
41+
});
42+
43+
it('should terminate a worker then a pipe is destroyed', async () => {
44+
const worker = await pipe.transform('a', (data: unknown) => data);
45+
46+
pipe.ngOnDestroy();
47+
await expectAsync(worker.toPromise()).toBeResolved();
48+
});
3549
});
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {Pipe, PipeTransform} from '@angular/core';
1+
import {OnDestroy, Pipe, PipeTransform} from '@angular/core';
22
import {Observable} from 'rxjs';
33
import {WebWorker} from '../classes/web-worker';
44
import {toData} from '../operators/to-data';
@@ -7,21 +7,35 @@ import {WorkerFunction} from '../types/worker-function';
77
@Pipe({
88
name: 'waWorker',
99
})
10-
export class WorkerPipe implements PipeTransform {
11-
private workers = new WeakMap<WorkerFunction, WebWorker>();
12-
private observers = new WeakMap<WebWorker, Observable<any>>();
10+
export class WorkerPipe implements PipeTransform, OnDestroy {
11+
private fn!: WorkerFunction;
12+
private worker!: WebWorker;
13+
private observer!: Observable<any>;
1314

1415
transform<T, R>(value: T, fn: WorkerFunction<T, R>): Observable<R> {
15-
const worker: WebWorker<T, R> =
16-
this.workers.get(fn) || WebWorker.fromFunction(fn);
16+
if (this.fn !== fn) {
17+
this.terminateWorker();
18+
this.initNewWorker(fn);
19+
}
1720

18-
this.workers.set(fn, worker);
19-
worker.postMessage(value);
21+
this.worker.postMessage(value);
2022

21-
const observer = this.observers.get(worker) || worker.pipe(toData());
23+
return this.observer;
24+
}
25+
26+
ngOnDestroy(): void {
27+
this.terminateWorker();
28+
}
2229

23-
this.observers.set(worker, observer);
30+
private terminateWorker() {
31+
if (this.worker) {
32+
this.worker.terminate();
33+
}
34+
}
2435

25-
return observer;
36+
private initNewWorker<T, R>(fn: WorkerFunction<T, R>) {
37+
this.fn = fn;
38+
this.worker = WebWorker.fromFunction(fn);
39+
this.observer = this.worker.pipe(toData());
2640
}
2741
}

0 commit comments

Comments
 (0)