type SharedAsyncResourceState = { _tag: 'idle' | 'loading' | 'ready'; consecutiveFailures: number; lastFailureAt: null; } | { _tag: 'cooldown' | 'exhausted'; consecutiveFailures: number; lastFailureAt: number; error: unknown; }; interface SharedAsyncResourceOptions { load: () => Promise; retryCooldownMs?: number; maxConsecutiveFailures?: number; now?: () => number; onStateChange?: (state: SharedAsyncResourceState) => void; } interface SharedAsyncResource { get: () => Promise; state: () => SharedAsyncResourceState; reset: () => void; } declare function createSharedAsyncResource(options: SharedAsyncResourceOptions): SharedAsyncResource; interface ObjectAsyncLock { run: (key: T, task: () => Promise) => Promise; } declare function createObjectAsyncLock(onRejected?: (error: unknown) => void): ObjectAsyncLock; export { ObjectAsyncLock, SharedAsyncResource, SharedAsyncResourceOptions, SharedAsyncResourceState, createObjectAsyncLock, createSharedAsyncResource };