keyed-async-mutex.ts 553 B

1234567891011121314151617181920212223
  1. const globalMap = new Map<string, Map<string, Promise<unknown>>>();
  2. export function createKeyedAsyncMutex(globalNamespaceKey: string) {
  3. let map;
  4. if (globalMap.has(globalNamespaceKey)) {
  5. map = globalMap.get(globalNamespaceKey)!;
  6. } else {
  7. map = new Map();
  8. globalMap.set(globalNamespaceKey, map);
  9. }
  10. return {
  11. async acquire<T = unknown>(key: string, fn: () => Promise<T>) {
  12. if (map.has(key)) {
  13. return map.get(key);
  14. }
  15. const promise = fn();
  16. map.set(key, promise);
  17. return promise;
  18. }
  19. };
  20. }