stream-chat-ruby 2.18.0 → 2.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,16 +1,19 @@
1
+ # typed: strict
1
2
  # frozen_string_literal: true
2
3
 
3
- # lib/client.rb
4
4
  require 'open-uri'
5
5
  require 'faraday'
6
6
  require 'faraday/multipart'
7
+ require 'faraday/net_http_persistent'
7
8
  require 'jwt'
8
9
  require 'time'
10
+ require 'sorbet-runtime'
9
11
  require 'stream-chat/channel'
10
12
  require 'stream-chat/errors'
11
13
  require 'stream-chat/stream_response'
12
14
  require 'stream-chat/version'
13
15
  require 'stream-chat/util'
16
+ require 'stream-chat/types'
14
17
 
15
18
  module StreamChat
16
19
  DEFAULT_BLOCKLIST = 'profanity_en_2020_v1'
@@ -18,38 +21,76 @@ module StreamChat
18
21
  HARD_DELETE = 'hard'
19
22
 
20
23
  class Client
21
- BASE_URL = 'https://chat.stream-io-api.com'
24
+ extend T::Sig
25
+ T::Configuration.default_checked_level = :never
26
+ # For now we disable runtime type checks.
27
+ # We will enable it with a major bump in the future,
28
+ # but for now, let's just run a static type check.
22
29
 
30
+ DEFAULT_BASE_URL = 'https://chat.stream-io-api.com'
31
+ DEFAULT_TIMEOUT = 6.0
32
+
33
+ sig { returns(String) }
23
34
  attr_reader :api_key
35
+
36
+ sig { returns(String) }
24
37
  attr_reader :api_secret
38
+
39
+ sig { returns(Faraday::Connection) }
25
40
  attr_reader :conn
26
- attr_reader :options
27
41
 
28
42
  # initializes a Stream Chat API Client
29
43
  #
30
44
  # @param [string] api_key your application api_key
31
45
  # @param [string] api_secret your application secret
32
- # @param [string]
33
- # @param [hash] options extra options
46
+ # @param [float] timeout the timeout for the http requests
47
+ # @param [Hash] options extra options such as base_url
34
48
  #
35
49
  # @example initialized the client with a timeout setting
36
50
  # StreamChat::Client.new('my_key', 'my_secret', 3.0)
37
51
  #
38
- def initialize(api_key = '', api_secret = '', timeout = 6.0, **options)
39
- @api_key = api_key || ENV['STREAM_KEY']
40
- @api_secret = api_secret || ENV['STREAM_SECRET']
41
- @timeout = timeout || ENV['STREAM_CHAT_TIMEOUT']
42
- @options = options
43
- @auth_token = JWT.encode({ server: true }, @api_secret, 'HS256')
44
- @base_url = options[:base_url] || ENV['STREAM_CHAT_URL'] || BASE_URL
45
- @conn = Faraday.new(url: @base_url) do |faraday|
52
+ sig { params(api_key: String, api_secret: String, timeout: T.nilable(T.any(Float, String)), options: T.untyped).void }
53
+ def initialize(api_key, api_secret, timeout = nil, **options)
54
+ raise ArgumentError, 'api_key and api_secret are required' if api_key.to_s.empty? || api_secret.to_s.empty?
55
+
56
+ @api_key = api_key
57
+ @api_secret = api_secret
58
+ @timeout = T.let(timeout&.to_f || DEFAULT_TIMEOUT, Float)
59
+ @auth_token = T.let(JWT.encode({ server: true }, @api_secret, 'HS256'), String)
60
+ @base_url = T.let(options[:base_url] || DEFAULT_BASE_URL, String)
61
+ conn = Faraday.new(@base_url) do |faraday|
46
62
  faraday.options[:open_timeout] = @timeout
47
63
  faraday.options[:timeout] = @timeout
48
64
  faraday.request :multipart
