diff --git a/lib/db.js b/lib/db.js index ba3f4a8..b3d5af1 100644 --- a/lib/db.js +++ b/lib/db.js @@ -269,7 +269,7 @@ class LimitDBRedis extends EventEmitter { count, Math.ceil(bucketKeyConfig.ttl || this.globalTTL), bucketKeyConfig.drip_interval || 0, - bucketKeyConfig.fixed_window ? bucketKeyConfig.interval : 0, + bucketKeyConfig.fixed_window || params.fixed_window ? bucketKeyConfig.interval : 0, (err, results) => { if (err) { return callback(err); diff --git a/test/db.tests.js b/test/db.tests.js index 4364762..2c0e926 100644 --- a/test/db.tests.js +++ b/test/db.tests.js @@ -43,6 +43,10 @@ const buckets = { per_second: 1000, fixed_window: true }, + '124.124.124.124': { + per_second: 1000, + fixed_window: false + } } }, user: { @@ -799,37 +803,71 @@ module.exports.tests = (clientCreator) => { }); }); - it('should work for fixed_window', (done) => { - const now = Date.now(); - const interval = 1000; - db.take({ type: 'ip', key: '123.123.123.123', count: 1000 }, (err, response) => { - if (err) return done(err); - assert.ok(response.conformant); - assert.equal(response.remaining, 0); - assert.closeTo(response.reset, (now + interval) / 1000, 1); - assert.equal(response.limit, 1000); + describe('fixed window', () => { + it('should work when setting fixed_window in the bucket config', (done) => { + const now = Date.now(); + const interval = 1000; + db.take({ type: 'ip', key: '123.123.123.123', count: 1000 }, (err, response) => { + if (err) return done(err); + assert.ok(response.conformant); + assert.equal(response.remaining, 0); + assert.closeTo(response.reset, (now + interval) / 1000, 1); + assert.equal(response.limit, 1000); - setTimeout(() => { - db.take({ type: 'ip', key: '123.123.123.123', count: 1 }, (err, response) => { - assert.notOk(response.conformant); - assert.equal(response.remaining, 0); - assert.closeTo(response.reset, (now + interval) / 1000, 1); - assert.equal(response.limit, 1000); - - setTimeout(() => { - db.take({ type: 'ip', key: '123.123.123.123', count: 1 }, (err, response) => { - assert.ok(response.conformant); - assert.equal(response.remaining, 999); - assert.closeTo(response.reset, (Date.now() + interval) / 1000, 1); - assert.equal(response.limit, 1000); - done(); - }); - }, interval); - }); - }, interval / 2); + setTimeout(() => { + db.take({ type: 'ip', key: '123.123.123.123', count: 1 }, (err, response) => { + assert.notOk(response.conformant); + assert.equal(response.remaining, 0); + assert.closeTo(response.reset, (now + interval) / 1000, 1); + assert.equal(response.limit, 1000); + + setTimeout(() => { + db.take({ type: 'ip', key: '123.123.123.123', count: 1 }, (err, response) => { + assert.ok(response.conformant); + assert.equal(response.remaining, 999); + assert.closeTo(response.reset, (Date.now() + interval) / 1000, 1); + assert.equal(response.limit, 1000); + done(); + }); + }, interval); + }); + }, interval / 2); + }); + }); + + it('should work when passing fixed_window by parameter', (done) => { + const now = Date.now(); + const interval = 1000; + db.take({ type: 'ip', key: '124.124.124.124', count: 1000, fixed_window: true }, (err, response) => { + if (err) return done(err); + assert.ok(response.conformant); + assert.equal(response.remaining, 0); + assert.closeTo(response.reset, (now + interval) / 1000, 1); + assert.equal(response.limit, 1000); + + setTimeout(() => { + db.take({ type: 'ip', key: '124.124.124.124', count: 1, fixed_window: true }, (err, response) => { + assert.notOk(response.conformant); + assert.equal(response.remaining, 0); + assert.closeTo(response.reset, (now + interval) / 1000, 1); + assert.equal(response.limit, 1000); + + setTimeout(() => { + db.take({ type: 'ip', key: '124.124.124.124', count: 1, fixed_window: true }, (err, response) => { + assert.ok(response.conformant); + assert.equal(response.remaining, 999); + assert.closeTo(response.reset, (Date.now() + interval) / 1000, 1); + assert.equal(response.limit, 1000); + done(); + }); + }, interval); + }); + }, interval / 2); + }); }); }); + describe('elevated limits specific tests', () => { const takeElevatedPromise = (params) => new Promise((resolve, reject) => { db.takeElevated(params, (err, response) => {