From 5bd5b131a8bbf0416b1db479324dde3f8edd8cab Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Fri, 27 Mar 2026 16:18:10 +0100 Subject: [PATCH] refactor: centralize handler type bridges in OCPP base classes --- .../ocpp/1.6/OCPP16IncomingRequestService.ts | 34 ++++++------ .../ocpp/1.6/OCPP16ResponseService.ts | 15 +++--- .../ocpp/2.0/OCPP20IncomingRequestService.ts | 53 +++++++++---------- .../ocpp/2.0/OCPP20ResponseService.ts | 36 +++++++------ .../ocpp/OCPPIncomingRequestService.ts | 8 +++ .../ocpp/OCPPResponseService.ts | 11 ++++ 6 files changed, 92 insertions(+), 65 deletions(-) diff --git a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts index 49d1fe02..4c8fad6e 100644 --- a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts +++ b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts @@ -175,71 +175,71 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { this.incomingRequestHandlers = new Map([ [ 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( diff --git a/src/charging-station/ocpp/1.6/OCPP16ResponseService.ts b/src/charging-station/ocpp/1.6/OCPP16ResponseService.ts index 826c8f81..7ed63956 100644 --- a/src/charging-station/ocpp/1.6/OCPP16ResponseService.ts +++ b/src/charging-station/ocpp/1.6/OCPP16ResponseService.ts @@ -92,30 +92,33 @@ export class OCPP16ResponseService extends OCPPResponseService { public constructor () { super(OCPPVersion.VERSION_16) this.responseHandlers = new Map([ - [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( diff --git a/src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts b/src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts index eaaef171..981a0fa8 100644 --- a/src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts +++ b/src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts @@ -225,77 +225,83 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService { this.incomingRequestHandlers = new Map([ [ 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

( - handler: (chargingStation: ChargingStation, commandPayload: P) => Promise | R - ): IncomingRequestHandler { - return handler as unknown as IncomingRequestHandler - } - private triggerAllEvseStatusNotifications ( chargingStation: ChargingStation, errorHandler: (error: unknown) => void diff --git a/src/charging-station/ocpp/2.0/OCPP20ResponseService.ts b/src/charging-station/ocpp/2.0/OCPP20ResponseService.ts index fcc8923a..a353695d 100644 --- a/src/charging-station/ocpp/2.0/OCPP20ResponseService.ts +++ b/src/charging-station/ocpp/2.0/OCPP20ResponseService.ts @@ -103,59 +103,65 @@ export class OCPP20ResponseService extends OCPPResponseService { public constructor () { super(OCPPVersion.VERSION_201) this.responseHandlers = new Map([ - [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( diff --git a/src/charging-station/ocpp/OCPPIncomingRequestService.ts b/src/charging-station/ocpp/OCPPIncomingRequestService.ts index 0e7dd7ba..ea7f2674 100644 --- a/src/charging-station/ocpp/OCPPIncomingRequestService.ts +++ b/src/charging-station/ocpp/OCPPIncomingRequestService.ts @@ -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

( + handler: (chargingStation: ChargingStation, commandPayload: P) => Promise | R + ): IncomingRequestHandler { + return handler as unknown as IncomingRequestHandler + } + /** * Validates incoming request payload against JSON schema * @param chargingStation - The charging station instance processing the request diff --git a/src/charging-station/ocpp/OCPPResponseService.ts b/src/charging-station/ocpp/OCPPResponseService.ts index af87bdb9..ca799443 100644 --- a/src/charging-station/ocpp/OCPPResponseService.ts +++ b/src/charging-station/ocpp/OCPPResponseService.ts @@ -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

( + handler: ( + chargingStation: ChargingStation, + payload: P, + requestPayload: R + ) => Promise | void + ): ResponseHandler { + return handler as unknown as ResponseHandler + } + /** * Validates incoming response payload against JSON schema * @param chargingStation - The charging station instance receiving the response -- 2.53.0