Signatur
Beschreibung
Die schreibgeschützte Eigenschaft type kennzeichnet ein Statistikobjekt als RTCTransportStats. Sie hat für diesen Typ immer den Wert "transport". Geerbt wird sie vom Basis-Wörterbuch RTCStats, das jedes Objekt in einem RTCStatsReport implementiert.
Ein RTCStatsReport, den RTCPeerConnection.getStats() liefert, enthält viele verschiedene Statistikarten, etwa "inbound-rtp", "candidate-pair", "certificate" oder eben "transport". Mit type filtert man den Bericht nach den Einträgen, die man braucht. Transport-Statistiken beschreiben die zugrunde liegende DTLS/ICE-Transportschicht. Typische Felder sind bytesSent, bytesReceived, dtlsState, iceState, selectedCandidatePairId und tlsVersion.
Man braucht die Eigenschaft vor allem für Verbindungsdiagnosen und für Qualitäts-Dashboards. Ein weiterer Anwendungsfall: Über selectedCandidatePairId ermittelt man das aktuell genutzte ICE-Kandidatenpaar.
Rückgabewert
"transport". Er ist ein Wert der Aufzählung RTCStatsType.Beispiele
Transport-Statistiken aus dem Bericht filtern
const pc = new RTCPeerConnection();
// ... Verbindung aufbauen (Offer/Answer, ICE) ...
const logTransportStats = async () => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'transport') {
console.log('Transport-ID:', stats.id);
console.log('Gesendet:', stats.bytesSent, 'Bytes');
console.log('Empfangen:', stats.bytesReceived, 'Bytes');
console.log('DTLS-Status:', stats.dtlsState);
}
});
};
logTransportStats();
Aktives Kandidatenpaar über den Transport ermitteln
const getActiveCandidatePair = async (pc) => {
const report = await pc.getStats();
const transport = [...report.values()].find((s) => s.type === 'transport');
if (!transport?.selectedCandidatePairId) return null;
return report.get(transport.selectedCandidatePairId);
};
const pair = await getActiveCandidatePair(pc);
if (pair) {
console.log(`RTT: ${pair.currentRoundTripTime * 1000} ms`);
}
Durchsatz periodisch messen
let last = null;
setInterval(async () => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type !== 'transport') continue;
if (last) {
const seconds = (stats.timestamp - last.timestamp) / 1000;
const kbps = ((stats.bytesReceived - last.bytesReceived) * 8) / seconds / 1000;
console.log(`Eingehend: ${kbps.toFixed(1)} kbit/s`);
}
last = stats;
}
}, 1000);
// Wichtig · Fallstricke
- Vergleiche immer mit dem genauen String
'transport'. Die Werte vonRTCStatsTypesind klein geschrieben und nutzen Bindestriche, zum Beispiel'candidate-pair'. - Bei Bundling (
bundlePolicy: 'max-bundle', heute Standard) gibt es meist nur ein einziges Transport-Objekt. Ohne Bundling können es mehrere sein, etwa getrennt für Audio und Video. - Firefox hat
"transport"-Statistiken lange nicht oder nur teilweise geliefert. Einzelne Felder wieselectedCandidatePairIdodertlsVersionkönnen je nach Browser fehlen. Prüfe deshalb mit optionaler Verkettung (?.) oder aufundefined. - Rufe
getStats()nicht zu oft auf. Die Abfrage ist asynchron und kostet Rechenzeit, ein Intervall von etwa einer Sekunde reicht in der Regel aus.