@@ -27,6 +27,7 @@ export type RetryOptions = RetryConfig & {
2727 label ?: string ;
2828 shouldRetry ?: ( err : unknown , attempt : number ) => boolean ;
2929 retryAfterMs ?: ( err : unknown ) => number | undefined ;
30+ retryAfterMaxDelayMs ?: number ;
3031 onRetry ?: ( info : RetryInfo ) => void ;
3132} ;
3233
@@ -136,6 +137,13 @@ export async function retryAsync<T>(
136137 Number . isFinite ( resolved . maxDelayMs ) && resolved . maxDelayMs > 0
137138 ? resolved . maxDelayMs
138139 : Number . POSITIVE_INFINITY ;
140+ const retryAfterMaxDelayMs =
141+ options . retryAfterMaxDelayMs === undefined
142+ ? maxDelayMs
143+ : Math . max (
144+ minDelayMs ,
145+ resolveRetryDelayMs ( Math . round ( clampNumber ( options . retryAfterMaxDelayMs , maxDelayMs , 0 ) ) ) ,
146+ ) ;
139147 const jitter = resolved . jitter ;
140148 const shouldRetry = options . shouldRetry ?? ( ( ) => true ) ;
141149 let lastErr : unknown ;
@@ -154,7 +162,8 @@ export async function retryAsync<T>(
154162 const baseDelay = hasRetryAfter
155163 ? Math . max ( retryAfterMs , minDelayMs )
156164 : minDelayMs * 2 ** ( attempt - 1 ) ;
157- let delay = Math . min ( baseDelay , maxDelayMs ) ;
165+ const delayCap = hasRetryAfter ? retryAfterMaxDelayMs : maxDelayMs ;
166+ let delay = Math . min ( baseDelay , delayCap ) ;
158167 // Server-supplied Retry-After is a lower-bound contract with the
159168 // upstream rate limiter; symmetric jitter would let roughly half the
160169 // retries land before the requested time and invite escalation. Use
@@ -181,9 +190,9 @@ export async function retryAsync<T>(
181190 // (`retryAfterMs > maxDelayMs`), where the contract is already
182191 // unsatisfiable and we gain spread without adding a violation.
183192 const canHonorRetryAfter =
184- hasRetryAfter && typeof retryAfterMs === "number" && retryAfterMs <= maxDelayMs ;
193+ hasRetryAfter && typeof retryAfterMs === "number" && retryAfterMs <= delayCap ;
185194 delay = applyJitter ( delay , jitter , canHonorRetryAfter ? "positive" : "symmetric" ) ;
186- delay = Math . min ( Math . max ( delay , minDelayMs ) , maxDelayMs ) ;
195+ delay = Math . min ( Math . max ( delay , minDelayMs ) , delayCap ) ;
187196
188197 options . onRetry ?.( {
189198 attempt,
0 commit comments