1 import { AsyncResource
} from
'async_hooks';
3 import Ajv
, { type JSONSchemaType
} from
'ajv';
4 import ajvFormats from
'ajv-formats';
6 import { OCPPConstants
} from
'./OCPPConstants';
7 import { OCPPServiceUtils
} from
'./OCPPServiceUtils';
8 import { OCPPError
} from
'../../exception';
12 IncomingRequestCommand
,
17 import { logger
} from
'../../utils/Logger';
18 import type { ChargingStation
} from
'../ChargingStation';
19 import { ChargingStationUtils
} from
'../ChargingStationUtils';
21 const moduleName
= 'OCPPIncomingRequestService';
23 export abstract class OCPPIncomingRequestService
extends AsyncResource
{
24 private static instance
: OCPPIncomingRequestService
| null = null;
25 private readonly version
: OCPPVersion
;
26 private readonly ajv
: Ajv
;
27 protected abstract jsonSchemas
: Map
<IncomingRequestCommand
, JSONSchemaType
<JsonObject
>>;
29 protected constructor(version
: OCPPVersion
) {
31 this.version
= version
;
33 keywords
: ['javaType'],
34 multipleOfPrecision
: 2,
37 this.incomingRequestHandler
.bind(this);
38 this.validateIncomingRequestPayload
.bind(this);
41 public static getInstance
<T
extends OCPPIncomingRequestService
>(this: new () => T
): T
{
42 if (OCPPIncomingRequestService
.instance
=== null) {
43 OCPPIncomingRequestService
.instance
= new this();
45 return OCPPIncomingRequestService
.instance
as T
;
48 protected handleIncomingRequestError
<T
>(
49 chargingStation
: ChargingStation
,
50 commandName
: IncomingRequestCommand
,
52 params
: HandleErrorParams
<T
> = { throwError
: true }
55 `${chargingStation.logPrefix()} ${moduleName}.handleIncomingRequestError: Incoming request command '${commandName}' error:`,
58 if (!params
?.throwError
&& params
?.errorResponse
) {
59 return params
?.errorResponse
;
61 if (params
?.throwError
&& !params
?.errorResponse
) {
64 if (params
?.throwError
&& params
?.errorResponse
) {
65 return params
?.errorResponse
;
69 protected validateIncomingRequestPayload
<T
extends JsonType
>(
70 chargingStation
: ChargingStation
,
71 commandName
: IncomingRequestCommand
,
72 schema
: JSONSchemaType
<T
>,
75 if (chargingStation
.getPayloadSchemaValidation() === false) {
78 const validate
= this.ajv
.compile(schema
);
79 if (validate(payload
)) {
83 `${chargingStation.logPrefix()} ${moduleName}.validateIncomingRequestPayload: Command '${commandName}' incoming request PDU is invalid: %j`,
87 OCPPServiceUtils
.ajvErrorsToErrorType(validate
.errors
),
88 'Incoming request PDU is invalid',
90 JSON
.stringify(validate
.errors
, null, 2)
94 protected handleRequestClearCache(chargingStation
: ChargingStation
): ClearCacheResponse
{
95 chargingStation
.authorizedTagsCache
.deleteAuthorizedTags(
96 ChargingStationUtils
.getAuthorizationFile(chargingStation
.stationInfo
)
98 return OCPPConstants
.OCPP_RESPONSE_ACCEPTED
;
101 public abstract incomingRequestHandler(
102 chargingStation
: ChargingStation
,
104 commandName
: IncomingRequestCommand
,
105 commandPayload
: JsonType