limitdb v3.0.0
limitdb is a database for limits on top of leveldb.
Currently limitdb uses the Token Bucket Algorithm.
Installation
npm i limitdbConfigure
Create an instance of Limitdb as follows:
const Limitdb = require('limitdb');
const limitdb = new Limitdb({
path: '/tmp/limitdb',
types: {
ip: {
size: 10,
per_second: 5
}
}
});Options available:
path(string): a path for the leveldb database.inMemory(boolean): set this to true to run the entire database in memory.types(object): setup your bucket types.
The type defines the characteristics of a the bucket:
sizeis the maximun content of the bucket. This is the maximun burst you allow.per_intervalis the amount of tokens that the bucket receive on every interval.intervaldefines the inverval in milliseconds.
You can also define your rates using per_second, per_minute, per_hour, per_day. So per_second: 1 is equivalent to per_interval: 1, interval: 1000.
If you omit size, limitdb assumes that size is the value of per_interval. So size: 10, per_second: 10 is the same than per_second: 10.
If you don't specify a filling rate with per_interval or any other per_x, the bucket is fixed and you have to manually reset it using PUT.
You can also define overrides inside your type definitions as follows:
const Limitdb = require('limitdb');
const limitdb = new Limitdb({
path: '/tmp/limitdb',
types: {
ip: {
size: 10,
per_second: 5,
overrides: {
'127.0.0.1': {
size: 100,
per_second: 50
}
}
}
}
});In this case the specific bucket for 127.0.0.1 of type ip will have a greater limit.
It is also possible to define overrides by regex:
overrides: {
'local-ips': {
match: /192\.168\./
size: 100,
per_second: 50
}
}and also it is possible to configure expiration of overrides:
overrides: {
'54.32.12.31': {
size: 100,
per_second: 50,
until: new Date(2016, 4, 1)
}
}TAKE
limitdb.take({ type: 'ip', key: '54.21.23.12' }, (err, result) => {
console.dir(result);
});limitdb.take takes as argument an object with:
type: the bucket type.key: the identifier of the bucket.count: the amount of tokens you need. This is optional and the default is 1.
The result object has:
conformant(boolean): true if the requested amount is conformant to the limit.remaining(int): the amount of remaining tokens in the bucket.reset(int / unix timestamp): unix timestamp of the date when the bucket will be full again.limit(int): the size of the bucket.
PUT
You can manually reset a fill a bucket using PUT:
limitdb.put({ type: 'ip', key: '54.21.23.12' }, err => {});limitdb.put takes as argument an object with:
type: the bucket type.key: the identifier of the bucket.count: the amount of tokens you want to put in the bucket. This is optional and the default is the size of the bucket.
STATUS
limitdb.status({ type: 'ip', prefix: '54' }, (err, result) => {
console.dir(result.items);
});limitdb.status takes as argument an object with
type: the bucket type.prefix: a prefix of buckets to search.
The result object has:
items: an array of buckets with:key: the key of the bucket.size: the size of the bucket.reset: the reset time.
Author
License
This project is licensed under the MIT license. See the LICENSE file for more info.
6 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
8 years ago
8 years ago
8 years ago
8 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago