Fix error handling at OCPP message sending
[e-mobility-charging-stations-simulator.git] / src / charging-station / UIServiceWorkerBroadcastChannel.ts
index 652d825a537b2a7d60233ca4e6f14734731ec385..5139b678c2d47ea168c495a3afbf264f7a62d517 100644 (file)
@@ -1,4 +1,4 @@
-import { ResponsePayload, ResponseStatus } from '../types/UIProtocol';
+import { type ResponsePayload, ResponseStatus } from '../types/UIProtocol';
 import type {
   BroadcastChannelResponse,
   BroadcastChannelResponsePayload,
@@ -29,11 +29,14 @@ export default class UIServiceWorkerBroadcastChannel extends WorkerBroadcastChan
   }
 
   private responseHandler(messageEvent: MessageEvent): void {
-    if (this.isRequest(messageEvent.data)) {
+    const validatedMessageEvent = this.validateMessageEvent(messageEvent);
+    if (validatedMessageEvent === false) {
       return;
     }
-    this.validateMessageEvent(messageEvent);
-    const [uuid, responsePayload] = messageEvent.data as BroadcastChannelResponse;
+    if (this.isRequest(validatedMessageEvent.data) === true) {
+      return;
+    }
+    const [uuid, responsePayload] = validatedMessageEvent.data as BroadcastChannelResponse;
     if (this.responses.has(uuid) === false) {
       this.responses.set(uuid, {
         responsesExpected: this.uiService.getBroadcastChannelExpectedResponses(uuid),
@@ -41,16 +44,14 @@ export default class UIServiceWorkerBroadcastChannel extends WorkerBroadcastChan
         responses: [responsePayload],
       });
     } else if (
-      this.responses.get(uuid)?.responsesReceived + 1 <
-      this.responses.get(uuid)?.responsesExpected
+      this.responses.get(uuid)?.responsesReceived <= this.responses.get(uuid)?.responsesExpected
     ) {
       this.responses.get(uuid).responsesReceived++;
       this.responses.get(uuid).responses.push(responsePayload);
-    } else if (
-      this.responses.get(uuid)?.responsesReceived + 1 ===
-      this.responses.get(uuid)?.responsesExpected
+    }
+    if (
+      this.responses.get(uuid)?.responsesReceived === this.responses.get(uuid)?.responsesExpected
     ) {
-      this.responses.get(uuid).responses.push(responsePayload);
       this.uiService.sendResponse(uuid, this.buildResponsePayload(uuid));
       this.responses.delete(uuid);
       this.uiService.deleteBroadcastChannelRequest(uuid);
@@ -60,7 +61,7 @@ export default class UIServiceWorkerBroadcastChannel extends WorkerBroadcastChan
   private buildResponsePayload(uuid: string): ResponsePayload {
     const responsesStatus = this.responses
       .get(uuid)
-      ?.responses.every((response) => response.status === ResponseStatus.SUCCESS)
+      ?.responses.every(({ status }) => status === ResponseStatus.SUCCESS)
       ? ResponseStatus.SUCCESS
       : ResponseStatus.FAILURE;
     return {
@@ -83,13 +84,23 @@ export default class UIServiceWorkerBroadcastChannel extends WorkerBroadcastChan
           })
           .filter((hashId) => hashId !== undefined),
       }),
+      ...(responsesStatus === ResponseStatus.FAILURE && {
+        responsesFailed: this.responses
+          .get(uuid)
+          ?.responses.map((response) => {
+            if (response.status === ResponseStatus.FAILURE) {
+              return response;
+            }
+          })
+          .filter((response) => response !== undefined),
+      }),
     };
   }
 
   private messageErrorHandler(messageEvent: MessageEvent): void {
     logger.error(
       `${this.uiService.logPrefix(moduleName, 'messageErrorHandler')} Error at handling message:`,
-      { messageEvent, messageEventData: messageEvent.data }
+      messageEvent
     );
   }
 }