@@ -19,15 +19,6 @@ function isStream(obj) {
1919 return isReadable ( obj ) || isWritable ( obj ) ;
2020}
2121
22- function isDuplexNodeStream ( obj ) {
23- return ! ! (
24- obj &&
25- ( typeof obj . pipe === 'function' && obj . _readableState ) &&
26- typeof obj . on === 'function' &&
27- typeof obj . write === 'function'
28- ) ;
29- }
30-
3122function isReadableNodeStream ( obj ) {
3223 return ! ! (
3324 obj &&
@@ -47,6 +38,15 @@ function isWritableNodeStream(obj) {
4738 ) ;
4839}
4940
41+ function isDuplexNodeStream ( obj ) {
42+ return ! ! (
43+ obj &&
44+ ( typeof obj . pipe === 'function' && obj . _readableState ) &&
45+ typeof obj . on === 'function' &&
46+ typeof obj . write === 'function'
47+ ) ;
48+ }
49+
5050function isNodeStream ( obj ) {
5151 return (
5252 obj &&
@@ -59,29 +59,79 @@ function isNodeStream(obj) {
5959 ) ;
6060}
6161
62+ function isIterable ( obj , isAsync ) {
63+ if ( obj == null ) return false ;
64+ if ( isAsync === true ) return typeof obj [ SymbolAsyncIterator ] === 'function' ;
65+ if ( isAsync === false ) return typeof obj [ SymbolIterator ] === 'function' ;
66+ return typeof obj [ SymbolAsyncIterator ] === 'function' ||
67+ typeof obj [ SymbolIterator ] === 'function' ;
68+ }
69+
6270function isDestroyed ( stream ) {
6371 if ( ! isNodeStream ( stream ) ) return null ;
6472 const wState = stream . _writableState ;
6573 const rState = stream . _readableState ;
6674 const state = wState || rState ;
67- return ! ! ( stream . destroyed || state ?. destroyed ) ;
75+ return ! ! ( stream . destroyed || stream [ kDestroyed ] || state ?. destroyed ) ;
6876}
6977
70- function isIterable ( obj , isAsync ) {
71- if ( obj == null ) return false ;
72- if ( isAsync === true ) return typeof obj [ SymbolAsyncIterator ] === 'function' ;
73- if ( isAsync === false ) return typeof obj [ SymbolIterator ] === 'function' ;
74- return typeof obj [ SymbolAsyncIterator ] === 'function' ||
75- typeof obj [ SymbolIterator ] === 'function' ;
78+ // Have been end():d.
79+ function isWritableEnded ( stream ) {
80+ if ( ! isWritableNodeStream ( stream ) ) return null ;
81+ if ( stream . writableEnded === true ) return true ;
82+ const wState = stream . _writableState ;
83+ if ( wState ?. errored ) return false ;
84+ if ( typeof wState ?. ended !== 'boolean' ) return null ;
85+ return wState . ended ;
86+ }
87+
88+ // Have emitted 'finish'.
89+ function isWritableFinished ( stream , strict ) {
90+ if ( ! isWritableNodeStream ( stream ) ) return null ;
91+ if ( stream . writableFinished === true ) return true ;
92+ const wState = stream . _writableState ;
93+ if ( wState ?. errored ) return false ;
94+ if ( typeof wState ?. finished !== 'boolean' ) return null ;
95+ return ! ! (
96+ wState . finished ||
97+ ( strict === false && wState . ended === true && wState . length === 0 )
98+ ) ;
99+ }
100+
101+ // Have been push(null):d.
102+ function isReadableEnded ( stream ) {
103+ if ( ! isReadableNodeStream ( stream ) ) return null ;
104+ if ( stream . readableEnded === true ) return true ;
105+ const rState = stream . _readableState ;
106+ if ( ! rState || rState . errored ) return false ;
107+ if ( typeof rState ?. ended !== 'boolean' ) return null ;
108+ return rState . ended ;
109+ }
110+
111+ // Have emitted 'end'.
112+ function isReadableFinished ( stream , strict ) {
113+ if ( ! isReadableNodeStream ( stream ) ) return null ;
114+ const rState = stream . _readableState ;
115+ if ( rState ?. errored ) return false ;
116+ if ( typeof rState ?. endEmitted !== 'boolean' ) return null ;
117+ return ! ! (
118+ rState . endEmitted ||
119+ ( strict === false && rState . ended === true && rState . length === 0 )
120+ ) ;
76121}
77122
78123module . exports = {
124+ isStream,
79125 isDestroyed,
80- isReadableNodeStream,
81- isWritableNodeStream,
82126 isDuplexNodeStream,
83- isNodeStream,
84127 isIterable,
85128 isReadable,
86- isStream,
129+ isReadableNodeStream,
130+ isReadableEnded,
131+ isReadableFinished,
132+ isNodeStream,
133+ isWritable,
134+ isWritableNodeStream,
135+ isWritableEnded,
136+ isWritableFinished,
87137} ;
0 commit comments