/* eslint-disable @typescript-eslint/no-invalid-void-type */ import clientRedis from '@config/clientRedis' import { RATE_LIMIT } from '@config/env' import { logErrServer } from '@expresso/helpers/Formatter' import { NextFunction, Request, Response } from 'express' import { RateLimiterRedis } from 'rate-limiter-flexible' // Rate Limit Request const rateLimiter = new RateLimiterRedis({ storeClient: clientRedis, keyPrefix: 'middleware', points: RATE_LIMIT, // 10 requests duration: 1, // per 1 second by IP }) async function ExpressRateLimit( req: Request, res: Response, next: NextFunction ): Promise<void | Response<any, Record<string, any>>> { try { await rateLimiter.consume(req.ip) return next() } catch (err) { const errType = `Limit Request Error:` const message = 'Too Many Requests' console.log(logErrServer(errType, message)) return res.status(429).json({ code: 429, message }) } } export default ExpressRateLimit