|
@@ -61,26 +61,57 @@ export default class ModuleManager {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * startup - Handle startup
|
|
|
+ * startModule - Start module
|
|
|
*/
|
|
|
- public async startup() {
|
|
|
- await this.loadModules().catch(async err => {
|
|
|
- await this.shutdown();
|
|
|
+ private async startModule(module: Modules[keyof Modules]) {
|
|
|
+ switch (module.getStatus()) {
|
|
|
+ case ModuleStatus.STARTING:
|
|
|
+ case ModuleStatus.STARTED:
|
|
|
+ return;
|
|
|
+ case ModuleStatus.ERROR:
|
|
|
+ throw new Error("Dependent module failed to start");
|
|
|
+ case ModuleStatus.STOPPING:
|
|
|
+ case ModuleStatus.STOPPED:
|
|
|
+ case ModuleStatus.DISABLED:
|
|
|
+ throw new Error("Dependent module is unavailable");
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (const name of module.getDependentModules()) {
|
|
|
+ const dependency = this.getModule(name);
|
|
|
+
|
|
|
+ if (!dependency) throw new Error("Dependent module not found");
|
|
|
+
|
|
|
+ // eslint-disable-next-line no-await-in-loop
|
|
|
+ await this.startModule(dependency);
|
|
|
+ }
|
|
|
+
|
|
|
+ await module.startup().catch(async err => {
|
|
|
+ module.setStatus(ModuleStatus.ERROR);
|
|
|
throw err;
|
|
|
});
|
|
|
- if (!this.modules) throw new Error("No modules were loaded");
|
|
|
- await Promise.all(
|
|
|
- Object.values(this.modules).map(async module => {
|
|
|
- await module.startup().catch(async err => {
|
|
|
- module.setStatus(ModuleStatus.ERROR);
|
|
|
- throw err;
|
|
|
- });
|
|
|
- })
|
|
|
- ).catch(async err => {
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * startup - Handle startup
|
|
|
+ */
|
|
|
+ public async startup() {
|
|
|
+ try {
|
|
|
+ await this.loadModules();
|
|
|
+
|
|
|
+ if (!this.modules) throw new Error("No modules were loaded");
|
|
|
+
|
|
|
+ for (const module of Object.values(this.modules)) {
|
|
|
+ // eslint-disable-next-line no-await-in-loop
|
|
|
+ await this.startModule(module);
|
|
|
+ }
|
|
|
+
|
|
|
+ JobQueue.getPrimaryInstance().resume();
|
|
|
+ } catch (err) {
|
|
|
await this.shutdown();
|
|
|
throw err;
|
|
|
- });
|
|
|
- JobQueue.getPrimaryInstance().resume();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|