leakybucket-rate-limiter
Version:
Rate Limiter middleware which uses Leaky Bucket Algorithm
41 lines (35 loc) • 929 B
JavaScript
const async = require('async');
let queueSize = 0;
let q_maxQueueSize = 2;
let q_concurrentRequests = 1;
const requestsQueue = async.queue((task, callback) => {
dummyFunction(task, callback);
}, q_concurrentRequests);
const addToRequestsQueue = (req, res, next) => {
if (queueSize > q_maxQueueSize) {
res.status(400).json({ err: 'Request Queue Limit Reached.' });
}
queueSize++;
const task = {
req,
res,
next,
};
requestsQueue.push(task, (err) => {
if (err) {
return console.log('Error in adding task to queue');
}
});
};
const dummyFunction = async (task, callback) => {
const { next } = task;
next();
queueSize--;
callback();
};
const rateLimiter = (concurrentRequests, maxQueueSize) => async (req, res, next) => {
q_concurrentRequests = concurrentRequests;
q_maxQueueSize = maxQueueSize;
addToRequestsQueue(req, res, next);
};
module.exports = { rateLimiter };