Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 30 additions & 30 deletions Sources/EZNetworking/Util/Downloader/FileDownloader.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,34 @@ public class FileDownloader: FileDownloadable {
self.decoder = decoder
}

// MARK: Async Await
// MARK: - CORE - AsyncStream

public func downloadFileStream(from serverUrl: URL) -> AsyncStream<DownloadStreamEvent> {
AsyncStream { continuation in
configureProgressTracking { progress in
continuation.yield(.progress(progress))
}
let task = Task {
do {
let (localURL, response) = try await session.urlSession.download(from: serverUrl, delegate: nil)
try validator.validateStatus(from: response)
let url = try validator.validateUrl(localURL)
continuation.yield(.success(url))
continuation.finish()
} catch is CancellationError {
// optional: silently finish or emit failure
} catch {
continuation.yield(.failure(mapError(error)))
continuation.finish()
}
}
continuation.onTermination = { @Sendable _ in
task.cancel()
}
}
}

// MARK: - Adapter - async/await

public func downloadFile(
from serverUrl: URL,
Expand All @@ -39,7 +66,7 @@ public class FileDownloader: FileDownloadable {
throw NetworkingError.internalError(.unknown)
}

// MARK: Completion Handler
// MARK: - Adapter - callbacks

@discardableResult
public func downloadFileTask(
Expand All @@ -57,7 +84,7 @@ public class FileDownloader: FileDownloadable {
return cancellableRequest
}

// MARK: Publisher
// MARK: - Adapter - Publisher

public func downloadFilePublisher(
from serverUrl: URL,
Expand All @@ -75,33 +102,6 @@ public class FileDownloader: FileDownloadable {
.eraseToAnyPublisher()
}

// MARK: AsyncStream

public func downloadFileStream(from serverUrl: URL) -> AsyncStream<DownloadStreamEvent> {
AsyncStream { continuation in
configureProgressTracking { progress in
continuation.yield(.progress(progress))
}
let task = Task {
do {
let (localURL, response) = try await session.urlSession.download(from: serverUrl, delegate: nil)
try validator.validateStatus(from: response)
let url = try validator.validateUrl(localURL)
continuation.yield(.success(url))
continuation.finish()
} catch is CancellationError {
// optional: silently finish or emit failure
} catch {
continuation.yield(.failure(mapError(error)))
continuation.finish()
}
}
continuation.onTermination = { @Sendable _ in
task.cancel()
}
}
}

// MARK: - Helpers

private func createTaskAndPerform(
Expand Down
8 changes: 4 additions & 4 deletions Sources/EZNetworking/Util/Performers/RequestPerformer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public struct RequestPerformer: RequestPerformable {
self.decoder = decoder
}

// MARK: Async Await
// MARK: - CORE - async/await

public func perform<T: Decodable & Sendable>(
request: Request,
Expand All @@ -33,7 +33,7 @@ public struct RequestPerformer: RequestPerformable {
}
}

// MARK: Completion Handler
// MARK: - Adapter - callbacks

@discardableResult
public func performTask<T: Decodable & Sendable>(
Expand All @@ -51,7 +51,7 @@ public struct RequestPerformer: RequestPerformable {
return cancellableRequest
}

// MARK: Publisher
// MARK: - Adapter - Publisher

public func performPublisher<T: Decodable & Sendable>(
request: Request,
Expand All @@ -69,7 +69,7 @@ public struct RequestPerformer: RequestPerformable {
.eraseToAnyPublisher()
}

// MARK: Helpers
// MARK: - Helpers

private func createTaskAndPerform<T: Decodable & Sendable>(
request: Request,
Expand Down
60 changes: 30 additions & 30 deletions Sources/EZNetworking/Util/Uploader/DataUploader/DataUploader.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,33 @@ public class DataUploader: DataUploadable {
self.validator = validator
}

// MARK: Async Await
// MARK: - CORE - AsyncStream

public func uploadDataStream(_ data: Data, with request: Request) -> AsyncStream<UploadStreamEvent> {
AsyncStream { continuation in
configureProgressTracking { progress in
continuation.yield(.progress(progress))
}
let task = Task {
do {
let urlRequest = try request.getURLRequest()
let (data, urlResponse) = try await session.urlSession.upload(for: urlRequest, from: data)
try validator.validateStatus(from: urlResponse)
let validData = try validator.validateData(data)
continuation.yield(.success(validData))
continuation.finish()
} catch {
continuation.yield(.failure(mapError(error)))
continuation.finish()
}
}
continuation.onTermination = { @Sendable _ in
task.cancel()
}
}
}

// MARK: - Adapter - async/await

public func uploadData(_ data: Data, with request: Request, progress: UploadProgressHandler?) async throws -> Data {
for await event in uploadDataStream(data, with: request) {
Expand All @@ -33,7 +59,7 @@ public class DataUploader: DataUploadable {
throw NetworkingError.internalError(.unknown)
}

// MARK: Completion Handler
// MARK: - Adapter - callbacks

@discardableResult
public func uploadDataTask(_ data: Data, with request: Request, progress: UploadProgressHandler?, completion: @escaping (UploadCompletionHandler)) -> CancellableRequest {
Expand All @@ -47,7 +73,7 @@ public class DataUploader: DataUploadable {
return cancellableRequest
}

// MARK: Publisher
// MARK: - Adapter - Publisher

public func uploadDataPublisher(_ data: Data, with request: Request, progress: UploadProgressHandler?) -> AnyPublisher<Data, NetworkingError> {
Deferred {
Expand All @@ -62,33 +88,7 @@ public class DataUploader: DataUploadable {
.eraseToAnyPublisher()
}

// MARK: Async Stream

public func uploadDataStream(_ data: Data, with request: Request) -> AsyncStream<UploadStreamEvent> {
AsyncStream { continuation in
configureProgressTracking { progress in
continuation.yield(.progress(progress))
}
let task = Task {
do {
let urlRequest = try request.getURLRequest()
let (data, urlResponse) = try await session.urlSession.upload(for: urlRequest, from: data)
try validator.validateStatus(from: urlResponse)
let validData = try validator.validateData(data)
continuation.yield(.success(validData))
continuation.finish()
} catch {
continuation.yield(.failure(mapError(error)))
continuation.finish()
}
}
continuation.onTermination = { @Sendable _ in
task.cancel()
}
}
}

// MARK: Helpers
// MARK: - Helpers

private func createTaskAndPerform(
_ data: Data,
Expand Down
58 changes: 29 additions & 29 deletions Sources/EZNetworking/Util/Uploader/FileUploader/FileUploader.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,33 @@ public class FileUploader: FileUploadable {
self.validator = validator
}

// MARK: Async Await
// MARK: - CORE - AsyncStream

public func uploadFileStream(_ fileURL: URL, with request: any Request) -> AsyncStream<UploadStreamEvent> {
AsyncStream { continuation in
configureProgressTracking { progress in
continuation.yield(.progress(progress))
}
let task = Task {
do {
let urlRequest = try request.getURLRequest()
let (data, urlResponse) = try await session.urlSession.upload(for: urlRequest, fromFile: fileURL)
try validator.validateStatus(from: urlResponse)
let validData = try validator.validateData(data)
continuation.yield(.success(validData))
continuation.finish()
} catch {
continuation.yield(.failure(mapError(error)))
continuation.finish()
}
}
continuation.onTermination = { @Sendable _ in
task.cancel()
}
}
}

// MARK: - Adapter - async/await

public func uploadFile(_ fileURL: URL, with request: any Request, progress: UploadProgressHandler?) async throws -> Data {
for await event in uploadFileStream(fileURL, with: request) {
Expand All @@ -33,7 +59,7 @@ public class FileUploader: FileUploadable {
throw NetworkingError.internalError(.unknown)
}

// MARK: Completion Handler
// MARK: - Adapter - callbacks

@discardableResult
public func uploadFileTask(_ fileURL: URL, with request: any Request, progress: UploadProgressHandler?, completion: @escaping UploadCompletionHandler) -> CancellableRequest? {
Expand All @@ -47,7 +73,7 @@ public class FileUploader: FileUploadable {
return cancellableRequest
}

// MARK: Publisher
// MARK: - Adapter - Publisher

public func uploadFilePublisher(_ fileURL: URL, with request: any Request, progress: UploadProgressHandler?) -> AnyPublisher<Data, NetworkingError> {
Deferred {
Expand All @@ -62,32 +88,6 @@ public class FileUploader: FileUploadable {
.eraseToAnyPublisher()
}

// MARK: AsyncStream

public func uploadFileStream(_ fileURL: URL, with request: any Request) -> AsyncStream<UploadStreamEvent> {
AsyncStream { continuation in
configureProgressTracking { progress in
continuation.yield(.progress(progress))
}
let task = Task {
do {
let urlRequest = try request.getURLRequest()
let (data, urlResponse) = try await session.urlSession.upload(for: urlRequest, fromFile: fileURL)
try validator.validateStatus(from: urlResponse)
let validData = try validator.validateData(data)
continuation.yield(.success(validData))
continuation.finish()
} catch {
continuation.yield(.failure(mapError(error)))
continuation.finish()
}
}
continuation.onTermination = { @Sendable _ in
task.cancel()
}
}
}

// MARK: - Helpers

private func createTaskAndPerform(
Expand Down
Loading