| 127 | * Waits for an async function to not throw |
| 128 | */ |
| 129 | export async function waitForNoError<T>( |
| 130 | fn: () => T | Promise<T>, |
| 131 | timeout = 1000, |
| 132 | ): Promise<T> { |
| 133 | const startTime = Date.now(); |
| 134 | let lastError: Error | undefined; |
| 135 | |
| 136 | while (Date.now() - startTime < timeout) { |
| 137 | try { |
| 138 | return await Promise.resolve(fn()); |
| 139 | } catch (error) { |
| 140 | lastError = error as Error; |
| 141 | await new Promise((resolve) => setTimeout(resolve, 50)); |
| 142 | } |
| 143 | } |
| 144 | |
| 145 | throw lastError || new Error("Timeout waiting for function to succeed"); |
| 146 | } |
| 147 | |
| 148 | // ============================================================================ |
| 149 | // HTML-based Island Harness |