@@ -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 } a t (?: [ ^ / \\ ( ] + \( ) (? ! n o d e : ( .+ ) : \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