Package Exports
- koa-ratelimit-lru
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (koa-ratelimit-lru) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
koa-ratelimit-lru
Rate limiter middleware backed by lru-cache for koa@2
Koa2
Middleware using async/await , so you have to run in Node.js >= 7.0.0 with --harmony_async_await or using babel
Installation
$ npm install koa-ratelimit-lruExample
const ratelimit = require('koa-ratelimit-lru')
const Koa = require('koa')
const app = new Koa()
// apply rate limit
app.use(ratelimit({
duration: 60000,
rate: 100,
id (ctx) {
return ctx.ip
},
headers: {
remaining: 'Rate-Limit-Remaining',
reset: 'Rate-Limit-Reset',
total: 'Rate-Limit-Total'
},
errorMessage: 'Sometimes You Just Have to Slow Down.'
}))
// response middleware
app.use(ctx => {
ctx.body = 'Hello World'
})
app.listen(3000, _ => console.log('listening on port 3000'))Using one lru-cache to store keys
const ratelimit = require('koa-ratelimit-lru')
const Koa = require('koa')
const router = require('koa-router')()
const app = new Koa()
const store = require('lru-cache')()
// Note: When you using custom store, duration and max would lose efficacy
router.get(
'/foo',
ratelimit({
store,
rate: 5,
prefix: 'foo:'
}),
ctx => ctx.body = 'foo'
)
router.get(
'/bar',
ratelimit({
store,
rate: 10,
prefix: 'bar:'
}),
ctx => ctx.body = 'bar'
)
// response middleware
app.use(router.routes())
app.listen(3000, _ => console.log('listening on port 3000'))Options
durationlimit duration in milliseconds [1 minute]maxmax length of cache [Infinity]storecustom lru-cache [new cache]prefixcustom prefix in lru-cache [ratelimit:]ratemax requests perid[1000]idid to compare requests [ip]bodycustom throw body [json]headerscustom header namesremainingremaining number of requests ['X-RateLimit-Remaining']resetreset timestamp ['X-RateLimit-Reset']totaltotal number of requests ['X-RateLimit-Limit']
Responses
Example 200 with header fields:
HTTP/1.1 200 OK
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 99
X-RateLimit-Reset: 1477978284
Content-Type: text/plain; charset=utf-8
Content-Length: 12
Date: Tue, 01 Nov 2016 05:13:11 GMT
Connection: keep-alive
Stuff!Example 429 response:
HTTP/1.1 429 Too Many Requests
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1477978284
X-RateLimit-Limit: 100
Retry-After: 2
Content-Type: application/json; charset=utf-8
Content-Length: 50
Date: Tue, 01 Nov 2016 05:31:21 GMT
Connection: keep-alive
{"msg":"Rate limit exceeded, retry in 3 seconds."}License
MIT