1 import { AsyncResource
} from
'node: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 { type ChargingStation
, ChargingStationUtils
} from
'../../charging-station';
9 import { OCPPError
} from
'../../exception';
13 IncomingRequestCommand
,
18 import { ErrorUtils
, logger
} from
'../../utils';
20 const moduleName
= 'OCPPIncomingRequestService';
22 export abstract class OCPPIncomingRequestService
extends AsyncResource
{
23 private static instance
: OCPPIncomingRequestService
| null = null;
24 private readonly version
: OCPPVersion
;
25 private readonly ajv
: Ajv
;
26 protected abstract jsonSchemas
: Map
<IncomingRequestCommand
, JSONSchemaType
<JsonObject
>>;
28 protected constructor(version
: OCPPVersion
) {
30 this.version
= version
;
32 keywords
: ['javaType'],
33 multipleOfPrecision
: 2,
36 this.incomingRequestHandler
= this.incomingRequestHandler
.bind(this) as (
37 chargingStation
: ChargingStation
,
39 commandName
: IncomingRequestCommand
,
40 commandPayload
: JsonType
42 this.validateIncomingRequestPayload
= this.validateIncomingRequestPayload
.bind(this) as <
45 chargingStation
: ChargingStation
,
46 commandName
: IncomingRequestCommand
,
47 schema
: JSONSchemaType
<T
>,
52 public static getInstance
<T
extends OCPPIncomingRequestService
>(this: new () => T
): T
{
53 if (OCPPIncomingRequestService
.instance
=== null) {
54 OCPPIncomingRequestService
.instance
= new this();
56 return OCPPIncomingRequestService
.instance
as T
;
59 protected handleIncomingRequestError
<T
extends JsonType
>(
60 chargingStation
: ChargingStation
,
61 commandName
: IncomingRequestCommand
,
63 params
: HandleErrorParams
<T
> = { throwError
: true, consoleOut
: false }
65 ErrorUtils
.handleErrorParams(params
);
67 `${chargingStation.logPrefix()} ${moduleName}.handleIncomingRequestError: Incoming request command '${commandName}' error:`,
70 if (!params
?.throwError
&& params
?.errorResponse
) {
71 return params
?.errorResponse
;
73 if (params
?.throwError
&& !params
?.errorResponse
) {
76 if (params
?.throwError
&& params
?.errorResponse
) {
77 return params
?.errorResponse
;
81 protected validateIncomingRequestPayload
<T
extends JsonType
>(
82 chargingStation
: ChargingStation
,
83 commandName
: IncomingRequestCommand
,
84 schema
: JSONSchemaType
<T
>,
87 if (chargingStation
.getPayloadSchemaValidation() === false) {
90 const validate
= this.ajv
.compile(schema
);
91 if (validate(payload
)) {
95 `${chargingStation.logPrefix()} ${moduleName}.validateIncomingRequestPayload: Command '${commandName}' incoming request PDU is invalid: %j`,
99 OCPPServiceUtils
.ajvErrorsToErrorType(validate
.errors
),
100 'Incoming request PDU is invalid',
102 JSON
.stringify(validate
.errors
, null, 2)
106 protected handleRequestClearCache(chargingStation
: ChargingStation
): ClearCacheResponse
{
107 chargingStation
.idTagsCache
.deleteIdTags(
108 ChargingStationUtils
.getIdTagsFile(chargingStation
.stationInfo
)
110 return OCPPConstants
.OCPP_RESPONSE_ACCEPTED
;
113 public abstract incomingRequestHandler(
114 chargingStation
: ChargingStation
,
116 commandName
: IncomingRequestCommand
,
117 commandPayload
: JsonType