Signatur
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
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);
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));
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);
// Wichtig · Fallstricke
- Veraltet und kein Standard:
readablewurde aus der Spezifikation „Identifiers for WebRTC's Statistics API“ entfernt. Aktuelle Browser liefern die Eigenschaft meist nicht mehr. Du bekommst dannundefined. Plane deshalb immer einen Fallback ein, z. B.report.readable ?? report.requestsReceived > 0. - Kein Nachweis für eine vollständige Verbindung:
trueheißt nur, dass Prüfungen angekommen sind. Ob die Gegenrichtung funktioniert, zeigt erstresponsesReceivedbzw.state === "succeeded". - Die Statistik ist eine Momentaufnahme. Um Änderungen zu verfolgen, rufe
getStats()regelmäßig oder beiiceconnectionstatechangeauf. 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.