@intuitionrobotics/ts-common
Version:
69 lines • 2.54 kB
JavaScript
import { Module } from "./module.js";
import { Dispatcher } from "./dispatcher.js";
import { BadImplementationException } from "./exceptions.js";
import { Logger } from "./logger/Logger.js";
import { setAppConfig } from "./app-config.js";
import { addItemToArray, filterDuplicates } from "../utils/array-tools.js";
import {} from "../utils/types.js";
const _modules = [];
export function moduleResolver() {
return _modules;
}
export class ModuleManager extends Logger {
config;
modules = _modules;
static instance;
// noinspection JSUnusedLocalSymbols
constructor() {
super();
if (ModuleManager.instance)
throw new BadImplementationException("Already have one instance of ModuleManager");
ModuleManager.instance = this;
Dispatcher.modulesResolver = moduleResolver;
}
filterModules(filter) {
return this.modules.filter(filter);
}
getModule(moduleName) {
return this.modules.find(module => module.getName() === moduleName);
}
setConfig(config) {
this.config = config || {};
// One frozen copy in the process; modules resolve their slice lazily on first
// `this.config` access (see Module) instead of having it pushed into them.
setAppConfig(this.config);
return this;
}
addModules(...modules) {
modules.reduce((carry, module) => {
if (!carry.includes(module))
addItemToArray(carry, module);
return carry;
}, this.modules);
return this;
}
setModules(...modules) {
this.modules = filterDuplicates(modules);
return this;
}
init() {
this.logVerbose(`--------- initializing app ---------`);
// Config is no longer pushed into modules here — each module lazily resolves
// its slice from the app-config store on first `this.config` access.
this.modules.forEach((module) => module.setManager(this));
this.modules.forEach(module => {
this.logVerbose(`--------- ${module.getName()} ---------`);
// @ts-expect-error TS struggles with this dynamic typing
module.init();
// @ts-expect-error TS struggles with this dynamic typing
module.initiated = true;
});
this.modules.forEach(module => module.validate());
this.logVerbose(`--------- INITIALIZED ---------`);
return this;
}
build() {
this.init();
}
}
//# sourceMappingURL=module-manager.js.map