diff --git a/backend/src/models/util/FallBackMutex.ts b/backend/src/models/util/FallBackMutex.ts new file mode 100644 index 0000000..d61db64 --- /dev/null +++ b/backend/src/models/util/FallBackMutex.ts @@ -0,0 +1,27 @@ +import { AsyncFailable, HasSuccess } from 'picsur-shared/dist/types'; + +const fallBackMap: Record> = {}; + +export async function FallBackMutex< + MF extends () => AsyncFailable, + FF extends () => AsyncFailable, + O, +>(key: string, mainFunc: MF, fallBackFunc: FF): AsyncFailable { + const try_it = await mainFunc(); + if (HasSuccess(try_it)) return try_it; + + if (fallBackMap[key] !== undefined) { + await fallBackMap[key]; + return FallBackMutex(key, mainFunc, fallBackFunc); + } + + fallBackMap[key] = fallBackFunc(); + fallBackMap[key] + .then(() => { + delete fallBackMap[key]; + }) + .catch(() => { + delete fallBackMap[key]; + }); + return FallBackMutex(key, mainFunc, fallBackFunc); +}