* Extracts the Retry-After delay from an error object's headers. * @param error The error object. * @returns The delay in milliseconds, or 0 if not found or invalid.
(error: unknown)
| 249 | * @returns The delay in milliseconds, or 0 if not found or invalid. |
| 250 | */ |
| 251 | function getRetryAfterDelayMs(error: unknown): number { |
| 252 | if (typeof error === 'object' && error !== null) { |
| 253 | // Check for error.response.headers (common in axios errors) |
| 254 | if ( |
| 255 | 'response' in error && |
| 256 | typeof (error as { response?: unknown }).response === 'object' && |
| 257 | (error as { response?: unknown }).response !== null |
| 258 | ) { |
| 259 | const response = (error as { response: { headers?: unknown } }).response; |
| 260 | if ( |
| 261 | 'headers' in response && |
| 262 | typeof response.headers === 'object' && |
| 263 | response.headers !== null |
| 264 | ) { |
| 265 | const headers = response.headers as { 'retry-after'?: unknown }; |
| 266 | const retryAfterHeader = headers['retry-after']; |
| 267 | if (typeof retryAfterHeader === 'string') { |
| 268 | const retryAfterSeconds = parseInt(retryAfterHeader, 10); |
| 269 | if (!isNaN(retryAfterSeconds)) { |
| 270 | return retryAfterSeconds * 1000; |
| 271 | } |
| 272 | // It might be an HTTP date |
| 273 | const retryAfterDate = new Date(retryAfterHeader); |
| 274 | if (!isNaN(retryAfterDate.getTime())) { |
| 275 | return Math.max(0, retryAfterDate.getTime() - Date.now()); |
| 276 | } |
| 277 | } |
| 278 | } |
| 279 | } |
| 280 | } |
| 281 | return 0; |
| 282 | } |
| 283 | |
| 284 | /** |
| 285 | * Determines the delay duration based on the error, prioritizing Retry-After header. |
no outgoing calls
no test coverage detected