refactor(simulator): factor out common helpers
authorJérôme Benoit <jerome.benoit@sap.com>
Sat, 20 May 2023 19:15:19 +0000 (21:15 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Sat, 20 May 2023 19:15:19 +0000 (21:15 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
14 files changed:
.vscode/settings.json
src/charging-station/Bootstrap.ts
src/charging-station/ChargingStation.ts
src/charging-station/broadcast-channel/ChargingStationWorkerBroadcastChannel.ts [moved from src/charging-station/ChargingStationWorkerBroadcastChannel.ts with 97% similarity]
src/charging-station/broadcast-channel/UIServiceWorkerBroadcastChannel.ts [moved from src/charging-station/UIServiceWorkerBroadcastChannel.ts with 95% similarity]
src/charging-station/broadcast-channel/WorkerBroadcastChannel.ts [moved from src/charging-station/WorkerBroadcastChannel.ts with 96% similarity]
src/charging-station/index.ts
src/charging-station/ocpp/1.6/OCPP16ResponseService.ts
src/charging-station/ocpp/OCPPRequestService.ts
src/charging-station/ui-server/ui-services/AbstractUIService.ts
src/performance/PerformanceStatistics.ts
src/utils/ErrorUtils.ts
src/utils/MessageChannelUtils.ts [moved from src/charging-station/MessageChannelUtils.ts with 97% similarity]
src/utils/index.ts

index b619a9aac064c468a02e3f2fe0fa9c9efdf8d3f2..f417510fd916b0f89cbc3b175190b8c5031000d2 100644 (file)
@@ -35,6 +35,7 @@
     "robohydra",
     "sonarlint",
     "tsdoc",
+    "VCAP",
     "webui"
   ],
   "sonarlint.connectedMode.project": {
index 0fd80dde46bfc349ee91a9d55c3d8f168fbc19fd..c94a92048fc5a8845feabdb826512b546f5bd848 100644 (file)
@@ -21,7 +21,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';
@@ -46,8 +46,8 @@ export class Bootstrap {
 
   private constructor() {
     // Enable unconditionally for now
-    this.logUnhandledRejection();
-    this.logUncaughtException();
+    ErrorUtils.handleUnhandledRejection();
+    ErrorUtils.handleUncaughtException();
     this.initializedCounters = false;
     this.started = false;
     this.initializeCounters();
@@ -257,18 +257,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
index bf6a183a28f041c355e2574b0883c64c1be0f009..5ce061e8ed64c988b607f3f6b494b0d30c0526ad 100644 (file)
@@ -10,11 +10,10 @@ import merge from 'just-merge';
 import WebSocket, { type RawData } from 'ws';
 
 import { AutomaticTransactionGenerator } from './AutomaticTransactionGenerator';
+import { ChargingStationWorkerBroadcastChannel } from './broadcast-channel/ChargingStationWorkerBroadcastChannel';
 import { ChargingStationConfigurationUtils } from './ChargingStationConfigurationUtils';
 import { ChargingStationUtils } from './ChargingStationUtils';
-import { ChargingStationWorkerBroadcastChannel } from './ChargingStationWorkerBroadcastChannel';
 import { IdTagsCache } from './IdTagsCache';
-import { MessageChannelUtils } from './MessageChannelUtils';
 import {
   OCPP16IncomingRequestService,
   OCPP16RequestService,
@@ -92,6 +91,7 @@ import {
   DCElectricUtils,
   ErrorUtils,
   FileUtils,
+  MessageChannelUtils,
   Utils,
   logger,
 } from '../utils';
similarity index 97%
rename from src/charging-station/ChargingStationWorkerBroadcastChannel.ts
rename to src/charging-station/broadcast-channel/ChargingStationWorkerBroadcastChannel.ts
index 30cef34eb2e5e7898bfa728aa86488199df597b8..b2828305625a3de2428cfedc23b150c2549511ff 100644 (file)
@@ -1,8 +1,5 @@
-import type { ChargingStation } from './ChargingStation';
-import { ChargingStationConfigurationUtils } from './ChargingStationConfigurationUtils';
-import { OCPP16ServiceUtils } from './ocpp';
 import { WorkerBroadcastChannel } from './WorkerBroadcastChannel';
-import { BaseError, type OCPPError } from '../exception';
+import { BaseError, type OCPPError } from '../../exception';
 import {
   AuthorizationStatus,
   type AuthorizeRequest,
@@ -36,8 +33,11 @@ import {
   type StatusNotificationResponse,
   type StopTransactionRequest,
   type StopTransactionResponse,
-} from '../types';
-import { Constants, Utils, logger } from '../utils';
+} from '../../types';
+import { Constants, Utils, logger } from '../../utils';
+import type { ChargingStation } from '../ChargingStation';
+import { ChargingStationConfigurationUtils } from '../ChargingStationConfigurationUtils';
+import { OCPP16ServiceUtils } from '../ocpp';
 
 const moduleName = 'ChargingStationWorkerBroadcastChannel';
 
similarity index 95%
rename from src/charging-station/UIServiceWorkerBroadcastChannel.ts
rename to src/charging-station/broadcast-channel/UIServiceWorkerBroadcastChannel.ts
index 075a92c46249cc90a4426564c8cd0d0de64b278a..25d62962fbed2dcad29ec0fe6e0064fb1b0e0cdd 100644 (file)
@@ -1,4 +1,3 @@
-import type { AbstractUIService } from './ui-server/ui-services/AbstractUIService';
 import { WorkerBroadcastChannel } from './WorkerBroadcastChannel';
 import {
   type BroadcastChannelResponse,
@@ -6,8 +5,9 @@ import {
   type MessageEvent,
   type ResponsePayload,
   ResponseStatus,
-} from '../types';
-import { Utils, logger } from '../utils';
+} from '../../types';
+import { Utils, logger } from '../../utils';
+import type { AbstractUIService } from '../ui-server/ui-services/AbstractUIService';
 
 const moduleName = 'UIServiceWorkerBroadcastChannel';
 
similarity index 96%
rename from src/charging-station/WorkerBroadcastChannel.ts
rename to src/charging-station/broadcast-channel/WorkerBroadcastChannel.ts
index f3c168bdc8f1057611d1b8768d6d1dde0364c627..fd73b1bb59021ced8057ca4b85961dafbb860758 100644 (file)
@@ -5,8 +5,8 @@ import type {
   BroadcastChannelResponse,
   JsonType,
   MessageEvent,
-} from '../types';
-import { Utils, logger } from '../utils';
+} from '../../types';
+import { Utils, logger } from '../../utils';
 
 const moduleName = 'WorkerBroadcastChannel';
 
index db87a0d9c6968106013729f2a0b34e0fdbd3e264..e31bba0979090dc2d117b8fa88dcb61396bc9d26 100644 (file)
@@ -2,4 +2,3 @@ export { Bootstrap } from './Bootstrap';
 export type { ChargingStation } from './ChargingStation';
 export { ChargingStationConfigurationUtils } from './ChargingStationConfigurationUtils';
 export { ChargingStationUtils } from './ChargingStationUtils';
-export { MessageChannelUtils } from './MessageChannelUtils';
index 2aaeb23dccfb6107dcd4b1f4ea5ead4539b2965f..80ed03b61bc6de9adede1d450464473d512eb4f8 100644 (file)
@@ -9,7 +9,6 @@ import {
   type ChargingStation,
   ChargingStationConfigurationUtils,
   ChargingStationUtils,
-  MessageChannelUtils,
 } from '../../../charging-station';
 import { OCPPError } from '../../../exception';
 import {
@@ -50,7 +49,7 @@ import {
   type SetChargingProfileResponse,
   type UnlockConnectorResponse,
 } from '../../../types';
-import { Constants, Utils, logger } from '../../../utils';
+import { Constants, MessageChannelUtils, Utils, logger } from '../../../utils';
 import { OCPPResponseService } from '../OCPPResponseService';
 
 const moduleName = 'OCPP16ResponseService';
index f6aa567fd98deb7cf98f5b7b645d35c974cd8e88..06258fe4a1e071f7f1581420116329a80906dcd7 100644 (file)
@@ -8,11 +8,9 @@ import type { ChargingStation } from '../../charging-station';
 import { OCPPError } from '../../exception';
 import { PerformanceStatistics } from '../../performance';
 import {
-  type EmptyObject,
   type ErrorCallback,
   type ErrorResponse,
   ErrorType,
-  type HandleErrorParams,
   type IncomingRequestCommand,
   type JsonObject,
   type JsonType,
@@ -25,7 +23,7 @@ import {
   type ResponseCallback,
   type ResponseType,
 } from '../../types';
-import { Constants, Utils, logger } from '../../utils';
+import { Constants, ErrorUtils, Utils, logger } from '../../utils';
 
 const moduleName = 'OCPPRequestService';
 
@@ -129,7 +127,7 @@ export abstract class OCPPRequestService {
         commandName
       );
     } catch (error) {
-      this.handleSendMessageError(chargingStation, commandName, error as Error, {
+      ErrorUtils.handleSendMessageError(chargingStation, commandName, error as Error, {
         throwError: true,
       });
     }
@@ -151,7 +149,7 @@ export abstract class OCPPRequestService {
         commandName
       );
     } catch (error) {
-      this.handleSendMessageError(chargingStation, commandName, error as Error);
+      ErrorUtils.handleSendMessageError(chargingStation, commandName, error as Error);
     }
   }
 
@@ -176,7 +174,7 @@ export abstract class OCPPRequestService {
         params
       );
     } catch (error) {
-      this.handleSendMessageError(chargingStation, commandName, error as Error, {
+      ErrorUtils.handleSendMessageError(chargingStation, commandName, error as Error, {
         throwError: params.throwError,
       });
     }
@@ -477,18 +475,6 @@ export abstract class OCPPRequestService {
     return messageToSend;
   }
 
-  private handleSendMessageError(
-    chargingStation: ChargingStation,
-    commandName: RequestCommand | IncomingRequestCommand,
-    error: Error,
-    params: HandleErrorParams<EmptyObject> = { throwError: false }
-  ): void {
-    logger.error(`${chargingStation.logPrefix()} Request command '${commandName}' error:`, error);
-    if (params?.throwError === true) {
-      throw error;
-    }
-  }
-
   // eslint-disable-next-line @typescript-eslint/no-unused-vars
   public abstract requestHandler<ReqType extends JsonType, ResType extends JsonType>(
     chargingStation: ChargingStation,
index 0aaeb3aa3ac4ec57649c5ccc43f1b000d000f67a..71b057abe4a2f7369c1376d97ffcc55046eb0e89 100644 (file)
@@ -12,7 +12,7 @@ import {
 } from '../../../types';
 import { Utils, logger } from '../../../utils';
 import { Bootstrap } from '../../Bootstrap';
-import { UIServiceWorkerBroadcastChannel } from '../../UIServiceWorkerBroadcastChannel';
+import { UIServiceWorkerBroadcastChannel } from '../../broadcast-channel/UIServiceWorkerBroadcastChannel';
 import type { AbstractUIServer } from '../AbstractUIServer';
 
 const moduleName = 'AbstractUIService';
index c25cde0d1816de3a6ef2fb826538cbff4026930a..587532b7cf09c6e4729876a961c91c341730e723 100644 (file)
@@ -4,7 +4,6 @@ import { type PerformanceEntry, PerformanceObserver, performance } from 'node:pe
 import type { URL } from 'node:url';
 import { parentPort } from 'node:worker_threads';
 
-import { MessageChannelUtils } from '../charging-station';
 import {
   type IncomingRequestCommand,
   MessageType,
@@ -12,7 +11,14 @@ import {
   type Statistics,
   type TimeSeries,
 } from '../types';
-import { CircularArray, Configuration, Constants, Utils, logger } from '../utils';
+import {
+  CircularArray,
+  Configuration,
+  Constants,
+  MessageChannelUtils,
+  Utils,
+  logger,
+} from '../utils';
 
 export class PerformanceStatistics {
   private static readonly instances: Map<string, PerformanceStatistics> = new Map<
index 0589fa194037a5017fd889e162fca35f6d87de75..7efbe514cab80209f24befc9b6eb565ca9083cb5 100644 (file)
@@ -2,13 +2,32 @@ import chalk from 'chalk';
 
 import { logger } from './Logger';
 import { Utils } from './Utils';
-import type { EmptyObject, FileType, HandleErrorParams } from '../types';
+import type { ChargingStation } from '../charging-station';
+import type {
+  EmptyObject,
+  FileType,
+  HandleErrorParams,
+  IncomingRequestCommand,
+  RequestCommand,
+} from '../types';
 
 export class ErrorUtils {
   private constructor() {
     // This is intentional
   }
 
+  public static handleUncaughtException(): void {
+    process.on('uncaughtException', (error: Error) => {
+      console.error(chalk.red('Uncaught exception: '), error);
+    });
+  }
+
+  public static handleUnhandledRejection(): void {
+    process.on('unhandledRejection', (reason: unknown) => {
+      console.error(chalk.red('Unhandled rejection: '), reason);
+    });
+  }
+
   public static handleFileException(
     file: string,
     fileType: FileType,
@@ -40,4 +59,16 @@ export class ErrorUtils {
       throw error;
     }
   }
+
+  public static handleSendMessageError(
+    chargingStation: ChargingStation,
+    commandName: RequestCommand | IncomingRequestCommand,
+    error: Error,
+    params: HandleErrorParams<EmptyObject> = { throwError: false }
+  ): void {
+    logger.error(`${chargingStation.logPrefix()} Request command '${commandName}' error:`, error);
+    if (params?.throwError === true) {
+      throw error;
+    }
+  }
 }
similarity index 97%
rename from src/charging-station/MessageChannelUtils.ts
rename to src/utils/MessageChannelUtils.ts
index 5c1d1cac291d3676cb125f18a7d3a6b6171092aa..4e353f4c6588e43beb6602cf2cb9d935c641a309 100644 (file)
@@ -1,4 +1,4 @@
-import type { ChargingStation } from './ChargingStation';
+import type { ChargingStation } from '../charging-station';
 import {
   type ChargingStationData,
   type ChargingStationWorkerMessage,
index 32d351bca5c366d3b61669bb3ae245bfe3eebe48..03c88c5737e4db0e68ce81427c0a4faeefb5435a 100644 (file)
@@ -5,5 +5,6 @@ export { Configuration } from './Configuration';
 export { Constants } from './Constants';
 export { ErrorUtils } from './ErrorUtils';
 export { FileUtils } from './FileUtils';
+export { MessageChannelUtils } from './MessageChannelUtils';
 export { Utils } from './Utils';
 export { logger } from './Logger';