Skip to content

feat(realtime): port JS SDK realtime features#26

Merged
AdirAmsalem merged 1 commit intomainfrom
feat/realtime-parity-js-sdk
Feb 11, 2026
Merged

feat(realtime): port JS SDK realtime features#26
AdirAmsalem merged 1 commit intomainfrom
feat/realtime-parity-js-sdk

Conversation

@AdirAmsalem
Copy link
Contributor

@AdirAmsalem AdirAmsalem commented Feb 11, 2026

Summary

  • Port missing realtime client features from the JS SDK to the Python SDK, closing all gaps from cross-SDK analysis
  • 24/24 tests passing

New Features

  • Subscribe mode: SubscribeClient with URL-safe token encode/decode, event buffer, on/off handlers
  • Server-assigned session: session_id and subscribe_token properties populated via on_session_id callback
  • Event buffer: Deferred flush via call_soon() (matches JS setTimeout(0)) — handlers registered after connect() still receive events emitted during connect
  • Connection states: generating and reconnecting states, sticky generating that only transitions on disconnect
  • Auto-reconnect: Tenacity-backed retry with generation counter, CancelledError short-circuit, stale reconnect detection
  • set_image improvements: Accepts None to clear image, optional prompt/enhance parameters, works for all models (not just avatar-live)
  • enrichenhance rename: Prompt.enhance field; set_prompt(enrich=...) backward compat with deprecation warning

Files Changed

  • decart/realtime/client.py — subscribe classmethod, event buffer, session_id, set_image/set_prompt improvements
  • decart/realtime/subscribe.pyNEW: SubscribeClient, token encode/decode
  • decart/realtime/webrtc_manager.py — auto-reconnect, generation counter, state management, P1/P2 fixes
  • decart/realtime/webrtc_connection.py — session_id callback, generating state, ICE restart fix, WS close fix
  • decart/realtime/messages.py — GenerationStartedMessage
  • decart/realtime/types.py — expanded ConnectionState literal
  • decart/types.pyPrompt.enrichPrompt.enhance
  • decart/__init__.py, decart/realtime/__init__.py — subscribe exports
  • examples/realtime_file.py, examples/realtime_synthetic.py — enhance rename
  • tests/test_realtime_unit.py — 24 tests (session_id, buffer, set_image null/prompt/enhance)

Testing

24 passed in 0.43s

@AdirAmsalem AdirAmsalem force-pushed the feat/realtime-parity-js-sdk branch from ee1149b to 0fdfbe0 Compare February 11, 2026 14:12
@AdirAmsalem AdirAmsalem changed the title feat(realtime): port JS SDK realtime features and fix P1/P2 bugs feat(realtime): port JS SDK realtime features Feb 11, 2026
Port missing realtime client features from the JS SDK to the Python SDK,
closing all identified gaps from the cross-SDK analysis. Also fixes all
P1/P2 bugs found through external reviews and self-review.

New features:
- Subscribe mode (SubscribeClient, token encode/decode)
- Server-assigned session_id and subscribe_token
- Event buffer (deferred flush matching JS setTimeout(0))
- Generating/reconnecting connection states
- Auto-reconnect with tenacity (generation counter, CancelledError handling)
- set_image(None) to clear, prompt/enhance options on set_image
- Prompt.enrich renamed to Prompt.enhance (backward compat in set_prompt)

Bug fixes (P1):
- connect() retry no longer leaks connection objects
- _reconnect() resets _is_reconnecting via finally (CancelledError safe)
- WS close transitions state to disconnected (triggers reconnect)
- ICE restart preserves tracks, transceivers, and icecandidate handler

Bug fixes (P2):
- connect() classmethod cleans up manager on post-connect failure
- Callback dispatch iterates list copy (safe self-removal)
- cleanup() nulls _connection for cleaner post-disconnect errors
- _image_to_base64 validates unrecognized strings (raises InvalidInputError)
- Subscribe tokens use URL-safe base64
@AdirAmsalem AdirAmsalem force-pushed the feat/realtime-parity-js-sdk branch from 0fdfbe0 to 55e8b27 Compare February 11, 2026 14:13
@AdirAmsalem AdirAmsalem merged commit 7e1ffae into main Feb 11, 2026
8 checks passed
@AdirAmsalem AdirAmsalem deleted the feat/realtime-parity-js-sdk branch February 11, 2026 14:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant