Skip to content

Commit cc6a076

Browse files
committed
fixup
1 parent 2eb474e commit cc6a076

File tree

1 file changed

+70
-20
lines changed

1 file changed

+70
-20
lines changed

lib/internal/streams/utils.js

Lines changed: 70 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
3122
function 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+
5050
function 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+
6270
function 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

78123
module.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

Comments
 (0)