1 import type { JSONSchemaType
} from
'ajv';
2 import Ajv from
'ajv-draft-04';
3 import ajvFormats from
'ajv-formats';
5 import OCPPError from
'../../exception/OCPPError';
6 import type { HandleErrorParams
} from
'../../types/Error';
7 import type { JsonType
} from
'../../types/JsonType';
8 import type { IncomingRequestCommand
} from
'../../types/ocpp/Requests';
9 import logger from
'../../utils/Logger';
10 import type ChargingStation from
'../ChargingStation';
11 import { OCPPServiceUtils
} from
'./OCPPServiceUtils';
13 const moduleName
= 'OCPPIncomingRequestService';
15 export default abstract class OCPPIncomingRequestService
{
16 private static instance
: OCPPIncomingRequestService
| null = null;
19 protected constructor() {
22 this.incomingRequestHandler
.bind(this);
23 this.validateIncomingRequestPayload
.bind(this);
26 public static getInstance
<T
extends OCPPIncomingRequestService
>(this: new () => T
): T
{
27 if (OCPPIncomingRequestService
.instance
=== null) {
28 OCPPIncomingRequestService
.instance
= new this();
30 return OCPPIncomingRequestService
.instance
as T
;
33 protected handleIncomingRequestError
<T
>(
34 chargingStation
: ChargingStation
,
35 commandName
: IncomingRequestCommand
,
37 params
: HandleErrorParams
<T
> = { throwError
: true }
40 `${chargingStation.logPrefix()} ${moduleName}.handleIncomingRequestError: Incoming request command ${commandName} error:`,
43 if (!params
?.throwError
&& params
?.errorResponse
) {
44 return params
?.errorResponse
;
46 if (params
?.throwError
&& !params
?.errorResponse
) {
49 if (params
?.throwError
&& params
?.errorResponse
) {
50 return params
?.errorResponse
;
54 protected validateIncomingRequestPayload
<T
extends JsonType
>(
55 chargingStation
: ChargingStation
,
56 commandName
: IncomingRequestCommand
,
57 schema
: JSONSchemaType
<T
>,
60 if (!chargingStation
.getPayloadSchemaValidation()) {
63 const validate
= this.ajv
.compile(schema
);
64 if (validate(payload
)) {
68 `${chargingStation.logPrefix()} ${moduleName}.validateIncomingRequestPayload: Incoming request PDU is invalid: %j`,
72 OCPPServiceUtils
.ajvErrorsToErrorType(validate
.errors
),
73 'Incoming request PDU is invalid',
75 JSON
.stringify(validate
.errors
, null, 2)
79 public abstract incomingRequestHandler(
80 chargingStation
: ChargingStation
,
82 commandName
: IncomingRequestCommand
,
83 commandPayload
: JsonType