(url: string, options: RequestInit)
| 150 | } |
| 151 | |
| 152 | async function fetchWithTimeout(url: string, options: RequestInit): Promise<Response> { |
| 153 | const controller = new AbortController(); |
| 154 | activeAbortController = controller; |
| 155 | const timeout = setTimeout(() => controller.abort(), getUploadTimeoutMs()); |
| 156 | const requestUrl = toProxyUrl(url); |
| 157 | |
| 158 | try { |
| 159 | return await fetch(requestUrl, { |
| 160 | ...options, |
| 161 | signal: controller.signal |
| 162 | }); |
| 163 | } catch (error) { |
| 164 | if (cancelRequested || controller.signal.aborted) { |
| 165 | throw new Error(cancelRequested ? "Upload cancelled by user" : "Upload timed out"); |
| 166 | } |
| 167 | |
| 168 | throw error; |
| 169 | } finally { |
| 170 | clearTimeout(timeout); |
| 171 | if (activeAbortController === controller) { |
| 172 | activeAbortController = null; |
| 173 | } |
| 174 | } |
| 175 | } |
| 176 | |
| 177 | function getHeaderEntries(headers?: HeadersInit): [string, string][] { |
| 178 | if (!headers) return []; |
no test coverage detected