mymusics

retro MySpace-style music player
Log | Files | Refs | README

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 }