Start · Sprachen · JavaScript · Referenz · TextDecoderStream.fatal

TextDecoderStream.fatal

Eigenschaft

Schreibgeschützter Boolean, der angibt, ob ein <code>TextDecoderStream</code> bei ungültigen Byte-Folgen einen Fehler auslöst (<code>true</code>) oder Ersatzzeichen einfügt.

seit JavaScript Baseline 2022: Chrome 71, Edge 79, Firefox 105, Sa Kategorie: webapi

Signatur

TextDecoderStream.fatal

Beschreibung

Die Eigenschaft fatal zeigt, in welchem Fehlermodus ein TextDecoderStream arbeitet. Festgelegt wird der Wert einmalig beim Erzeugen über die Option fatal im Konstruktor new TextDecoderStream(label, { fatal }). Wird die Option weggelassen, ist der Wert false.

Bei false (Ersetzungsmodus) setzt der Decoder für jede ungültige Byte-Folge das Ersatzzeichen U+FFFD (�) ein und dekodiert weiter. Bei true (fataler Modus) bricht der Decoder bei der ersten ungültigen Folge mit einem TypeError ab. Dadurch geht der Stream in den Fehlerzustand über: sowohl die lesbare als auch die beschreibbare Seite gelten dann als fehlerhaft, und ein laufendes pipeThrough() bzw. reader.read() wird mit diesem Fehler abgelehnt.

Die Eigenschaft ist nützlich, wenn eine Bibliothek einen fremden Decoder-Stream bekommt und prüfen will, ob damit strikt validiert wird. Das ist zum Beispiel bei Protokollen, Prüfsummen oder beim Import von Nutzerdaten wichtig, bei denen stillschweigend ersetzte Zeichen zu Datenverfälschung führen würden.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn der Decoder im fatalen Fehlermodus arbeitet (ungültige Bytes lösen einen TypeError aus), sonst false (ungültige Bytes werden durch U+FFFD ersetzt).

Beispiele

Fehlermodus abfragen

const lenient = new TextDecoderStream();
const strict = new TextDecoderStream('utf-8', { fatal: true });

console.log(lenient.fatal);
console.log(strict.fatal);
false true

Strikte UTF-8-Validierung beim Laden einer Datei

const loadStrictText = async (url) => {
  const response = await fetch(url);
  const decoder = new TextDecoderStream('utf-8', { fatal: true });
  const reader = response.body.pipeThrough(decoder).getReader();

  let text = '';
  try {
    while (true) {
      const { value, done } = await reader.read();
      if (done) break;
      text += value;
    }
    return text;
  } catch (err) {
    // Bei fatal === true landet ungültiges UTF-8 hier
    console.error(`Ungültige Kodierung (fatal=${decoder.fatal}):`, err.name);
    throw err;
  }
};

loadStrictText('/daten/import.csv').catch(() => {});
Ungültige Kodierung (fatal=true): TypeError // nur falls die Datei ungültige Bytes enthält

Ersetzungsmodus und fataler Modus im Vergleich

const invalidBytes = new Uint8Array([0x48, 0x69, 0xff, 0x21]); // "Hi", ungültiges Byte, "!"

const decodeWith = async (fatal) => {
  const decoder = new TextDecoderStream('utf-8', { fatal });
  const source = new ReadableStream({
    start(controller) {
      controller.enqueue(invalidBytes);
      controller.close();
    }
  });
  try {
    let result = '';
    for await (const chunk of source.pipeThrough(decoder)) result += chunk;
    return `fatal=${decoder.fatal}: ${result}`;
  } catch (err) {
    return `fatal=${decoder.fatal}: ${err.name}`;
  }
};

console.log(await decodeWith(false));
console.log(await decodeWith(true));
fatal=false: Hi�! fatal=true: TypeError

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung wie decoder.fatal = true hat keine Wirkung (im Strict Mode gibt es einen TypeError). Der Modus lässt sich nur über den Konstruktor festlegen.
  • Stream ist danach unbrauchbar: Im fatalen Modus bleibt der gesamte Stream nach dem ersten Dekodierfehler im Fehlerzustand. Er lässt sich nicht fortsetzen. Für einen neuen Versuch braucht es eine neue Instanz.
  • Späte Fehler: Eine unvollständige Mehrbyte-Folge am Ende des Streams wird erst beim Schließen (Flush) erkannt. Der Fehler kommt dann ganz am Schluss, nicht schon beim betroffenen Chunk.
  • Sicherheit: Der Ersetzungsmodus (false) kann manipulierte oder beschädigte Daten verschleiern. Bei Validierung, Signaturprüfung oder Parsern sollte fatal: true gesetzt werden.
  • Kompatibilität: TextDecoderStream ist erst seit Firefox 105 (2022) in allen großen Browsern verfügbar. Vor dem Einsatz bei Bedarf mit 'TextDecoderStream' in globalThis prüfen.