chargingStation,
StandardParametersKey.MeterValueSampleInterval
)
+ const connectorId = requestPayload?.connectorId
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ const transactionId = this.chargingStation.getConnectorStatus(connectorId!)?.transactionId
return await this.chargingStation.ocppRequestService.requestHandler<
MeterValuesRequest,
MeterValuesResponse
buildMeterValue(
this.chargingStation,
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
- requestPayload!.connectorId!,
+ connectorId!,
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
- this.chargingStation.getConnectorStatus(requestPayload!.connectorId!)!
- .transactionId!,
+ transactionId!,
configuredMeterValueSampleInterval != null
? secondsToMilliseconds(convertToInt(configuredMeterValueSampleInterval.value))
: Constants.DEFAULT_METER_VALUES_INTERVAL
[
BroadcastChannelProcedureName.SET_SUPERVISION_URL,
(requestPayload?: BroadcastChannelRequestPayload) => {
- this.chargingStation.setSupervisionUrl(requestPayload?.url as string)
+ const url = requestPayload?.url
+ if (typeof url !== 'string' || isEmpty(url)) {
+ throw new BaseError(
+ `${this.chargingStation.logPrefix()} ${moduleName}.requestHandler: 'url' field is required`
+ )
+ }
+ this.chargingStation.setSupervisionUrl(url)
},
],
[
async (requestPayload?: BroadcastChannelRequestPayload) =>
await this.chargingStation.ocppRequestService.requestHandler<
StopTransactionRequest,
- StartTransactionResponse
+ StopTransactionResponse
>(
this.chargingStation,
RequestCommand.STOP_TRANSACTION,
return
}
let responsePayload: BroadcastChannelResponsePayload | undefined
+ // eslint-disable-next-line promise/catch-or-return
this.commandHandler(command, requestPayload)
.then(commandResponse => {
if (commandResponse == null || isEmpty(commandResponse)) {
}
return undefined
})
- .finally(() => {
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
- this.sendResponse([uuid, responsePayload!])
- })
.catch((error: unknown) => {
logger.error(
`${this.chargingStation.logPrefix()} ${moduleName}.requestHandler: Handle request error:`,
requestPayload,
status: ResponseStatus.FAILURE,
} satisfies BroadcastChannelResponsePayload
+ return undefined
+ })
+ .finally(() => {
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ this.sendResponse([uuid, responsePayload!])
})
}
}
}
private buildResponsePayload (uuid: string): ResponsePayload {
+ const responsesArray = this.responses.get(uuid)?.responses ?? []
const responsesStatus =
- this.responses
- .get(uuid)
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
- ?.responses.every(response => response?.status === ResponseStatus.SUCCESS) === true
+ responsesArray.length > 0 &&
+ responsesArray.every(response => response.status === ResponseStatus.SUCCESS)
? ResponseStatus.SUCCESS
: ResponseStatus.FAILURE
return {
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-non-null-asserted-optional-chain
- hashIdsSucceeded: this.responses
- .get(uuid)
- ?.responses.map(response => {
+ hashIdsSucceeded: responsesArray
+ .map(response => {
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
if (response?.hashId != null && response?.status === ResponseStatus.SUCCESS) {
return response.hashId
}
return undefined
})
- .filter(hashId => hashId != null)!,
+ .filter((hashId): hashId is string => hashId != null),
status: responsesStatus,
...(responsesStatus === ResponseStatus.FAILURE && {
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-non-null-asserted-optional-chain
- hashIdsFailed: this.responses
- .get(uuid)
- ?.responses.map(response => {
+ hashIdsFailed: responsesArray
+ .map(response => {
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
if (response?.hashId != null && response?.status === ResponseStatus.FAILURE) {
return response.hashId
}
return undefined
})
- .filter(hashId => hashId != null)!,
+ .filter((hashId): hashId is string => hashId != null),
}),
...(responsesStatus === ResponseStatus.FAILURE && {
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-non-null-asserted-optional-chain
- responsesFailed: this.responses
- .get(uuid)
- ?.responses.map(response => {
+ responsesFailed: responsesArray
+ .map(response => {
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
if (response?.status === ResponseStatus.FAILURE) {
return response
}
return undefined
})
- .filter(response => response != null)!,
+ .filter((response): response is BroadcastChannelResponsePayload => response != null),
}),
}
}
responsesExpected: this.uiService.getBroadcastChannelExpectedResponses(uuid),
responsesReceived: 1,
})
- } else if (
+ } else {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
- this.responses.get(uuid)!.responsesReceived <= this.responses.get(uuid)!.responsesExpected
- ) {
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
- ++this.responses.get(uuid)!.responsesReceived
- this.responses.get(uuid)?.responses.push(responsePayload)
+ const responses = this.responses.get(uuid)!
+ if (responses.responsesReceived < responses.responsesExpected) {
+ ++responses.responsesReceived
+ responses.responses.push(responsePayload)
+ } else {
+ logger.debug(
+ `${this.uiService.logPrefix(moduleName, 'responseHandler')} Received response after all expected responses:`,
+ { responsePayload, uuid }
+ )
+ }
}
- if (
- this.responses.get(uuid)?.responsesReceived === this.responses.get(uuid)?.responsesExpected
- ) {
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ const responses = this.responses.get(uuid)!
+ if (responses.responsesReceived >= responses.responsesExpected) {
this.uiService.sendResponse(uuid, this.buildResponsePayload(uuid))
this.responses.delete(uuid)
this.uiService.deleteBroadcastChannelRequest(uuid)