Start · Sprachen · JavaScript · Referenz · RTCDataChannel.binaryType

RTCDataChannel.binaryType

Eigenschaft

Legt fest, als welcher Objekttyp (<code>"arraybuffer"</code> oder <code>"blob"</code>) binäre Nachrichten eines <code>RTCDataChannel</code> im <code>message</code>-Event geliefert werden.

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

Signatur

RTCDataChannel.binaryType

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 als ArrayBuffer an. Das eignet sich für direkte Verarbeitung per DataView oder 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 als Blob an. Praktisch, wenn Daten unverändert gespeichert, per URL.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

Typ
string
Beschreibung
Der aktuelle Typ für empfangene Binärdaten: "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));
});
arraybuffer

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]}`);
    }
  };
});
Empfangen: 1024 Bytes, erstes Byte: 137

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 zu WebSocket). 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 in try/catch kapseln oder mit ArrayBuffer arbeiten und bei Bedarf selbst new Blob([buffer]) erzeugen.
  • Ungültige Werte: Anders als bei WebSocket.binaryType werden ungültige Werte nicht still ignoriert. Laut Spezifikation wird ein SyntaxError ausgelöst.
  • Nur Empfangsseite: binaryType beeinflusst nur eingehende Daten. send() akzeptiert unabhängig davon string, Blob, ArrayBuffer und ArrayBufferView.
  • Performance: "arraybuffer" liefert die Daten synchron verarbeitbar. Ein Blob muss erst asynchron gelesen werden (await blob.arrayBuffer()). Für häufige kleine Nachrichten ist "arraybuffer" daher meist die bessere Wahl.