import type { Logger } from '@iota-big3/sdk-observability';
import type { NextFunction, Request, Response } from 'express';
import { Redis } from 'ioredis';
export interface RateLimitConfig {
    enabled?: boolean;
    windowMs?: number;
    maxRequests?: number;
    strategy?: 'sliding-window' | 'token-bucket' | 'fixed-window';
    keyGenerator?: (req: Request) => string;
    skipSuccessfulRequests?: boolean;
    skipFailedRequests?: boolean;
    store?: RateLimitStore;
    message?: string;
    headers?: boolean;
    draft_polli_ratelimit_headers?: boolean;
}
export interface RateLimitStore {
    incrementAsync(key: string): Promise<RateLimitInfo>;
    decrementAsync(key: string): Promise<void>;
    resetAsync(key: string): Promise<void>;
}
export interface RateLimitInfo {
    count: number;
    resetTime: Date;
    remaining: number;
}
export interface TokenBucketConfig {
    capacity: number;
    refillRate: number;
    refillAmount: number;
}
export declare class RedisRateLimitStore implements RateLimitStore {
    private redis;
    private windowMs;
    private maxRequests;
    private strategy;
    constructor(redis: Redis, windowMs: number, maxRequests: number, strategy: string);
    incrementAsync(key: string): Promise<RateLimitInfo>;
    private incrementSlidingWindowAsync;
    private incrementTokenBucketAsync;
    private incrementFixedWindowAsync;
    decrementAsync(key: string): Promise<void>;
    resetAsync(key: string): Promise<void>;
}
export declare class MemoryRateLimitStore implements RateLimitStore {
    private windowMs;
    private maxRequests;
    private requests;
    constructor(windowMs: number, maxRequests: number);
    incrementAsync(key: string): Promise<RateLimitInfo>;
    decrementAsync(key: string): Promise<void>;
    resetAsync(key: string): Promise<void>;
}
export declare class RateLimiter {
    private config;
    private logger?;
    constructor(config?: RateLimitConfig, logger?: Logger);
    expressMiddleware(): (req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
    private setHeaders;
    static forRoute(options: {
        path?: string | RegExp;
        method?: string | string[];
        maxRequests: number;
        windowMs: number;
    }): RateLimiter;
}
//# sourceMappingURL=rate-limiter.d.ts.map