Replace more interface with type for types definition
[e-mobility-charging-stations-simulator.git] / src / charging-station / ChargingStation.ts
index 17409e3a54af87972c15fbd2bdfc0c173e03b029..0a3d544a01260c2d051b5f649010aaaa88146c05 100644 (file)
@@ -12,13 +12,14 @@ import BaseError from '../exception/BaseError';
 import OCPPError from '../exception/OCPPError';
 import PerformanceStatistics from '../performance/PerformanceStatistics';
 import type { AutomaticTransactionGeneratorConfiguration } from '../types/AutomaticTransactionGenerator';
-import type ChargingStationConfiguration from '../types/ChargingStationConfiguration';
-import type ChargingStationInfo from '../types/ChargingStationInfo';
-import type ChargingStationOcppConfiguration from '../types/ChargingStationOcppConfiguration';
-import ChargingStationTemplate, {
+import type { ChargingStationConfiguration } from '../types/ChargingStationConfiguration';
+import type { ChargingStationInfo } from '../types/ChargingStationInfo';
+import type { ChargingStationOcppConfiguration } from '../types/ChargingStationOcppConfiguration';
+import {
+  type ChargingStationTemplate,
   CurrentType,
   PowerUnits,
-  WsOptions,
+  type WsOptions,
 } from '../types/ChargingStationTemplate';
 import { SupervisionUrlDistribution } from '../types/ConfigurationData';
 import type { ConnectorStatus } from '../types/ConnectorStatus';
@@ -731,6 +732,7 @@ export default class ChargingStation {
     } else {
       this.automaticTransactionGenerator.start();
     }
+    parentPort.postMessage(MessageChannelUtils.buildUpdatedMessage(this));
   }
 
   public stopAutomaticTransactionGenerator(connectorIds?: number[]): void {
@@ -740,8 +742,8 @@ export default class ChargingStation {
       }
     } else {
       this.automaticTransactionGenerator?.stop();
-      this.automaticTransactionGenerator = null;
     }
+    parentPort.postMessage(MessageChannelUtils.buildUpdatedMessage(this));
   }
 
   public async stopTransactionOnConnector(
@@ -1483,7 +1485,7 @@ export default class ChargingStation {
             // Respond
             cachedRequest = this.requests.get(messageId);
             if (Array.isArray(cachedRequest) === true) {
-              [responseCallback, , requestCommandName, requestPayload] = cachedRequest;
+              [responseCallback, errorCallback, requestCommandName, requestPayload] = cachedRequest;
             } else {
               throw new OCPPError(
                 ErrorType.PROTOCOL_ERROR,
@@ -1547,9 +1549,11 @@ export default class ChargingStation {
       logger.error(
         `${this.logPrefix()} Incoming OCPP command '${
           commandName ?? requestCommandName ?? null
-        }' message '${data.toString()}' matching cached request '${JSON.stringify(
-          this.requests.get(messageId)
-        )}' processing error:`,
+        }' message '${data.toString()}'${
+          messageType !== MessageType.CALL_MESSAGE
+            ? ` matching cached request '${JSON.stringify(this.requests.get(messageId))}'`
+            : ''
+        } processing error:`,
         error
       );
       if (error instanceof OCPPError === false) {
@@ -1560,20 +1564,26 @@ export default class ChargingStation {
           error
         );
       }
-      if (messageType === MessageType.CALL_MESSAGE) {
-        // Send error
-        await this.ocppRequestService.sendError(
-          this,
-          messageId,
-          error as OCPPError,
-          commandName ?? requestCommandName ?? null
-        );
-      } else if (
-        [MessageType.CALL_RESULT_MESSAGE, MessageType.CALL_ERROR_MESSAGE].includes(messageType) ===
-        true
-      ) {
-        // Remove the request from the cache
-        this.requests.delete(messageId);
+      switch (messageType) {
+        case MessageType.CALL_MESSAGE:
+          // Send error
+          await this.ocppRequestService.sendError(
+            this,
+            messageId,
+            error as OCPPError,
+            commandName ?? requestCommandName ?? null
+          );
+          break;
+        case MessageType.CALL_RESULT_MESSAGE:
+        case MessageType.CALL_ERROR_MESSAGE:
+          if (errorCallback) {
+            // Reject the deferred promise in case of error at response handling (rejecting an already fulfilled promise is a no-op)
+            errorCallback(error as OCPPError, false);
+          } else {
+            // Remove the request from the cache in case of error at response handling
+            this.requests.delete(messageId);
+          }
+          break;
       }
     }
   }