Skip to content

Commit af41622

Browse files
jasnellrichardlau
authored andcommitted
stream: reject closed fromWritable() writes with a TypeError
The spec (Writer write(), step 2) requires writes to a closed writer to reject with a TypeError. The fromWritable() adapter rejected write() and writev() with ERR_STREAM_WRITE_AFTER_END, which is a plain Error, unlike the other stream/iter writers. Add a TypeError variant of ERR_STREAM_WRITE_AFTER_END and use it, so the error code is unchanged. Assisted-by: OpenCode Signed-off-by: James M Snell <jasnell@gmail.com> PR-URL: #66483 Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
1 parent 4b83c6c commit af41622

4 files changed

Lines changed: 6 additions & 6 deletions

File tree

‎lib/internal/errors.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1845,7 +1845,7 @@ E('ERR_STREAM_UNABLE_TO_PIPE', 'Cannot pipe to a closed or destroyed stream', Er
18451845
E('ERR_STREAM_UNSHIFT_AFTER_END_EVENT',
18461846
'stream.unshift() after end event', Error);
18471847
E('ERR_STREAM_WRAP', 'Stream has StringDecoder set or is in objectMode', Error);
1848-
E('ERR_STREAM_WRITE_AFTER_END', 'write after end', Error);
1848+
E('ERR_STREAM_WRITE_AFTER_END', 'write after end', Error, TypeError);
18491849
E('ERR_SYNTHETIC', 'JavaScript Callstack', Error);
18501850
E('ERR_SYSTEM_ERROR', 'A system error occurred', SystemError, HideStackFramesError);
18511851
E('ERR_TEST_FAILURE', function(error, failureType) {

‎lib/internal/streams/iter/classic.js‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -912,7 +912,7 @@ function fromWritable(writable, options = kNullPrototype) {
912912
syncWritableError();
913913
if (errored) return PromiseReject(error);
914914
if (!isWritable()) {
915-
return PromiseReject(new ERR_STREAM_WRITE_AFTER_END());
915+
return PromiseReject(new ERR_STREAM_WRITE_AFTER_END.TypeError());
916916
}
917917
if (signal?.aborted) return PromiseReject(signal.reason);
918918

@@ -944,7 +944,7 @@ function fromWritable(writable, options = kNullPrototype) {
944944
syncWritableError();
945945
if (errored) return PromiseReject(error);
946946
if (!isWritable()) {
947-
return PromiseReject(new ERR_STREAM_WRITE_AFTER_END());
947+
return PromiseReject(new ERR_STREAM_WRITE_AFTER_END.TypeError());
948948
}
949949
if (signal?.aborted) return PromiseReject(signal.reason);
950950
if (chunks.length === 0) return PromiseResolve();

‎test/parallel/test-stream-iter-from-writable-lifecycle.js‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ async function testAlreadyFinished() {
202202
const writer = fromWritable(writable);
203203
assert.strictEqual(writer.canWrite, null);
204204
await assert.rejects(writer.write('a'),
205-
{ code: 'ERR_STREAM_WRITE_AFTER_END' });
205+
{ code: 'ERR_STREAM_WRITE_AFTER_END', name: 'TypeError' });
206206
assert.strictEqual(await writer.end(), 0);
207207
assertNoTerminalListeners(writable);
208208
}
@@ -215,7 +215,7 @@ async function testAlreadyDestroyed() {
215215
const writer = fromWritable(writable);
216216
assert.strictEqual(writer.canWrite, null);
217217
await assert.rejects(writer.write('a'),
218-
{ code: 'ERR_STREAM_WRITE_AFTER_END' });
218+
{ code: 'ERR_STREAM_WRITE_AFTER_END', name: 'TypeError' });
219219
assertNoTerminalListeners(writable);
220220
}
221221

‎test/parallel/test-stream-iter-writable-interop.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -718,7 +718,7 @@ async function testWriteAfterEnd() {
718718

719719
await assert.rejects(
720720
writer.write('should fail'),
721-
{ code: 'ERR_STREAM_WRITE_AFTER_END' },
721+
{ code: 'ERR_STREAM_WRITE_AFTER_END', name: 'TypeError' },
722722
);
723723
}
724724

0 commit comments

Comments
 (0)