diff --git a/index.js b/index.js index 16df973..687c467 100644 --- a/index.js +++ b/index.js @@ -91,6 +91,7 @@ Limiter.prototype.get = function (fn) { var n = ~~res[0]; var max = ~~res[1]; var ex = ~~res[2]; + var dateNow = Date.now(); if (n <= 0) return done(); @@ -103,7 +104,9 @@ Limiter.prototype.get = function (fn) { } db.multi() - .set([count, n - 1, 'PX', ex * 1000 - Date.now(), 'XX']) + .set([count, n - 1, 'PX', ex * 1000 - dateNow, 'XX']) + .pexpire([limit, ex * 1000 - dateNow]) + .pexpire([reset, ex * 1000 - dateNow]) .exec(function (err, res) { if (err) return fn(err); if (isFirstReplyNull(res)) return mget(); diff --git a/test/index.js b/test/index.js index acd5b46..5419f81 100644 --- a/test/index.js +++ b/test/index.js @@ -133,6 +133,30 @@ var Limiter = require('..'); done(); }); }); + it('updating the count should keep all TTLs in sync', function(done) { + var limit = new Limiter({ + duration: 10000, + max: 2, + id: 'something', + db: db + }); + limit.get(function(err, res) {}); // All good here. + limit.get(function(err, res) { + db.multi() + .pttl(['limit:something:count']) + .pttl(['limit:something:limit']) + .pttl(['limit:something:reset']) + .exec(function (err, res) { + if (err) return done(err); + var ttlCount = (typeof res[0] === 'number') ? res[0] : res[0][1]; + var ttlLimit = (typeof res[1] === 'number') ? res[1] : res[1][1]; + var ttlReset = (typeof res[2] === 'number') ? res[2] : res[2][1]; + ttlLimit.should.equal(ttlCount); + ttlReset.should.equal(ttlCount); + done(); + }); + }); + }); }); describe('when trying to decrease before setting value', function() {