var options = require('./options'); module.exports = function(opts) { opts = options.canonical(opts); return function(request, callback) { var key = opts.key(request); var tempKey = 'ratelimittemp:' + key; var realKey = 'ratelimit:' + key; opts.redis.multi() .setex(tempKey, opts.window, 0) .renamenx(tempKey, realKey) .incr(realKey) .exec(function(err, results) { if(err) { callback(err); } else { var current = results[2]; callback(null, { current: current, limit: opts.limit, window: opts.window, over: (current > opts.limit) }); } }); }; };