Signatur
Beschreibung
Die Eigenschaft RTCDataChannel.ordered ist ein schreibgeschützter Wahrheitswert. Er zeigt an, ob der Datenkanal Nachrichten beim Empfänger in genau der Reihenfolge ausliefert, in der sie gesendet wurden (true), oder ob sie in beliebiger Reihenfolge ankommen dürfen (false).
Der Wert wird beim Anlegen des Kanals über das Optionsobjekt von RTCPeerConnection.createDataChannel(label, { ordered }) festgelegt. Ohne Angabe ist er true. Später lässt er sich nicht mehr ändern. Auf der Empfängerseite, also bei Kanälen aus dem datachannel-Ereignis, spiegelt die Eigenschaft die Einstellung der Gegenseite wider.
Ungeordnete Kanäle eignen sich für Echtzeitdaten, bei denen nur der neueste Stand zählt, zum Beispiel Spielerpositionen, Sensorwerte oder Cursor-Bewegungen. Eine verspätete Nachricht hält dort keine späteren Nachrichten auf (kein Head-of-Line-Blocking). In Kombination mit maxRetransmits oder maxPacketLifeTime entsteht so ein UDP-ähnlicher, unzuverlässiger Kanal. Für Chat-Nachrichten, Dateiübertragungen oder Befehlsprotokolle sollte ordered dagegen true bleiben.
Beispiele
Standardwert eines neuen Kanals prüfen
const pc = new RTCPeerConnection();
const chat = pc.createDataChannel('chat');
console.log(chat.ordered);
Ungeordneten, unzuverlässigen Kanal für Spielpositionen anlegen
const pc = new RTCPeerConnection();
// Positionsdaten: nur der neueste Stand zählt
const positions = pc.createDataChannel('positions', {
ordered: false,
maxRetransmits: 0
});
console.log(`ordered: ${positions.ordered}, maxRetransmits: ${positions.maxRetransmits}`);
positions.addEventListener('open', () => {
setInterval(() => {
positions.send(JSON.stringify({ x: Math.random(), y: Math.random(), t: Date.now() }));
}, 50);
});
Auf der Empfängerseite je nach Kanaltyp reagieren
const pc = new RTCPeerConnection();
let lastTimestamp = 0;
pc.addEventListener('datachannel', ({ channel }) => {
console.log(`Kanal "${channel.label}" geordnet: ${channel.ordered}`);
channel.addEventListener('message', ({ data }) => {
const msg = JSON.parse(data);
if (!channel.ordered) {
// Veraltete Pakete verwerfen, da sie in falscher Reihenfolge ankommen können
if (msg.t <= lastTimestamp) return;
lastTimestamp = msg.t;
}
console.log('Verarbeite', msg);
});
});
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung wie
channel.ordered = falsehat keine Wirkung und wirft im Strict Mode einenTypeError. Der Wert lässt sich nur über die Optionen voncreateDataChannel()festlegen. - Geordnet ist nicht dasselbe wie zuverlässig:
ordered: falseallein stellt verlorene Pakete trotzdem erneut zu. Erst mitmaxRetransmitsodermaxPacketLifeTimewird der Kanal unzuverlässig. Beide Optionen gleichzeitig anzugeben führt zu einemTypeError. - Ausgehandelte Kanäle: Bei
negotiated: truemüssen beide Seiten den Kanal mit derselbenidund denselben Einstellungen (inklusiveordered) anlegen. Sonst verhält sich der Kanal auf beiden Seiten unterschiedlich. - Bei ungeordneten Kanälen muss die Anwendung selbst mit vertauschten oder veralteten Nachrichten umgehen, etwa über Zeitstempel oder Sequenznummern.
- Die Eigenschaft wird von allen modernen Browsern unterstützt. In Node.js gibt es sie nur über Bibliotheken wie
wrtcodernode-datachannel.