Start · Sprachen · JavaScript · Referenz · WritableStream.locked

WritableStream.locked

Eigenschaft

Schreibgeschützte Eigenschaft, die mit <code>true</code>/<code>false</code> angibt, ob der <code>WritableStream</code> gerade an einen Schreiber (Writer) gebunden ist.

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

Signatur

get WritableStream.prototype.locked

Beschreibung

Die Eigenschaft locked zeigt an, ob ein WritableStream gerade gesperrt ist. Gesperrt ist ein Stream, sobald über getWriter() ein WritableStreamDefaultWriter angefordert wurde. Solange die Sperre besteht, kann nur dieser eine Writer in den Stream schreiben. Ein zweiter Writer lässt sich nicht erzeugen.

Auch ReadableStream.prototype.pipeTo() und pipeThrough() sperren den Ziel-Stream für die gesamte Dauer des Pipings. Deshalb ist locked praktisch, um vor einem getWriter()- oder pipeTo()-Aufruf zu prüfen, ob der Stream frei ist. So vermeiden Sie einen TypeError.

Die Sperre wird mit writer.releaseLock() aufgehoben. Danach liefert locked wieder false. Auch ein Aufruf von abort() oder close() direkt auf dem Stream setzt voraus, dass der Stream nicht gesperrt ist.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn der Stream an einen Writer gebunden ist oder gerade als Piping-Ziel genutzt wird, sonst false.

Beispiele

Sperrstatus vor und nach getWriter()

const stream = new WritableStream({
  write(chunk) {
    console.log('Empfangen:', chunk);
  }
});

console.log(stream.locked); // noch frei

const writer = stream.getWriter();
console.log(stream.locked); // jetzt gesperrt

await writer.write('Hallo');
writer.releaseLock();
console.log(stream.locked); // wieder frei
false true Empfangen: Hallo false

Sicher einen Writer anfordern

const getWriterSafe = (stream) => {
  if (stream.locked) {
    console.warn('Stream ist bereits gesperrt – kein neuer Writer möglich.');
    return null;
  }
  return stream.getWriter();
};

const sink = new WritableStream({ write: (c) => console.log(c) });
const w1 = getWriterSafe(sink);
const w2 = getWriterSafe(sink); // gibt null zurück
console.log(w1 !== null, w2);
Stream ist bereits gesperrt – kein neuer Writer möglich. true null

Sperre während pipeTo()

const readable = new ReadableStream({
  start(controller) {
    controller.enqueue('a');
    controller.enqueue('b');
    controller.close();
  }
});
const writable = new WritableStream({ write: (c) => console.log('Chunk:', c) });

const piping = readable.pipeTo(writable);
console.log('Während Piping:', writable.locked);

await piping;
console.log('Nach Piping:', writable.locked);
Während Piping: true Chunk: a Chunk: b Nach Piping: false

// Wichtig · Fallstricke

  • locked ist nur lesbar. Eine Zuweisung wird ignoriert, im Strict Mode löst sie einen TypeError aus.
  • getWriter() auf einem gesperrten Stream wirft einen TypeError. Dasselbe gilt für stream.abort() und stream.close(): Beide liefern dann ein abgelehntes Promise. Nutzen Sie in diesem Fall writer.abort() bzw. writer.close().
  • Ist ein Stream geschlossen oder fehlerhaft, gibt ihn das nicht automatisch frei. Solange der Writer nicht mit releaseLock() freigegeben wurde, bleibt locked true.
  • locked sagt nichts über den Zustand des Streams aus (offen, geschlossen, fehlerhaft). Dafür gibt es writer.closed und writer.desiredSize.
  • Kompatibilität: in allen modernen Browsern verfügbar (Firefox seit Version 100). In Node.js ist die Eigenschaft ab Version 18 global verfügbar, davor über stream/web.