superlimiter v1.0.1
superlimiter
Installation
$ npm i superlimiter -S
Example
Use for koa frequency limit
const Koa = require('koa');
const Limiter = require('superlimiter');
const limiter = new Limiter(redis, {
ttl: 60,
max: 10,
hash: (ctx) => {
if (!ctx.session || !ctx.session.user) {
return '';
}
return ctx.session.user.account;
},
});
const app = new Koa();
// user session
app.use(session());
app.use(limiter.middleware());
// other middlewares
...
app.listen(8080);
API
constructor
client
The redis clientoptions
The options for limiteroptions.ttl
The ttl for frequency limit, default is60
options.max
The max count for frequency limit, default is10
options.expired
The expired for frequency limit, it should beHH:mm
. If it's set, the ttl will be ignoredoptions.hash
The function to get the hash key, default is_.identity
, if return''
, the limit will be ignoreoptions.prefix
The prefix for the cache keyoptions.err
The error will be throw when count max thanoptions.max
, default isnew Error('Exceeded the limit frequency')
const Redis = require('ioredis');
const Limiter = require('superlimiter');
const redis = new Redis('redis://127.0.0.1:6379');
const limiter = new Limiter(redis, {
ttl: 10,
});
seter
ttl
expired
prefix
can be reset
const Redis = require('ioredis');
const Limiter = require('superlimiter');
const redis = new Redis('redis://127.0.0.1:6379');
const limiter = new Limiter(redis, {
ttl: 10,
});
limiter.ttl = 60;
limiter.expired = '23:30';
limiter.prefix = 'my-test-';
getter
client
options
ttl
expired
prefix
const Redis = require('ioredis');
const assert = require('assert');
const Limiter = require('superlimiter');
const redis = new Redis('redis://127.0.0.1:6379');
const limiter = new Limiter(redis, {
ttl: 10,
});
assert.equal(limiter.client, redis);
// {ttl : 10, .. ..}
console.info(limiter.options);
assert.equal(limiter.ttl, 10);
assert.equal(limiter.expired, '');
assert.equal(limiter.prefix, 'super-limiter-');
exec
Inc the count of the key, if the count bigger than max, it will be throw an error, otherwise it will be resolve. If the hash function return ''
, it will be resolve without any change of count.
...args
The arguments for the hash function
const Redis = require('ioredis');
const Limiter = require('superlimiter');
const redis = new Redis('redis://127.0.0.1:6379');
const limiter = new Limiter(redis, {
ttl: 10,
});
limiter.exec('mykey').then(() => {
console.info('pass');
}).catch(console.error);
getCount
...args
The arguments for the hash function
const Redis = require('ioredis');
const Limiter = require('superlimiter');
const redis = new Redis('redis://127.0.0.1:6379');
const limiter = new Limiter(redis, {
ttl: 10,
});
limiter.getCount('mykey').then((count) => {
console.info(count);
}).catch(console.error);
middleware
type
The middleware's type, it can bekoa
orexpress
, default iskoa
.
The middleware for koa and express. For koa, it will use ctx
for the hash argument. For express, it will use req
, res
for the hash argument.
const Koa = require('koa');
const Limiter = require('superlimiter');
const limiter = new Limiter(redis, {
ttl: 60,
max: 10,
hash: (ctx) => {
if (!ctx.session || !ctx.session.user) {
return '';
}
return ctx.session.user.account;
},
});
const app = new Koa();
// user session
app.use(session());
app.use(limiter.middleware());
// other middlewares
...
app.listen(8080);
keys
Get the keys of this limiter
withTTL
Get the ttl of key if settrue
, default isfalse
const Redis = require('ioredis');
const Limiter = require('superlimiter');
const redis = new Redis('redis://127.0.0.1:6379');
const limiter = new Limiter(redis, {
ttl: 10,
});
// ["...", "..."]
limiter.keys().then(console.info).catch(console.error);
// [{"key": "...", "ttl": ..}, ...]
limiter.keys(true).then(console.info).catch(console.error);