Signatur
Beschreibung
Die Eigenschaft timestamp gibt es in jedem WebRTC-Statistikobjekt, weil sie aus dem Basis-Dictionary RTCStats stammt. Im RTCPeerConnectionStats-Objekt steht sie für den Zeitpunkt, zu dem der Browser die Kennzahlen der gesamten Verbindung erfasst hat, etwa dataChannelsOpened und dataChannelsClosed. Dieses Objekt erkennen Sie in dem RTCStatsReport, den RTCPeerConnection.getStats() liefert, am Wert type === "peer-connection".
Laut Spezifikation ist der Wert ein DOMHighResTimeStamp in Millisekunden. Er wird relativ zur Unix-Epoche (1. Januar 1970, UTC) gemessen und entspricht damit performance.timeOrigin + performance.now() zum Zeitpunkt der Erfassung. Deshalb können Sie ihn direkt an new Date() übergeben.
Wirklich nützlich wird timestamp, wenn Sie Raten berechnen. Wenn Sie getStats() mehrmals aufrufen, können Sie Zählerwerte zweier Messungen durch den zeitlichen Abstand ihrer Zeitstempel teilen. Zum Beispiel: Wie viele Datenkanäle wurden pro Sekunde geöffnet? Verwenden Sie dafür den Zeitstempel aus dem Statistikobjekt und nicht den Moment, in dem Ihr Code die Antwort verarbeitet. Der Browser kann Statistiken nämlich zwischenspeichern oder mit Verzögerung liefern.
Rückgabewert
Beispiele
Zeitstempel der Verbindungsstatistik auslesen
const pc = new RTCPeerConnection();
pc.createDataChannel('chat');
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type === 'peer-connection') {
console.log('Erfasst um:', stats.timestamp);
console.log('Als Datum:', new Date(stats.timestamp).toISOString());
}
}
Rate geöffneter Datenkanäle zwischen zwei Messungen berechnen
const getPeerStats = async (pc) => {
const report = await pc.getStats();
return [...report.values()].find((s) => s.type === 'peer-connection');
};
const pc = new RTCPeerConnection();
const first = await getPeerStats(pc);
// In der Zwischenzeit werden Kanäle geöffnet ...
for (let i = 0; i < 3; i++) pc.createDataChannel(`kanal-${i}`);
await new Promise((r) => setTimeout(r, 2000));
const second = await getPeerStats(pc);
const sekunden = (second.timestamp - first.timestamp) / 1000;
const delta = second.dataChannelsOpened - first.dataChannelsOpened;
console.log(`Zeitraum: ${sekunden.toFixed(2)} s, Kanäle/s: ${(delta / sekunden).toFixed(2)}`);
Alter einer Statistik prüfen (veraltete Daten erkennen)
const report = await pc.getStats();
const peer = [...report.values()].find((s) => s.type === 'peer-connection');
const alterMs = Date.now() - peer.timestamp;
if (alterMs > 1000) {
console.warn(`Statistik ist ${Math.round(alterMs)} ms alt – evtl. zwischengespeichert.`);
} else {
console.log('Statistik ist aktuell.');
}
// Wichtig · Fallstricke
- Zeitbasis: Laut Spezifikation wird der Wert relativ zur Unix-Epoche gemessen und nicht relativ zum Seitenstart. Er ist also nicht direkt mit
performance.now()vergleichbar. Rechnen Sie bei Bedarf mitperformance.timeOriginum. Ältere Browserversionen haben das teils anders umgesetzt. Prüfen Sie den Wert deshalb, bevor Sie sich auf eine bestimmte Zeitbasis verlassen. - Zwischenspeicherung: Browser können Statistiken kurzzeitig zwischenspeichern. Folgen zwei
getStats()-Aufrufe schnell aufeinander, können sie denselbentimestampliefern. Teilen Sie bei Ratenberechnungen deshalb nie durch null. - Genauigkeit: Aus Schutz vor Fingerprinting und Timing-Angriffen können Browser die Auflösung von
DOMHighResTimeStamp-Werten verringern. Das betrifft zum Beispiel Seiten, die nicht cross-origin-isolated sind. - Die Eigenschaft wird von
RTCStatsgeerbt. Alle Objekte in einemRTCStatsReporthaben daher einen eigenentimestamp, und diese Werte können sich innerhalb eines Berichts leicht unterscheiden.