Class: Wikiwiki::SlidingWindow
- Inherits:
-
Object
- Object
- Wikiwiki::SlidingWindow
- Defined in:
- lib/wikiwiki/sliding_window.rb
Overview
Sliding window algorithm for rate limiting
Instance Method Summary collapse
-
#can_request? ⇒ Boolean
Check if a request can be made without exceeding the limit.
-
#initialize(window:, max_requests:) ⇒ SlidingWindow
constructor
Initialize a new window limiter.
-
#record! ⇒ void
Record a new request timestamp.
-
#wait_time ⇒ Float
Get time in seconds until next request can be made.
Constructor Details
#initialize(window:, max_requests:) ⇒ SlidingWindow
Initialize a new window limiter
10 11 12 13 14 |
# File 'lib/wikiwiki/sliding_window.rb', line 10 def initialize(window:, max_requests:) @window = window @max_requests = max_requests @requests = [] end |
Instance Method Details
#can_request? ⇒ Boolean
Check if a request can be made without exceeding the limit
19 20 21 22 |
# File 'lib/wikiwiki/sliding_window.rb', line 19 def can_request? cleanup! @requests.size < @max_requests end |
#record! ⇒ void
This method returns an undefined value.
Record a new request timestamp
27 |
# File 'lib/wikiwiki/sliding_window.rb', line 27 def record! = (@requests << Time.now) |
#wait_time ⇒ Float
Get time in seconds until next request can be made
32 33 34 35 36 37 38 39 40 |
# File 'lib/wikiwiki/sliding_window.rb', line 32 def wait_time cleanup! return 0.0 if @requests.size < @max_requests # Time until oldest request expires oldest = @requests.first time_until_expiry = @window - (Time.now - oldest) [time_until_expiry, 0.0].max end |