Class: Rubord::RateLimiter

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

Defined Under Namespace

Classes: Bucket, GlobalLimiter

Instance Method Summary collapse

Constructor Details

#initializeRateLimiter

Returns a new instance of RateLimiter.



97
98
99
100
101
102
103
# File 'lib/rubord/structs/rate_limiter.rb', line 97

def initialize
  @buckets = {}
  @route_buckets = {}
  @global_limiter = GlobalLimiter.new
  @mutex = Mutex.new
  @default_bucket = Bucket.new("default")
end

Instance Method Details

#bucket_for(route) ⇒ Object



105
106
107
108
109
110
111
112
113
114
115
# File 'lib/rubord/structs/rate_limiter.rb', line 105

def bucket_for(route)
  @mutex.synchronize do
    bucket_id = @route_buckets[route]
    
    if bucket_id
      @buckets[bucket_id] ||= Bucket.new(bucket_id)
    else
      @default_bucket
    end
  end
end

#handle_rate_limit(headers, body) ⇒ Object



133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/rubord/structs/rate_limiter.rb', line 133

def handle_rate_limit(headers, body)
  if body["global"] == true
    @global_limiter.block_for(body["retry_after"])
    return :global
  else
    bucket_header = headers["x-ratelimit-bucket"]
    bucket_id = Array(bucket_header).first if bucket_header
    
    if bucket_id
      @mutex.synchronize do
        @buckets[bucket_id] ||= Bucket.new(bucket_id)
        @buckets[bucket_id].reset_at = Time.now + body["retry_after"]
        @buckets[bucket_id].remaining = 0
      end
    end
    return :route
  end
end

#update_bucket(route, headers) ⇒ Object



152
153
154
155
156
157
158
159
160
161
# File 'lib/rubord/structs/rate_limiter.rb', line 152

def update_bucket(route, headers)
  bucket_header = headers["x-ratelimit-bucket"]
  bucket_id = Array(bucket_header).first if bucket_header
  return unless bucket_id

  update_mapping(route, bucket_id)
  
  bucket = @buckets[bucket_id]
  bucket.update_from_headers(headers)
end

#update_mapping(route, bucket_id) ⇒ Object



117
118
119
120
121
122
# File 'lib/rubord/structs/rate_limiter.rb', line 117

def update_mapping(route, bucket_id)
  @mutex.synchronize do
    @route_buckets[route] = bucket_id
    @buckets[bucket_id] ||= Bucket.new(bucket_id)
  end
end

#wait_for(route) ⇒ Object



128
129
130
131
# File 'lib/rubord/structs/rate_limiter.rb', line 128

def wait_for(route)
  bucket = bucket_for(route)
  bucket.wait
end

#wait_globalObject



124
125
126
# File 'lib/rubord/structs/rate_limiter.rb', line 124

def wait_global
  @global_limiter.wait
end