Signatur
Beschreibung
Die Eigenschaft connectionState einer RTCPeerConnection fasst den Zustand aller Transportwege der Verbindung in einem einzigen Wert zusammen. Dazu gehören die ICE-Transporte und die DTLS-Transporte. Für Anwendungen ist das meist der wichtigste Wert, um festzustellen, ob Medien oder Datenkanäle tatsächlich übertragen werden können.
Mögliche Werte:
"new": Mindestens ein Transport ist im Zustandnew, und keiner hat bisher angefangen, eine Verbindung aufzubauen. Außerdem sind alle anderen Transportenewoderclosed, oder es gibt noch gar keine Transporte."connecting": Mindestens ein Transport baut gerade eine Verbindung auf oder führt die Prüfungen dafür durch."connected": Alle Transporte, die in Gebrauch sind, sind verbunden (connectedbzw.completed) oder geschlossen."disconnected": Mindestens ein Transport hat die Verbindung verloren. Das ist oft nur vorübergehend, zum Beispiel beim Wechsel des Netzwerks."failed": Mindestens ein Transport ist endgültig gescheitert. Ohne einen ICE-Neustart erholt sich die Verbindung nicht mehr."closed": Die Verbindung wurde mitclose()geschlossen.
Änderungen am Zustand werden über das Ereignis connectionstatechange gemeldet. Du kannst es mit pc.addEventListener("connectionstatechange", handler) oder über die Eigenschaft pc.onconnectionstatechange abonnieren. Typische Einsatzfälle sind Statusanzeigen in der Oberfläche („Verbinde…“, „Verbunden“), das automatische Wiederverbinden und das Aufräumen von Ressourcen, wenn ein Anruf endet.
Rückgabewert
RTCPeerConnectionState, der den aktuellen Gesamtzustand der Verbindung angibt.Beispiele
Aktuellen Zustand auslesen
const pc = new RTCPeerConnection();
console.log(pc.connectionState);
pc.close();
console.log(pc.connectionState);
Statusanzeige über connectionstatechange
const pc = new RTCPeerConnection({
iceServers: [{ urls: "stun:stun.l.google.com:19302" }]
});
const labels = {
new: "Bereit",
connecting: "Verbinde …",
connected: "Verbunden",
disconnected: "Verbindung unterbrochen",
failed: "Verbindung fehlgeschlagen",
closed: "Beendet"
};
const onStateChange = () => {
console.log(`Status: ${labels[pc.connectionState]}`);
};
pc.addEventListener("connectionstatechange", onStateChange);
// Später, z. B. beim Verlassen der Seite:
// pc.removeEventListener("connectionstatechange", onStateChange);
Automatischer ICE-Neustart bei Fehler
// signaling ist ein eigenes Objekt, z. B. ein WebSocket-Wrapper
const watchConnection = (pc, signaling) => {
let timer = null;
pc.onconnectionstatechange = async () => {
switch (pc.connectionState) {
case "disconnected":
// Kurz abwarten, oft erholt sich die Verbindung von selbst
timer = setTimeout(() => pc.restartIce(), 5000);
break;
case "failed": {
clearTimeout(timer);
const offer = await pc.createOffer({ iceRestart: true });
await pc.setLocalDescription(offer);
signaling.send({ type: "offer", sdp: pc.localDescription });
break;
}
case "connected":
clearTimeout(timer);
break;
case "closed":
clearTimeout(timer);
pc.onconnectionstatechange = null;
break;
}
};
};
// Wichtig · Fallstricke
- Schreibgeschützt: Wenn du der Eigenschaft einen Wert zuweist, passiert nichts (im Strict Mode wird ein
TypeErrorausgelöst). Den Zustand änderst du nur indirekt, zum Beispiel überclose()oderrestartIce(). disconnectedist nicht endgültig: Die Verbindung kann von selbst wieder zuconnectedzurückkehren. Beende einen Anruf deshalb nicht sofort, sondern warte eine Karenzzeit ab. Erstfailedbraucht einen ICE-Neustart.- Kein Ereignis bei
close(): Wenn du selbstpc.close()aufrufst, wirdconnectionstatechangein der Regel nicht ausgelöst. Räume in diesem Fall direkt nach dem Aufruf auf. - Unterschied zu
iceConnectionState:connectionStateberücksichtigt zusätzlich den DTLS-Transport. Damit ist es aussagekräftiger dafür, ob wirklich verschlüsselte Daten fließen können. - Kompatibilität: Firefox unterstützt die Eigenschaft erst ab Version 113. In sehr alten Browsern ist sie nicht vorhanden. Als Rückfalllösung dient
iceConnectionState, zum Beispiel so:pc.connectionState ?? pc.iceConnectionState.