Start · Sprachen · JavaScript · Referenz · WebTransportDatagramDuplexStream.maxDatagramSize

WebTransportDatagramDuplexStream.maxDatagramSize

Eigenschaft

Gibt die maximal zulässige Größe eines ausgehenden Datagramms in Bytes zurück, das in <code>writable</code> geschrieben werden kann.

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

Signatur

get WebTransportDatagramDuplexStream.maxDatagramSize

Beschreibung

Die schreibgeschützte Eigenschaft maxDatagramSize des Interfaces WebTransportDatagramDuplexStream gibt als ganze Zahl an, wie viele Bytes ein einzelnes Datagramm höchstens enthalten darf, das über transport.datagrams.writable gesendet wird. Den Stream bekommt man über WebTransport.datagrams.

Datagramme in WebTransport sind unzuverlässige, ungeordnete Nachrichten, die über HTTP/3 und QUIC übertragen werden. Sie werden nicht fragmentiert. Jedes Datagramm muss daher in ein einzelnes QUIC-Paket passen. Der Wert hängt von der ausgehandelten Pfad-MTU und dem Overhead für QUIC- und HTTP/3-Header ab. Meist liegt er bei ungefähr 1200 Bytes.

Die Eigenschaft ist nützlich, wenn Sie Nutzdaten wie Spielzustände, Sensordaten oder Media-Frames selbst in Stücke passender Größe aufteilen oder zu große Nachrichten schon vor dem Senden erkennen wollen. Für Daten, die größer als dieser Wert sind oder zuverlässig ankommen müssen, sollten Sie stattdessen einen unidirektionalen oder bidirektionalen Stream verwenden (createUnidirectionalStream() bzw. createBidirectionalStream()).

Rückgabewert

Typ
number
Beschreibung
Die maximale Größe eines ausgehenden Datagramms in Bytes, als ganze Zahl. Der Wert kann sich während einer Verbindung ändern, zum Beispiel nach einer MTU-Erkennung.

Beispiele

Maximale Datagrammgröße nach dem Verbindungsaufbau auslesen

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

const { maxDatagramSize } = transport.datagrams;
console.log(`Max. Datagrammgröße: ${maxDatagramSize} Bytes`);
Max. Datagrammgröße: 1200 Bytes

Zu große Nachrichten vor dem Senden abfangen

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

const writer = transport.datagrams.writable.getWriter();
const encoder = new TextEncoder();

const sendState = async (state) => {
  const bytes = encoder.encode(JSON.stringify(state));
  if (bytes.byteLength > transport.datagrams.maxDatagramSize) {
    console.warn(`Zu groß (${bytes.byteLength} Bytes) – nutze Stream stattdessen`);
    return false;
  }
  await writer.write(bytes);
  return true;
};

await sendState({ x: 10, y: 20, hp: 87 });

Binärdaten in passende Datagramm-Stücke aufteilen

const chunkForDatagrams = (data, maxSize, headerSize = 4) => {
  const payload = maxSize - headerSize; // Platz für Sequenznummer
  const chunks = [];
  for (let offset = 0, seq = 0; offset < data.byteLength; offset += payload, seq++) {
    const part = data.subarray(offset, offset + payload);
    const packet = new Uint8Array(headerSize + part.byteLength);
    new DataView(packet.buffer).setUint32(0, seq);
    packet.set(part, headerSize);
    chunks.push(packet);
  }
  return chunks;
};

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

const data = new Uint8Array(5000).fill(7);
const packets = chunkForDatagrams(data, transport.datagrams.maxDatagramSize);
console.log(`${packets.length} Datagramme`);

const writer = transport.datagrams.writable.getWriter();
for (const p of packets) await writer.write(p);
5 Datagramme

// Wichtig · Fallstricke

  • Zu große Datagramme werden stillschweigend verworfen: Wenn ein geschriebener Chunk größer als maxDatagramSize ist, wird er nicht gesendet. Es gibt dann auch keinen Fehler. Prüfen Sie die Größe deshalb vor dem Schreiben.
  • Datagramme können unterwegs verloren gehen oder in anderer Reihenfolge ankommen. Wenn Sie Daten in mehrere Datagramme aufteilen, müssen Sie selbst Sequenznummern mitsenden und Verluste behandeln.
  • Rechnen Sie nicht mit einem festen Wert wie 1200. Lesen Sie die Eigenschaft erst nach await transport.ready und am besten vor jedem Senden neu aus, denn der Wert kann sich während der Verbindung ändern.
  • Die Eigenschaft gilt nur für ausgehende Datagramme. Für eingehende Datagramme gibt es keine entsprechende Grenze, die sich in der API auslesen lässt.
  • Kompatibilität: WebTransport funktioniert nur in sicheren Kontexten (HTTPS) und in Web Workers. Chromium-Browser und Firefox unterstützen es, Safari derzeit nicht. Prüfen Sie die Unterstützung mit 'WebTransport' in globalThis. Der Server muss HTTP/3 mit WebTransport unterstützen.