limitdb is a database for limits on top of leveldb.
Currently limitdb uses the Token Bucket Algorithm.
Installation
npm i limitdb
Configure
Create an instance of Limitdb as follows:
const Limitdb = ;const 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:
size
is the maximun content of the bucket. This is the maximun burst you allow.per_interval
is the amount of tokens that the bucket receive on every interval.interval
defines 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 = ;const 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;
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;
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
limitdbstatus type: 'ip' prefix: '54' { consoledirresultitems;};
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.