field_ios

In-the-field app for Radroots on iOS
git clone https://radroots.dev/git/field_ios.git
Log | Files | Refs | README | LICENSE

TeraNativeUploadExecution.swift (1469B)


      1 import Foundation
      2 import RadrootsKit
      3 
      4 /// A lost admission reply is not permission to start a second native task.
      5 enum TeraNativeUploadExecution {
      6   static var unknown: TeraRuntimeFailure {
      7     .local(operation: "add.media.background", code: "ios.add.background_upload_unknown",
      8            safeMessage: "The photo upload outcome is not yet confirmed. Check recovery before trying again.")
      9   }
     10 
     11   static func start(transfer: any RadrootsBackgroundTransfer,
     12                     request: RadrootsBackgroundTransferRequest, retrying: Bool) async throws -> RadrootsBackgroundTransferSnapshot
     13   {
     14     try Task.checkCancellation()
     15     do {
     16       if retrying {
     17         _ = try await transfer.retry(request)
     18       } else {
     19         _ = try await transfer.enqueue(request)
     20       }
     21     } catch {
     22       try Task.checkCancellation()
     23       // A lost reply still requires the same exact query below; never retry.
     24     }
     25     // The producer queries OS tasks before returning reconciled snapshots.
     26     // Carry the observed execution into receipt waiting across this await.
     27     let snapshot = try await transfer.snapshot(for: request.identifier)
     28     try Task.checkCancellation()
     29     guard let snapshot, snapshot.identifier == request.identifier,
     30           TeraBackgroundUploadRequest.persistedRequestMatches(snapshot.request, request: request),
     31           [.queued, .running, .awaitingVerification, .completed].contains(snapshot.state)
     32     else { throw unknown }
     33     return snapshot
     34   }
     35 }