getstream 3.1.2__tar.gz → 3.2.0__tar.gz

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.
Files changed (118) hide show
  1. {getstream-3.1.2 → getstream-3.2.0}/PKG-INFO +1 -1
  2. {getstream-3.1.2 → getstream-3.2.0}/getstream/base.py +78 -15
  3. {getstream-3.1.2 → getstream-3.2.0}/getstream/stream.py +88 -49
  4. {getstream-3.1.2 → getstream-3.2.0}/.cursor/worktrees.json +0 -0
  5. {getstream-3.1.2 → getstream-3.2.0}/.env.example +0 -0
  6. {getstream-3.1.2 → getstream-3.2.0}/.github/actions/python-uv-setup/action.yml +0 -0
  7. {getstream-3.1.2 → getstream-3.2.0}/.github/workflows/ci.yml +0 -0
  8. {getstream-3.1.2 → getstream-3.2.0}/.github/workflows/release.yml +0 -0
  9. {getstream-3.1.2 → getstream-3.2.0}/.github/workflows/run_tests.yml +0 -0
  10. {getstream-3.1.2 → getstream-3.2.0}/.github/workflows/stream-py.code-workspace +0 -0
  11. {getstream-3.1.2 → getstream-3.2.0}/.gitignore +0 -0
  12. {getstream-3.1.2 → getstream-3.2.0}/.gitmodules +0 -0
  13. {getstream-3.1.2 → getstream-3.2.0}/.pre-commit-config.yaml +0 -0
  14. {getstream-3.1.2 → getstream-3.2.0}/AGENTS.md +0 -0
  15. {getstream-3.1.2 → getstream-3.2.0}/CHANGELOG.md +0 -0
  16. {getstream-3.1.2 → getstream-3.2.0}/DEVELOPMENT.md +0 -0
  17. {getstream-3.1.2 → getstream-3.2.0}/LICENSE.md +0 -0
  18. {getstream-3.1.2 → getstream-3.2.0}/MIGRATION_v2_to_v3.md +0 -0
  19. {getstream-3.1.2 → getstream-3.2.0}/Makefile +0 -0
  20. {getstream-3.1.2 → getstream-3.2.0}/README.md +0 -0
  21. {getstream-3.1.2 → getstream-3.2.0}/dev.py +0 -0
  22. {getstream-3.1.2 → getstream-3.2.0}/docs/migration-from-stream-chat-python/01-setup-and-auth.md +0 -0
  23. {getstream-3.1.2 → getstream-3.2.0}/docs/migration-from-stream-chat-python/02-users.md +0 -0
  24. {getstream-3.1.2 → getstream-3.2.0}/docs/migration-from-stream-chat-python/03-channels.md +0 -0
  25. {getstream-3.1.2 → getstream-3.2.0}/docs/migration-from-stream-chat-python/04-messages-and-reactions.md +0 -0
  26. {getstream-3.1.2 → getstream-3.2.0}/docs/migration-from-stream-chat-python/05-moderation.md +0 -0
  27. {getstream-3.1.2 → getstream-3.2.0}/docs/migration-from-stream-chat-python/06-devices.md +0 -0
  28. {getstream-3.1.2 → getstream-3.2.0}/docs/migration-from-stream-chat-python/README.md +0 -0
  29. {getstream-3.1.2 → getstream-3.2.0}/generate.sh +0 -0
  30. {getstream-3.1.2 → getstream-3.2.0}/generate_webrtc.sh +0 -0
  31. {getstream-3.1.2 → getstream-3.2.0}/getstream/__init__.py +0 -0
  32. {getstream-3.1.2 → getstream-3.2.0}/getstream/chat/__init__.py +0 -0
  33. {getstream-3.1.2 → getstream-3.2.0}/getstream/chat/async_channel.py +0 -0
  34. {getstream-3.1.2 → getstream-3.2.0}/getstream/chat/async_client.py +0 -0
  35. {getstream-3.1.2 → getstream-3.2.0}/getstream/chat/async_rest_client.py +0 -0
  36. {getstream-3.1.2 → getstream-3.2.0}/getstream/chat/channel.py +0 -0
  37. {getstream-3.1.2 → getstream-3.2.0}/getstream/chat/client.py +0 -0
  38. {getstream-3.1.2 → getstream-3.2.0}/getstream/chat/rest_client.py +0 -0
  39. {getstream-3.1.2 → getstream-3.2.0}/getstream/common/__init__.py +0 -0
  40. {getstream-3.1.2 → getstream-3.2.0}/getstream/common/async_client.py +0 -0
  41. {getstream-3.1.2 → getstream-3.2.0}/getstream/common/async_rest_client.py +0 -0
  42. {getstream-3.1.2 → getstream-3.2.0}/getstream/common/client.py +0 -0
  43. {getstream-3.1.2 → getstream-3.2.0}/getstream/common/rest_client.py +0 -0
  44. {getstream-3.1.2 → getstream-3.2.0}/getstream/common/telemetry.py +0 -0
  45. {getstream-3.1.2 → getstream-3.2.0}/getstream/config.py +0 -0
  46. {getstream-3.1.2 → getstream-3.2.0}/getstream/feeds/__init__.py +0 -0
  47. {getstream-3.1.2 → getstream-3.2.0}/getstream/feeds/client.py +0 -0
  48. {getstream-3.1.2 → getstream-3.2.0}/getstream/feeds/feeds.py +0 -0
  49. {getstream-3.1.2 → getstream-3.2.0}/getstream/feeds/rest_client.py +0 -0
  50. {getstream-3.1.2 → getstream-3.2.0}/getstream/generic.py +0 -0
  51. {getstream-3.1.2 → getstream-3.2.0}/getstream/meta.py +0 -0
  52. {getstream-3.1.2 → getstream-3.2.0}/getstream/models/__init__.py +0 -0
  53. {getstream-3.1.2 → getstream-3.2.0}/getstream/moderation/__init__.py +0 -0
  54. {getstream-3.1.2 → getstream-3.2.0}/getstream/moderation/async_client.py +0 -0
  55. {getstream-3.1.2 → getstream-3.2.0}/getstream/moderation/async_rest_client.py +0 -0
  56. {getstream-3.1.2 → getstream-3.2.0}/getstream/moderation/client.py +0 -0
  57. {getstream-3.1.2 → getstream-3.2.0}/getstream/moderation/rest_client.py +0 -0
  58. {getstream-3.1.2 → getstream-3.2.0}/getstream/rate_limit.py +0 -0
  59. {getstream-3.1.2 → getstream-3.2.0}/getstream/stream_response.py +0 -0
  60. {getstream-3.1.2 → getstream-3.2.0}/getstream/tests/test_webhook.py +0 -0
  61. {getstream-3.1.2 → getstream-3.2.0}/getstream/utils/__init__.py +0 -0
  62. {getstream-3.1.2 → getstream-3.2.0}/getstream/utils/event_emitter.py +0 -0
  63. {getstream-3.1.2 → getstream-3.2.0}/getstream/utils/retry.py +0 -0
  64. {getstream-3.1.2 → getstream-3.2.0}/getstream/version.py +0 -0
  65. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/__init__.py +0 -0
  66. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/async_call.py +0 -0
  67. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/async_client.py +0 -0
  68. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/async_rest_client.py +0 -0
  69. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/call.py +0 -0
  70. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/client.py +0 -0
  71. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/openai.py +0 -0
  72. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rest_client.py +0 -0
  73. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/README.md +0 -0
  74. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/__init__.py +0 -0
  75. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/audio_track.py +0 -0
  76. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/connection_manager.py +0 -0
  77. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/connection_utils.py +0 -0
  78. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/coordinator/__init__.py +0 -0
  79. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/coordinator/backoff.py +0 -0
  80. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/coordinator/errors.py +0 -0
  81. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/coordinator/ws.py +0 -0
  82. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/coordinator_api.py +0 -0
  83. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/encoders_patches.py +0 -0
  84. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/g711.py +0 -0
  85. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/location_discovery.py +0 -0
  86. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/models.py +0 -0
  87. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/network_monitor.py +0 -0
  88. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/participants.py +0 -0
  89. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/pb/__init__.py +0 -0
  90. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/pb/stream/__init__.py +0 -0
  91. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/pb/stream/video/__init__.py +0 -0
  92. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/pb/stream/video/sfu/__init__.py +0 -0
  93. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/pb/stream/video/sfu/event/__init__.py +0 -0
  94. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/pb/stream/video/sfu/event/events_pb2.py +0 -0
  95. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/pb/stream/video/sfu/event/events_pb2.pyi +0 -0
  96. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/pb/stream/video/sfu/models/__init__.py +0 -0
  97. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/pb/stream/video/sfu/models/models_pb2.py +0 -0
  98. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/pb/stream/video/sfu/models/models_pb2.pyi +0 -0
  99. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/pb/stream/video/sfu/signal_rpc/__init__.py +0 -0
  100. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/pb/stream/video/sfu/signal_rpc/signal_pb2.py +0 -0
  101. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/pb/stream/video/sfu/signal_rpc/signal_pb2.pyi +0 -0
  102. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/pb/stream/video/sfu/signal_rpc/signal_twirp.py +0 -0
  103. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/pc.py +0 -0
  104. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/peer_connection.py +0 -0
  105. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/reconnection.py +0 -0
  106. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/recording.py +0 -0
  107. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/signaling.py +0 -0
  108. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/stats_reporter.py +0 -0
  109. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/stats_tracer.py +0 -0
  110. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/tracer.py +0 -0
  111. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/track_util.py +0 -0
  112. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/tracks.py +0 -0
  113. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/twirp_client_wrapper.py +0 -0
  114. {getstream-3.1.2 → getstream-3.2.0}/getstream/video/rtc/utils.py +0 -0
  115. {getstream-3.1.2 → getstream-3.2.0}/getstream/webhook.py +0 -0
  116. {getstream-3.1.2 → getstream-3.2.0}/pyproject.toml +0 -0
  117. {getstream-3.1.2 → getstream-3.2.0}/pytest.ini +0 -0
  118. {getstream-3.1.2 → getstream-3.2.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: getstream
3
- Version: 3.1.2
3
+ Version: 3.2.0
4
4
  Summary: GetStream Python SDK - Build scalable activity feeds, chat, and video calling applications
5
5
  Author-email: sachaarbonel <sacha.arbonel@hotmail.fr>, tbarbugli <tbarbugli@gmail.com>
6
6
  License-File: LICENSE.md
@@ -158,12 +158,38 @@ class BaseClient(TelemetryEndpointMixin, BaseConfig, ResponseParserMixin, ABC):
158
158
  timeout=timeout,
159
159
  user_agent=user_agent,
160
160
  )
