Start · Sprachen · JavaScript · Referenz · RTCDataChannelStats.messagesReceived

RTCDataChannelStats.messagesReceived

Eigenschaft

Gibt die Gesamtzahl der <code>message</code>-Ereignisse zurück, die für empfangene Nachrichten auf dem zugehörigen <code>RTCDataChannel</code> ausgelöst wurden.

seit JavaScript Baseline: Chrome, Edge, Firefox, Safari (WebRTC-St Kategorie: webapi

Signatur

RTCDataChannelStats.messagesReceived

Beschreibung

Die schreibgeschützte Eigenschaft messagesReceived gehört zum Wörterbuch RTCDataChannelStats. Das ist der Statistikeintrag vom Typ "data-channel", den RTCPeerConnection.getStats() in seinem RTCStatsReport liefert. Der Wert ist eine positive ganze Zahl. Sie gibt an, wie viele Nachrichten der lokale Endpunkt seit dem Öffnen auf diesem Datenkanal empfangen hat. Das entspricht der Anzahl der ausgelösten message-Ereignisse.

Typische Einsatzzwecke sind Monitoring und Fehlersuche: Du prüfst, ob beim Empfänger überhaupt Daten ankommen, vergleichst den Wert mit messagesSent der Gegenseite, um Verluste zu erkennen (bei unzuverlässigen Kanälen mit ordered: false oder maxRetransmits), oder du berechnest durch wiederholtes Abfragen eine Nachrichtenrate pro Sekunde.

Der Zähler steigt nur. Er zählt Nachrichten, nicht Bytes. Die empfangene Datenmenge liefert bytesReceived. Mit dataChannelIdentifier und label ordnest du den Statistikeintrag dem richtigen Kanal zu, falls mehrere Kanäle offen sind.

Rückgabewert

Typ
number
Beschreibung
Positive ganze Zahl: Anzahl der bisher auf dem Datenkanal empfangenen Nachrichten (message-Ereignisse).

Beispiele

Empfangene Nachrichten aller Datenkanäle auslesen

const logDataChannelStats = async (pc) => {
  const report = await pc.getStats();
  report.forEach((stats) => {
    if (stats.type === "data-channel") {
      console.log(`Kanal "${stats.label}": ${stats.messagesReceived} Nachrichten empfangen`);
    }
  });
};

// pc ist eine bestehende RTCPeerConnection mit offenem Datenkanal
await logDataChannelStats(pc);
Kanal "chat": 42 Nachrichten empfangen

Nachrichtenrate pro Sekunde messen

const getReceived = async (pc, label) => {
  const report = await pc.getStats();
  for (const stats of report.values()) {
    if (stats.type === "data-channel" && stats.label === label) {
      return { count: stats.messagesReceived ?? 0, time: stats.timestamp };
    }
  }
  return null;
};

let last = await getReceived(pc, "telemetry");
const timer = setInterval(async () => {
  const now = await getReceived(pc, "telemetry");
  if (!now || !last) return;
  const rate = ((now.count - last.count) / (now.time - last.time)) * 1000;
  console.log(`Empfangsrate: ${rate.toFixed(1)} Nachrichten/s`);
  last = now;
}, 2000);
Empfangsrate: 30.0 Nachrichten/s

Zähler mit eigenem message-Zähler vergleichen

const channel = pc.createDataChannel("sync");
let ownCount = 0;
channel.addEventListener("message", () => ownCount++);

const check = async () => {
  const report = await pc.getStats();
  const stats = [...report.values()].find(
    (s) => s.type === "data-channel" && s.label === "sync"
  );
  console.log("Statistik:", stats?.messagesReceived, "| eigener Zähler:", ownCount);
};

setTimeout(check, 5000);
Statistik: 17 | eigener Zähler: 17

// Wichtig · Fallstricke

  • Nur über getStats() erreichbar: messagesReceived ist keine Eigenschaft von RTCDataChannel selbst. Du findest sie nur im Statistikeintrag mit type === "data-channel".
  • Momentaufnahme: Der Wert wird nicht live aktualisiert. Für aktuelle Zahlen musst du getStats() erneut aufrufen. Browser können Statistiken außerdem zwischenspeichern, sodass kurz hintereinander ausgeführte Abfragen denselben Wert liefern.
  • Nachrichten statt Bytes: Große Nachrichten zählen einmal, egal wie groß sie sind. Für Durchsatzmessungen nimmst du bytesReceived.
  • Geschlossene Kanäle: Nach dem Schließen kann der Eintrag je nach Browser noch eine Weile im Report stehen oder verschwinden. Prüfe dazu state.
  • Kompatibilität: Wird von aktuellen Versionen von Chrome, Edge, Firefox und Safari unterstützt. In älteren Browsern kann das Feld fehlen, verwende deshalb einen Fallback wie ?? 0.