Sources/OSS/Credentials/RefreshCredentialsProvider.swift (27 lines of code) (raw):
import Foundation
public final class RefreshCredentialsProvider: CredentialsProvider {
// default refresh time is 300 Second
let defaultInterval = TimeInterval(300)
let expiringCredential: ExpiringValue<Credentials>
public let provider: CredentialsProvider
public init(refreshInterval: TimeInterval? = nil, closure: @escaping GetCredentialsClosure) {
provider = ClosureCredentialsProvider(closure: closure)
expiringCredential = ExpiringValue<Credentials>(threshold: refreshInterval ?? defaultInterval)
}
public init(provider: CredentialsProvider, refreshInterval: TimeInterval? = nil) {
self.provider = provider
expiringCredential = ExpiringValue<Credentials>(threshold: refreshInterval ?? defaultInterval)
}
public func getCredentials() async throws -> Credentials {
try await expiringCredential.getValue {
try await Self.getCredentialAndExpiration(provider: self.provider)
}
}
static func getCredentialAndExpiration(provider: CredentialsProvider) async throws -> (Credentials, Date) {
try Task.checkCancellation()
let cred = try await provider.getCredentials()
if cred.expiration == nil {
return (cred, Date.distantFuture)
}
return (cred, cred.expiration!)
}
}