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

Commit e1e7d0a

Browse files
committed
chore: use Subject instead of an array of observers
1 parent b20aad5 commit e1e7d0a

File tree

1 file changed

+10
-20
lines changed

1 file changed

+10
-20
lines changed

projects/workers/src/worker/classes/web-worker.ts

+10-20
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
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';
33
import {WORKER_BLANK_FN} from '../consts/worker-fn-template';
44
import {TypedMessageEvent} from '../types/typed-message-event';
55
import {WorkerFunction} from '../types/worker-function';
66

77
export 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

Comments
 (0)