( files: File[], config: FilesApiConfig, concurrency: number = DEFAULT_CONCURRENCY, )
| 315 | * @returns Array of download results in the same order as input |
| 316 | */ |
| 317 | export async function downloadSessionFiles( |
| 318 | files: File[], |
| 319 | config: FilesApiConfig, |
| 320 | concurrency: number = DEFAULT_CONCURRENCY, |
| 321 | ): Promise<DownloadResult[]> { |
| 322 | if (files.length === 0) { |
| 323 | return [] |
| 324 | } |
| 325 | |
| 326 | logDebug( |
| 327 | `Downloading ${files.length} file(s) for session ${config.sessionId}`, |
| 328 | ) |
| 329 | const startTime = Date.now() |
| 330 | |
| 331 | // Download files in parallel with concurrency limit |
| 332 | const results = await parallelWithLimit( |
| 333 | files, |
| 334 | file => downloadAndSaveFile(file, config), |
| 335 | concurrency, |
| 336 | ) |
| 337 | |
| 338 | const elapsedMs = Date.now() - startTime |
| 339 | const successCount = count(results, r => r.success) |
| 340 | logDebug( |
| 341 | `Downloaded ${successCount}/${files.length} file(s) in ${elapsedMs}ms`, |
| 342 | ) |
| 343 | |
| 344 | return results |
| 345 | } |
| 346 | |
| 347 | // ============================================================================ |
| 348 | // Upload Functions (BYOC mode) |
no test coverage detected