Signatur
Beschreibung
Das Ereignis connectionstatechange wird an einer RTCPeerConnection ausgelöst, wenn sich der Wert von RTCPeerConnection.connectionState ändert. Man registriert es entweder mit addEventListener("connectionstatechange", handler) oder über die Eigenschaft onconnectionstatechange. Das Ereignis ist ein einfaches Event ohne zusätzliche Daten. Es steigt nicht auf (bubbling) und lässt sich nicht abbrechen. Den neuen Zustand liest man im Handler direkt aus pc.connectionState aus.
connectionState fasst die Zustände aller ICE- und DTLS-Transporte der Verbindung zusammen. Mögliche Werte sind "new", "connecting", "connected", "disconnected", "failed" und "closed". Deshalb eignet sich dieses Ereignis besser für die Anzeige in der Oberfläche und die Fehlerbehandlung als iceconnectionstatechange, das nur die ICE-Ebene betrachtet.
Typische Einsätze:
- den Status „Verbinde…“, „Verbunden“ oder „Verbindung verloren“ anzeigen,
- bei
"failed"einen ICE-Neustart mitpc.restartIce()auslösen, - bei
"disconnected"eine Zeit lang warten, ob sich die Verbindung von selbst erholt, - Ressourcen wie Medien-Tracks und Timer aufräumen, wenn die Verbindung endgültig beendet ist.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Der Ereignisname "connectionstatechange". |
|
| $handler Pflicht | (event: Event) => void | Callback-Funktion. Sie erhält ein einfaches Event. Den neuen Zustand liefert event.target.connectionState bzw. pc.connectionState. |
|
| $options | boolean | AddEventListenerOptions | false | Optionale Einstellungen wie once oder signal, zum Beispiel ein AbortSignal, um den Listener gezielt wieder zu entfernen. |
Rückgabewert
addEventListener gibt nichts zurück. Der Rückgabewert des Handlers wird ignoriert.Beispiele
Verbindungsstatus in der Oberfläche anzeigen
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'
};
pc.addEventListener('connectionstatechange', () => {
console.log('Neuer Zustand:', pc.connectionState);
document.querySelector('#status').textContent = labels[pc.connectionState];
});
Automatischer ICE-Neustart bei Fehlern
const pc = new RTCPeerConnection();
let disconnectTimer = null;
pc.onconnectionstatechange = () => {
switch (pc.connectionState) {
case 'disconnected':
// Kurz warten – oft erholt sich die Verbindung von selbst
disconnectTimer = setTimeout(() => {
if (pc.connectionState === 'disconnected') pc.restartIce();
}, 5000);
break;
case 'failed':
console.warn('Verbindung fehlgeschlagen – starte ICE neu');
pc.restartIce(); // löst negotiationneeded aus
break;
case 'connected':
clearTimeout(disconnectTimer);
break;
}
};
Listener mit AbortController wieder entfernen
const pc = new RTCPeerConnection();
const controller = new AbortController();
pc.addEventListener('connectionstatechange', () => {
if (pc.connectionState === 'connected') {
console.log('Erstverbindung steht – Listener wird entfernt');
controller.abort();
}
}, { signal: controller.signal });
// Alternative ohne Signal:
// const onChange = () => { /* ... */ };
// pc.addEventListener('connectionstatechange', onChange);
// pc.removeEventListener('connectionstatechange', onChange);
// bzw. pc.onconnectionstatechange = null;
// Wichtig · Fallstricke
- Kein Ereignis bei
close(): Ruft manpc.close()selbst auf, springtconnectionStateauf"closed", ohne dassconnectionstatechangeausgelöst wird. Aufräumarbeiten sollten daher zusätzlich direkt nach demclose()-Aufruf erfolgen. "disconnected"ist oft nur vorübergehend, zum Beispiel bei einem Wechsel von WLAN zu Mobilfunk. Nicht sofort abbrechen, sondern eine Wartezeit einplanen. Erst"failed"bedeutet, dass die Verbindung ohne ICE-Neustart nicht zurückkommt.- Browser-Kompatibilität: Firefox unterstützt
connectionStateund dieses Ereignis erst ab Version 113. Für ältere Browser kann man als RückfallebeneiceconnectionstatechangemiticeConnectionStateverwenden. - Die frühere MDN-Formulierung, das Ereignis hänge mit neuen Tracks an einem
RTCRtpReceiverzusammen, ist irreführend. Für neue Tracks ist das Ereignistrackzuständig. - Das Ereignis enthält keine Zustandsdaten. Den Zustand immer aus
pc.connectionStatelesen.