refactor: explicit condition check in OCPP stack
[e-mobility-charging-stations-simulator.git] / src / charging-station / ocpp / OCPPRequestService.ts
index f1ea87112dcfbfaed5fb261418e0cd5d396df5e3..07793a8fd7f5ba498cb5a23581f6d60a84d4c019 100644 (file)
@@ -12,7 +12,6 @@ import {
   type ErrorResponse,
   ErrorType,
   type IncomingRequestCommand,
-  type JsonObject,
   type JsonType,
   MessageType,
   type OCPPVersion,
@@ -24,8 +23,8 @@ import {
   type ResponseType,
 } from '../../types';
 import {
-  Constants,
   cloneObject,
+  formatDurationMilliSeconds,
   handleSendMessageError,
   isNullOrUndefined,
   logger,
@@ -344,9 +343,7 @@ export abstract class OCPPRequestService {
             .then(() => {
               resolve(payload);
             })
-            .catch((error) => {
-              reject(error);
-            })
+            .catch(reject)
             .finally(() => {
               chargingStation.requests.delete(messageId);
             });
@@ -376,29 +373,27 @@ export abstract class OCPPRequestService {
           reject(ocppError);
         };
 
-        const rejectWithOcppError = (ocppError: OCPPError): void => {
-          // Reject response
-          if (messageType !== MessageType.CALL_MESSAGE) {
-            return reject(ocppError);
-          }
-          // Reject and remove request from the cache
-          return errorCallback(ocppError, false);
-        };
-
-        const bufferAndRejectWithOcppError = (ocppError: OCPPError): void => {
-          // Buffer
-          chargingStation.bufferMessage(messageToSend);
-          if (messageType === MessageType.CALL_MESSAGE) {
-            this.cacheRequestPromise(
-              chargingStation,
-              messageId,
-              messagePayload as JsonType,
-              commandName,
-              responseCallback,
-              errorCallback,
-            );
+        const handleSendError = (ocppError: OCPPError): void => {
+          if (params?.skipBufferingOnError === false) {
+            // Buffer
+            chargingStation.bufferMessage(messageToSend);
+            if (messageType === MessageType.CALL_MESSAGE) {
+              this.cacheRequestPromise(
+                chargingStation,
+                messageId,
+                messagePayload as JsonType,
+                commandName,
+                responseCallback,
+                errorCallback,
+              );
+            }
+          } else if (
+            params?.skipBufferingOnError === true &&
+            messageType === MessageType.CALL_MESSAGE
+          ) {
+            // Remove request from the cache
+            chargingStation.requests.delete(messageId);
           }
-          // Reject and keep request in the cache
           return reject(ocppError);
         };
 
@@ -416,12 +411,16 @@ export abstract class OCPPRequestService {
         if (chargingStation.isWebSocketConnectionOpened() === true) {
           const beginId = PerformanceStatistics.beginMeasure(commandName);
           const sendTimeout = setTimeout(() => {
-            return rejectWithOcppError(
+            return handleSendError(
               new OCPPError(
                 ErrorType.GENERIC_ERROR,
-                `Timeout for message id '${messageId}'`,
+                `Timeout ${formatDurationMilliSeconds(
+                  OCPPConstants.OCPP_WEBSOCKET_TIMEOUT,
+                )} reached for ${
+                  params?.skipBufferingOnError === false ? '' : 'non '
+                }buffered message id '${messageId}' with content '${messageToSend}`,
                 commandName,
-                (messagePayload as JsonObject)?.details ?? Constants.EMPTY_FROZEN_OBJECT,
+                (messagePayload as OCPPError).details,
               ),
             );
           }, OCPPConstants.OCPP_WEBSOCKET_TIMEOUT);
@@ -443,39 +442,34 @@ export abstract class OCPPRequestService {
                   responseCallback,
                   errorCallback,
                 );
-              }
-              // Resolve response
-              if (messageType !== MessageType.CALL_MESSAGE) {
+              } else {
+                // Resolve response
                 return resolve(messagePayload);
               }
             } else if (error) {
-              const ocppError = new OCPPError(
-                ErrorType.GENERIC_ERROR,
-                `WebSocket errored for ${
-                  params?.skipBufferingOnError === false ? '' : 'non '
-                }buffered message id '${messageId}' with content '${messageToSend}'`,
-                commandName,
-                { name: error.name, message: error.message, stack: error.stack },
+              return handleSendError(
+                new OCPPError(
+                  ErrorType.GENERIC_ERROR,
+                  `WebSocket errored for ${
+                    params?.skipBufferingOnError === false ? '' : 'non '
+                  }buffered message id '${messageId}' with content '${messageToSend}'`,
+                  commandName,
+                  { name: error.name, message: error.message, stack: error.stack },
+                ),
               );
-              if (params?.skipBufferingOnError === false) {
-                return bufferAndRejectWithOcppError(ocppError);
-              }
-              return rejectWithOcppError(ocppError);
             }
           });
         } else {
-          const ocppError = new OCPPError(
-            ErrorType.GENERIC_ERROR,
-            `WebSocket closed for ${
-              params?.skipBufferingOnError === false ? '' : 'non '
-            }buffered message id '${messageId}' with content '${messageToSend}'`,
-            commandName,
-            (messagePayload as JsonObject)?.details ?? Constants.EMPTY_FROZEN_OBJECT,
+          return handleSendError(
+            new OCPPError(
+              ErrorType.GENERIC_ERROR,
+              `WebSocket closed for ${
+                params?.skipBufferingOnError === false ? '' : 'non '
+              }buffered message id '${messageId}' with content '${messageToSend}'`,
+              commandName,
+              (messagePayload as OCPPError).details,
+            ),
           );
-          if (params?.skipBufferingOnError === false) {
-            return bufferAndRejectWithOcppError(ocppError);
-          }
-          return rejectWithOcppError(ocppError);
         }
       });
     }
@@ -523,9 +517,11 @@ export abstract class OCPPRequestService {
         messageToSend = JSON.stringify([
           messageType,
           messageId,
-          (messagePayload as OCPPError)?.code ?? ErrorType.GENERIC_ERROR,
-          (messagePayload as OCPPError)?.message ?? '',
-          (messagePayload as OCPPError)?.details ?? { commandName },
+          (messagePayload as OCPPError).code,
+          (messagePayload as OCPPError).message,
+          (messagePayload as OCPPError).details ?? {
+            command: (messagePayload as OCPPError).command ?? commandName,
+          },
         ] as ErrorResponse);
         break;
     }