![Coverage Status](https://coveralls.io/repos/animir/node-rate-limiter-flexible/badge.svg?branch=master)
node-rate-limiter-flexible
Flexible rate limiter with Redis as broker allows to control requests rate in cluster or distributed environment.
Backed on native Promises. It uses fixed window to limit requests.
Installation
npm i rate-limiter-flexible
Usage
Redis client must be created with offline queue switched off
const redis = require('redis');
const { RateLimiter } = require('rate-limiter-flexible');
const redisClient = redis.createClient({ enable_offline_queue: false });
redisClient.on('error', (err) => {
});
const opts = {
points: 5,
duration: 5,
};
const rateLimiter = new RateLimiter(redisClient, opts);
rateLimiter.consume(remoteAddress)
.then(() => {
rateLimiter.penalty(remoteAddress, 3);
rateLimiter.reward(remoteAddress, 2);
})
.catch((rejRes) => {
if (rejRes instanceof Error) {
} else {
const secs = Math.round(rejRes.msBeforeNext / 1000) || 1;
res.set('Retry-After', String(secs));
res.status(429).send('Too Many Requests');
}
});
API
RateLimiterRes object
Both Promise resolve and reject returns object of RateLimiterRes
class if there is no any error.
Object attributes:
RateLimiterRes = {
msBeforeNext: 250,
points: 0
}
rateLimiter.consume(key, points = 1)
Returns Promise, which:
- resolved when point(s) is consumed, so action can be done
- rejected when some Redis error happened, where reject reason
rejRes
is Error object - rejected when there is no points to be consumed, where reject reason
rejRes
is RateLimiterRes
object
Arguments:
key
is usually IP address or some unique client idpoints
number of points consumed. default: 1
rateLimiter.penalty(key, points = 1)
Fine key
by points
number of points.
Doesn't return anything
rateLimiter.reward(key, points = 1)
Reward key
by points
number of points.
Doesn't return anything