Skip to content

Commit 7ae388d

Browse files
authored
Update input state when upload is finished (#63)
* Update input state when the upload succeeds or fails * Tweak input state definition, keep an error in the failed case and the success struct in the success case * NFC: remove some if let checks for the handler closure properties in MuxUpload and replace with ? operator. Keeps the existing logic
1 parent 5fabbaa commit 7ae388d

File tree

2 files changed

+77
-55
lines changed

2 files changed

+77
-55
lines changed

Sources/MuxUploadSDK/InternalUtilities/UploadInput.swift

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ struct UploadInput {
2323
case awaitingUploadConfirmation(UploadInfo)
2424
case uploadInProgress(UploadInfo, MuxUpload.TransportStatus)
2525
case uploadPaused(UploadInfo, MuxUpload.TransportStatus)
26-
case uploadSucceeded(UploadInfo, MuxUpload.TransportStatus)
27-
case uploadFailed(UploadInfo, MuxUpload.TransportStatus)
26+
case uploadSucceeded(UploadInfo, MuxUpload.Success)
27+
case uploadFailed(UploadInfo, MuxUpload.UploadError)
2828
}
2929

3030
var status: Status
@@ -103,10 +103,10 @@ struct UploadInput {
103103
return transportStatus
104104
case .uploadPaused(_, let transportStatus):
105105
return transportStatus
106-
case .uploadSucceeded(_, let transportStatus):
107-
return transportStatus
108-
case .uploadFailed(_, let transportStatus):
109-
return transportStatus
106+
case .uploadSucceeded(_, let successDetails):
107+
return successDetails.finalState
108+
case .uploadFailed:
109+
return nil
110110
}
111111
}
112112
}
@@ -131,12 +131,24 @@ extension UploadInput {
131131
}
132132
}
133133

134-
}
134+
mutating func processUploadSuccess(
135+
transportStatus: MuxUpload.TransportStatus
136+
) {
137+
if case UploadInput.Status.uploadInProgress(let info, _) = status {
138+
status = .uploadSucceeded(info, MuxUpload.Success(finalState: transportStatus))
139+
} else {
140+
return
141+
}
142+
}
135143

136-
extension UploadInput.Status: Equatable {
144+
mutating func processUploadFailure(error: MuxUpload.UploadError) {
145+
status = .uploadFailed(uploadInfo, error)
146+
}
137147

138148
}
139149

150+
extension UploadInput.Status: Equatable { }
151+
140152
extension UploadInput {
141153
init(
142154
asset: AVAsset,

Sources/MuxUploadSDK/PublicAPI/MuxUpload.swift

Lines changed: 57 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,9 @@ public final class MuxUpload : Hashable, Equatable {
8989
/// Upload has been paused
9090
case uploadPaused(AVAsset, TransportStatus)
9191
/// Upload has succeeded
92-
case uploadSucceeded(AVAsset, TransportStatus, UploadResult)
92+
case uploadSucceeded(AVAsset, MuxUpload.Success)
9393
/// Upload has failed
94-
case uploadFailed(AVAsset, TransportStatus, UploadResult)
94+
case uploadFailed(AVAsset, MuxUpload.UploadError)
9595
}
9696

9797
/// Current status of the upload input as it goes through
@@ -124,17 +124,15 @@ public final class MuxUpload : Hashable, Equatable {
124124
uploadInfo.sourceAsset(),
125125
transportStatus
126126
)
127-
case .uploadSucceeded(let uploadInfo, let transportStatus):
127+
case .uploadSucceeded(let uploadInfo, let success):
128128
return InputStatus.uploadSucceeded(
129129
uploadInfo.sourceAsset(),
130-
transportStatus,
131-
.success(.init(finalState: transportStatus))
130+
success
132131
)
133-
case .uploadFailed(let uploadInfo, let transportStatus):
132+
case .uploadFailed(let uploadInfo, let error):
134133
return InputStatus.uploadFailed(
135134
uploadInfo.sourceAsset(),
136-
transportStatus,
137-
.failure(.init(lastStatus: transportStatus))
135+
error
138136
)
139137
}
140138
}
@@ -429,20 +427,18 @@ public final class MuxUpload : Hashable, Equatable {
429427
startTime: Date().timeIntervalSince1970,
430428
isPaused: true
431429
)
432-
resultHandler?(
433-
.failure(
434-
UploadError(
435-
lastStatus: startFailureTransportStatus,
436-
code: .file,
437-
message: "",
438-
reason: nil
439-
)
440-
)
430+
let error: UploadError = UploadError(
431+
lastStatus: startFailureTransportStatus,
432+
code: .file,
433+
message: "",
434+
reason: nil
441435
)
436+
let result: UploadResult = .failure(error)
442437
input.status = .uploadFailed(
443438
input.uploadInfo,
444-
startFailureTransportStatus
439+
error
445440
)
441+
resultHandler?(result)
446442
return
447443
}
448444

