@tsdiapi/server
Version:
A fully ESM-based, modular TypeScript server built on Fastify
37 lines (34 loc) • 1.49 kB
text/typescript
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;
}