Class: AIHype::RateLimiter

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

Instance Attribute Summary collapse

Instance Method Summary collapse

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_minuteObject (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_sizeObject (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_countObject

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

#resetObject

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

#throttleObject

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