Start · Sprachen · JavaScript · Referenz · WebTransport.protocol

WebTransport.protocol

Eigenschaft

Schreibgeschützter String mit dem anwendungsspezifischen Protokoll, das der Server aus den über <code>protocols</code> angebotenen Protokollen ausgewählt hat.

seit JavaScript Experimentell: neuere Chromium- und Firefox-Versio Kategorie: webapi

Signatur

get WebTransport.protocol

Beschreibung

Die Eigenschaft protocol einer WebTransport-Instanz gibt an, auf welches Anwendungsprotokoll sich Client und Server beim Verbindungsaufbau geeinigt haben. Das Prinzip entspricht den Subprotokollen bei WebSocket: Der Client bietet im Konstruktor über die Option protocols eine Liste von Protokollnamen an, zum Beispiel ["chat-v2", "chat-v1"]`, und der Server wählt genau eines davon aus. Beim Handshake werden dafür HTTP-Header verwendet (WT-Available-Protocols bzw. WT-Protocol).

Der Wert ist erst dann sinnvoll, wenn die Sitzung aufgebaut ist, also nachdem das Promise transport.ready erfüllt wurde. Vorher, oder wenn der Server kein Protokoll ausgewählt hat, ist der Wert ein leerer String "".

Einsatzgebiete sind vor allem Versionierung und Aushandeln von Funktionen: Ein Client kann mehrere Versionen seines Nachrichtenformats unterstützen und sein Verhalten danach richten, welche Version der Server bestätigt. So lassen sich Server-Updates ausrollen, ohne dass ältere Clients sofort nicht mehr funktionieren.

Rückgabewert

Typ
string
Beschreibung
Der Name des vom Server ausgewählten Protokolls oder ein leerer String "", wenn kein Protokoll ausgehandelt wurde oder die Verbindung noch nicht bereit ist.

Beispiele

Ausgehandeltes Protokoll nach dem Verbindungsaufbau lesen

const transport = new WebTransport('https://example.com:4433/wt', {
  protocols: ['chat-v2', 'chat-v1']
});

console.log('Vor ready:', JSON.stringify(transport.protocol));

await transport.ready;
console.log('Ausgehandelt:', transport.protocol);
Vor ready: "" Ausgehandelt: chat-v2

Nachrichtenformat je nach Protokollversion wählen

const encoders = {
  'chat-v2': (msg) => new TextEncoder().encode(JSON.stringify({ v: 2, ...msg })),
  'chat-v1': (msg) => new TextEncoder().encode(msg.text)
};

const connect = async (url) => {
  const transport = new WebTransport(url, { protocols: Object.keys(encoders) });
  await transport.ready;

  const encode = encoders[transport.protocol];
  if (!encode) {
    // Server hat kein (bekanntes) Protokoll ausgewählt
    transport.close({ closeCode: 4000, reason: 'Kein unterstütztes Protokoll' });
    throw new Error('Protokollaushandlung fehlgeschlagen');
  }

  const writer = transport.datagrams.writable.getWriter();
  await writer.write(encode({ text: 'Hallo!' }));
  return transport;
};

await connect('https://example.com:4433/chat');

Funktionserkennung und Fallback

const supportsProtocols = 'WebTransport' in globalThis &&
  'protocol' in WebTransport.prototype;

console.log(supportsProtocols
  ? 'Protokollaushandlung verfügbar'
  : 'Keine Protokollaushandlung – Version z. B. per URL-Parameter übermitteln');
Protokollaushandlung verfügbar

// Wichtig · Fallstricke

  • Erst nach ready lesen: Vor dem Aufbau der Sitzung ist der Wert immer "". Lesen Sie ihn deshalb erst nach await transport.ready.
  • Leerer String ist ein gültiges Ergebnis: Unterstützt der Server keine Protokollaushandlung oder wählt er keines der angebotenen Protokolle, bleibt der Wert leer. Die Verbindung kann trotzdem bestehen, deshalb sollten Sie diesen Fall ausdrücklich behandeln.
  • Schreibgeschützt: Eine Zuweisung hat keine Wirkung. Das Protokoll lässt sich nur über die Konstruktoroption protocols beeinflussen. Doppelte oder ungültige Einträge können im Konstruktor einen SyntaxError auslösen.
  • Kompatibilität: WebTransport gibt es nur in sicheren Kontexten (HTTPS), im Fenster und in Web Workern. Die Option protocols und die Eigenschaft protocol kamen erst später zur Spezifikation hinzu und fehlen in älteren Browserversionen, auch wenn diese WebTransport selbst schon unterstützen. Safari unterstützt WebTransport bisher nur eingeschränkt oder gar nicht. Prüfen Sie die Verfügbarkeit per Funktionserkennung.
  • Sicherheit: Das ausgehandelte Protokoll sagt nur, dass sich beide Seiten auf ein Format geeinigt haben. Es ersetzt keine Authentifizierung und keine Prüfung der Eingaben auf dem Server.