Spaces:
Sleeping
Sleeping
| /** | |
| * Simple in-memory rate limiter middleware. | |
| * Tracks request counts per IP within a sliding window. | |
| */ | |
| const requestCounts = new Map(); | |
| function rateLimiter(req, res, next) { | |
| const ip = req.ip || req.connection.remoteAddress || 'unknown'; | |
| const now = Date.now(); | |
| const windowMs = 60000; // 1 minute window | |
| const maxRequests = 100; | |
| if (!requestCounts.has(ip)) { | |
| requestCounts.set(ip, { count: 1, windowStart: now }); | |
| return next(); | |
| } | |
| const record = requestCounts.get(ip); | |
| if (now - record.windowStart > windowMs) { | |
| // Reset window | |
| record.count = 1; | |
| record.windowStart = now; | |
| return next(); | |
| } | |
| record.count++; | |
| if (record.count > maxRequests) { | |
| return res.status(429).json({ | |
| error: 'Too many requests', | |
| retryAfter: Math.ceil((record.windowStart + windowMs - now) / 1000) | |
| }); | |
| } | |
| next(); | |
| } | |
| module.exports = { rateLimiter }; | |