Signatur
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
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);
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);
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();
});
// Wichtig · Fallstricke
- Nicht mit
protocolverwechseln:protocolist der Transport zwischen den Peers,relayProtocolnur die Strecke zum TURN-Server. - Nur bei lokalen Kandidaten mit
candidateType === "relay"gesetzt – immer aufundefinedprüfen, bevor der Wert ausgewertet wird. - Relay-Kandidaten entstehen nur, wenn in
iceServersein TURN-Server mit gültigen Zugangsdaten konfiguriert ist; miticeTransportPolicy: "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 reportnutzen. - 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.