Skip to content

Commit 9f94cb9

Browse files
committed
lib: reuse invalid state errors on webstreams
Signed-off-by: RafaelGSS <rafael.nunu@hotmail.com>
1 parent a03529d commit 9f94cb9

File tree

2 files changed

+39
-10
lines changed

2 files changed

+39
-10
lines changed

lib/internal/webstreams/readablestream.js

+25-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,25 @@ 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+
// Avoid V8 leak
150+
// eslint-disable-next-line no-unused-expressions
151+
releasedError.stack;
152+
return releasedError;
153+
});
154+
155+
const lazyReadableReleasingError = hideStackFrames(() => {
156+
releasingError ??= new ERR_INVALID_STATE.TypeError('Releasing reader');
157+
// Avoid V8 leak
158+
// eslint-disable-next-line no-unused-expressions
159+
releasingError.stack;
160+
return releasingError;
161+
});
162+
143163
const getNonWritablePropertyDescriptor = (value) => {
144164
return {
145165
__proto__: null,
@@ -2029,7 +2049,7 @@ function readableStreamDefaultReaderRelease(reader) {
20292049
readableStreamReaderGenericRelease(reader);
20302050
readableStreamDefaultReaderErrorReadRequests(
20312051
reader,
2032-
new ERR_INVALID_STATE.TypeError('Releasing reader')
2052+
lazyReadableReleasingError(),
20332053
);
20342054
}
20352055

@@ -2044,7 +2064,7 @@ function readableStreamBYOBReaderRelease(reader) {
20442064
readableStreamReaderGenericRelease(reader);
20452065
readableStreamBYOBReaderErrorReadIntoRequests(
20462066
reader,
2047-
new ERR_INVALID_STATE.TypeError('Releasing reader')
2067+
lazyReadableReleasingError(),
20482068
);
20492069
}
20502070

@@ -2062,13 +2082,12 @@ function readableStreamReaderGenericRelease(reader) {
20622082
assert(stream !== undefined);
20632083
assert(stream[kState].reader === reader);
20642084

2085+
const releasedStateError = lazyReadableReleasedError();
20652086
if (stream[kState].state === 'readable') {
2066-
reader[kState].close.reject?.(
2067-
new ERR_INVALID_STATE.TypeError('Reader released'));
2087+
reader[kState].close.reject?.(releasedStateError);
20682088
} else {
20692089
reader[kState].close = {
2070-
promise: PromiseReject(
2071-
new ERR_INVALID_STATE.TypeError('Reader released')),
2090+
promise: PromiseReject(releasedStateError),
20722091
resolve: undefined,
20732092
reject: undefined,
20742093
};

lib/internal/webstreams/writablestream.js

+14-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,16 @@ 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+
// Avoid V8 leak
86+
// eslint-disable-next-line no-unused-expressions
87+
releasedError.stack;
88+
return releasedError;
89+
});
90+
8091
const getNonWritablePropertyDescriptor = (value) => {
8192
return {
8293
__proto__: null,
@@ -970,10 +981,9 @@ function writableStreamDefaultWriterRelease(writer) {
970981
} = writer[kState];
971982
assert(stream !== undefined);
972983
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);
984+
const releasedStateError = lazyWritableReleasedError();
985+
writableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedStateError);
986+
writableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedStateError);
977987
stream[kState].writer = undefined;
978988
writer[kState].stream = undefined;
979989
}

0 commit comments

Comments
 (0)