/**
 * @module RateLimiter
 */
import { type BackoffPolicy } from "../../../../backoff-policies/contracts/_module.js";
import { type IReadableContext } from "../../../../execution-context/contracts/_module.js";
import { type IRateLimiterAdapter, type IRateLimiterAdapterState, type IRateLimiterPolicy, type IRateLimiterStorageAdapter } from "../../../../rate-limiter/contracts/_module.js";
/**
 * Configuration for `DatabaseRateLimiterAdapter`.
 * Wraps a {@link IRateLimiterStorageAdapter | `IRateLimiterStorageAdapter`} with rate-limiter logic.
 *
 * IMPORT_PATH: `"@daiso-tech/core/rate-limiter/database-rate-limiter-adapter"`
 * @group Adapters
 */
export type DatabaseRateLimiterAdapterSettings = {
    /**
     * The underlying storage adapter used to persist and retrieve rate-limiter state.
     */
    adapter: IRateLimiterStorageAdapter;
    /**
     * You can define your own {@link BackoffPolicy | `BackoffPolicy`}.
     * @default
     * ```ts
     * import { exponentialBackoff } from "@daiso-tech/core/backoff-policies";
     *
     * exponentialBackoff();
     * ```
     */
    backoffPolicy?: BackoffPolicy;
    /**
     * You can define your own {@link IRateLimiterPolicy | `IRateLimiterPolicy`}.
     * @default
     * ```ts
     * import { FixedWindowLimiter } from "@daiso-tech/core/rate-limiter/policies";
     *
     * new FixedWindowLimiter();
     * ```
     */
    rateLimiterPolicy?: IRateLimiterPolicy;
};
/**
 * IMPORT_PATH: `"@daiso-tech/core/rate-limiter/database-rate-limiter-adapter"`
 * @group Adapters
 */
export declare class DatabaseRateLimiterAdapter<TMetrics = unknown> implements IRateLimiterAdapter {
    private readonly rateLimiterStorage;
    private readonly rateLimiterStateManager;
    /**
     * @example
     * ```ts
     * import { DatabaseRateLimiterAdapter } from "@daiso-tech/core/rate-limiter/database-rate-limiter-adapter";
     * import { MemoryRateLimiterStorageAdapter } from "@daiso-tech/core/rate-limiter/memory-rate-limiter-storage-adapter";
     *
     * const rateLimiterStorageAdapter = new MemoryRateLimiterStorageAdapter();
     * const rateLimiterAdapter = new DatabaseRateLimiterAdapter({
     *   adapter: rateLimiterStorageAdapter
     * });
     * ```
     */
    constructor(settings: DatabaseRateLimiterAdapterSettings);
    getState(context: IReadableContext, key: string): Promise<IRateLimiterAdapterState | null>;
    updateState(context: IReadableContext, key: string, limit: number): Promise<IRateLimiterAdapterState>;
    reset(context: IReadableContext, key: string): Promise<void>;
}
