Start · Sprachen · JavaScript · Referenz · WebTransportDatagramDuplexStream.incomingHighWaterMark

WebTransportDatagramDuplexStream.incomingHighWaterMark

Eigenschaft

Liest oder setzt die High Water Mark für eingehende Datagramme, also wie viele Pakete die interne Warteschlange von <code>readable</code> höchstens puffern soll.

seit JavaScript Chrome/Edge 97+, Firefox 114+, Safari: nicht unter deprecated seit ja Kategorie: webapi

Signatur

WebTransportDatagramDuplexStream.incomingHighWaterMark

Beschreibung

Die Eigenschaft incomingHighWaterMark einer WebTransportDatagramDuplexStream-Instanz (erreichbar über transport.datagrams) bestimmt die High Water Mark des eingehenden ReadableStream. Das ist die maximale Anzahl an Datagrammen, die in der internen Warteschlange liegen dürfen, bevor Gegendruck (Backpressure) greift. Die Größe wird in Paketen gezählt, nicht in Bytes.

Datagramme sind unzuverlässig und ungeordnet. Deshalb werden eingehende Pakete bei voller Warteschlange nicht zurückgehalten, sondern verworfen, sobald die Anwendung zu langsam liest. Ein höherer Wert glättet kurze Lastspitzen, etwa bei Spielen oder Telemetrie. Er kostet aber Speicher, und die ältesten Pakete sind beim Lesen womöglich schon veraltet.

Setzt du die Eigenschaft, gilt der neue Wert sofort. Er beeinflusst, wie viele Pakete der Browser puffert, bevor er verwirft. Zusammen mit incomingMaxAge lässt sich so steuern, wie „frisch“ die gelesenen Daten sind.

Parameter

Name Typ Default Beschreibung
$value number implementierungsabhängig (z. B. 1) Nur beim Setzen: neue High Water Mark in Paketen. Muss eine nicht-negative Zahl sein. Werte unter 1 werden intern auf 1 angehoben.

Rückgabewert

Typ
number
Beschreibung
Die aktuelle High Water Mark für eingehende Datagramme, gemessen in Paketen.

Beispiele

Aktuellen Wert auslesen

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

const { datagrams } = transport;
console.log('Eingehende HWM:', datagrams.incomingHighWaterMark);
Eingehende HWM: 1

Puffer für Lastspitzen vergrößern

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

// Bis zu 64 Pakete puffern, bevor verworfen wird
transport.datagrams.incomingHighWaterMark = 64;
// Pakete, die älter als 100 ms sind, trotzdem verwerfen
transport.datagrams.incomingMaxAge = 100;

const reader = transport.datagrams.readable.getReader();
while (true) {
  const { value, done } = await reader.read();
  if (done) break;
  console.log('Empfangen:', value.byteLength, 'Bytes');
}
Empfangen: 128 Bytes Empfangen: 96 Bytes

Unterstützung prüfen und Wert anpassen

const configureIncoming = (transport, packets) => {
  const d = transport.datagrams;
  if (!('incomingHighWaterMark' in d)) {
    console.warn('incomingHighWaterMark nicht unterstützt');
    return;
  }
  d.incomingHighWaterMark = Math.max(1, packets);
  console.log('Neu gesetzt:', d.incomingHighWaterMark);
};

const transport = new WebTransport('https://example.com:4433/chat');
await transport.ready;
configureIncoming(transport, 16);
Neu gesetzt: 16

// Wichtig · Fallstricke

  • Kompatibilität: WebTransport gibt es in Chromium-Browsern ab Version 97 und in Firefox ab Version 114. Safari unterstützt es derzeit nicht. Außerdem ist ein sicherer Kontext (HTTPS) und ein HTTP/3-Server nötig.
  • Die Einheit sind Pakete, nicht Bytes. Ein hoher Wert kann bei großen Datagrammen viel Speicher belegen.
  • Ist die Warteschlange voll, verwirft der Browser Datagramme stillschweigend. Es gibt kein Ereignis und keinen Fehler. Wenn die Daten vollständig ankommen müssen, nimm Streams (createBidirectionalStream()) statt Datagrammen.
  • Negative Werte oder NaN können einen RangeError auslösen. Prüfe den Wert deshalb vor dem Setzen.
  • Ein großer Puffer erhöht die Latenz: Du liest dann eventuell veraltete Pakete. Kombiniere die Eigenschaft deshalb mit incomingMaxAge.