express-rate-limiter-ts
Version:
A powerful, flexible and modern rate limiter middleware for Express.js written in TypeScript.
73 lines (72 loc) • 2.02 kB
TypeScript
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>;
}