Skip to content

Commit 3f1ad5c

Browse files
authored
feat: expose rate limits (#72)
1 parent a25a1b6 commit 3f1ad5c

File tree

5 files changed

+59
-3
lines changed

5 files changed

+59
-3
lines changed

lib/stream-chat/client.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
require 'time'
99
require 'stream-chat/channel'
1010
require 'stream-chat/errors'
11+
require 'stream-chat/stream_response'
1112
require 'stream-chat/version'
1213
require 'stream-chat/util'
1314

@@ -514,7 +515,7 @@ def parse_response(response)
514515
end
515516
raise StreamAPIException, response if response.status >= 399
516517

517-
parsed_result
518+
StreamResponse.new(parsed_result, response)
518519
end
519520

520521
def make_http_request(method, relative_url, params: nil, data: nil)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# frozen_string_literal: true
2+
3+
# lib/stream_rate_limits.rb
4+
5+
module StreamChat
6+
class StreamRateLimits
7+
attr_reader :limit
8+
attr_reader :remaining
9+
attr_reader :reset
10+
11+
def initialize(limit, remaining, reset)
12+
@limit = limit.to_i
13+
@remaining = remaining.to_i
14+
@reset = Time.at(reset.to_i)
15+
end
16+
end
17+
end

lib/stream-chat/stream_response.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# frozen_string_literal: true
2+
3+
# lib/stream_response.rb
4+
require 'stream-chat/stream_rate_limits'
5+
6+
module StreamChat
7+
class StreamResponse < Hash
8+
attr_reader :rate_limit
9+
attr_reader :status_code
10+
attr_reader :headers
11+
12+
def initialize(hash, response)
13+
super(nil)
14+
merge!(hash)
15+
16+
if response.headers.key?('X-Ratelimit-Limit')
17+
@rate_limit = StreamRateLimits.new(
18+
response.headers['X-Ratelimit-Limit'],
19+
response.headers['X-Ratelimit-Remaining'],
20+
response.headers['X-Ratelimit-Reset']
21+
)
22+
end
23+
24+
@status_code = response.status
25+
@headers = response.headers
26+
end
27+
end
28+
end

spec/client_spec.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,16 @@ def loop_times(times)
4343
@client.update_users(@random_users)
4444
end
4545

46+
it 'properly handles stream response class' do
47+
response = @client.get_app_settings
48+
expect(response.rate_limit.limit).to be > 0
49+
expect(response.rate_limit.remaining).to be > 0
50+
expect(response.rate_limit.reset).to be_within(120).of Time.now.utc
51+
expect(response.status_code).to be 200
52+
expect(response.to_json).not_to include 'rate_limit'
53+
expect(response.to_json).not_to include 'status_code'
54+
end
55+
4656
it 'mutes users' do
4757
response = @client.mute_user(@random_users[0][:id], @random_users[1][:id])
4858
expect(response).to include 'mute'

stream-chat.gemspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ Gem::Specification.new do |gem|
1212
gem.summary = 'The low level client for serverside calls for Stream Chat.'
1313
gem.email = '[email protected]'
1414
gem.homepage = 'http://github.com/GetStream/stream-chat-ruby'
15-
gem.authors = ['Mircea Cosbuc']
15+
gem.authors = ['getstream.io']
1616
gem.files = Dir.chdir(File.expand_path(__dir__)) do
17-
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|\.github|scripts)/}) }
1818
end
1919
gem.required_ruby_version = '>=2.5.0'
2020
gem.metadata = {

0 commit comments

Comments
 (0)