const { message } = require("noblox.js"); if (!global.rateLimitList) { global.rateLimitList = {}; } const middleware = (req, res, next) => { // X requests per Y seconds per IP address const maxRequests = Number(process.env.RATE_LIMIT_MAX) || 30; const timeWindow = Number(process.env.RATE_LIMIT_TIME) || 60; var requestIp = req.ip; if (process.env.TRUST_PROXY && (req.ip == `::ffff:${process.env.PROXY_IP}` || req.ip == process.env.PROXY_IP)) { requestIp = req.headers["x-forwarded-for"]; } if (!global.rateLimitList[requestIp]) { global.rateLimitList[requestIp] = { requests: 0, lastRequest: Date.now() }; } console.log(`Rate limit for ${requestIp}: ${global.rateLimitList[requestIp].requests}/${maxRequests} requests in the last ${timeWindow} seconds`); if (global.rateLimitList[requestIp].lastRequest + timeWindow * 1000 < Date.now()) { global.rateLimitList[requestIp] = { requests: 0, lastRequest: Date.now() }; } else { if (global.rateLimitList[requestIp].requests >= maxRequests) { return res.status(429).json({ completed: false, success: false, error: "Rate limit exceeded", message: "You have been rate limited. Please try again later.", expires: global.rateLimitList[requestIp].lastRequest + timeWindow * 1000 }); } } global.rateLimitList[requestIp].requests++; next(); } const getRateLimit = () => { return global.global.rateLimitList; } module.exports = { middleware, getRateLimit }