X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2Fbroadcast-channel%2FChargingStationWorkerBroadcastChannel.ts;h=cb152baf7fbfc8e75766a6f7313ca390ea19f1d8;hb=fcda9151b9eb6d13f06f7a5db45c89a77bda9eb8;hp=a6125de2d51a7a0cf0feeec61909f2b511466028;hpb=401fa922baa555f5997732052918ae2ab5ff184c;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/broadcast-channel/ChargingStationWorkerBroadcastChannel.ts b/src/charging-station/broadcast-channel/ChargingStationWorkerBroadcastChannel.ts index a6125de2..cb152baf 100644 --- a/src/charging-station/broadcast-channel/ChargingStationWorkerBroadcastChannel.ts +++ b/src/charging-station/broadcast-channel/ChargingStationWorkerBroadcastChannel.ts @@ -1,6 +1,6 @@ import { secondsToMilliseconds } from 'date-fns' +import { isEmpty } from 'rambda' -import { WorkerBroadcastChannel } from './WorkerBroadcastChannel.js' import { BaseError, type OCPPError } from '../../exception/index.js' import { AuthorizationStatus, @@ -37,10 +37,11 @@ import { type StopTransactionRequest, type StopTransactionResponse } from '../../types/index.js' -import { Constants, convertToInt, isEmptyObject, logger } from '../../utils/index.js' +import { Constants, convertToInt, isAsyncFunction, logger } from '../../utils/index.js' import type { ChargingStation } from '../ChargingStation.js' import { getConfigurationKey } from '../ConfigurationKeyUtils.js' import { buildMeterValue } from '../ocpp/index.js' +import { WorkerBroadcastChannel } from './WorkerBroadcastChannel.js' const moduleName = 'ChargingStationWorkerBroadcastChannel' @@ -56,7 +57,7 @@ type CommandResponse = type CommandHandler = ( requestPayload?: BroadcastChannelRequestPayload // eslint-disable-next-line @typescript-eslint/no-invalid-void-type -) => Promise | void +) => Promise | CommandResponse | void export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChannel { private readonly commandHandlers: Map @@ -80,6 +81,12 @@ export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChanne await this.chargingStation.stop() } ], + [ + BroadcastChannelProcedureName.DELETE_CHARGING_STATIONS, + async (requestPayload?: BroadcastChannelRequestPayload) => { + await this.chargingStation.delete(requestPayload?.deleteConfiguration as boolean) + } + ], [ BroadcastChannelProcedureName.OPEN_CONNECTION, () => { @@ -129,8 +136,7 @@ export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChanne RequestCommand.STOP_TRANSACTION, { meterStop: this.chargingStation.getEnergyActiveImportRegisterByTransactionId( - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - requestPayload!.transactionId!, + requestPayload?.transactionId, true ), ...requestPayload @@ -174,12 +180,7 @@ export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChanne await this.chargingStation.ocppRequestService.requestHandler< StatusNotificationRequest, StatusNotificationResponse - >( - this.chargingStation, - RequestCommand.STATUS_NOTIFICATION, - requestPayload, - requestParams - ) + >(this.chargingStation, RequestCommand.STATUS_NOTIFICATION, requestPayload, requestParams) ], [ BroadcastChannelProcedureName.HEARTBEAT, @@ -262,7 +263,7 @@ export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChanne this.onmessageerror = this.messageErrorHandler.bind(this) as (message: unknown) => void } - private async requestHandler (messageEvent: MessageEvent): Promise { + private requestHandler (messageEvent: MessageEvent): void { const validatedMessageEvent = this.validateMessageEvent(messageEvent) if (validatedMessageEvent === false) { return @@ -273,7 +274,8 @@ export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChanne const [uuid, command, requestPayload] = validatedMessageEvent.data as BroadcastChannelRequest if ( requestPayload.hashIds != null && - !requestPayload.hashIds.includes(this.chargingStation.stationInfo.hashId) + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + !requestPayload.hashIds.includes(this.chargingStation.stationInfo!.hashId) ) { return } @@ -284,42 +286,40 @@ export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChanne return } let responsePayload: BroadcastChannelResponsePayload | undefined - // eslint-disable-next-line @typescript-eslint/no-invalid-void-type - let commandResponse: CommandResponse | void | undefined - try { - commandResponse = await this.commandHandler(command, requestPayload) - if (commandResponse == null || isEmptyObject(commandResponse)) { - responsePayload = { - hashId: this.chargingStation.stationInfo.hashId, - status: ResponseStatus.SUCCESS + this.commandHandler(command, requestPayload) + .then(commandResponse => { + if (commandResponse == null || isEmpty(commandResponse)) { + responsePayload = { + hashId: this.chargingStation.stationInfo?.hashId, + status: ResponseStatus.SUCCESS + } + } else { + responsePayload = this.commandResponseToResponsePayload( + command, + requestPayload, + commandResponse + ) } - } else { - responsePayload = this.commandResponseToResponsePayload( + }) + .catch(error => { + logger.error( + `${this.chargingStation.logPrefix()} ${moduleName}.requestHandler: Handle request error:`, + error + ) + responsePayload = { + hashId: this.chargingStation.stationInfo?.hashId, + status: ResponseStatus.FAILURE, command, requestPayload, - commandResponse - ) - } - } catch (error) { - logger.error( - `${this.chargingStation.logPrefix()} ${moduleName}.requestHandler: Handle request error:`, - error - ) - responsePayload = { - hashId: this.chargingStation.stationInfo.hashId, - status: ResponseStatus.FAILURE, - command, - requestPayload, + errorMessage: (error as OCPPError).message, + errorStack: (error as OCPPError).stack, + errorDetails: (error as OCPPError).details + } satisfies BroadcastChannelResponsePayload + }) + .finally(() => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - commandResponse: commandResponse!, - errorMessage: (error as OCPPError).message, - errorStack: (error as OCPPError).stack, - errorDetails: (error as OCPPError).details - } - } finally { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.sendResponse([uuid, responsePayload!]) - } + this.sendResponse([uuid, responsePayload!]) + }) } private messageErrorHandler (messageEvent: MessageEvent): void { @@ -333,11 +333,20 @@ export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChanne command: BroadcastChannelProcedureName, requestPayload: BroadcastChannelRequestPayload // eslint-disable-next-line @typescript-eslint/no-invalid-void-type - ): Promise { + ): Promise { if (this.commandHandlers.has(command)) { this.cleanRequestPayload(command, requestPayload) // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return await this.commandHandlers.get(command)!(requestPayload) + const commandHandler = this.commandHandlers.get(command)! + if (isAsyncFunction(commandHandler)) { + return await commandHandler(requestPayload) + } + return ( + commandHandler as ( + requestPayload?: BroadcastChannelRequestPayload + // eslint-disable-next-line @typescript-eslint/no-invalid-void-type + ) => CommandResponse | void + )(requestPayload) } throw new BaseError(`Unknown worker broadcast channel command: '${command}'`) } @@ -362,12 +371,12 @@ export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChanne const responseStatus = this.commandResponseToResponseStatus(command, commandResponse) if (responseStatus === ResponseStatus.SUCCESS) { return { - hashId: this.chargingStation.stationInfo.hashId, + hashId: this.chargingStation.stationInfo?.hashId, status: responseStatus } } return { - hashId: this.chargingStation.stationInfo.hashId, + hashId: this.chargingStation.stationInfo?.hashId, status: responseStatus, command, requestPayload, @@ -389,24 +398,24 @@ export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChanne | StartTransactionResponse | StopTransactionResponse | AuthorizeResponse - )?.idTagInfo?.status === AuthorizationStatus.ACCEPTED + ).idTagInfo?.status === AuthorizationStatus.ACCEPTED ) { return ResponseStatus.SUCCESS } return ResponseStatus.FAILURE case BroadcastChannelProcedureName.BOOT_NOTIFICATION: - if (commandResponse?.status === RegistrationStatusEnumType.ACCEPTED) { + if (commandResponse.status === RegistrationStatusEnumType.ACCEPTED) { return ResponseStatus.SUCCESS } return ResponseStatus.FAILURE case BroadcastChannelProcedureName.DATA_TRANSFER: - if (commandResponse?.status === DataTransferStatus.ACCEPTED) { + if (commandResponse.status === DataTransferStatus.ACCEPTED) { return ResponseStatus.SUCCESS } return ResponseStatus.FAILURE case BroadcastChannelProcedureName.STATUS_NOTIFICATION: case BroadcastChannelProcedureName.METER_VALUES: - if (isEmptyObject(commandResponse)) { + if (isEmpty(commandResponse)) { return ResponseStatus.SUCCESS } return ResponseStatus.FAILURE