Signatur
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
"", 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));
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}`);
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung wie
channel.protocol = 'x'wird ignoriert bzw. wirft im Strict Mode einenTypeError. Das Protokoll kann nur increateDataChannel()gesetzt werden. - Keine Prüfung durch den Browser: Anders als bei
WebSocketfindet 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()einenTypeError. - Vorab ausgehandelte Kanäle: Bei
negotiated: truewird 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
innerHTMLeinsetzen 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
wrtcodernode-datachannelverfügbar.