Start · Sprachen · JavaScript · Referenz · RTCDataChannelStats.bytesSent

RTCDataChannelStats.bytesSent

Eigenschaft

Gibt die Gesamtzahl der Nutzlast-Bytes an, die bisher über den zugehörigen <code>RTCDataChannel</code> gesendet wurden.

seit JavaScript Baseline: Chrome 80+, Firefox 68+, Safari 11+ (übe Kategorie: webapi

Signatur

RTCDataChannelStats.bytesSent

Beschreibung

bytesSent ist eine schreibgeschützte Eigenschaft des Dictionaries RTCDataChannelStats. Ein solcher Statistikeintrag hat den type "data-channel" und steht im RTCStatsReport, den RTCPeerConnection.getStats() zurückgibt. Der Wert zählt die Nutzlast-Bytes aller Nachrichten, die über den Kanal gesendet wurden. Header von SCTP, DTLS, UDP und IP werden nicht mitgezählt.

Mit der Eigenschaft lässt sich das Datenvolumen eines einzelnen Datenkanals messen, etwa für Dateiübertragungen, Spiel-Synchronisation oder Chat-Anwendungen. Fragt man die Statistik regelmäßig ab und vergleicht zwei Werte samt ihren timestamp-Angaben, erhält man den Durchsatz in Bytes pro Sekunde. Zusammen mit messagesSent ergibt sich außerdem die durchschnittliche Nachrichtengröße.

Der Zähler wächst monoton, solange der Kanal existiert. Ein Wert wird nur für Nachrichten erfasst, die wirklich an die Transportschicht übergeben wurden. Daten, die noch im Sendepuffer stehen (siehe RTCDataChannel.bufferedAmount), sind darin eventuell noch nicht enthalten.

Rückgabewert

Typ
number
Beschreibung
Eine nicht negative ganze Zahl (unsigned long long): die Summe der bisher gesendeten Nutzlast-Bytes auf diesem Datenkanal. Fehlt der Wert in der Implementierung, ist die Eigenschaft undefined.

Beispiele

Gesendete 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}" (id ${stats.dataChannelIdentifier}): ${stats.bytesSent} Bytes gesendet`);
    }
  });
};

// Nutzung mit einer bestehenden, verbundenen RTCPeerConnection
await logDataChannelBytes(peerConnection);
Kanal "chat" (id 0): 1532 Bytes gesendet

Sende-Durchsatz eines Kanals messen

const findChannelStats = async (pc, label) => {
  const report = await pc.getStats();
  for (const stats of report.values()) {
    if (stats.type === 'data-channel' && stats.label === label) return stats;
  }
  return null;
};

let previous = null;
const timer = setInterval(async () => {
  const current = await findChannelStats(peerConnection, 'file-transfer');
  if (!current) return;
  if (previous) {
    const bytes = current.bytesSent - previous.bytesSent;
    const seconds = (current.timestamp - previous.timestamp) / 1000;
    console.log(`Durchsatz: ${(bytes / seconds / 1024).toFixed(1)} KiB/s`);
  }
  previous = current;
}, 1000);

// Später: clearInterval(timer);
Durchsatz: 812.4 KiB/s

Durchschnittliche Nachrichtengröße berechnen

const averageMessageSize = async (pc) => {
  const report = await pc.getStats();
  const result = {};
  report.forEach((s) => {
    if (s.type === 'data-channel' && s.messagesSent > 0) {
      result[s.label] = Math.round(s.bytesSent / s.messagesSent);
    }
  });
  return result;
};

console.log(await averageMessageSize(peerConnection));
{ chat: 42, "file-transfer": 16384 }

// Wichtig · Fallstricke

  • Nur Nutzlast: Protokoll-Overhead durch SCTP, DTLS, UDP und IP ist nicht enthalten. Für den gesamten Netzwerkverkehr nutzt man RTCTransportStats.bytesSent oder RTCIceCandidatePairStats.bytesSent.
  • Kodierung von Zeichenketten: Texte, die mit send() verschickt werden, zählen in UTF-8-Bytes, nicht in Zeichen. Umlaute und Emojis belegen daher mehrere Bytes.
  • Snapshot-Charakter: Das Statistikobjekt ist eine Momentaufnahme und aktualisiert sich nicht von selbst. Man muss getStats() erneut aufrufen.
  • Zuordnung: Man sollte Kanäle über dataChannelIdentifier oder label zuordnen. Die Statistik-id ist browserspezifisch und kann sich zwischen Implementierungen unterscheiden.
  • Kompatibilität: Wird in allen modernen Browsern unterstützt. Ältere Versionen liefern die Eigenschaft eventuell nicht. Vor Berechnungen sollte man deshalb auf undefined prüfen.
  • Nach dem Schließen: Wenn ein Kanal geschlossen ist (state: "closed"), kann sein Statistikeintrag aus späteren Berichten verschwinden.