UNPKG

rate-limiter-custom

Version:

A fast, customizable, and efficient rate-limiting middleware for Express in TypeScript.

26 lines (25 loc) 1.2 kB
"use strict"; 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(); }; }