Signatur
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
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);
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]);
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`);
};
// Wichtig · Fallstricke
- Mit dem Standardwert
0wird 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 über0wählen. - Das Event wird nur beim Unterschreiten der Schwelle ausgelöst, nicht beim Setzen der Eigenschaft. Deshalb vor dem Warten immer
bufferedAmountprü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()einenOperationError, 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.