39baa0e579bb41a7eed3587c9a89c02a3306ca9f
1 // Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
3 import type { JSONSchemaType
} from
'ajv';
5 import OCPPError from
'../../../exception/OCPPError';
6 import type { JsonObject
, JsonType
} from
'../../../types/JsonType';
7 import type { OCPP20RequestCommand
} from
'../../../types/ocpp/2.0/Requests';
8 import { ErrorType
} from
'../../../types/ocpp/ErrorType';
9 import type { ResponseHandler
} from
'../../../types/ocpp/Responses';
10 import logger from
'../../../utils/Logger';
11 import type ChargingStation from
'../../ChargingStation';
12 import OCPPResponseService from
'../OCPPResponseService';
13 import { OCPP20ServiceUtils
} from
'./OCPP20ServiceUtils';
15 const moduleName
= 'OCPP20ResponseService';
17 export default class OCPP20ResponseService
extends OCPPResponseService
{
18 private responseHandlers
: Map
<OCPP20RequestCommand
, ResponseHandler
>;
19 private jsonSchemas
: Map
<OCPP20RequestCommand
, JSONSchemaType
<JsonObject
>>;
21 public constructor() {
22 if (new.target
?.name
=== moduleName
) {
23 throw new TypeError(`Cannot construct ${new.target?.name} instances directly`);
26 this.responseHandlers
= new Map
<OCPP20RequestCommand
, ResponseHandler
>();
27 this.jsonSchemas
= new Map
<OCPP20RequestCommand
, JSONSchemaType
<JsonObject
>>();
28 this.validatePayload
.bind(this);
31 public async responseHandler(
32 chargingStation
: ChargingStation
,
33 commandName
: OCPP20RequestCommand
,
35 requestPayload
: JsonType
38 chargingStation
.isRegistered() === true /* ||
39 commandName === OCPP20RequestCommand.BOOT_NOTIFICATION */
42 this.responseHandlers
.has(commandName
) === true &&
43 OCPP20ServiceUtils
.isRequestCommandSupported(chargingStation
, commandName
) === true
46 this.validatePayload(chargingStation
, commandName
, payload
);
47 await this.responseHandlers
.get(commandName
)(chargingStation
, payload
, requestPayload
);
50 `${chargingStation.logPrefix()} ${moduleName}.responseHandler: Handle response error:`,
58 ErrorType
.NOT_IMPLEMENTED
,
59 `${commandName} is not implemented to handle response PDU ${JSON.stringify(
70 ErrorType
.SECURITY_ERROR
,
71 `${commandName} cannot be issued to handle response PDU ${JSON.stringify(
75 )} while the charging station is not registered on the central server. `,
82 private validatePayload(
83 chargingStation
: ChargingStation
,
84 commandName
: OCPP20RequestCommand
,
87 if (this.jsonSchemas
.has(commandName
)) {
88 return this.validateResponsePayload(
91 this.jsonSchemas
.get(commandName
),
96 `${chargingStation.logPrefix()} ${moduleName}.validatePayload: No JSON schema found for command ${commandName} PDU validation`