|
@@ -120,19 +120,39 @@ export default class ModuleManager {
|
|
|
* shutdown - Handle shutdown
|
|
|
*/
|
|
|
public async shutdown() {
|
|
|
- if (this.modules)
|
|
|
- await Promise.all(
|
|
|
- Object.values(this.modules).map(async module => {
|
|
|
- if (
|
|
|
- [
|
|
|
- ModuleStatus.STARTED,
|
|
|
- ModuleStatus.STARTING,
|
|
|
- ModuleStatus.ERROR
|
|
|
- ].includes(module.getStatus())
|
|
|
- )
|
|
|
- await module.shutdown();
|
|
|
- })
|
|
|
+ if (this.modules) {
|
|
|
+ const modules = Object.entries(this.modules).filter(([, module]) =>
|
|
|
+ [
|
|
|
+ ModuleStatus.STARTED,
|
|
|
+ ModuleStatus.STARTING,
|
|
|
+ ModuleStatus.ERROR
|
|
|
+ ].includes(module.getStatus())
|
|
|
);
|
|
|
+
|
|
|
+ const shutdownOrder: (keyof Modules)[] = [];
|
|
|
+
|
|
|
+ for (const [name, module] of modules) {
|
|
|
+ if (!shutdownOrder.includes(name)) shutdownOrder.push(name);
|
|
|
+
|
|
|
+ const dependencies = module.getDependentModules();
|
|
|
+
|
|
|
+ dependencies
|
|
|
+ .filter(dependency => shutdownOrder.includes(dependency))
|
|
|
+ .forEach(dependency => {
|
|
|
+ shutdownOrder.splice(
|
|
|
+ shutdownOrder.indexOf(dependency),
|
|
|
+ 1
|
|
|
+ );
|
|
|
+ });
|
|
|
+
|
|
|
+ shutdownOrder.push(...dependencies);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (const moduleName of shutdownOrder) {
|
|
|
+ // eslint-disable-next-line no-await-in-loop
|
|
|
+ await this.getModule(moduleName)?.shutdown();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static getPrimaryInstance(): ModuleManager {
|