Signatur
Beschreibung
Die schreibgeschützte Eigenschaft transport eines RTCRtpSender gibt das RTCDtlsTransport-Objekt zurück, über das die Medienpakete (RTP) und Steuerpakete (RTCP) des Senders verschlüsselt übertragen werden. Über dieses Objekt kommst du an den DTLS-Zustand (state), an die Zertifikate der Gegenstelle (getRemoteCertificates()) und über iceTransport an die darunterliegende ICE-Verbindung.
Solange der Sender noch keinem Transport zugeordnet ist, ist der Wert null. Das gilt zum Beispiel direkt nach addTrack(), bevor Offer und Answer mit setLocalDescription() bzw. setRemoteDescription() verarbeitet wurden. Erst nach der SDP-Aushandlung steht der Transport zur Verfügung.
Mit Bundling (bundlePolicy: "max-bundle", in modernen Browsern der Normalfall) teilen sich mehrere Sender und Empfänger dasselbe RTCDtlsTransport-Objekt. Deshalb eignet sich die Eigenschaft gut, um den Verbindungszustand genau einzelner Medienströme zu überwachen, etwa per statechange-Event, oder um das ausgewählte ICE-Kandidatenpaar herauszufinden.
Rückgabewert
RTCDtlsTransport-Objekt, über das der Sender Medien überträgt, oder null, wenn noch keine Transportverbindung ausgehandelt wurde.Beispiele
Transport nach der Aushandlung auslesen
const pc = new RTCPeerConnection();
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const sender = pc.addTrack(stream.getAudioTracks()[0], stream);
console.log(sender.transport); // noch kein Transport
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
// Nach setLocalDescription ist der Transport vorhanden
console.log(sender.transport?.state);
DTLS-Zustand eines Senders überwachen
const watchSenderTransport = (sender) => {
const transport = sender.transport;
if (!transport) {
console.warn('Noch kein Transport ausgehandelt');
return;
}
transport.addEventListener('statechange', () => {
console.log(`DTLS-Zustand: ${transport.state}`);
if (transport.state === 'failed') {
console.error('Verschlüsselte Verbindung fehlgeschlagen');
}
});
};
// nach setRemoteDescription aufrufen
pc.getSenders().forEach(watchSenderTransport);
Ausgewähltes ICE-Kandidatenpaar ermitteln
const logSelectedPair = (sender) => {
const ice = sender.transport?.iceTransport;
if (!ice) return;
// getSelectedCandidatePair() wird nicht von allen Browsern unterstützt
const pair = ice.getSelectedCandidatePair?.();
if (pair) {
console.log(`Lokal: ${pair.local.type} ${pair.local.address}`);
console.log(`Remote: ${pair.remote.type} ${pair.remote.address}`);
}
};
pc.addEventListener('connectionstatechange', () => {
if (pc.connectionState === 'connected') {
pc.getSenders().forEach(logSelectedPair);
}
});
Prüfen, ob alle Sender denselben Transport nutzen (Bundling)
const senders = pc.getSenders().filter((s) => s.transport);
const unique = new Set(senders.map((s) => s.transport));
console.log(`Sender: ${senders.length}, Transporte: ${unique.size}`);
// Wichtig · Fallstricke
- Häufig
null: Vor der SDP-Aushandlung und nach dem Stoppen des Transceivers isttransportnull. Nutze Optional Chaining (sender.transport?.state), damit keineTypeErrors auftreten. - Geteilte Objekte: Bei Bundling teilen sich mehrere Sender dasselbe
RTCDtlsTransport. Ein Listener aufstatechangegilt dann für alle Medienströme. Wenn du Listener mehrfach registrierst, bekommst du doppelte Ereignisse. - Kann sich ändern: Bei einer Neuverhandlung, etwa einem ICE-Restart oder einer geänderten Bundle-Gruppe, kann ein anderes Objekt zurückkommen. Lies die Eigenschaft deshalb nach jeder Aushandlung neu aus.
- Veraltet: Die frühere Eigenschaft
rtcpTransportwurde aus der Spezifikation entfernt, weil RTCP heute immer per rtcp-mux über denselben Transport läuft. - Kompatibilität: Chrome/Edge und Safari unterstützen die Eigenschaft seit Längerem, Firefox erst ab Version 111.
RTCIceTransport.getSelectedCandidatePair()fehlt in einigen Browsern. Frag die Unterstützung vorher ab oder nutze stattdessengetStats().