Start · Sprachen · JavaScript · Referenz · RTCIceTransport.getRemoteCandidates()

RTCIceTransport.getRemoteCandidates()

Methode

Gibt ein Array mit je einem <code>RTCIceCandidate</code> für jeden Kandidaten zurück, den der entfernte Peer in der aktuellen ICE-Sitzung bisher übermittelt hat.

seit JavaScript WebRTC 1.0 – Unterstützung uneinheitlich, in viele Kategorie: webapi

Signatur

RTCIceTransport.prototype.getRemoteCandidates()

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

Typ
RTCIceCandidate[]
Beschreibung
Ein Array von 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);
host udp 192.168.1.23:54321 srflx udp 203.0.113.7:61234 relay udp 198.51.100.10:3478

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!');
  }
});
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));
Tabelle mit type, address, port, protocol je Remote-Kandidat

// 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 auf RTCPeerConnection.getStats() mit Berichten vom Typ remote-candidate ausweichen.
  • sender.transport ist null, 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.