refactor: cleanup variables namespace
[e-mobility-charging-stations-simulator.git] / src / charging-station / broadcast-channel / ChargingStationWorkerBroadcastChannel.ts
index 87f693f8342e7e055232735a7afa00ff155ace8e..10d0c75c3aff0ad88776f0d76a2fb80cca665c5e 100644 (file)
@@ -40,8 +40,8 @@ import {
 import {
   Constants,
   convertToInt,
+  isAsyncFunction,
   isEmptyObject,
-  isNullOrUndefined,
   logger
 } from '../../utils/index.js'
 import type { ChargingStation } from '../ChargingStation.js'
@@ -62,7 +62,7 @@ type CommandResponse =
 type CommandHandler = (
   requestPayload?: BroadcastChannelRequestPayload
   // eslint-disable-next-line @typescript-eslint/no-invalid-void-type
-) => Promise<CommandResponse | void> | void
+) => Promise<CommandResponse | void> | CommandResponse | void
 
 export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChannel {
   private readonly commandHandlers: Map<BroadcastChannelProcedureName, CommandHandler>
@@ -135,8 +135,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
@@ -212,7 +211,7 @@ export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChanne
                   // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
                   this.chargingStation.getConnectorStatus(requestPayload!.connectorId!)!
                     .transactionId!,
-                  configuredMeterValueSampleInterval !== undefined
+                  configuredMeterValueSampleInterval != null
                     ? secondsToMilliseconds(convertToInt(configuredMeterValueSampleInterval.value))
                     : Constants.DEFAULT_METER_VALUES_INTERVAL
                 )
@@ -263,7 +262,7 @@ export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChanne
     this.onmessageerror = this.messageErrorHandler.bind(this) as (message: unknown) => void
   }
 
-  private async requestHandler (messageEvent: MessageEvent): Promise<void> {
+  private requestHandler (messageEvent: MessageEvent): void {
     const validatedMessageEvent = this.validateMessageEvent(messageEvent)
     if (validatedMessageEvent === false) {
       return
@@ -273,53 +272,53 @@ export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChanne
     }
     const [uuid, command, requestPayload] = validatedMessageEvent.data as BroadcastChannelRequest
     if (
-      !isNullOrUndefined(requestPayload.hashIds) &&
-      requestPayload.hashIds?.includes(this.chargingStation.stationInfo.hashId) === false
+      requestPayload.hashIds != null &&
+      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+      !requestPayload.hashIds.includes(this.chargingStation.stationInfo!.hashId)
     ) {
       return
     }
-    if (!isNullOrUndefined(requestPayload.hashId)) {
+    if (requestPayload.hashId != null) {
       logger.error(
         `${this.chargingStation.logPrefix()} ${moduleName}.requestHandler: 'hashId' field usage in PDU is deprecated, use 'hashIds' array instead`
       )
       return
     }
     let responsePayload: BroadcastChannelResponsePayload | undefined
-    let commandResponse: CommandResponse | undefined
-    try {
-      commandResponse = await this.commandHandler(command, requestPayload)
-      if (isNullOrUndefined(commandResponse) || isEmptyObject(commandResponse)) {
-        responsePayload = {
-          hashId: this.chargingStation.stationInfo.hashId,
-          status: ResponseStatus.SUCCESS
+    this.commandHandler(command, requestPayload)
+      .then(commandResponse => {
+        if (commandResponse == null || isEmptyObject(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 +332,20 @@ export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChanne
     command: BroadcastChannelProcedureName,
     requestPayload: BroadcastChannelRequestPayload
     // eslint-disable-next-line @typescript-eslint/no-invalid-void-type
-  ): Promise<void | CommandResponse> {
+  ): Promise<CommandResponse | void> {
     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 +370,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,18 +397,18 @@ 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