Start · Sprachen · JavaScript · Referenz · RTCDataChannelStats.bytesReceived

RTCDataChannelStats.bytesReceived

Eigenschaft

Gesamtzahl der Nutzdaten-Bytes, die bisher über den zugehörigen <code>RTCDataChannel</code> empfangen wurden (ohne Protokoll-Overhead).

seit JavaScript Baseline: Chrome, Edge, Firefox, Safari (neuere Ve Kategorie: webapi

Signatur

RTCDataChannelStats.bytesReceived

Beschreibung

Die schreibgeschützte Eigenschaft bytesReceived des Wörterbuchs RTCDataChannelStats enthält die Gesamtzahl der Nutzdaten-Bytes, die auf einem bestimmten RTCDataChannel empfangen wurden. Gezählt werden nur die Bytes der eigentlichen Nachrichten: Header, Auffüllbytes (Padding) sowie SCTP-, DTLS- und UDP-Overhead fließen nicht ein.

Einen RTCDataChannelStats-Eintrag bekommst du über RTCPeerConnection.getStats(). Der zurückgegebene RTCStatsReport ist eine Map-artige Struktur; die Einträge mit type === "data-channel" beschreiben jeweils einen Datenkanal. Mit label und dataChannelIdentifier ordnest du den Eintrag dem richtigen Kanal zu.

Typische Einsatzzwecke sind Diagnose-Oberflächen, Bandbreitenmessung (Durchsatz aus der Differenz zweier Messungen, geteilt durch die Zeitdifferenz über timestamp) und Fortschrittsanzeigen bei Dateiübertragungen per WebRTC. Zusammen mit messagesReceived lässt sich außerdem die durchschnittliche Nachrichtengröße berechnen.

Rückgabewert

Typ
number
Beschreibung
Eine nicht-negative Ganzzahl (in WebIDL unsigned long long): die kumulierte Anzahl empfangener Nutzdaten-Bytes seit dem Öffnen des Kanals. Fehlt die Eigenschaft im Statistik-Objekt, ist der Wert undefined.

Beispiele

Empfangene Bytes aller Datenkanäle auslesen

const logDataChannelBytes = async (pc) => {
  const report = await pc.getStats();
  report.forEach((stats) => {
    if (stats.type === 'data-channel') {
      console.log(`Kanal "${stats.label}": ${stats.bytesReceived ?? 0} Bytes empfangen`);
    }
  });
};

// pc ist eine bestehende, verbundene RTCPeerConnection
await logDataChannelBytes(pc);
Kanal "chat": 18432 Bytes empfangen

Empfangs-Durchsatz periodisch messen

const monitorThroughput = (pc, label, intervalMs = 1000) => {
  let last = null;
  return setInterval(async () => {
    const report = await pc.getStats();
    for (const stats of report.values()) {
      if (stats.type !== 'data-channel' || stats.label !== label) continue;
      if (last) {
        const bytes = stats.bytesReceived - last.bytesReceived;
        const seconds = (stats.timestamp - last.timestamp) / 1000;
        console.log(`${label}: ${(bytes / seconds / 1024).toFixed(1)} KiB/s`);
      }
      last = stats;
    }
  }, intervalMs);
};

const timerId = monitorThroughput(pc, 'dateiuebertragung');
// Später beenden: clearInterval(timerId);
dateiuebertragung: 512.3 KiB/s

Fortschritt einer Dateiübertragung anzeigen

const expectedSize = 5 * 1024 * 1024; // vom Sender angekündigte Dateigröße

const showProgress = async (pc, label) => {
  const report = await pc.getStats();
  const stats = [...report.values()].find(
    (s) => s.type === 'data-channel' && s.label === label
  );
  if (!stats) return;
  const percent = Math.min(100, (stats.bytesReceived / expectedSize) * 100);
  console.log(`Fortschritt: ${percent.toFixed(0)} %`);
};

await showProgress(pc, 'datei');
Fortschritt: 42 %

// Wichtig · Fallstricke

  • Nur Nutzdaten: Protokoll-Overhead (SCTP, DTLS, UDP, IP) wird nicht gezählt. Für den tatsächlichen Netzwerkverkehr musst du die Statistiken vom Typ transport oder candidate-pair auswerten.
  • Kumulativer Zähler: Der Wert steigt nur an. Für einen Durchsatz immer die Differenz zweier Messungen bilden und durch die Differenz ihrer timestamp-Werte teilen.
  • Kanal eindeutig zuordnen: Mehrere Kanäle können dasselbe label haben. Wenn du ganz sicher gehen willst, vergleiche dataChannelIdentifier mit RTCDataChannel.id.
  • Geschlossene Kanäle: Je nach Browser taucht ein geschlossener Kanal nicht mehr im Bericht auf. Wichtige Werte deshalb vorher sichern.
  • Kompatibilität: Wird in allen aktuellen Browsern mit WebRTC-Unterstützung angeboten. In älteren Versionen kann die Eigenschaft fehlen, daher mit ?? 0 absichern. Außerdem ist getStats() asynchron und sollte nicht zu oft aufgerufen werden (etwa einmal pro Sekunde reicht meist).