()
| 383 | const partNumbers = Array.from({ length: numParts }, (_, i) => i + 1) |
| 384 | |
| 385 | const abortMultipart = async () => { |
| 386 | try { |
| 387 | // boundary-raw-fetch: fire-and-forget abort during multipart cleanup; intentionally avoids contract response parsing so cleanup cannot mask the original error |
| 388 | await fetch('/api/files/multipart?action=abort', { |
| 389 | method: 'POST', |
| 390 | headers: { 'Content-Type': 'application/json' }, |
| 391 | body: JSON.stringify({ uploadToken }), |
| 392 | }) |
| 393 | } catch (err) { |
| 394 | logger.warn('Failed to abort multipart upload:', err) |
| 395 | } |
| 396 | } |
| 397 | |
| 398 | let presignedUrls: PartUrl[] |
| 399 | try { |
no test coverage detected