diff --git a/shard.yml b/shard.yml index fd1d2e69c..1cb0dc918 100644 --- a/shard.yml +++ b/shard.yml @@ -16,6 +16,9 @@ dependencies: http_proxy: github: mamantoha/http_proxy branch: master + rate_limiter: + github: lbarasti/rate_limiter + version: ~> 1.0.1 development_dependencies: ngrok: diff --git a/src/tourmaline/client.cr b/src/tourmaline/client.cr index f063ba0bc..a2a5ac4c9 100644 --- a/src/tourmaline/client.cr +++ b/src/tourmaline/client.cr @@ -38,6 +38,8 @@ module Tourmaline @dispatcher : Dispatcher? + @rate_limiter : RateLimiter::Limiter? + private getter pool : DB::Pool(HTTP::Client) # Create a new instance of `Tourmaline::Client`. @@ -92,7 +94,9 @@ module Tourmaline proxy_host = nil, proxy_port = nil, proxy_user = nil, - proxy_pass = nil) + proxy_pass = nil, + @rate_limiter = RateLimiter.new(interval: 1.second / 30) + ) if !proxy if proxy_uri proxy_uri = proxy_uri.is_a?(URI) ? proxy_uri : URI.parse(proxy_uri.starts_with?("http") ? proxy_uri : "http://#{proxy_uri}") @@ -176,6 +180,7 @@ module Tourmaline def request_internal(path, params = {} of String => String, multipart = false) # Wrap this so pool can attempt a retry using_connection do |client| + @rate_limiter.try &.get Log.debug { "sending ►► #{path.split("/").last}(#{params.to_pretty_json})" } begin