Start · Sprachen · JavaScript · Referenz · RTCIceCandidateStats.relayProtocol

RTCIceCandidateStats.relayProtocol

Eigenschaft

Gibt an, welches Transportprotokoll (<code>"udp"</code>, <code>"tcp"</code> oder <code>"tls"</code>) ein lokaler Relay-Kandidat für die Verbindung zum TURN-Server nutzt.

seit JavaScript Chrome 116+, Firefox 107+, Safari 17+ (lesbar über Kategorie: webapi

Signatur

RTCIceCandidateStats.relayProtocol

Beschreibung

Die schreibgeschützte Eigenschaft relayProtocol eines RTCIceCandidateStats-Objekts gibt an, über welches Protokoll ein lokaler ICE-Kandidat vom Typ "relay" mit dem TURN-Server kommuniziert. Mögliche Werte sind "udp", "tcp" und "tls" (TURN über TLS/TCP, also turns:-URLs).

Dieser Wert ist nicht dasselbe wie protocol: protocol beschreibt den Transport zwischen den Peers (Kandidat ↔ entfernter Kandidat), relayProtocol dagegen die Strecke zwischen Browser und TURN-Server. Ein Relay-Kandidat kann also z. B. protocol: "udp" haben, obwohl der Browser den TURN-Server über "tls" auf Port 443 erreicht.

Nützlich ist die Eigenschaft bei der Diagnose von Verbindungsproblemen und bei der Überwachung der Verbindungsqualität: Läuft ein Anruf über TURN/TCP oder TURN/TLS, ist das oft ein Hinweis auf restriktive Firewalls oder Proxys – dort sind höhere Latenz und Head-of-Line-Blocking zu erwarten. Mit relayProtocol lässt sich das in Telemetriedaten sauber erkennen.

Die Eigenschaft ist nur für lokale Kandidaten (type: "local-candidate") mit candidateType: "relay" vorhanden; bei Host-, Server-reflexiven oder Peer-reflexiven Kandidaten sowie bei entfernten Kandidaten ist sie undefined.

Rückgabewert

Typ
"udp" | "tcp" | "tls" | undefined
Beschreibung
Ein String mit dem Protokoll zwischen Client und TURN-Server. undefined, wenn der Kandidat kein lokaler Relay-Kandidat ist oder der Browser die Eigenschaft nicht unterstützt.

Beispiele

Alle lokalen Relay-Kandidaten mit TURN-Protokoll auflisten

const listRelayCandidates = async (pc) => {
  const stats = await pc.getStats();
  stats.forEach((report) => {
    if (report.type === 'local-candidate' && report.candidateType === 'relay') {
      console.log(`${report.address}:${report.port} über TURN/${report.relayProtocol}`);
    }
  });
};

// pc ist eine bestehende RTCPeerConnection mit TURN-Konfiguration
await listRelayCandidates(pc);
203.0.113.10:50122 über TURN/udp 203.0.113.10:61003 über TURN/tls

Protokoll des aktiv genutzten Kandidatenpaars ermitteln

const getActiveRelayProtocol = async (pc) => {
  const stats = await pc.getStats();
  let pair;
  stats.forEach((r) => {
    if (r.type === 'transport' && r.selectedCandidatePairId) {
      pair = stats.get(r.selectedCandidatePairId);
    }
  });
  if (!pair) return null;
  const local = stats.get(pair.localCandidateId);
  return local?.candidateType === 'relay' ? local.relayProtocol : 'kein Relay';
};

const proto = await getActiveRelayProtocol(pc);
console.log('Aktive Verbindung:', proto);
Aktive Verbindung: tcp

Warnung bei TURN über TCP/TLS für Telemetrie

const pc = new RTCPeerConnection({
  iceServers: [
    { urls: 'turn:turn.example.com:3478?transport=udp', username: 'user', credential: 'secret' },
    { urls: 'turns:turn.example.com:443?transport=tcp', username: 'user', credential: 'secret' }
  ]
});

const checkFallback = async () => {
  const stats = await pc.getStats();
  for (const report of stats.values()) {
    if (report.type === 'local-candidate' && ['tcp', 'tls'].includes(report.relayProtocol)) {
      console.warn(`Relay-Fallback über ${report.relayProtocol} – evtl. restriktive Firewall`);
    }
  }
};

pc.addEventListener('iceconnectionstatechange', () => {
  if (pc.iceConnectionState === 'connected') checkFallback();
});
Relay-Fallback über tls – evtl. restriktive Firewall

// Wichtig · Fallstricke

  • Nicht mit protocol verwechseln: protocol ist der Transport zwischen den Peers, relayProtocol nur die Strecke zum TURN-Server.
  • Nur bei lokalen Kandidaten mit candidateType === "relay" gesetzt – immer auf undefined prüfen, bevor der Wert ausgewertet wird.
  • Relay-Kandidaten entstehen nur, wenn in iceServers ein TURN-Server mit gültigen Zugangsdaten konfiguriert ist; mit iceTransportPolicy: "relay" lassen sie sich zum Testen erzwingen.
  • Kompatibilität: Ältere Browser unterstützen die Eigenschaft nicht; in alten Chrome-Versionen hieß ein ähnliches Feld zeitweise anders oder fehlte. Feature-Erkennung per 'relayProtocol' in report nutzen.
  • Stats-Werte sind Momentaufnahmen – getStats() bei Bedarf periodisch aufrufen, da sich das gewählte Kandidatenpaar (z. B. nach ICE-Restart) ändern kann.
  • Datenschutz: Kandidaten-Statistiken enthalten IP-Adressen; beim Versand an Telemetrie-Server nur benötigte Felder wie relayProtocol übertragen.