@@ -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,33 @@ 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
+ function lazyReadableReleasedError ( ) {
148
+ if ( releasedError ) {
149
+ return releasedError ;
150
+ }
151
+ releasedError = new ERR_INVALID_STATE . TypeError ( 'Reader released' ) ;
152
+ // Avoid V8 leak and remove userland stackstrace
153
+ releasedError . stack = SideEffectFreeRegExpPrototypeSymbolReplace (
154
+ / ^ .* \( (? ! n o d e : | i n t e r n a l ) [ ^ ( ) ] * \) .* $ / gm,
155
+ releasedError . stack , '' ) ;
156
+ return releasedError ;
157
+ }
158
+
159
+ function lazyReadableReleasingError ( ) {
160
+ if ( releasingError ) {
161
+ return releasingError ;
162
+ }
163
+ releasingError = new ERR_INVALID_STATE . TypeError ( 'Releasing reader' ) ;
164
+ // Avoid V8 leak and remove userland stackstrace
165
+ releasingError . stack = SideEffectFreeRegExpPrototypeSymbolReplace (
166
+ / ^ .* \( (? ! n o d e : | i n t e r n a l ) [ ^ ( ) ] * \) .* $ / gm,
167
+ releasingError . stack , '' ) ;
168
+ return releasingError ;
169
+ }
170
+
143
171
const getNonWritablePropertyDescriptor = ( value ) => {
144
172
return {
145
173
__proto__ : null ,
@@ -2029,7 +2057,7 @@ function readableStreamDefaultReaderRelease(reader) {
2029
2057
readableStreamReaderGenericRelease ( reader ) ;
2030
2058
readableStreamDefaultReaderErrorReadRequests (
2031
2059
reader ,
2032
- new ERR_INVALID_STATE . TypeError ( 'Releasing reader' )
2060
+ lazyReadableReleasingError ( ) ,
2033
2061
) ;
2034
2062
}
2035
2063
@@ -2044,7 +2072,7 @@ function readableStreamBYOBReaderRelease(reader) {
2044
2072
readableStreamReaderGenericRelease ( reader ) ;
2045
2073
readableStreamBYOBReaderErrorReadIntoRequests (
2046
2074
reader ,
2047
- new ERR_INVALID_STATE . TypeError ( 'Releasing reader' )
2075
+ lazyReadableReleasingError ( ) ,
2048
2076
) ;
2049
2077
}
2050
2078
@@ -2062,13 +2090,12 @@ function readableStreamReaderGenericRelease(reader) {
2062
2090
assert ( stream !== undefined ) ;
2063
2091
assert ( stream [ kState ] . reader === reader ) ;
2064
2092
2093
+ const releasedStateError = lazyReadableReleasedError ( ) ;
2065
2094
if ( stream [ kState ] . state === 'readable' ) {
2066
- reader [ kState ] . close . reject ?. (
2067
- new ERR_INVALID_STATE . TypeError ( 'Reader released' ) ) ;
2095
+ reader [ kState ] . close . reject ?. ( releasedStateError ) ;
2068
2096
} else {
2069
2097
reader [ kState ] . close = {
2070
- promise : PromiseReject (
2071
- new ERR_INVALID_STATE . TypeError ( 'Reader released' ) ) ,
2098
+ promise : PromiseReject ( releasedStateError ) ,
2072
2099
resolve : undefined ,
2073
2100
reject : undefined ,
2074
2101
} ;
0 commit comments