import { createClient } from 'redis'; import { REDIS_HOST, REDIS_PORT, REDIS_PASS } from '@shared/utils/environment'; import { Request, Response, NextFunction } from 'express'; import { RateLimiterRedis } from 'rate-limiter-flexible'; import AppError from '@shared/errors/AppError'; const redisClient = createClient({ host: REDIS_HOST, port: Number(REDIS_PORT), password: REDIS_PASS || undefined, }); const limiter = new RateLimiterRedis({ storeClient: redisClient, keyPrefix: 'rateLimit', points: 5, duration: 1, }); export default async function rateLimiter( request: Request, _: Response, next: NextFunction, ): Promise<void> { try { await limiter.consume(request.ip); return next(); } catch (err) { throw new AppError('Too many request', 429); } }