12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- const EventEmitter = require('events');
- const bus = new EventEmitter();
- bus.setMaxListeners(1000);
- module.exports = class {
- constructor(name, moduleManager) {
- this.name = name;
- this.moduleManager = moduleManager;
- this.lockdown = false;
- this.dependsOn = [];
- this.eventHandlers = [];
- this.state = "NOT_INITIALIZED";
- this.stage = 0;
- this.lastTime = 0;
- this.totalTimeInitialize = 0;
- this.timeDifferences = [];
- this.failed = false;
- }
- _initialize() {
- this.logger = this.moduleManager.modules["logger"];
- this.setState("INITIALIZING");
- this.initialize().then(() => {
- this.setState("INITIALIZED");
- this.setStage(0);
- this.moduleManager.printStatus();
- }).catch(async (err) => {
- this.failed = true;
- this.logger.error(err.stack);
- this.moduleManager.aModuleFailed(this);
- });
- }
- _onInitialize() {
- return new Promise(resolve => bus.once(`stateChange:${this.name}:INITIALIZED`, resolve));
- }
- _isInitialized() {
- return new Promise(resolve => {
- if (this.state === "INITIALIZED") resolve();
- });
- }
- _isNotLocked() {
- return new Promise((resolve, reject) => {
- if (this.state === "LOCKDOWN") reject();
- else resolve();
- });
- }
- setState(state) {
- this.state = state;
- bus.emit(`stateChange:${this.name}:${state}`);
- this.logger.info(`MODULE_STATE`, `${state}: ${this.name}`);
- }
- setStage(stage) {
- if (stage !== 1)
- this.totalTimeInitialize += (Date.now() - this.lastTime);
- //this.timeDifferences.push(this.stage + ": " + (Date.now() - this.lastTime) + "ms");
- this.timeDifferences.push(Date.now() - this.lastTime);
- this.lastTime = Date.now();
- this.stage = stage;
- this.moduleManager.printStatus();
- }
- _validateHook() {
- return Promise.race([this._onInitialize(), this._isInitialized()]).then(
- () => this._isNotLocked()
- );
- }
- _lockdown() {
- if (this.lockdown) return;
- this.lockdown = true;
- this.setState("LOCKDOWN");
- this.moduleManager.printStatus();
- }
- }
|