/**
 * @module RateLimiter
 */
import { type IRateLimiterPolicy } from "../../../../rate-limiter/contracts/_module.js";
import { type ITimeSpan } from "../../../../time-span/contracts/_module.js";
/**
 * IMPORT_PATH: `"@daiso-tech/core/rate-limiter/policies"`
 * @group Policies
 */
export type FixedWindowLimiterSettings = {
    /**
     * The time span in which attempts are active before reseting.
     *
     * @default
     * ```ts
     * import { TimeSpan } from "@daiso-tech/core/time-span";
     *
     * TimeSpan.fromSeconds(1)
     * ```
     */
    window?: ITimeSpan;
};
/**
 * @internal
 */
export declare function resolveFixedWindowLimiterSettings(settings: FixedWindowLimiterSettings): Required<FixedWindowLimiterSettings>;
/**
 * @internal
 */
export type SerializedFixedWindowLimiterSettings = {
    window?: number;
};
/**
 * @internal
 */
export declare function serializeFixedWindowLimiterSettings(settings: FixedWindowLimiterSettings): Required<SerializedFixedWindowLimiterSettings>;
/**
 * IMPORT_PATH: `"@daiso-tech/core/rate-limiter/policies"`
 * @group Policies
 */
export type FixedWindowLimiterState = {
    attempt: number;
    /**
     * Unix timestamp in ms
     */
    lastAttemptAt: number;
};
/**
 * Each request inside a fixed time increases a counter.
 * Once the counter reaches the maximum allowed number, all further attempts are
 * rejected.
 *
 * **Pro:**
 *
 * - Newer attempts are not starved by old ones.
 * - Low storage cost.
 *
 * **Con:**
 *
 * A burst of attempts near the boundary of a window can result in a very
 * high request rate because two windows will be filled with attempts quickly.
 *
 * IMPORT_PATH: `"@daiso-tech/core/rate-limiter/policies"`
 * @group Policies
 */
export declare class FixedWindowLimiter implements IRateLimiterPolicy<FixedWindowLimiterState> {
    private readonly window;
    constructor(settings?: FixedWindowLimiterSettings);
    initialMetrics(currentDate: Date): FixedWindowLimiterState;
    shouldBlock(currentMetrics: FixedWindowLimiterState, limit: number, currentDate: Date): boolean;
    getExpiration(currentMetrics: FixedWindowLimiterState, _currentDate: Date): Date;
    getAttempts(currentMetrics: FixedWindowLimiterState, _currentDate: Date): number;
    updateMetrics(currentMetrics: FixedWindowLimiterState, currentDate: Date): FixedWindowLimiterState;
}
