Signatur
Beschreibung
Der Konstruktor new WritableStreamDefaultWriter(stream) erzeugt einen Writer für einen WritableStream. Dabei wird der Stream gesperrt (stream.locked === true): Solange der Writer aktiv ist, kann kein anderer Writer auf denselben Stream schreiben. So bleiben Reihenfolge und Konsistenz der geschriebenen Chunks gewährleistet.
In der Praxis ruft man den Konstruktor selten direkt auf. Üblich ist stream.getWriter(), das intern genau diesen Konstruktor verwendet und dasselbe Ergebnis liefert. Der direkte Aufruf ist gleichwertig und kann für mehr Lesbarkeit sorgen oder beim Schreiben eigener Hilfsbibliotheken nützlich sein.
Über den Writer schreibt man mit write(), beendet den Stream sauber mit close(), bricht mit abort() ab und gibt die Sperre mit releaseLock() wieder frei. Für Gegendruck (Backpressure) sorgen die Eigenschaften ready (Promise) und desiredSize.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $stream Pflicht | WritableStream | Der WritableStream, in den geschrieben werden soll. Er darf noch nicht gesperrt sein. |
Rückgabewert
Beispiele
Writer direkt per Konstruktor erzeugen
const stream = new WritableStream({
write(chunk) {
console.log('Empfangen:', chunk);
},
close() {
console.log('Stream geschlossen');
}
});
const writer = new WritableStreamDefaultWriter(stream);
console.log('Gesperrt:', stream.locked);
await writer.write('Hallo');
await writer.write('Welt');
await writer.close();
Backpressure beachten mit writer.ready
const stream = new WritableStream(
{
async write(chunk) {
// langsame Senke simulieren
await new Promise((r) => setTimeout(r, 100));
console.log('Geschrieben:', chunk);
}
},
new CountQueuingStrategy({ highWaterMark: 2 })
);
const writer = new WritableStreamDefaultWriter(stream);
for (const zeile of ['a', 'b', 'c', 'd']) {
await writer.ready; // warten, bis die Warteschlange wieder Platz hat
writer.write(zeile);
}
await writer.close();
Text als Bytes schreiben und Sperre freigeben
const chunks = [];
const stream = new WritableStream({
write(chunk) { chunks.push(chunk); }
});
const writer = new WritableStreamDefaultWriter(stream);
const encoder = new TextEncoder();
await writer.write(encoder.encode('Log-Eintrag 1'));
writer.releaseLock();
console.log('Gesperrt nach releaseLock:', stream.locked);
// Ein neuer Writer kann nun übernehmen
const writer2 = stream.getWriter();
await writer2.write(encoder.encode('Log-Eintrag 2'));
await writer2.close();
console.log('Anzahl Chunks:', chunks.length);
Fehler bei bereits gesperrtem Stream
const stream = new WritableStream();
const ersterWriter = stream.getWriter();
try {
new WritableStreamDefaultWriter(stream);
} catch (err) {
console.log(err.name);
}
// Wichtig · Fallstricke
- TypeError: Wird geworfen, wenn
streamkeinWritableStreamist oder bereits gesperrt ist (stream.locked === true). - Ohne Aufruf von
releaseLock()bleibt der Stream dauerhaft gesperrt – auchpipeTo()auf diesen Stream schlägt dann fehl. - Ein nicht abgewartetes
write()kann abgelehnt werden (z. B. bei Fehlern in der Senke); unbehandelte Rejections vermeiden, indem manawaitnutzt oderwriter.closedüberwacht. releaseLock()während ausstehender Schreibvorgänge lässt diese Promises mit einemTypeErrorablehnen.- Kompatibilität: In Chrome, Edge, Firefox (ab 100) und Safari verfügbar; in Node.js global ab Version 18, davor über
require('node:stream/web'). Beispiele mit Top-Level-awaitbenötigen ein ES-Modul oder eineasync-Funktion.