31 lines
932 B
JavaScript
31 lines
932 B
JavaScript
import { getRateLimiter } from '../services/mongodb.js';
|
|
|
|
// Rate Limiter Middleware
|
|
export async function rateLimitMiddleware(req, res, next) {
|
|
const rateLimiter = getRateLimiter();
|
|
|
|
if (!rateLimiter) {
|
|
// Si no hay rate limiter configurado, continuar sin límite
|
|
return next();
|
|
}
|
|
|
|
try {
|
|
// Usar IP como clave para el rate limiting
|
|
const key = req.ip || req.socket.remoteAddress || 'unknown';
|
|
await rateLimiter.consume(key);
|
|
next();
|
|
} catch (rejRes) {
|
|
// Se excedió el límite de peticiones
|
|
const retryAfter = Math.round(rejRes.msBeforeNext / 1000) || 60;
|
|
res.set('Retry-After', String(retryAfter));
|
|
res.set('X-RateLimit-Limit', '100');
|
|
res.set('X-RateLimit-Remaining', '0');
|
|
res.status(429).json({
|
|
error: 'Too Many Requests',
|
|
message: `Has excedido el límite de peticiones. Intenta de nuevo en ${retryAfter} segundos.`,
|
|
retryAfter
|
|
});
|
|
}
|
|
}
|
|
|