1- import { Pipe , PipeTransform } from '@angular/core' ;
1+ import { OnDestroy , Pipe , PipeTransform } from '@angular/core' ;
22import { Observable } from 'rxjs' ;
33import { WebWorker } from '../classes/web-worker' ;
44import { 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 . terminate ( ) ;
18+ this . initNewWorker ( fn ) ;
1719
18- this . workers . set ( fn , worker ) ;
19- worker . postMessage ( value ) ;
20+ this . worker . postMessage ( value ) ;
21+ }
2022
21- const observer = this . observers . get ( worker ) || worker . pipe ( toData ( ) ) ;
23+ return this . observer ;
24+ }
25+
26+ ngOnDestroy ( ) : void {
27+ this . terminate ( ) ;
28+ }
2229
23- this . observers . set ( worker , observer ) ;
30+ private terminate ( ) {
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