Skip to content

Commit

Permalink
activate fixed_window through param so we can control the rollout usi…
Browse files Browse the repository at this point in the history
…ng feature flags
  • Loading branch information
pubalokta committed Sep 17, 2024
1 parent 8143819 commit bec063b
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 28 deletions.
2 changes: 1 addition & 1 deletion lib/db.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
92 changes: 65 additions & 27 deletions test/db.tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ const buckets = {
per_second: 1000,
fixed_window: true
},
'124.124.124.124': {
per_second: 1000,
fixed_window: false
}
}
},
user: {
Expand Down Expand Up @@ -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) => {
Expand Down

0 comments on commit bec063b

Please sign in to comment.