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