dev@47
|
1 import {Injectable} from '@angular/core';
|
dev@47
|
2 import {
|
dev@51
|
3 ListResponse, ListRequest
|
dev@47
|
4 } from "piper";
|
dev@64
|
5 import {
|
dev@64
|
6 SimpleRequest, SimpleResponse
|
dev@64
|
7 } from "piper/HigherLevelUtilities";
|
dev@51
|
8 import {Subject} from "rxjs/Subject";
|
dev@51
|
9 import {Observable} from "rxjs";
|
dev@44
|
10
|
dev@47
|
11 interface RequestMessage<RequestType> {
|
dev@47
|
12 method: string;
|
dev@47
|
13 params: RequestType;
|
dev@47
|
14 }
|
dev@47
|
15
|
dev@47
|
16 interface ResponseMessage<ResponseType> {
|
dev@47
|
17 method: string;
|
dev@47
|
18 result: ResponseType;
|
dev@47
|
19 }
|
dev@40
|
20
|
dev@40
|
21 @Injectable()
|
dev@40
|
22 export class FeatureExtractionService {
|
dev@40
|
23
|
dev@40
|
24 private worker: Worker;
|
dev@64
|
25 private featuresExtracted: Subject<SimpleResponse>;
|
dev@64
|
26 featuresExtracted$: Observable<SimpleResponse>;
|
dev@44
|
27
|
dev@40
|
28 constructor() {
|
dev@40
|
29 this.worker = new Worker('bootstrap-feature-extraction-worker.js');
|
dev@64
|
30 this.featuresExtracted = new Subject<SimpleResponse>();
|
dev@51
|
31 this.featuresExtracted$ = this.featuresExtracted.asObservable();
|
dev@40
|
32 }
|
dev@40
|
33
|
dev@47
|
34 list(): Promise<ListResponse> {
|
dev@47
|
35 return this.request<ListRequest, ListResponse>(
|
dev@47
|
36 {method: 'list', params: {}},
|
dev@47
|
37 (ev: MessageEvent) => ev.data.result.available !== undefined
|
dev@47
|
38 ).then(msg => msg.result);
|
dev@40
|
39 }
|
dev@40
|
40
|
dev@64
|
41 process(request: SimpleRequest): Promise<SimpleResponse> {
|
dev@64
|
42 return this.request<SimpleRequest, SimpleResponse>(
|
dev@47
|
43 {method: 'process', params: request},
|
dev@47
|
44 (ev: MessageEvent) => ev.data.method === 'process'
|
dev@51
|
45 ).then(msg => {
|
dev@51
|
46 this.featuresExtracted.next(msg.result);
|
dev@51
|
47 return msg.result;
|
dev@51
|
48 });
|
dev@44
|
49 }
|
dev@44
|
50
|
dev@64
|
51 collect(request: SimpleRequest): Promise<SimpleResponse> {
|
dev@64
|
52 return this.request<SimpleRequest, SimpleResponse>(
|
dev@62
|
53 {method: 'collect', params: request},
|
dev@62
|
54 (ev: MessageEvent) => ev.data.method === 'collect'
|
dev@62
|
55 ).then(msg => {
|
dev@62
|
56 this.featuresExtracted.next(msg.result);
|
dev@62
|
57 return msg.result;
|
dev@62
|
58 });
|
dev@62
|
59 }
|
dev@62
|
60
|
dev@47
|
61 private request<Req, Res>(request: RequestMessage<Req>,
|
dev@47
|
62 predicate: (ev: MessageEvent) => boolean)
|
dev@47
|
63 : Promise<ResponseMessage<Res>> {
|
dev@44
|
64 return new Promise(res => {
|
dev@47
|
65 const listener = (ev: MessageEvent) => {
|
dev@44
|
66 this.worker.removeEventListener('message', listener);
|
dev@44
|
67 if (predicate(ev))
|
dev@44
|
68 res(ev.data);
|
dev@44
|
69 };
|
dev@44
|
70 this.worker.addEventListener('message', listener);
|
dev@44
|
71 this.worker.postMessage(request);
|
dev@47
|
72 }).catch(err => console.error(err));
|
dev@44
|
73 }
|
dev@40
|
74 }
|