You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

131 lines
3.7 KiB

import { Task } from '../models/task_model';
import * as SegmentsController from '../models/segment_model';
import * as AnalyticUnit from '../models/analytic_unit_model';
import { AnalyticsService, AnalyticsMessage } from '../services/analytics_service';
6 years ago
const taskMap = new Map<string, any>();
6 years ago
let nextTaskId = 0;
let analyticsService: AnalyticsService = undefined;
function onTaskResult(taskResult: any) {
let taskId = taskResult._taskId;
let status = taskResult.status;
if(status === 'SUCCESS' || status === 'FAILED') {
6 years ago
if(taskId in taskMap) {
let resolver: any = taskMap.get(taskId);
resolver(taskResult);
taskMap.delete(taskId);
6 years ago
}
}
}
async function onMessage(message: AnalyticsMessage) {
let responsePayload = null;
let resolvedMethod = false;
if(message.method === 'TASK_RESULT') {
onTaskResult(message.payload);
resolvedMethod = true;
}
if(!resolvedMethod) {
throw new TypeError('Unknown method ' + message.method);
}
// TODO: catch exception and send error in this case
if(message.requestId !== undefined) {
message.payload = responsePayload;
analyticsService.sendMessage(message);
}
}
export function init() {
analyticsService = new AnalyticsService(onMessage);
}
export function terminate() {
analyticsService.close();
}
async function runTask(task: Task): Promise<any> {
// let anomaly: AnalyticUnit.AnalyticUnit = await AnalyticUnit.findById(task.analyticUnitId);
// task.metric = {
// datasource: anomaly.metric.datasource,
// targets: anomaly.metric.targets.map(getTarget)
// };
// task._taskId = nextTaskId++;
// await analyticsService.sendTask(task);
// return new Promise<void>(resolve => {
// taskMap[task._taskId] = resolve;
// })
6 years ago
}
6 years ago
export async function runLearning(id: AnalyticUnit.AnalyticUnitId) {
// let segments = getLabeledSegments(id);
// AnalyticUnit.setStatus(id, 'LEARNING');
// let unit = await AnalyticUnit.findById(id);
// let pattern = unit.type;
// let task = {
// analyticUnitId: id,
// type: 'LEARN',
// pattern,
// segments: segments
// };
// let result = await runTask(task);
// if (result.status === 'SUCCESS') {
// AnalyticUnit.setStatus(id, 'READY');
// insertSegments(id, result.segments, false);
// AnalyticUnit.setPredictionTime(id, result.lastPredictionTime);
// } else {
// AnalyticUnit.setStatus(id, 'FAILED', result.error);
// }
6 years ago
}
6 years ago
export async function runPredict(id: AnalyticUnit.AnalyticUnitId) {
// let unit = await AnalyticUnit.findById(id);
// let pattern = unit.type;
// let task = {
// type: 'PREDICT',
// analyticUnitId: id,
// pattern,
// lastPredictionTime: unit.lastPredictionTime
// };
// let result = await runTask(task);
// if(result.status === 'FAILED') {
// return [];
// }
// // Merging segments
// let segments = getLabeledSegments(id);
// if(segments.length > 0 && result.segments.length > 0) {
// let lastOldSegment = segments[segments.length - 1];
// let firstNewSegment = result.segments[0];
// if(firstNewSegment.start <= lastOldSegment.finish) {
// result.segments[0].start = lastOldSegment.start;
// removeSegments(id, [lastOldSegment.id]);
// }
// }
// insertSegments(id, result.segments, false);
// AnalyticUnit.setPredictionTime(id, result.lastPredictionTime);
// return result.segments;
}
export function isAnalyticReady(): boolean {
return analyticsService.ready;
}
export async function createAnalyticUnitFromObject(obj: any): Promise<AnalyticUnit.AnalyticUnitId> {
6 years ago
let unit: AnalyticUnit.AnalyticUnit = AnalyticUnit.AnalyticUnit.fromObject(obj);
let id = await AnalyticUnit.create(unit);
// runLearning(unit);
6 years ago
return id;
}