]> Piment Noir Git Repositories - e-mobility-charging-stations-simulator.git/commitdiff
refactor(broadcast-channel): extract response status registries from switch/case
authorJérôme Benoit <jerome.benoit@sap.com>
Tue, 24 Mar 2026 00:43:04 +0000 (01:43 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Tue, 24 Mar 2026 00:43:04 +0000 (01:43 +0100)
Replace 11 repetitive switch/case blocks in commandResponseToResponseStatus
with two static registries:
- emptyResponseCommands: Set of commands where empty response = success
- acceptedStatusCommands: Map of commands to status check predicates

Custom cases (AUTHORIZE, START/STOP_TRANSACTION, HEARTBEAT,
TRANSACTION_EVENT) remain in switch for version-specific logic.

Adding a new command now requires 1 line in the registry instead of
a 5-line case block.

src/charging-station/broadcast-channel/ChargingStationWorkerBroadcastChannel.ts

index 916e80af8d255775dd9419c9c1f673b234d34e79..d3b5c278a1b3237ecc37c92dcd4ab8a16c7b3766 100644 (file)
@@ -72,8 +72,45 @@ type CommandResponse =
   | StopTransactionResponse
 
 export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChannel {
+  private static readonly acceptedStatusCommands = new Map<
+    BroadcastChannelProcedureName,
+    (response: CommandResponse) => boolean
+      >([
+        [
+          BroadcastChannelProcedureName.BOOT_NOTIFICATION,
+          r => r.status === RegistrationStatusEnumType.ACCEPTED,
+        ],
+        [BroadcastChannelProcedureName.DATA_TRANSFER, r => r.status === DataTransferStatus.ACCEPTED],
+        [
+          BroadcastChannelProcedureName.GET_15118_EV_CERTIFICATE,
+          r =>
+            (r as OCPP20Get15118EVCertificateResponse).status ===
+        Iso15118EVCertificateStatusEnumType.Accepted,
+        ],
+        [
+          BroadcastChannelProcedureName.GET_CERTIFICATE_STATUS,
+          r =>
+            (r as OCPP20GetCertificateStatusResponse).status === GetCertificateStatusEnumType.Accepted,
+        ],
+        [
+          BroadcastChannelProcedureName.SIGN_CERTIFICATE,
+          r => (r as OCPP20SignCertificateResponse).status === GenericStatus.Accepted,
+        ],
+      ])
+
+  private static readonly emptyResponseCommands = new Set<BroadcastChannelProcedureName>([
+    BroadcastChannelProcedureName.LOG_STATUS_NOTIFICATION,
+    BroadcastChannelProcedureName.METER_VALUES,
+    BroadcastChannelProcedureName.NOTIFY_CUSTOMER_INFORMATION,
+    BroadcastChannelProcedureName.NOTIFY_REPORT,
+    BroadcastChannelProcedureName.SECURITY_EVENT_NOTIFICATION,
+    BroadcastChannelProcedureName.STATUS_NOTIFICATION,
+  ])
+
   private readonly chargingStation: ChargingStation
+
   private readonly commandHandlers: Map<BroadcastChannelProcedureName, CommandHandler>
+
   private readonly requestParams: RequestParams = {
     throwError: true,
   }
@@ -251,6 +288,13 @@ export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChanne
     command: BroadcastChannelProcedureName,
     commandResponse: CommandResponse
   ): ResponseStatus {
+    if (ChargingStationWorkerBroadcastChannel.emptyResponseCommands.has(command)) {
+      return isEmpty(commandResponse) ? ResponseStatus.SUCCESS : ResponseStatus.FAILURE
+    }
+    const statusCheck = ChargingStationWorkerBroadcastChannel.acceptedStatusCommands.get(command)
+    if (statusCheck != null) {
+      return statusCheck(commandResponse) ? ResponseStatus.SUCCESS : ResponseStatus.FAILURE
+    }
     switch (command) {
       case BroadcastChannelProcedureName.AUTHORIZE:
         switch (this.chargingStation.stationInfo?.ocppVersion) {
@@ -287,52 +331,8 @@ export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChanne
           return ResponseStatus.SUCCESS
         }
         return ResponseStatus.FAILURE
-      case BroadcastChannelProcedureName.BOOT_NOTIFICATION:
-        if (commandResponse.status === RegistrationStatusEnumType.ACCEPTED) {
-          return ResponseStatus.SUCCESS
-        }
-        return ResponseStatus.FAILURE
-      case BroadcastChannelProcedureName.DATA_TRANSFER:
-        if (commandResponse.status === DataTransferStatus.ACCEPTED) {
-          return ResponseStatus.SUCCESS
-        }
-        return ResponseStatus.FAILURE
-      case BroadcastChannelProcedureName.GET_15118_EV_CERTIFICATE:
-        if (
-          (commandResponse as OCPP20Get15118EVCertificateResponse).status ===
-          Iso15118EVCertificateStatusEnumType.Accepted
-        ) {
-          return ResponseStatus.SUCCESS
-        }
-        return ResponseStatus.FAILURE
-      case BroadcastChannelProcedureName.GET_CERTIFICATE_STATUS:
-        if (
-          (commandResponse as OCPP20GetCertificateStatusResponse).status ===
-          GetCertificateStatusEnumType.Accepted
-        ) {
-          return ResponseStatus.SUCCESS
-        }
-        return ResponseStatus.FAILURE
       case BroadcastChannelProcedureName.HEARTBEAT:
-        if ('currentTime' in commandResponse) {
-          return ResponseStatus.SUCCESS
-        }
-        return ResponseStatus.FAILURE
-      case BroadcastChannelProcedureName.LOG_STATUS_NOTIFICATION:
-      case BroadcastChannelProcedureName.METER_VALUES:
-      case BroadcastChannelProcedureName.NOTIFY_CUSTOMER_INFORMATION:
-      case BroadcastChannelProcedureName.NOTIFY_REPORT:
-      case BroadcastChannelProcedureName.SECURITY_EVENT_NOTIFICATION:
-      case BroadcastChannelProcedureName.STATUS_NOTIFICATION:
-        if (isEmpty(commandResponse)) {
-          return ResponseStatus.SUCCESS
-        }
-        return ResponseStatus.FAILURE
-      case BroadcastChannelProcedureName.SIGN_CERTIFICATE:
-        if ((commandResponse as OCPP20SignCertificateResponse).status === GenericStatus.Accepted) {
-          return ResponseStatus.SUCCESS
-        }
-        return ResponseStatus.FAILURE
+        return 'currentTime' in commandResponse ? ResponseStatus.SUCCESS : ResponseStatus.FAILURE
       case BroadcastChannelProcedureName.TRANSACTION_EVENT:
         if (
           isEmpty(commandResponse) ||