class Limiter::RateQueue

Constants

EPOCH

Public Class Methods

new(size, interval: 60, &blk) click to toggle source
# File lib/limiter/rate_queue.rb, line 7
def initialize(size, interval: 60, &blk)
  @size = size
  @interval = interval

  @ring = Array.new(size, EPOCH)
  @head = 0
  @mutex = Mutex.new
  @blk = blk
end

Public Instance Methods

shift() click to toggle source
# File lib/limiter/rate_queue.rb, line 17
def shift
  time = nil

  @mutex.synchronize do
    time = @ring[@head]

    sleep_until(time + @interval)

    @ring[@head] = clock.time
    @head = (@head + 1) % @size
  end

  time
end

Private Instance Methods

clock() click to toggle source
# File lib/limiter/rate_queue.rb, line 41
def clock
  Clock
end
sleep_until(time) click to toggle source
# File lib/limiter/rate_queue.rb, line 34
def sleep_until(time)
  interval = time - clock.time
  return unless interval.positive?
  @blk.call if @blk
  clock.sleep(interval)
end