Implement custom retry handling of rate limit errors
This commit is contained in:
@@ -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`);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user