Signatur
Beschreibung
Die Eigenschaft selected eines RTCIceCandidatePairStats-Objekts ist true, wenn das beschriebene Kandidatenpaar (lokaler und entfernter ICE-Kandidat) gerade aktiv für den Medien- bzw. Datentransport einer RTCPeerConnection genutzt wird. Bei allen anderen Paaren ist sie false.
Solche Statistik-Objekte liefert RTCPeerConnection.getStats(). Sie haben den type "candidate-pair". Über das ausgewählte Paar erfahren Sie, welcher Verbindungsweg tatsächlich benutzt wird: direkt (host), über NAT (srflx/prflx) oder über einen TURN-Server (relay). Außerdem finden Sie dort Kennzahlen wie currentRoundTripTime oder availableOutgoingBitrate. Das hilft bei der Fehlersuche, bei der Qualitätsüberwachung und bei der Frage, ob TURN-Kosten anfallen.
Wichtig: selected ist keine Standard-Eigenschaft und wird nur von Firefox unterstützt. Der standardkonforme Weg führt über das RTCTransportStats-Objekt (type === "transport"). Dessen Eigenschaft selectedCandidatePairId enthält die ID des aktiven Kandidatenpaars. Robuster Code prüft zuerst diesen Weg und nutzt selected nur als Rückfallebene.
Rückgabewert
true, wenn dieses Kandidatenpaar gerade verwendet wird, sonst false. In Browsern ohne Unterstützung (Chrome, Safari, Edge) ist der Wert undefined.Beispiele
Ausgewähltes Kandidatenpaar browserübergreifend ermitteln
// pc ist eine bestehende, verbundene RTCPeerConnection
const getSelectedPair = async (pc) => {
const stats = await pc.getStats();
let pair = null;
// 1. Standardweg: über RTCTransportStats.selectedCandidatePairId
stats.forEach((report) => {
if (report.type === 'transport' && report.selectedCandidatePairId) {
pair = stats.get(report.selectedCandidatePairId);
}
});
// 2. Rückfallebene: nicht standardisierte Eigenschaft selected (Firefox)
if (!pair) {
stats.forEach((report) => {
if (report.type === 'candidate-pair' && report.selected) {
pair = report;
}
});
}
return pair;
};
const pair = await getSelectedPair(pc);
console.log(pair ? `Aktives Paar: ${pair.id}` : 'Kein aktives Paar');
Verbindungstyp prüfen (direkt oder über TURN)
const logConnectionType = async (pc) => {
const stats = await pc.getStats();
const pair = [...stats.values()].find(
(r) => r.type === 'candidate-pair' && r.selected
);
if (!pair) {
console.log('selected nicht unterstützt oder keine Verbindung');
return;
}
const local = stats.get(pair.localCandidateId);
const remote = stats.get(pair.remoteCandidateId);
console.log(`Lokal: ${local.candidateType}, Entfernt: ${remote.candidateType}`);
if (local.candidateType === 'relay') {
console.log('Verbindung läuft über einen TURN-Server');
}
};
pc.addEventListener('iceconnectionstatechange', () => {
if (pc.iceConnectionState === 'connected') logConnectionType(pc);
});
Alle Kandidatenpaare mit Auswahlstatus auflisten
const stats = await pc.getStats();
const pairs = [...stats.values()]
.filter((r) => r.type === 'candidate-pair')
.map(({ id, state, nominated, selected }) => ({ id, state, nominated, selected }));
console.table(pairs);
// Wichtig · Fallstricke
- Nicht standardisiert:
selectedsteht nicht in der W3C-Spezifikation Identifiers for WebRTC's Statistics API. Nur Firefox unterstützt die Eigenschaft. In Chromium-Browsern und Safari ist sieundefined. Verwenden Sie in Produktivcode vorrangigRTCTransportStats.selectedCandidatePairId. nominatedist nicht dasselbe wieselected: Auch nominierte Paare mit dem Zustand"succeeded"müssen nicht das aktuell genutzte Paar sein, besonders nach einem ICE-Neustart oder einem Netzwerkwechsel.- Das ausgewählte Paar kann sich während der Verbindung ändern, etwa beim Wechsel von WLAN auf Mobilfunk. Fragen Sie
getStats()deshalb bei Bedarf erneut ab, statt das Ergebnis zwischenzuspeichern. Das EreignisselectedcandidatepairchangeanRTCIceTransportmeldet solche Wechsel. - Bei gebündelten Verbindungen (
bundlePolicy: "max-bundle") gibt es meist nur einen Transport und damit ein einziges ausgewähltes Paar. Ohne Bündelung kann es mehrere geben. getStats()ist vergleichsweise aufwendig. Rufen Sie die Methode für die Überwachung höchstens etwa einmal pro Sekunde auf.