161
- self.client = httpx.Client(
162
- base_url=self.base_url or "",
163
- headers=self.headers,
164
- params=self.params,
165
- timeout=httpx.Timeout(self.timeout),
166
- )
161
+ http_client = getattr(self, "_http_client", None)
162
+ if http_client is not None:
163
+ if not isinstance(http_client, httpx.Client):
164
+ raise TypeError(
165
+ f"http_client must be an httpx.Client instance, "
166
+ f"got {type(http_client).__name__}"
167
+ )
168
+ http_client.headers.update(self.headers)
169
+ http_client.params = http_client.params.merge(self.params)
170
+ http_client.base_url = self.base_url or ""
171
+ if self.timeout is not None:
172
+ http_client.timeout = httpx.Timeout(self.timeout)
173
+ self.client = http_client
174
+ self._owns_http_client = False
175
+ else:
176
+ transport = getattr(self, "_transport", None)
177
+ if transport is not None:
178
+ self.client = httpx.Client(
179
+ base_url=self.base_url or "",
180
+ headers=self.headers,
181
+ params=self.params,
182
+ timeout=httpx.Timeout(self.timeout),
183
+ transport=transport,
184
+ )
185
+ else:
186
+ self.client = httpx.Client(
187
+ base_url=self.base_url or "",
188
+ headers=self.headers,
189
+ params=self.params,
190
+ timeout=httpx.Timeout(self.timeout),
191
+ )
192
+ self._owns_http_client = True
167
193
 
