$ npm i superlimiter -S
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);
-
client
The redis client -
options
The options for limiter -
options.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 ignored -
options.hash
The function to get the hash key, default is_.identity
, if return''
, the limit will be ignore -
options.prefix
The prefix for the cache key -
options.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,
});
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-';
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-');
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);
...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);
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);
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);