Class: BetterTranslate::RateLimiter

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

Overview

Thread-safe rate limiter

Ensures requests are spaced out by a minimum delay.

Examples:

Basic usage

limiter = RateLimiter.new(delay: 0.5)
limiter.wait  # Waits if needed
# Make API request
limiter.record_request

In a loop

limiter = RateLimiter.new(delay: 1.0)
translations.each do |text|
  limiter.wait
  result = translate_api_call(text)
  limiter.record_request
end

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(delay: 0.5) ⇒ RateLimiter

Initialize a new rate limiter

Examples:

Create rate limiter with 1 second delay

limiter = RateLimiter.new(delay: 1.0)

Parameters:

  • delay (Float) (defaults to: 0.5)

    Delay in seconds between requests



33
34
35
36
37
# File 'lib/better_translate/rate_limiter.rb', line 33

def initialize(delay: 0.5)
  @delay = delay
  @last_request_time = nil
  @mutex = Mutex.new
end

Instance Attribute Details

#delayFloat (readonly)

Returns Delay between requests in seconds.

Returns:

  • (Float)

    Delay between requests in seconds



24
25
26
# File 'lib/better_translate/rate_limiter.rb', line 24

def delay
  @delay
end

Instance Method Details

#record_requestvoid

This method returns an undefined value.

Record that a request was made

Should be called immediately after making a request.

Examples:

Record request timestamp

response = api_client.post(data)
limiter.record_request


75
76
77
# File 'lib/better_translate/rate_limiter.rb', line 75

def record_request
  @mutex.synchronize { @last_request_time = Time.now }
end

#resetvoid

This method returns an undefined value.

Reset the rate limiter

Clears the last request time. Useful for testing or when switching contexts.

Examples:

Reset limiter

limiter.reset


89
90
91
# File 'lib/better_translate/rate_limiter.rb', line 89

def reset
  @mutex.synchronize { @last_request_time = nil }
end

#waitvoid

This method returns an undefined value.

Wait if necessary to respect rate limit

Calculates time elapsed since last request and sleeps for the remaining time if needed.

Examples:

Wait before making request

limiter.wait
response = api_client.post(data)
limiter.record_request


51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/better_translate/rate_limiter.rb', line 51

def wait
  @mutex.synchronize do
    return if @last_request_time.nil?

    last_time = @last_request_time
    return unless last_time

    elapsed = Time.now - last_time
    sleep_time = @delay - elapsed.to_f

    sleep(sleep_time) if sleep_time.positive?
  end
end