Skip to content

Enhancement: Add progress tracking for large asset uploads #202

@leogdion

Description

@leogdion

Overview

Add progress reporting for asset uploads to improve UX during large file transfers.

Current API

// No progress feedback during upload
let data = try Data(contentsOf: largeVideoURL) // 200 MB
let result = try await service.uploadAssets(data: data)
// User waits with no feedback

Proposed API

// Option 1: Callback-based progress
let result = try await service.uploadAssets(
    data: data,
    progress: { bytesUploaded, totalBytes in
        let percent = Double(bytesUploaded) / Double(totalBytes) * 100
        print("Upload: \(percent)%")
    }
)

// Option 2: AsyncSequence of progress updates
for try await progress in service.uploadAssetsWithProgress(data: data) {
    switch progress {
    case .uploading(let bytes, let total):
        updateUI(bytes: bytes, total: total)
    case .completed(let result):
        handleResult(result)
    }
}

// Option 3: Publisher-based (Combine)
service.uploadAssetsPublisher(data: data)
    .sink(
        receiveValue: { progress in updateUI(progress) },
        receiveCompletion: { completion in handleCompletion(completion) }
    )

Benefits

  • Better UX: Users see upload progress
  • Timeout handling: Detect stalled uploads
  • Cancellation support: Allow user to cancel long uploads
  • Network diagnostics: Monitor upload speed

Implementation Notes

  • Use URLSession's uploadTask(with:from:) progress monitoring
  • Leverage OpenAPIRuntime's HTTPBody streaming
  • Consider memory-efficient streaming for large files
  • Add upload speed calculation (bytes/second)
  • Support cancellation via Task cancellation

Considerations

  • Which API style is most idiomatic for Swift Concurrency?
  • Should progress be opt-in or always available?
  • How to handle progress with batch uploads?
  • Minimum file size threshold for progress tracking?

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions