class Limiter { private running = 0; private queue: (() => void)[] = []; constructor(private max: number) {} async run(fn: () => Promise): Promise { await this.acquire(); try { return await fn(); } finally { this.release(); } } private acquire(): Promise { if (this.running < this.max) { this.running++; return Promise.resolve(); } return new Promise(resolve => { this.queue.push(() => { this.running++; resolve(); }); }); } private release() { this.running--; const next = this.queue.shift(); if (next) next(); } get active() { return this.running; } get queued() { return this.queue.length; } } // ElevenLabs recommends max 2-3 concurrent requests export const ttsLimiter = new Limiter(2); // OpenRouter concurrent request cap export const aiLimiter = new Limiter(4);