annotate src/app/services/feature-extraction/feature-extraction.service.ts @ 297:73beb0e970c5

Modify FeatureReducers so that it compiles.
author Chris Cannam <cannam@all-day-breakfast.com>
date Wed, 10 May 2017 14:47:26 +0100
parents 7a6ef711c73a
children 75a234459d3b
rev   line source
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 }