Signatur
Beschreibung
Die Methode getRemoteCandidates() des Interfaces RTCIceTransport liefert eine Momentaufnahme aller ICE-Kandidaten, die der entfernte Peer bisher gemeldet hat und die über RTCPeerConnection.addIceCandidate() (bzw. über die Remote-Beschreibung) an diese Transportschicht übergeben wurden. Jeder Eintrag ist ein RTCIceCandidate mit Eigenschaften wie address, port, protocol und type (host, srflx, prflx, relay).
Nützlich ist die Methode vor allem für Diagnose und Fehlersuche: Man sieht, ob der Gegenüber überhaupt Relay-Kandidaten (TURN) oder nur Host-Kandidaten angeboten hat. Das erklärt häufig, warum eine Verbindung hinter restriktiven NATs oder Firewalls nicht zustande kommt. Zusammen mit getLocalCandidates() und getSelectedCandidatePair() ergibt sich ein vollständiges Bild der Kandidatenaushandlung.
An das RTCIceTransport-Objekt gelangt man nicht direkt über die RTCPeerConnection, sondern über den DTLS-Transport eines Senders oder Empfängers: sender.transport.iceTransport bzw. pc.sctp.transport.iceTransport für Datenkanäle. Die Transportobjekte existieren erst, nachdem Local und Remote Description gesetzt wurden.
Das zurückgegebene Array ist eine Kopie zum Aufrufzeitpunkt. Wird später per Trickle-ICE ein weiterer Kandidat hinzugefügt, muss die Methode erneut aufgerufen werden. Nach einem ICE-Neustart beginnt eine neue Sitzung, und die Liste enthält nur noch Kandidaten dieser neuen Sitzung.
Rückgabewert
RTCIceCandidate-Objekten, eines pro bisher empfangenem Remote-Kandidaten der aktuellen ICE-Sitzung. Leer, wenn noch keine Kandidaten eingegangen sind.Beispiele
Remote-Kandidaten einer bestehenden Verbindung auflisten
// pc ist eine bereits ausgehandelte RTCPeerConnection
const listRemoteCandidates = (pc) => {
const sender = pc.getSenders().find((s) => s.transport);
const iceTransport = sender?.transport?.iceTransport;
if (!iceTransport || typeof iceTransport.getRemoteCandidates !== 'function') {
console.warn('getRemoteCandidates() wird nicht unterstützt');
return [];
}
const candidates = iceTransport.getRemoteCandidates();
candidates.forEach((c) => {
console.log(`${c.type} ${c.protocol} ${c.address}:${c.port}`);
});
return candidates;
};
listRemoteCandidates(pc);
Prüfen, ob der Gegenüber TURN-Relay-Kandidaten angeboten hat
const hasRemoteRelay = (pc) => {
const iceTransport = pc.getSenders()[0]?.transport?.iceTransport;
if (!iceTransport?.getRemoteCandidates) return null; // unbekannt
return iceTransport
.getRemoteCandidates()
.some((c) => c.type === 'relay');
};
pc.addEventListener('iceconnectionstatechange', () => {
if (pc.iceConnectionState === 'failed' && hasRemoteRelay(pc) === false) {
console.error('Gegenseite hat keine Relay-Kandidaten – TURN-Konfiguration prüfen!');
}
});
Fallback über getStats() für Browser ohne Unterstützung
const getRemoteCandidatesCompat = async (pc) => {
const iceTransport = pc.getSenders()[0]?.transport?.iceTransport;
if (iceTransport?.getRemoteCandidates) {
return iceTransport.getRemoteCandidates().map((c) => ({
type: c.type, address: c.address, port: c.port, protocol: c.protocol
}));
}
// Fallback: Statistik-Berichte vom Typ "remote-candidate"
const stats = await pc.getStats();
const result = [];
stats.forEach((report) => {
if (report.type === 'remote-candidate') {
result.push({
type: report.candidateType,
address: report.address,
port: report.port,
protocol: report.protocol
});
}
});
return result;
};
console.table(await getRemoteCandidatesCompat(pc));
// Wichtig · Fallstricke
- Browser-Unterstützung: Die Methode ist in der WebRTC-Spezifikation definiert, aber in vielen Browsern (u. a. Chromium-basierten) nicht oder nur teilweise implementiert. Immer per Feature-Erkennung (
typeof iceTransport.getRemoteCandidates === 'function') prüfen und aufRTCPeerConnection.getStats()mit Berichten vom Typremote-candidateausweichen. sender.transportistnull, solange keine Remote Description gesetzt wurde. Bei BUNDLE teilen sich alle Sender und Empfänger in der Regel denselben Transport.- Das Ergebnis ist eine Momentaufnahme; per Trickle-ICE später eintreffende Kandidaten erscheinen erst bei einem erneuten Aufruf.
- Nach einem ICE-Neustart (
pc.restartIce()) werden nur Kandidaten der neuen Sitzung geliefert. - Datenschutz: Remote-Kandidaten können IP-Adressen des Gegenübers enthalten (bei mDNS-Verschleierung auch
.local-Hostnamen statt IPs). Solche Daten nicht ungefiltert protokollieren oder an Dritte weitergeben.