|
|
@@ -43,7 +43,7 @@ public protocol RequestAdapter: Sendable {
|
|
|
/// - urlRequest: The `URLRequest` to adapt.
|
|
|
/// - session: The `Session` that will execute the `URLRequest`.
|
|
|
/// - completion: The completion handler that must be called when adaptation is complete.
|
|
|
- func adapt(_ urlRequest: URLRequest, for session: Session, completion: @Sendable @escaping (_ result: Result<URLRequest, any Error>) -> Void)
|
|
|
+ func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping @Sendable (_ result: Result<URLRequest, any Error>) -> Void)
|
|
|
|
|
|
/// Inspects and adapts the specified `URLRequest` in some manner and calls the completion handler with the Result.
|
|
|
///
|
|
|
@@ -51,11 +51,12 @@ public protocol RequestAdapter: Sendable {
|
|
|
/// - urlRequest: The `URLRequest` to adapt.
|
|
|
/// - state: The `RequestAdapterState` associated with the `URLRequest`.
|
|
|
/// - completion: The completion handler that must be called when adaptation is complete.
|
|
|
- func adapt(_ urlRequest: URLRequest, using state: RequestAdapterState, completion: @Sendable @escaping (_ result: Result<URLRequest, any Error>) -> Void)
|
|
|
+ func adapt(_ urlRequest: URLRequest, using state: RequestAdapterState, completion: @escaping @Sendable (_ result: Result<URLRequest, any Error>) -> Void)
|
|
|
}
|
|
|
|
|
|
extension RequestAdapter {
|
|
|
- public func adapt(_ urlRequest: URLRequest, using state: RequestAdapterState, completion: @Sendable @escaping (_ result: Result<URLRequest, any Error>) -> Void) {
|
|
|
+ @preconcurrency
|
|
|
+ public func adapt(_ urlRequest: URLRequest, using state: RequestAdapterState, completion: @escaping @Sendable (_ result: Result<URLRequest, any Error>) -> Void) {
|
|
|
adapt(urlRequest, for: state.session, completion: completion)
|
|
|
}
|
|
|
}
|
|
|
@@ -109,7 +110,7 @@ public protocol RequestRetrier: Sendable {
|
|
|
/// - session: `Session` that produced the `Request`.
|
|
|
/// - error: `Error` encountered while executing the `Request`.
|
|
|
/// - completion: Completion closure to be executed when a retry decision has been determined.
|
|
|
- func retry(_ request: Request, for session: Session, dueTo error: any Error, completion: @Sendable @escaping (RetryResult) -> Void)
|
|
|
+ func retry(_ request: Request, for session: Session, dueTo error: any Error, completion: @escaping @Sendable (RetryResult) -> Void)
|
|
|
}
|
|
|
|
|
|
// MARK: -
|
|
|
@@ -119,7 +120,7 @@ public protocol RequestInterceptor: RequestAdapter, RequestRetrier {}
|
|
|
|
|
|
extension RequestInterceptor {
|
|
|
@preconcurrency
|
|
|
- public func adapt(_ urlRequest: URLRequest, for session: Session, completion: @Sendable @escaping (Result<URLRequest, any Error>) -> Void) {
|
|
|
+ public func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping @Sendable (Result<URLRequest, any Error>) -> Void) {
|
|
|
completion(.success(urlRequest))
|
|
|
}
|
|
|
|
|
|
@@ -127,7 +128,7 @@ extension RequestInterceptor {
|
|
|
public func retry(_ request: Request,
|
|
|
for session: Session,
|
|
|
dueTo error: any Error,
|
|
|
- completion: @Sendable @escaping (RetryResult) -> Void) {
|
|
|
+ completion: @escaping @Sendable (RetryResult) -> Void) {
|
|
|
completion(.doNotRetry)
|
|
|
}
|
|
|
}
|
|
|
@@ -135,12 +136,13 @@ extension RequestInterceptor {
|
|
|
/// `RequestAdapter` closure definition.
|
|
|
public typealias AdaptHandler = @Sendable (_ request: URLRequest,
|
|
|
_ session: Session,
|
|
|
- _ completion: @escaping (Result<URLRequest, any Error>) -> Void) -> Void
|
|
|
+ _ completion: @escaping @Sendable (Result<URLRequest, any Error>) -> Void) -> Void
|
|
|
+
|
|
|
/// `RequestRetrier` closure definition.
|
|
|
public typealias RetryHandler = @Sendable (_ request: Request,
|
|
|
_ session: Session,
|
|
|
_ error: any Error,
|
|
|
- _ completion: @escaping (RetryResult) -> Void) -> Void
|
|
|
+ _ completion: @escaping @Sendable (RetryResult) -> Void) -> Void
|
|
|
|
|
|
// MARK: -
|
|
|
|
|
|
@@ -158,12 +160,12 @@ open class Adapter: @unchecked Sendable, RequestInterceptor {
|
|
|
}
|
|
|
|
|
|
@preconcurrency
|
|
|
- open func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, any Error>) -> Void) {
|
|
|
+ open func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping @Sendable (Result<URLRequest, any Error>) -> Void) {
|
|
|
adaptHandler(urlRequest, session, completion)
|
|
|
}
|
|
|
|
|
|
@preconcurrency
|
|
|
- open func adapt(_ urlRequest: URLRequest, using state: RequestAdapterState, completion: @escaping (Result<URLRequest, any Error>) -> Void) {
|
|
|
+ open func adapt(_ urlRequest: URLRequest, using state: RequestAdapterState, completion: @escaping @Sendable (Result<URLRequest, any Error>) -> Void) {
|
|
|
adaptHandler(urlRequest, state.session, completion)
|
|
|
}
|
|
|
}
|
|
|
@@ -173,6 +175,7 @@ extension RequestAdapter where Self == Adapter {
|
|
|
///
|
|
|
/// - Parameter closure: `AdaptHandler` to use to adapt the request.
|
|
|
/// - Returns: The `Adapter`.
|
|
|
+ @preconcurrency
|
|
|
public static func adapter(using closure: @escaping AdaptHandler) -> Adapter {
|
|
|
Adapter(closure)
|
|
|
}
|
|
|
@@ -192,10 +195,11 @@ open class Retrier: @unchecked Sendable, RequestInterceptor {
|
|
|
self.retryHandler = retryHandler
|
|
|
}
|
|
|
|
|
|
+ @preconcurrency
|
|
|
open func retry(_ request: Request,
|
|
|
for session: Session,
|
|
|
dueTo error: any Error,
|
|
|
- completion: @escaping (RetryResult) -> Void) {
|
|
|
+ completion: @escaping @Sendable (RetryResult) -> Void) {
|
|
|
retryHandler(request, session, error, completion)
|
|
|
}
|
|
|
}
|
|
|
@@ -205,6 +209,7 @@ extension RequestRetrier where Self == Retrier {
|
|
|
///
|
|
|
/// - Parameter closure: `RetryHandler` to use to retry the request.
|
|
|
/// - Returns: The `Retrier`.
|
|
|
+ @preconcurrency
|
|
|
public static func retrier(using closure: @escaping RetryHandler) -> Retrier {
|
|
|
Retrier(closure)
|
|
|
}
|
|
|
@@ -253,14 +258,14 @@ open class Interceptor: @unchecked Sendable, RequestInterceptor {
|
|
|
}
|
|
|
|
|
|
@preconcurrency
|
|
|
- open func adapt(_ urlRequest: URLRequest, for session: Session, completion: @Sendable @escaping (Result<URLRequest, any Error>) -> Void) {
|
|
|
+ open func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping @Sendable (Result<URLRequest, any Error>) -> Void) {
|
|
|
adapt(urlRequest, for: session, using: adapters, completion: completion)
|
|
|
}
|
|
|
|
|
|
private func adapt(_ urlRequest: URLRequest,
|
|
|
for session: Session,
|
|
|
using adapters: [any RequestAdapter],
|
|
|
- completion: @Sendable @escaping (Result<URLRequest, any Error>) -> Void) {
|
|
|
+ completion: @escaping @Sendable (Result<URLRequest, any Error>) -> Void) {
|
|
|
var pendingAdapters = adapters
|
|
|
|
|
|
guard !pendingAdapters.isEmpty else { completion(.success(urlRequest)); return }
|
|
|
@@ -278,14 +283,14 @@ open class Interceptor: @unchecked Sendable, RequestInterceptor {
|
|
|
}
|
|
|
|
|
|
@preconcurrency
|
|
|
- open func adapt(_ urlRequest: URLRequest, using state: RequestAdapterState, completion: @Sendable @escaping (Result<URLRequest, any Error>) -> Void) {
|
|
|
+ open func adapt(_ urlRequest: URLRequest, using state: RequestAdapterState, completion: @escaping @Sendable (Result<URLRequest, any Error>) -> Void) {
|
|
|
adapt(urlRequest, using: state, adapters: adapters, completion: completion)
|
|
|
}
|
|
|
|
|
|
private func adapt(_ urlRequest: URLRequest,
|
|
|
using state: RequestAdapterState,
|
|
|
adapters: [any RequestAdapter],
|
|
|
- completion: @Sendable @escaping (Result<URLRequest, any Error>) -> Void) {
|
|
|
+ completion: @escaping @Sendable (Result<URLRequest, any Error>) -> Void) {
|
|
|
var pendingAdapters = adapters
|
|
|
|
|
|
guard !pendingAdapters.isEmpty else { completion(.success(urlRequest)); return }
|
|
|
@@ -306,7 +311,7 @@ open class Interceptor: @unchecked Sendable, RequestInterceptor {
|
|
|
open func retry(_ request: Request,
|
|
|
for session: Session,
|
|
|
dueTo error: any Error,
|
|
|
- completion: @Sendable @escaping (RetryResult) -> Void) {
|
|
|
+ completion: @escaping @Sendable (RetryResult) -> Void) {
|
|
|
retry(request, for: session, dueTo: error, using: retriers, completion: completion)
|
|
|
}
|
|
|
|
|
|
@@ -314,7 +319,7 @@ open class Interceptor: @unchecked Sendable, RequestInterceptor {
|
|
|
for session: Session,
|
|
|
dueTo error: any Error,
|
|
|
using retriers: [any RequestRetrier],
|
|
|
- completion: @Sendable @escaping (RetryResult) -> Void) {
|
|
|
+ completion: @escaping @Sendable (RetryResult) -> Void) {
|
|
|
var pendingRetriers = retriers
|
|
|
|
|
|
guard !pendingRetriers.isEmpty else { completion(.doNotRetry); return }
|
|
|
@@ -340,6 +345,7 @@ extension RequestInterceptor where Self == Interceptor {
|
|
|
/// - adapter: `AdapterHandler`to use to adapt the request.
|
|
|
/// - retrier: `RetryHandler` to use to retry the request.
|
|
|
/// - Returns: The `Interceptor`.
|
|
|
+ @preconcurrency
|
|
|
public static func interceptor(adapter: @escaping AdaptHandler, retrier: @escaping RetryHandler) -> Interceptor {
|
|
|
Interceptor(adaptHandler: adapter, retryHandler: retrier)
|
|
|
}
|
|
|
@@ -349,6 +355,7 @@ extension RequestInterceptor where Self == Interceptor {
|
|
|
/// - adapter: `RequestAdapter` to use to adapt the request
|
|
|
/// - retrier: `RequestRetrier` to use to retry the request.
|
|
|
/// - Returns: The `Interceptor`.
|
|
|
+ @preconcurrency
|
|
|
public static func interceptor(adapter: any RequestAdapter, retrier: any RequestRetrier) -> Interceptor {
|
|
|
Interceptor(adapter: adapter, retrier: retrier)
|
|
|
}
|
|
|
@@ -360,6 +367,7 @@ extension RequestInterceptor where Self == Interceptor {
|
|
|
/// a retry is triggered.
|
|
|
/// - interceptors: `RequestInterceptor`s to use to intercept the request.
|
|
|
/// - Returns: The `Interceptor`.
|
|
|
+ @preconcurrency
|
|
|
public static func interceptor(adapters: [any RequestAdapter] = [],
|
|
|
retriers: [any RequestRetrier] = [],
|
|
|
interceptors: [any RequestInterceptor] = []) -> Interceptor {
|