Class: RateLimitAdapter

Inherits:
Faraday::Middleware
  • Object
show all
Defined in:
app/middleware/rate_limit_adapter.rb

Instance Method Summary collapse

Constructor Details

#initialize(app, options = {}) ⇒ RateLimitAdapter

Returns a new instance of RateLimitAdapter.



2
3
4
5
6
7
8
# File 'app/middleware/rate_limit_adapter.rb', line 2

def initialize(app, options = {})
  super(app)
  @rate_limit_key = options[:rate_limit_key] || 'default_rate_limit'
  @max_requests = options[:max_requests] || 60
  @duration = options[:duration] || 3600 # seconds
  @max_wait_time = options[:max_wait_time] || 30 # seconds
end

Instance Method Details

#call(env) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'app/middleware/rate_limit_adapter.rb', line 10

def call(env)
  # Attempt to reserve a request slot atomically
  reservation = reserve_request_slot
  wait_time = reservation[:wait_time]

  if wait_time.to_i > @max_wait_time
    release_request_slot # Undo the reservation
    raise Faraday::Error,
          "Rate limit exceeded for limit #{@rate_limit_key}: Required wait time (#{wait_time}s) exceeds max wait time (#{@max_wait_time}s)"
  end

  if wait_time.positive?
    Rails.logger.info("Rate limit exceeded for limit #{@rate_limit_key}: Waiting for #{wait_time}s")
    sleep(wait_time)
  end

  @app.call(env)
end