Add worker configuration section
[e-mobility-charging-stations-simulator.git] / src / utils / Configuration.ts
index 0b0bec774c1465c147f54689de9846aba8faf143..3fec05a882ba2803339307c83a9edbcf625ea9f2 100644 (file)
@@ -1,26 +1,27 @@
 import ConfigurationData, {
+  ServerOptions,
   StationTemplateUrl,
   StorageConfiguration,
   SupervisionUrlDistribution,
   UIServerConfiguration,
+  WorkerConfiguration,
 } from '../types/ConfigurationData';
 
 import Constants from './Constants';
 import { EmptyObject } from '../types/EmptyObject';
 import { FileType } from '../types/FileType';
 import { HandleErrorParams } from '../types/Error';
-import { ServerOptions } from 'ws';
 import { StorageType } from '../types/Storage';
-import type { WorkerChoiceStrategy } from 'poolifier';
 import WorkerConstants from '../worker/WorkerConstants';
 import { WorkerProcessType } from '../types/Worker';
 import chalk from 'chalk';
+import { fileURLToPath } from 'url';
 import fs from 'fs';
 import path from 'path';
 
 export default class Configuration {
   private static configurationFile = path.join(
-    path.resolve(__dirname, '../'),
+    path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../'),
     'assets',
     'config.json'
   );
@@ -46,6 +47,11 @@ export default class Configuration {
   }
 
   static getUIServer(): UIServerConfiguration {
+    if (Configuration.objectHasOwnProperty(Configuration.getConfig(), 'uiWebSocketServer')) {
+      console.error(
+        chalk`{green ${Configuration.logPrefix()}} {red Deprecated configuration section 'uiWebSocketServer' usage. Use 'uiServer' instead}`
+      );
+    }
     let options: ServerOptions = {
       host: Constants.DEFAULT_UI_WEBSOCKET_SERVER_HOST,
       port: Constants.DEFAULT_UI_WEBSOCKET_SERVER_PORT,
@@ -155,57 +161,89 @@ export default class Configuration {
     return Configuration.getConfig().stationTemplateUrls;
   }
 
-  static getWorkerProcess(): WorkerProcessType {
+  static getWorker(): WorkerConfiguration {
     Configuration.warnDeprecatedConfigurationKey(
       'useWorkerPool',
       null,
-      "Use 'workerProcess' to define the type of worker process model to use instead"
+      "Use 'worker' section to define the type of worker process model instead"
+    );
+    Configuration.warnDeprecatedConfigurationKey(
+      'workerProcess',
+      null,
+      "Use 'worker' section to define the type of worker process model instead"
+    );
+    Configuration.warnDeprecatedConfigurationKey(
+      'workerStartDelay',
+      null,
+      "Use 'worker' section to define the worker start delay instead"
+    );
+    Configuration.warnDeprecatedConfigurationKey(
+      'chargingStationsPerWorker',
+      null,
+      "Use 'worker' section to define the number of element(s) per worker instead"
+    );
+    Configuration.warnDeprecatedConfigurationKey(
+      'elementStartDelay',
+      null,
+      "Use 'worker' section to define the worker's element start delay instead"
+    );
+    Configuration.warnDeprecatedConfigurationKey(
+      'workerPoolMinSize',
+      null,
+      "Use 'worker' section to define the worker pool minimum size instead"
     );
-    return Configuration.objectHasOwnProperty(Configuration.getConfig(), 'workerProcess')
-      ? Configuration.getConfig().workerProcess
-      : WorkerProcessType.WORKER_SET;
-  }
-
-  static getWorkerStartDelay(): number {
-    return Configuration.objectHasOwnProperty(Configuration.getConfig(), 'workerStartDelay')
-      ? Configuration.getConfig().workerStartDelay
-      : WorkerConstants.DEFAULT_WORKER_START_DELAY;
-  }
-
-  static getElementStartDelay(): number {
-    return Configuration.objectHasOwnProperty(Configuration.getConfig(), 'elementStartDelay')
-      ? Configuration.getConfig().elementStartDelay
-      : WorkerConstants.DEFAULT_ELEMENT_START_DELAY;
-  }
-
-  static getWorkerPoolMinSize(): number {
-    return Configuration.objectHasOwnProperty(Configuration.getConfig(), 'workerPoolMinSize')
-      ? Configuration.getConfig().workerPoolMinSize
-      : WorkerConstants.DEFAULT_POOL_MIN_SIZE;
-  }
-
-  static getWorkerPoolMaxSize(): number {
     Configuration.warnDeprecatedConfigurationKey(
       'workerPoolSize;',
       null,
-      "Use 'workerPoolMaxSize' instead"
+      "Use 'worker' section to define the worker pool maximum size instead"
     );
-    return Configuration.objectHasOwnProperty(Configuration.getConfig(), 'workerPoolMaxSize')
-      ? Configuration.getConfig().workerPoolMaxSize
-      : WorkerConstants.DEFAULT_POOL_MAX_SIZE;
-  }
-
-  static getWorkerPoolStrategy(): WorkerChoiceStrategy {
-    return Configuration.getConfig().workerPoolStrategy;
-  }
-
-  static getChargingStationsPerWorker(): number {
-    return Configuration.objectHasOwnProperty(
-      Configuration.getConfig(),
-      'chargingStationsPerWorker'
-    )
-      ? Configuration.getConfig().chargingStationsPerWorker
-      : WorkerConstants.DEFAULT_ELEMENTS_PER_WORKER;
+    Configuration.warnDeprecatedConfigurationKey(
+      'workerPoolMaxSize;',
+      null,
+      "Use 'worker' section to define the worker pool maximum size instead"
+    );
+    Configuration.warnDeprecatedConfigurationKey(
+      'workerPoolStrategy;',
+      null,
+      "Use 'worker' section to define the worker pool strategy instead"
+    );
+    const workerConfiguration: WorkerConfiguration = {
+      processType: Configuration.objectHasOwnProperty(Configuration.getConfig(), 'workerProcess')
+        ? Configuration.getConfig().workerProcess
+        : WorkerProcessType.WORKER_SET,
+      startDelay: Configuration.objectHasOwnProperty(Configuration.getConfig(), 'workerStartDelay')
+        ? Configuration.getConfig().workerStartDelay
+        : WorkerConstants.DEFAULT_WORKER_START_DELAY,
+      elementsPerWorker: Configuration.objectHasOwnProperty(
+        Configuration.getConfig(),
+        'chargingStationsPerWorker'
+      )
+        ? Configuration.getConfig().chargingStationsPerWorker
+        : WorkerConstants.DEFAULT_ELEMENTS_PER_WORKER,
+      elementStartDelay: Configuration.objectHasOwnProperty(
+        Configuration.getConfig(),
+        'elementStartDelay'
+      )
+        ? Configuration.getConfig().elementStartDelay
+        : WorkerConstants.DEFAULT_ELEMENT_START_DELAY,
+      poolMinSize: Configuration.objectHasOwnProperty(
+        Configuration.getConfig(),
+        'workerPoolMinSize'
+      )
+        ? Configuration.getConfig().workerPoolMinSize
+        : WorkerConstants.DEFAULT_POOL_MIN_SIZE,
+      poolMaxSize: Configuration.objectHasOwnProperty(
+        Configuration.getConfig(),
+        'workerPoolMaxSize'
+      )
+        ? Configuration.getConfig().workerPoolMaxSize
+        : WorkerConstants.DEFAULT_POOL_MAX_SIZE,
+      poolStrategy: Configuration.getConfig().workerPoolStrategy,
+    };
+    if (Configuration.objectHasOwnProperty(Configuration.getConfig(), 'worker')) {
+      return { ...workerConfiguration, ...Configuration.getConfig().worker };
+    }
+    return workerConfiguration;
   }
 
   static getLogConsole(): boolean {
@@ -365,11 +403,14 @@ export default class Configuration {
     switch (storageType) {
       case StorageType.JSON_FILE:
         return `file://${path.join(
-          path.resolve(__dirname, '../../'),
+          path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../'),
           Constants.DEFAULT_PERFORMANCE_RECORDS_FILENAME
         )}`;
       case StorageType.SQLITE:
-        return `file://${path.join(path.resolve(__dirname, '../../'), SQLiteFileName)}`;
+        return `file://${path.join(
+          path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../'),
+          SQLiteFileName
+        )}`;
       default:
         throw new Error(`Performance storage URI is mandatory with storage type '${storageType}'`);
     }