1 // Partial Copyright Jerome Benoit. 2021-2024. All Rights Reserved.
3 import type { ValidateFunction
} from
'ajv'
5 import type { ChargingStation
} from
'../../../charging-station/index.js'
7 import { OCPPError
} from
'../../../exception/index.js'
10 type IncomingRequestHandler
,
12 type OCPP20ClearCacheRequest
,
13 OCPP20IncomingRequestCommand
,
15 } from
'../../../types/index.js'
16 import { isAsyncFunction
, logger
} from
'../../../utils/index.js'
17 import { OCPPIncomingRequestService
} from
'../OCPPIncomingRequestService.js'
18 import { OCPP20ServiceUtils
} from
'./OCPP20ServiceUtils.js'
20 const moduleName
= 'OCPP20IncomingRequestService'
22 export class OCPP20IncomingRequestService
extends OCPPIncomingRequestService
{
23 protected payloadValidateFunctions
: Map
<OCPP20IncomingRequestCommand
, ValidateFunction
<JsonType
>>
25 private readonly incomingRequestHandlers
: Map
<
26 OCPP20IncomingRequestCommand
,
27 IncomingRequestHandler
30 public constructor () {
31 // if (new.target.name === moduleName) {
32 // throw new TypeError(`Cannot construct ${new.target.name} instances directly`)
34 super(OCPPVersion
.VERSION_201
)
35 this.incomingRequestHandlers
= new Map
<OCPP20IncomingRequestCommand
, IncomingRequestHandler
>([
36 [OCPP20IncomingRequestCommand
.CLEAR_CACHE
, this.handleRequestClearCache
.bind(this)],
38 this.payloadValidateFunctions
= new Map
<
39 OCPP20IncomingRequestCommand
,
40 ValidateFunction
<JsonType
>
43 OCPP20IncomingRequestCommand
.CLEAR_CACHE
,
45 OCPP20ServiceUtils
.parseJsonSchemaFile
<OCPP20ClearCacheRequest
>(
46 'assets/json-schemas/ocpp/2.0/ClearCacheRequest.json',
53 this.validatePayload
= this.validatePayload
.bind(this)
56 // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters
57 public async incomingRequestHandler
<ReqType
extends JsonType
, ResType
extends JsonType
>(
58 chargingStation
: ChargingStation
,
60 commandName
: OCPP20IncomingRequestCommand
,
61 commandPayload
: ReqType
65 chargingStation
.stationInfo
?.ocppStrictCompliance
=== true &&
66 chargingStation
.inPendingState() &&
67 (commandName
=== OCPP20IncomingRequestCommand
.REQUEST_START_TRANSACTION
||
68 commandName
=== OCPP20IncomingRequestCommand
.REQUEST_STOP_TRANSACTION
)
71 ErrorType
.SECURITY_ERROR
,
72 `${commandName} cannot be issued to handle request PDU ${JSON.stringify(
76 )} while the charging station is in pending state on the central server`,
82 chargingStation
.inAcceptedState() ||
83 chargingStation
.inPendingState() ||
84 (chargingStation
.stationInfo
?.ocppStrictCompliance
=== false &&
85 chargingStation
.inUnknownState())
88 this.incomingRequestHandlers
.has(commandName
) &&
89 OCPP20ServiceUtils
.isIncomingRequestCommandSupported(chargingStation
, commandName
)
92 this.validatePayload(chargingStation
, commandName
, commandPayload
)
93 // Call the method to build the response
94 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
95 const incomingRequestHandler
= this.incomingRequestHandlers
.get(commandName
)!
96 if (isAsyncFunction(incomingRequestHandler
)) {
97 response
= (await incomingRequestHandler(chargingStation
, commandPayload
)) as ResType
99 response
= incomingRequestHandler(chargingStation
, commandPayload
) as ResType
104 `${chargingStation.logPrefix()} ${moduleName}.incomingRequestHandler: Handle incoming request error:`,
112 ErrorType
.NOT_IMPLEMENTED
,
113 `${commandName} is not implemented to handle request PDU ${JSON.stringify(
124 ErrorType
.SECURITY_ERROR
,
125 `${commandName} cannot be issued to handle request PDU ${JSON.stringify(
129 )} while the charging station is not registered on the central server`,
134 // Send the built response
135 await chargingStation
.ocppRequestService
.sendResponse(
141 // Emit command name event to allow delayed handling
142 this.emit(commandName
, chargingStation
, commandPayload
, response
)
145 private validatePayload (
146 chargingStation
: ChargingStation
,
147 commandName
: OCPP20IncomingRequestCommand
,
148 commandPayload
: JsonType
150 if (this.payloadValidateFunctions
.has(commandName
)) {
151 return this.validateIncomingRequestPayload(chargingStation
, commandName
, commandPayload
)
154 `${chargingStation.logPrefix()} ${moduleName}.validatePayload: No JSON schema validation function found for command '${commandName}' PDU validation`