You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

67 lines
2.1 KiB

const SESSION_LIMIT = 20;
const IP_DAILY_LIMIT = 50;
interface RateCounter {
count: number;
date: string;
}
const sessionCounters = new Map<string, RateCounter>();
const ipCounters = new Map<string, RateCounter>();
function getTodayStr(): string {
return new Date().toISOString().slice(0, 10);
}
function getCounter(map: Map<string, RateCounter>, 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;
}
function buildSessionKey(agentSlug: string, sessionId: string): string {
return `${agentSlug}:${sessionId}`;
}
function buildIpKey(agentSlug: string, ip: string): string {
return `${agentSlug}:${ip}`;
}
export interface RateLimitResult {
sessionRemaining: number;
ipRemaining: number;
blocked: boolean;
}
export function checkRateLimit(agentSlug: string, sessionId: string, ip: string): RateLimitResult {
const sessionKey = buildSessionKey(agentSlug, sessionId);
const ipKey = buildIpKey(agentSlug, ip);
const sessionCounter = getCounter(sessionCounters, sessionKey);
const ipCounter = getCounter(ipCounters, ipKey);
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(agentSlug: string, sessionId: string, ip: string): void {
const sessionKey = buildSessionKey(agentSlug, sessionId);
const ipKey = buildIpKey(agentSlug, ip);
const sessionCounter = getCounter(sessionCounters, sessionKey);
const ipCounter = getCounter(ipCounters, ipKey);
sessionCounter.count++;
ipCounter.count++;
}
export function getRateLimitInfo(agentSlug: string, sessionId: string, ip: string): RateLimitResult {
return checkRateLimit(agentSlug, sessionId, ip);
}
export const SESSION_LIMIT_VALUE = SESSION_LIMIT;
export const IP_DAILY_LIMIT_VALUE = IP_DAILY_LIMIT;