docs: add FIXME
[e-mobility-charging-stations-simulator.git] / src / charging-station / Bootstrap.ts
index b59d925fb233202461ba71d2d07a9d9d3c7f5c01..3612f2818692671235bcd59384837c06e8ec8b62 100644 (file)
@@ -3,7 +3,7 @@
 import { EventEmitter } from 'node:events';
 import path from 'node:path';
 import { fileURLToPath } from 'node:url';
-import { type Worker, isMainThread } from 'node:worker_threads';
+import { isMainThread } from 'node:worker_threads';
 
 import chalk from 'chalk';
 
@@ -31,7 +31,7 @@ import {
   handleUnhandledRejection,
   logger,
 } from '../utils';
-import { type MessageHandler, type WorkerAbstract, WorkerFactory } from '../worker';
+import { type WorkerAbstract, WorkerFactory } from '../worker';
 
 const moduleName = 'Bootstrap';
 
@@ -162,11 +162,22 @@ export class Bootstrap extends EventEmitter {
             Constants.EMPTY_FREEZED_OBJECT
           )
         );
-        await ChargingStationUtils.waitForChargingStationEvents(
-          this,
-          ChargingStationWorkerMessageEvents.stopped,
-          this.numberOfChargingStations
-        );
+        await Promise.race([
+          ChargingStationUtils.waitForChargingStationEvents(
+            this,
+            ChargingStationWorkerMessageEvents.stopped,
+            this.numberOfChargingStations
+          ),
+          new Promise<string>((resolve) => {
+            setTimeout(() => {
+              const message = `Timeout reached ${Utils.formatDurationMilliSeconds(
+                Constants.STOP_SIMULATOR_TIMEOUT
+              )} at stopping charging stations simulator`;
+              console.warn(chalk.yellow(message));
+              resolve(message);
+            }, Constants.STOP_SIMULATOR_TIMEOUT);
+          }),
+        ]);
         await this.workerImplementation?.stop();
         this.workerImplementation = null;
         this.uiServer?.stop();
@@ -201,8 +212,8 @@ export class Bootstrap extends EventEmitter {
           elementsPerWorker: Configuration.getWorker().elementsPerWorker,
           poolOptions: {
             workerChoiceStrategy: Configuration.getWorker().poolStrategy,
+            messageHandler: this.messageHandler.bind(this) as (message: unknown) => void,
           },
-          messageHandler: this.messageHandler.bind(this) as MessageHandler<Worker>,
         }
       ));
   }