view src/app/services/feature-extraction/feature-extraction.service.ts @ 47:933c64ebcd13

Some extraction logic in place.
author Lucas Thompson <dev@lucas.im>
date Mon, 05 Dec 2016 16:57:34 +0000
parents 13f5f228ed98
children 8619f25ff52a
line wrap: on
line source
import {Injectable} from '@angular/core';
import {
  ListResponse, ProcessResponse, ProcessRequest,
  ListRequest
} from "piper";
import {SimpleRequest} from "piper/HigherLevelUtilities";
import {FeatureList} from "piper/Feature";

interface RequestMessage<RequestType> {
  method: string;
  params: RequestType;
}

interface ResponseMessage<ResponseType> {
  method: string;
  result: ResponseType;
}

@Injectable()
export class FeatureExtractionService {

  private worker: Worker;


  constructor() {
    this.worker = new Worker('bootstrap-feature-extraction-worker.js');
  }

  list(): Promise<ListResponse> {
    return this.request<ListRequest, ListResponse>(
      {method: 'list', params: {}},
      (ev: MessageEvent) => ev.data.result.available !== undefined
    ).then(msg => msg.result);
  }

  process(request: SimpleRequest): Promise<FeatureList> {
    return this.request<SimpleRequest, FeatureList>(
      {method: 'process', params: request},
      (ev: MessageEvent) => ev.data.method === 'process'
    );
  }

  private request<Req, Res>(request: RequestMessage<Req>,
                            predicate: (ev: MessageEvent) => boolean)
  : Promise<ResponseMessage<Res>> {
    return new Promise(res => {
      const listener = (ev: MessageEvent) => {
        this.worker.removeEventListener('message', listener);
        if (predicate(ev))
          res(ev.data);
      };
      this.worker.addEventListener('message', listener);
      this.worker.postMessage(request);
    }).catch(err => console.error(err));
  }
}