Start · Sprachen · JavaScript · Referenz · RTCIceCandidatePairStats.readable

RTCIceCandidatePairStats.readable

Eigenschaft

Boolescher Wert, der angibt, ob über das ICE-Kandidatenpaar mindestens eine gültige eingehende ICE-Anfrage (STUN-Binding-Request) empfangen wurde.

seit JavaScript Veraltet, kein Standard – aus der Spezifikation en deprecated seit ja Kategorie: webapi

Signatur

RTCIceCandidatePairStats.readable

Beschreibung

Die Eigenschaft readable gehört zum Wörterbuch RTCIceCandidatePairStats. Dieses Wörterbuch erhält man über RTCPeerConnection.getStats() als Einträge vom Typ "candidate-pair". readable ist true, sobald über das Kandidatenpaar mindestens eine gültige eingehende ICE-Konnektivitätsprüfung (STUN-Binding-Request) angekommen ist. Die Verbindung ist dann also zumindest in Empfangsrichtung benutzbar.

Früher diente die Eigenschaft bei der Fehlersuche dazu, einseitige Verbindungsprobleme zu erkennen. Das sind etwa Fälle, in denen eine Firewall nur ausgehenden Verkehr durchlässt. Zusammen mit dem ebenfalls veralteten Gegenstück writable ließ sich so feststellen, ob ein Paar in beide Richtungen funktioniert.

Die Eigenschaft wurde aus der WebRTC-Statistik-Spezifikation entfernt und gilt als veraltet. In neuem Code solltest du stattdessen requestsReceived (Anzahl empfangener Konnektivitätsprüfungen), responsesReceived und state auswerten. Ein Paar mit state === "succeeded" hat die ICE-Prüfung in beide Richtungen bestanden.

Rückgabewert

Typ
boolean | undefined
Beschreibung
true, wenn mindestens eine gültige eingehende ICE-Anfrage empfangen wurde, sonst false. In Browsern, die die veraltete Eigenschaft nicht mehr liefern, ist der Wert undefined.

Beispiele

readable aus den Statistiken auslesen (mit Fallback)

// pc ist eine bestehende, verbundene RTCPeerConnection
const logCandidatePairs = async (pc) => {
  const stats = await pc.getStats();
  stats.forEach((report) => {
    if (report.type !== 'candidate-pair') return;
    // Veraltete Eigenschaft bevorzugt, sonst aus requestsReceived ableiten
    const readable = report.readable ?? (report.requestsReceived > 0);
    console.log(`Paar ${report.id}: readable=${readable}, state=${report.state}`);
  });
};

logCandidatePairs(pc);
Paar CPabc123_def456: readable=true, state=succeeded

Einseitige Verbindungsprobleme erkennen

const diagnoseIce = async (pc) => {
  const stats = await pc.getStats();
  for (const report of stats.values()) {
    if (report.type !== 'candidate-pair' || !report.nominated) continue;
    const received = report.readable ?? report.requestsReceived > 0;
    const answered = report.writable ?? report.responsesReceived > 0;
    if (!received && answered) {
      console.warn('Keine eingehenden ICE-Prüfungen – eingehender Verkehr wird evtl. blockiert.');
    } else if (received && answered) {
      console.log('Kandidatenpaar in beide Richtungen nutzbar.');
    }
  }
};

pc.addEventListener('iceconnectionstatechange', () => diagnoseIce(pc));
Kandidatenpaar in beide Richtungen nutzbar.

Moderne Alternative: aktives Paar über state prüfen

const getActivePair = async (pc) => {
  const stats = await pc.getStats();
  const transport = [...stats.values()].find((r) => r.type === 'transport');
  const pair = transport && stats.get(transport.selectedCandidatePairId);
  return pair ? { id: pair.id, state: pair.state, requestsReceived: pair.requestsReceived } : null;
};

getActivePair(pc).then(console.log);
{ id: 'CPabc123_def456', state: 'succeeded', requestsReceived: 12 }

// Wichtig · Fallstricke

  • Veraltet und kein Standard: readable wurde aus der Spezifikation „Identifiers for WebRTC's Statistics API“ entfernt. Aktuelle Browser liefern die Eigenschaft meist nicht mehr. Du bekommst dann undefined. Plane deshalb immer einen Fallback ein, z. B. report.readable ?? report.requestsReceived > 0.
  • Kein Nachweis für eine vollständige Verbindung: true heißt nur, dass Prüfungen angekommen sind. Ob die Gegenrichtung funktioniert, zeigt erst responsesReceived bzw. state === "succeeded".
  • Die Statistik ist eine Momentaufnahme. Um Änderungen zu verfolgen, rufe getStats() regelmäßig oder bei iceconnectionstatechange auf. Sehr häufiges Abfragen kostet allerdings Rechenzeit.
  • Bei älteren Implementierungen wie Chromes altem, callback-basiertem getStats() hatten die Felder andere Namen. Verlasse dich nur auf die Promise-Variante.