Signatur
Beschreibung
Die Methode entries() des Interfaces RTCStatsReport gibt ein neues Iterator-Objekt zurück. Es liefert für jedes Statistik-Objekt im Bericht ein Array [schlüssel, wert]. Der Schlüssel ist die eindeutige Statistik-ID (stats.id), der Wert ist das zugehörige Statistik-Wörterbuch, z. B. vom Typ inbound-rtp, outbound-rtp, candidate-pair oder transport.
RTCStatsReport ist ein Map-ähnliches, schreibgeschütztes Objekt. entries() verhält sich deshalb genauso wie Map.prototype.entries() und ist auch der Standard-Iterator des Berichts (report[Symbol.iterator]). Ein for...of direkt über den Bericht liefert also dieselben Paare.
Die Methode brauchen Sie, wenn Sie beim Auswerten von RTCPeerConnection.getStats(), RTCRtpSender.getStats() oder RTCRtpReceiver.getStats() gleichzeitig ID und Inhalt benötigen. Das ist z. B. beim Auflösen von Verweisen wie transportId, codecId oder localCandidateId nützlich, beim Aufbauen einer eigenen Nachschlagetabelle oder beim Umwandeln in ein einfaches Objekt mit Object.fromEntries().
Rückgabewert
[id, stats] liefert: id ist ein string, stats ein Statistik-Wörterbuch mit mindestens id, type und timestamp.Beispiele
Alle Statistik-Einträge einer Verbindung auflisten
const pc = new RTCPeerConnection();
pc.createDataChannel('probe');
const report = await pc.getStats();
for (const [id, stats] of report.entries()) {
console.log(`${id} → ${stats.type} @ ${stats.timestamp.toFixed(0)}`);
}
Aktives Kandidatenpaar und Round-Trip-Zeit ermitteln
const getRtt = async (pc) => {
const report = await pc.getStats();
// Nachschlagetabelle aus den Einträgen aufbauen
const byId = new Map(report.entries());
for (const [, stats] of report.entries()) {
if (stats.type === 'transport' && stats.selectedCandidatePairId) {
const pair = byId.get(stats.selectedCandidatePairId);
return pair?.currentRoundTripTime ?? null; // Sekunden
}
}
return null;
};
const rtt = await getRtt(pc);
console.log('RTT:', rtt !== null ? `${(rtt * 1000).toFixed(1)} ms` : 'unbekannt');
Bericht als JSON speichern oder übertragen
const report = await pc.getStats();
// RTCStatsReport lässt sich nicht direkt serialisieren – daher entries() nutzen
const plain = Object.fromEntries(report.entries());
const json = JSON.stringify(plain);
await fetch('/api/webrtc-stats', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: json
});
console.log(`${Object.keys(plain).length} Einträge gesendet`);
Eingehende Video-Statistiken filtern
const report = await pc.getStats();
const inboundVideo = [...report.entries()]
.filter(([, s]) => s.type === 'inbound-rtp' && s.kind === 'video')
.map(([id, s]) => ({ id, fps: s.framesPerSecond, lost: s.packetsLost }));
console.table(inboundVideo);
// Wichtig · Fallstricke
- Einmal verwendbar: Der zurückgegebene Iterator ist nach einem Durchlauf erschöpft. Wenn Sie mehrfach iterieren möchten, rufen Sie
entries()erneut auf oder wandeln Sie ihn mit[...report.entries()]in ein Array um. - Momentaufnahme: Ein
RTCStatsReportändert sich nicht. Für aktuelle Werte, etwa zum Berechnen einer Bitrate aus zweibytesReceived-Werten, müssen SiegetStats()regelmäßig neu aufrufen. - Schreibgeschützt: Anders als bei
Mapgibt es keinset(),delete()oderclear(). - Reihenfolge und IDs: Die Reihenfolge der Einträge und das Format der IDs legt der Browser fest und sie unterscheiden sich zwischen den Engines. Filtern Sie deshalb immer nach
typeund verlassen Sie sich nicht auf Position oder ID-Muster. - Kompatibilität: Sehr alte Chrome-Versionen (vor 58) hatten ein veraltetes, callback-basiertes
getStats()ohne Map-Schnittstelle. Welche Statistik-Felder vorhanden sind (z. B.framesPerSecond,selectedCandidatePairId), unterscheidet sich je nach Browser. Prüfen Sie Felder daher vor der Verwendung, etwa mit?.oder??. - Datenschutz: ICE-Kandidaten-Statistiken können lokale oder öffentliche IP-Adressen enthalten. Entfernen Sie diese, bevor Sie Berichte an einen Server senden.