UNPKG

@tsdiapi/server

Version:

A fully ESM-based, modular TypeScript server built on Fastify

37 lines (34 loc) 1.49 kB
import rateLimit, { RateLimitOptions, RateLimitPluginOptions, errorResponseBuilderContext } from '@fastify/rate-limit'; import { FastifyRequest } from 'fastify'; import { AppOptions } from "./types.js"; const defaultRateLimit: RateLimitPluginOptions = { global: false, // Allows per-route rate limit configuration max: 100, timeWindow: '1 minute', errorResponseBuilder: (request: FastifyRequest, context: errorResponseBuilderContext) => ({ statusCode: 429, error: 'Too Many Requests', message: `Rate limit exceeded, retry in ${context.after}`, expiresIn: context.after }), keyGenerator: (request: FastifyRequest) => { return request.ip; }, skipOnError: true, onBanReach: (req: FastifyRequest, key: string) => { console.warn(`Rate limit ban reached for key: ${key}, IP: ${req.ip}`); }, onExceeding: (req: FastifyRequest, key: string) => { console.warn(`Rate limit exceeded for key: ${key}, IP: ${req.ip}`); } } export function setupRateLimit(rateLimitOptions?: AppOptions['rateLimitOptions']): false | RateLimitPluginOptions { let options: RateLimitPluginOptions = defaultRateLimit; if (rateLimitOptions === false) return false; if ('function' === typeof rateLimitOptions) { options = rateLimitOptions(defaultRateLimit); } else if ('object' === typeof rateLimitOptions) { options = { ...defaultRateLimit, ...rateLimitOptions }; } return options; }