1- import { EMPTY , fromEvent , merge , Observable , Observer } from 'rxjs' ;
2- import { take , tap } from 'rxjs/operators' ;
1+ import { EMPTY , fromEvent , merge , Observable , Subject } from 'rxjs' ;
2+ import { take , takeUntil , tap } from 'rxjs/operators' ;
33import { WORKER_BLANK_FN } from '../consts/worker-fn-template' ;
44import { TypedMessageEvent } from '../types/typed-message-event' ;
55import { WorkerFunction } from '../types/worker-function' ;
66
77export class WebWorker < T = any , R = any > extends Observable < TypedMessageEvent < R > > {
88 private readonly worker : Worker | undefined ;
99 private readonly url : string ;
10- private isStopped : boolean ;
11- private observers : Observer < TypedMessageEvent < R > > [ ] ;
10+ private readonly destroy$ : Subject < void > ;
1211
1312 constructor ( url : string , options ?: WorkerOptions ) {
1413 let worker : Worker | undefined ;
@@ -25,7 +24,7 @@ export class WebWorker<T = any, R = any> extends Observable<TypedMessageEvent<R>
2524
2625 if ( error ) {
2726 subscriber . error ( error ) ;
28- } else if ( this . isStopped ) {
27+ } else if ( this . destroy$ . isStopped ) {
2928 subscriber . complete ( ) ;
3029 } else if ( worker ) {
3130 eventStream$ = merge (
@@ -35,19 +34,15 @@ export class WebWorker<T = any, R = any> extends Observable<TypedMessageEvent<R>
3534 fromEvent < ErrorEvent > ( worker , 'error' ) . pipe (
3635 tap ( event => subscriber . error ( event ) ) ,
3736 ) ,
38- ) ;
39-
40- this . observers . push ( subscriber ) ;
37+ ) . pipe ( takeUntil ( this . destroy$ ) ) ;
4138 }
4239
43- return eventStream$ . subscribe ( ) ;
40+ eventStream$ . subscribe ( ) . add ( subscriber ) ;
4441 } ) ;
4542
4643 this . worker = worker ;
4744 this . url = url ;
48-
49- this . isStopped = false ;
50- this . observers = [ ] ;
45+ this . destroy$ = new Subject < void > ( ) ;
5146 }
5247
5348 static fromFunction < T , R > (
@@ -82,7 +77,7 @@ export class WebWorker<T = any, R = any> extends Observable<TypedMessageEvent<R>
8277 }
8378
8479 terminate ( ) {
85- if ( this . isStopped ) {
80+ if ( this . destroy$ . isStopped ) {
8681 return ;
8782 }
8883
@@ -92,13 +87,8 @@ export class WebWorker<T = any, R = any> extends Observable<TypedMessageEvent<R>
9287
9388 URL . revokeObjectURL ( this . url ) ;
9489
95- this . isStopped = true ;
96- this . observers . forEach ( observer => {
97- if ( ! observer . closed ) {
98- observer . complete ( ) ;
99- }
100- } ) ;
101- this . observers = [ ] ;
90+ this . destroy$ . next ( ) ;
91+ this . destroy$ . complete ( ) ;
10292 }
10393
10494 postMessage ( value : T ) {
0 commit comments