Skip to content

Commit be8be5e

Browse files
authored
feat(web): expose public ts property on ChatStream (#1880)
1 parent e513558 commit be8be5e

4 files changed

Lines changed: 51 additions & 0 deletions

File tree

slack_sdk/web/async_chat_stream.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,15 @@ def __init__(
8686
self._stream_ts: Optional[str] = None
8787
self._buffer_size = buffer_size
8888

89+
@property
90+
def ts(self) -> Optional[str]:
91+
"""The message timestamp of the stream.
92+
93+
Returns None until the first flush (when chat.startStream is called).
94+
Can be used with chat.update as a fallback if the stream expires server-side.
95+
"""
96+
return self._stream_ts
97+
8998
async def append(
9099
self,
91100
*,

slack_sdk/web/chat_stream.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,15 @@ def __init__(
7676
self._stream_ts: Optional[str] = None
7777
self._buffer_size = buffer_size
7878

79+
@property
80+
def ts(self) -> Optional[str]:
81+
"""The message timestamp of the stream.
82+
83+
Returns None until the first flush (when chat.startStream is called).
84+
Can be used with chat.update as a fallback if the stream expires server-side.
85+
"""
86+
return self._stream_ts
87+
7988
def append(
8089
self,
8190
*,

tests/slack_sdk/web/test_chat_stream.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,22 @@ def test_streams_with_authorship_args(self):
262262
self.assertEqual(start_request.get("icon_emoji"), "abacus")
263263
self.assertNotIn("icon_url", start_request)
264264

265+
def test_ts_property_is_none_before_flush_and_set_after(self):
266+
streamer = self.client.chat_stream(
267+
buffer_size=5,
268+
channel="C0123456789",
269+
thread_ts="123.000",
270+
recipient_team_id="T0123456789",
271+
recipient_user_id="U0123456789",
272+
)
273+
self.assertIsNone(streamer.ts)
274+
275+
streamer.append(markdown_text="hello!")
276+
self.assertEqual(streamer.ts, "123.123")
277+
278+
streamer.stop()
279+
self.assertEqual(streamer.ts, "123.123")
280+
265281
def test_streams_errors_when_appending_to_an_unstarted_stream(self):
266282
streamer = self.client.chat_stream(
267283
channel="C0123456789",

tests/slack_sdk_async/web/test_async_chat_stream.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,23 @@ async def test_streams_a_chunk_message(self):
244244
'[{"text": "\\n", "type": "markdown_text"}, {"text": ":space_invader:", "type": "markdown_text"}]',
245245
)
246246

247+
@async_test
248+
async def test_ts_property_is_none_before_flush_and_set_after(self):
249+
streamer = await self.client.chat_stream(
250+
buffer_size=5,
251+
channel="C0123456789",
252+
thread_ts="123.000",
253+
recipient_team_id="T0123456789",
254+
recipient_user_id="U0123456789",
255+
)
256+
self.assertIsNone(streamer.ts)
257+
258+
await streamer.append(markdown_text="hello!")
259+
self.assertEqual(streamer.ts, "123.123")
260+
261+
await streamer.stop()
262+
self.assertEqual(streamer.ts, "123.123")
263+
247264
@async_test
248265
async def test_streams_errors_when_appending_to_an_unstarted_stream(self):
249266
streamer = await self.client.chat_stream(

0 commit comments

Comments
 (0)