NextJS: Rate limiter

route.ts

const rateLimitMap = new Map();

export default function rateLimitMiddleware(handler) {
  return (req, res) => {
    const ip = req.headers["x-forwarded-for"] || req.connection.remoteAddress;
    const limit = 5; // Limiting requests to 5 per minute per IP
    const windowMs = 60 * 1000; // 1 minute

    if (!rateLimitMap.has(ip)) {
      rateLimitMap.set(ip, {
        count: 0,
        lastReset: Date.now(),
      });
    }

    const ipData = rateLimitMap.get(ip);

    if (Date.now() - ipData.lastReset > windowMs) {
      ipData.count = 0;
      ipData.lastReset = Date.now();
    }

    if (ipData.count >= limit) {
      return res.status(429).send("Too Many Requests");
    }

    ipData.count += 1;

    return handler(req, res);
  };
}

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *