Skip to content

Commit

Permalink
lib: reuse invalid state errors on webstreams
Browse files Browse the repository at this point in the history
Signed-off-by: RafaelGSS <rafael.nunu@hotmail.com>
  • Loading branch information
RafaelGSS committed Jan 7, 2023
1 parent a03529d commit 9f94cb9
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 10 deletions.
31 changes: 25 additions & 6 deletions lib/internal/webstreams/readablestream.js
Expand Up @@ -37,6 +37,7 @@ const {
ERR_INVALID_STATE,
ERR_INVALID_THIS,
},
hideStackFrames,
} = require('internal/errors');

const {
Expand Down Expand Up @@ -140,6 +141,25 @@ const kError = Symbol('kError');
const kPull = Symbol('kPull');
const kRelease = Symbol('kRelease');

let releasedError;
let releasingError;

const lazyReadableReleasedError = hideStackFrames(() => {
releasedError ??= new ERR_INVALID_STATE.TypeError('Reader released');
// Avoid V8 leak
// eslint-disable-next-line no-unused-expressions
releasedError.stack;
return releasedError;
});

const lazyReadableReleasingError = hideStackFrames(() => {
releasingError ??= new ERR_INVALID_STATE.TypeError('Releasing reader');
// Avoid V8 leak
// eslint-disable-next-line no-unused-expressions
releasingError.stack;
return releasingError;
});

const getNonWritablePropertyDescriptor = (value) => {
return {
__proto__: null,
Expand Down Expand Up @@ -2029,7 +2049,7 @@ function readableStreamDefaultReaderRelease(reader) {
readableStreamReaderGenericRelease(reader);
readableStreamDefaultReaderErrorReadRequests(
reader,
new ERR_INVALID_STATE.TypeError('Releasing reader')
lazyReadableReleasingError(),
);
}

Expand All @@ -2044,7 +2064,7 @@ function readableStreamBYOBReaderRelease(reader) {
readableStreamReaderGenericRelease(reader);
readableStreamBYOBReaderErrorReadIntoRequests(
reader,
new ERR_INVALID_STATE.TypeError('Releasing reader')
lazyReadableReleasingError(),
);
}

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

const releasedStateError = lazyReadableReleasedError();
if (stream[kState].state === 'readable') {
reader[kState].close.reject?.(
new ERR_INVALID_STATE.TypeError('Reader released'));
reader[kState].close.reject?.(releasedStateError);
} else {
reader[kState].close = {
promise: PromiseReject(
new ERR_INVALID_STATE.TypeError('Reader released')),
promise: PromiseReject(releasedStateError),
resolve: undefined,
reject: undefined,
};
Expand Down
18 changes: 14 additions & 4 deletions lib/internal/webstreams/writablestream.js
Expand Up @@ -24,6 +24,7 @@ const {
ERR_INVALID_STATE,
ERR_INVALID_THIS,
},
hideStackFrames,
} = require('internal/errors');

const {
Expand Down Expand Up @@ -77,6 +78,16 @@ const kAbort = Symbol('kAbort');
const kCloseSentinel = Symbol('kCloseSentinel');
const kError = Symbol('kError');

let releasedError;

const lazyWritableReleasedError = hideStackFrames(() => {
releasedError ??= new ERR_INVALID_STATE.TypeError('Writer has been released');
// Avoid V8 leak
// eslint-disable-next-line no-unused-expressions
releasedError.stack;
return releasedError;
});

const getNonWritablePropertyDescriptor = (value) => {
return {
__proto__: null,
Expand Down Expand Up @@ -970,10 +981,9 @@ function writableStreamDefaultWriterRelease(writer) {
} = writer[kState];
assert(stream !== undefined);
assert(stream[kState].writer === writer);
const releasedError =
new ERR_INVALID_STATE.TypeError('Writer has been released');
writableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError);
writableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError);
const releasedStateError = lazyWritableReleasedError();
writableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedStateError);
writableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedStateError);
stream[kState].writer = undefined;
writer[kState].stream = undefined;
}
Expand Down

0 comments on commit 9f94cb9

Please sign in to comment.