fix: handle properly async performance storage
authorJérôme Benoit <jerome.benoit@sap.com>
Sat, 13 Jan 2024 22:45:22 +0000 (23:45 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Sat, 13 Jan 2024 22:45:22 +0000 (23:45 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
src/charging-station/Bootstrap.ts
src/utils/Utils.ts
src/utils/index.ts

index 488cf6a771ebbc2372cff3ab08f70c40111fa9b7..6ee606862cb170e8204faa60086bcc1100158543 100644 (file)
@@ -35,6 +35,7 @@ import {
   generateUUID,
   handleUncaughtException,
   handleUnhandledRejection,
+  isAsyncFunction,
   isNotEmptyArray,
   logPrefix,
   logger
@@ -362,7 +363,18 @@ export class Bootstrap extends EventEmitter {
   }
 
   private readonly workerEventPerformanceStatistics = (data: Statistics): void => {
-    this.storage?.storePerformanceStatistics(data) as undefined
+    // eslint-disable-next-line @typescript-eslint/unbound-method
+    if (isAsyncFunction(this.storage?.storePerformanceStatistics)) {
+      (
+        this.storage.storePerformanceStatistics as (
+          performanceStatistics: Statistics
+        ) => Promise<void>
+      )(data).catch(Constants.EMPTY_FUNCTION)
+    } else {
+      (this.storage?.storePerformanceStatistics as (performanceStatistics: Statistics) => void)(
+        data
+      )
+    }
   }
 
   private initializeCounters (): void {
index 2472bf617621b87ef3752cc6000447918aa25300..458fd93065e2bd08fec1e06e7610196c7d9383f0 100644 (file)
@@ -261,6 +261,17 @@ export const clone = <T>(object: T): T => {
   return deepClone(object as CloneableData) as T
 }
 
+/**
+ * Detects whether the given value is an asynchronous function or not.
+ *
+ * @param fn - Unknown value.
+ * @returns `true` if `fn` was an asynchronous function, otherwise `false`.
+ * @internal
+ */
+export const isAsyncFunction = (fn: unknown): fn is (...args: unknown[]) => Promise<unknown> => {
+  return typeof fn === 'function' && fn.constructor.name === 'AsyncFunction'
+}
+
 export const isObject = (value: unknown): value is object => {
   return value != null && typeof value === 'object' && !Array.isArray(value)
 }
index 0069a8755229874d678502da3748ec27cdae2f15..b202225586685306df379e6050cfa6b0a4d58b5f 100644 (file)
@@ -24,6 +24,7 @@ export {
   buildStoppedMessage
 } from './MessageChannelUtils.js'
 export {
+  isAsyncFunction,
   JSONStringifyWithMapSupport,
   clone,
   convertToBoolean,