Class: Anvil::RateLimiter
- Inherits:
-
Object
- Object
- Anvil::RateLimiter
- Defined in:
- lib/anvil/rate_limiter.rb
Constant Summary collapse
- MAX_RETRIES =
3- BASE_DELAY =
Base delay in seconds
1.0
Instance Attribute Summary collapse
-
#base_delay ⇒ Object
readonly
Returns the value of attribute base_delay.
-
#max_retries ⇒ Object
readonly
Returns the value of attribute max_retries.
Instance Method Summary collapse
-
#initialize(max_retries: MAX_RETRIES, base_delay: BASE_DELAY) ⇒ RateLimiter
constructor
A new instance of RateLimiter.
- #with_retry ⇒ Object
Constructor Details
#initialize(max_retries: MAX_RETRIES, base_delay: BASE_DELAY) ⇒ RateLimiter
Returns a new instance of RateLimiter.
10 11 12 13 |
# File 'lib/anvil/rate_limiter.rb', line 10 def initialize(max_retries: MAX_RETRIES, base_delay: BASE_DELAY) @max_retries = max_retries @base_delay = base_delay end |
Instance Attribute Details
#base_delay ⇒ Object (readonly)
Returns the value of attribute base_delay.
8 9 10 |
# File 'lib/anvil/rate_limiter.rb', line 8 def base_delay @base_delay end |
#max_retries ⇒ Object (readonly)
Returns the value of attribute max_retries.
8 9 10 |
# File 'lib/anvil/rate_limiter.rb', line 8 def max_retries @max_retries end |
Instance Method Details
#with_retry ⇒ Object
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/anvil/rate_limiter.rb', line 15 def with_retry retries = 0 last_error = nil loop do response = yield # Check if we got rate limited if response.code == 429 retries += 1 if retries > max_retries raise RateLimitError.new( "Rate limit exceeded after #{max_retries} retries", response ) end delay = calculate_delay(response, retries) sleep(delay) next end return response rescue Timeout::Error, Errno::ECONNREFUSED, Errno::ECONNRESET => e last_error = e retries += 1 raise NetworkError, "Network error after #{max_retries} retries: #{e.}" if retries > max_retries delay = exponential_backoff(retries) sleep(delay) end end |