168
194
  def __enter__(self):
169
195
  return self
@@ -348,8 +374,13 @@ class BaseClient(TelemetryEndpointMixin, BaseConfig, ResponseParserMixin, ABC):
348
374
  def close(self):
349
375
  """
350
376
  Close HTTPX client.
377
+
378
+ If the client was provided externally via ``http_client``, this is a
379
+ no-op — the caller that created the client is responsible for closing
380
+ it.
351
381
  """
352
- self.client.close()
382
+ if getattr(self, "_owns_http_client", True):
383
+ self.client.close()
353
384
 
354
385
 
355
386
  class AsyncBaseClient(TelemetryEndpointMixin, BaseConfig, ResponseParserMixin, ABC):
@@ -368,12 +399,38 @@ class AsyncBaseClient(TelemetryEndpointMixin, BaseConfig, ResponseParserMixin, A
368
399
  timeout=timeout,
369
400
  user_agent=user_agent,
370
401
  )
371
- self.client = httpx.AsyncClient(
372
- base_url=self.base_url or "",
373
- headers=self.headers,
374
- params=self.params,
375
- timeout=httpx.Timeout(self.timeout),
376
- )
402
+ http_client = getattr(self, "_http_client", None)
403
+ if http_client is not None:
404
+ if not isinstance(http_client, httpx.AsyncClient):
405
+ raise TypeError(
406
+ f"http_client must be an httpx.AsyncClient instance, "
407
+ f"got {type(http_client).__name__}"
408
+ )
409
+ http_client.headers.update(self.headers)
410
+ http_client.params = http_client.params.merge(self.params)
411
+ http_client.base_url = self.base_url or ""
412
+ if self.timeout is not None:
413
+ http_client.timeout = httpx.Timeout(self.timeout)
414
+ self.client = http_client
415
+ self._owns_http_client = False
416
+ else:
417
+ transport = getattr(self, "_transport", None)
418
+ if transport is not None:
419
+ self.client = httpx.AsyncClient(
420
+ base_url=self.base_url or "",
421
+ headers=self.headers,
422
+ params=self.params,
423
+ timeout=httpx.Timeout(self.timeout),
424
+ transport=transport,
425
+ )
426
+ else:
427
+ self.client = httpx.AsyncClient(
428
+ base_url=self.base_url or "",
429
+ headers=self.headers,
430
+ params=self.params,
431
+ timeout=httpx.Timeout(self.timeout),
432
+ )
433
+ self._owns_http_client = True
377
434
 
