diff --git a/Cargo.lock b/Cargo.lock index 372993e..570dc3f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2937,6 +2937,7 @@ dependencies = [ "dioxus-logger", "futures", "gloo-net", + "gloo-timers", "js-sys", "log", "serde", diff --git a/Cargo.toml b/Cargo.toml index 26b1833..618a093 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,6 +53,7 @@ serde = { version = "1.0.142", features = ["derive"] } serde_json = "1.0.100" futures = "0.3.31" gloo-net = "0.6" +gloo-timers = { version = "0.3", features = ["futures"] } [dev-dependencies] tempfile = "3.6" diff --git a/docs/architecture/signaling_flow.md b/docs/architecture/signaling_flow.md index 8071438..49c311c 100644 --- a/docs/architecture/signaling_flow.md +++ b/docs/architecture/signaling_flow.md @@ -8,7 +8,7 @@ Dieses Dokument beschreibt, wie das Voice-Channel-Modul mit Signaling-Server (`n - **TURN (`niom-turn`)**: UDP/TLS TURN-Server mit STUN-Fallback. Sorgt für NAT-Traversal, sobald ICE-Candidates verwendet werden. ## Flow (MVP Heutiger Stand) -1. **WebSocket-Aufbau**: `ConnectionPanel` verbindet sich zu `ws://localhost:3478/ws`. +1. **WebSocket-Aufbau & Reconnect**: `ConnectionPanel` verbindet sich zu `ws://localhost:3478/ws` und nutzt den `SignalingProvider`, der bei Fehlern mit exponentiellem Backoff erneut verbindet. 2. **Peer-ID**: Clients generieren lokale IDs; Remote-ID wird manuell eingetragen. 3. **Offer/Answer**: - Initiator (`CallControls`) baut `RtcPeerConnection`, hängt lokale Audio-Tracks an und erzeugt ein Offer (SDP). diff --git a/docs/components/connection_panel.md b/docs/components/connection_panel.md index 3efbe0b..ecbde85 100644 --- a/docs/components/connection_panel.md +++ b/docs/components/connection_panel.md @@ -13,7 +13,7 @@ ## Ablauf 1. **Peer-ID generieren** (`use_effect` mit Timestamp + Random). -2. **WebSocket verbinden** (`ws://localhost:3478/ws`): setzt `onopen/onclose/onmessage` Handler. +2. **WebSocket verbinden** (`ws://localhost:3478/ws`): setzt `onopen/onclose/onmessage` Handler und löst bei Verbindungsabbruch automatisch exponentielles Backoff-Reconnect aus. 3. **Offer-Coroutine** (`use_coroutine`): empfängt `SignalingMessage` vom Typ `offer`, baut PeerConnection (Responder) und sendet Answer. 4. **ICE-Kandidaten**: `onicecandidate` sendet Kandidaten zurück; empfangene Kandidaten werden an vorhandene PCs angehängt. 5. **Audio-Wiedergabe**: `ontrack` erstellt `