Skip to content

Commit a3c9050

Browse files
authored
Merge pull request #121 from tus/feature/add_chunksize_argument
TUSClient: Added chunkSize argument to initializer
2 parents e962b2b + 7283b4a commit a3c9050

File tree

2 files changed

+19
-9
lines changed

2 files changed

+19
-9
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
## Added
2+
- ChunkSize argument to TUSClient initializer.
3+
4+
# 3.0.0
5+
- Rewrite of TUSKit

Sources/TUSKit/TUSClient.swift

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,25 +51,28 @@ protocol ProgressDelegate: AnyObject {
5151
/// Please refer to the Readme.md on how to use this type.
5252
public final class TUSClient {
5353

54+
// MARK: - Public Properties
55+
5456
/// The number of uploads that the TUSClient will try to complete.
5557
public var remainingUploads: Int {
5658
uploads.count
5759
}
60+
public let sessionIdentifier: String
61+
public weak var delegate: TUSClientDelegate?
5862

59-
static let chunkSize: Int = 500 * 1024
63+
// MARK: - Private Properties
6064

6165
/// How often to try an upload if it fails. A retryCount of 2 means 3 total uploads max. (1 initial upload, and on repeated failure, 2 more retries.)
6266
private let retryCount = 2
6367

64-
public let sessionIdentifier: String
6568
private let files: Files
6669
private var didStopAndCancel = false
6770
private let serverURL: URL
6871
private let scheduler = Scheduler()
6972
private let api: TUSAPI
73+
private let chunkSize: Int
7074
/// Keep track of uploads and their id's
7175
private var uploads = [UUID: UploadMetadata]()
72-
public weak var delegate: TUSClientDelegate?
7376

7477
#if os(iOS)
7578
@available(iOS 13.0, *)
@@ -85,12 +88,14 @@ public final class TUSClient {
8588
/// - storageDirectory: A directory to store local files for uploading and continuing uploads. Leave nil to use the documents dir. Pass a relative path (e.g. "TUS" or "/TUS" or "/Uploads/TUS") for a relative directory inside the documents directory.
8689
/// You can also pass an absolute path, e.g. "file://uploads/TUS"
8790
/// - session: A URLSession you'd like to use. Will default to `URLSession.shared`.
91+
/// - chunkSize: The amount of bytes the data to upload will be chunked by. Defaults to 512 kB.
8892
/// - Throws: File related errors when it can't make a directory at the designated path.
89-
public init(server: URL, sessionIdentifier: String, storageDirectory: URL? = nil, session: URLSession = URLSession.shared) throws {
93+
public init(server: URL, sessionIdentifier: String, storageDirectory: URL? = nil, session: URLSession = URLSession.shared, chunkSize: Int = 500 * 1024) throws {
9094
self.sessionIdentifier = sessionIdentifier
9195
self.api = TUSAPI(session: session)
9296
self.files = try Files(storageDirectory: storageDirectory)
9397
self.serverURL = server
98+
self.chunkSize = chunkSize
9499

95100
scheduler.delegate = self
96101
removeFinishedUploads()
@@ -336,7 +341,7 @@ public final class TUSClient {
336341
uploads[id] = metaData
337342
}
338343

339-
guard let task = try taskFor(metaData: metaData, api: api, files: files, progressDelegate: self) else {
344+
guard let task = try taskFor(metaData: metaData, api: api, files: files, chunkSize: chunkSize, progressDelegate: self) else {
340345
assertionFailure("Could not find a task for metaData \(metaData)")
341346
return
342347
}
@@ -382,7 +387,7 @@ public final class TUSClient {
382387
/// Schedule a single task if needed. Will decide what task to schedule for the metaData.
383388
/// - Parameter metaData:The metaData the schedule.
384389
private func scheduleTask(for metaData: UploadMetadata) throws {
385-
guard let task = try taskFor(metaData: metaData, api: api, files: files, progressDelegate: self) else {
390+
guard let task = try taskFor(metaData: metaData, api: api, files: files, chunkSize: chunkSize, progressDelegate: self) else {
386391
throw TUSClientError.uploadIsAlreadyFinished
387392
}
388393
uploads[metaData.id] = metaData
@@ -500,17 +505,17 @@ private extension String {
500505
/// Decide which task to create based on metaData.
501506
/// - Parameter metaData: The `UploadMetadata` for which to create a `Task`.
502507
/// - Returns: The task that has to be performed for the relevant metaData. Will return nil if metaData's file is already uploaded / finished. (no task needed).
503-
func taskFor(metaData: UploadMetadata, api: TUSAPI, files: Files, progressDelegate: ProgressDelegate? = nil) throws -> ScheduledTask? {
508+
func taskFor(metaData: UploadMetadata, api: TUSAPI, files: Files, chunkSize: Int, progressDelegate: ProgressDelegate? = nil) throws -> ScheduledTask? {
504509
guard !metaData.isFinished else {
505510
return nil
506511
}
507512

508513
if let remoteDestination = metaData.remoteDestination {
509-
let statusTask = StatusTask(api: api, remoteDestination: remoteDestination, metaData: metaData, files: files, chunkSize: TUSClient.chunkSize)
514+
let statusTask = StatusTask(api: api, remoteDestination: remoteDestination, metaData: metaData, files: files, chunkSize: chunkSize)
510515
statusTask.progressDelegate = progressDelegate
511516
return statusTask
512517
} else {
513-
let creationTask = try CreationTask(metaData: metaData, api: api, files: files, chunkSize: TUSClient.chunkSize)
518+
let creationTask = try CreationTask(metaData: metaData, api: api, files: files, chunkSize: chunkSize)
514519
creationTask.progressDelegate = progressDelegate
515520
return creationTask
516521
}

0 commit comments

Comments
 (0)