Skip to content

Commit 5360866

Browse files
committed
Avoid duplicate MuxUpload initialization in UploadManager (#61)
Fix stack overflow uploadersByID -> uploadsByID Add log
1 parent 42567a1 commit 5360866

File tree

3 files changed

+31
-26
lines changed

3 files changed

+31
-26
lines changed

Sources/MuxUploadSDK/PublicAPI/MuxUpload.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public final class MuxUpload : Hashable, Equatable {
4848

4949
private let uploadInfo: UploadInfo
5050
private let manageBySDK: Bool
51-
private var id: String {
51+
var id: String {
5252
uploadInfo.id
5353
}
5454
private let uploadManager: UploadManager
@@ -170,7 +170,7 @@ public final class MuxUpload : Hashable, Equatable {
170170
// Use an existing globally-managed upload if desired & one exists
171171
if self.manageBySDK && fileWorker == nil {
172172
// See if there's anything in progress already
173-
fileWorker = uploadManager.findUploaderFor(videoFile: videoFile)
173+
fileWorker = uploadManager.findChunkedFileUploader(inputFileURL: videoFile)
174174
}
175175
if fileWorker != nil && !forceRestart {
176176
MuxUploadSDK.logger?.warning("start() called but upload is already in progress")
@@ -193,8 +193,8 @@ public final class MuxUpload : Hashable, Equatable {
193193
InternalUploaderDelegate { [self] state in handleStateUpdate(state) }
194194
)
195195
fileWorker.start()
196-
uploadManager.registerUploader(fileWorker, withId: id)
197196
self.fileWorker = fileWorker
197+
uploadManager.registerUpload(self)
198198
}
199199

200200
/**

Sources/MuxUploadSDK/PublicAPI/UploadManager.swift

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import Foundation
2828
///
2929
public final class UploadManager {
3030

31-
private var uploadersByID: [String : ChunkedFileUploader] = [:]
31+
private var uploadsByID: [String : MuxUpload] = [:]
3232
private var uploadsUpdateDelegatesByToken: [ObjectIdentifier : any UploadsUpdatedDelegate] = [:]
3333
private let uploadActor = UploadCacheActor()
3434
private lazy var uploaderDelegate: FileUploaderDelegate = FileUploaderDelegate(manager: self)
@@ -37,23 +37,21 @@ public final class UploadManager {
3737
/// to track and control its state
3838
/// Returns nil if there was no uplod in progress for thr given file
3939
public func findStartedUpload(ofFile url: URL) -> MuxUpload? {
40-
if let uploader = Dictionary<URL, ChunkedFileUploader>(
41-
uniqueKeysWithValues: uploadersByID.mapValues { value in
42-
(value.uploadInfo.videoFile, value)
40+
for upload in uploadsByID.values {
41+
if upload.videoFile == url {
42+
return upload
4343
}
44-
.values
45-
)[url] {
46-
return MuxUpload(wrapping: uploader, uploadManager: self)
47-
} else {
48-
return nil
4944
}
45+
46+
return nil
5047
}
5148

5249
/// Returns all uploads currently-managed uploads.
5350
/// Uploads are managed while in-progress or compelted.
5451
/// Uploads become un-managed when canceled, or if the process dies after they complete
5552
public func allManagedUploads() -> [MuxUpload] {
56-
return uploadersByID.compactMap { (key, value) in MuxUpload(wrapping: value, uploadManager: self) }
53+
// Sort upload list for consistent ordering
54+
return Array(uploadsByID.values)
5755
}
5856

5957
/// Attempts to resume an upload that was previously paused or interrupted by process death
@@ -100,27 +98,34 @@ public final class UploadManager {
10098
}
10199

102100
internal func acknowledgeUpload(id: String) {
103-
if let uploader = uploadersByID[id] {
101+
if let uploader = uploadsByID[id] {
102+
uploadsByID.removeValue(forKey: id)
104103
uploader.cancel()
105104
}
106-
uploadersByID.removeValue(forKey: id)
107105
Task.detached {
108106
await self.uploadActor.remove(uploadID: id)
109107
self.notifyDelegates()
110108
}
111109
}
112110

113-
internal func findUploaderFor(videoFile url: URL) -> ChunkedFileUploader? {
114-
return Dictionary<URL, ChunkedFileUploader>(
115-
uniqueKeysWithValues: uploadersByID.mapValues { value in
116-
(value.uploadInfo.videoFile, value)
117-
}
118-
.values
119-
)[url]
111+
internal func findChunkedFileUploader(
112+
inputFileURL: URL
113+
) -> ChunkedFileUploader? {
114+
findStartedUpload(
115+
ofFile: inputFileURL
116+
)?.fileWorker
120117
}
121118

122-
internal func registerUploader(_ fileWorker: ChunkedFileUploader, withId id: String) {
123-
uploadersByID.updateValue(fileWorker, forKey: fileWorker.uploadInfo.id)
119+
internal func registerUpload(_ upload: MuxUpload) {
120+
guard let fileWorker = upload.fileWorker else {
121+
// Only started uploads, aka uploads with a file
122+
// worker can be registered.
123+
// TODO: Should this throw?
124+
MuxUploadSDK.logger?.debug("registerUpload() called for an unstarted upload")
125+
return
126+
}
127+
128+
uploadsByID.updateValue(upload, forKey: upload.id)
124129
fileWorker.addDelegate(withToken: UUID().uuidString, uploaderDelegate)
125130
Task.detached {
126131
await self.uploadActor.updateUpload(

apps/Test App/Upload Test App.xcodeproj/project.pbxproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,7 @@
466466
CODE_SIGN_STYLE = Automatic;
467467
CURRENT_PROJECT_VERSION = 1;
468468
DEVELOPMENT_ASSET_PATHS = "\"Test App/Preview Content\"";
469-
DEVELOPMENT_TEAM = CX6AHWLHM6;
469+
DEVELOPMENT_TEAM = "";
470470
ENABLE_PREVIEWS = YES;
471471
GENERATE_INFOPLIST_FILE = YES;
472472
INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "This app uploads photos from your camera roll";
@@ -498,7 +498,7 @@
498498
CODE_SIGN_STYLE = Automatic;
499499
CURRENT_PROJECT_VERSION = 1;
500500
DEVELOPMENT_ASSET_PATHS = "\"Test App/Preview Content\"";
501-
DEVELOPMENT_TEAM = CX6AHWLHM6;
501+
DEVELOPMENT_TEAM = "";
502502
ENABLE_PREVIEWS = YES;
503503
GENERATE_INFOPLIST_FILE = YES;
504504
INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "This app uploads photos from your camera roll";

0 commit comments

Comments
 (0)