Class: Rubord::RateLimiter
- Inherits:
-
Object
- Object
- Rubord::RateLimiter
show all
- Defined in:
- lib/rubord/structs/rate_limiter.rb
Defined Under Namespace
Classes: Bucket, GlobalLimiter
Instance Method Summary
collapse
Constructor Details
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(, body)
if body["global"] == true
@global_limiter.block_for(body["retry_after"])
return :global
else
= ["x-ratelimit-bucket"]
bucket_id = Array().first if
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, )
= ["x-ratelimit-bucket"]
bucket_id = Array().first if
return unless bucket_id
update_mapping(route, bucket_id)
bucket = @buckets[bucket_id]
bucket.()
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_global ⇒ Object
124
125
126
|
# File 'lib/rubord/structs/rate_limiter.rb', line 124
def wait_global
@global_limiter.wait
end
|