Files
wallabicher/web/backend/middlewares/rateLimit.js

31 lines
930 B
JavaScript

import { getRateLimiter } from '../services/redis.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
});
}
}