35 lines
896 B
TypeScript
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');
|
|
},
|
|
});
|
|
}
|