const SESSION_LIMIT = 20; const IP_DAILY_LIMIT = 50; interface RateCounter { count: number; date: string; } const sessionCounters = new Map(); const ipCounters = new Map(); function getTodayStr(): string { return new Date().toISOString().slice(0, 10); } function getCounter(map: Map, key: string): RateCounter { const today = getTodayStr(); let counter = map.get(key); if (!counter || counter.date !== today) { counter = { count: 0, date: today }; map.set(key, counter); } return counter; } export interface RateLimitResult { sessionRemaining: number; ipRemaining: number; blocked: boolean; } export function checkRateLimit(sessionId: string, ip: string): RateLimitResult { const sessionCounter = getCounter(sessionCounters, sessionId); const ipCounter = getCounter(ipCounters, ip); const sessionRemaining = Math.max(0, SESSION_LIMIT - sessionCounter.count); const ipRemaining = Math.max(0, IP_DAILY_LIMIT - ipCounter.count); const blocked = sessionRemaining === 0 || ipRemaining === 0; return { sessionRemaining, ipRemaining, blocked }; } export function incrementRateLimit(sessionId: string, ip: string): void { const sessionCounter = getCounter(sessionCounters, sessionId); const ipCounter = getCounter(ipCounters, ip); sessionCounter.count++; ipCounter.count++; } export function getRateLimitInfo(sessionId: string, ip: string): RateLimitResult { return checkRateLimit(sessionId, ip); } export const SESSION_LIMIT_VALUE = SESSION_LIMIT; export const IP_DAILY_LIMIT_VALUE = IP_DAILY_LIMIT;