Signatur
Beschreibung
Die Eigenschaft address gehört zum Wörterbuch RTCIceCandidateStats. Dieses taucht in den Statistikberichten von RTCPeerConnection.getStats() als Einträge mit dem type "local-candidate" oder "remote-candidate" auf. address enthält die Netzwerkadresse des Kandidaten als Zeichenkette, also eine IPv4-Adresse wie "192.0.2.10", eine IPv6-Adresse oder einen vollqualifizierten Domainnamen.
Welche Adresse drinsteht, hängt vom candidateType ab. Bei "host"-Kandidaten ist es die lokale Schnittstellenadresse. Bei "srflx" ist es die öffentliche Adresse, die ein STUN-Server gemeldet hat. Bei "relay" ist es die Adresse auf dem TURN-Server. Zusammen mit port, protocol und candidateType lässt sich damit prüfen, über welchen Weg eine Verbindung tatsächlich läuft, etwa ob ein TURN-Relay benutzt wird.
Typische Einsatzfälle sind Diagnose-Oberflächen, Verbindungs-Logging und Fehlersuche bei NAT- und Firewall-Problemen. Den gerade aktiven Kandidaten findet man über das RTCIceCandidatePairStats-Objekt, das zum Transport gehört (selectedCandidatePairId). Dessen localCandidateId bzw. remoteCandidateId verweisen auf die passenden Kandidaten-Berichte.
Die Eigenschaft ist nur lesbar. Aus Datenschutzgründen kann sie leer sein, fehlen (undefined) oder statt einer echten IP einen verschleierten mDNS-Namen der Form "xxxxxxxx-xxxx-….local" enthalten.
Rückgabewert
null/undefined sein oder einen mDNS-Namen (*.local) enthalten, wenn der Browser die echte Adresse aus Datenschutzgründen verbirgt.Beispiele
Alle lokalen und entfernten Kandidaten auflisten
const listCandidates = async (pc) => {
const stats = await pc.getStats();
stats.forEach((report) => {
if (report.type === 'local-candidate' || report.type === 'remote-candidate') {
console.log(
`${report.type}: ${report.candidateType} ${report.protocol} ` +
`${report.address ?? '(verborgen)'}:${report.port}`
);
}
});
};
// Aufruf nach dem Verbindungsaufbau
await listCandidates(peerConnection);
Adresse des aktiv genutzten Kandidatenpaars ermitteln
const getActiveAddresses = async (pc) => {
const stats = await pc.getStats();
let pair;
stats.forEach((r) => {
if (r.type === 'transport' && r.selectedCandidatePairId) {
pair = stats.get(r.selectedCandidatePairId);
}
});
// Fallback für Browser ohne selectedCandidatePairId (z. B. Firefox)
if (!pair) {
stats.forEach((r) => {
if (r.type === 'candidate-pair' && r.nominated && r.state === 'succeeded') pair = r;
});
}
if (!pair) return null;
const local = stats.get(pair.localCandidateId);
const remote = stats.get(pair.remoteCandidateId);
return {
local: `${local.address}:${local.port} (${local.candidateType})`,
remote: `${remote.address}:${remote.port} (${remote.candidateType})`
};
};
console.log(await getActiveAddresses(peerConnection));
Erkennen, ob die Verbindung über einen TURN-Server läuft
const isRelayed = async (pc) => {
const stats = await pc.getStats();
for (const r of stats.values()) {
if (r.type === 'candidate-pair' && r.nominated && r.state === 'succeeded') {
const local = stats.get(r.localCandidateId);
if (local?.candidateType === 'relay') {
console.log(`Relay über TURN-Adresse ${local.address}`);
return true;
}
}
}
return false;
};
console.log(await isRelayed(peerConnection));
// Wichtig · Fallstricke
- Datenschutz: Moderne Browser ersetzen lokale Host-Adressen standardmäßig durch mDNS-Namen (
*.local), damit private IPs nicht nach außen gelangen. Echte lokale IPs sieht man meist erst, wenn die Seite Kamera- oder Mikrofonrechte hat, und selbst dann nicht in jedem Browser. - Kann fehlen: Je nach Browser und Kandidatentyp ist
addressundefinedodernull. Deshalb immer absichern, z. B. mit??. - Veralteter Name: Ältere Implementierungen nutzten
ipbzw.ipAddressstattaddress. Wer alte Browser unterstützen muss, fragt ab:report.address ?? report.ip. - Sicherheit: Adressen der Gegenstelle sind personenbezogene Daten (IP-Adressen). Beim Logging oder beim Senden an Telemetrie-Server die DSGVO beachten und die Adressen gegebenenfalls anonymisieren.
- Die Statistiken sind Momentaufnahmen. Für aktuelle Werte
getStats()erneut aufrufen.