X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2FChargingStationWorkerBroadcastChannel.ts;h=0d890687828cb6b86ac450c48a3610f5e283c893;hb=6812b4e11d45a0d6179a266687c7ad9aa6e3b538;hp=6d38f06c0f12539bccd17daa78c47492efc6ac45;hpb=02a6943a30a9a6c93e5dcbdb79aa8d9746ae368e;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ChargingStationWorkerBroadcastChannel.ts b/src/charging-station/ChargingStationWorkerBroadcastChannel.ts index 6d38f06c..0d890687 100644 --- a/src/charging-station/ChargingStationWorkerBroadcastChannel.ts +++ b/src/charging-station/ChargingStationWorkerBroadcastChannel.ts @@ -1,5 +1,7 @@ +import BaseError from '../exception/BaseError'; import { RequestCommand } from '../types/ocpp/Requests'; import { + AuthorizationStatus, StartTransactionRequest, StartTransactionResponse, StopTransactionReason, @@ -9,13 +11,18 @@ import { import { BroadcastChannelProcedureName, BroadcastChannelRequest, + BroadcastChannelRequestPayload, + BroadcastChannelResponsePayload, + MessageEvent, } from '../types/WorkerBroadcastChannel'; +import { ResponseStatus } from '../ui/web/src/type/UIProtocol'; +import logger from '../utils/Logger'; import ChargingStation from './ChargingStation'; import WorkerBroadcastChannel from './WorkerBroadcastChannel'; const moduleName = 'ChargingStationWorkerBroadcastChannel'; -type MessageEvent = { data: unknown }; +type CommandResponse = StartTransactionResponse | StopTransactionResponse; export default class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChannel { private readonly chargingStation: ChargingStation; @@ -24,45 +31,94 @@ export default class ChargingStationWorkerBroadcastChannel extends WorkerBroadca super(); this.chargingStation = chargingStation; this.onmessage = this.requestHandler.bind(this) as (message: MessageEvent) => void; + this.onmessageerror = this.messageErrorHandler.bind(this) as (message: MessageEvent) => void; } private async requestHandler(messageEvent: MessageEvent): Promise { - const [, command, payload] = messageEvent.data as BroadcastChannelRequest; + if (this.isResponse(messageEvent.data)) { + return; + } - if (payload.hashId !== this.chargingStation.hashId) { + const [uuid, command, requestPayload] = messageEvent.data as BroadcastChannelRequest; + + if (requestPayload?.hashId !== this.chargingStation.hashId) { return; } - // TODO: return a response stating the command success or failure + let responsePayload: BroadcastChannelResponsePayload; + let commandResponse: CommandResponse; + try { + commandResponse = await this.commandHandler(command, requestPayload); + if (commandResponse === undefined) { + responsePayload = { status: ResponseStatus.SUCCESS }; + } else { + responsePayload = { status: this.commandResponseToResponseStatus(commandResponse) }; + } + } catch (error) { + logger.error( + `${this.chargingStation.logPrefix()} ${moduleName}.requestHandler: Handle request error:`, + error + ); + responsePayload = { + status: ResponseStatus.FAILURE, + command, + requestPayload, + commandResponse, + errorMessage: (error as Error).message, + errorStack: (error as Error).stack, + }; + } + this.sendResponse([uuid, responsePayload]); + } + + private messageErrorHandler(messageEvent: MessageEvent): void { + logger.error( + `${this.chargingStation.logPrefix()} ${moduleName}.messageErrorHandler: Error at handling message:`, + { messageEvent, messageEventData: messageEvent.data } + ); + } + + private async commandHandler( + command: BroadcastChannelProcedureName, + requestPayload: BroadcastChannelRequestPayload + ): Promise { switch (command) { case BroadcastChannelProcedureName.START_TRANSACTION: - await this.chargingStation.ocppRequestService.requestHandler< + return this.chargingStation.ocppRequestService.requestHandler< StartTransactionRequest, StartTransactionResponse >(this.chargingStation, RequestCommand.START_TRANSACTION, { - connectorId: payload.connectorId, - idTag: payload.idTag, + connectorId: requestPayload.connectorId, + idTag: requestPayload.idTag, }); - break; case BroadcastChannelProcedureName.STOP_TRANSACTION: - await this.chargingStation.ocppRequestService.requestHandler< + return this.chargingStation.ocppRequestService.requestHandler< StopTransactionRequest, StopTransactionResponse >(this.chargingStation, RequestCommand.STOP_TRANSACTION, { - transactionId: payload.transactionId, + transactionId: requestPayload.transactionId, meterStop: this.chargingStation.getEnergyActiveImportRegisterByTransactionId( - payload.transactionId + requestPayload.transactionId ), - idTag: this.chargingStation.getTransactionIdTag(payload.transactionId), + idTag: this.chargingStation.getTransactionIdTag(requestPayload.transactionId), reason: StopTransactionReason.NONE, }); - break; case BroadcastChannelProcedureName.START_CHARGING_STATION: this.chargingStation.start(); break; case BroadcastChannelProcedureName.STOP_CHARGING_STATION: await this.chargingStation.stop(); break; + default: + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + throw new BaseError(`Unknown broadcast channel command: ${command}`); + } + } + + private commandResponseToResponseStatus(commandResponse: CommandResponse): ResponseStatus { + if (commandResponse?.idTagInfo?.status === AuthorizationStatus.ACCEPTED) { + return ResponseStatus.SUCCESS; } + return ResponseStatus.FAILURE; } }