fix: only send UI server response when needed
[e-mobility-charging-stations-simulator.git] / src / utils / AsyncLock.ts
index 1b61532594b0af1d3148ccddcc6b0779405302b5..229086fef1e8d2b45b9ae8f39ca77b867af0e2d5 100644 (file)
@@ -1,44 +1,48 @@
+// Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
+
 export enum AsyncLockType {
   configuration = 'configuration',
   performance = 'performance',
 }
 
 export class AsyncLock {
-  private static readonly instances = new Map<AsyncLockType, AsyncLock>();
-  private acquired = false;
+  private static readonly asyncLocks = new Map<AsyncLockType, AsyncLock>();
+  private acquired: boolean;
   private readonly resolveQueue: ((value: void | PromiseLike<void>) => void)[];
 
-  private constructor(private readonly type: AsyncLockType) {
+  private constructor() {
     this.acquired = false;
     this.resolveQueue = [];
   }
 
-  public static getInstance(type: AsyncLockType): AsyncLock {
-    if (!AsyncLock.instances.has(type)) {
-      AsyncLock.instances.set(type, new AsyncLock(type));
-    }
-    return AsyncLock.instances.get(type);
-  }
-
-  public async acquire(): Promise<void> {
-    if (!this.acquired) {
-      this.acquired = true;
+  public static async acquire(type: AsyncLockType): Promise<void> {
+    const asyncLock = AsyncLock.getAsyncLock(type);
+    if (!asyncLock.acquired) {
+      asyncLock.acquired = true;
     } else {
       return new Promise((resolve) => {
-        this.resolveQueue.push(resolve);
+        asyncLock.resolveQueue.push(resolve);
       });
     }
   }
 
-  public async release(): Promise<void> {
-    if (this.resolveQueue.length === 0 && this.acquired) {
-      this.acquired = false;
+  public static async release(type: AsyncLockType): Promise<void> {
+    const asyncLock = AsyncLock.getAsyncLock(type);
+    if (asyncLock.resolveQueue.length === 0 && asyncLock.acquired) {
+      asyncLock.acquired = false;
       return;
     }
-    const queuedResolve = this.resolveQueue.shift();
+    const queuedResolve = asyncLock.resolveQueue.shift();
     return new Promise((resolve) => {
       queuedResolve();
       resolve();
     });
   }
+
+  private static getAsyncLock(type: AsyncLockType): AsyncLock {
+    if (!AsyncLock.asyncLocks.has(type)) {
+      AsyncLock.asyncLocks.set(type, new AsyncLock());
+    }
+    return AsyncLock.asyncLocks.get(type);
+  }
 }