Start · Sprachen · JavaScript · Referenz · RTCRtpSender.transport

RTCRtpSender.transport

Eigenschaft

Liefert das <code>RTCDtlsTransport</code>-Objekt, über das der Sender seine RTP- und RTCP-Pakete verschickt, oder <code>null</code>, solange noch kein Transport existiert.

seit JavaScript Baseline 2023: Chrome 72+, Firefox 111+, Safari 12 Kategorie: webapi

Signatur

RTCRtpSender.transport

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

Typ
RTCDtlsTransport | null
Beschreibung
Das 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);
null new

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);
DTLS-Zustand: connecting DTLS-Zustand: connected

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);
  }
});
Lokal: host 192.168.1.20 Remote: srflx 203.0.113.7

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}`);
Sender: 2, Transporte: 1

// Wichtig · Fallstricke

  • Häufig null: Vor der SDP-Aushandlung und nach dem Stoppen des Transceivers ist transport null. Nutze Optional Chaining (sender.transport?.state), damit keine TypeErrors auftreten.
  • Geteilte Objekte: Bei Bundling teilen sich mehrere Sender dasselbe RTCDtlsTransport. Ein Listener auf statechange gilt 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 rtcpTransport wurde 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 stattdessen getStats().