| const rateLimit = require('express-rate-limit'); |
| const denyRequest = require('~/server/middleware/denyRequest'); |
| const { logViolation } = require('~/cache'); |
|
|
| const { |
| MESSAGE_IP_MAX = 40, |
| MESSAGE_IP_WINDOW = 1, |
| MESSAGE_USER_MAX = 40, |
| MESSAGE_USER_WINDOW = 1, |
| } = process.env; |
|
|
| const ipWindowMs = MESSAGE_IP_WINDOW * 60 * 1000; |
| const ipMax = MESSAGE_IP_MAX; |
| const ipWindowInMinutes = ipWindowMs / 60000; |
|
|
| const userWindowMs = MESSAGE_USER_WINDOW * 60 * 1000; |
| const userMax = MESSAGE_USER_MAX; |
| const userWindowInMinutes = userWindowMs / 60000; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| const createHandler = (ip = true) => { |
| return async (req, res) => { |
| const type = 'message_limit'; |
| const errorMessage = { |
| type, |
| max: ip ? ipMax : userMax, |
| limiter: ip ? 'ip' : 'user', |
| windowInMinutes: ip ? ipWindowInMinutes : userWindowInMinutes, |
| }; |
|
|
| await logViolation(req, res, type, errorMessage); |
| return await denyRequest(req, res, errorMessage); |
| }; |
| }; |
|
|
| |
| |
| |
| const messageIpLimiter = rateLimit({ |
| windowMs: ipWindowMs, |
| max: ipMax, |
| handler: createHandler(), |
| }); |
|
|
| |
| |
| |
| const messageUserLimiter = rateLimit({ |
| windowMs: userWindowMs, |
| max: userMax, |
| handler: createHandler(false), |
| keyGenerator: function (req) { |
| return req.user?.id; |
| }, |
| }); |
|
|
| module.exports = { |
| messageIpLimiter, |
| messageUserLimiter, |
| }; |
|
|