var error = require("http-error"); /** * In memory rate limiter as connect middleware */ module.exports = ratelimit; function ratelimit(key, duration, max) { var limit = {}; return function(req, res, next) { var handle = req.params[key]; var lim = limit[handle] || (limit[handle] = []); var now = Date.now(); 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"); err.retryIn = duration - (Date.now() - lim[0]); next(err); return; } lim.push(Date.now()); return next(); }; }