import {getIP} from "../utils/getIP"; import {getHash} from "../utils/getHash"; import rateLimit from "express-rate-limit"; import {RateLimitConfig} from "../types/config.model"; import {Request} from "express"; import { isUserVIP } from "../utils/isUserVIP"; import { UserID } from "../types/user.model"; export function rateLimitMiddleware(limitConfig: RateLimitConfig, getUserID?: (req: Request) => UserID): rateLimit.RateLimit { return rateLimit({ windowMs: limitConfig.windowMs, max: limitConfig.max, message: limitConfig.message, statusCode: limitConfig.statusCode, headers: false, keyGenerator: (req) => { return getHash(getIP(req), 1); }, handler: async (req, res, next) => { if (getUserID === undefined || !await isUserVIP(getHash(getUserID(req)))) { return res.status(limitConfig.statusCode).send(limitConfig.message); } else { return next(); } } }); }