Start · Sprachen · JavaScript · Referenz · RTCDataChannel.protocol

RTCDataChannel.protocol

Eigenschaft

Schreibgeschützte Eigenschaft, die den Namen des Subprotokolls eines <code>RTCDataChannel</code> als String liefert, oder einen leeren String, wenn keines festgelegt wurde.

seit JavaScript Baseline: alle modernen Browser (Chrome, Firefox, Kategorie: webapi

Signatur

RTCDataChannel.protocol

Beschreibung

Die Eigenschaft protocol eines RTCDataChannel gibt den Namen des Subprotokolls zurück, der beim Anlegen des Kanals über RTCPeerConnection.createDataChannel() in den Optionen ({ protocol: "..." }) angegeben wurde. Ist kein Subprotokoll gesetzt, ist der Wert ein leerer String "".

WebRTC selbst wertet diesen Wert nicht aus. Er dient der Anwendung als Kennzeichnung, damit beide Seiten wissen, welches Nachrichtenformat über den Kanal läuft, etwa "json", "chat-v2" oder "file-transfer". Die Gegenstelle bekommt den Wert beim Aushandeln des Kanals automatisch übermittelt und kann ihn im datachannel-Ereignis von RTCPeerConnection abfragen, um den passenden Handler auszuwählen.

Die Eigenschaft ist schreibgeschützt. Das Subprotokoll lässt sich nur beim Erstellen des Kanals festlegen und danach nicht mehr ändern. Bei vorab ausgehandelten Kanälen (negotiated: true) müssen beide Seiten denselben protocol-Wert selbst angeben, weil dann nichts automatisch übertragen wird.

Rückgabewert

Typ
string
Beschreibung
Der Name des Subprotokolls, das bei der Erstellung des Kanals angegeben wurde, oder "", wenn keines festgelegt wurde. Die Länge ist auf 65535 Bytes begrenzt.

Beispiele

Subprotokoll beim Erstellen festlegen und auslesen

const pc = new RTCPeerConnection();

// Kanal mit Subprotokoll anlegen
const chatChannel = pc.createDataChannel('chat', { protocol: 'chat-v2' });
console.log(chatChannel.protocol);

// Kanal ohne Subprotokoll
const plainChannel = pc.createDataChannel('raw');
console.log(JSON.stringify(plainChannel.protocol));
chat-v2 ""

Handler auf der Gegenseite anhand des Subprotokolls wählen

const pc = new RTCPeerConnection();

const handlers = {
  'json': (event) => console.log('JSON:', JSON.parse(event.data)),
  'file-transfer': (event) => console.log('Datenblock:', event.data.byteLength, 'Bytes')
};

pc.addEventListener('datachannel', ({ channel }) => {
  const handler = handlers[channel.protocol];
  if (!handler) {
    console.warn(`Unbekanntes Subprotokoll "${channel.protocol}" – Kanal wird geschlossen`);
    channel.close();
    return;
  }
  if (channel.protocol === 'file-transfer') channel.binaryType = 'arraybuffer';
  channel.addEventListener('message', handler);
});

Vorab ausgehandelter Kanal mit identischem Protokoll auf beiden Seiten

// Auf BEIDEN Peers identisch ausführen
const createSyncChannel = (pc) =>
  pc.createDataChannel('sync', {
    negotiated: true,
    id: 0,
    protocol: 'state-sync-v1'
  });

const pcA = new RTCPeerConnection();
const channelA = createSyncChannel(pcA);
console.log(`Kanal ${channelA.label} nutzt ${channelA.protocol}`);
Kanal sync nutzt state-sync-v1

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung wie channel.protocol = 'x' wird ignoriert bzw. wirft im Strict Mode einen TypeError. Das Protokoll kann nur in createDataChannel() gesetzt werden.
  • Keine Prüfung durch den Browser: Anders als bei WebSocket findet kein Handshake statt, der das Subprotokoll bestätigt oder ablehnt. Die Anwendung muss selbst prüfen, ob sie den Wert kennt.
  • Längenbegrenzung: Ist der Wert länger als 65535 Bytes, wirft createDataChannel() einen TypeError.
  • Vorab ausgehandelte Kanäle: Bei negotiated: true wird der Wert nicht übertragen. Beide Seiten müssen ihn selbst und identisch angeben.
  • Sicherheit: Der Wert stammt von der Gegenstelle und ist deshalb nicht vertrauenswürdig. Nicht ungeprüft in innerHTML einsetzen oder als Schlüssel für dynamische Codeausführung verwenden. Besser mit einer Positivliste (Allowlist) abgleichen.
  • Kompatibilität: Wird von allen aktuellen Browsern mit WebRTC-Unterstützung unterstützt. In Node.js nur über Zusatzbibliotheken wie wrtc oder node-datachannel verfügbar.