import { authFileState } from "./auth"; type InitState = "NOT_INITIALIZED" | "PENDING" | "INITIALIZED"; export class InitWatcher { private initState: InitState; private initFunction: () => Promise; private initializationPromise: Promise | undefined; constructor(initFunction: () => Promise) { this.initState = "NOT_INITIALIZED"; this.initFunction = initFunction; this.initializationPromise = undefined; } async initialize(): Promise { if (this.initState === "NOT_INITIALIZED") { this.initState = "PENDING"; this.initializationPromise = this.retryFunction(this.initFunction, 3) .then((value) => { this.initState = "INITIALIZED"; return value; }) .catch((error) => { this.initState = "NOT_INITIALIZED"; this.initializationPromise = undefined; throw error; }); } return this.initializationPromise as Promise; } async retryFunction(func: () => Promise, retries: number, currentAttempt = 1): Promise { try { const result = await func(); return result; } catch (error) { if (currentAttempt < retries) { return this.retryFunction(func, retries, currentAttempt + 1); } else { throw error; } } } reset(): void { this.initState = "NOT_INITIALIZED"; this.initializationPromise = undefined; } async observe(): Promise { return await this.initialize(); } getState(): InitState { return this.initState; } } export default async function initialize() { await authFileState.observe(); }