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

Commit a7c1218

Browse files
committed
feat: added WorkerPipe
1 parent fb2c592 commit a7c1218

15 files changed

+99
-53
lines changed

projects/demo/src/app/app.browser.module.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
import {NgModule} from '@angular/core';
88
import {FormsModule} from '@angular/forms';
99
import {BrowserModule} from '@angular/platform-browser';
10-
import {WebWorkerModule} from '@ng-web-apis/workers';
10+
import {WorkerModule} from '@ng-web-apis/workers';
1111
import {AppComponent} from './app.component';
1212
import {AppRoutingModule} from './app.routes';
1313

@@ -18,7 +18,7 @@ import {AppRoutingModule} from './app.routes';
1818
FormsModule,
1919
BrowserModule.withServerTransition({appId: 'demo'}),
2020
AppRoutingModule,
21-
WebWorkerModule,
21+
WorkerModule,
2222
],
2323
declarations: [AppComponent],
2424
providers: [

projects/demo/src/app/app.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44
<button type="button" (click)="workerThread.complete()">Complete</button>
55
</form>
66

7-
{{ workerThread | async | json }}
7+
{{ workerThread | async | waWorker: oneMoreFn | async | json }}

projects/demo/src/app/app.component.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {ChangeDetectionStrategy, Component} from '@angular/core';
2-
import {WebWorker, WebWorkerExecutor} from '@ng-web-apis/workers';
2+
import {WebWorker, WorkerExecutor} from '@ng-web-apis/workers';
33

44
@Component({
55
selector: 'main',
@@ -10,9 +10,13 @@ import {WebWorker, WebWorkerExecutor} from '@ng-web-apis/workers';
1010
export class AppComponent {
1111
public workerThread: WebWorker<string, string>;
1212

13-
constructor(webWorkerExecutor: WebWorkerExecutor) {
13+
constructor(webWorkerExecutor: WorkerExecutor) {
1414
this.workerThread = webWorkerExecutor.createWorker((result: string) =>
1515
Promise.resolve(`Message from worker: ${result}`),
1616
);
1717
}
18+
19+
oneMoreFn(data: any): Promise<any> {
20+
return Promise.resolve().then(() => data);
21+
}
1822
}

projects/workers/src/public-api.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/**
22
* Public API Surface of @ng-web-apis/workers
33
*/
4-
export * from './web-worker/web-worker.module';
5-
export * from './web-worker/types/web-worker-function';
6-
export * from './web-worker/services/web-worker-executor.service';
7-
export * from './web-worker/classes/web-worker';
4+
export * from './worker/worker.module';
5+
export * from './worker/types/worker-function';
6+
export * from './worker/services/worker-executor.service';
7+
export * from './worker/classes/web-worker';

projects/workers/src/web-worker/services/web-worker-executor.service.ts

Lines changed: 0 additions & 30 deletions
This file was deleted.

projects/workers/src/web-worker/types/web-worker-function.ts

Lines changed: 0 additions & 1 deletion
This file was deleted.

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

Lines changed: 0 additions & 7 deletions
This file was deleted.

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import {fromEvent} from 'rxjs';
22
import {takeWhile} from 'rxjs/operators';
3-
import {WebWorkerFunction} from '../types/web-worker-function';
3+
import {WorkerFunction} from '../types/worker-function';
44
import {AnyNextSubject} from './any-next-subject';
55

6-
export class WebWorker<T, R> extends AnyNextSubject<R> {
6+
export class WebWorker<T = any, R = any> extends AnyNextSubject<R> {
77
private worker!: Worker;
88

9-
private static createFnUrl(fn: WebWorkerFunction): string {
9+
private static createFnUrl(fn: WorkerFunction): string {
1010
const script = `
1111
self.addEventListener('message', function(e) {
1212
var result = ((${fn.toString()}).call(null, e.data));
@@ -28,7 +28,7 @@ self.addEventListener('message', function(e) {
2828
}
2929

3030
public static fromFunction<T, R>(
31-
fn: WebWorkerFunction<T, R>,
31+
fn: WorkerFunction<T, R>,
3232
options?: WorkerOptions,
3333
): WebWorker<T, R> {
3434
return new WebWorker<T, R>(WebWorker.createFnUrl(fn), options);
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import {WorkerExecutor} from '../services/worker-executor.service';
2+
import {WorkerPipe} from './worker.pipe';
3+
4+
describe('WorkerPipe', () => {
5+
it('create an instance', () => {
6+
const pipe = new WorkerPipe(new WorkerExecutor());
7+
8+
expect(pipe).toBeTruthy();
9+
});
10+
});
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import {Pipe, PipeTransform} from '@angular/core';
2+
import {WebWorker} from '../classes/web-worker';
3+
import {WorkerExecutor} from '../services/worker-executor.service';
4+
import {WorkerFunction} from '../types/worker-function';
5+
6+
@Pipe({
7+
name: 'waWorker',
8+
})
9+
export class WorkerPipe implements PipeTransform {
10+
private workers = new WeakMap<WorkerFunction, WebWorker>();
11+
12+
constructor(private workerExecutor: WorkerExecutor) {}
13+
14+
transform(value: any, fn: WorkerFunction): any {
15+
const worker = this.workers.has(fn)
16+
? (this.workers.get(fn) as WebWorker)
17+
: this.workerExecutor.createWorker(fn);
18+
19+
this.workers.set(fn, worker);
20+
21+
worker.next(value);
22+
23+
return worker;
24+
}
25+
}

projects/workers/src/web-worker/services/web-worker-executor.service.spec.ts renamed to projects/workers/src/worker/services/worker-executor.service.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import {TestBed} from '@angular/core/testing';
22

3-
import {WebWorkerExecutor} from './web-worker-executor.service';
3+
import {WorkerExecutor} from './worker-executor.service';
44

55
describe('WebWorkerExecutorService', () => {
66
beforeEach(() => TestBed.configureTestingModule({}));
77

88
it('should be created', () => {
9-
const service: WebWorkerExecutor = TestBed.get(WebWorkerExecutor);
9+
const service: WorkerExecutor = TestBed.get(WorkerExecutor);
1010

1111
expect(service).toBeTruthy();
1212
});
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import {Injectable} from '@angular/core';
2+
import {WebWorker} from '../classes/web-worker';
3+
import {WorkerFunction} from '../types/worker-function';
4+
5+
@Injectable()
6+
export class WorkerExecutor {
7+
execute<T, R>(fn: WorkerFunction<T, R>, data?: T): Promise<R> {
8+
const worker = this.createWorker(fn);
9+
const promise = worker.toPromise();
10+
11+
worker.next(data);
12+
worker.complete();
13+
14+
return promise;
15+
}
16+
17+
createWorker<T, R>(
18+
fn: WorkerFunction<T, R>,
19+
options?: WorkerOptions,
20+
): WebWorker<T, R> {
21+
return WebWorker.fromFunction<T, R>(fn, options);
22+
}
23+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export type WorkerFunction<T = any, R = any> = (data: T) => R | PromiseLike<R>;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import {CommonModule} from '@angular/common';
2+
import {inject, InjectFlags, NgModule} from '@angular/core';
3+
import {WorkerPipe} from './pipes/worker.pipe';
4+
import {WorkerExecutor} from './services/worker-executor.service';
5+
6+
@NgModule({
7+
imports: [CommonModule],
8+
declarations: [WorkerPipe],
9+
exports: [WorkerPipe],
10+
providers: [
11+
{
12+
provide: WorkerExecutor,
13+
useFactory(): WorkerExecutor {
14+
const instance = inject(WorkerExecutor, InjectFlags.Optional);
15+
16+
return instance || new WorkerExecutor();
17+
},
18+
},
19+
],
20+
})
21+
export class WorkerModule {}

0 commit comments

Comments
 (0)