export type StorageType = 'memory';
export interface RateLimiterOptions {
    windowMs: number;
    max: number;
    message?: string | object;
    statusCode?: number;
    keyGenerator?: (req: any) => string;
    skip?: (req: any) => boolean;
    storageType?: StorageType;
    logger?: {
        log: (msg: string, meta?: any) => void;
        warn?: (msg: string, meta?: any) => void;
        error?: (msg: string, meta?: any) => void;
    };
    routes?: {
        [route: string]: Partial<Omit<RateLimiterOptions, 'routes'>>;
    };
    identifierType?: 'ip' | 'header' | 'jwt';
    identifierHeader?: string;
    stats?: boolean;
    whitelist?: string[] | ((req: any) => boolean);
    blacklist?: string[] | ((req: any) => boolean);
    customResponse?: (req: any, res: any, info: RateLimitInfo) => any;
    banSeconds?: number;
    dynamicMax?: (req: any) => number;
}
export interface RateLimitInfo {
    current: number;
    remaining: number;
    resetTime: Date;
    exceeded: boolean;
    banned?: boolean;
    banExpiresAt?: Date;
}
export interface RateLimitStats {
    [route: string]: {
        count: number;
        lastTriggered: Date;
    };
}
export interface AdminPanelStats {
    stats: RateLimitStats;
    banned: {
        [key: string]: {
            banExpiresAt: Date;
            reason: string;
        };
    };
}
export interface IRateLimitStore {
    incr(key: string): Promise<RateLimitInfo>;
    get(key: string): Promise<{
        count: number;
        resetTime: number;
    } | undefined>;
    reset(key: string): Promise<void>;
    recordStat(route: string): Promise<void>;
    getStats(): Promise<RateLimitStats>;
    ban(key: string, seconds: number, reason: string): Promise<void>;
    isBanned(key: string): Promise<{
        banned: boolean;
        banExpiresAt?: Date;
        reason?: string;
    }>;
    getBanned(): Promise<{
        [key: string]: {
            banExpiresAt: Date;
            reason: string;
        };
    }>;
    unban(key: string): Promise<void>;
}