49
- faraday.adapter :net_http
65
+ faraday.adapter :net_http_persistent, pool_size: 5 do |http|
66
+ # AWS load balancer idle timeout is 60 secs, so let's make it 59
67
+ http.idle_timeout = 59
68
+ end
50
69
  end
70
+ @conn = T.let(conn, Faraday::Connection)
71
+ end
72
+
73
+ # initializes a Stream Chat API Client from STREAM_KEY and STREAM_SECRET
74
+ # environmental variables. STREAM_CHAT_TIMEOUT and STREAM_CHAT_URL
75
+ # variables are optional.
76
+ # @param [StringKeyHash] options extra options
77
+ sig { params(options: T.untyped).returns(Client) }
78
+ def self.from_env(**options)
79
+ Client.new(T.must(ENV['STREAM_KEY']),
80
+ T.must(ENV['STREAM_SECRET']),
81
+ ENV['STREAM_CHAT_TIMEOUT'],
82
+ **{ base_url: ENV['STREAM_CHAT_URL'] }.merge(options))
51
83
  end
52
84
 
85
+ # Sets the underlying Faraday http client.
86
+ #
87
+ # @param [client] an instance of Faraday::Connection
88
+ sig { params(client: Faraday::Connection).void }
89
+ def set_http_client(client)
90
+ @conn = client
91
+ end
92
+
93
+ sig { params(user_id: String, exp: T.nilable(Integer), iat: T.nilable(Integer)).returns(String) }
53
94
  def create_token(user_id, exp = nil, iat = nil)
54
95
  payload = { user_id: user_id }
55
96
  payload['exp'] = exp unless exp.nil?
@@ -57,24 +98,29 @@ module StreamChat
57
98
  JWT.encode(payload, @api_secret, 'HS256')
58
99
  end
59
100
 
101
+ sig { params(settings: T.untyped).returns(StreamChat::StreamResponse) }
60
102
  def update_app_settings(**settings)
61
- patch('app', **settings)
103
+ patch('app', data: settings)
62
104
  end
63
105
 
106
+ sig { returns(StreamChat::StreamResponse) }
64
107
  def get_app_settings
65
108
  get('app')
66
109
  end
67
110
 
