Files
stats/apps/api/src/utils/rate-limiter.ts
Carl-Gerhard Lindesvärd 1e3b90c971 feature(api): add rate limiter
2024-10-07 10:33:50 +02:00

35 lines
896 B
TypeScript

import { getRedisCache } from '@openpanel/redis';
import type { FastifyInstance } from 'fastify';
export async function activateRateLimiter({
fastify,
max,
timeWindow,
}: {
fastify: FastifyInstance;
max: number;
timeWindow?: string;
}) {
await fastify.register(import('@fastify/rate-limit'), {
max,
timeWindow: timeWindow || '1 minute',
errorResponseBuilder: (req, reply) => {
return {
statusCode: 429,
error: 'Too Many Requests',
message: 'You have exceeded the rate limit for this endpoint.',
};
},
redis: getRedisCache(),
keyGenerator(req) {
return (req.headers['openpanel-client-id'] ||
req.headers['x-real-ip'] ||
req.headers['x-client-ip'] ||
req.headers['x-forwarded-for']) as string;
},
onExceeded: (req, reply) => {
req.log.warn('Rate limit exceeded');
},
});
}