Start · Sprachen · JavaScript · Referenz · RTCDataChannel.bufferedAmountLowThreshold

RTCDataChannel.bufferedAmountLowThreshold

Eigenschaft

Legt fest, ab welcher Anzahl gepufferter ausgehender Bytes der Sendepuffer eines <code>RTCDataChannel</code> als „niedrig“ gilt und das Event <code>bufferedamountlow</code> ausgelöst wird.

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

Signatur

RTCDataChannel.bufferedAmountLowThreshold

Beschreibung

Die Eigenschaft bufferedAmountLowThreshold eines RTCDataChannel gibt einen Schwellenwert in Bytes an. Sinkt bufferedAmount, also die Menge der noch nicht übertragenen Daten im Sendepuffer, durch das Versenden von Daten auf diesen Wert oder darunter, löst der Browser das Event bufferedamountlow aus. Der Standardwert ist 0.

Gebraucht wird die Eigenschaft vor allem für die Flusskontrolle (Backpressure), wenn große Datenmengen übertragen werden, etwa bei Dateiübertragungen, Streaming oder beim Synchronisieren großer Datensätze per Peer-to-Peer. Ruft man send() ohne Pause in einer Schleife auf, wächst der Puffer immer weiter. Die Folge ist hoher Speicherverbrauch, und in manchen Browsern wird der Kanal sogar geschlossen, sobald der Puffer voll ist. Besser: senden, bis ein oberes Limit erreicht ist, dann pausieren und erst beim bufferedamountlow-Event weitermachen.

Der Wert ist eine vorzeichenlose Ganzzahl und lässt sich jederzeit lesen und setzen. Das Event wird nur ausgelöst, wenn der Pufferstand die Schwelle von oben nach unten überschreitet, also nachdem gesendete Daten den Puffer verlassen haben. Ist der Puffer beim Setzen der Schwelle schon niedrig, wird das Event deshalb nicht sofort ausgelöst.

Parameter

Name Typ Default Beschreibung
$value number 0 Schwellenwert in Bytes (vorzeichenlose Ganzzahl, unsigned long), der beim Setzen der Eigenschaft zugewiesen wird.

Rückgabewert

Typ
number
Beschreibung
Der aktuell eingestellte Schwellenwert in Bytes. Standardwert ist 0.

Beispiele

Schwellenwert setzen und auslesen

const pc = new RTCPeerConnection();
const channel = pc.createDataChannel('daten');

console.log(channel.bufferedAmountLowThreshold); // Standardwert

// Ab 64 KiB gilt der Puffer als niedrig
channel.bufferedAmountLowThreshold = 64 * 1024;
console.log(channel.bufferedAmountLowThreshold);
0 65536

Dateiübertragung mit Flusskontrolle (Backpressure)

const CHUNK_SIZE = 16 * 1024;        // 16 KiB pro Nachricht
const HIGH_WATER = 1024 * 1024;      // oberhalb von 1 MiB pausieren

const sendFile = async (channel, file) => {
  channel.binaryType = 'arraybuffer';
  channel.bufferedAmountLowThreshold = 256 * 1024; // bei 256 KiB weitermachen

  const buffer = await file.arrayBuffer();
  let offset = 0;

  const waitForLowBuffer = () =>
    new Promise((resolve) =>
      channel.addEventListener('bufferedamountlow', resolve, { once: true })
    );

  while (offset < buffer.byteLength) {
    if (channel.bufferedAmount > HIGH_WATER) {
      await waitForLowBuffer();
    }
    channel.send(buffer.slice(offset, offset + CHUNK_SIZE));
    offset += CHUNK_SIZE;
  }
  console.log(`Gesendet: ${buffer.byteLength} Bytes`);
};

// Nutzung: channel.onopen = () => sendFile(channel, fileInput.files[0]);
Gesendet: 5242880 Bytes

Pufferstand per on-Property beobachten

const pc = new RTCPeerConnection();
const channel = pc.createDataChannel('telemetrie');
channel.bufferedAmountLowThreshold = 32 * 1024;

channel.onbufferedamountlow = () => {
  console.log(`Puffer niedrig: ${channel.bufferedAmount} Bytes ausstehend`);
};
Puffer niedrig: 0 Bytes ausstehend

// Wichtig · Fallstricke

  • Mit dem Standardwert 0 wird das Event erst ausgelöst, wenn der Puffer komplett leer ist. Das führt zu Lücken im Durchsatz, weil zwischen Leerlaufen und erneutem Senden Zeit vergeht. Für einen gleichmäßigen Datenfluss eine Schwelle deutlich über 0 wählen.
  • Das Event wird nur beim Unterschreiten der Schwelle ausgelöst, nicht beim Setzen der Eigenschaft. Deshalb vor dem Warten immer bufferedAmount prüfen, sonst wartet der Code womöglich für immer.
  • Die Größe des Sendepuffers ist begrenzt (in Chromium früher etwa 16 MiB). Wird sie überschritten, wirft send() einen OperationError, oder der Kanal wird geschlossen. Deshalb immer mit einer oberen Grenze arbeiten.
  • Nachrichten über ca. 16–64 KiB sind nicht zwischen allen Browsern zuverlässig übertragbar. Größere Daten besser in Teilstücke (Chunks) aufteilen.
  • In allen modernen Browsern unterstützt. Ältere Safari-Versionen (vor 11) und der Internet Explorer kennen die Eigenschaft nicht.