( operation: () => Promise<T>, maxRetries: number = 2, delayMs: number = 1000, token?: AbortToken, )
| 1029 | |
| 1030 | const retryWithFixedDelay = async <T>( |
| 1031 | operation: () => Promise<T>, |
| 1032 | maxRetries: number = 2, |
| 1033 | delayMs: number = 1000, |
| 1034 | token?: AbortToken, |
| 1035 | ): Promise<T> => { |
| 1036 | let lastError: any; |
| 1037 | for (let i = 0; i < maxRetries; i++) { |
| 1038 | token?.throwIfAborted(); |
| 1039 | try { |
| 1040 | return await operation(); |
| 1041 | } catch (error: any) { |
| 1042 | lastError = error; |
| 1043 | if (token?.aborted) throw error; |
| 1044 | if (!isRetryableError(error)) throw error; |
| 1045 | if (i === maxRetries - 1) break; |
| 1046 | await sleep(delayMs, token); |
| 1047 | } |
| 1048 | } |
| 1049 | throw lastError; |
| 1050 | }; |
| 1051 | |
| 1052 | const isRetryableError = (error: any): boolean => { |
| 1053 | if (!error) return false; |
| 1054 | if (error.name === "AbortError") return false; |
no test coverage detected