rate-limiter-custom
Version:
A fast, customizable, and efficient rate-limiting middleware for Express in TypeScript.
26 lines (25 loc) • 1.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.leakyBucketLimiter = leakyBucketLimiter;
const leakyBuckets = new Map();
function leakyBucketLimiter(options) {
return (req, res, next) => {
var _a, _b;
const ip = (_a = req.ip) !== null && _a !== void 0 ? _a : "unknown"; // Ensure IP is always a string
const currentTime = Date.now();
const leakRate = (_b = options.leakRate) !== null && _b !== void 0 ? _b : 1; // Requests processed per second
if (!leakyBuckets.has(ip)) {
leakyBuckets.set(ip, { queue: 0, lastProcessed: currentTime });
}
const bucket = leakyBuckets.get(ip);
const timeElapsed = (currentTime - bucket.lastProcessed) / 1000; // Convert ms to seconds
const leakedRequests = Math.floor(timeElapsed * leakRate);
bucket.queue = Math.max(0, bucket.queue - leakedRequests);
bucket.lastProcessed = currentTime;
if (bucket.queue >= options.maxRequests) {
return res.status(429).json({ message: options.errorMessage || "Too many requests, please try again later." });
}
bucket.queue++;
next();
};
}