28 lines
644 B
TypeScript
28 lines
644 B
TypeScript
|
|
import { isProductionEnvironment } from "@/lib/constants";
|
||
|
|
import { ChatbotError } from "@/lib/errors";
|
||
|
|
|
||
|
|
const MAX_MESSAGES = 30;
|
||
|
|
const TTL_MS = 60 * 60 * 1000;
|
||
|
|
|
||
|
|
const ipCounts = new Map<string, { count: number; resetAt: number }>();
|
||
|
|
|
||
|
|
export async function checkIpRateLimit(ip: string | undefined) {
|
||
|
|
if (!isProductionEnvironment || !ip) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
const now = Date.now();
|
||
|
|
const entry = ipCounts.get(ip);
|
||
|
|
|
||
|
|
if (!entry || entry.resetAt < now) {
|
||
|
|
ipCounts.set(ip, { count: 1, resetAt: now + TTL_MS });
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
entry.count += 1;
|
||
|
|
|
||
|
|
if (entry.count > MAX_MESSAGES) {
|
||
|
|
throw new ChatbotError("rate_limit:chat");
|
||
|
|
}
|
||
|
|
}
|