Class: Woods::Notion::RateLimiter

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

Overview

Thread-safe rate limiter for Notion API (3 requests/second default).

Enforces a minimum interval between API calls by sleeping when necessary. Uses a Mutex to ensure thread safety when called from concurrent contexts.

Examples:

limiter = RateLimiter.new(requests_per_second: 3)
limiter.throttle { client.create_page(...) }
limiter.throttle { client.update_page(...) }

Instance Method Summary collapse

Constructor Details

#initialize(requests_per_second: 3) ⇒ RateLimiter

Returns a new instance of RateLimiter.

Parameters:

  • requests_per_second (Numeric) (defaults to: 3)

    Maximum requests per second (default: 3)

Raises:

  • (ArgumentError)

    if requests_per_second is not positive



18
19
20
21
22
23
24
25
26
# File 'lib/woods/notion/rate_limiter.rb', line 18

def initialize(requests_per_second: 3)
  unless requests_per_second.is_a?(Numeric) && requests_per_second.positive?
    raise ArgumentError, "requests_per_second must be positive, got #{requests_per_second.inspect}"
  end

  @min_interval = 1.0 / requests_per_second
  @last_request_at = nil
  @mutex = Mutex.new
end

Instance Method Details

#throttle { ... } ⇒ Object

Execute a block after enforcing the rate limit.

Sleeps if the minimum interval since the last request hasn’t elapsed. Thread-safe — only one request proceeds at a time.

Yields:

  • The block to execute after rate limiting

Returns:

  • (Object)

    The block’s return value

Raises:

  • (ArgumentError)

    if no block is given



36
37
38
39
40
41
42
43
44
45
# File 'lib/woods/notion/rate_limiter.rb', line 36

def throttle
  raise ArgumentError, 'block required' unless block_given?

  @mutex.synchronize do
    wait_for_interval
    @last_request_at = monotonic_now
  end

  yield
end