dev@74
|
1 import {Injectable, Inject} from '@angular/core';
|
dev@47
|
2 import {
|
dev@226
|
3 ListResponse
|
dev@236
|
4 } from 'piper';
|
dev@64
|
5 import {
|
dev@226
|
6 SimpleRequest,
|
dev@226
|
7 SimpleResponse
|
dev@236
|
8 } from 'piper/HigherLevelUtilities';
|
dev@236
|
9 import {Subject} from 'rxjs/Subject';
|
dev@236
|
10 import {Observable} from 'rxjs/Observable';
|
dev@236
|
11 import {Http, Response} from '@angular/http';
|
dev@226
|
12 import {
|
dev@226
|
13 countingIdProvider,
|
dev@226
|
14 WebWorkerStreamingClient
|
dev@236
|
15 } from 'piper/client-stubs/WebWorkerStreamingClient';
|
dev@236
|
16 import {RequestId} from 'piper/protocols/WebWorkerProtocol';
|
dev@40
|
17
|
dev@74
|
18 type RepoUri = string;
|
dev@74
|
19 export interface AvailableLibraries {
|
dev@74
|
20 [libraryKey: string]: RepoUri;
|
dev@74
|
21 }
|
dev@74
|
22
|
dev@226
|
23 export interface Progress {
|
dev@226
|
24 id: RequestId;
|
dev@226
|
25 value: number; // between 0 and 100, for material-ui
|
dev@226
|
26 }
|
dev@226
|
27
|
dev@40
|
28 @Injectable()
|
dev@40
|
29 export class FeatureExtractionService {
|
dev@40
|
30
|
dev@40
|
31 private worker: Worker;
|
dev@64
|
32 private featuresExtracted: Subject<SimpleResponse>;
|
dev@64
|
33 featuresExtracted$: Observable<SimpleResponse>;
|
dev@74
|
34 private librariesUpdated: Subject<ListResponse>;
|
dev@74
|
35 librariesUpdated$: Observable<ListResponse>;
|
dev@226
|
36 private progressUpdated: Subject<Progress>;
|
dev@226
|
37 progressUpdated$: Observable<Progress>;
|
dev@226
|
38 private client: WebWorkerStreamingClient;
|
dev@44
|
39
|
dev@236
|
40 constructor(private http: Http,
|
dev@236
|
41 @Inject('PiperRepoUri') private repositoryUri: RepoUri) {
|
dev@40
|
42 this.worker = new Worker('bootstrap-feature-extraction-worker.js');
|
dev@64
|
43 this.featuresExtracted = new Subject<SimpleResponse>();
|
dev@51
|
44 this.featuresExtracted$ = this.featuresExtracted.asObservable();
|
dev@74
|
45 this.librariesUpdated = new Subject<ListResponse>();
|
dev@74
|
46 this.librariesUpdated$ = this.librariesUpdated.asObservable();
|
dev@226
|
47 this.progressUpdated = new Subject<Progress>();
|
dev@226
|
48 this.progressUpdated$ = this.progressUpdated.asObservable();
|
dev@74
|
49 this.worker.addEventListener('message', (ev: MessageEvent) => {
|
dev@74
|
50 const isValidResponse = ev.data.method === 'import'
|
dev@226
|
51 && ev.data.result && ev.data.result.available ;
|
dev@74
|
52 if (isValidResponse) {
|
dev@226
|
53 (ev as Event).stopImmediatePropagation();
|
dev@74
|
54 this.librariesUpdated.next(ev.data.result);
|
dev@74
|
55 }
|
dev@226
|
56 }, true);
|
dev@226
|
57
|
dev@226
|
58 this.client = new WebWorkerStreamingClient(
|
dev@226
|
59 this.worker,
|
dev@226
|
60 countingIdProvider(0)
|
dev@236
|
61 );
|
dev@40
|
62 }
|
dev@40
|
63
|
dev@47
|
64 list(): Promise<ListResponse> {
|
dev@226
|
65 return this.client.list({});
|
dev@40
|
66 }
|
dev@40
|
67
|
dev@226
|
68 extract(analysisItemId: string, request: SimpleRequest): Promise<void> {
|
dev@226
|
69 return this.client.collect(request)
|
dev@226
|
70 .do(val => {
|
dev@247
|
71 if (val.totalBlockCount > 0) {
|
dev@247
|
72 this.progressUpdated.next({
|
dev@247
|
73 id: analysisItemId,
|
dev@247
|
74 value: (val.processedBlockCount / val.totalBlockCount) * 100
|
dev@247
|
75 });
|
dev@247
|
76 }
|
dev@226
|
77 })
|
dev@226
|
78 .toPromise()
|
dev@226
|
79 .then((response) => {
|
dev@226
|
80 this.featuresExtracted.next(response);
|
dev@226
|
81 });
|
dev@62
|
82 }
|
dev@62
|
83
|
dev@74
|
84 updateAvailableLibraries(): Observable<AvailableLibraries> {
|
dev@74
|
85 return this.http.get(this.repositoryUri)
|
dev@74
|
86 .map(res => {
|
dev@74
|
87 const map = res.json();
|
dev@74
|
88 this.worker.postMessage({
|
dev@74
|
89 method: 'addRemoteLibraries',
|
dev@74
|
90 params: map
|
dev@74
|
91 });
|
dev@74
|
92 return map;
|
dev@74
|
93 })
|
dev@74
|
94 .catch((error: Response | any) => {
|
dev@74
|
95 console.error(error);
|
dev@74
|
96 return Observable.throw(error);
|
dev@74
|
97 });
|
dev@74
|
98 }
|
dev@74
|
99
|
dev@74
|
100 load(libraryKey: string): void {
|
dev@74
|
101 this.worker.postMessage({method: 'import', params: libraryKey});
|
dev@74
|
102 }
|
dev@40
|
103 }
|