/**
 * @module SharedLock
 */
import { type IEventDispatcher } from "../../../../event-bus/contracts/_module.js";
import { type IExecutionContext } from "../../../../execution-context/contracts/_module.js";
import { type Use } from "../../../../middleware/contracts/_module.js";
import { type IKey, type INamespace } from "../../../../namespace/contracts/_module.js";
import { type ISharedLock, type ISharedLockAdapter, type ISharedLockState, type SharedLockAdapterVariants, type SharedLockEventMap } from "../../../../shared-lock/contracts/_module.js";
import { type ITimeSpan } from "../../../../time-span/contracts/_module.js";
import { TimeSpan } from "../../../../time-span/implementations/_module.js";
import { type AsyncLazy, type WaitUntil } from "../../../../utilities/_module.js";
/**
 * @internal
 */
export type ISerializedSharedLock = {
    version: "1";
    key: string;
    lockId: string;
    limit: number;
    ttlInMs: number | null;
};
/**
 * @internal
 */
export type SharedLockSettings = {
    serdeTransformerName: string;
    namespace: INamespace;
    adapter: ISharedLockAdapter;
    originalAdapter: SharedLockAdapterVariants;
    eventDispatcher: IEventDispatcher<SharedLockEventMap>;
    limit: number;
    key: IKey;
    lockId: string;
    ttl: TimeSpan | null;
    defaultRefreshTime: TimeSpan;
    waitUntil: WaitUntil;
    executionContext: IExecutionContext;
    use: Use;
};
/**
 * @internal
 */
export declare class SharedLock implements ISharedLock {
    /**
     * @internal
     */
    static _serialize(deserializedValue: SharedLock): ISerializedSharedLock;
    private readonly namespace;
    private readonly adapter;
    private readonly originalAdapter;
    private readonly eventDispatcher;
    private readonly _key;
    private readonly lockId;
    private _ttl;
    private readonly defaultRefreshTime;
    private readonly serdeTransformerName;
    private readonly limit;
    private readonly waitUntil;
    private readonly executionContext;
    private readonly use;
    constructor(settings: SharedLockSettings);
    _getNamespace(): INamespace;
    _getSerdeTransformerName(): string;
    _getAdapter(): SharedLockAdapterVariants;
    runReaderOrFail<TValue = void>(asyncFn: AsyncLazy<TValue>): Promise<TValue>;
    acquireReader(): Promise<boolean>;
    acquireReaderOrFail(): Promise<void>;
    releaseReader(): Promise<boolean>;
    releaseReaderOrFail(): Promise<void>;
    forceReleaseAllReaders(): Promise<boolean>;
    refreshReader(ttl?: ITimeSpan): Promise<boolean>;
    refreshReaderOrFail(ttl?: ITimeSpan): Promise<void>;
    runWriterOrFail<TValue = void>(asyncFn: AsyncLazy<TValue>): Promise<TValue>;
    acquireWriter(): Promise<boolean>;
    acquireWriterOrFail(): Promise<void>;
    releaseWriter(): Promise<boolean>;
    releaseWriterOrFail(): Promise<void>;
    forceReleaseWriter(): Promise<boolean>;
    refreshWriter(ttl?: ITimeSpan): Promise<boolean>;
    refreshWriterOrFail(ttl?: ITimeSpan): Promise<void>;
    get key(): IKey;
    get id(): string;
    get ttl(): TimeSpan | null;
    forceRelease(): Promise<boolean>;
    private extractWriterState;
    private extractReaderState;
    getState(): Promise<ISharedLockState>;
}
