Signatur
Beschreibung
Die Eigenschaft binaryType eines RTCDataChannel bestimmt, in welcher Form binäre Daten im Feld event.data des message-Events ankommen. Textnachrichten sind davon nicht betroffen: Sie werden immer als string geliefert.
Es gibt zwei gültige Werte:
"arraybuffer"– binäre Daten kommen alsArrayBufferan. Das eignet sich für direkte Verarbeitung perDataViewoder typisierten Arrays (z. B.Uint8Array), etwa bei Spielzuständen, Sensordaten oder eigenen Binärprotokollen. Laut aktueller Spezifikation ist das der Standardwert."blob"– binäre Daten kommen alsBloban. Praktisch, wenn Daten unverändert gespeichert, perURL.createObjectURL()angezeigt oder als Datei heruntergeladen werden sollen.
Die Eigenschaft ist les- und schreibbar und kann jederzeit geändert werden; die Änderung wirkt sich auf alle danach eintreffenden Nachrichten aus. Da sich die Voreinstellung zwischen Browsern und Versionen unterschieden hat, sollte man binaryType immer explizit setzen, am besten direkt nach dem Erzeugen des Kanals bzw. im datachannel-Event.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $value | "arraybuffer" | "blob" | "arraybuffer" (laut Spezifikation) | Neuer Wert beim Setzen. Andere Zeichenketten sind ungültig und führen laut Spezifikation zu einem SyntaxError. |
Rückgabewert
"arraybuffer" oder "blob".Beispiele
Binärdaten als ArrayBuffer empfangen
const pc = new RTCPeerConnection();
const channel = pc.createDataChannel('telemetrie');
// Explizit setzen – nicht auf den Standardwert verlassen
channel.binaryType = 'arraybuffer';
console.log(channel.binaryType);
channel.addEventListener('message', (event) => {
if (typeof event.data === 'string') {
console.log('Text:', event.data);
return;
}
// event.data ist ein ArrayBuffer
const view = new DataView(event.data);
const temperatur = view.getFloat32(0, true);
console.log('Temperatur:', temperatur.toFixed(1));
});
Empfangskanal im datachannel-Event konfigurieren
const pc = new RTCPeerConnection();
pc.addEventListener('datachannel', ({ channel }) => {
// Beim entfernten Peer erzeugte Kanäle ebenfalls explizit konfigurieren
channel.binaryType = 'arraybuffer';
channel.onmessage = ({ data }) => {
if (data instanceof ArrayBuffer) {
const bytes = new Uint8Array(data);
console.log(`Empfangen: ${bytes.length} Bytes, erstes Byte: ${bytes[0]}`);
}
};
});
Datei als Blob empfangen und herunterladen (mit Fallback)
const pc = new RTCPeerConnection();
const channel = pc.createDataChannel('datei');
try {
channel.binaryType = 'blob';
} catch (err) {
// Ältere Chromium-Versionen unterstützen "blob" nicht
channel.binaryType = 'arraybuffer';
}
const teile = [];
channel.onmessage = ({ data }) => {
if (data === 'EOF') {
const datei = new Blob(teile, { type: 'image/png' });
const a = document.createElement('a');
a.href = URL.createObjectURL(datei);
a.download = 'bild.png';
a.click();
URL.revokeObjectURL(a.href);
return;
}
// Blob oder ArrayBuffer – beide sind als Blob-Teil zulässig
teile.push(data);
};
// Wichtig · Fallstricke
- Uneinheitlicher Standardwert: Die Spezifikation schreibt
"arraybuffer"vor; ältere Firefox-Versionen verwendeten jedoch"blob"(analog zuWebSocket). Setzen Sie den Wert deshalb immer ausdrücklich. - Chromium und
"blob": Chrome und Edge unterstützten"blob"lange nicht und warfen beim Setzen einen Fehler (NotSupportedError). Wer Blobs braucht, sollte das Setzen intry/catchkapseln oder mitArrayBufferarbeiten und bei Bedarf selbstnew Blob([buffer])erzeugen. - Ungültige Werte: Anders als bei
WebSocket.binaryTypewerden ungültige Werte nicht still ignoriert. Laut Spezifikation wird einSyntaxErrorausgelöst. - Nur Empfangsseite:
binaryTypebeeinflusst nur eingehende Daten.send()akzeptiert unabhängig davonstring,Blob,ArrayBufferundArrayBufferView. - Performance:
"arraybuffer"liefert die Daten synchron verarbeitbar. EinBlobmuss erst asynchron gelesen werden (await blob.arrayBuffer()). Für häufige kleine Nachrichten ist"arraybuffer"daher meist die bessere Wahl.