superlimiter v1.0.1
superlimiter
Installation
$ npm i superlimiter -SExample
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
clientThe redis clientoptionsThe options for limiteroptions.ttlThe ttl for frequency limit, default is60options.maxThe max count for frequency limit, default is10options.expiredThe expired for frequency limit, it should beHH:mm. If it's set, the ttl will be ignoredoptions.hashThe function to get the hash key, default is_.identity, if return'', the limit will be ignoreoptions.prefixThe prefix for the cache keyoptions.errThe 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.
...argsThe 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
...argsThe 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
typeThe middleware's type, it can bekoaorexpress, 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
withTTLGet 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);