40 lines
1.3 KiB
JavaScript
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
|
|
} |