Skip to content

Commit 0e724c2

Browse files
committed
ADD: Add session ID property to the Live client
1 parent db0b76f commit 0e724c2

File tree

4 files changed

+39
-3
lines changed

4 files changed

+39
-3
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## 0.66.0 - TBD
4+
5+
#### Enhancements
6+
- Added a property `Live.session_id` which returns the streaming session ID when the client is connected
7+
38
## 0.65.0 - 2025-11-11
49

510
#### Deprecations

databento/live/client.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,19 @@ def port(self) -> int:
214214
"""
215215
return self._port
216216

217+
@property
218+
def session_id(self) -> str | None:
219+
"""
220+
Return the session ID for the current session. If `None`, the client is
221+
not connected.
222+
223+
Returns
224+
-------
225+
str | None
226+
227+
"""
228+
return self._session.session_id
229+
217230
@property
218231
def symbology_map(self) -> dict[int, str | int]:
219232
"""
@@ -365,7 +378,9 @@ def add_reconnect_callback(
365378

366379
callback_name = getattr(reconnect_callback, "__name__", str(reconnect_callback))
367380
logger.info("adding user reconnect callback %s", callback_name)
368-
self._session._user_reconnect_callbacks.append((reconnect_callback, exception_callback))
381+
self._session._user_reconnect_callbacks.append(
382+
(reconnect_callback, exception_callback),
383+
)
369384

370385
def start(
371386
self,

databento/live/session.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,12 @@ def disable(self) -> None:
7272
"""
7373
self._enabled.clear()
7474

75-
def put(self, item: DBNRecord, block: bool = True, timeout: float | None = None) -> None:
75+
def put(
76+
self,
77+
item: DBNRecord,
78+
block: bool = True,
79+
timeout: float | None = None,
80+
) -> None:
7681
"""
7782
Put an item on the queue if the queue is enabled.
7883
@@ -498,6 +503,7 @@ def subscribe(
498503

499504
with self._lock:
500505
if self._protocol is None:
506+
self._session_id = None
501507
self._connect(dataset=dataset)
502508

503509
self._subscription_counter += 1
@@ -654,7 +660,10 @@ async def _reconnect(self) -> None:
654660

655661
should_restart = self.is_streaming()
656662
if self._protocol._last_ts_event is not None:
657-
gap_start = pd.Timestamp(self._protocol._last_ts_event, tz="UTC")
663+
gap_start = pd.Timestamp(
664+
self._protocol._last_ts_event,
665+
tz="UTC",
666+
)
658667
elif self._metadata.data is not None:
659668
gap_start = pd.Timestamp(self._metadata.data.start, tz="UTC")
660669
else:

tests/test_live_client.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ async def test_live_connect_auth(
254254
assert message.auth.endswith(live_client.key[-BUCKET_ID_LENGTH:])
255255
assert message.dataset == live_client.dataset
256256
assert message.encoding == Encoding.DBN
257+
assert live_client.session_id is not None
257258

258259

259260
async def test_live_client_reuse(
@@ -273,8 +274,10 @@ async def test_live_client_reuse(
273274
message_type=gateway.AuthenticationRequest,
274275
)
275276

277+
first_session_id = live_client.session_id
276278
live_client.start()
277279
live_client.stop()
280+
assert live_client.session_id == first_session_id
278281

279282
await asyncio.sleep(1)
280283

@@ -287,10 +290,14 @@ async def test_live_client_reuse(
287290
message_type=gateway.AuthenticationRequest,
288291
)
289292

293+
second_session_id = live_client.session_id
290294
live_client.start()
291295
live_client.stop()
292296
await live_client.wait_for_close()
293297

298+
assert live_client.session_id == second_session_id
299+
assert first_session_id != second_session_id
300+
294301

295302
async def test_live_connect_auth_with_heartbeat_interval(
296303
mock_live_server: MockLiveServerInterface,

0 commit comments

Comments
 (0)