Start · Sprachen · JavaScript · Referenz · RTCPeerConnectionStats.timestamp

RTCPeerConnectionStats.timestamp

Eigenschaft

Gibt als <code>DOMHighResTimeStamp</code> an, wann die Daten im <code>RTCPeerConnectionStats</code>-Objekt (Statistiktyp <code>"peer-connection"</code>) erfasst wurden.

seit JavaScript Baseline: alle modernen Browser (Chrome, Edge, Fir Kategorie: webapi

Signatur

RTCPeerConnectionStats.timestamp

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

Typ
DOMHighResTimeStamp (number)
Beschreibung
Gleitkommazahl in Millisekunden seit der Unix-Epoche, die angibt, wann die Statistikdaten erfasst wurden. Die Eigenschaft ist schreibgeschützt.

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());
  }
}
Erfasst um: 1718012345678.123 Als Datum: 2024-06-10T09:39:05.678Z

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)}`);
Zeitraum: 2.00 s, Kanäle/s: 0.00 (Kanäle zählen erst als geöffnet, wenn sie den Zustand "open" erreichen)

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.');
}
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 mit performance.timeOrigin um. Ä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 denselben timestamp liefern. 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 RTCStats geerbt. Alle Objekte in einem RTCStatsReport haben daher einen eigenen timestamp, und diese Werte können sich innerhalb eines Berichts leicht unterscheiden.