Browse Source

eureka

develop
Dustin Diaz 10 years ago
parent
commit
f5e0de0960
  1. 1
      .gitignore
  2. 4
      Makefile
  3. 18
      README.md
  4. 39
      index.js
  5. 22
      package.json

1
.gitignore

@ -0,0 +1 @@
node_modules

4
Makefile

@ -0,0 +1,4 @@
.PHONY: test
test:
./node_modules/.bin/mocha tests

18
README.md

@ -1,4 +1,16 @@
rate-limitter
=============
## Express rate-limitter
Rate limiting middleware for Express applications.
Rate limiting middleware for Express
``` js
var limitter = require('expa').limitter(app, client)
limitter({
path: '/like',
method: 'get',
lookup: ['req.user.id', 'req.connection.remoteAddress'],
total: 100,
expire: 1000 * 60 * 60
})
```

39
index.js

@ -0,0 +1,39 @@
module.exports = function (app, db) {
return function (opts) {
app[opts.method](opts.path, function (req, res, next) {
opts.lookup = Array.isArray(opts.lookup) ? opts.lookup : [opts.lookup]
var lookups = opts.lookup.map(function (item) {
return item + item.split('.').reduce(function (prev, cur) {
return prev[cur]
}, req)
}).join(':')
var key = 'ratelimit:' + path + ':' + method + ':' + lookups
db.get(key, function (err, limit) {
var now = Date.now()
limit = limit ? JSON.parse(limit) : {
total: total,
remaining: total,
reset: now + opts.expire
}
if (now > limit.reset) limit.reset = now + opts.expire
limit.remaining = Number(limit.remaining) - 1
db.set(key, JSON.stringify(limit)
res.set('X-RateLimit-Limit', limit.total)
res.set('X-RateLimit-Remaining', limit.remaining)
if (limit.remaining) return next()
var after = (limit.reset - Date.now()) / 1000
res.set('Retry-After', after)
res.send(429, 'Rate limit exceeded')
})
}
}
}

22
package.json

@ -0,0 +1,22 @@
{
"name": "rate-limitter",
"version": "0.0.0",
"description": "rate limitter middleware for express applications",
"main": "index.js",
"author": "Dustin Diaz",
"license": "MIT",
"scripts": {
"test": "make test"
},
"repository": {
"type": "git",
"url": "git://github.com/ded/rate-limitter.git"
},
"bugs": {
"url": "https://github.com/ded/rate-limitter/issues"
},
"homepage": "https://github.com/ded/rate-limitter",
"devDependencies": {
"mocha": "~1.18.2"
}
}
Loading…
Cancel
Save