Start · Sprachen · JavaScript · Referenz · RTCRtpReceiver.transport

RTCRtpReceiver.transport

Eigenschaft

Liefert das <code>RTCDtlsTransport</code>-Objekt, über das der Empfänger RTP- und RTCP-Pakete der Medienspur empfängt, oder <code>null</code>.

seit JavaScript Baseline: seit 2023 in allen gängigen Browsern (Ch Kategorie: webapi

Signatur

RTCRtpReceiver.transport

Beschreibung

Die schreibgeschützte Eigenschaft transport eines RTCRtpReceiver verweist auf das RTCDtlsTransport-Objekt, über das der Empfänger die RTP-Pakete (Real-time Transport Protocol) seiner Medienspur und die zugehörigen RTCP-Steuerpakete empfängt. Über dieses Objekt lässt sich der Zustand der verschlüsselten DTLS-Verbindung auslesen, und man kommt über transport.iceTransport an die darunterliegende ICE-Ebene.

Typische Anwendungsfälle sind die Verbindungsdiagnose (z. B. „Ist die DTLS-Verbindung aufgebaut oder fehlgeschlagen?“), das Auslesen der Zertifikate der Gegenstelle mit getRemoteCertificates() und die Überwachung des ausgewählten ICE-Kandidatenpaars, etwa um zu erkennen, ob die Verbindung über einen TURN-Relay läuft.

Der Wert ist null, solange noch keine Remote-Beschreibung angewendet und damit kein Transport ausgehandelt wurde. Mit der üblichen Bündelungsrichtlinie bundlePolicy: "max-bundle" teilen sich meist alle Sender und Empfänger einer RTCPeerConnection denselben Transport.

Rückgabewert

Typ
RTCDtlsTransport | null
Beschreibung
Das RTCDtlsTransport-Objekt, über das der Empfänger Medien empfängt, oder null, wenn noch kein Transport ausgehandelt wurde.

Beispiele

DTLS-Zustand eines eingehenden Tracks überwachen

const pc = new RTCPeerConnection();

pc.addEventListener('track', ({ receiver, track }) => {
  const dtls = receiver.transport;
  if (!dtls) {
    console.log('Noch kein Transport ausgehandelt');
    return;
  }
  console.log(`${track.kind}: DTLS-Zustand =`, dtls.state);

  dtls.addEventListener('statechange', () => {
    console.log('DTLS-Zustand geändert:', dtls.state);
    if (dtls.state === 'failed') {
      console.warn('Verschlüsselte Verbindung fehlgeschlagen');
    }
  });
});
video: DTLS-Zustand = connecting DTLS-Zustand geändert: connected

Ausgewähltes ICE-Kandidatenpaar ermitteln (TURN erkennen)

const logCandidatePair = (receiver) => {
  const ice = receiver.transport?.iceTransport;
  if (!ice) return;

  ice.addEventListener('selectedcandidatepairchange', () => {
    const pair = ice.getSelectedCandidatePair();
    if (!pair) return;
    console.log('Lokal:', pair.local.type, pair.local.protocol);
    console.log('Remote:', pair.remote.type, pair.remote.address);
    if (pair.local.type === 'relay') {
      console.log('Verbindung läuft über einen TURN-Server');
    }
  });
};

// Nach setRemoteDescription():
pc.getReceivers().forEach(logCandidatePair);
Lokal: host udp Remote: srflx 203.0.113.7

Zertifikat-Fingerprint der Gegenstelle prüfen

const showRemoteCertificates = async (pc) => {
  const [receiver] = pc.getReceivers();
  const dtls = receiver?.transport;
  if (dtls?.state !== 'connected') {
    console.log('DTLS noch nicht verbunden');
    return;
  }
  const certs = dtls.getRemoteCertificates(); // ArrayBuffer[] (DER)
  for (const der of certs) {
    const hash = await crypto.subtle.digest('SHA-256', der);
    const hex = [...new Uint8Array(hash)]
      .map((b) => b.toString(16).padStart(2, '0'))
      .join(':');
    console.log('SHA-256:', hex);
  }
};
SHA-256: 3a:5f:c1:...

Prüfen, ob alle Empfänger denselben Transport nutzen

const transports = new Set(
  pc.getReceivers().map((r) => r.transport).filter(Boolean)
);
console.log('Anzahl DTLS-Transporte:', transports.size);
Anzahl DTLS-Transporte: 1

// Wichtig · Fallstricke

  • Kann null sein: Vor setRemoteDescription() bzw. vor der Aushandlung existiert noch kein Transport – immer mit optionaler Verkettung (receiver.transport?.state) zugreifen.
  • Geteilte Transporte: Bei aktiver Bündelung (Standard in modernen Browsern) liefern mehrere Empfänger dasselbe Objekt. Ein statechange-Listener pro Empfänger meldet deshalb dasselbe Ereignis mehrfach.
  • Das Objekt kann sich ändern: Nach einer Neuaushandlung kann transport auf ein anderes RTCDtlsTransport verweisen. Referenzen also nicht dauerhaft zwischenspeichern.
  • Veraltet: Die früher spezifizierte Eigenschaft rtcpTransport wurde entfernt; RTCP wird heute per RTCP-Mux über denselben Transport geführt.
  • Kompatibilität: Chrome/Edge seit 72, Safari seit 12.1, Firefox erst seit Version 110. In älteren Firefox-Versionen ist die Eigenschaft undefined – Feature-Erkennung mit 'transport' in RTCRtpReceiver.prototype.
  • Datenschutz: Über iceTransport lassen sich IP-Adressen der Kandidaten auslesen. Solche Informationen nicht ungefiltert protokollieren oder an Dritte senden.