kopia lustrzana https://github.com/c9/core
Fix memory leaks in rate limiter
rodzic
2afa1ad468
commit
2a99b3449d
|
@ -6,26 +6,24 @@ var error = require("http-error");
|
||||||
module.exports = ratelimit;
|
module.exports = ratelimit;
|
||||||
|
|
||||||
function ratelimit(key, duration, max) {
|
function ratelimit(key, duration, max) {
|
||||||
var limit = {};
|
var counts = {};
|
||||||
return function(req, res, next) {
|
return function(req, res, next) {
|
||||||
var handle = req.params[key];
|
var handle = req.params[key];
|
||||||
|
|
||||||
var lim = limit[handle] || (limit[handle] = []);
|
counts[handle] = counts[handle] || 0;
|
||||||
var now = Date.now();
|
if (counts[handle] >= max) {
|
||||||
for (var i = 0; i < lim.length; i++) {
|
|
||||||
if (now - lim[i] > duration) {
|
|
||||||
lim.splice(i, 1);
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
else break;
|
|
||||||
}
|
|
||||||
if (lim.length > max) {
|
|
||||||
var err = new error.TooManyRequests("Rate limit exceeded");
|
var err = new error.TooManyRequests("Rate limit exceeded");
|
||||||
err.retryIn = duration - (Date.now() - lim[0]);
|
err.retryIn = Math.min(duration, 5000);
|
||||||
next(err);
|
return next(err);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
lim.push(Date.now());
|
|
||||||
|
counts[handle]++;
|
||||||
|
setTimeout(function () {
|
||||||
|
counts[handle]--;
|
||||||
|
if (counts[handle] == 0) {
|
||||||
|
delete counts[handle];
|
||||||
|
}
|
||||||
|
}, duration);
|
||||||
|
|
||||||
return next();
|
return next();
|
||||||
};
|
};
|
||||||
|
|
Ładowanie…
Reference in New Issue