Signatur
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
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();
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);
});
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);
// Wichtig · Fallstricke
- Nicht mit
stats.idverwechseln:stats.idist die eindeutige Kennung des Statistikobjekts im Bericht (z. B."D1").dataChannelIdentifierist dagegen die numerische SCTP-Stream-ID des Kanals. - Kann fehlen: Solange
RTCDataChannel.idden Wertnullhat, also vor dem Aufbau des SCTP-Transports, ist die Eigenschaft nicht gesetzt. Prüfen Sie daher aufundefined. - 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
labeloder 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, deshalbawaitverwenden. Die veraltete Callback-Variante sollten Sie nicht mehr nutzen.