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