Start · Sprachen · JavaScript · Referenz · RTCDataChannel.ordered

RTCDataChannel.ordered

Eigenschaft

Die schreibgeschützte Eigenschaft <code>ordered</code> gibt an, ob ein <code>RTCDataChannel</code> Nachrichten garantiert in der Sendereihenfolge zustellt.

seit JavaScript Baseline: alle modernen Browser (Chrome, Firefox, Kategorie: webapi

Signatur

RTCDataChannel.ordered

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);
true

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);
});
ordered: false, maxRetransmits: 0

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);
  });
});
Kanal "positions" geordnet: false

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung wie channel.ordered = false hat keine Wirkung und wirft im Strict Mode einen TypeError. Der Wert lässt sich nur über die Optionen von createDataChannel() festlegen.
  • Geordnet ist nicht dasselbe wie zuverlässig: ordered: false allein stellt verlorene Pakete trotzdem erneut zu. Erst mit maxRetransmits oder maxPacketLifeTime wird der Kanal unzuverlässig. Beide Optionen gleichzeitig anzugeben führt zu einem TypeError.
  • Ausgehandelte Kanäle: Bei negotiated: true müssen beide Seiten den Kanal mit derselben id und denselben Einstellungen (inklusive ordered) 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 wrtc oder node-datachannel.