refactor(simulator): constify and factor out empty data structure
[e-mobility-charging-stations-simulator.git] / src / charging-station / AutomaticTransactionGenerator.ts
index 3a1c6786f9b3c9fcf5cc93f522dd541b23c1e69e..4185215aae0d25ceccf9618bb289712d46d96ed2 100644 (file)
@@ -1,33 +1,29 @@
 // Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
 
-import { AsyncResource } from 'async_hooks';
+import { AsyncResource } from 'node:async_hooks';
 
-import type ChargingStation from './ChargingStation';
-import { ChargingStationUtils } from './ChargingStationUtils';
-import BaseError from '../exception/BaseError';
-import PerformanceStatistics from '../performance/PerformanceStatistics';
-import {
-  type AutomaticTransactionGeneratorConfiguration,
-  IdTagDistribution,
-  type Status,
-} from '../types/AutomaticTransactionGenerator';
-import { RequestCommand } from '../types/ocpp/Requests';
+import { type ChargingStation, ChargingStationUtils } from './internal';
+import { BaseError } from '../exception';
+// import { PerformanceStatistics } from '../performance';
+import { PerformanceStatistics } from '../performance/PerformanceStatistics';
 import {
   AuthorizationStatus,
   type AuthorizeRequest,
   type AuthorizeResponse,
+  type AutomaticTransactionGeneratorConfiguration,
+  IdTagDistribution,
+  RequestCommand,
   type StartTransactionRequest,
   type StartTransactionResponse,
+  type Status,
   StopTransactionReason,
   type StopTransactionResponse,
-} from '../types/ocpp/Transaction';
-import Constants from '../utils/Constants';
-import logger from '../utils/Logger';
-import Utils from '../utils/Utils';
+} from '../types';
+import { Constants, Utils, logger } from '../utils';
 
 const moduleName = 'AutomaticTransactionGenerator';
 
-export default class AutomaticTransactionGenerator extends AsyncResource {
+export class AutomaticTransactionGenerator extends AsyncResource {
   private static readonly instances: Map<string, AutomaticTransactionGenerator> = new Map<
     string,
     AutomaticTransactionGenerator
@@ -55,7 +51,7 @@ export default class AutomaticTransactionGenerator extends AsyncResource {
   public static getInstance(
     automaticTransactionGeneratorConfiguration: AutomaticTransactionGeneratorConfiguration,
     chargingStation: ChargingStation
-  ): AutomaticTransactionGenerator {
+  ): AutomaticTransactionGenerator | undefined {
     if (AutomaticTransactionGenerator.instances.has(chargingStation.stationInfo.hashId) === false) {
       AutomaticTransactionGenerator.instances.set(
         chargingStation.stationInfo.hashId,
@@ -105,9 +101,7 @@ export default class AutomaticTransactionGenerator extends AsyncResource {
         ) => Promise<void>,
         this,
         connectorId
-      ).catch(() => {
-        /* This is intentional */
-      });
+      ).catch(Constants.EMPTY_FUNCTION);
     } else if (this.connectorsStatus.get(connectorId)?.start === true) {
       logger.warn(`${this.logPrefix(connectorId)} is already started on connector`);
     }
@@ -158,7 +152,7 @@ export default class AutomaticTransactionGenerator extends AsyncResource {
           this.connectorsStatus.get(connectorId).startDate.getTime()
       )}`
     );
-    while (this.connectorsStatus.get(connectorId).start === true) {
+    while (this.connectorsStatus.get(connectorId)?.start === true) {
       if (new Date() > this.connectorsStatus.get(connectorId).stopDate) {
         this.stopConnector(connectorId);
         break;
@@ -222,7 +216,7 @@ export default class AutomaticTransactionGenerator extends AsyncResource {
           logger.info(
             `${this.logPrefix(connectorId)} transaction ${this.chargingStation
               .getConnectorStatus(connectorId)
-              .transactionId.toString()} started and will stop in ${Utils.formatDurationMilliSeconds(
+              ?.transactionId?.toString()} started and will stop in ${Utils.formatDurationMilliSeconds(
               waitTrxEnd
             )}`
           );
@@ -231,7 +225,7 @@ export default class AutomaticTransactionGenerator extends AsyncResource {
           logger.info(
             `${this.logPrefix(connectorId)} stop transaction ${this.chargingStation
               .getConnectorStatus(connectorId)
-              .transactionId.toString()}`
+              ?.transactionId?.toString()}`
           );
           await this.stopTransaction(connectorId);
         }
@@ -241,9 +235,9 @@ export default class AutomaticTransactionGenerator extends AsyncResource {
         logger.info(
           `${this.logPrefix(connectorId)} skipped consecutively ${this.connectorsStatus
             .get(connectorId)
-            .skippedConsecutiveTransactions.toString()}/${this.connectorsStatus
+            ?.skippedConsecutiveTransactions?.toString()}/${this.connectorsStatus
             .get(connectorId)
-            .skippedTransactions.toString()} transaction(s)`
+            ?.skippedTransactions?.toString()} transaction(s)`
         );
       }
       this.connectorsStatus.get(connectorId).lastRunDate = new Date();
@@ -266,8 +260,8 @@ export default class AutomaticTransactionGenerator extends AsyncResource {
   private setStartConnectorStatus(connectorId: number): void {
     this.connectorsStatus.get(connectorId).skippedConsecutiveTransactions = 0;
     const previousRunDuration =
-      this?.connectorsStatus.get(connectorId)?.startDate &&
-      this?.connectorsStatus.get(connectorId)?.lastRunDate
+      this.connectorsStatus.get(connectorId)?.startDate &&
+      this.connectorsStatus.get(connectorId)?.lastRunDate
         ? this.connectorsStatus.get(connectorId).lastRunDate.getTime() -
           this.connectorsStatus.get(connectorId).startDate.getTime()
         : 0;
@@ -384,10 +378,10 @@ export default class AutomaticTransactionGenerator extends AsyncResource {
         this.connectorsStatus.get(connectorId).rejectedStopTransactionRequests++;
       }
     } else {
-      const transactionId = this.chargingStation.getConnectorStatus(connectorId).transactionId;
+      const transactionId = this.chargingStation.getConnectorStatus(connectorId)?.transactionId;
       logger.warn(
         `${this.logPrefix(connectorId)} stopping a not started transaction${
-          transactionId ? ` ${transactionId.toString()}` : ''
+          !Utils.isNullOrUndefined(transactionId) ? ` ${transactionId?.toString()}` : ''
         }`
       );
     }
@@ -434,13 +428,13 @@ export default class AutomaticTransactionGenerator extends AsyncResource {
     }
   }
 
-  private logPrefix(connectorId?: number): string {
+  private logPrefix = (connectorId?: number): string => {
     return Utils.logPrefix(
       ` ${this.chargingStation.stationInfo.chargingStationId} | ATG${
         connectorId !== undefined ? ` on connector #${connectorId.toString()}` : ''
       }:`
     );
-  }
+  };
 
   private handleStartTransactionResponse(
     connectorId: number,