Class: AIHype::RateLimiter
- Inherits:
-
Object
- Object
- AIHype::RateLimiter
- Defined in:
- lib/aihype/rate_limiter.rb
Instance Attribute Summary collapse
-
#requests_per_minute ⇒ Object
readonly
Returns the value of attribute requests_per_minute.
-
#window_size ⇒ Object
readonly
Returns the value of attribute window_size.
Instance Method Summary collapse
-
#current_count ⇒ Object
Get current request count in window.
-
#initialize(requests_per_minute: 50, window_size: 60) ⇒ RateLimiter
constructor
A new instance of RateLimiter.
-
#reset ⇒ Object
Reset the rate limiter.
-
#throttle ⇒ Object
Wait if necessary to respect rate limits, then record request.
Constructor Details
#initialize(requests_per_minute: 50, window_size: 60) ⇒ RateLimiter
Returns a new instance of RateLimiter.
9 10 11 12 13 14 |
# File 'lib/aihype/rate_limiter.rb', line 9 def initialize(requests_per_minute: 50, window_size: 60) @requests_per_minute = requests_per_minute @window_size = window_size # seconds @requests = [] @mutex = Mutex.new end |
Instance Attribute Details
#requests_per_minute ⇒ Object (readonly)
Returns the value of attribute requests_per_minute.
7 8 9 |
# File 'lib/aihype/rate_limiter.rb', line 7 def requests_per_minute @requests_per_minute end |
#window_size ⇒ Object (readonly)
Returns the value of attribute window_size.
7 8 9 |
# File 'lib/aihype/rate_limiter.rb', line 7 def window_size @window_size end |
Instance Method Details
#current_count ⇒ Object
Get current request count in window
41 42 43 44 45 46 47 |
# File 'lib/aihype/rate_limiter.rb', line 41 def current_count @mutex.synchronize do now = Time.now @requests.reject! { |time| now - time > @window_size } @requests.length end end |
#reset ⇒ Object
Reset the rate limiter
50 51 52 53 54 |
# File 'lib/aihype/rate_limiter.rb', line 50 def reset @mutex.synchronize do @requests.clear end end |
#throttle ⇒ Object
Wait if necessary to respect rate limits, then record request
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/aihype/rate_limiter.rb', line 17 def throttle @mutex.synchronize do now = Time.now # Remove requests outside the current window @requests.reject! { |time| now - time > @window_size } # If at limit, wait until oldest request expires if @requests.length >= @requests_per_minute oldest_request = @requests.first sleep_time = @window_size - (now - oldest_request) + 0.1 # Add small buffer sleep(sleep_time) if sleep_time > 0 # Clean up again after sleeping now = Time.now @requests.reject! { |time| now - time > @window_size } end # Record this request @requests << now end end |