export type RateLimiter = { check: (ip: string) => boolean; }; export function createRateLimiter( limit: number, windowMs: number, now: () => number = () => Date.now(), ): RateLimiter { const hits = new Map(); return { check(ip: string) { const t = now(); const recent = (hits.get(ip) ?? []).filter((ts) => t - ts < windowMs); if (recent.length >= limit) { hits.set(ip, recent); return false; } recent.push(t); hits.set(ip, recent); return true; }, }; }