@@ -98,7 +98,8 @@ function eos(stream, options, callback) {
9898 isWritable ( stream ) === writable
9999 ) ;
100100
101- let writableFinished = stream . writableFinished || wState ?. finished ;
101+ let writableFinished = stream . writableFinished ||
102+ ( wState && wState . finished ) ;
102103 const onfinish = ( ) => {
103104 writableFinished = true ;
104105 // Stream should not be destroyed here. If it is that
@@ -110,7 +111,8 @@ function eos(stream, options, callback) {
110111 if ( ! readable || readableEnded ) callback . call ( stream ) ;
111112 } ;
112113
113- let readableEnded = stream . readableEnded || rState ?. endEmitted ;
114+ let readableEnded = stream . readableEnded ||
115+ ( rState && rState . endEmitted ) ;
114116 const onend = ( ) => {
115117 readableEnded = true ;
116118 // Stream should not be destroyed here. If it is that
@@ -126,17 +128,7 @@ function eos(stream, options, callback) {
126128 callback . call ( stream , err ) ;
127129 } ;
128130
129- let closed = wState ?. closed || rState ?. closed ;
130-
131131 const onclose = ( ) => {
132- closed = true ;
133-
134- const errored = wState ?. errored || rState ?. errored ;
135-
136- if ( errored && typeof errored !== 'boolean' ) {
137- return callback . call ( stream , errored ) ;
138- }
139-
140132 if ( readable && ! readableEnded ) {
141133 if ( ! isReadableEnded ( stream ) )
142134 return callback . call ( stream ,
@@ -147,7 +139,6 @@ function eos(stream, options, callback) {
147139 return callback . call ( stream ,
148140 new ERR_STREAM_PREMATURE_CLOSE ( ) ) ;
149141 }
150-
151142 callback . call ( stream ) ;
152143 } ;
153144
@@ -177,29 +168,29 @@ function eos(stream, options, callback) {
177168 if ( options . error !== false ) stream . on ( 'error' , onerror ) ;
178169 stream . on ( 'close' , onclose ) ;
179170
171+ // _closed is for OutgoingMessage which is not a proper Writable.
172+ const closed = ( ! wState && ! rState && stream . _closed === true ) || (
173+ ( wState && wState . closed ) ||
174+ ( rState && rState . closed ) ||
175+ ( wState && wState . errorEmitted ) ||
176+ ( rState && rState . errorEmitted ) ||
177+ ( rState && stream . req && stream . aborted ) ||
178+ (
179+ ( ! writable || ( wState && wState . finished ) ) &&
180+ ( ! readable || ( rState && rState . endEmitted ) )
181+ )
182+ ) ;
183+
180184 if ( closed ) {
181- process . nextTick ( onclose ) ;
182- } else if ( wState ?. errorEmitted || rState ?. errorEmitted ) {
183- if ( ! willEmitClose ) {
184- process . nextTick ( onclose ) ;
185- }
186- } else if (
187- ! readable &&
188- ( ! willEmitClose || stream . readable ) &&
189- writableFinished
190- ) {
191- process . nextTick ( onclose ) ;
192- } else if (
193- ! writable &&
194- ( ! willEmitClose || stream . writable ) &&
195- readableEnded
196- ) {
197- process . nextTick ( onclose ) ;
198- } else if ( ! wState && ! rState && stream . _closed === true ) {
199- // _closed is for OutgoingMessage which is not a proper Writable.
200- process . nextTick ( onclose ) ;
201- } else if ( ( rState && stream . req && stream . aborted ) ) {
202- process . nextTick ( onclose ) ;
185+ // TODO(ronag): Re-throw error if errorEmitted?
186+ // TODO(ronag): Throw premature close as if finished was called?
187+ // before being closed? i.e. if closed but not errored, ended or finished.
188+ // TODO(ronag): Throw some kind of error? Does it make sense
189+ // to call finished() on a "finished" stream?
190+ // TODO(ronag): willEmitClose?
191+ process . nextTick ( ( ) => {
192+ callback ( ) ;
193+ } ) ;
203194 }
204195
205196 const cleanup = ( ) => {
0 commit comments