class Vox::HTTP::LimitTable

@!visibility private A rate limiting class used for our {Client}

Constants

LOGGER

@!visibility private

Public Class Methods

new() click to toggle source
# File lib/vox/http/middleware/rate_limiter.rb, line 70
def initialize
  @bucket_key_map = {}
  @bucket_id_map = {}
  @key_to_id = {}
end

Public Instance Methods

get_from_id(id) click to toggle source

Index a bucket based on server side bucket id

# File lib/vox/http/middleware/rate_limiter.rb, line 82
def get_from_id(id)
  @bucket_id_map[id]
end
get_from_key(key) click to toggle source

Index a bucket based on the route key

# File lib/vox/http/middleware/rate_limiter.rb, line 77
def get_from_key(key)
  @bucket_key_map[key]
end
id_from_key(key) click to toggle source

Get a bucket from a rl_key if it exists

# File lib/vox/http/middleware/rate_limiter.rb, line 87
def id_from_key(key)
  @key_to_id[key]
end
update(key, bucket_id, limit, remaining, reset_time) click to toggle source

Update a rate limit bucket

# File lib/vox/http/middleware/rate_limiter.rb, line 114
def update(key, bucket_id, limit, remaining, reset_time)
  bucket = @bucket_id_map[bucket_id]
  if bucket
    bucket.update(limit, remaining, reset_time)
    @bucket_key_map[key] = bucket_id
  else
    bucket = Bucket.new(limit, remaining, reset_time)
    @bucket_key_map[key] = bucket
    if bucket_id
      @bucket_id_map[bucket_id] = bucket
      @key_to_id[key] = bucket_id
    end
  end
end
update_from_headers(key, headers, req_id = nil) click to toggle source

Update a rate limit bucket from response headers

# File lib/vox/http/middleware/rate_limiter.rb, line 92
def update_from_headers(key, headers, req_id = nil)
  limit = headers['x-ratelimit-limit']&.to_i
  remaining = headers['x-ratelimit-remaining']&.to_i
  bucket_id = headers['x-ratelimit-bucket']
  reset_after = headers['x-ratelimit-reset-after']&.to_f
  retry_after = headers['retry-after']&.to_f

  if limit && remaining && reset_after && bucket_id
    reset = if retry_after
              retry_after / 1000
            else
              reset_after
            end
    update(key, bucket_id, limit, remaining, Time.now + reset)
  elsif retry_after
    update(key, bucket_id, 0, 0, Time.now + (retry_after / 1000))
  else
    LOGGER.debug { "{#{req_id}} Unable to set RL for #{key}" }
  end
end