+ this.ajv = new Ajv();
+ ajvFormats(this.ajv);
+ this.requestHandler.bind(this);
+ this.sendResponse.bind(this);
+ this.sendError.bind(this);
+ this.internalSendMessage.bind(this);
+ this.buildMessageToSend.bind(this);
+ this.validateRequestPayload.bind(this);
+ }
+
+ public static getInstance<T extends OCPPRequestService>(
+ this: new (ocppResponseService: OCPPResponseService) => T,
+ ocppResponseService: OCPPResponseService
+ ): T {
+ if (OCPPRequestService.instance === null) {
+ OCPPRequestService.instance = new this(ocppResponseService);
+ }
+ return OCPPRequestService.instance as T;
+ }
+
+ public async sendResponse(
+ chargingStation: ChargingStation,
+ messageId: string,
+ messagePayload: JsonType,
+ commandName: IncomingRequestCommand
+ ): Promise<ResponseType> {
+ try {
+ // Send response message
+ return await this.internalSendMessage(
+ chargingStation,
+ messageId,
+ messagePayload,
+ MessageType.CALL_RESULT_MESSAGE,
+ commandName
+ );
+ } catch (error) {
+ this.handleRequestError(chargingStation, commandName, error as Error);
+ }
+ }
+
+ public async sendError(
+ chargingStation: ChargingStation,
+ messageId: string,
+ ocppError: OCPPError,
+ commandName: RequestCommand | IncomingRequestCommand
+ ): Promise<ResponseType> {
+ try {
+ // Send error message
+ return await this.internalSendMessage(
+ chargingStation,
+ messageId,
+ ocppError,
+ MessageType.CALL_ERROR_MESSAGE,
+ commandName
+ );
+ } catch (error) {
+ this.handleRequestError(chargingStation, commandName, error as Error);
+ }
+ }
+
+ protected async sendMessage(
+ chargingStation: ChargingStation,
+ messageId: string,
+ messagePayload: JsonType,
+ commandName: RequestCommand,
+ params: RequestParams = {
+ skipBufferingOnError: false,
+ triggerMessage: false,
+ }
+ ): Promise<ResponseType> {
+ try {
+ return await this.internalSendMessage(
+ chargingStation,
+ messageId,
+ messagePayload,
+ MessageType.CALL_MESSAGE,
+ commandName,
+ params
+ );
+ } catch (error) {
+ this.handleRequestError(chargingStation, commandName, error as Error, { throwError: false });
+ }
+ }
+
+ protected validateRequestPayload<T extends JsonType>(
+ chargingStation: ChargingStation,
+ commandName: RequestCommand,
+ schema: JSONSchemaType<T>,
+ payload: T
+ ): boolean {
+ if (chargingStation.getPayloadSchemaValidation() === false) {
+ return true;
+ }
+ const validate = this.ajv.compile(schema);
+ if (validate(payload)) {
+ return true;
+ }
+ logger.error(
+ `${chargingStation.logPrefix()} ${moduleName}.validateRequestPayload: Request PDU is invalid: %j`,
+ validate.errors
+ );
+ throw new OCPPError(
+ OCPPServiceUtils.ajvErrorsToErrorType(validate.errors),
+ 'Request PDU is invalid',
+ commandName,
+ JSON.stringify(validate.errors, null, 2)
+ );