import { type K8Factory } from '../../core/kube/k8_factory.js';
import { LeaseHolder } from './lease_holder.js';
import { type Lease, type LeaseRenewalService } from './lease.js';
import { type NamespaceName } from '../kube/resources/namespace/namespace_name.js';
/**
 * Concrete implementation of a Kubernetes based time-based mutually exclusive lock via the Coordination API.
 * Applies a namespace/deployment wide lock to ensure that only one process, machine, and user can hold the lease at a time.
 * The lease is automatically renewed in the background to prevent expiration and ensure the holder maintains the lease.
 * If the process die, the lease is automatically released after the lease duration.
 *
 * @public
 */
export declare class IntervalLease implements Lease {
    readonly k8Factory: K8Factory;
    readonly renewalService: LeaseRenewalService;
    /** The default duration in seconds for which the lease is to be held before being considered expired. */
    static readonly DEFAULT_LEASE_DURATION = 20;
    /** The holder of the lease. */
    private readonly _leaseHolder;
    /** The namespace which contains the lease. */
    private readonly _namespace;
    /** The name of the lease. */
    private readonly _leaseName;
    /** The duration in seconds for which the lease is to be held. */
    private readonly _durationSeconds;
    /** The identifier of the scheduled lease renewal. */
    private _scheduleId;
    /**
     * @param k8Factory - Injected kubernetes K8Factory need by the methods to create, renew, and delete leases.
     * @param renewalService - Injected lease renewal service need to support automatic (background) lease renewals.
     * @param leaseHolder - The holder of the lease.
     * @param namespace - The namespace in which the lease is to be acquired.
     * @param leaseName - The name of the lease to be acquired; if not provided, the namespace is used.
     * @param durationSeconds - The duration in seconds for which the lease is to be held; if not provided, the default value is used.
     */
    constructor(k8Factory: K8Factory, renewalService: LeaseRenewalService, leaseHolder: LeaseHolder, namespace: NamespaceName, leaseName?: string | null, durationSeconds?: number | null);
    /**
     * The name of the lease.
     */
    get leaseName(): string;
    /**
     * The holder of the lease.
     */
    get leaseHolder(): LeaseHolder;
    /**
     * The namespace in which the lease is to be acquired. By default, the namespace is used as the lease name.
     * The defaults assume there is only a single deployment in a given namespace.
     */
    get namespace(): NamespaceName;
    /**
     * The duration in seconds for which the lease is held before being considered expired. By default, the duration
     * is set to 20 seconds. It is recommended to renew the lease at 50% of the duration to prevent unexpected expiration.
     */
    get durationSeconds(): number;
    /**
     * The identifier of the scheduled lease renewal task.
     */
    get scheduleId(): number | null;
    /**
     * Internal setter for the scheduleId property. External callers should not use this method.
     *
     * @param scheduleId - The identifier of the scheduled lease renewal task.
     */
    private set scheduleId(value);
    /**
     * Acquires the lease. If the lease is already acquired, it checks if the lease is expired or held by the same process.
     * If the lease is expired, it creates a new lease. If the lease is held by the same process, it renews the lease.
     * If the lease is held by another process, then an exception is thrown.
     *
     * @throws LeaseAcquisitionError - If the lease is already acquired by another process or an error occurs during acquisition.
     */
    acquire(): Promise<void>;
    /**
     * Attempts to acquire the lease, by calling the acquire method. If an exception is thrown, it is caught and false is returned.
     * If the lease is successfully acquired, true is returned; otherwise, false is returned.
     *
     * @returns true if the lease is successfully acquired; otherwise, false.
     */
    tryAcquire(): Promise<boolean>;
    /**
     * Renews the lease. If the lease is expired or held by the same process, it creates or renews the lease.
     * If the lease is held by another process, then an exception is thrown.
     *
     * @throws LeaseAcquisitionError - If the lease is already acquired by another process or an error occurs during renewal.
     */
    renew(): Promise<void>;
    /**
     * Attempts to renew the lease, by calling the renew method. If an exception is thrown, it is caught and false is returned.
     * If the lease is successfully renewed, true is returned; otherwise, false is returned.
     *
     * @returns true if the lease is successfully renewed; otherwise, false.
     */
    tryRenew(): Promise<boolean>;
    /**
     * Releases the lease. If the lease is expired or held by the same process, it deletes the lease.
     * If the lease is held by another process, then an exception is thrown.
     *
     * @throws LeaseRelinquishmentError - If the lease is already acquired by another process or an error occurs during relinquishment.
     */
    release(): Promise<void>;
    /**
     * Attempts to release the lease, by calling the release method. If an exception is thrown, it is caught and false is returned.
     * If the lease is successfully released, true is returned; otherwise, false is returned.
     *
     * @returns true if the lease is successfully released; otherwise, false.
     */
    tryRelease(): Promise<boolean>;
    /**
     * Checks if the lease is acquired. If the lease is acquired and not expired, it returns true; otherwise, false.
     *
     * @returns true if the lease is acquired and not expired; otherwise, false.
     */
    isAcquired(): Promise<boolean>;
    /**
     * Checks if the lease is expired. If the lease is expired, it returns true; otherwise, false.
     * This method does not verify if the lease is acquired by the current process.
     *
     * @returns true if the lease is expired; otherwise, false.
     */
    isExpired(): Promise<boolean>;
    /**
     * Retrieves the lease from the Kubernetes API server.
     *
     * @returns the Kubernetes lease object if it exists; otherwise, null.
     * @throws LeaseAcquisitionError - If an error occurs during retrieval.
     */
    private retrieveLease;
    /**
     * Creates or renews the lease. If the lease does not exist, it creates a new lease. If the lease exists, it renews the lease.
     *
     * @param lease - The lease to be created or renewed.
     */
    private createOrRenewLease;
    /**
     * Transfers an existing (expired) lease to the current process.
     *
     * @param lease - The lease to be transferred.
     */
    private transferLease;
    /**
     * Deletes the lease from the Kubernetes API server.
     */
    private deleteLease;
    /**
     * Determines if the lease has expired by comparing the delta in seconds between the current time and the last renewal time.
     *
     * @param lease - The lease to be checked for expiration.
     * @returns true if the lease has expired; otherwise, false.
     */
    private static checkExpiration;
    /**
     * Determines if the lease is held by the same process. This comparison is based on the user, machine, and
     * process identifier of the leaseholder.
     *
     * @param lease - The lease to be checked for ownership.
     * @returns true if the lease is held by the same process; otherwise, false.
     */
    private heldBySameProcess;
    /**
     * Determines if the lease is held by the same machine identity. This comparison is based on the user and machine only.
     * The process identifier is not considered in this comparison.
     *
     * @param lease - The lease to be checked for ownership.
     * @returns true if the lease is held by the same user and machine; otherwise, false.
     */
    private heldBySameMachineIdentity;
}
