Start · Sprachen · JavaScript · Referenz · WebTransportDatagramDuplexStream.incomingMaxAge

WebTransportDatagramDuplexStream.incomingMaxAge

Eigenschaft

Liest oder setzt das maximale Alter in Millisekunden, das eingehende Datagramme haben dürfen, bevor der Browser sie ungelesen verwirft.

seit JavaScript Chrome/Edge 97+, Firefox 114+ (nur sicherer Kontex Kategorie: webapi

Signatur

WebTransportDatagramDuplexStream.incomingMaxAge

Beschreibung

Die Eigenschaft incomingMaxAge eines WebTransportDatagramDuplexStream (erreichbar über transport.datagrams) legt fest, wie alt ein empfangenes Datagramm in der internen Warteschlange höchstens werden darf. Datagramme, die länger als diese Zeit ungelesen in der Warteschlange liegen, verwirft der Browser. Sie kommen dann nie beim readable-Stream an.

Das ist vor allem bei Echtzeit-Anwendungen nützlich, also bei Multiplayer-Spielen, Telemetrie, Positionsdaten oder Audio- und Video-Metadaten. Dort ist ein veralteter Zustand wertlos, und ein aktuelles Paket ist wichtiger als ein vollständiger Verlauf. Kommt die Anwendung mit dem Lesen nicht hinterher (etwa weil der Hauptthread blockiert ist), stauen sich die Pakete nicht beliebig lange an.

Der Wert ist eine Zahl in Millisekunden oder null. null ist der Standardwert und bedeutet: keine Altersgrenze. Die Anwendung erhält also alle Datagramme, solange die Warteschlange (incomingHighWaterMark) nicht überläuft. Laut Spezifikation wird das Setzen auf 0 als null behandelt. Negative Werte und NaN lösen einen RangeError aus.

Parameter

Name Typ Default Beschreibung
$value number | null null Neues Höchstalter in Millisekunden (nur beim Setzen). null oder 0 heißt: keine Begrenzung.

Rückgabewert

Typ
number | null
Beschreibung
Das aktuell eingestellte Höchstalter eingehender Datagramme in Millisekunden oder null, wenn keine Grenze gesetzt ist.

Beispiele

Standardwert lesen und Höchstalter setzen

const transport = new WebTransport('https://example.com:4433/wt');
await transport.ready;

const { datagrams } = transport;
console.log('Vorher:', datagrams.incomingMaxAge);

// Datagramme, die älter als 100 ms sind, verwerfen
datagrams.incomingMaxAge = 100;
console.log('Nachher:', datagrams.incomingMaxAge);
Vorher: null Nachher: 100

Spielzustand in Echtzeit empfangen, veraltete Pakete verwerfen

const connectGame = async (url, onState) => {
  const transport = new WebTransport(url);
  await transport.ready;

  // Positionsdaten älter als 50 ms sind für das Rendering nutzlos
  transport.datagrams.incomingMaxAge = 50;
  transport.datagrams.incomingHighWaterMark = 16;

  const reader = transport.datagrams.readable.getReader();
  const decoder = new TextDecoder();

  while (true) {
    const { value, done } = await reader.read();
    if (done) break;
    onState(JSON.parse(decoder.decode(value)));
  }
};

connectGame('https://game.example.com:4433/state', (state) => {
  console.log('Neuer Zustand:', state.tick);
});
Neuer Zustand: 1042 Neuer Zustand: 1043

Ungültige Werte abfangen und Grenze wieder aufheben

const transport = new WebTransport('https://example.com:4433/wt');
await transport.ready;

try {
  transport.datagrams.incomingMaxAge = -10;
} catch (err) {
  console.log(err.name);
}

// Begrenzung wieder aufheben
transport.datagrams.incomingMaxAge = null;
console.log(transport.datagrams.incomingMaxAge);
RangeError null

// Wichtig · Fallstricke

  • Datagramme sind grundsätzlich unzuverlässig: Auch ohne incomingMaxAge können Pakete verloren gehen oder in anderer Reihenfolge ankommen. Die Eigenschaft sorgt zusätzlich dafür, dass Pakete absichtlich verworfen werden. Nutzen Sie sie also nicht für Daten, die vollständig ankommen müssen. Dafür sind Streams gedacht (createBidirectionalStream()).
  • Negative Werte und NaN lösen einen RangeError aus. 0 wird als null (keine Grenze) behandelt und bedeutet nicht, dass sofort alles verworfen wird.
  • Wie das Alter genau gemessen wird, hängt vom Browser ab. Rechnen Sie mit einer Genauigkeit im Bereich weniger Millisekunden, nicht mit exaktem Timing.
  • Verworfene Datagramme lösen kein Ereignis und keinen Fehler aus. Die Anwendung bemerkt sie nicht, außer sie zählt eigene Sequenznummern mit.
  • Kompatibilität: WebTransport gibt es nur in sicheren Kontexten (HTTPS) und es braucht einen HTTP/3-Server. Chromium-basierte Browser unterstützen es seit Version 97, Firefox seit Version 114. In Safari ist die Unterstützung erst neu bzw. eingeschränkt. Prüfen Sie vorher mit 'WebTransport' in globalThis, ob die API vorhanden ist.