refactor(simulator): factor out data transfer response
[e-mobility-charging-stations-simulator.git] / src / charging-station / Bootstrap.ts
index 6be5d275682b3e5bdf5ead54916334d94825ebee..3312224278521fe7e98fc128b58c2ad5bc887fb6 100644 (file)
@@ -6,8 +6,9 @@ import { type Worker, isMainThread } from 'node:worker_threads';
 
 import chalk from 'chalk';
 
-import { type AbstractUIServer, ChargingStationUtils, UIServerFactory } from './internal';
-import { version } from '../../package.json';
+import type { AbstractUIServer } from './ui-server/AbstractUIServer';
+import { UIServerFactory } from './ui-server/UIServerFactory';
+import packageJson from '../../package.json' assert { type: 'json' };
 import { BaseError } from '../exception';
 import { type Storage, StorageFactory } from '../performance';
 import {
@@ -19,7 +20,7 @@ import {
   type StationTemplateUrl,
   type Statistics,
 } from '../types';
-import { Configuration, Utils, logger } from '../utils';
+import { Configuration, ErrorUtils, Utils, logger } from '../utils';
 import { type MessageHandler, type WorkerAbstract, WorkerFactory } from '../worker';
 
 const moduleName = 'Bootstrap';
@@ -37,22 +38,21 @@ export class Bootstrap {
   private readonly uiServer!: AbstractUIServer | null;
   private readonly storage!: Storage;
   private numberOfStartedChargingStations!: number;
-  private readonly version: string = version;
+  private readonly version: string = packageJson.version;
   private initializedCounters: boolean;
   private started: boolean;
   private readonly workerScript: string;
 
   private constructor() {
     // Enable unconditionally for now
-    this.logUnhandledRejection();
-    this.logUncaughtException();
+    ErrorUtils.handleUnhandledRejection();
+    ErrorUtils.handleUncaughtException();
     this.initializedCounters = false;
     this.started = false;
     this.initializeCounters();
     this.workerImplementation = null;
     this.workerScript = path.join(
-      path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../'),
-      'charging-station',
+      path.dirname(fileURLToPath(import.meta.url)),
       `ChargingStationWorker${path.extname(fileURLToPath(import.meta.url))}`
     );
     Configuration.getUIServer().enabled === true &&
@@ -101,11 +101,11 @@ export class Bootstrap {
           `Charging stations simulator ${
             this.version
           } started with ${this.numberOfChargingStations.toString()} charging station(s) from ${this.numberOfChargingStationTemplates.toString()} configured charging station template(s) and ${
-            ChargingStationUtils.workerDynamicPoolInUse()
+            Configuration.workerDynamicPoolInUse()
               ? `${Configuration.getWorker().poolMinSize?.toString()}/`
               : ''
           }${this.workerImplementation?.size}${
-            ChargingStationUtils.workerPoolInUse()
+            Configuration.workerPoolInUse()
               ? `/${Configuration.getWorker().poolMaxSize?.toString()}`
               : ''
           } worker(s) concurrently running in '${Configuration.getWorker().processType}' mode${
@@ -236,9 +236,9 @@ export class Bootstrap {
       const stationTemplateUrls = Configuration.getStationTemplateUrls();
       if (Utils.isNotEmptyArray(stationTemplateUrls)) {
         this.numberOfChargingStationTemplates = stationTemplateUrls.length;
-        stationTemplateUrls.forEach((stationTemplateUrl) => {
+        for (const stationTemplateUrl of stationTemplateUrls) {
           this.numberOfChargingStations += stationTemplateUrl.numberOfStations ?? 0;
-        });
+        }
       } else {
         console.warn(
           chalk.yellow("'stationTemplateUrls' not defined or empty in configuration, exiting")
@@ -256,18 +256,6 @@ export class Bootstrap {
     }
   }
 
-  private logUncaughtException(): void {
-    process.on('uncaughtException', (error: Error) => {
-      console.error(chalk.red('Uncaught exception: '), error);
-    });
-  }
-
-  private logUnhandledRejection(): void {
-    process.on('unhandledRejection', (reason: unknown) => {
-      console.error(chalk.red('Unhandled rejection: '), reason);
-    });
-  }
-
   private async startChargingStation(
     index: number,
     stationTemplateUrl: StationTemplateUrl
@@ -275,7 +263,7 @@ export class Bootstrap {
     await this.workerImplementation?.addElement({
       index,
       templateFile: path.join(
-        path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../'),
+        path.dirname(fileURLToPath(import.meta.url)),
         'assets',
         'station-templates',
         stationTemplateUrl.file