Skip to content

Commit 180ab13

Browse files
nagar-decartclaude
andauthored
feat: Remove TURN fallback from Python SDK (#31)
TURN relay has been removed from the server — zero relay traffic in 30 days. Remove client-side ice-restart handling and TurnConfig types. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent c762747 commit 180ab13

2 files changed

Lines changed: 0 additions & 80 deletions

File tree

decart/realtime/messages.py

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -72,21 +72,6 @@ class ReadyMessage(BaseModel):
7272
type: Literal["ready"]
7373

7474

75-
class TurnConfig(BaseModel):
76-
"""TURN server configuration."""
77-
78-
username: str
79-
credential: str
80-
server_url: str
81-
82-
83-
class IceRestartMessage(BaseModel):
84-
"""ICE restart message with TURN config."""
85-
86-
type: Literal["ice-restart"]
87-
turn_config: TurnConfig
88-
89-
9075
class GenerationStartedMessage(BaseModel):
9176
"""Server signals that generation has started."""
9277

@@ -118,7 +103,6 @@ class GenerationEndedMessage(BaseModel):
118103
SetImageAckMessage,
119104
ErrorMessage,
120105
ReadyMessage,
121-
IceRestartMessage,
122106
GenerationStartedMessage,
123107
GenerationTickMessage,
124108
GenerationEndedMessage,

decart/realtime/webrtc_connection.py

Lines changed: 0 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
SetImageAckMessage,
2727
SetAvatarImageMessage,
2828
ErrorMessage,
29-
IceRestartMessage,
3029
SessionIdMessage,
3130
GenerationTickMessage,
3231
OutgoingMessage,
@@ -295,8 +294,6 @@ async def _handle_message(self, data: dict) -> None:
295294
self._handle_error(message)
296295
elif message.type == "ready":
297296
logger.debug("Received ready signal from server")
298-
elif message.type == "ice-restart":
299-
await self._handle_ice_restart(message)
300297

301298
async def _handle_answer(self, sdp: str) -> None:
302299
logger.debug("Received answer from server")
@@ -350,67 +347,6 @@ def _handle_error(self, message: ErrorMessage) -> None:
350347
if self._on_error:
351348
self._on_error(error)
352349

353-
async def _handle_ice_restart(self, message: IceRestartMessage) -> None:
354-
logger.info("Received ICE restart request from server")
355-
turn_config = message.turn_config
356-
# Re-setup peer connection with TURN server
357-
await self._setup_peer_connection_with_turn(turn_config)
358-
359-
async def _setup_peer_connection_with_turn(self, turn_config) -> None:
360-
ice_servers = [
361-
RTCIceServer(urls=["stun:stun.l.google.com:19302"]),
362-
RTCIceServer(
363-
urls=[turn_config.server_url],
364-
username=turn_config.username,
365-
credential=turn_config.credential,
366-
),
367-
]
368-
config = RTCConfiguration(iceServers=ice_servers)
369-
370-
if self._pc:
371-
await self._pc.close()
372-
373-
self._pc = RTCPeerConnection(configuration=config)
374-
logger.debug("Re-created peer connection with TURN server for ICE restart")
375-
376-
@self._pc.on("track")
377-
def on_track(track: MediaStreamTrack):
378-
logger.debug(f"Received remote track: {track.kind}")
379-
if self._on_remote_stream:
380-
self._on_remote_stream(track)
381-
382-
@self._pc.on("icecandidate")
383-
async def on_ice_candidate(candidate: RTCIceCandidate):
384-
if candidate:
385-
logger.debug(f"Local ICE candidate: {candidate.candidate}")
386-
await self._send_message(
387-
IceCandidateMessage(
388-
type="ice-candidate",
389-
candidate=IceCandidatePayload(
390-
candidate=candidate.candidate,
391-
sdpMLineIndex=candidate.sdpMLineIndex or 0,
392-
sdpMid=candidate.sdpMid or "",
393-
),
394-
)
395-
)
396-
397-
@self._pc.on("connectionstatechange")
398-
async def on_connection_state_change():
399-
logger.debug(f"Peer connection state: {self._pc.connectionState}")
400-
if self._pc.connectionState == "connected":
401-
await self._set_state("connected")
402-
elif self._pc.connectionState in ["failed", "closed"]:
403-
await self._set_state("disconnected")
404-
405-
if self._local_track is None:
406-
self._pc.addTransceiver("video", direction="recvonly")
407-
logger.debug("Added video transceiver (recvonly) for receive-only ICE restart")
408-
else:
409-
self._pc.addTrack(self._local_track)
410-
logger.debug("Re-added local track to peer connection for ICE restart")
411-
412-
await self._create_and_send_offer()
413-
414350
def register_image_set_wait(self) -> tuple[asyncio.Event, dict]:
415351
event = asyncio.Event()
416352
result: dict = {"success": False, "error": None}

0 commit comments

Comments
 (0)