Class: Airtable::ORM::Http::RateLimiter

Inherits:
Faraday::Middleware
  • Object
show all
Defined in:
lib/airtable/orm/http/rate_limiter.rb

Instance Method Summary collapse

Constructor Details

#initialize(app, requests_per_second: nil, sleeper: nil) ⇒ RateLimiter

Returns a new instance of RateLimiter.



7
8
9
10
11
12
13
# File 'lib/airtable/orm/http/rate_limiter.rb', line 7

def initialize(app, requests_per_second: nil, sleeper: nil)
  super(app)
  @rps = requests_per_second
  @sleeper = sleeper || ->(seconds) { sleep(seconds) }
  @mutex = Mutex.new
  @requests = []
end

Instance Method Details

#call(env) ⇒ Object



15
16
17
18
19
20
21
22
# File 'lib/airtable/orm/http/rate_limiter.rb', line 15

def call(env)
  @mutex.synchronize do
    wait if too_many_requests_in_last_second?
    @requests << Process.clock_gettime(Process::CLOCK_MONOTONIC)
    @requests.shift if @rps && @requests.size > @rps
  end
  @app.call(env)
end

#clearObject



24
25
26
# File 'lib/airtable/orm/http/rate_limiter.rb', line 24

def clear
  @mutex.synchronize { @requests = [] }
end