Start · Sprachen · JavaScript · Referenz · TransformStreamDefaultController.desiredSize

TransformStreamDefaultController.desiredSize

Eigenschaft

Liefert den noch freien Platz in der internen Warteschlange der lesbaren Seite eines <code>TransformStream</code>. Das ist die Differenz aus <code>highWaterMark</code> und der aktuellen Füllmenge.

seit JavaScript Baseline: alle modernen Browser (seit 2022), Node. Kategorie: webapi

Signatur

get TransformStreamDefaultController.desiredSize

Beschreibung

Die schreibgeschützte Eigenschaft desiredSize zeigt, wie viel Platz die Warteschlange des zugehörigen ReadableStream (also transformStream.readable) noch hat, bevor ihre Obergrenze erreicht ist. Der Wert wird so berechnet: highWaterMark der readableStrategy minus die Gesamtgröße aller Chunks, die schon eingereiht, aber noch nicht gelesen wurden. Wie groß ein einzelner Chunk zählt, bestimmt die Funktion size() der Strategie. Ohne eigene Strategie zählt jeder Chunk als 1.

Der Wert ist Teil des Rückstau-Mechanismus (Backpressure) der Streams-API. Ist desiredSize größer als 0, kann die Transformation weitere Daten liefern. Ist der Wert 0 oder negativ, ist die Warteschlange voll oder überfüllt. Der TransformStream hält dann neue Schreibvorgänge auf der beschreibbaren Seite an, bis ein Leser Daten abholt.

Nützlich ist die Eigenschaft vor allem, um Transformationen zu überwachen und Fehler zu suchen. Sie hilft auch bei Transformationen, die aus einem Eingabe-Chunk viele Ausgabe-Chunks machen, etwa beim Zerlegen oder Dekomprimieren. Dort erkennt man daran, ob der Verbraucher nicht mehr hinterherkommt. Wichtig: controller.enqueue() beachtet den Rückstau nicht selbst. Es reiht immer ein, auch wenn desiredSize negativ ist.

Mögliche Werte:

  • positive Zahl: Es ist noch Platz frei.
  • 0 oder negativ: Die Warteschlange ist voll bzw. überfüllt. Außerdem ist der Wert 0, wenn die lesbare Seite geschlossen ist.
  • null: Der Stream ist fehlerhaft, zum Beispiel nach controller.error().

Rückgabewert

Typ
number | null
Beschreibung
Der noch freie Platz in der Warteschlange der lesbaren Seite, gemessen in der Einheit der readableStrategy (Chunks oder Bytes). Der Wert kann negativ sein. Ist der Stream geschlossen, ist er 0; ist der Stream fehlerhaft, ist er null.

Beispiele

Freien Platz vor und nach enqueue() beobachten

// Die lesbare Seite darf bis zu 3 Chunks puffern
const ts = new TransformStream({
  transform(chunk, controller) {
    const vorher = controller.desiredSize;
    controller.enqueue(chunk.toUpperCase());
    console.log(`${chunk}: vorher ${vorher}, nachher ${controller.desiredSize}`);
  }
}, undefined, { highWaterMark: 3 });

const writer = ts.writable.getWriter();
// Kein Leser aktiv: die Chunks bleiben in der Warteschlange
await writer.write('a');
await writer.write('b');
await writer.write('c');
a: vorher 3, nachher 2 b: vorher 2, nachher 1 c: vorher 1, nachher 0

Byte-basierte Strategie: desiredSize wird negativ

const ts = new TransformStream({
  transform(chunk, controller) {
    controller.enqueue(chunk);
    const frei = controller.desiredSize;
    if (frei <= 0) {
      console.warn(`Rückstau! Überlauf: ${-frei} Bytes`);
    } else {
      console.log(`Noch ${frei} Bytes frei`);
    }
  }
}, undefined, new ByteLengthQueuingStrategy({ highWaterMark: 16 }));

const writer = ts.writable.getWriter();
await writer.write(new Uint8Array(10));
await writer.write(new Uint8Array(10));
Noch 6 Bytes frei Rückstau! Überlauf: 4 Bytes

null nach einem Fehler

const ts = new TransformStream({
  transform(chunk, controller) {
    if (typeof chunk !== 'string') {
      controller.error(new TypeError('Nur Strings erlaubt'));
      console.log('desiredSize nach error():', controller.desiredSize);
      return;
    }
    controller.enqueue(chunk);
  }
});

const writer = ts.writable.getWriter();
try {
  await writer.write(42);
} catch (err) {
  console.log('Schreiben fehlgeschlagen:', err.message);
}
desiredSize nach error(): null Schreiben fehlgeschlagen: Nur Strings erlaubt