Signatur
Beschreibung
Die Eigenschaft state eines RTCDtlsTransport-Objekts gibt an, in welchem Zustand sich die verschlüsselte DTLS-Schicht (Datagram Transport Layer Security) einer WebRTC-Verbindung gerade befindet. Über DTLS werden die Schlüssel für SRTP (Audio/Video) ausgehandelt, und der SCTP-Verkehr der Datenkanäle wird darüber abgesichert. Ein Transport erreicht nur dann "connected", wenn die Gegenseite ihre Identität über ihr Zertifikat nachgewiesen hat.
Mögliche Werte:
"new"– Die DTLS-Aushandlung hat noch nicht begonnen."connecting"– Der DTLS-Handshake läuft gerade (Zertifikate und Schlüssel werden ausgetauscht)."connected"– Der Handshake ist abgeschlossen, der Fingerabdruck des Zertifikats wurde geprüft, der Kanal ist gesichert."closed"– Der Transport wurde ordnungsgemäß geschlossen, z. B. durch eineclose_notify-Nachricht oderRTCPeerConnection.close()."failed"– Der Transport ist durch einen Fehler dauerhaft ausgefallen, etwa durch eine Fehler-Nachricht (Alert) oder weil der Zertifikats-Fingerabdruck nicht mit dem aus dem SDP übereinstimmt.
Auf den Transport greift man über RTCRtpSender.transport, RTCRtpReceiver.transport oder RTCSctpTransport.transport zu. Änderungen des Zustands meldet das Ereignis statechange (bzw. die Eigenschaft onstatechange). Das eignet sich gut zur Fehlersuche oder um in der Oberfläche gezielt anzuzeigen, dass es beim Verschlüsseln ein Problem gibt, während die ICE-Verbindung selbst noch funktioniert.
Rückgabewert
RTCDtlsTransportState), der den aktuellen DTLS-Zustand beschreibt.Beispiele
DTLS-Zustand eines Senders abfragen
const pc = new RTCPeerConnection();
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const sender = pc.addTrack(stream.getAudioTracks()[0], stream);
// transport ist erst nach setLocalDescription/setRemoteDescription gesetzt
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
console.log(sender.transport?.state);
Zustandsänderungen per statechange überwachen
const watchDtls = (transport) => {
if (!transport) return;
const log = () => console.log(`DTLS-Zustand: ${transport.state}`);
log();
transport.addEventListener('statechange', () => {
log();
if (transport.state === 'failed') {
console.error('DTLS-Handshake fehlgeschlagen – Zertifikat prüfen!');
}
});
};
// nach erfolgreicher Verhandlung
pc.getSenders().forEach((s) => watchDtls(s.transport));
Status aller Transporte zusammenfassen (z. B. für eine Diagnoseseite)
const dtlsStates = (pc) => {
const transports = new Set([
...pc.getSenders().map((s) => s.transport),
...pc.getReceivers().map((r) => r.transport),
pc.sctp?.transport,
].filter(Boolean));
return [...transports].map((t) => t.state);
};
const states = dtlsStates(pc);
const allSecure = states.length > 0 && states.every((s) => s === 'connected');
console.log(states, allSecure ? 'gesichert' : 'nicht (vollständig) gesichert');
Über die on-Property reagieren
const transport = pc.getReceivers()[0]?.transport;
if (transport) {
transport.onstatechange = () => {
document.querySelector('#status').textContent =
transport.state === 'connected' ? '🔒 Verschlüsselt' : `DTLS: ${transport.state}`;
};
}
// Wichtig · Fallstricke
- Transport ist anfangs
null:RTCRtpSender.transportbzw.RTCRtpReceiver.transportist erst gesetzt, wenn eine lokale oder entfernte Beschreibung angewendet wurde. Optional Chaining (?.) verwenden. - Gebündelte Transporte: Mit
bundlePolicy: "max-bundle"(Standard in modernen Browsern) teilen sich meist alle Sender, Empfänger und der SCTP-Transport einRTCDtlsTransport-Objekt. Deshalb nicht mehrfach Listener registrieren, sondern vorher mit einemSetdoppelte Einträge entfernen. - Endzustände:
"closed"und"failed"sind endgültig. Ein fehlgeschlagener Transport erholt sich nicht von selbst, nötig ist ein ICE-Neustart (pc.restartIce()) bzw. eine Neuverhandlung oder eine neue Verbindung. - Abgrenzung:
RTCIceTransport.statebeschreibt die Netzwerk-Konnektivität,RTCDtlsTransport.statedie Verschlüsselungsschicht darüber. Einen Gesamtüberblick bietetRTCPeerConnection.connectionState, der beide zusammenfasst. - Kompatibilität: Wird von Chrome/Edge (ab 72), Firefox (ab 82) und Safari (ab 15) unterstützt. Ältere Browser liefern kein
transport-Attribut. Deshalb vor dem Zugriff prüfen, ob es existiert.