import { Request, Response, NextFunction } from 'express';
import { RateLimiter, RateLimiterResponse } from '..';
export interface MiddlewareLimiter {
    /**
     * Rate limiter.
     */
    limiter: RateLimiter;
    /**
     * A unique Redis key for this limiter. Can be overridden.
     */
    key?: any;
    /**
     * Enable/disable key override. Default is false.
     */
    overrideKey?: boolean;
    /**
     * Compute Redis key from request object and limiter.
     * If keyOverride is enabled in the limiter, this will override any key defined for that limiter.
     * This takes priority over middleware option overrideKeyFn.
     * Must be defined if overrideKey is enabled and middleware option overrideKeyFn is undefined.
     */
    overrideKeyFn?: (req: Request, limiter: RateLimiter) => any;
    /**
     * Enable/disable limit override. Default is false.
     */
    overrideLimit?: boolean;
    /**
     * If enabled, this will override limiter limit value.
     * This takes priority over middleware option overrideLimitFn.
     * Must be defined if overrideLimit is enabled and middleware option overrideLimitFn is undefined.
     */
    overrideLimitFn?: (req: Request, limiter: RateLimiter) => number;
    /**
     * Custom error message for this limiter. Default is 'Too many requests'.
     */
    errorMessage?: string | object;
    /**
     * Optional function to skip request evaluation for the current limiter.
     * Should return true if evaluation must be skipped, false otherwise.
     */
    skipFn?: (req: Request, limiter: RateLimiter) => boolean;
}
interface ExpressMiddlewareOptions {
    /**
     * Limiters that will be evaluated from the middleware.
     */
    limiters: MiddlewareLimiter[];
    /**
     * Compute Redis key from request object and limiter.
     * If keyOverride is enabled in the limiter, this will override any key defined for that limiter.
     * Must be defined if there is a limiter with overrideKey enabled and overrideKeyFn undefined.
     */
    overrideKeyFn?: (req: Request, limiter: RateLimiter) => any;
    /**
     * If enabled, this will override limiter limit value.
     * Must be defined if there is a limiter with overrideLimit enabled and overrideLimitFn undefined.
     */
    overrideLimitFn?: (req: Request, limiter: RateLimiter) => number;
    /**
     * Status code to be returned if request is throttled (default is 429).
     */
    errorStatusCode?: number;
    /**
     * Enable/disable setting rate limit headers on response object. Default is true.
     */
    setHeaders?: boolean;
    /**
     * Optional function to set headers on response object. If not provided, default headers will be set on the response.
     * Called only if setHeaders is enabled.
     */
    setHeadersFn?: (req: Request, res: Response, limiter: RateLimiter, limiterResponse: RateLimiterResponse) => void;
    /**
     * Optional function for deciding to skip rate limiting for the request. Useful for white-listing requests.
     * Return true if the request should be skipped, false otherwise.
     */
    skipFn?: (req: Request) => boolean;
    /**
     * Optional function to be called when a request is throttled (not allowed).
     */
    onThrottleRequest?: (req: Request, res: Response, key: any) => void;
}
export declare const createExpressMiddleware: (options: ExpressMiddlewareOptions) => (req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
export {};
