Start · Sprachen · JavaScript · Referenz · RTCIceCandidatePairStats.selected

RTCIceCandidatePairStats.selected

Eigenschaft

Boolescher Wert, der angibt, ob dieses ICE-Kandidatenpaar gerade für die Kommunikation mit dem entfernten Peer verwendet wird.

seit JavaScript Nicht standardisiert: nur Firefox (seit Firefox 27 Kategorie: webapi

Signatur

RTCIceCandidatePairStats.selected

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

Typ
boolean | undefined
Beschreibung
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');
Aktives Paar: RTCIceCandidatePair_a1b2c3

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);
});
Lokal: srflx, Entfernt: host

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);
┌─────────┬────────────┬─────────────┬───────────┬──────────┐ │ (index) │ id │ state │ nominated │ selected │ ├─────────┼────────────┼─────────────┼───────────┼──────────┤ │ 0 │ 'a1b2c3' │ 'succeeded' │ true │ true │ │ 1 │ 'd4e5f6' │ 'failed' │ false │ false │ └─────────┴────────────┴─────────────┴───────────┴──────────┘

// Wichtig · Fallstricke

  • Nicht standardisiert: selected steht nicht in der W3C-Spezifikation Identifiers for WebRTC's Statistics API. Nur Firefox unterstützt die Eigenschaft. In Chromium-Browsern und Safari ist sie undefined. Verwenden Sie in Produktivcode vorrangig RTCTransportStats.selectedCandidatePairId.
  • nominated ist nicht dasselbe wie selected: 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 Ereignis selectedcandidatepairchange an RTCIceTransport meldet 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.