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

RTCIceTransport.getRemoteParameters()

Methode

Gibt die ICE-Parameter des entfernten Peers (<code>usernameFragment</code> und <code>password</code>) als <code>RTCIceParameters</code>-Objekt zurück oder <code>null</code>, falls noch keine bekannt sind.

seit JavaScript WebRTC 1.0 – Chromium-basierte Browser (ab ca. Chr Kategorie: webapi

Signatur

RTCIceTransport.prototype.getRemoteParameters()

Beschreibung

Die Methode getRemoteParameters() des RTCIceTransport-Objekts liefert die ICE-Zugangsdaten, die der entfernte Peer in seiner Session Description (SDP) übermittelt hat. Das zurückgegebene RTCIceParameters-Objekt enthält usernameFragment (im SDP a=ice-ufrag) und password (a=ice-pwd). Zusammen identifizieren diese Werte den entfernten Peer für die Dauer einer ICE-Sitzung eindeutig.

An das RTCIceTransport-Objekt kommt man nicht direkt über RTCPeerConnection, sondern über den DTLS-Transport, zum Beispiel sender.transport.iceTransport, receiver.transport.iceTransport oder pc.sctp.transport.iceTransport bei Datenkanälen.

Die Methode ist vor allem für Diagnose und Debugging nützlich. Man kann damit prüfen, ob die Gegenseite überhaupt ICE-Parameter geliefert hat, und einen ICE-Neustart erkennen: Bei einem Neustart ändern sich usernameFragment und password. Die Methode nimmt keine Argumente und läuft synchron.

Solange keine Remote-Beschreibung gesetzt ist (also vor setRemoteDescription()), gibt die Methode null zurück.

Rückgabewert

Typ
RTCIceParameters | null
Beschreibung
Ein Objekt mit den Eigenschaften usernameFragment (string) und password (string) des entfernten Peers. Wenn noch keine Remote-Parameter bekannt sind, ist der Rückgabewert null.

Beispiele

Remote-ICE-Parameter nach dem Verbindungsaufbau auslesen

const pc = new RTCPeerConnection();
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const [track] = stream.getAudioTracks();
const sender = pc.addTrack(track, stream);

// ... Signalisierung: Angebot/Antwort austauschen, setRemoteDescription() aufrufen ...

pc.addEventListener('connectionstatechange', () => {
  if (pc.connectionState !== 'connected') return;
  const iceTransport = sender.transport?.iceTransport;
  const remote = iceTransport?.getRemoteParameters();
  if (remote) {
    console.log('Remote-ufrag:', remote.usernameFragment);
    console.log('Remote-Passwort-Länge:', remote.password.length);
  }
});
Remote-ufrag: 8hhY Remote-Passwort-Länge: 24

ICE-Neustart der Gegenseite erkennen

const watchIceRestart = (iceTransport) => {
  let lastUfrag = iceTransport.getRemoteParameters()?.usernameFragment ?? null;

  iceTransport.addEventListener('statechange', () => {
    const current = iceTransport.getRemoteParameters()?.usernameFragment ?? null;
    if (lastUfrag && current && current !== lastUfrag) {
      console.log(`ICE-Neustart erkannt: ${lastUfrag} → ${current}`);
    }
    lastUfrag = current;
  });
};

// Nutzung, z. B. bei einem Datenkanal:
const iceTransport = pc.sctp?.transport.iceTransport;
if (iceTransport) watchIceRestart(iceTransport);
ICE-Neustart erkannt: 8hhY → Qx3v

Lokale und entfernte Parameter für Debug-Ausgaben vergleichen

const dumpIceParameters = (pc) => {
  const transports = new Set(
    pc.getSenders()
      .map((s) => s.transport?.iceTransport)
      .filter(Boolean)
  );

  for (const ice of transports) {
    const local = ice.getLocalParameters();
    const remote = ice.getRemoteParameters();
    console.table({
      rolle: ice.role,
      zustand: ice.state,
      lokalUfrag: local?.usernameFragment ?? '(keine)',
      remoteUfrag: remote?.usernameFragment ?? '(noch keine Remote-Beschreibung)'
    });
  }
};

dumpIceParameters(pc);
┌─────────────┬──────────────┐ │ rolle │ 'controlling'│ │ zustand │ 'connected' │ │ lokalUfrag │ 'aB3d' │ │ remoteUfrag │ '8hhY' │ └─────────────┴──────────────┘

// Wichtig · Fallstricke

  • Rückgabewert null: Vor setRemoteDescription() gibt es keine Remote-Parameter. Deshalb immer mit optionaler Verkettung (?.) oder einer Null-Prüfung arbeiten.
  • transport kann null sein: RTCRtpSender.transport und RTCPeerConnection.sctp sind erst nach dem Aushandeln gesetzt. Wenn Transporte gebündelt werden (max-bundle), teilen sich mehrere Sender dasselbe RTCIceTransport-Objekt.
  • Browser-Kompatibilität: RTCIceTransport und damit diese Methode sind vor allem in Chromium-basierten Browsern (Chrome, Edge, Opera) verfügbar. In Firefox und Safari fehlt die Unterstützung ganz oder teilweise. Vor der Nutzung deshalb die Funktion abfragen: typeof iceTransport?.getRemoteParameters === 'function'.
  • Sicherheit: password ist ein Zugangsdatum der ICE-Sitzung. Es sollte nicht in Protokolle, Analyse-Dienste oder Fehlerberichte gelangen. Für Diagnosen reicht meist usernameFragment.
  • Die Werte ändern sich bei jedem ICE-Neustart (pc.restartIce() oder ein Angebot mit iceRestart: true). Zwischengespeicherte Werte können also veralten.