From c9614e50f18077159ed0b5474cfc970c920efe10 Mon Sep 17 00:00:00 2001 From: dankinsoid <30962149+dankinsoid@users.noreply.github.com> Date: Wed, 10 Apr 2024 16:13:40 +0300 Subject: [PATCH] 1.6.7 --- README.md | 2 +- .../TokenRefresher/TokenRefresher.swift | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b648ebd..bc1ef90 100644 --- a/README.md +++ b/README.md @@ -326,7 +326,7 @@ import PackageDescription let package = Package( name: "SomeProject", dependencies: [ - .package(url: "https://github.com/dankinsoid/swift-api-client.git", from: "1.6.6") + .package(url: "https://github.com/dankinsoid/swift-api-client.git", from: "1.6.7") ], targets: [ .target( diff --git a/Sources/SwiftAPIClient/Modifiers/TokenRefresher/TokenRefresher.swift b/Sources/SwiftAPIClient/Modifiers/TokenRefresher/TokenRefresher.swift index 1550d7c..1ebe3a7 100644 --- a/Sources/SwiftAPIClient/Modifiers/TokenRefresher/TokenRefresher.swift +++ b/Sources/SwiftAPIClient/Modifiers/TokenRefresher/TokenRefresher.swift @@ -2,6 +2,7 @@ public extension APIClient { +#if canImport(Security) /// Adds a `TokenRefresherMiddleware` to the client. /// `TokenRefresherMiddleware` is used to refresh the token when it expires. /// - Parameters: @@ -29,6 +30,35 @@ public extension APIClient { ) ) } +#else + /// Adds a `TokenRefresherMiddleware` to the client. + /// `TokenRefresherMiddleware` is used to refresh the token when it expires. + /// - Parameters: + /// - cacheService: The `SecureCacheService` to use for caching the token. Default to `.keychain`. + /// - expiredStatusCodes: The set of status codes that indicate an expired token. Default to `[401]`. + /// - request: The closure to use for requesting a new token and refresh token first time. Set to `nil` if you want to request and cache tokens manually. + /// - refresh: The closure to use for refreshing a new token with refresh token. + /// - auth: The closure that creates an `AuthModifier` for the new token. Default to `.bearer(token:)`. + /// + /// - Warning: Don't use this modifier with `.auth(_ modifier:)` as it will be override it. + func tokenRefresher( + cacheService: SecureCacheService, + expiredStatusCodes: Set = [.unauthorized], + request: ((APIClient, APIClient.Configs) async throws -> (accessToken: String, refreshToken: String?, expiryDate: Date?))? = nil, + refresh: @escaping (_ refreshToken: String?, APIClient, APIClient.Configs) async throws -> (accessToken: String, refreshToken: String?, expiryDate: Date?), + auth: @escaping (String) -> AuthModifier = AuthModifier.bearer + ) -> Self { + httpClientMiddleware( + TokenRefresherMiddleware( + cacheService: cacheService, + expiredStatusCodes: expiredStatusCodes, + request: request.map { request in { try await request(self, $0) } }, + refresh: { try await refresh($0, self, $1) }, + auth: auth + ) + ) + } +#endif } public struct TokenRefresherMiddleware: HTTPClientMiddleware {