Signatur
Beschreibung
Die schreibgeschützte Eigenschaft id eines RTCIceCandidateStats-Objekts enthält einen String, der den überwachten ICE-Kandidaten eindeutig identifiziert. Dieses Objekt ist entweder ein lokaler Kandidat (type: "local-candidate") oder ein entfernter Kandidat (type: "remote-candidate"). Die Kennung ist gleichzeitig der Schlüssel, unter dem der Eintrag in der Map-ähnlichen Struktur RTCStatsReport abgelegt ist.
Wichtig ist die id vor allem, um Statistik-Einträge miteinander zu verknüpfen. Ein RTCIceCandidatePairStats-Eintrag verweist über localCandidateId und remoteCandidateId auf genau diese IDs. So findest du heraus, über welche Kandidaten, also über welche IP-Adressen, Ports und Protokolle, eine Verbindung tatsächlich läuft.
Die ID bleibt über mehrere Aufrufe von getStats() hinweg gleich, solange es dasselbe zugrunde liegende Objekt gibt. Deshalb kannst du mit ihr Messwerte über die Zeit vergleichen, zum Beispiel um Veränderungen zu erkennen. Wie die ID aufgebaut ist, legt der Browser selbst fest. Sie ist ein undurchsichtiger Wert (opaque) und sollte nicht ausgewertet werden.
Rückgabewert
RTCStatsReport.Beispiele
IDs aller lokalen und entfernten Kandidaten auflisten
const pc = new RTCPeerConnection();
pc.createDataChannel('probe');
await pc.setLocalDescription(await pc.createOffer());
// Kurz warten, damit ICE-Kandidaten gesammelt werden
await new Promise((r) => setTimeout(r, 1000));
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'local-candidate' || stats.type === 'remote-candidate') {
console.log(stats.type, stats.id, stats.candidateType, stats.protocol);
}
});
Aktiv genutztes Kandidatenpaar über die IDs auflösen
const getActiveCandidates = async (pc) => {
const report = await pc.getStats();
let pair;
report.forEach((s) => {
if (s.type === 'candidate-pair' && s.nominated && s.state === 'succeeded') {
pair = s;
}
});
if (!pair) return null;
// id dient als Schlüssel im RTCStatsReport
const local = report.get(pair.localCandidateId);
const remote = report.get(pair.remoteCandidateId);
return {
local: `${local.id}: ${local.address}:${local.port} (${local.candidateType})`,
remote: `${remote.id}: ${remote.address}:${remote.port} (${remote.candidateType})`
};
};
console.log(await getActiveCandidates(pc));
Neu hinzugekommene Kandidaten über die ID erkennen
const seen = new Set();
const pollCandidates = async (pc) => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type.endsWith('-candidate') && !seen.has(stats.id)) {
seen.add(stats.id);
console.log('Neuer Kandidat:', stats.id, stats.candidateType);
}
}
};
const timer = setInterval(() => pollCandidates(pc), 2000);
// später: clearInterval(timer);
// Wichtig · Fallstricke
- Das Format der ID ist browserspezifisch. Chrome liefert zum Beispiel Werte wie
I+Zufallszeichen, Firefox eigene Kurzkennungen. Werte die ID nie aus. Nutze sie nur zum Vergleichen und Nachschlagen perreport.get(id). - Die ID ist nur innerhalb derselben
RTCPeerConnectioneindeutig. Zwischen verschiedenen Verbindungen oder nach einem ICE-Neustart können sich IDs ändern oder neu vergeben werden. - Die Eigenschaft
idstammt aus dem Basis-WörterbuchRTCStatsund ist in jedem Statistik-Eintrag vorhanden, nicht nur bei ICE-Kandidaten. - Datenschutz: Die zugehörigen Kandidaten-Einträge können IP-Adressen enthalten. Browser verschleiern lokale Adressen teilweise über mDNS (
*.local). Gib Statistikberichte nicht ungefiltert an Dritte weiter. - Kompatibilität: Alle modernen Browser unterstützen die Eigenschaft. Ältere Implementierungen mit Callback-basiertem
getStats()(altes Chrome) lieferten ein abweichendes Format.