Implement custom retry handling of rate limit errors

This commit is contained in:
Dominic Ferrando
2026-07-13 16:32:20 -04:00
parent b408bb5439
commit fd94f22d21
7 changed files with 80 additions and 10 deletions
+19
View File
@@ -26,3 +26,22 @@ export const range = (length: number) =>
export const clamp = (x: number, lo: number, hi: number) =>
Math.max(lo, Math.min(hi, x));
export const parseRetryAfterMs = (header: string | null, defaultMs: number): number => {
if (header === null) return defaultMs;
if (/^\d+$/.test(header.trim())) return secToMs(Number(header));
const date = new Date(header);
if (!Number.isNaN(date.getTime())) return clamp(date.getTime() - Date.now(), 0, Infinity);
return defaultMs;
};
export class RateLimitError extends Error {
status: number = 429;
constructor(public source: string, public retryDelayMs: number, public payload: unknown) {
super(`${source}: Too many requests`);
}
}