X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2Focpp%2FOCPPResponseService.ts;h=0aedbb1eebb5b6a17a2abe94b2b85641c68c07e9;hb=856e8f67312da4acabeff1bd8452f02658a22fdb;hp=c77308907c6dac130338a5eb03a3ce1008b2ca0b;hpb=31f59c6d2def2ab2b53240c1d3d35333ac00933b;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ocpp/OCPPResponseService.ts b/src/charging-station/ocpp/OCPPResponseService.ts index c7730890..0aedbb1e 100644 --- a/src/charging-station/ocpp/OCPPResponseService.ts +++ b/src/charging-station/ocpp/OCPPResponseService.ts @@ -1,27 +1,29 @@ -import Ajv, { type JSONSchemaType } from 'ajv'; +import Ajv, { type JSONSchemaType, type ValidateFunction } from 'ajv'; import ajvFormats from 'ajv-formats'; -import { OCPPServiceUtils } from './internal'; +import { OCPPServiceUtils } from './OCPPServiceUtils'; import type { ChargingStation } from '../../charging-station'; import { OCPPError } from '../../exception'; -import type { - IncomingRequestCommand, - JsonObject, - JsonType, - OCPPVersion, - RequestCommand, -} from '../../types'; +import type { IncomingRequestCommand, JsonType, OCPPVersion, RequestCommand } from '../../types'; import { logger } from '../../utils'; const moduleName = 'OCPPResponseService'; export abstract class OCPPResponseService { private static instance: OCPPResponseService | null = null; + + public jsonIncomingRequestResponseValidateFunctions: Map< + IncomingRequestCommand, + ValidateFunction + >; + private readonly version: OCPPVersion; private readonly ajv: Ajv; + private jsonRequestValidateFunctions: Map>; + public abstract jsonIncomingRequestResponseSchemas: Map< IncomingRequestCommand, - JSONSchemaType + JSONSchemaType >; protected constructor(version: OCPPVersion) { @@ -31,17 +33,25 @@ export abstract class OCPPResponseService { multipleOfPrecision: 2, }); ajvFormats(this.ajv); - this.responseHandler = this.responseHandler.bind(this) as ( + this.jsonRequestValidateFunctions = new Map>(); + this.jsonIncomingRequestResponseValidateFunctions = new Map< + IncomingRequestCommand, + ValidateFunction + >(); + this.responseHandler = this.responseHandler.bind(this) as < + ReqType extends JsonType, + ResType extends JsonType, + >( chargingStation: ChargingStation, commandName: RequestCommand, - payload: JsonType, - requestPayload: JsonType + payload: ResType, + requestPayload: ReqType, ) => Promise; this.validateResponsePayload = this.validateResponsePayload.bind(this) as ( chargingStation: ChargingStation, commandName: RequestCommand, schema: JSONSchemaType, - payload: T + payload: T, ) => boolean; } @@ -56,24 +66,27 @@ export abstract class OCPPResponseService { chargingStation: ChargingStation, commandName: RequestCommand, schema: JSONSchemaType, - payload: T + payload: T, ): boolean { - if (chargingStation.getPayloadSchemaValidation() === false) { + if (chargingStation.stationInfo?.ocppStrictCompliance === false) { return true; } - const validate = this.ajv.compile(schema); + if (this.jsonRequestValidateFunctions.has(commandName) === false) { + this.jsonRequestValidateFunctions.set(commandName, this.ajv.compile(schema).bind(this)); + } + const validate = this.jsonRequestValidateFunctions.get(commandName)!; if (validate(payload)) { return true; } logger.error( `${chargingStation.logPrefix()} ${moduleName}.validateResponsePayload: Command '${commandName}' response PDU is invalid: %j`, - validate.errors + validate.errors, ); throw new OCPPError( OCPPServiceUtils.ajvErrorsToErrorType(validate.errors), 'Response PDU is invalid', commandName, - JSON.stringify(validate.errors, null, 2) + JSON.stringify(validate.errors, undefined, 2), ); } @@ -81,10 +94,10 @@ export abstract class OCPPResponseService { /* This is intentional */ } - public abstract responseHandler( + public abstract responseHandler( chargingStation: ChargingStation, commandName: RequestCommand, - payload: JsonType, - requestPayload: JsonType + payload: ResType, + requestPayload: ReqType, ): Promise; }