Start · Sprachen · JavaScript · Referenz · RTCDataChannelStats.dataChannelIdentifier

RTCDataChannelStats.dataChannelIdentifier

Eigenschaft

Enthält die <code>id</code> des <code>RTCDataChannel</code>, zu dem dieser Statistikbericht vom Typ <code>"data-channel"</code> gehört.

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

Signatur

RTCDataChannelStats.dataChannelIdentifier

Beschreibung

Die Eigenschaft dataChannelIdentifier gehört zum Wörterbuch RTCDataChannelStats. Solche Statistikobjekte liefert RTCPeerConnection.getStats() als Einträge mit type === "data-channel". Der Wert ist eine Zahl und stimmt mit der Eigenschaft RTCDataChannel.id des zugehörigen Datenkanals überein.

Wofür braucht man sie? Um einen Statistikbericht dem richtigen Datenkanal zuzuordnen. Das ist vor allem dann wichtig, wenn mehrere Kanäle über dieselbe Verbindung laufen, etwa ein zuverlässiger Kanal für Chatnachrichten und ein unzuverlässiger für Spielzustände. Mit dataChannelIdentifier ordnen Sie Werte wie bytesSent, messagesReceived oder state eindeutig einem Kanal zu.

Die id ist die SCTP-Stream-ID des Kanals. Sie entsteht entweder bei ausgehandelten Kanälen (negotiated: true) durch die Anwendung oder wird bei der In-Band-Aushandlung automatisch vergeben. Achtung: Die id eines Kanals kann null sein, solange der SCTP-Transport noch nicht bereit ist. In diesem Fall fehlt die Eigenschaft im Statistikbericht unter Umständen.

Rückgabewert

Typ
number | undefined
Beschreibung
Ganzzahl (unsigned short, 0–65534) mit der SCTP-Stream-ID des zugehörigen RTCDataChannel. Der Wert entspricht RTCDataChannel.id. Er ist undefined, wenn der Kanal noch keine ID erhalten hat.

Beispiele

Statistiken aller Datenkanäle auflisten

const pc = new RTCPeerConnection();
const chat = pc.createDataChannel('chat');

// ... Signalisierung und Verbindungsaufbau ...

const logDataChannelStats = async () => {
  const report = await pc.getStats();
  report.forEach((stats) => {
    if (stats.type === 'data-channel') {
      console.log(
        `Kanal #${stats.dataChannelIdentifier} (${stats.label}): ` +
        `${stats.bytesSent} Bytes gesendet, Zustand ${stats.state}`
      );
    }
  });
};

await logDataChannelStats();
Kanal #0 (chat): 1024 Bytes gesendet, Zustand open

Statistik einem bestimmten RTCDataChannel zuordnen

const findStatsForChannel = async (pc, channel) => {
  if (channel.id === null) return null; // ID noch nicht vergeben
  const report = await pc.getStats();
  for (const stats of report.values()) {
    if (stats.type === 'data-channel' &&
        stats.dataChannelIdentifier === channel.id) {
      return stats;
    }
  }
  return null;
};

const game = pc.createDataChannel('game', { ordered: false, maxRetransmits: 0 });
game.addEventListener('open', async () => {
  const stats = await findStatsForChannel(pc, game);
  console.log('Nachrichten gesendet:', stats?.messagesSent);
});
Nachrichten gesendet: 0

Durchsatz pro Kanal periodisch messen

const lastBytes = new Map();

setInterval(async () => {
  const report = await pc.getStats();
  report.forEach((s) => {
    if (s.type !== 'data-channel') return;
    const id = s.dataChannelIdentifier;
    const prev = lastBytes.get(id) ?? s.bytesSent;
    const kbps = ((s.bytesSent - prev) * 8) / 1000;
    lastBytes.set(id, s.bytesSent);
    console.log(`Kanal ${id}: ${kbps.toFixed(1)} kbit/s`);
  });
}, 1000);
Kanal 0: 12.4 kbit/s Kanal 1: 256.0 kbit/s

// Wichtig · Fallstricke

  • Nicht mit stats.id verwechseln: stats.id ist die eindeutige Kennung des Statistikobjekts im Bericht (z. B. "D1"). dataChannelIdentifier ist dagegen die numerische SCTP-Stream-ID des Kanals.
  • Kann fehlen: Solange RTCDataChannel.id den Wert null hat, also vor dem Aufbau des SCTP-Transports, ist die Eigenschaft nicht gesetzt. Prüfen Sie daher auf undefined.
  • Wiederverwendung: Nach dem Schließen eines Kanals kann seine Stream-ID für einen neuen Kanal wieder vergeben werden. Für langfristiges Monitoring kombinieren Sie die ID deshalb besser mit label oder mit dem Statistik-id.
  • Kompatibilität: Wird in aktuellen Versionen von Chromium, Firefox und Safari unterstützt. Ältere Browser liefern die data-channel-Statistik teils unvollständig. getStats() gibt immer ein Promise zurück, deshalb await verwenden. Die veraltete Callback-Variante sollten Sie nicht mehr nutzen.