X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2Focpp%2FOCPPResponseService.ts;h=0aedbb1eebb5b6a17a2abe94b2b85641c68c07e9;hb=856e8f67312da4acabeff1bd8452f02658a22fdb;hp=b15b7cd6ad2a397febed5205014a5a26c4f57cf1;hpb=5edd8ba0f8978cfb3ca9d80f299d9748c6c5970e;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ocpp/OCPPResponseService.ts b/src/charging-station/ocpp/OCPPResponseService.ts index b15b7cd6..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 './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,11 +33,19 @@ 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, @@ -58,10 +68,13 @@ export abstract class OCPPResponseService { schema: JSONSchemaType, payload: T, ): boolean { - if (chargingStation.getOcppStrictCompliance() === 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; } @@ -73,7 +86,7 @@ export abstract class OCPPResponseService { 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; }