Signatur
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
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);
}
});
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);
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);
// Wichtig · Fallstricke
- Rückgabewert
null: VorsetRemoteDescription()gibt es keine Remote-Parameter. Deshalb immer mit optionaler Verkettung (?.) oder einer Null-Prüfung arbeiten. transportkannnullsein:RTCRtpSender.transportundRTCPeerConnection.sctpsind erst nach dem Aushandeln gesetzt. Wenn Transporte gebündelt werden (max-bundle), teilen sich mehrere Sender dasselbeRTCIceTransport-Objekt.- Browser-Kompatibilität:
RTCIceTransportund 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:
passwordist ein Zugangsdatum der ICE-Sitzung. Es sollte nicht in Protokolle, Analyse-Dienste oder Fehlerberichte gelangen. Für Diagnosen reicht meistusernameFragment. - Die Werte ändern sich bei jedem ICE-Neustart (
pc.restartIce()oder ein Angebot miticeRestart: true). Zwischengespeicherte Werte können also veralten.