Merge branch 'main' into dependabot/github_actions/sonarsource/sonarcloud-github...
[e-mobility-charging-stations-simulator.git] / src / utils / AsyncLock.ts
index 9c0584565e3ecb80897b2ad32418a1afdb0cc888..fe984cebdef97d8043d0f29f6fb9ba99ec502f3c 100644 (file)
@@ -2,6 +2,8 @@
 
 import Queue from 'mnemonist/queue.js';
 
+import { Constants } from './Constants';
+
 export enum AsyncLockType {
   configuration = 'configuration',
   performance = 'performance',
@@ -19,7 +21,15 @@ export class AsyncLock {
     this.resolveQueue = new Queue<ResolveType>();
   }
 
-  public static async acquire(type: AsyncLockType): Promise<void> {
+  public static async runExclusive<T>(type: AsyncLockType, fn: () => T | Promise<T>): Promise<T> {
+    return AsyncLock.acquire(type)
+      .then(fn)
+      .finally(() => {
+        AsyncLock.release(type).catch(Constants.EMPTY_FUNCTION);
+      });
+  }
+
+  private static async acquire(type: AsyncLockType): Promise<void> {
     const asyncLock = AsyncLock.getAsyncLock(type);
     if (!asyncLock.acquired) {
       asyncLock.acquired = true;
@@ -30,7 +40,7 @@ export class AsyncLock {
     });
   }
 
-  public static async release(type: AsyncLockType): Promise<void> {
+  private static async release(type: AsyncLockType): Promise<void> {
     const asyncLock = AsyncLock.getAsyncLock(type);
     if (asyncLock.resolveQueue.size === 0 && asyncLock.acquired) {
       asyncLock.acquired = false;