From 16cf5c91f71fb16bfe923a554cb80c612fcd590c Mon Sep 17 00:00:00 2001 From: AliReza Date: Sun, 11 Oct 2026 20:55:29 +0330 Subject: [PATCH] Spread retries over 1-2x Retry-After so a crowd turned away together does not return together Co-Authored-By: Claude Opus 5.5 --- src/api/http.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/api/http.ts b/src/api/http.ts index 3ecab50..3d504ce 100644 --- a/src/api/http.ts +++ b/src/api/http.ts @@ -81,7 +81,9 @@ export interface HttpClientOptions { const RETRIABLE_STATUS = new Set([408, 425, 429, 500, 502, 503, 504]); function backoffMs(attempt: number, retryAfterMs?: number): number { - if (retryAfterMs != null) return Math.min(retryAfterMs, 30_000); + // Retry-After کمینه است، نه زمانِ دقیق: وقتی سرور زیرِ بار هزاران گوشی را هم‌زمان رد می‌کند، اگر همه + // دقیقاً بعد از همان چند ثانیه برگردند همان اوج دوباره ساخته می‌شود. پس بینِ ۱ تا ۲ برابرِ آن پخش می‌شوند. + if (retryAfterMs != null) return Math.min(retryAfterMs * (1 + Math.random()), 30_000); return Math.random() * Math.min(1000 * 2 ** attempt, 8000); }