| 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();
 
- 	}
 
- }
 
 
  |