378
435
  async def __aenter__(self):
379
436
  return self
@@ -382,8 +439,14 @@ class AsyncBaseClient(TelemetryEndpointMixin, BaseConfig, ResponseParserMixin, A
382
439
  await self.aclose()
383
440
 
384
441
  async def aclose(self):
385
- """Close HTTPX async client (closes pools/keep-alives)."""
386
- await self.client.aclose()
442
+ """Close HTTPX async client (closes pools/keep-alives).
443
+
444
+ If the client was provided externally via ``http_client``, this is a
445
+ no-op — the caller that created the client is responsible for closing
446
+ it.
447
+ """
448
+ if getattr(self, "_owns_http_client", True):
449
+ await self.client.aclose()
387
450
 
388
451
  async def _upload_multipart(
389
452
  self,
@@ -6,6 +6,7 @@ import time
6
6
  from typing import List, Optional
7
7
  from uuid import uuid4
8
8
 
9
+ import httpx
9
10
  import jwt
10
11
  from pydantic_settings import BaseSettings, SettingsConfigDict
11
12
 
@@ -47,7 +48,12 @@ class BaseStream:
47
48
  timeout: Optional[float] = 6.0,
48
49
  base_url: Optional[str] = BASE_URL,
49
50
  user_agent: Optional[str] = None,
51
+ transport=None,
52
+ http_client=None,
50
53
  ):
54
+ if transport is not None and http_client is not None:
55
+ raise ValueError("Cannot specify both 'transport' and 'http_client'")
56
+
51
57
  if None in (api_key, api_secret, timeout, base_url):
52
58
  s = Settings() # loads from env and optional .env
53
59
  api_key = api_key or s.api_key
@@ -68,10 +74,29 @@ class BaseStream:
68
74
 
69
75
  self.base_url = validate_and_clean_url(base_url)
70
76
  self.user_agent = user_agent
77
+ self._transport = transport
78
+ self._http_client = http_client
71
79
  self.token = self._create_token()
72
80
  super().__init__(
73
81
  self.api_key, self.base_url, self.token, self.timeout, self.user_agent
74
82
  )
83
+ # After super().__init__(), self.client is fully built and configured.
84
+ # When the user provided custom HTTP config, sub-clients share this
85
+ # client instead of each building their own.
86
+ if transport is not None or http_client is not None:
87
+ self._shared_client = self.client
88
+ else:
89
+ self._shared_client = None
90
+
91
+ def _apply_shared_client(self, sub_client):
92
+ """Replace a sub-client's auto-created httpx client with the shared
93
+ one built from user-provided transport/http_client config."""
94
+ if self._shared_client is not None:
95
+ if isinstance(sub_client.client, httpx.Client):
96
+ sub_client.client.close()
97
+ sub_client.client = self._shared_client
98
+ sub_client._owns_http_client = False
99
+ return sub_client
75
100
 
76
101
  def create_token(
77
102
  self,
@@ -169,13 +194,15 @@ class AsyncStream(BaseStream, AsyncCommonClient):
169
194
  Video stream client.
170
195
 
171
196
  """
172
- return AsyncVideoClient(
173
- api_key=self.api_key,
174
- base_url=self.base_url,
175
- token=self.token,
176
- timeout=self.timeout,
177
- stream=self,
178
- user_agent=self.user_agent,
197
+ return self._apply_shared_client(
198
+ AsyncVideoClient(
199
+ api_key=self.api_key,
200
+ base_url=self.base_url,
201
+ token=self.token,
202
+ timeout=self.timeout,
203
+ stream=self,
204
+ user_agent=self.user_agent,
205
+ )
179
206
  )
180
207
 
181
208
  @cached_property
@@ -184,13 +211,15 @@ class AsyncStream(BaseStream, AsyncCommonClient):
184
211
  Chat stream client.
185
212
 
186
213
  """
187
- return AsyncChatClient(
188
- api_key=self.api_key,
189
- base_url=self.base_url,
190
- token=self.token,
191
- timeout=self.timeout,
192
- stream=self,
193
- user_agent=self.user_agent,
214
+ return self._apply_shared_client(
215
+ AsyncChatClient(
216
+ api_key=self.api_key,
217
+ base_url=self.base_url,
218
+ token=self.token,
219
+ timeout=self.timeout,
220
+ stream=self,
221
+ user_agent=self.user_agent,
222
+ )
194
223
  )
195
224
 
196
225
  @cached_property
@@ -199,13 +228,15 @@ class AsyncStream(BaseStream, AsyncCommonClient):
199
228
  Moderation stream client.
200
229
 
201
230
  """
202
- return AsyncModerationClient(
203
- api_key=self.api_key,
204
- base_url=self.base_url,
205
- token=self.token,
206
- timeout=self.timeout,
207
- stream=self,
208
- user_agent=self.user_agent,
231
+ return self._apply_shared_client(
232
+ AsyncModerationClient(
233
+ api_key=self.api_key,
234
+ base_url=self.base_url,
235
+ token=self.token,
236
+ timeout=self.timeout,
237
+ stream=self,
238
+ user_agent=self.user_agent,
239
+ )
209
240
  )
210
241
 
211
242
  async def aclose(self):
@@ -291,13 +322,15 @@ class Stream(BaseStream, CommonClient):
291
322
  Video stream client.
292
323
 
293
324
  """
294
- return VideoClient(
295
- api_key=self.api_key,
296
- base_url=self.base_url,
297
- token=self.token,
298
- timeout=self.timeout,
299
- stream=self,
300
- user_agent=self.user_agent,
325
+ return self._apply_shared_client(
326
+ VideoClient(
327
+ api_key=self.api_key,
328
+ base_url=self.base_url,
329
+ token=self.token,
330
+ timeout=self.timeout,
331
+ stream=self,
332
+ user_agent=self.user_agent,
333
+ )
301
334
  )
302
335
 
303
336
  @cached_property
@@ -306,13 +339,15 @@ class Stream(BaseStream, CommonClient):
306
339
  Chat stream client.
307
340
 
308
341
  """
309
- return ChatClient(
310
- api_key=self.api_key,
311
- base_url=self.base_url,
312
- token=self.token,
313
- timeout=self.timeout,
314
- stream=self,
315
- user_agent=self.user_agent,
342
+ return self._apply_shared_client(
343
+ ChatClient(
344
+ api_key=self.api_key,
345
+ base_url=self.base_url,
346
+ token=self.token,
347
+ timeout=self.timeout,
348
+ stream=self,
349
+ user_agent=self.user_agent,
350
+ )
316
351
  )
317
352
 
318
353
  @cached_property
@@ -321,13 +356,15 @@ class Stream(BaseStream, CommonClient):
321
356
  Moderation stream client.
322
357
 
323
358
  """
324
- return ModerationClient(
325
- api_key=self.api_key,
326
- base_url=self.base_url,
327
- token=self.token,
328
- timeout=self.timeout,
329
- stream=self,
330
- user_agent=self.user_agent,
359
+ return self._apply_shared_client(
360
+ ModerationClient(
361
+ api_key=self.api_key,
362
+ base_url=self.base_url,
363
+ token=self.token,
364
+ timeout=self.timeout,
365
+ stream=self,
366
+ user_agent=self.user_agent,
367
+ )
331
368
  )
332
369
 
333
370
  @cached_property
@@ -336,13 +373,15 @@ class Stream(BaseStream, CommonClient):
336
373
  Feeds stream client.
337
374
 
338
375
  """
339
- return FeedsClient(
340
- api_key=self.api_key,
341
- base_url=self.base_url,
342
- token=self.token,
343
- timeout=self.timeout,
344
- stream=self,
345
- user_agent=self.user_agent,
376
+ return self._apply_shared_client(
377
+ FeedsClient(
378
+ api_key=self.api_key,
379
+ base_url=self.base_url,
380
+ token=self.token,
381
+ timeout=self.timeout,
382
+ stream=self,
383
+ user_agent=self.user_agent,
384
+ )
346
385
  )
347
386
 
348
387
  @telemetry.operation_name("getstream.api.common.create_user")
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes