UBS/rateLimit.js

40 lines
1.3 KiB
JavaScript

const { message } = require("noblox.js");
if (!global.rateLimitList) {
global.rateLimitList = {};
}
const middleware = (req, res, next) => {
console.log(global.rateLimitList)
// X requests per Y seconds per IP address
const maxRequests = process.env.RATE_LIMIT_MAX || 30;
const timeWindow = 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() };
}
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 });
} else {
global.rateLimitList[requestIp].lastRequest = Date.now();
}
}
global.rateLimitList[requestIp].requests++;
next();
}
const getRateLimit = () => {
return global.global.rateLimitList;
}
module.exports = {
middleware,
getRateLimit
}