@fleetbase/fleetops-engine
Version:
Fleet & Transport Management Extension for Fleetbase
68 lines (56 loc) • 2.1 kB
JavaScript
import Service, { inject as service } from '@ember/service';
import { tracked } from '@glimmer/tracking';
import { underscore } from '@ember/string';
export class RouteOptimizationRegistry {
engines = {};
}
export default class RouteOptimizationService extends Service {
universe;
registry = this.#initializeRegistry();
get availableEngines() {
return Object.keys(this.registry.engines).map(underscore);
}
get availableServices() {
return Object.entries(this.registry.engines).map(([key, engine]) => ({
key,
name: engine.name ?? key,
}));
}
register(name, engine) {
if (typeof engine.optimize !== 'function') {
throw new Error(`Cannot register "${name}": missing optimize()`);
}
this.registry.engines = {
...this.registry.engines,
[underscore(name)]: engine,
};
}
/* eslint-disable no-unused-vars */
unregister(name) {
let key = underscore(name);
let { [key]: _, ...rest } = this.registry.engines;
this.registry.engines = rest;
}
optimize(name, params = {}, options = {}) {
let engine = this.registry.engines[underscore(name)];
if (!engine) {
return Promise.reject(new Error(`No route optimization engine registered as "${name}"`));
}
return engine.optimize(params, options);
}
handler(name, context, data) {
let engine = this.registry.engines[underscore(name)];
if (!engine) {
throw new Error(`No route optimization engine registered as "${name}"`);
}
return engine.handler(context, data);
}
#initializeRegistry() {
const registry = 'registry:route-optimization-engines';
const application = this.universe.getApplicationInstance();
if (!application.hasRegistration(registry)) {
application.register(registry, new RouteOptimizationRegistry(), { instantiate: false });
}
return application.resolveRegistration(registry);
}
}