@@ -456,7 +452,9 @@ public final class MuxUpload : Hashable, Equatable {
456452
MuxUploadSDK.logger?.warning("start() called but upload is already in progress")
457453
fileWorker?.addDelegate(
458454
withToken: id,
459-
InternalUploaderDelegate { [self] state in handleStateUpdate(state) }
455+
InternalUploaderDelegate {
456+
[self] state in handleStateUpdate(state)
457+
}
460458
)
461459
fileWorker?.start()
462460
return
@@ -621,10 +619,15 @@ public final class MuxUpload : Hashable, Equatable {
621619
private func handleStateUpdate(_ state: ChunkedFileUploader.InternalUploadState) {
622620
switch state {
623621
case .success(let result): do {
624-
if let notifySuccess = resultHandler {
625-
let finalStatus = TransportStatus(progress: result.finalProgress, updatedTime: result.finishTime, startTime: result.startTime, isPaused: false)
626-
notifySuccess(Result<Success, UploadError>.success(Success(finalState: finalStatus)))
627-
}
622+
let transportStatus = TransportStatus(
623+
progress: result.finalProgress,
624+
updatedTime: result.finishTime,
625+
startTime: result.startTime,
626+
isPaused: false
627+
)
628+
let successDetails = MuxUpload.Success(finalState: transportStatus)
629+
input.processUploadSuccess(transportStatus: transportStatus)
630+
resultHandler?(Result<Success, UploadError>.success(successDetails))
628631
fileWorker?.removeDelegate(withToken: id)
629632
fileWorker = nil
630633
}
@@ -637,35 +640,33 @@ public final class MuxUpload : Hashable, Equatable {
637640
isPaused: false
638641
)
639642
)
640-
if let notifyFailure = resultHandler {
641-
if case .cancelled = parsedError.code {
642-
// This differs from what MuxUpload does
643-
// when cancelled with an external API call
644-
MuxUploadSDK.logger?.info("task canceled")
645-
let canceledStatus = MuxUpload.TransportStatus(
646-
progress: input.transportStatus?.progress,
647-
updatedTime: input.transportStatus?.updatedTime ?? Date().timeIntervalSince1970,
648-
startTime: input.transportStatus?.startTime ?? Date().timeIntervalSince1970,
649-
isPaused: true
650-
)
651-
if let notifyProgress = progressHandler { notifyProgress(canceledStatus) }
652-
} else {
653-
notifyFailure(Result.failure(parsedError))
654-
}
643+
input.processUploadFailure(error: parsedError)
644+
if case .cancelled = parsedError.code {
645+
// This differs from what MuxUpload does
646+
// when cancelled with an external API call
647+
MuxUploadSDK.logger?.info("task canceled")
648+
let canceledStatus = MuxUpload.TransportStatus(
649+
progress: input.transportStatus?.progress,
650+
updatedTime: input.transportStatus?.updatedTime ?? Date().timeIntervalSince1970,
651+
startTime: input.transportStatus?.startTime ?? Date().timeIntervalSince1970,
652+
isPaused: true
653+
)
654+
progressHandler?(canceledStatus)
655+
} else {
656+
resultHandler?(Result.failure(parsedError))
655657
}
656658
fileWorker?.removeDelegate(withToken: id)
657659
fileWorker = nil
658660
}
659661
case .uploading(let update): do {
660-
if let notifyProgress = progressHandler {
661-
let status = TransportStatus(
662-
progress: update.progress,
663-
updatedTime: update.updateTime,
664-
startTime: update.startTime, isPaused: false
665-
)
666-
input.status = .uploadInProgress(input.uploadInfo, status)
667-
notifyProgress(status)
668-
}
662+
let status = TransportStatus(
663+
progress: update.progress,
664+
updatedTime: update.updateTime,
665+
startTime: update.startTime,
666+
isPaused: false
667+
)
668+
input.status = .uploadInProgress(input.uploadInfo, status)
669+
progressHandler?(status)
669670
}
670671
default: do {}
671672
}
@@ -709,6 +710,15 @@ fileprivate class InternalUploaderDelegate : ChunkedFileUploaderDelegate {
709710
}
710711
}
711712

713+
extension MuxUpload.UploadError: Equatable {
714+
public static func == (lhs: MuxUpload.UploadError, rhs: MuxUpload.UploadError) -> Bool {
715+
return lhs.message == rhs.message &&
716+
lhs.lastStatus == rhs.lastStatus &&
717+
lhs.code == rhs.code &&
718+
lhs.reason?.localizedDescription == rhs.reason?.localizedDescription
719+
}
720+
}
721+
712722
public extension Error {
713723
func asMuxUploadError() -> MuxUpload.UploadError? {
714724
return self as? MuxUpload.UploadError

0 commit comments

Comments
 (0)