Class: Notion::Middleware::RateLimiter

Inherits:
Object
  • Object
show all
Defined in:
lib/notion/middleware/rate_limiter.rb

Defined Under Namespace

Classes: MemoryStore, State

Constant Summary collapse

DEFAULT_STORE =
MemoryStore.new

Instance Method Summary collapse

Constructor Details

#initialize(app, rate:, burst:, key: nil, store: DEFAULT_STORE, clock: Process.method(:clock_gettime), sleeper: Kernel.method(:sleep)) ⇒ RateLimiter

Returns a new instance of RateLimiter.



23
24
25
26
27
28
29
30
31
32
33
# File 'lib/notion/middleware/rate_limiter.rb', line 23

def initialize(
  app, rate:, burst:, key: nil, store: DEFAULT_STORE,
  clock: Process.method(:clock_gettime), sleeper: Kernel.method(:sleep)
)
  @app = app
  @rate = rate.to_f
  @burst = burst.to_f
  @clock = clock
  @sleeper = sleeper
  @state = store.state(key && [key, @rate, @burst], @burst, monotonic)
end

Instance Method Details

#call(request) ⇒ Object



35
36
37
38
39
40
# File 'lib/notion/middleware/rate_limiter.rb', line 35

def call(request)
  wait
  response = @app.call(request)
  pause(response.headers["retry-after"].to_f, response) if response.status == 429
  response
end