Class: Anvil::RateLimiter

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

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_delayObject (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_retriesObject (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_retryObject



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.message}" if retries > max_retries

    delay = exponential_backoff(retries)
    sleep(delay)
  end
end