dev@47: import {Injectable} from '@angular/core'; dev@47: import { dev@51: ListResponse, ListRequest dev@47: } from "piper"; dev@64: import { dev@64: SimpleRequest, SimpleResponse dev@64: } from "piper/HigherLevelUtilities"; dev@51: import {Subject} from "rxjs/Subject"; dev@51: import {Observable} from "rxjs"; dev@44: dev@47: interface RequestMessage { dev@47: method: string; dev@47: params: RequestType; dev@47: } dev@47: dev@47: interface ResponseMessage { dev@47: method: string; dev@47: result: ResponseType; dev@47: } dev@40: dev@40: @Injectable() dev@40: export class FeatureExtractionService { dev@40: dev@40: private worker: Worker; dev@64: private featuresExtracted: Subject; dev@64: featuresExtracted$: Observable; dev@44: dev@40: constructor() { dev@40: this.worker = new Worker('bootstrap-feature-extraction-worker.js'); dev@64: this.featuresExtracted = new Subject(); dev@51: this.featuresExtracted$ = this.featuresExtracted.asObservable(); dev@40: } dev@40: dev@47: list(): Promise { dev@47: return this.request( dev@47: {method: 'list', params: {}}, dev@47: (ev: MessageEvent) => ev.data.result.available !== undefined dev@47: ).then(msg => msg.result); dev@40: } dev@40: dev@64: process(request: SimpleRequest): Promise { dev@64: return this.request( dev@47: {method: 'process', params: request}, dev@47: (ev: MessageEvent) => ev.data.method === 'process' dev@51: ).then(msg => { dev@51: this.featuresExtracted.next(msg.result); dev@51: return msg.result; dev@51: }); dev@44: } dev@44: dev@64: collect(request: SimpleRequest): Promise { dev@64: return this.request( dev@62: {method: 'collect', params: request}, dev@62: (ev: MessageEvent) => ev.data.method === 'collect' dev@62: ).then(msg => { dev@62: this.featuresExtracted.next(msg.result); dev@62: return msg.result; dev@62: }); dev@62: } dev@62: dev@47: private request(request: RequestMessage, dev@47: predicate: (ev: MessageEvent) => boolean) dev@47: : Promise> { dev@44: return new Promise(res => { dev@47: const listener = (ev: MessageEvent) => { dev@44: this.worker.removeEventListener('message', listener); dev@44: if (predicate(ev)) dev@44: res(ev.data); dev@44: }; dev@44: this.worker.addEventListener('message', listener); dev@44: this.worker.postMessage(request); dev@47: }).catch(err => console.error(err)); dev@44: } dev@40: }