Signatur
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
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);
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}`);
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 ohnesendGroup. - Kein Konstruktor:
new WebTransportSendGroup()wirft einenTypeError. Instanzen entstehen nur übercreateSendGroup(). - Eine Gruppe lässt sich nicht verbindungsübergreifend verwenden. Wer eine Gruppe einer anderen
WebTransport-Instanz übergibt, bekommt einenInvalidStateError. sendOrderwirkt 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.