@@ -54,6 +54,7 @@ const {
54
54
isArrayBufferDetached,
55
55
kEmptyObject,
56
56
kEnumerableProperty,
57
+ SideEffectFreeRegExpPrototypeSymbolReplace,
57
58
} = require ( 'internal/util' ) ;
58
59
59
60
const {
@@ -140,6 +141,32 @@ const kError = Symbol('kError');
140
141
const kPull = Symbol ( 'kPull' ) ;
141
142
const kRelease = Symbol ( 'kRelease' ) ;
142
143
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
+
143
170
const getNonWritablePropertyDescriptor = ( value ) => {
144
171
return {
145
172
__proto__ : null ,
@@ -2029,7 +2056,7 @@ function readableStreamDefaultReaderRelease(reader) {
2029
2056
readableStreamReaderGenericRelease ( reader ) ;
2030
2057
readableStreamDefaultReaderErrorReadRequests (
2031
2058
reader ,
2032
- new ERR_INVALID_STATE . TypeError ( 'Releasing reader' )
2059
+ lazyReadableReleasingError ( ) ,
2033
2060
) ;
2034
2061
}
2035
2062
@@ -2044,7 +2071,7 @@ function readableStreamBYOBReaderRelease(reader) {
2044
2071
readableStreamReaderGenericRelease ( reader ) ;
2045
2072
readableStreamBYOBReaderErrorReadIntoRequests (
2046
2073
reader ,
2047
- new ERR_INVALID_STATE . TypeError ( 'Releasing reader' )
2074
+ lazyReadableReleasingError ( ) ,
2048
2075
) ;
2049
2076
}
2050
2077
@@ -2062,13 +2089,12 @@ function readableStreamReaderGenericRelease(reader) {
2062
2089
assert ( stream !== undefined ) ;
2063
2090
assert ( stream [ kState ] . reader === reader ) ;
2064
2091
2092
+ const releasedStateError = lazyReadableReleasedError ( ) ;
2065
2093
if ( stream [ kState ] . state === 'readable' ) {
2066
- reader [ kState ] . close . reject ?. (
2067
- new ERR_INVALID_STATE . TypeError ( 'Reader released' ) ) ;
2094
+ reader [ kState ] . close . reject ?. ( releasedStateError ) ;
2068
2095
} else {
2069
2096
reader [ kState ] . close = {
2070
- promise : PromiseReject (
2071
- new ERR_INVALID_STATE . TypeError ( 'Reader released' ) ) ,
2097
+ promise : PromiseReject ( releasedStateError ) ,
2072
2098
resolve : undefined ,
2073
2099
reject : undefined ,
2074
2100
} ;
0 commit comments