@@ -24,17 +24,46 @@ import struct Foundation.TimeInterval
24
24
///
25
25
/// Used for wrapping another credential provider whose `getCredential` method returns an `ExpiringCredential`.
26
26
/// If no credential is available, or the current credentials are going to expire in the near future the wrapped credential provider
27
- /// `getCredential` is called again. If current credentials have not expired they are returned otherwise we wait on new
27
+ /// `getCredential` is called again. If current credentials have not expired (within a threshold) they are returned otherwise we wait on new
28
28
/// credentials being provided.
29
29
public final class RotatingCredentialProvider : CredentialProvider {
30
30
let expiringCredential : ExpiringValue < Credential >
31
-
31
+ let validCredentialThreshold : TimeInterval
32
32
public let provider : CredentialProvider
33
33
34
- public init ( context: CredentialProviderFactory . Context , provider: CredentialProvider , remainingTokenLifetimeForUse: TimeInterval ? = nil ) {
34
+ /// Initialize RotatingCredentialProvider
35
+ /// - Parameters:
36
+ /// - context: Context used to create this credential provider
37
+ /// - provider: Credential provider to request credentials from
38
+ /// - remainingTokenLifetimeForUse: How near to expiration, before we request new credentials
39
+ public init (
40
+ context: CredentialProviderFactory . Context ,
41
+ provider: CredentialProvider ,
42
+ remainingTokenLifetimeForUse: TimeInterval ? = nil
43
+ ) {
44
+ self . provider = provider
45
+ self . validCredentialThreshold = 15
46
+ self . expiringCredential = . init( threshold: remainingTokenLifetimeForUse ?? 165 ) {
47
+ try await Self . getCredentialAndExpiration ( provider: provider, validCredentialThreshold: 15 , logger: context. logger)
48
+ }
49
+ }
50
+
51
+ /// Initialize RotatingCredentialProvider
52
+ /// - Parameters:
53
+ /// - context: Context used to create this credential provider
54
+ /// - provider: Credential provider to request credentials from
55
+ /// - remainingTokenLifetimeForUse: How near to expiration, before we request new credentials
56
+ /// - validCredentialThreshold: How near to expiration do we return the current credentials
57
+ public init (
58
+ context: CredentialProviderFactory . Context ,
59
+ provider: CredentialProvider ,
60
+ remainingTokenLifetimeForUse: TimeInterval ? = nil ,
61
+ validCredentialThreshold: TimeInterval
62
+ ) {
35
63
self . provider = provider
64
+ self . validCredentialThreshold = validCredentialThreshold
36
65
self . expiringCredential = . init( threshold: remainingTokenLifetimeForUse ?? 3 * 60 ) {
37
- try await Self . getCredentialAndExpiration ( provider: provider, logger: context. logger)
66
+ try await Self . getCredentialAndExpiration ( provider: provider, validCredentialThreshold : validCredentialThreshold , logger: context. logger)
38
67
}
39
68
}
40
69
@@ -51,17 +80,34 @@ public final class RotatingCredentialProvider: CredentialProvider {
51
80
52
81
public func getCredential( logger: Logger ) async throws -> Credential {
53
82
try await self . expiringCredential. getValue {
54
- try await Self . getCredentialAndExpiration ( provider: self . provider, logger: logger)
83
+ try await Self . getCredentialAndExpiration (
84
+ provider: self . provider,
85
+ validCredentialThreshold: self . validCredentialThreshold,
86
+ logger: logger
87
+ )
55
88
}
56
89
}
57
90
58
- static func getCredentialAndExpiration( provider: CredentialProvider , logger: Logger ) async throws -> ( Credential , Date ) {
59
- logger. debug ( " Refeshing AWS credentials " , metadata: [ " aws-credential-provider " : . string( " \( self ) ( \( provider. description) ) " ) ] )
91
+ static func getCredentialAndExpiration(
92
+ provider: CredentialProvider ,
93
+ validCredentialThreshold: TimeInterval ,
94
+ logger: Logger
95
+ ) async throws -> ( Credential , Date ) {
96
+ logger. debug (
97
+ " Refeshing AWS credentials " ,
98
+ metadata: [ " aws-credential-provider " : . string( " \( self ) ( \( provider. description) ) " ) ]
99
+ )
60
100
try Task . checkCancellation ( )
61
101
let credential = try await provider. getCredential ( logger: logger)
62
- logger. debug ( " AWS credentials ready " , metadata: [ " aws-credential-provider " : . string( " \( self ) ( \( provider. description) ) " ) ] )
102
+ logger. debug (
103
+ " AWS credentials ready " ,
104
+ metadata: [ " aws-credential-provider " : . string( " \( self ) ( \( provider. description) ) " ) ]
105
+ )
63
106
if let expiringCredential = credential as? ExpiringCredential {
64
- return ( expiringCredential, expiringCredential. expiration)
107
+ return (
108
+ expiringCredential,
109
+ expiringCredential. expiration. addingTimeInterval ( - validCredentialThreshold)
110
+ )
65
111
} else {
66
112
return ( credential, Date . distantFuture)
67
113
}
0 commit comments