Signatur
Beschreibung
Die schreibgeschützte Eigenschaft remoteCandidateId eines RTCIceCandidatePairStats-Eintrags (Typ "candidate-pair") ist ein String. Er verweist auf den Statistik-Eintrag vom Typ "remote-candidate" im selben RTCStatsReport. Dieser Eintrag beschreibt den ICE-Kandidaten der Gegenseite, der zu diesem Paar gehört.
Brauchen Sie Details zur entfernten Seite der Verbindung, etwa IP-Adresse, Port, Protokoll oder den Kandidatentyp (host, srflx, prflx, relay), schlagen Sie mit diesem Wert im Report nach: report.get(pair.remoteCandidateId). Zusammen mit localCandidateId lässt sich so feststellen, ob eine Verbindung direkt (Peer-to-Peer) läuft oder über einen TURN-Server weitergeleitet wird.
Häufig wird das gerade aktive Paar gesucht. Dafür nehmen Sie entweder selectedCandidatePairId aus dem "transport"-Eintrag oder filtern nach Paaren mit state === "succeeded" und nominated === true.
Rückgabewert
id des zugehörigen RTCIceCandidateStats-Eintrags (Typ "remote-candidate") im selben RTCStatsReport.Beispiele
Entfernten Kandidaten des aktiven Paars ermitteln
const getRemoteCandidate = async (pc) => {
const report = await pc.getStats();
let transport;
report.forEach((s) => { if (s.type === 'transport') transport = s; });
const pair = report.get(transport?.selectedCandidatePairId);
if (!pair) return null;
const remote = report.get(pair.remoteCandidateId);
console.log(`Gegenseite: ${remote.address}:${remote.port} (${remote.candidateType}, ${remote.protocol})`);
return remote;
};
// pc ist eine verbundene RTCPeerConnection
await getRemoteCandidate(pc);
Prüfen, ob die Verbindung über TURN läuft
const isRelayed = async (pc) => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type === 'candidate-pair' && stats.nominated && stats.state === 'succeeded') {
const local = report.get(stats.localCandidateId);
const remote = report.get(stats.remoteCandidateId);
return local?.candidateType === 'relay' || remote?.candidateType === 'relay';
}
}
return false;
};
console.log('TURN aktiv:', await isRelayed(pc));
Alle Kandidatenpaare tabellarisch ausgeben
const report = await pc.getStats();
const rows = [...report.values()]
.filter((s) => s.type === 'candidate-pair')
.map((p) => ({
state: p.state,
local: p.localCandidateId,
remote: p.remoteCandidateId,
remoteAddr: report.get(p.remoteCandidateId)?.address ?? '–',
rttMs: p.currentRoundTripTime ? Math.round(p.currentRoundTripTime * 1000) : null
}));
console.table(rows);
// Wichtig · Fallstricke
- Die ID gilt nur innerhalb desselben
RTCStatsReport. Speichern Sie keine IDs, um sie mit späteren Reports abzugleichen. Die Werte sind vom Browser festgelegt und nicht garantiert stabil. report.get()kannundefinedliefern, etwa wenn der Kandidat inzwischen entfernt wurde. Prüfen Sie das Ergebnis deshalb immer, z. B. mit optionaler Verkettung?..- Die Felder
addressundipdes entfernten Kandidaten können aus Datenschutzgründen fehlen oder durch mDNS-Namen (*.local) ersetzt sein. - Firefox hat das Feld
selectedCandidatePairIdim Transport-Eintrag lange nicht unterstützt. Als browserübergreifende Alternative filtern Sie nachnominatedundstate === "succeeded". Ältere Chrome-Versionen hatten eine Sonderform (selected). - Die Statistik-API funktioniert nur in sicheren Kontexten (HTTPS) mit einer aktiven
RTCPeerConnection.