Start · Sprachen · JavaScript · Referenz · WebTransportSendGroup

WebTransportSendGroup

Schnittstelle

Fasst WebTransport-Streams und -Datagramme zu einer Gruppe zusammen. Innerhalb der Gruppe bestimmt der <code>sendOrder</code>-Wert jedes Mitglieds, welche Daten zuerst gesendet werden.

seit JavaScript Experimentell – eingeschränkte Browser-Unterstützu Kategorie: webapi

Signatur

interface WebTransportSendGroup

Beschreibung

WebTransportSendGroup gehört zur WebTransport API. Ein solches Objekt fasst mehrere ausgehende Streams (und bei neueren Implementierungen auch beschreibbare Datagramm-Kanäle) zu einer Prioritätsgruppe zusammen. Innerhalb der Gruppe entscheidet der sendOrder-Wert eines Mitglieds über die Reihenfolge: Mitglieder mit höherem sendOrder werden bevorzugt gesendet, wenn die Bandbreite knapp ist. Zwischen verschiedenen Gruppen verteilt der Browser die Bandbreite dagegen fair und ohne Rangfolge.

Einen öffentlichen Konstruktor gibt es nicht. Eine Instanz entsteht über WebTransport.prototype.createSendGroup(). Anschließend übergibt man sie in der Option sendGroup an createUnidirectionalStream() oder createBidirectionalStream(). Man kann sie auch nachträglich über die Eigenschaft WebTransportSendStream.sendGroup setzen. Eine Send-Group gehört immer zu genau der WebTransport-Verbindung, die sie erzeugt hat.

Typische Einsatzfälle sind Echtzeit-Anwendungen mit mehreren unabhängigen Datenflüssen, zum Beispiel Audio und Video in einer Videokonferenz oder Spielzustand und Chat in einem Multiplayer-Spiel. Jeder Datenfluss bekommt seine eigene Gruppe, damit er einen fairen Anteil der Bandbreite erhält. Innerhalb eines Flusses priorisiert man mit sendOrder, zum Beispiel Keyframes vor Delta-Frames.

Die einzige Methode ist getStats(). Sie liefert ein Promise, das zu einem WebTransportSendStats-Objekt aufgelöst wird. Darin stehen die Byte-Zähler aller Mitglieder der Gruppe zusammengefasst (bytesWritten, bytesSent, bytesAcknowledged).

Rückgabewert

Typ
WebTransportSendGroup
Beschreibung
Wird von WebTransport.prototype.createSendGroup() zurückgegeben. Die einzige Methode ist getStats(): Promise<WebTransportSendStats>.

Beispiele

Send-Group erzeugen und Streams zuordnen

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

// Eine Gruppe für alle Video-Streams
const videoGroup = transport.createSendGroup();

// Keyframe-Stream mit hoher Priorität innerhalb der Gruppe
const keyframes = await transport.createUnidirectionalStream({
  sendGroup: videoGroup,
  sendOrder: 100
});

// Delta-Frames mit niedrigerer Priorität
const deltas = await transport.createUnidirectionalStream({
  sendGroup: videoGroup,
  sendOrder: 10
});

console.log(keyframes.sendGroup === videoGroup);
true

Getrennte Gruppen für Audio und Video (faire Aufteilung)

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

const audioGroup = transport.createSendGroup();
const videoGroup = transport.createSendGroup();

const audio = await transport.createUnidirectionalStream({ sendGroup: audioGroup });
const video = await transport.createUnidirectionalStream({ sendGroup: videoGroup });

// Audio verhungert nicht, auch wenn gleichzeitig viele Videodaten anfallen:
// Zwischen den Gruppen teilt der Browser die Bandbreite fair auf.
const audioWriter = audio.getWriter();
await audioWriter.write(new Uint8Array([0x01, 0x02, 0x03]));

Statistiken einer Gruppe auslesen

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

const group = transport.createSendGroup();
const stream = await transport.createUnidirectionalStream({ sendGroup: group });
const writer = stream.getWriter();
await writer.write(new TextEncoder().encode('Hallo WebTransport'));

const stats = await group.getStats();
console.log(`geschrieben: ${stats.bytesWritten}, gesendet: ${stats.bytesSent}, bestätigt: ${stats.bytesAcknowledged}`);
geschrieben: 18, gesendet: 18, bestätigt: 0 // Werte hängen vom Netzwerk ab

Stream nachträglich einer anderen Gruppe zuordnen

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

const lowPrio = transport.createSendGroup();
const highPrio = transport.createSendGroup();

const stream = await transport.createUnidirectionalStream({ sendGroup: lowPrio });

// Später: Stream in eine andere Gruppe verschieben und Priorität anheben
stream.sendGroup = highPrio;
stream.sendOrder = 50;

// Gruppe wieder entfernen
stream.sendGroup = null;

// Wichtig · Fallstricke

  • Browser-Kompatibilität: Die Schnittstelle ist experimentell und wird noch nicht von allen Browsern unterstützt, die WebTransport kennen. Vor der Nutzung sollte man prüfen, ob sie vorhanden ist, etwa mit typeof transport.createSendGroup === 'function'. Fehlt sie, erzeugt man die Streams einfach ohne sendGroup.
  • Kein Konstruktor: new WebTransportSendGroup() wirft einen TypeError. Instanzen entstehen nur über createSendGroup().
  • Eine Gruppe lässt sich nicht verbindungsübergreifend verwenden. Wer eine Gruppe einer anderen WebTransport-Instanz übergibt, bekommt einen InvalidStateError.
  • sendOrder wirkt nur innerhalb einer Gruppe. Zwischen Gruppen gibt es keine Rangfolge, dort wird die Bandbreite fair verteilt. Ohne Gruppe bilden alle Streams, denen keine Gruppe zugewiesen ist, gemeinsam eine eigene, implizite Gruppe.
  • Priorisierung ist nur ein Hinweis an den Browser und die QUIC-Schicht. Eine exakte Reihenfolge beim Empfänger ist nicht garantiert.
  • WebTransport erfordert einen sicheren Kontext (HTTPS) und einen Server mit HTTP/3.