Class: BetterTranslate::RateLimiter
- Inherits:
-
Object
- Object
- BetterTranslate::RateLimiter
- Defined in:
- lib/better_translate/rate_limiter.rb
Overview
Thread-safe rate limiter
Ensures requests are spaced out by a minimum delay.
Instance Attribute Summary collapse
-
#delay ⇒ Float
readonly
Delay between requests in seconds.
Instance Method Summary collapse
-
#initialize(delay: 0.5) ⇒ RateLimiter
constructor
Initialize a new rate limiter.
-
#record_request ⇒ void
Record that a request was made.
-
#reset ⇒ void
Reset the rate limiter.
-
#wait ⇒ void
Wait if necessary to respect rate limit.
Constructor Details
#initialize(delay: 0.5) ⇒ RateLimiter
Initialize a new rate limiter
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
#delay ⇒ Float (readonly)
24 25 26 |
# File 'lib/better_translate/rate_limiter.rb', line 24 def delay @delay end |
Instance Method Details
#record_request ⇒ void
This method returns an undefined value.
Record that a request was made
Should be called immediately after making a request.
75 76 77 |
# File 'lib/better_translate/rate_limiter.rb', line 75 def record_request @mutex.synchronize { @last_request_time = Time.now } end |
#reset ⇒ void
This method returns an undefined value.
Reset the rate limiter
Clears the last request time. Useful for testing or when switching contexts.
89 90 91 |
# File 'lib/better_translate/rate_limiter.rb', line 89 def reset @mutex.synchronize { @last_request_time = nil } end |
#wait ⇒ void
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.
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 |