Class: DuffelAPI::Middlewares::RateLimiter

Inherits:
Faraday::Middleware
  • Object
show all
Defined in:
lib/duffel_api/middlewares/rate_limiter.rb

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

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

Returns a new instance of RateLimiter.



17
18
19
# File 'lib/duffel_api/middlewares/rate_limiter.rb', line 17

def initialize(app, options = {})
  super(app, options)
end

Class Attribute Details

.ratelimit_limitObject

Returns the value of attribute ratelimit_limit.



10
11
12
# File 'lib/duffel_api/middlewares/rate_limiter.rb', line 10

def ratelimit_limit
  @ratelimit_limit
end

.ratelimit_remainingObject

Returns the value of attribute ratelimit_remaining.



10
11
12
# File 'lib/duffel_api/middlewares/rate_limiter.rb', line 10

def ratelimit_remaining
  @ratelimit_remaining
end

.ratelimit_resetObject

Returns the value of attribute ratelimit_reset.



10
11
12
# File 'lib/duffel_api/middlewares/rate_limiter.rb', line 10

def ratelimit_reset
  @ratelimit_reset
end

Class Method Details

.mutexObject



12
13
14
# File 'lib/duffel_api/middlewares/rate_limiter.rb', line 12

def mutex
  @mutex ||= Mutex.new
end

Instance Method Details

#call(env) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/duffel_api/middlewares/rate_limiter.rb', line 21

def call(env)
  sleep_until_ratelimit_reset if rate_limited?

  app.call(env).tap do |response|
    headers = response.env.response_headers

    RateLimiter.mutex.synchronize do
      RateLimiter.ratelimit_limit = new_ratelimit_limit(headers)
      RateLimiter.ratelimit_remaining = new_ratelimit_remaining(headers)
      RateLimiter.ratelimit_reset = new_ratelimit_reset(headers)
    end
  end
end