@@ -43,6 +43,10 @@ const {
43
43
willEmitClose : _willEmitClose ,
44
44
kIsClosedPromise,
45
45
} = require ( 'internal/streams/utils' ) ;
46
+
47
+ const { AsyncResource } = require ( 'async_hooks' ) ;
48
+
49
+ // Lazy load
46
50
let addAbortListener ;
47
51
48
52
function isRequest ( stream ) {
@@ -63,7 +67,13 @@ function eos(stream, options, callback) {
63
67
validateFunction ( callback , 'callback' ) ;
64
68
validateAbortSignal ( options . signal , 'options.signal' ) ;
65
69
66
- callback = once ( callback ) ;
70
+ const originalCallback = callback ;
71
+
72
+ const resource = new AsyncResource ( 'stream:finished' ) ;
73
+
74
+ callback = once ( function ( err ) {
75
+ resource . runInAsyncScope ( originalCallback , stream , err ) ;
76
+ } ) ;
67
77
68
78
if ( isReadableStream ( stream ) || isWritableStream ( stream ) ) {
69
79
return eosWeb ( stream , options , callback ) ;
@@ -109,7 +119,7 @@ function eos(stream, options, callback) {
109
119
}
110
120
111
121
if ( ! readable || readableFinished ) {
112
- callback . call ( stream ) ;
122
+ callback ( ) ;
113
123
}
114
124
} ;
115
125
@@ -128,12 +138,12 @@ function eos(stream, options, callback) {
128
138
}
129
139
130
140
if ( ! writable || writableFinished ) {
131
- callback . call ( stream ) ;
141
+ callback ( ) ;
132
142
}
133
143
} ;
134
144
135
145
const onerror = ( err ) => {
136
- callback . call ( stream , err ) ;
146
+ callback ( err ) ;
137
147
} ;
138
148
139
149
let closed = isClosed ( stream ) ;
@@ -144,21 +154,19 @@ function eos(stream, options, callback) {
144
154
const errored = isWritableErrored ( stream ) || isReadableErrored ( stream ) ;
145
155
146
156
if ( errored && typeof errored !== 'boolean' ) {
147
- return callback . call ( stream , errored ) ;
157
+ return callback ( errored ) ;
148
158
}
149
159
150
160
if ( readable && ! readableFinished && isReadableNodeStream ( stream , true ) ) {
151
161
if ( ! isReadableFinished ( stream , false ) )
152
- return callback . call ( stream ,
153
- new ERR_STREAM_PREMATURE_CLOSE ( ) ) ;
162
+ return callback ( new ERR_STREAM_PREMATURE_CLOSE ( ) ) ;
154
163
}
155
164
if ( writable && ! writableFinished ) {
156
165
if ( ! isWritableFinished ( stream , false ) )
157
- return callback . call ( stream ,
158
- new ERR_STREAM_PREMATURE_CLOSE ( ) ) ;
166
+ return callback ( new ERR_STREAM_PREMATURE_CLOSE ( ) ) ;
159
167
}
160
168
161
- callback . call ( stream ) ;
169
+ callback ( ) ;
162
170
} ;
163
171
164
172
const onclosed = ( ) => {
@@ -167,10 +175,10 @@ function eos(stream, options, callback) {
167
175
const errored = isWritableErrored ( stream ) || isReadableErrored ( stream ) ;
168
176
169
177
if ( errored && typeof errored !== 'boolean' ) {
170
- return callback . call ( stream , errored ) ;
178
+ return callback ( errored ) ;
171
179
}
172
180
173
- callback . call ( stream ) ;
181
+ callback ( ) ;
174
182
} ;
175
183
176
184
const onrequest = ( ) => {
@@ -309,15 +317,20 @@ function finished(stream, opts) {
309
317
validateBoolean ( opts . cleanup , 'cleanup' ) ;
310
318
autoCleanup = opts . cleanup ;
311
319
}
320
+
321
+ const resource = new AsyncResource ( 'stream:finished:promise' ) ;
322
+
312
323
return new Promise ( ( resolve , reject ) => {
313
324
const cleanup = eos ( stream , opts , ( err ) => {
314
325
if ( autoCleanup ) {
315
326
cleanup ( ) ;
316
327
}
328
+
329
+ // Use the AsyncResource to call resolve/reject
317
330
if ( err ) {
318
- reject ( err ) ;
331
+ resource . runInAsyncScope ( reject , undefined , err ) ;
319
332
} else {
320
- resolve ( ) ;
333
+ resource . runInAsyncScope ( resolve ) ;
321
334
}
322
335
} ) ;
323
336
} ) ;
0 commit comments