| 845 | } |
| 846 | |
| 847 | export async function retry<T>( |
| 848 | fn: () => T | Promise<T>, |
| 849 | duration: number = 3000, |
| 850 | interval: number = 500, |
| 851 | description: string = fn.name |
| 852 | ): Promise<T> { |
| 853 | if (duration % interval !== 0) { |
| 854 | throw new Error( |
| 855 | `invalid duration ${duration} and interval ${interval} mix, duration must be evenly divisible by interval` |
| 856 | ) |
| 857 | } |
| 858 | |
| 859 | for (let i = duration; i >= 0; i -= interval) { |
| 860 | try { |
| 861 | return await fn() |
| 862 | } catch (err) { |
| 863 | if (i === 0) { |
| 864 | console.error( |
| 865 | `Failed to retry${ |
| 866 | description ? ` ${description}` : '' |
| 867 | } within ${duration}ms` |
| 868 | ) |
| 869 | throw err |
| 870 | } |
| 871 | debugPrint( |
| 872 | `Retrying${description ? ` ${description}` : ''} in ${interval}ms` |
| 873 | ) |
| 874 | await waitFor(interval) |
| 875 | } |
| 876 | } |
| 877 | |
| 878 | throw new Error('Duration cannot be less than 0.') |
| 879 | } |
| 880 | |
| 881 | export async function waitForRedbox(browser: Playwright) { |
| 882 | const redbox = browser.locateRedbox() |