111
+ sig { params(id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
68
112
  def flag_message(id, **options)
69
113
  payload = { target_message_id: id }.merge(options)
70
114
  post('moderation/flag', data: payload)
71
115
  end
72
116
 
117
+ sig { params(id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
73
118
  def unflag_message(id, **options)
74
119
  payload = { target_message_id: id }.merge(options)
75
120
  post('moderation/unflag', data: payload)
76
121
  end
77
122
 
123
+ sig { params(filter_conditions: StringKeyHash, options: T.untyped).returns(StreamChat::StreamResponse) }
78
124
  def query_message_flags(filter_conditions, **options)
79
125
  params = options.merge({
80
126
  filter_conditions: filter_conditions
@@ -82,28 +128,32 @@ module StreamChat
82
128
  get('moderation/flags/message', params: { payload: params.to_json })
83
129
  end
84
130
 
131
+ sig { params(id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
85
132
  def flag_user(id, **options)
86
133
  payload = { target_user_id: id }.merge(options)
87
134
  post('moderation/flag', data: payload)
88
135
  end
89
136
 
137
+ sig { params(id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
90
138
  def unflag_user(id, **options)
91
139
  payload = { target_user_id: id }.merge(options)
92
140
  post('moderation/unflag', data: payload)
93
141
  end
94
142
 
143
+ sig { params(id: String).returns(StreamChat::StreamResponse) }
95
144
  def get_message(id)
96
145
  get("messages/#{id}")
97
146
  end
98
147
 
148
+ sig { params(filter_conditions: StringKeyHash, query: T.any(String, StringKeyHash), sort: T.nilable(T::Hash[String, Integer]), options: T.untyped).returns(StreamChat::StreamResponse) }
99
149
  def search(filter_conditions, query, sort: nil, **options)
100
- offset = options[:offset]
150
+ offset = T.cast(options[:offset], T.nilable(Integer))
101
151
  next_value = options[:next]
102
152
  raise ArgumentError, 'cannot use offset with next or sort parameters' if offset&.positive? && (next_value || (!sort.nil? && !sort.empty?))
103
153
 
104
154
  to_merge = {
105
155
  filter_conditions: filter_conditions,
106
- sort: get_sort_fields(sort)
156
+ sort: StreamChat.get_sort_fields(sort)
107
157
  }
108
158
  if query.is_a? String
109
159
  to_merge[:query] = query
@@ -113,6 +163,7 @@ module StreamChat
113
163
  get('search', params: { payload: options.merge(to_merge).to_json })
114
164
  end
115
165
 
166
+ sig { params(users: T::Array[StringKeyHash]).returns(StreamChat::StreamResponse) }
116
167
  def update_users(users)
117
168
  payload = {}
118
169
  users.each do |user|
@@ -124,69 +175,84 @@ module StreamChat
124
175
  post('users', data: { users: payload })
125
176
  end
126
177
 
178
+ sig { params(user: StringKeyHash).returns(StreamChat::StreamResponse) }
127
179
  def update_user(user)
128
180
  update_users([user])
129
181
  end
130
182
 
183
+ sig { params(updates: T::Array[StringKeyHash]).returns(StreamChat::StreamResponse) }
131
184
  def update_users_partial(updates)
132
185
  patch('users', data: { users: updates })
133
186
  end
134
187
 
188
+ sig { params(update: StringKeyHash).returns(StreamChat::StreamResponse) }
135
189
  def update_user_partial(update)
136
190
  update_users_partial([update])
137
191
  end
138
192
 
193
+ sig { params(user_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
139
194
  def delete_user(user_id, **options)
140
195
  delete("users/#{user_id}", params: options)
141
196
  end
142
197
 
198
+ sig { params(user_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
143
199
  def deactivate_user(user_id, **options)
144
- post("users/#{user_id}/deactivate", **options)
200
+ post("users/#{user_id}/deactivate", params: options)
145
201
  end
146
202
 
203
+ sig { params(user_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
147
204
  def reactivate_user(user_id, **options)
148
- post("users/#{user_id}/reactivate", **options)
205
+ post("users/#{user_id}/reactivate", params: options)
149
206
  end
150
207
 
208
+ sig { params(user_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
151
209
  def export_user(user_id, **options)
152
210
  get("users/#{user_id}/export", params: options)
153
211
  end
154
212
 
213
+ sig { params(target_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
155
214
  def ban_user(target_id, **options)
156
215
  payload = { target_user_id: target_id }.merge(options)
157
216
  post('moderation/ban', data: payload)
158
217
  end
159
218
 
219
+ sig { params(target_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
160
220
  def unban_user(target_id, **options)
161
221
  params = { target_user_id: target_id }.merge(options)
162
222
  delete('moderation/ban', params: params)
163
223
  end
164
224
 
225
+ sig { params(target_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
165
226
  def shadow_ban(target_id, **options)
166
227
  payload = { target_user_id: target_id, shadow: true }.merge(options)
167
228
  post('moderation/ban', data: payload)
168
229
  end
169
230
 
231
+ sig { params(target_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
170
232
  def remove_shadow_ban(target_id, **options)
171
233
  params = { target_user_id: target_id, shadow: true }.merge(options)
172
234
  delete('moderation/ban', params: params)
173
235
  end
174
236
 
237
+ sig { params(target_id: String, user_id: String).returns(StreamChat::StreamResponse) }
175
238
  def mute_user(target_id, user_id)
176
239
  payload = { target_id: target_id, user_id: user_id }
177
240
  post('moderation/mute', data: payload)
178
241
  end
179
242
 
243
+ sig { params(target_id: String, user_id: String).returns(StreamChat::StreamResponse) }
180
244
  def unmute_user(target_id, user_id)
181
245
  payload = { target_id: target_id, user_id: user_id }
182
246
  post('moderation/unmute', data: payload)
183
247
  end
184
248
 
249
+ sig { params(user_id: String).returns(StreamChat::StreamResponse) }
185
250
  def mark_all_read(user_id)
186
251
  payload = { user: { id: user_id } }
187
252
  post('channels/read', data: payload)
188
253
  end
189
254
 
255
+ sig { params(message_id: String, user_id: String, expiration: T.nilable(String)).returns(StreamChat::StreamResponse) }
190
256
  def pin_message(message_id, user_id, expiration: nil)
191
257
  updates = {
192
258
  set: {
@@ -197,6 +263,7 @@ module StreamChat
197
263
  update_message_partial(message_id, updates, user_id: user_id)
198
264
  end
199
265
 
266
+ sig { params(message_id: String, user_id: String).returns(StreamChat::StreamResponse) }
200
267
  def unpin_message(message_id, user_id)
201
268
  updates = {
202
269
  set: {
@@ -206,64 +273,75 @@ module StreamChat
206
273
  update_message_partial(message_id, updates, user_id: user_id)
207
274
  end
208
275
 
276
+ sig { params(message: StringKeyHash).returns(StreamChat::StreamResponse) }
209
277
  def update_message(message)
210
- raise ArgumentError 'message must have an id' unless message.key? 'id'
278
+ raise ArgumentError, 'message must have an id' unless message.key? 'id'
211
279
 
212
280
  post("messages/#{message['id']}", data: { message: message })
213
281
  end
214
282
 
283
+ sig { params(message_id: String, updates: StringKeyHash, user_id: T.nilable(String), options: T.untyped).returns(StreamChat::StreamResponse) }
215
284
  def update_message_partial(message_id, updates, user_id: nil, **options)
216
285
  params = updates.merge(options)
217
286
  params['user'] = { id: user_id } if user_id
218
287
  put("messages/#{message_id}", data: params)
219
288
  end
220
289
 
221
- def delete_message(message_id)
222
- delete("messages/#{message_id}")
290
+ sig { params(message_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
291
+ def delete_message(message_id, **options)
292
+ delete("messages/#{message_id}", params: options)
223
293
  end
224
294
 
295
+ sig { params(filter_conditions: StringKeyHash, sort: T.nilable(T::Hash[String, Integer]), options: T.untyped).returns(StreamChat::StreamResponse) }
225
296
  def query_banned_users(filter_conditions, sort: nil, **options)
226
297
  params = options.merge({
227
298
  filter_conditions: filter_conditions,
228
- sort: get_sort_fields(sort)
299
+ sort: StreamChat.get_sort_fields(sort)
229
300
  })
230
301
  get('query_banned_users', params: { payload: params.to_json })
231
302
  end
232
303
 
304
+ sig { params(filter_conditions: StringKeyHash, sort: T.nilable(T::Hash[String, Integer]), options: T.untyped).returns(StreamChat::StreamResponse) }
233
305
  def query_users(filter_conditions, sort: nil, **options)
234
306
  params = options.merge({
235
307
  filter_conditions: filter_conditions,
236
- sort: get_sort_fields(sort)
308
+ sort: StreamChat.get_sort_fields(sort)
237
309
  })
238
310
  get('users', params: { payload: params.to_json })
239
311
  end
240
312
 
313
+ sig { params(filter_conditions: StringKeyHash, sort: T.nilable(T::Hash[String, Integer]), options: T.untyped).returns(StreamChat::StreamResponse) }
241
314
  def query_channels(filter_conditions, sort: nil, **options)
242
315
  data = { state: true, watch: false, presence: false }
243
316
  data = data.merge(options).merge({
244
317
  filter_conditions: filter_conditions,
245
- sort: get_sort_fields(sort)
318
+ sort: StreamChat.get_sort_fields(sort)
246
319
  })
247
320
  post('channels', data: data)
248
321
  end
249
322
 
323
+ sig { params(data: StringKeyHash).returns(StreamChat::StreamResponse) }
250
324
  def create_channel_type(data)
251
325
  data['commands'] = ['all'] unless data.key?('commands') || data['commands'].nil? || data['commands'].empty?
252
326
  post('channeltypes', data: data)
253
327
  end
254
328
 
329
+ sig { params(channel_type: String).returns(StreamChat::StreamResponse) }
255
330
  def get_channel_type(channel_type)
256
331
  get("channeltypes/#{channel_type}")
257
332
  end
258
333
 
334
+ sig { returns(StreamChat::StreamResponse) }
259
335
  def list_channel_types
260
336
  get('channeltypes')
261
337
  end
262
338
 
339
+ sig { params(channel_type: String, options: T.untyped).returns(StreamChat::StreamResponse) }
263
340
  def update_channel_type(channel_type, **options)
264
341
  put("channeltypes/#{channel_type}", data: options)
265
342
  end
266
343
 
344
+ sig { params(channel_type: String).returns(StreamChat::StreamResponse) }
267
345
  def delete_channel_type(channel_type)
268
346
  delete("channeltypes/#{channel_type}")
269
347
  end
@@ -272,14 +350,16 @@ module StreamChat
272
350
  #
273
351
  # @param [string] channel_type the channel type
274
352
  # @param [string] channel_id the channel identifier
275
- # @param [hash] data additional channel data
353
+ # @param [StringKeyHash] data additional channel data
276
354
  #
277
355
  # @return [StreamChat::Channel]
278
356
  #
357
+ sig { params(channel_type: String, channel_id: T.nilable(String), data: T.nilable(StringKeyHash)).returns(StreamChat::Channel) }
279
358
  def channel(channel_type, channel_id: nil, data: nil)
280
359
  StreamChat::Channel.new(self, channel_type, channel_id, data)
281
360
  end
282
361
 
362
+ sig { params(device_id: String, push_provider: String, user_id: String).returns(StreamChat::StreamResponse) }
283
363
  def add_device(device_id, push_provider, user_id)
284
364
  post('devices', data: {
285
365
  id: device_id,
@@ -288,14 +368,17 @@ module StreamChat
288
368
  })
289
369
  end
290
370
 
371
+ sig { params(device_id: String, user_id: String).returns(StreamChat::StreamResponse) }
291
372
  def delete_device(device_id, user_id)
292
373
  delete('devices', params: { id: device_id, user_id: user_id })
293
374
  end
294
375
 
376
+ sig { params(user_id: String).returns(StreamChat::StreamResponse) }
295
377
  def get_devices(user_id)
296
378
  get('devices', params: { user_id: user_id })
297
379
  end
298
380
 
381
+ sig { params(server_side: T::Boolean, android: T::Boolean, ios: T::Boolean, web: T::Boolean, endpoints: T::Array[String]).returns(StreamChat::StreamResponse) }
299
382
  def get_rate_limits(server_side: false, android: false, ios: false, web: false, endpoints: [])
300
383
  params = {}
301
384
  params['server_side'] = server_side if server_side
@@ -307,78 +390,96 @@ module StreamChat
307
390
  get('rate_limits', params: params)
308
391
  end
309
392
 
393
+ sig { params(request_body: String, x_signature: String).returns(T::Boolean) }
310
394
  def verify_webhook(request_body, x_signature)
311
395
  signature = OpenSSL::HMAC.hexdigest('SHA256', @api_secret, request_body)
312
396
  signature == x_signature
313
397
  end
314
398
 
399
+ sig { params(user_id: String, event: StringKeyHash).returns(StreamChat::StreamResponse) }
315
400
  def send_user_event(user_id, event)
316
401
  post("users/#{user_id}/event", data: event)
317
402
  end
318
403
 
404
+ sig { params(message_id: String, language: String).returns(StreamChat::StreamResponse) }
319
405
  def translate_message(message_id, language)
320
406
  post("messages/#{message_id}/translate", data: { language: language })
321
407
  end
322
408
 
409
+ sig { params(message_id: String, data: StringKeyHash).returns(StreamChat::StreamResponse) }
323
410
  def run_message_action(message_id, data)
324
411
  post("messages/#{message_id}/action", data: data)
325
412
  end
326
413
 
414
+ sig { params(user: StringKeyHash).returns(StreamChat::StreamResponse) }
327
415
  def create_guest(user)
328
416
  post('guests', data: user)
329
417
  end
330
418
 
419
+ sig { returns(StreamChat::StreamResponse) }
331
420
  def list_blocklists
332
421
  get('blocklists')
333
422
  end
334
423
 
424
+ sig { params(name: String).returns(StreamChat::StreamResponse) }
335
425
  def get_blocklist(name)
336
426
  get("blocklists/#{name}")
337
427
  end
338
428
 
429
+ sig { params(name: String, words: StringKeyHash).returns(StreamChat::StreamResponse) }
339
430
  def create_blocklist(name, words)
340
431
  post('blocklists', data: { name: name, words: words })
341
432
  end
342
433
 
434
+ sig { params(name: String, words: StringKeyHash).returns(StreamChat::StreamResponse) }
343
435
  def update_blocklist(name, words)
344
436
  put("blocklists/#{name}", data: { words: words })
345
437
  end
346
438
 
439
+ sig { params(name: String).returns(StreamChat::StreamResponse) }
347
440
  def delete_blocklist(name)
348
441
  delete("blocklists/#{name}")
349
442
  end
350
443
 
444
+ sig { params(channels: StringKeyHash, options: T.untyped).returns(StreamChat::StreamResponse) }
351
445
  def export_channels(*channels, **options)
352
446
  post('export_channels', data: { channels: channels, **options })
353
447
  end
354
448
 
449
+ sig { params(task_id: String).returns(StreamChat::StreamResponse) }
355
450
  def get_export_channel_status(task_id)
356
451
  get("export_channels/#{task_id}")
357
452
  end
358
453
 
454
+ sig { params(task_id: String).returns(StreamChat::StreamResponse) }
359
455
  def get_task(task_id)
360
456
  get("tasks/#{task_id}")
361
457
  end
362
458
 
459
+ sig { params(user_ids: T::Array[String], user: String, messages: T.nilable(StringKeyHash), conversations: T.nilable(String)).returns(StreamChat::StreamResponse) }
363
460
  def delete_users(user_ids, user: SOFT_DELETE, messages: nil, conversations: nil)
364
461
  post('users/delete', data: { user_ids: user_ids, user: user, messages: messages, conversations: conversations })
365
462
  end
366
463
 
464
+ sig { params(cids: T::Array[String], hard_delete: T::Boolean).returns(StreamChat::StreamResponse) }
367
465
  def delete_channels(cids, hard_delete: false)
368
466
  post('channels/delete', data: { cids: cids, hard_delete: hard_delete })
369
467
  end
370
468
 
469
+ sig { params(before: T.any(DateTime, String)).returns(StreamChat::StreamResponse) }
371
470
  def revoke_tokens(before)
372
- before = before.rfc3339 if before.instance_of?(DateTime)
471
+ before = T.cast(before, DateTime).rfc3339 if before.instance_of?(DateTime)
373
472
  update_app_settings({ 'revoke_tokens_issued_before' => before })
374
473
  end
375
474
 
475
+ sig { params(user_id: String, before: T.any(DateTime, String)).returns(StreamChat::StreamResponse) }
376
476
  def revoke_user_token(user_id, before)
377
477
  revoke_users_token([user_id], before)
378
478
  end
379
479
 
480
+ sig { params(user_ids: T::Array[String], before: T.any(DateTime, String)).returns(StreamChat::StreamResponse) }
380
481
  def revoke_users_token(user_ids, before)
381
- before = before.rfc3339 if before.instance_of?(DateTime)
482
+ before = T.cast(before, DateTime).rfc3339 if before.instance_of?(DateTime)
382
483
 
383
484
  updates = []
384
485
  user_ids.each do |user_id|
@@ -392,32 +493,38 @@ module StreamChat
392
493
  update_users_partial(updates)
393
494
  end
394
495
 
496
+ sig { params(relative_url: String, params: T.nilable(StringKeyHash), data: T.nilable(StringKeyHash)).returns(StreamChat::StreamResponse) }
395
497
  def put(relative_url, params: nil, data: nil)
396
498
  make_http_request(:put, relative_url, params: params, data: data)
397
499
  end
398
500
 
501
+ sig { params(relative_url: String, params: T.nilable(StringKeyHash), data: T.nilable(StringKeyHash)).returns(StreamChat::StreamResponse) }
399
502
  def post(relative_url, params: nil, data: nil)
400
503
  make_http_request(:post, relative_url, params: params, data: data)
401
504
  end
402
505
 
506
+ sig { params(relative_url: String, params: T.nilable(StringKeyHash)).returns(StreamChat::StreamResponse) }
403
507
  def get(relative_url, params: nil)
404
508
  make_http_request(:get, relative_url, params: params)
405
509
  end
406
510
 
511
+ sig { params(relative_url: String, params: T.nilable(StringKeyHash)).returns(StreamChat::StreamResponse) }
407
512
  def delete(relative_url, params: nil)
408
513
  make_http_request(:delete, relative_url, params: params)
409
514
  end
410
515
 
516
+ sig { params(relative_url: String, params: T.nilable(StringKeyHash), data: T.nilable(StringKeyHash)).returns(StreamChat::StreamResponse) }
411
517
  def patch(relative_url, params: nil, data: nil)
412
518
  make_http_request(:patch, relative_url, params: params, data: data)
413
519
  end
414
520
 
415
- def send_file(relative_url, file_url, user, content_type = 'application/octet-stream')
521
+ sig { params(relative_url: String, file_url: String, user: StringKeyHash, content_type: T.nilable(String)).returns(StreamChat::StreamResponse) }
522
+ def send_file(relative_url, file_url, user, content_type = nil)
416
523
  url = [@base_url, relative_url].join('/')
417
524
 
418
525
  body = { user: user.to_json }
419
526
 
420
- body[:file] = Faraday::UploadIO.new(file_url, content_type)
527
+ body[:file] = Faraday::UploadIO.new(file_url, content_type || 'application/octet-stream')
421
528
 
422
529
  response = @conn.post url do |req|
423
530
  req.headers['X-Stream-Client'] = get_user_agent
@@ -430,76 +537,94 @@ module StreamChat
430
537
  parse_response(response)
431
538
  end
432
539
 
540
+ sig { params(push_data: StringKeyHash).returns(StreamChat::StreamResponse) }
433
541
  def check_push(push_data)
434
542
  post('check_push', data: push_data)
435
543
  end
436
544
 
545
+ sig { params(sqs_key: T.nilable(String), sqs_secret: T.nilable(String), sqs_url: T.nilable(String)).returns(StreamChat::StreamResponse) }
437
546
  def check_sqs(sqs_key = nil, sqs_secret = nil, sqs_url = nil)
438
547
  post('check_sqs', data: { sqs_key: sqs_key, sqs_secret: sqs_secret, sqs_url: sqs_url })
439
548
  end
440
549
 
550
+ sig { params(command: StringKeyHash).returns(StreamChat::StreamResponse) }
441
551
  def create_command(command)
442
552
  post('commands', data: command)
443
553
  end
444
554
 
555
+ sig { params(name: String).returns(StreamChat::StreamResponse) }
445
556
  def get_command(name)
446
557
  get("commands/#{name}")
447
558
  end
448
559
 
560
+ sig { params(name: String, command: StringKeyHash).returns(StreamChat::StreamResponse) }
449
561
  def update_command(name, command)
450
562
  put("commands/#{name}", data: command)
451
563
  end
452
564
 
565
+ sig { params(name: String).returns(StreamChat::StreamResponse) }
453
566
  def delete_command(name)
454
567
  delete("commands/#{name}")
455
568
  end
456
569
 
570
+ sig { returns(StreamChat::StreamResponse) }
457
571
  def list_commands
458
572
  get('commands')
459
573
  end
460
574
 
575
+ sig { returns(StreamChat::StreamResponse) }
461
576
  def list_permissions
462
577
  get('permissions')
463
578
  end
464
579
 
580
+ sig { params(id: String).returns(StreamChat::StreamResponse) }
465
581
  def get_permission(id)
466
582
  get("permissions/#{id}")
467
583
  end
468
584
 
585
+ sig { params(permission: StringKeyHash).returns(StreamChat::StreamResponse) }
469
586
  def create_permission(permission)
470
587
  post('permissions', data: permission)
471
588
  end
472
589
 
590
+ sig { params(id: String, permission: StringKeyHash).returns(StreamChat::StreamResponse) }
473
591
  def update_permission(id, permission)
474
592
  put("permissions/#{id}", data: permission)
475
593
  end
476
594
 
595
+ sig { params(id: String).returns(StreamChat::StreamResponse) }
477
596
  def delete_permission(id)
478
597
  delete("permissions/#{id}")
479
598
  end
480
599
 
600
+ sig { params(name: String).returns(StreamChat::StreamResponse) }
481
601
  def create_role(name)
482
602
  post('roles', data: { name: name })
483
603
  end
484
604
 
605
+ sig { params(name: String).returns(StreamChat::StreamResponse) }
485
606
  def delete_role(name)
486
607
  delete("roles/#{name}")
487
608
  end
488
609
 
610
+ sig { returns(StreamChat::StreamResponse) }
489
611
  def list_roles
490
612
  get('roles')
491
613
  end
492
614
 
493
615
  private
494
616
 
617
+ sig { returns(T::Hash[String, String]) }
495
618
  def get_default_params
496
619
  { api_key: @api_key }
497
620
  end
498
621
 
622
+ sig { returns(String) }
499
623
  def get_user_agent
500
624
  "stream-ruby-client-#{StreamChat::VERSION}"
501
625
  end
502
626
 
627
+ sig { returns(T::Hash[String, String]) }
503
628
  def get_default_headers
504
629
  {
505
630
  'Content-Type': 'application/json',
@@ -507,6 +632,7 @@ module StreamChat
507
632
  }
508
633
  end
509
634
 
635
+ sig { params(response: Faraday::Response).returns(StreamChat::StreamResponse) }
510
636
  def parse_response(response)
511
637
  begin
512
638
  parsed_result = JSON.parse(response.body)
@@ -518,14 +644,14 @@ module StreamChat
518
644
  StreamResponse.new(parsed_result, response)
519
645
  end
520
646
 
647
+ sig { params(method: Symbol, relative_url: String, params: T.nilable(StringKeyHash), data: T.nilable(StringKeyHash)).returns(StreamChat::StreamResponse) }
521
648
  def make_http_request(method, relative_url, params: nil, data: nil)
522
649
  headers = get_default_headers
523
650
  headers['Authorization'] = @auth_token
524
651
  headers['stream-auth-type'] = 'jwt'
525
- url = [@base_url, relative_url].join('/')
526
652
  params = {} if params.nil?
527
653
  params = (get_default_params.merge(params).sort_by { |k, _v| k.to_s }).to_h
528
- url = "#{url}?#{URI.encode_www_form(params)}"
654
+ url = "#{relative_url}?#{URI.encode_www_form(params)}"
529
655
 
530
656
  body = data.to_json if %w[patch post put].include? method.to_s
531
657