/**
* Simple rate limit tracker using Rippling's response headers.
*/
export class RateLimitTracker {
private remaining: number | null = null;
private resetAt: number | null = null;
updateFromHeaders(headers: Headers): void {
const remaining = headers.get("x-ratelimit-remaining");
const reset = headers.get("x-ratelimit-reset");
if (remaining !== null) this.remaining = parseInt(remaining, 10);
if (reset !== null) this.resetAt = parseInt(reset, 10) * 1000;
}
async waitIfNeeded(): Promise<void> {
if (this.remaining !== null && this.remaining <= 1 && this.resetAt) {
const waitMs = Math.max(0, this.resetAt - Date.now());
if (waitMs > 0 && waitMs < 15000) {
await new Promise((resolve) => setTimeout(resolve, waitMs));
}
}
}
}