1.1.2 • Published 9 years ago
express-antiflood v1.1.2
express-antiflood
An antiflood middleware for Express. For using it in production check out the Redis store.
Keep in mind that I'm doing this in my free time, so be kind 😁.
Installation
npm install express-antifloodUsage
import express from 'express'
import antiflood, { MemoryStore } from 'express-antiflood'
const app = express()
const middleware = antiflood(MemoryStore(), {
tries: 3,
timeLimit: 30000,
timeBlocked: 60000 * 10,
})
app.post('/comment', middleware, function (req, res) {
res.send('Hello World!')
})
app.listen(3000)Options
Antiflood(store, options, extensions)
storeAn store. You can useMemoryStorewhich is included in this repo but it's recommended to use a production-ready store like RedisStoreoptionstimeLimitThe time that has to pass since the latest request before the store resets the request count to 0 (default: 60000)timeBlockedThe time (in miliseconds) the user will have to wait when he reached the limit of requests (default: 300000)triesNumber of tries before getting blocked. If the user makes the request{tries}times, the request will success but the user will have to wait{timeBlocked}msbefore making it again (default: 10)prefixPrefix for the key saved in the store (default:'')failCallbackA function that gets called with(req, res, next, nextValidRequestDate)when a request is blocked (by default it responds with aToo many requestserror)getKeyA function that gets called with(req)and returns the key that will be used by the store. For example to save the key based on the username. (by default the middleware will usereq.ip)
extensionsA function or an array of functions. Each function receives alistener. More info in the extensions section.
Creating extensions
An extension is just a function that receives a listener function:
function (listener) {
listener(EVENT, function(data) {
// Do something!
})
}Where:
datais an object with the following values:keyThe value the store used in the request
Events
SUCCESSOn each request that has been successful and the user has not been blockedLIMIT_REACHEDThe request was successful but the user has reached the limit and has been blocked for the following requestsBLOCKEDWhen the request was rejected because the user is blocked
TODO:
- Add more tests