From: Jérôme Benoit Date: Thu, 12 Mar 2026 22:42:20 +0000 (+0100) Subject: refactor(ocpp): remove dead parseJsonSchemaFile overrides and standardize validation X-Git-Tag: ocpp-server@v3.1.0~53 X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=dbf3c82ca36c7e06e47d5f4c81f492817bfdae82;p=e-mobility-charging-stations-simulator.git refactor(ocpp): remove dead parseJsonSchemaFile overrides and standardize validation - Delete unused parseJsonSchemaFile overrides from OCPP16/20ServiceUtils (createPayloadValidatorMap already passes version via options) - Remove orphaned JSONSchemaType and JsonType imports - Standardize null-validator return to false in OCPPRequestService (consistent with OCPPIncomingRequestService and OCPPResponseService) - Change validateRequestPayload and validateIncomingRequestResponsePayload visibility from private to protected (consistent with other base classes) --- diff --git a/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts b/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts index 996c2f45..515fffeb 100644 --- a/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts +++ b/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts @@ -1,5 +1,3 @@ -import type { JSONSchemaType } from 'ajv' - import { addSeconds, areIntervalsOverlapping, @@ -18,7 +16,6 @@ import { import { type ConfigurationKey, type GenericResponse, - type JsonType, OCPP16AuthorizationStatus, type OCPP16AvailabilityType, type OCPP16ChangeAvailabilityResponse, @@ -515,19 +512,6 @@ export class OCPP16ServiceUtils extends OCPPServiceUtils { return key.visible } - public static override parseJsonSchemaFile( - relativePath: string, - moduleName?: string, - methodName?: string - ): JSONSchemaType { - return super.parseJsonSchemaFile( - relativePath, - OCPPVersion.VERSION_16, - moduleName, - methodName - ) - } - public static remoteStopTransaction = async ( chargingStation: ChargingStation, connectorId: number diff --git a/src/charging-station/ocpp/2.0/OCPP20ServiceUtils.ts b/src/charging-station/ocpp/2.0/OCPP20ServiceUtils.ts index 5bcc1268..3bcc0909 100644 --- a/src/charging-station/ocpp/2.0/OCPP20ServiceUtils.ts +++ b/src/charging-station/ocpp/2.0/OCPP20ServiceUtils.ts @@ -1,14 +1,11 @@ /* eslint-disable @typescript-eslint/unified-signatures */ -import type { JSONSchemaType } from 'ajv' - import { type ChargingStation, resetConnectorStatus } from '../../../charging-station/index.js' import { OCPPError } from '../../../exception/index.js' import { ConnectorStatusEnum, ErrorType, type GenericResponse, - type JsonType, OCPP20IncomingRequestCommand, OCPP20RequestCommand, OCPP20TransactionEventEnumType, @@ -386,19 +383,6 @@ export class OCPP20ServiceUtils extends OCPPServiceUtils { return currentResults } - public static override parseJsonSchemaFile( - relativePath: string, - moduleName?: string, - methodName?: string - ): JSONSchemaType { - return super.parseJsonSchemaFile( - relativePath, - OCPPVersion.VERSION_201, - moduleName, - methodName - ) - } - /** * Read ItemsPerMessage and BytesPerMessage configuration limits * Extracts configuration-reading logic shared between handleRequestGetVariables diff --git a/src/charging-station/ocpp/OCPPRequestService.ts b/src/charging-station/ocpp/OCPPRequestService.ts index c9762612..ce31ba90 100644 --- a/src/charging-station/ocpp/OCPPRequestService.ts +++ b/src/charging-station/ocpp/OCPPRequestService.ts @@ -179,6 +179,83 @@ export abstract class OCPPRequestService { } } + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters + protected validateIncomingRequestResponsePayload( + chargingStation: ChargingStation, + commandName: IncomingRequestCommand | RequestCommand, + payload: T + ): boolean { + if (chargingStation.stationInfo?.ocppStrictCompliance === false) { + return true + } + const validate = this.ocppResponseService.incomingRequestResponsePayloadValidateFunctions.get( + commandName as IncomingRequestCommand + ) + if (validate == null) { + logger.warn( + `${chargingStation.logPrefix()} ${moduleName}.validateIncomingRequestResponsePayload: No JSON schema validation function found for command '${commandName}' PDU validation` + ) + return false + } + payload = clone(payload) + convertDateToISOString(payload) + if (validate(payload)) { + return true + } + logger.error( + `${chargingStation.logPrefix()} ${moduleName}.validateIncomingRequestResponsePayload: Command '${commandName}' incoming request response PDU is invalid: %j`, + validate.errors + ) + // OCPPError usage here is debatable: it's an error in the OCPP stack but not targeted to sendError(). + throw new OCPPError( + ajvErrorsToErrorType(validate.errors), + 'Incoming request response PDU is invalid', + commandName, + JSON.stringify(validate.errors, undefined, 2) + ) + } + + /** + * Validates outgoing request payload against JSON schema + * @param chargingStation - The charging station instance sending the request + * @param commandName - OCPP command name to validate against + * @param payload - JSON payload to validate + * @returns True if payload validation succeeds, false otherwise + */ + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters + protected validateRequestPayload( + chargingStation: ChargingStation, + commandName: IncomingRequestCommand | RequestCommand, + payload: T + ): boolean { + if (chargingStation.stationInfo?.ocppStrictCompliance === false) { + return true + } + const validate = this.payloadValidatorFunctions.get(commandName as RequestCommand) + if (validate == null) { + logger.warn( + `${chargingStation.logPrefix()} ${moduleName}.validateRequestPayload: No JSON schema validation function found for command '${commandName}' PDU validation` + ) + return false + } + payload = clone(payload) + convertDateToISOString(payload) + if (validate(payload)) { + return true + } + logger.error( + `${chargingStation.logPrefix()} ${moduleName}.validateRequestPayload: Command '${commandName}' request PDU is invalid: %j`, + validate.errors + ) + // OCPPError usage here is debatable: it's an error in the OCPP stack but not targeted to sendError(). + throw new OCPPError( + ajvErrorsToErrorType(validate.errors), + 'Request PDU is invalid', + commandName, + JSON.stringify(validate.errors, undefined, 2) + ) + } + private buildMessageToSend ( chargingStation: ChargingStation, messageId: string, @@ -438,81 +515,4 @@ export abstract class OCPPRequestService { messagePayload, ]) } - - // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters - private validateIncomingRequestResponsePayload( - chargingStation: ChargingStation, - commandName: IncomingRequestCommand | RequestCommand, - payload: T - ): boolean { - if (chargingStation.stationInfo?.ocppStrictCompliance === false) { - return true - } - const validate = this.ocppResponseService.incomingRequestResponsePayloadValidateFunctions.get( - commandName as IncomingRequestCommand - ) - if (validate == null) { - logger.warn( - `${chargingStation.logPrefix()} ${moduleName}.validateIncomingRequestResponsePayload: No JSON schema validation function found for command '${commandName}' PDU validation` - ) - return true - } - payload = clone(payload) - convertDateToISOString(payload) - if (validate(payload)) { - return true - } - logger.error( - `${chargingStation.logPrefix()} ${moduleName}.validateIncomingRequestResponsePayload: Command '${commandName}' incoming request response PDU is invalid: %j`, - validate.errors - ) - // OCPPError usage here is debatable: it's an error in the OCPP stack but not targeted to sendError(). - throw new OCPPError( - ajvErrorsToErrorType(validate.errors), - 'Incoming request response PDU is invalid', - commandName, - JSON.stringify(validate.errors, undefined, 2) - ) - } - - /** - * Validates outgoing request payload against JSON schema - * @param chargingStation - The charging station instance sending the request - * @param commandName - OCPP command name to validate against - * @param payload - JSON payload to validate - * @returns True if payload validation succeeds, false otherwise - */ - // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters - private validateRequestPayload( - chargingStation: ChargingStation, - commandName: IncomingRequestCommand | RequestCommand, - payload: T - ): boolean { - if (chargingStation.stationInfo?.ocppStrictCompliance === false) { - return true - } - const validate = this.payloadValidatorFunctions.get(commandName as RequestCommand) - if (validate == null) { - logger.warn( - `${chargingStation.logPrefix()} ${moduleName}.validateRequestPayload: No JSON schema validation function found for command '${commandName}' PDU validation` - ) - return true - } - payload = clone(payload) - convertDateToISOString(payload) - if (validate(payload)) { - return true - } - logger.error( - `${chargingStation.logPrefix()} ${moduleName}.validateRequestPayload: Command '${commandName}' request PDU is invalid: %j`, - validate.errors - ) - // OCPPError usage here is debatable: it's an error in the OCPP stack but not targeted to sendError(). - throw new OCPPError( - ajvErrorsToErrorType(validate.errors), - 'Request PDU is invalid', - commandName, - JSON.stringify(validate.errors, undefined, 2) - ) - } }