Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion apps/api/src/middleware/RateLimiter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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) => {
Expand Down
Loading