/**
 * @module RateLimiter
 */
import { type EventListener, type IEventBus, type Unsubscribe } from "../../../../event-bus/contracts/_module.js";
import { Namespace } from "../../../../namespace/_module.js";
import { type IRateLimiter, type IRateLimiterAdapter, type IRateLimiterProvider, type RateLimiterEventMap, type RateLimiterProviderCreateSettings } from "../../../../rate-limiter/contracts/_module.js";
import { type ITask } from "../../../../task/contracts/_module.js";
import { type ErrorPolicySettings } from "../../../../utilities/_module.js";
/**
 *
 * IMPORT_PATH: `"@daiso-tech/core/rate-limiter"`
 * @group Derivables
 */
export type RateLimiterProviderSettingsBase = ErrorPolicySettings & {
    /**
     * @default
     * ```ts
     * import { Namespace } from "@daiso-tech/core/namespace";
     *
     * new Namespace("@rate-limiter")
     * ```
     */
    namespace?: Namespace;
    /**
     * @default
     * ```ts
     * import { EventBus } from "@daiso-tech/core/event-bus";
     * import { NoOpEventBusAdapter } from "@daiso-tech/core/event-bus/no-op-event-bus-adapter";
     *
     * new EventBus({
     *   adapter: new NoOpEventBusAdapter()
     * })
     * ```
     */
    eventBus?: IEventBus;
    /**
     * If true will only apply rate limiting when function errors and not when function is called.
     * @default false
     */
    onlyError?: boolean;
    /**
     * If true, metric tracking will run asynchronously in the background and won't block the function utilizing the circuit breaker logic.
     * This will only have effect if `onlyError` settings is true.
     * @default true
     */
    enableAsyncTracking?: boolean;
};
/**
 *
 * IMPORT_PATH: `"@daiso-tech/core/rate-limiter"`
 * @group Derivables
 */
export type RateLimiterProviderSettings = RateLimiterProviderSettingsBase & {
    adapter: IRateLimiterAdapter;
};
/**
 *
 * IMPORT_PATH: `"@daiso-tech/core/rate-limiter"`
 * @group Derivables
 */
export declare const DEFAULT_CIRCUIT_BREAKER_PROVIDER_NAMESPACE: Namespace;
/**
 * The `RateLimiterProvider` class can be derived from any {@link IRateLimiterAdapter | `IRateLimiterAdapter`}.
 *
 * IMPORT_PATH: `"@daiso-tech/core/rate-limiter"`
 * @group Derivables
 */
export declare class RateLimiterProvider implements IRateLimiterProvider {
    private readonly namespace;
    private readonly eventBus;
    private readonly adapter;
    private readonly onlyError;
    private readonly errorPolicy;
    private readonly enableAsyncTracking;
    /**
     * @example
     * ```ts
     * import { KyselyRateLimiterStorageAdapter } from "@daiso-tech/core/rate-limiter/kysely-rate-limiter-storage-adapter";
     * import { DatabaseRateLimiterAdapter } from "@daiso-tech/core/rate-limiter/database-rate-limiter-adapter";
     * import { Serde } from "@daiso-tech/core/serde";
     * import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/super-json-serde-adapter"
     * import Sqlite from "better-sqlite3";
     * import { Kysely, SqliteDialect } from "kysely";
     *
     * const serde = new Serde(new SuperJsonSerdeAdapter());
     * const rateLimiterStorageAdapter = new KyselyRateLimiterStorageAdapter({
     *   kysely: new Kysely({
     *     dialect: new SqliteDialect({
     *       database: new Sqlite("local.db"),
     *     }),
     *   }),
     *   serde
     * });
     * // You need initialize the adapter once before using it.
     * await rateLimiterStorageAdapter.init();
     *
     * const rateLimiterAdapter = new DatabaseRateLimiterAdapter({
     *   adapter: rateLimiterStorageAdapter
     * });
     *
     * const rateLimiterProvider = new RateLimiterProvider({
     *   adapter: rateLimiterAdapter
     * })
     * ```
     */
    constructor(settings: RateLimiterProviderSettings);
    addListener<TEventName extends keyof RateLimiterEventMap>(eventName: TEventName, listener: EventListener<RateLimiterEventMap[TEventName]>): ITask<void>;
    removeListener<TEventName extends keyof RateLimiterEventMap>(eventName: TEventName, listener: EventListener<RateLimiterEventMap[TEventName]>): ITask<void>;
    listenOnce<TEventName extends keyof RateLimiterEventMap>(eventName: TEventName, listener: EventListener<RateLimiterEventMap[TEventName]>): ITask<void>;
    asTask<TEventName extends keyof RateLimiterEventMap>(eventName: TEventName): ITask<RateLimiterEventMap[TEventName]>;
    subscribeOnce<TEventName extends keyof RateLimiterEventMap>(eventName: TEventName, listener: EventListener<RateLimiterEventMap[TEventName]>): ITask<Unsubscribe>;
    subscribe<TEventName extends keyof RateLimiterEventMap>(eventName: TEventName, listener: EventListener<RateLimiterEventMap[TEventName]>): ITask<Unsubscribe>;
    create(key: string, settings: RateLimiterProviderCreateSettings): IRateLimiter;
}
