import { DurableObject } from 'cloudflare:workers';

type Lock = {
    lease: number;
    deadline: number;
};
type Success = {
    success: true;
} & Lock;
type Failed = {
    success: false;
    reason: "NO_LONGER_VALID" | "BORROWED";
};
type Result = Success | Failed;
declare class DurableLock extends DurableObject {
    alarm(): Promise<void>;
    fetch(request: Request): Promise<Response>;
    acquire(ttl: number, lease?: number): Promise<Result>;
    release(lease: number): Promise<Failed | {
        success: true;
    }>;
    isLocked(): Promise<boolean>;
    private hardDeadline;
}
declare function useDurableLock(namespace: DurableObjectNamespace<DurableLock>, id: string): {
    acquire: (ttl: number, lease?: number) => Promise<Result>;
    release: (lease: number) => Promise<Failed | {
        success: true;
    }>;
    isLocked: () => Promise<boolean>;
};

export { DurableLock, type Failed, type Lock, type Result, type Success, useDurableLock };
