lib/klaviyo-api-sdk.rb in klaviyo-api-sdk-10.0.0 vs lib/klaviyo-api-sdk.rb in klaviyo-api-sdk-11.0.0
- old
+ new
@@ -658,36 +658,49 @@
original_class = KlaviyoAPI.const_get(c)
# recreate methods
original_class.public_instance_methods(false).each do |m|
wrapper_class.class_eval {
- define_singleton_method m do |*arg|
- # max_delay=60, max_retries=3
- # retry_codes = [429,503,504]
- # only add retriable if both of these are not set
- max_retries = Configuration.default.max_retries
- max_delay = Configuration.default.max_delay
-
- if (max_retries != nil && max_delay != nil)
- Retriable.configure do |c|
- c.tries = max_retries
- c.max_elapsed_time = max_delay
- c.on = {
- KlaviyoAPI::ApiError => [/429/, /503/, /504/]
- }
- end
- Retriable.retriable do
- KlaviyoAPI.const_get(c).new.send(m, *arg)
- end
- else
+ define_singleton_method m do |*arg|
+ max_retries = Configuration.default.max_retries || 3
+ max_delay = Configuration.default.max_delay || 60
+ KlaviyoAPI.with_retry(max_retries, max_delay) do
KlaviyoAPI.const_get(c).new.send(m, *arg)
end
end
}
end
end
end
@is_initialized = true
+ end
+ end
+
+ def with_retry(tries, max_elapsed_time)
+ start_time = Time.now
+ elapsed_time = -> { Time.now - start_time }
+ last_request_retry_after = nil
+ last_request_timestamp = nil
+ index = 0
+ attempt = 0
+ last_exception = nil
+ while true
+ begin
+ retry_after_value_elapsed = last_request_retry_after == nil || Time.now - last_request_timestamp > Integer(last_request_retry_after)
+ if retry_after_value_elapsed
+ attempt += 1
+ return yield
+ end
+ rescue KlaviyoAPI::ApiError => exception
+ last_exception = exception
+ last_request_retry_after = exception.response_headers[:'Retry-After']
+ last_request_timestamp = Time.now
+ raise unless [429, 503, 504, 524].include? exception.code
+ end
+ interval = Retriable::ExponentialBackoff.new(tries: index + 1).intervals[index]
+ raise last_exception if attempt >= tries || (elapsed_time.call + interval) > max_elapsed_time
+ sleep interval
+ index += 1
end
end
end
end