redis-sliding-rate-limiter
Version:
Flexible and performant rate limiter based on sliding window algorithm with arbitrary precision
84 lines (83 loc) • 3.48 kB
TypeScript
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 {};