( job: Job, uploadFilesByTaskName: UploadFilesByTaskName, argv: CliArguments, spinner: Spinner, cancellationSignal?: AbortSignal )
| 300 | } |
| 301 | |
| 302 | async function uploadFiles( |
| 303 | job: Job, |
| 304 | uploadFilesByTaskName: UploadFilesByTaskName, |
| 305 | argv: CliArguments, |
| 306 | spinner: Spinner, |
| 307 | cancellationSignal?: AbortSignal |
| 308 | ): Promise<void> { |
| 309 | const uploadTasks = job.tasks.filter(task => task.operation === 'import/upload'); |
| 310 | |
| 311 | for (const task of uploadTasks) { |
| 312 | throwIfCancelled(cancellationSignal); |
| 313 | const file = uploadFilesByTaskName[task.name]; |
| 314 | |
| 315 | if (!file) { |
| 316 | throw new Error(`Upload task ${task.name} has no matching input file.`); |
| 317 | } |
| 318 | |
| 319 | const uploadFile = resolveUploadFilePath(file); |
| 320 | const { size } = statSync(uploadFile); |
| 321 | |
| 322 | spinner.text = `Uploading ${uploadFile}`; |
| 323 | const stream = createReadStream(uploadFile); |
| 324 | const destroyStream = (): void => { |
| 325 | stream.destroy(new Error(JOB_CANCELLED_MESSAGE)); |
| 326 | }; |
| 327 | |
| 328 | cancellationSignal?.addEventListener('abort', destroyStream, { once: true }); |
| 329 | try { |
| 330 | await argv.cloudconvert.tasks.upload(task, stream, basename(uploadFile), size); |
| 331 | } finally { |
| 332 | cancellationSignal?.removeEventListener('abort', destroyStream); |
| 333 | } |
| 334 | } |
| 335 | } |
| 336 | |
| 337 | function createJobCancellation( |
| 338 | jobId: string, |
no test coverage detected