(config, fn)
| 15 | * @returns {Promise<T>} |
| 16 | */ |
| 17 | const retry = (config, fn) => |
| 18 | new Promise((resolve, reject) => { |
| 19 | const { intervalInMs = 500, maxRetries = 10, backoff = 0 } = config; |
| 20 | fn() |
| 21 | .then(resolve) |
| 22 | .catch((err) => { |
| 23 | if (!config.quiet) { |
| 24 | console.warn( |
| 25 | `Retrying after ${ |
| 26 | intervalInMs / 1000 |
| 27 | } seconds. ${maxRetries} retries left.`, |
| 28 | ); |
| 29 | console.warn(err instanceof Error ? err.message : err); |
| 30 | } |
| 31 | if (maxRetries === 0) { |
| 32 | config.swallowError ? resolve() : reject(err); |
| 33 | } else { |
| 34 | setTimeout(() => { |
| 35 | retry( |
| 36 | { |
| 37 | ...config, |
| 38 | intervalInMs: intervalInMs + backoff, |
| 39 | maxRetries: maxRetries - 1, |
| 40 | }, |
| 41 | fn, |
| 42 | ).then(resolve, reject); |
| 43 | }, intervalInMs); |
| 44 | } |
| 45 | }); |
| 46 | }); |
| 47 | |
| 48 | export { retry, wait }; |
no outgoing calls