Ensure the deferred promise use to send OCPP message will not be leaked
authorJérôme Benoit <jerome.benoit@sap.com>
Tue, 13 Sep 2022 18:08:10 +0000 (20:08 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Tue, 13 Sep 2022 18:08:10 +0000 (20:08 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
src/charging-station/ChargingStation.ts

index 32d48c24c1213c8030ce13eb42b0f3718f2b3c53..1845d35b220186bce42f042d29cf40930fddeb7f 100644 (file)
@@ -1484,7 +1484,7 @@ export default class ChargingStation {
             // Respond
             cachedRequest = this.requests.get(messageId);
             if (Array.isArray(cachedRequest) === true) {
-              [responseCallback, , requestCommandName, requestPayload] = cachedRequest;
+              [responseCallback, errorCallback, requestCommandName, requestPayload] = cachedRequest;
             } else {
               throw new OCPPError(
                 ErrorType.PROTOCOL_ERROR,
@@ -1575,8 +1575,12 @@ export default class ChargingStation {
         [MessageType.CALL_RESULT_MESSAGE, MessageType.CALL_ERROR_MESSAGE].includes(messageType) ===
         true
       ) {
-        // Remove the request from the cache
+        // Always remove the request from the cache in case of error at response handling
         this.requests.delete(messageId);
+        // Always reject the deferred promise in case of error at response handling (rejecting an already fulfilled promise is a no-op)
+        if (errorCallback) {
+          errorCallback(error as OCPPError, false);
+        }
       }
     }
   }