annotate src/app/services/feature-extraction/feature-extraction.service.ts @ 64:270f59ef3b83

Incorporate recent piper changes and use output descriptor for some basic feature discrimination to render appropriate layers.
author Lucas Thompson <dev@lucas.im>
date Mon, 12 Dec 2016 00:41:37 +0000
parents 2171dd56756c
children 2c3fe51ad1f0
rev   line source
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 }