Sources/OSS/Retry/StandardRetryer.swift (34 lines of code) (raw):
import Foundation
struct StandardRetryer: Retryer {
private let maxAttempt: Int
private let backoff: Backoff
private let errorRetryable: [ErrorRetryable]
public init(
maxAttempt: Int? = nil,
backoff: Backoff? = nil,
errorRetryable: [ErrorRetryable]? = nil
) {
self.maxAttempt = maxAttempt ?? Defaults.maxAttempt
self.backoff = backoff ??
FullJitterBackoff(
baseDelay: Defaults.baseDelay,
maxBackoff: Defaults.maxBackoff
)
self.errorRetryable = errorRetryable ??
[ServiceErrorRetryable(), ClientErrorRetryable()]
}
func maxAttempts() -> Int {
return maxAttempt
}
func isErrorRetryable(error: Error) -> Bool {
for retryable in errorRetryable {
if retryable.isErrorRetryable(error: error) {
return true
}
}
return false
}
func retryDelay(attempt: Int, error: Error) -> TimeInterval {
return backoff.backoffDelay(attempt: attempt, error: error)
}
}