diff --git a/apps/api/src/middleware/RateLimiter.ts b/apps/api/src/middleware/RateLimiter.ts index 6f5f10b..083d2fe 100644 --- a/apps/api/src/middleware/RateLimiter.ts +++ b/apps/api/src/middleware/RateLimiter.ts @@ -14,6 +14,7 @@ interface RateLimitStore { } interface RateLimitOptions { + name: string; windowMs: number; // Time window in milliseconds maxRequests: number; // Max requests per window keyGenerator?: (req: Request) => string; // Custom key generator @@ -38,13 +39,14 @@ setInterval(() => { */ export function RateLimiter(options: RateLimitOptions) { const { + name, windowMs, maxRequests, keyGenerator = (req: Request) => req.ip || 'unknown', } = options; return (req: Request, res: Response, next: NextFunction) => { - const key = keyGenerator(req); + const key = `${name}:${keyGenerator(req)}`; const now = Date.now(); // Initialize or reset if window expired @@ -88,24 +90,28 @@ export function RateLimiter(options: RateLimitOptions) { export const RateLimiters = { // Standard API rate limit: 5000 requests per 15 minutes standard: RateLimiter({ + name: 'standard', windowMs: 15 * 60 * 1000, maxRequests: 5000, }), // Strict rate limit for sensitive operations: 100 requests per minute strict: RateLimiter({ + name: 'strict', windowMs: 60 * 1000, maxRequests: 100, }), // Auth rate limit: 100 attempts per 15 minutes auth: RateLimiter({ + name: 'auth', windowMs: 15 * 60 * 1000, maxRequests: 100, }), // Rate limit by API key instead of IP byApiKey: RateLimiter({ + name: 'byApiKey', windowMs: 15 * 60 * 1000, maxRequests: 10000, keyGenerator: (req: Request) => {