Class: RateLimitAdapter
- Inherits:
-
Faraday::Middleware
- Object
- Faraday::Middleware
- RateLimitAdapter
- Defined in:
- app/middleware/rate_limit_adapter.rb
Instance Method Summary collapse
- #call(env) ⇒ Object
-
#initialize(app, options = {}) ⇒ RateLimitAdapter
constructor
A new instance of RateLimitAdapter.
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, = {}) super(app) @rate_limit_key = [:rate_limit_key] || 'default_rate_limit' @max_requests = [:max_requests] || 60 @duration = [:duration] || 3600 # seconds @max_wait_time = [: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 |