1 import _Ajv
, { type ValidateFunction
} from
'ajv'
2 import _ajvFormats from
'ajv-formats'
3 import { EventEmitter
} from
'node:events'
7 IncomingRequestCommand
,
10 } from
'../../types/index.js'
12 import { type ChargingStation
, getIdTagsFile
} from
'../../charging-station/index.js'
13 import { OCPPError
} from
'../../exception/index.js'
14 import { logger
} from
'../../utils/index.js'
15 import { OCPPConstants
} from
'./OCPPConstants.js'
16 import { ajvErrorsToErrorType
} from
'./OCPPServiceUtils.js'
18 type Ajv
= _Ajv
.default
19 // eslint-disable-next-line @typescript-eslint/no-redeclare
20 const Ajv
= _Ajv
.default
21 const ajvFormats
= _ajvFormats
.default
23 const moduleName
= 'OCPPIncomingRequestService'
25 export abstract class OCPPIncomingRequestService
extends EventEmitter
{
26 private static instance
: null | OCPPIncomingRequestService
= null
27 protected readonly ajv
: Ajv
28 protected abstract payloadValidateFunctions
: Map
<
29 IncomingRequestCommand
,
30 ValidateFunction
<JsonType
>
33 private readonly version
: OCPPVersion
35 protected constructor (version
: OCPPVersion
) {
37 this.version
= version
39 keywords
: ['javaType'],
40 multipleOfPrecision
: 2,
43 this.incomingRequestHandler
= this.incomingRequestHandler
.bind(this)
44 this.validateIncomingRequestPayload
= this.validateIncomingRequestPayload
.bind(this)
47 public static getInstance
<T
extends OCPPIncomingRequestService
>(this: new () => T
): T
{
48 OCPPIncomingRequestService
.instance
??= new this()
49 return OCPPIncomingRequestService
.instance
as T
52 // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unnecessary-type-parameters
53 public abstract incomingRequestHandler
<ReqType
extends JsonType
, ResType
extends JsonType
>(
54 chargingStation
: ChargingStation
,
56 commandName
: IncomingRequestCommand
,
57 commandPayload
: ReqType
60 protected handleRequestClearCache (chargingStation
: ChargingStation
): ClearCacheResponse
{
61 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
62 if (chargingStation
.idTagsCache
.deleteIdTags(getIdTagsFile(chargingStation
.stationInfo
!)!)) {
63 return OCPPConstants
.OCPP_RESPONSE_ACCEPTED
65 return OCPPConstants
.OCPP_RESPONSE_REJECTED
68 // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters
69 protected validateIncomingRequestPayload
<T
extends JsonType
>(
70 chargingStation
: ChargingStation
,
71 commandName
: IncomingRequestCommand
,
74 if (chargingStation
.stationInfo
?.ocppStrictCompliance
=== false) {
77 const validate
= this.payloadValidateFunctions
.get(commandName
)
78 if (validate
?.(payload
) === true) {
82 `${chargingStation.logPrefix()} ${moduleName}.validateIncomingRequestPayload: Command '${commandName}' incoming request PDU is invalid: %j`,
86 ajvErrorsToErrorType(validate
?.errors
),
87 'Incoming request PDU is invalid',
89 JSON
.stringify(validate
?.errors
, undefined, 2)