-import _Ajv, { type JSONSchemaType, type ValidateFunction } from 'ajv'
+import _Ajv, { type ValidateFunction } from 'ajv'
import _ajvFormats from 'ajv-formats'
-import { OCPPServiceUtils } from './OCPPServiceUtils.js'
import type { ChargingStation } from '../../charging-station/index.js'
import { OCPPError } from '../../exception/index.js'
import type {
OCPPVersion,
RequestCommand
} from '../../types/index.js'
-import { logger } from '../../utils/index.js'
+import { Constants, logger } from '../../utils/index.js'
+import { ajvErrorsToErrorType } from './OCPPServiceUtils.js'
type Ajv = _Ajv.default
// eslint-disable-next-line @typescript-eslint/no-redeclare
const Ajv = _Ajv.default
export abstract class OCPPResponseService {
private static instance: OCPPResponseService | null = null
-
- public jsonIncomingRequestResponseValidateFunctions: Map<
- IncomingRequestCommand,
- ValidateFunction<JsonType>
- >
-
private readonly version: OCPPVersion
- private readonly ajv: Ajv
- private readonly jsonRequestValidateFunctions: Map<RequestCommand, ValidateFunction<JsonType>>
-
- public abstract jsonIncomingRequestResponseSchemas: Map<
+ protected readonly ajv: Ajv
+ protected readonly ajvIncomingRequest: Ajv
+ protected abstract payloadValidateFunctions: Map<RequestCommand, ValidateFunction<JsonType>>
+ public abstract incomingRequestResponsePayloadValidateFunctions: Map<
IncomingRequestCommand,
- JSONSchemaType<JsonType>
+ ValidateFunction<JsonType>
>
protected constructor (version: OCPPVersion) {
multipleOfPrecision: 2
})
ajvFormats(this.ajv)
- this.jsonRequestValidateFunctions = new Map<RequestCommand, ValidateFunction<JsonType>>()
- this.jsonIncomingRequestResponseValidateFunctions = new Map<
- IncomingRequestCommand,
- ValidateFunction<JsonType>
- >()
- this.responseHandler = this.responseHandler.bind(this) as <
- ReqType extends JsonType,
- ResType extends JsonType,
- >(
- chargingStation: ChargingStation,
- commandName: RequestCommand,
- payload: ResType,
- requestPayload: ReqType
- ) => Promise<void>
- this.validateResponsePayload = this.validateResponsePayload.bind(this) as <T extends JsonType>(
- chargingStation: ChargingStation,
- commandName: RequestCommand,
- schema: JSONSchemaType<T>,
- payload: T
- ) => boolean
+ this.ajvIncomingRequest = new Ajv({
+ keywords: ['javaType'],
+ multipleOfPrecision: 2
+ })
+ ajvFormats(this.ajvIncomingRequest)
+ this.responseHandler = this.responseHandler.bind(this)
+ this.validateResponsePayload = this.validateResponsePayload.bind(this)
}
public static getInstance<T extends OCPPResponseService>(this: new () => T): T {
protected validateResponsePayload<T extends JsonType>(
chargingStation: ChargingStation,
commandName: RequestCommand,
- schema: JSONSchemaType<T>,
payload: T
): boolean {
if (chargingStation.stationInfo?.ocppStrictCompliance === false) {
return true
}
- const validate = this.getJsonRequestValidateFunction<T>(commandName, schema)
- if (validate(payload)) {
+ const validate = this.payloadValidateFunctions.get(commandName)
+ if (validate?.(payload) === true) {
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),
+ ajvErrorsToErrorType(validate?.errors),
'Response PDU is invalid',
commandName,
- JSON.stringify(validate.errors, undefined, 2)
+ JSON.stringify(validate?.errors, undefined, 2)
)
}
- protected emptyResponseHandler (): void {
- /* This is intentional */
- }
-
- private getJsonRequestValidateFunction<T extends JsonType>(
- commandName: RequestCommand,
- schema: JSONSchemaType<T>
- ): ValidateFunction<JsonType> {
- if (!this.jsonRequestValidateFunctions.has(commandName)) {
- this.jsonRequestValidateFunctions.set(commandName, this.ajv.compile<T>(schema).bind(this))
- }
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
- return this.jsonRequestValidateFunctions.get(commandName)!
- }
+ protected emptyResponseHandler = Constants.EMPTY_FUNCTION
public abstract responseHandler<ReqType extends JsonType, ResType extends JsonType>(
chargingStation: ChargingStation,