Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions lib/internal/webstreams/writablestream.js
Original file line number Diff line number Diff line change
Expand Up @@ -1241,9 +1241,11 @@ function writableStreamDefaultControllerGetChunkSize(controller, chunk) {
sizeAlgorithm,
} = controller[kState];
if (sizeAlgorithm === undefined) {
assert(stream[kState].state === 'closed' ||
stream[kState].state === 'errored' ||
stream[kState].state === 'erroring');
// The algorithms are also cleared while the close request is in
// flight, before the stream leaves the 'writable' state; the caller
// then rejects the write as closing.
assert(stream[kState].state !== 'writable' ||
stream[kState].closeQueuedOrInFlight);
return 1;
}

Expand Down
37 changes: 37 additions & 0 deletions test/parallel/test-whatwg-writablestream-close.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,40 @@ test('should throw error when writing after close', async (t) => {
}
);
});

test('should reject writes while the close is in flight', async () => {
const { promise, resolve } = Promise.withResolvers();
const writable = new WritableStream({
close() {
return promise;
},
});

const writer = writable.getWriter();
const closed = writer.close();
// Let the close request reach the sink.
await new Promise(setImmediate);

await assert.rejects(writer.write('World'), { name: 'TypeError' });

resolve();
await closed;
});

test('should reject writes to a TransformStream while flush() is pending', async () => {
const { promise, resolve } = Promise.withResolvers();
const transform = new TransformStream({
flush() {
return promise;
},
});

const writer = transform.writable.getWriter();
const closed = writer.close();
await new Promise(setImmediate);

await assert.rejects(writer.write('World'), { name: 'TypeError' });

resolve();
await closed;
});
Loading