1- import { fromEvent , Observable } from 'rxjs' ;
2- import { take , takeWhile } from 'rxjs/operators' ;
1+ import { EMPTY , fromEvent , merge , Observable } from 'rxjs' ;
2+ import { take , 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 > > {
8- private worker : Worker ;
9- private url : string ;
8+ private readonly worker : Worker | undefined ;
9+ private readonly url : string ;
1010
1111 constructor ( url : string , options ?: WorkerOptions ) {
12- let worker ! : Worker ;
12+ let worker : Worker | undefined ;
1313 let error : any ;
1414
1515 try {
@@ -23,17 +23,18 @@ export class WebWorker<T = any, R = any> extends Observable<TypedMessageEvent<R>
2323 subscriber . error ( error ) ;
2424 }
2525
26- fromEvent < TypedMessageEvent < R > > ( this . worker , 'message' )
27- . pipe ( takeWhile ( ( ) => ! subscriber . closed ) )
28- . subscribe ( event => {
29- subscriber . next ( event ) ;
30- } ) ;
31-
32- fromEvent < ErrorEvent > ( this . worker , 'error' )
33- . pipe ( takeWhile ( ( ) => ! subscriber . closed ) )
34- . subscribe ( event => {
35- subscriber . error ( event ) ;
36- } ) ;
26+ const eventStream$ = worker
27+ ? merge (
28+ fromEvent < TypedMessageEvent < R > > ( worker , 'message' ) . pipe (
29+ tap ( event => subscriber . next ( event ) ) ,
30+ ) ,
31+ fromEvent < ErrorEvent > ( worker , 'error' ) . pipe (
32+ tap ( event => subscriber . error ( event ) ) ,
33+ ) ,
34+ )
35+ : EMPTY ;
36+
37+ return eventStream$ . subscribe ( ) ;
3738 } ) ;
3839
3940 this . worker = worker ;
@@ -68,11 +69,16 @@ export class WebWorker<T = any, R = any> extends Observable<TypedMessageEvent<R>
6869 }
6970
7071 terminate ( ) {
71- this . worker . terminate ( ) ;
72+ if ( this . worker ) {
73+ this . worker . terminate ( ) ;
74+ }
75+
7276 URL . revokeObjectURL ( this . url ) ;
7377 }
7478
7579 postMessage ( value : T ) {
76- this . worker . postMessage ( value ) ;
80+ if ( this . worker ) {
81+ this . worker . postMessage ( value ) ;
82+ }
7783 }
7884}
0 commit comments