@@ -13,6 +13,24 @@ public extension APIClient {
13
13
/// - auth: The closure that creates an `AuthModifier` for the new token. Default to `.bearer(token:)`.
14
14
///
15
15
/// - Warning: Don't use this modifier with `.auth(_ modifier:)` as it will be override it.
16
+ ///
17
+ /// ### Example Usage:
18
+ /// #### Initial Token Request
19
+ /// ```swift
20
+ /// let client = APIClient()
21
+ /// .tokenRefresher { refreshToken, client, _ in
22
+ /// let response: AuthResponse = try await client("refresh").post(RefreshRequest(token: refreshToken)))
23
+ /// return (response.accessToken, response.refreshToken, response.expiryDate)
24
+ /// }
25
+ ///
26
+ /// func login(_ body: LoginBody) async throws {
27
+ /// let response: AuthResponse = try await client("login").auth(enabled: false).post(body)
28
+ /// // Tokens must be cached.
29
+ /// try await SecureCacheService.keychain.save(response.accessToken, for: .accessToken)
30
+ /// try await SecureCacheService.keychain.save(response.refreshToken, for: .refreshToken)
31
+ /// try await SecureCacheService.keychain.save(response.expiryDate, for: .expiryDate)
32
+ /// }
33
+ /// ```
16
34
func tokenRefresher(
17
35
cacheService: SecureCacheService = valueFor ( live: . keychain, test: . mock) ,
18
36
expiredStatusCodes: Set < HTTPResponse . Status > = [ . unauthorized] ,
@@ -41,6 +59,24 @@ public extension APIClient {
41
59
/// - auth: The closure that creates an `AuthModifier` for the new token. Default to `.bearer(token:)`.
42
60
///
43
61
/// - Warning: Don't use this modifier with `.auth(_ modifier:)` as it will be override it.
62
+ ///
63
+ /// ### Example Usage:
64
+ /// #### Initial Token Request
65
+ /// ```swift
66
+ /// let client = APIClient()
67
+ /// .tokenRefresher(cacheService: cacheService) { refreshToken, client, _ in
68
+ /// let response: AuthResponse = try await client("refresh").post(RefreshRequest(token: refreshToken)))
69
+ /// return (response.accessToken, response.refreshToken, response.expiryDate)
70
+ /// }
71
+ ///
72
+ /// func login(_ body: LoginBody) async throws {
73
+ /// let response: AuthResponse = try await client("login").auth(enabled: false).post(body)
74
+ /// // Tokens must be cached.
75
+ /// try await cacheService.save(response.accessToken, for: .accessToken)
76
+ /// try await cacheService.save(response.refreshToken, for: .refreshToken)
77
+ /// try await cacheService.save(response.expiryDate, for: .expiryDate)
78
+ /// }
79
+ /// ```
44
80
func tokenRefresher(
45
81
cacheService: SecureCacheService ,
46
82
expiredStatusCodes: Set < HTTPResponse . Status > = [ . unauthorized] ,
@@ -148,6 +184,6 @@ public struct TokenRefresherMiddleware: HTTPClientMiddleware {
148
184
}
149
185
150
186
public struct TokenNotFound : Error {
151
-
152
- public init ( ) { }
187
+
188
+ public init ( ) { }
153
189
}
0 commit comments