Skip to content

Commit 97dff7d

Browse files
committed
lib: reuse invalid state errors on webstreams
1 parent a03529d commit 97dff7d

File tree

2 files changed

+30
-10
lines changed

2 files changed

+30
-10
lines changed

lib/internal/webstreams/readablestream.js

+19-6
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ const {
3737
ERR_INVALID_STATE,
3838
ERR_INVALID_THIS,
3939
},
40+
hideStackFrames,
4041
} = require('internal/errors');
4142

4243
const {
@@ -140,6 +141,19 @@ const kError = Symbol('kError');
140141
const kPull = Symbol('kPull');
141142
const kRelease = Symbol('kRelease');
142143

144+
let releasedError;
145+
let releasingError;
146+
147+
const lazyReadableReleasedError = hideStackFrames(() => {
148+
releasedError ??= new ERR_INVALID_STATE.TypeError('Reader released');
149+
return releasedError;
150+
});
151+
152+
const lazyReadableReleasingError = hideStackFrames(() => {
153+
releasingError ??= new ERR_INVALID_STATE.TypeError('Releasing reader');
154+
return releasingError;
155+
});
156+
143157
const getNonWritablePropertyDescriptor = (value) => {
144158
return {
145159
__proto__: null,
@@ -2029,7 +2043,7 @@ function readableStreamDefaultReaderRelease(reader) {
20292043
readableStreamReaderGenericRelease(reader);
20302044
readableStreamDefaultReaderErrorReadRequests(
20312045
reader,
2032-
new ERR_INVALID_STATE.TypeError('Releasing reader')
2046+
lazyReadableReleasingError(),
20332047
);
20342048
}
20352049

@@ -2044,7 +2058,7 @@ function readableStreamBYOBReaderRelease(reader) {
20442058
readableStreamReaderGenericRelease(reader);
20452059
readableStreamBYOBReaderErrorReadIntoRequests(
20462060
reader,
2047-
new ERR_INVALID_STATE.TypeError('Releasing reader')
2061+
lazyReadableReleasingError(),
20482062
);
20492063
}
20502064

@@ -2062,13 +2076,12 @@ function readableStreamReaderGenericRelease(reader) {
20622076
assert(stream !== undefined);
20632077
assert(stream[kState].reader === reader);
20642078

2079+
const releasedStateError = lazyReadableReleasedError();
20652080
if (stream[kState].state === 'readable') {
2066-
reader[kState].close.reject?.(
2067-
new ERR_INVALID_STATE.TypeError('Reader released'));
2081+
reader[kState].close.reject?.(releasedStateError);
20682082
} else {
20692083
reader[kState].close = {
2070-
promise: PromiseReject(
2071-
new ERR_INVALID_STATE.TypeError('Reader released')),
2084+
promise: PromiseReject(releasedStateError),
20722085
resolve: undefined,
20732086
reject: undefined,
20742087
};

lib/internal/webstreams/writablestream.js

+11-4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ const {
2424
ERR_INVALID_STATE,
2525
ERR_INVALID_THIS,
2626
},
27+
hideStackFrames,
2728
} = require('internal/errors');
2829

2930
const {
@@ -77,6 +78,13 @@ const kAbort = Symbol('kAbort');
7778
const kCloseSentinel = Symbol('kCloseSentinel');
7879
const kError = Symbol('kError');
7980

81+
let releasedError;
82+
83+
const lazyWritableReleasedError = hideStackFrames(() => {
84+
releasedError ??= new ERR_INVALID_STATE.TypeError('Writer has been released');
85+
return releasedError;
86+
});
87+
8088
const getNonWritablePropertyDescriptor = (value) => {
8189
return {
8290
__proto__: null,
@@ -970,10 +978,9 @@ function writableStreamDefaultWriterRelease(writer) {
970978
} = writer[kState];
971979
assert(stream !== undefined);
972980
assert(stream[kState].writer === writer);
973-
const releasedError =
974-
new ERR_INVALID_STATE.TypeError('Writer has been released');
975-
writableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError);
976-
writableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError);
981+
const releasedStateError = lazyWritableReleasedError();
982+
writableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedStateError);
983+
writableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedStateError);
977984
stream[kState].writer = undefined;
978985
writer[kState].stream = undefined;
979986
}

0 commit comments

Comments
 (0)