All checks were successful
/ build (map[dockerfile:./services/hasura/Dockerfile name:hasura]) (push) Successful in 47s
/ build (map[dockerfile:./services/web/Dockerfile name:web]) (push) Successful in 1m47s
/ build (map[dockerfile:./services/watchers/Dockerfile name:watchers]) (push) Successful in 2m37s
/ build (map[dockerfile:./services/files/Dockerfile name:files]) (push) Successful in 2m52s
/ build (map[dockerfile:./services/api/Dockerfile name:api]) (push) Successful in 3m2s
/ build (map[dockerfile:./services/app/Dockerfile name:app]) (push) Successful in 31s
/ build (map[dockerfile:./services/tasks/Dockerfile name:tasks]) (push) Successful in 2m44s
/ deploy (push) Successful in 48s
32 lines
842 B
JavaScript
32 lines
842 B
JavaScript
const { ctx } = require("@modjo/core")
|
|
const { reqCtx } = require("@modjo/express/ctx")
|
|
const { RateLimiterMemory, RateLimiterRes } = require("rate-limiter-flexible")
|
|
|
|
module.exports = () => {
|
|
const logger = ctx.require("logger")
|
|
|
|
return (options = {}) => {
|
|
const rateLimiter = new RateLimiterMemory({
|
|
...options,
|
|
})
|
|
|
|
return async (req, res, next) => {
|
|
const { ip } = req
|
|
const { userId } = reqCtx.get("session")
|
|
const key = `${ip}.${userId}`
|
|
try {
|
|
await rateLimiter.consume(key)
|
|
next()
|
|
} catch (error) {
|
|
if (!(error instanceof RateLimiterRes)) {
|
|
throw error
|
|
}
|
|
logger.error(
|
|
{ ip, userId, key },
|
|
"rate-limiter-flexible : Too Many Requests"
|
|
)
|
|
res.status(429).send("Too Many Requests")
|
|
}
|
|
}
|
|
}
|
|
}
|