@@ -54,6 +54,7 @@ const {
5454 isArrayBufferDetached,
5555 kEmptyObject,
5656 kEnumerableProperty,
57+ SideEffectFreeRegExpPrototypeSymbolReplace,
5758} = require('internal/util');
5859
5960const {
@@ -140,6 +141,32 @@ const kError = Symbol('kError');
140141const kPull = Symbol('kPull');
141142const kRelease = Symbol('kRelease');
142143
144+ let releasedError;
145+ let releasingError;
146+
147+ const userModuleRegExp = /^ {4}at (?:[^/\\(]+ \()(?!node:(.+):\d+:\d+\)$).*/gm;
148+
149+ function lazyReadableReleasedError() {
150+ if (releasedError) {
151+ return releasedError;
152+ }
153+
154+ releasedError = new ERR_INVALID_STATE.TypeError('Reader released');
155+ // Avoid V8 leak and remove userland stackstrace
156+ releasedError.stack = SideEffectFreeRegExpPrototypeSymbolReplace(userModuleRegExp, releasedError.stack, '');
157+ return releasedError;
158+ }
159+
160+ function lazyReadableReleasingError() {
161+ if (releasingError) {
162+ return releasingError;
163+ }
164+ releasingError = new ERR_INVALID_STATE.TypeError('Releasing reader');
165+ // Avoid V8 leak and remove userland stackstrace
166+ releasingError.stack = SideEffectFreeRegExpPrototypeSymbolReplace(userModuleRegExp, releasingError.stack, '');
167+ return releasingError;
168+ }
169+
143170const getNonWritablePropertyDescriptor = (value) => {
144171 return {
145172 __proto__: null,
@@ -2029,7 +2056,7 @@ function readableStreamDefaultReaderRelease(reader) {
20292056 readableStreamReaderGenericRelease(reader);
20302057 readableStreamDefaultReaderErrorReadRequests(
20312058 reader,
2032- new ERR_INVALID_STATE.TypeError('Releasing reader')
2059+ lazyReadableReleasingError(),
20332060 );
20342061}
20352062
@@ -2044,7 +2071,7 @@ function readableStreamBYOBReaderRelease(reader) {
20442071 readableStreamReaderGenericRelease(reader);
20452072 readableStreamBYOBReaderErrorReadIntoRequests(
20462073 reader,
2047- new ERR_INVALID_STATE.TypeError('Releasing reader')
2074+ lazyReadableReleasingError(),
20482075 );
20492076}
20502077
@@ -2062,13 +2089,12 @@ function readableStreamReaderGenericRelease(reader) {
20622089 assert(stream !== undefined);
20632090 assert(stream[kState].reader === reader);
20642091
2092+ const releasedStateError = lazyReadableReleasedError();
20652093 if (stream[kState].state === 'readable') {
2066- reader[kState].close.reject?.(
2067- new ERR_INVALID_STATE.TypeError('Reader released'));
2094+ reader[kState].close.reject?.(releasedStateError);
20682095 } else {
20692096 reader[kState].close = {
2070- promise: PromiseReject(
2071- new ERR_INVALID_STATE.TypeError('Reader released')),
2097+ promise: PromiseReject(releasedStateError),
20722098 resolve: undefined,
20732099 reject: undefined,
20742100 };
0 commit comments