rateLimit.ts (532B)
1 const buckets = new Map<string, { count: number; resetAt: number }>(); 2 3 export function rateLimit( 4 key: string, 5 maxPerWindow: number, 6 windowMs: number, 7 ): { ok: true } | { ok: false; retryAfterSec: number } { 8 const now = Date.now(); 9 let b = buckets.get(key); 10 if (!b || now >= b.resetAt) { 11 b = { count: 0, resetAt: now + windowMs }; 12 buckets.set(key, b); 13 } 14 b.count += 1; 15 if (b.count > maxPerWindow) { 16 return { ok: false, retryAfterSec: Math.ceil((b.resetAt - now) / 1000) }; 17 } 18 return { ok: true }; 19 }