test: add AsyncLock test
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Sat, 3 Aug 2024 12:53:24 +0000 (14:53 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Sat, 3 Aug 2024 12:53:24 +0000 (14:53 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
src/utils/AsyncLock.ts

index f6b793a60748beaa8454fdb80e13510553a25898..f69faac80d77a907704adfc9574b8711bb41e2c8 100644 (file)
@@ -2,7 +2,7 @@
 
 import { Queue } from 'mnemonist'
 
-import { Constants } from './Constants.js'
+import { isAsyncFunction } from './Utils.js'
 
 export enum AsyncLockType {
   configuration = 'configuration',
@@ -22,11 +22,16 @@ export class AsyncLock {
   }
 
   public static async runExclusive<T>(type: AsyncLockType, fn: () => T | Promise<T>): Promise<T> {
-    return await AsyncLock.acquire(type)
-      .then(fn)
-      .finally(() => {
-        AsyncLock.release(type).catch(Constants.EMPTY_FUNCTION)
-      })
+    try {
+      await AsyncLock.acquire(type)
+      if (isAsyncFunction(fn)) {
+        return await fn()
+      } else {
+        return fn() as T
+      }
+    } finally {
+      await AsyncLock.release(type)
+    }
   }
 
   private static async acquire (type: AsyncLockType): Promise<void> {