]> Piment Noir Git Repositories - e-mobility-charging-stations-simulator.git/commitdiff
refactor: centralize handler type bridges in OCPP base classes
authorJérôme Benoit <jerome.benoit@sap.com>
Fri, 27 Mar 2026 15:18:10 +0000 (16:18 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Fri, 27 Mar 2026 15:18:10 +0000 (16:18 +0100)
src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts
src/charging-station/ocpp/1.6/OCPP16ResponseService.ts
src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts
src/charging-station/ocpp/2.0/OCPP20ResponseService.ts
src/charging-station/ocpp/OCPPIncomingRequestService.ts
src/charging-station/ocpp/OCPPResponseService.ts

index 49d1fe024c2d9528ca194409ab9a97835d5124bd..4c8fad6e393681d6004a4ae28d2e4d416d33b5b1 100644 (file)
@@ -175,71 +175,71 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
     this.incomingRequestHandlers = new Map<IncomingRequestCommand, IncomingRequestHandler>([
       [
         OCPP16IncomingRequestCommand.CANCEL_RESERVATION,
-        this.handleRequestCancelReservation.bind(this) as unknown as IncomingRequestHandler,
+        this.toRequestHandler(this.handleRequestCancelReservation.bind(this)),
       ],
       [
         OCPP16IncomingRequestCommand.CHANGE_AVAILABILITY,
-        this.handleRequestChangeAvailability.bind(this) as unknown as IncomingRequestHandler,
+        this.toRequestHandler(this.handleRequestChangeAvailability.bind(this)),
       ],
       [
         OCPP16IncomingRequestCommand.CHANGE_CONFIGURATION,
-        this.handleRequestChangeConfiguration.bind(this) as unknown as IncomingRequestHandler,
+        this.toRequestHandler(this.handleRequestChangeConfiguration.bind(this)),
       ],
       [
         OCPP16IncomingRequestCommand.CLEAR_CACHE,
-        this.handleRequestClearCache.bind(this) as unknown as IncomingRequestHandler,
+        this.toRequestHandler(this.handleRequestClearCache.bind(this)),
       ],
       [
         OCPP16IncomingRequestCommand.CLEAR_CHARGING_PROFILE,
-        this.handleRequestClearChargingProfile.bind(this) as unknown as IncomingRequestHandler,
+        this.toRequestHandler(this.handleRequestClearChargingProfile.bind(this)),
       ],
       [
         OCPP16IncomingRequestCommand.DATA_TRANSFER,
-        this.handleRequestDataTransfer.bind(this) as unknown as IncomingRequestHandler,
+        this.toRequestHandler(this.handleRequestDataTransfer.bind(this)),
       ],
       [
         OCPP16IncomingRequestCommand.GET_COMPOSITE_SCHEDULE,
-        this.handleRequestGetCompositeSchedule.bind(this) as unknown as IncomingRequestHandler,
+        this.toRequestHandler(this.handleRequestGetCompositeSchedule.bind(this)),
       ],
       [
         OCPP16IncomingRequestCommand.GET_CONFIGURATION,
-        this.handleRequestGetConfiguration.bind(this) as unknown as IncomingRequestHandler,
+        this.toRequestHandler(this.handleRequestGetConfiguration.bind(this)),
       ],
       [
         OCPP16IncomingRequestCommand.GET_DIAGNOSTICS,
-        this.handleRequestGetDiagnostics.bind(this) as unknown as IncomingRequestHandler,
+        this.toRequestHandler(this.handleRequestGetDiagnostics.bind(this)),
       ],
       [
         OCPP16IncomingRequestCommand.REMOTE_START_TRANSACTION,
-        this.handleRequestRemoteStartTransaction.bind(this) as unknown as IncomingRequestHandler,
+        this.toRequestHandler(this.handleRequestRemoteStartTransaction.bind(this)),
       ],
       [
         OCPP16IncomingRequestCommand.REMOTE_STOP_TRANSACTION,
-        this.handleRequestRemoteStopTransaction.bind(this) as unknown as IncomingRequestHandler,
+        this.toRequestHandler(this.handleRequestRemoteStopTransaction.bind(this)),
       ],
       [
         OCPP16IncomingRequestCommand.RESERVE_NOW,
-        this.handleRequestReserveNow.bind(this) as unknown as IncomingRequestHandler,
+        this.toRequestHandler(this.handleRequestReserveNow.bind(this)),
       ],
       [
         OCPP16IncomingRequestCommand.RESET,
-        this.handleRequestReset.bind(this) as unknown as IncomingRequestHandler,
+        this.toRequestHandler(this.handleRequestReset.bind(this)),
       ],
       [
         OCPP16IncomingRequestCommand.SET_CHARGING_PROFILE,
-        this.handleRequestSetChargingProfile.bind(this) as unknown as IncomingRequestHandler,
+        this.toRequestHandler(this.handleRequestSetChargingProfile.bind(this)),
       ],
       [
         OCPP16IncomingRequestCommand.TRIGGER_MESSAGE,
-        this.handleRequestTriggerMessage.bind(this) as unknown as IncomingRequestHandler,
+        this.toRequestHandler(this.handleRequestTriggerMessage.bind(this)),
       ],
       [
         OCPP16IncomingRequestCommand.UNLOCK_CONNECTOR,
-        this.handleRequestUnlockConnector.bind(this) as unknown as IncomingRequestHandler,
+        this.toRequestHandler(this.handleRequestUnlockConnector.bind(this)),
       ],
       [
         OCPP16IncomingRequestCommand.UPDATE_FIRMWARE,
-        this.handleRequestUpdateFirmware.bind(this) as unknown as IncomingRequestHandler,
+        this.toRequestHandler(this.handleRequestUpdateFirmware.bind(this)),
       ],
     ])
     this.payloadValidatorFunctions = OCPP16ServiceUtils.createPayloadValidatorMap(
index 826c8f81eb573c9457f9934d0d438d8ebdd91183..7ed639567f43ea02dfbcb94f56cdc9449b988dd1 100644 (file)
@@ -92,30 +92,33 @@ export class OCPP16ResponseService extends OCPPResponseService {
   public constructor () {
     super(OCPPVersion.VERSION_16)
     this.responseHandlers = new Map<RequestCommand, ResponseHandler>([
-      [OCPP16RequestCommand.AUTHORIZE, this.handleResponseAuthorize.bind(this) as ResponseHandler],
+      [
+        OCPP16RequestCommand.AUTHORIZE,
+        this.toResponseHandler(this.handleResponseAuthorize.bind(this)),
+      ],
       [
         OCPP16RequestCommand.BOOT_NOTIFICATION,
-        this.handleResponseBootNotification.bind(this) as ResponseHandler,
+        this.toResponseHandler(this.handleResponseBootNotification.bind(this)),
       ],
       [OCPP16RequestCommand.DATA_TRANSFER, this.emptyResponseHandler],
       [
         OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION,
-        this.emptyResponseHandler.bind(this) as ResponseHandler,
+        this.toResponseHandler(this.emptyResponseHandler.bind(this)),
       ],
       [OCPP16RequestCommand.FIRMWARE_STATUS_NOTIFICATION, this.emptyResponseHandler],
       [OCPP16RequestCommand.HEARTBEAT, this.emptyResponseHandler],
       [OCPP16RequestCommand.METER_VALUES, this.emptyResponseHandler],
       [
         OCPP16RequestCommand.START_TRANSACTION,
-        this.handleResponseStartTransaction.bind(this) as ResponseHandler,
+        this.toResponseHandler(this.handleResponseStartTransaction.bind(this)),
       ],
       [
         OCPP16RequestCommand.STATUS_NOTIFICATION,
-        this.emptyResponseHandler.bind(this) as ResponseHandler,
+        this.toResponseHandler(this.emptyResponseHandler.bind(this)),
       ],
       [
         OCPP16RequestCommand.STOP_TRANSACTION,
-        this.handleResponseStopTransaction.bind(this) as ResponseHandler,
+        this.toResponseHandler(this.handleResponseStopTransaction.bind(this)),
       ],
     ])
     this.payloadValidatorFunctions = OCPP16ServiceUtils.createPayloadValidatorMap(
index eaaef1719d81dffe05718bf50a896c992ea5c49e..981a0fa8e7b51c7d5f6dbdf4e4215cd00c1e7f43 100644 (file)
@@ -225,77 +225,83 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService {
     this.incomingRequestHandlers = new Map<IncomingRequestCommand, IncomingRequestHandler>([
       [
         OCPP20IncomingRequestCommand.CERTIFICATE_SIGNED,
-        this.toHandler(this.handleRequestCertificateSigned.bind(this)),
+        this.toRequestHandler(this.handleRequestCertificateSigned.bind(this)),
       ],
       [
         OCPP20IncomingRequestCommand.CHANGE_AVAILABILITY,
-        this.toHandler(this.handleRequestChangeAvailability.bind(this)),
+        this.toRequestHandler(this.handleRequestChangeAvailability.bind(this)),
       ],
       [
         OCPP20IncomingRequestCommand.CLEAR_CACHE,
-        this.toHandler(this.handleRequestClearCache.bind(this)),
+        this.toRequestHandler(this.handleRequestClearCache.bind(this)),
       ],
       [
         OCPP20IncomingRequestCommand.CUSTOMER_INFORMATION,
-        this.toHandler(this.handleRequestCustomerInformation.bind(this)),
+        this.toRequestHandler(this.handleRequestCustomerInformation.bind(this)),
       ],
       [
         OCPP20IncomingRequestCommand.DATA_TRANSFER,
-        this.toHandler(this.handleRequestDataTransfer.bind(this)),
+        this.toRequestHandler(this.handleRequestDataTransfer.bind(this)),
       ],
       [
         OCPP20IncomingRequestCommand.DELETE_CERTIFICATE,
-        this.toHandler(this.handleRequestDeleteCertificate.bind(this)),
+        this.toRequestHandler(this.handleRequestDeleteCertificate.bind(this)),
       ],
       [
         OCPP20IncomingRequestCommand.GET_BASE_REPORT,
-        this.toHandler(this.handleRequestGetBaseReport.bind(this)),
+        this.toRequestHandler(this.handleRequestGetBaseReport.bind(this)),
       ],
       [
         OCPP20IncomingRequestCommand.GET_INSTALLED_CERTIFICATE_IDS,
-        this.toHandler(this.handleRequestGetInstalledCertificateIds.bind(this)),
+        this.toRequestHandler(this.handleRequestGetInstalledCertificateIds.bind(this)),
+      ],
+      [
+        OCPP20IncomingRequestCommand.GET_LOG,
+        this.toRequestHandler(this.handleRequestGetLog.bind(this)),
       ],
-      [OCPP20IncomingRequestCommand.GET_LOG, this.toHandler(this.handleRequestGetLog.bind(this))],
       [
         OCPP20IncomingRequestCommand.GET_TRANSACTION_STATUS,
-        this.toHandler(this.handleRequestGetTransactionStatus.bind(this)),
+        this.toRequestHandler(this.handleRequestGetTransactionStatus.bind(this)),
       ],
       [
         OCPP20IncomingRequestCommand.GET_VARIABLES,
-        this.toHandler(this.handleRequestGetVariables.bind(this)),
+        this.toRequestHandler(this.handleRequestGetVariables.bind(this)),
       ],
       [
         OCPP20IncomingRequestCommand.INSTALL_CERTIFICATE,
-        this.toHandler(this.handleRequestInstallCertificate.bind(this)),
+        this.toRequestHandler(this.handleRequestInstallCertificate.bind(this)),
       ],
       [
         OCPP20IncomingRequestCommand.REQUEST_START_TRANSACTION,
-        this.toHandler(this.handleRequestStartTransaction.bind(this)),
+        this.toRequestHandler(this.handleRequestStartTransaction.bind(this)),
       ],
       [
         OCPP20IncomingRequestCommand.REQUEST_STOP_TRANSACTION,
-        this.toHandler(this.handleRequestStopTransaction.bind(this)),
+        this.toRequestHandler(this.handleRequestStopTransaction.bind(this)),
+      ],
+      [
+        OCPP20IncomingRequestCommand.RESET,
+        this.toRequestHandler(this.handleRequestReset.bind(this)),
       ],
-      [OCPP20IncomingRequestCommand.RESET, this.toHandler(this.handleRequestReset.bind(this))],
       [
         OCPP20IncomingRequestCommand.SET_NETWORK_PROFILE,
-        this.toHandler(this.handleRequestSetNetworkProfile.bind(this)),
+        this.toRequestHandler(this.handleRequestSetNetworkProfile.bind(this)),
       ],
       [
         OCPP20IncomingRequestCommand.SET_VARIABLES,
-        this.toHandler(this.handleRequestSetVariables.bind(this)),
+        this.toRequestHandler(this.handleRequestSetVariables.bind(this)),
       ],
       [
         OCPP20IncomingRequestCommand.TRIGGER_MESSAGE,
-        this.toHandler(this.handleRequestTriggerMessage.bind(this)),
+        this.toRequestHandler(this.handleRequestTriggerMessage.bind(this)),
       ],
       [
         OCPP20IncomingRequestCommand.UNLOCK_CONNECTOR,
-        this.toHandler(this.handleRequestUnlockConnector.bind(this)),
+        this.toRequestHandler(this.handleRequestUnlockConnector.bind(this)),
       ],
       [
         OCPP20IncomingRequestCommand.UPDATE_FIRMWARE,
-        this.toHandler(this.handleRequestUpdateFirmware.bind(this)),
+        this.toRequestHandler(this.handleRequestUpdateFirmware.bind(this)),
       ],
     ])
     this.payloadValidatorFunctions = OCPP20ServiceUtils.createPayloadValidatorMap(
@@ -3668,13 +3674,6 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService {
     )
   }
 
-  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- bridges contravariant handler signatures into IncomingRequestHandler
-  private toHandler<P extends JsonType, R extends JsonType>(
-    handler: (chargingStation: ChargingStation, commandPayload: P) => Promise<R> | R
-  ): IncomingRequestHandler {
-    return handler as unknown as IncomingRequestHandler
-  }
-
   private triggerAllEvseStatusNotifications (
     chargingStation: ChargingStation,
     errorHandler: (error: unknown) => void
index fcc8923a15f50eea0559024cbe3044cd0fcc7583..a353695d6942721b6ef1db5fa2b581744edc2982 100644 (file)
@@ -103,59 +103,65 @@ export class OCPP20ResponseService extends OCPPResponseService {
   public constructor () {
     super(OCPPVersion.VERSION_201)
     this.responseHandlers = new Map<RequestCommand, ResponseHandler>([
-      [OCPP20RequestCommand.AUTHORIZE, this.handleResponseAuthorize.bind(this) as ResponseHandler],
+      [
+        OCPP20RequestCommand.AUTHORIZE,
+        this.toResponseHandler(this.handleResponseAuthorize.bind(this)),
+      ],
       [
         OCPP20RequestCommand.BOOT_NOTIFICATION,
-        this.handleResponseBootNotification.bind(this) as ResponseHandler,
+        this.toResponseHandler(this.handleResponseBootNotification.bind(this)),
       ],
       [
         OCPP20RequestCommand.DATA_TRANSFER,
-        this.handleResponseDataTransfer.bind(this) as ResponseHandler,
+        this.toResponseHandler(this.handleResponseDataTransfer.bind(this)),
       ],
       [
         OCPP20RequestCommand.FIRMWARE_STATUS_NOTIFICATION,
-        this.handleResponseFirmwareStatusNotification.bind(this) as ResponseHandler,
+        this.toResponseHandler(this.handleResponseFirmwareStatusNotification.bind(this)),
       ],
       [
         OCPP20RequestCommand.GET_15118_EV_CERTIFICATE,
-        this.handleResponseGet15118EVCertificate.bind(this) as ResponseHandler,
+        this.toResponseHandler(this.handleResponseGet15118EVCertificate.bind(this)),
       ],
       [
         OCPP20RequestCommand.GET_CERTIFICATE_STATUS,
-        this.handleResponseGetCertificateStatus.bind(this) as ResponseHandler,
+        this.toResponseHandler(this.handleResponseGetCertificateStatus.bind(this)),
+      ],
+      [
+        OCPP20RequestCommand.HEARTBEAT,
+        this.toResponseHandler(this.handleResponseHeartbeat.bind(this)),
       ],
-      [OCPP20RequestCommand.HEARTBEAT, this.handleResponseHeartbeat.bind(this) as ResponseHandler],
       [
         OCPP20RequestCommand.LOG_STATUS_NOTIFICATION,
-        this.handleResponseLogStatusNotification.bind(this) as ResponseHandler,
+        this.toResponseHandler(this.handleResponseLogStatusNotification.bind(this)),
       ],
       [
         OCPP20RequestCommand.METER_VALUES,
-        this.handleResponseMeterValues.bind(this) as ResponseHandler,
+        this.toResponseHandler(this.handleResponseMeterValues.bind(this)),
       ],
       [
         OCPP20RequestCommand.NOTIFY_CUSTOMER_INFORMATION,
-        this.handleResponseNotifyCustomerInformation.bind(this) as ResponseHandler,
+        this.toResponseHandler(this.handleResponseNotifyCustomerInformation.bind(this)),
       ],
       [
         OCPP20RequestCommand.NOTIFY_REPORT,
-        this.handleResponseNotifyReport.bind(this) as ResponseHandler,
+        this.toResponseHandler(this.handleResponseNotifyReport.bind(this)),
       ],
       [
         OCPP20RequestCommand.SECURITY_EVENT_NOTIFICATION,
-        this.handleResponseSecurityEventNotification.bind(this) as ResponseHandler,
+        this.toResponseHandler(this.handleResponseSecurityEventNotification.bind(this)),
       ],
       [
         OCPP20RequestCommand.SIGN_CERTIFICATE,
-        this.handleResponseSignCertificate.bind(this) as ResponseHandler,
+        this.toResponseHandler(this.handleResponseSignCertificate.bind(this)),
       ],
       [
         OCPP20RequestCommand.STATUS_NOTIFICATION,
-        this.handleResponseStatusNotification.bind(this) as ResponseHandler,
+        this.toResponseHandler(this.handleResponseStatusNotification.bind(this)),
       ],
       [
         OCPP20RequestCommand.TRANSACTION_EVENT,
-        this.handleResponseTransactionEvent.bind(this) as ResponseHandler,
+        this.toResponseHandler(this.handleResponseTransactionEvent.bind(this)),
       ],
     ])
     this.payloadValidatorFunctions = OCPP20ServiceUtils.createPayloadValidatorMap(
index 0e7dd7ba8f4e4297e9736ea3493901d1584bbaed..ea7f2674413503f59afaa81741abf0d72d20a958 100644 (file)
@@ -158,6 +158,14 @@ export abstract class OCPPIncomingRequestService extends EventEmitter {
     chargingStation: ChargingStation,
     commandName: IncomingRequestCommand
   ): boolean
+
+  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- bridges contravariant handler signatures into IncomingRequestHandler
+  protected toRequestHandler<P extends JsonType, R extends JsonType>(
+    handler: (chargingStation: ChargingStation, commandPayload: P) => Promise<R> | R
+  ): IncomingRequestHandler {
+    return handler as unknown as IncomingRequestHandler
+  }
+
   /**
    * Validates incoming request payload against JSON schema
    * @param chargingStation - The charging station instance processing the request
index af87bdb9f9cb7aac49209708cede79726d09a547..ca7994431842d3ef1ad54f157377aea5defd2a77 100644 (file)
@@ -140,6 +140,17 @@ export abstract class OCPPResponseService {
     commandName: RequestCommand
   ): boolean
 
+  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- bridges contravariant handler signatures into ResponseHandler
+  protected toResponseHandler<P extends JsonType, R extends JsonType>(
+    handler: (
+      chargingStation: ChargingStation,
+      payload: P,
+      requestPayload: R
+    ) => Promise<void> | void
+  ): ResponseHandler {
+    return handler as unknown as ResponseHandler
+  }
+
   /**
    * Validates incoming response payload against JSON schema
    * @param chargingStation - The charging station instance receiving the response