Skip to content

Commit 45e90c2

Browse files
authored
Add support for HTTP stream instances (#21)
1 parent 6913e34 commit 45e90c2

4 files changed

Lines changed: 55 additions & 9 deletions

File tree

index.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ isStream({});
2424
export function isStream(stream: unknown): stream is Stream;
2525

2626
/**
27-
@returns Whether `stream` is a [`stream.Writable`](https://nodejs.org/api/stream.html#stream_class_stream_writable).
27+
@returns Whether `stream` is a [`stream.Writable`](https://nodejs.org/api/stream.html#stream_class_stream_writable), an [`http.OutgoingMessage`](https://nodejs.org/api/http.html#class-httpoutgoingmessage), an [`http.ServerResponse`](https://nodejs.org/api/http.html#class-httpserverresponse) or an [`http.ClientRequest`](https://nodejs.org/api/http.html#class-httpserverresponse).
2828
2929
@example
3030
```
@@ -38,7 +38,7 @@ isWritableStream(fs.createWriteStrem('unicorn.txt'));
3838
export function isWritableStream(stream: unknown): stream is WritableStream;
3939

4040
/**
41-
@returns Whether `stream` is a [`stream.Readable`](https://nodejs.org/api/stream.html#stream_class_stream_readable).
41+
@returns Whether `stream` is a [`stream.Readable`](https://nodejs.org/api/stream.html#stream_class_stream_readable) or an [`http.IncomingMessage`](https://nodejs.org/api/http.html#class-httpincomingmessage).
4242
4343
@example
4444
```

index.js

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,22 @@ export function isStream(stream) {
77
export function isWritableStream(stream) {
88
return isStream(stream)
99
&& stream.writable !== false
10-
&& typeof stream._write === 'function'
11-
&& typeof stream._writableState === 'object';
10+
&& typeof stream.write === 'function'
11+
&& typeof stream.end === 'function'
12+
&& typeof stream.writable === 'boolean'
13+
&& typeof stream.writableObjectMode === 'boolean'
14+
&& typeof stream.destroy === 'function'
15+
&& typeof stream.destroyed === 'boolean';
1216
}
1317

1418
export function isReadableStream(stream) {
1519
return isStream(stream)
1620
&& stream.readable !== false
17-
&& typeof stream._read === 'function'
18-
&& typeof stream._readableState === 'object';
21+
&& typeof stream.read === 'function'
22+
&& typeof stream.readable === 'boolean'
23+
&& typeof stream.readableObjectMode === 'boolean'
24+
&& typeof stream.destroy === 'function'
25+
&& typeof stream.destroyed === 'boolean';
1926
}
2027

2128
export function isDuplexStream(stream) {

readme.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ Returns a `boolean` for whether it's a [`Stream`](https://nodejs.org/api/stream.
2929

3030
#### isWritableStream(stream)
3131

32-
Returns a `boolean` for whether it's a [`stream.Writable`](https://nodejs.org/api/stream.html#stream_class_stream_writable).
32+
Returns a `boolean` for whether it's a [`stream.Writable`](https://nodejs.org/api/stream.html#stream_class_stream_writable), an [`http.OutgoingMessage`](https://nodejs.org/api/http.html#class-httpoutgoingmessage), an [`http.ServerResponse`](https://nodejs.org/api/http.html#class-httpserverresponse) or an [`http.ClientRequest`](https://nodejs.org/api/http.html#class-httpserverresponse).
3333

3434
#### isReadableStream(stream)
3535

36-
Returns a `boolean` for whether it's a [`stream.Readable`](https://nodejs.org/api/stream.html#stream_class_stream_readable).
36+
Returns a `boolean` for whether it's a [`stream.Readable`](https://nodejs.org/api/stream.html#stream_class_stream_readable) or an [`http.IncomingMessage`](https://nodejs.org/api/http.html#class-httpincomingmessage).
3737

3838
#### isDuplexStream(stream)
3939

test.js

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import fs from 'node:fs';
22
import Stream from 'node:stream';
3+
import http from 'node:http';
34
import net from 'node:net';
45
import test from 'ava';
56
import tempy from 'tempy';
@@ -20,6 +21,10 @@ test('isStream()', t => {
2021
t.true(isStream(new Stream.PassThrough()));
2122
t.true(isStream(fs.createReadStream('test.js')));
2223
t.true(isStream(fs.createWriteStream(tempy.file())));
24+
t.true(isStream(new http.OutgoingMessage()));
25+
t.true(isStream(new http.IncomingMessage()));
26+
t.true(isStream(new http.ServerResponse({})));
27+
t.true(isStream(new http.ClientRequest('http://example.com')));
2328
t.true(isStream(new net.Socket()));
2429
t.false(isStream({}));
2530
t.false(isStream(null));
@@ -33,10 +38,18 @@ test('isWritableStream()', t => {
3338
t.true(isWritableStream(new Stream.Transform()));
3439
t.true(isWritableStream(new Stream.PassThrough()));
3540
t.true(isWritableStream(fs.createWriteStream(tempy.file())));
41+
t.true(isWritableStream(new http.OutgoingMessage()));
42+
t.true(isWritableStream(new http.ServerResponse({})));
43+
t.true(isWritableStream(new http.ClientRequest('http://example.com')));
3644
t.true(isWritableStream(new net.Socket()));
3745
t.false(isWritableStream(new Stream.Stream()));
3846
t.false(isWritableStream(new Stream.Readable()));
3947
t.false(isWritableStream(fs.createReadStream('test.js')));
48+
t.false(isWritableStream(new http.IncomingMessage()));
49+
t.false(isWritableStream({}));
50+
t.false(isWritableStream(null));
51+
t.false(isWritableStream(undefined));
52+
t.false(isWritableStream(''));
4053
});
4154

4255
test('isReadableStream()', t => {
@@ -45,30 +58,56 @@ test('isReadableStream()', t => {
4558
t.true(isReadableStream(new Stream.Transform()));
4659
t.true(isReadableStream(new Stream.PassThrough()));
4760
t.true(isReadableStream(fs.createReadStream('test.js')));
61+
t.true(isReadableStream(new http.IncomingMessage()));
4862
t.true(isReadableStream(new net.Socket()));
4963
t.false(isReadableStream(new Stream.Stream()));
5064
t.false(isReadableStream(new Stream.Writable()));
5165
t.false(isReadableStream(fs.createWriteStream(tempy.file())));
66+
t.false(isReadableStream(new http.OutgoingMessage()));
67+
t.false(isReadableStream(new http.ServerResponse({})));
68+
t.false(isReadableStream(new http.ClientRequest('http://example.com')));
69+
t.false(isReadableStream({}));
70+
t.false(isReadableStream(null));
71+
t.false(isReadableStream(undefined));
72+
t.false(isReadableStream(''));
5273
});
5374

5475
test('isDuplexStream()', t => {
5576
t.true(isDuplexStream(new Stream.Duplex()));
5677
t.true(isDuplexStream(new Stream.Transform()));
5778
t.true(isDuplexStream(new Stream.PassThrough()));
79+
t.true(isDuplexStream(new net.Socket()));
5880
t.false(isDuplexStream(new Stream.Stream()));
5981
t.false(isDuplexStream(new Stream.Readable()));
6082
t.false(isDuplexStream(new Stream.Writable()));
6183
t.false(isDuplexStream(fs.createReadStream('test.js')));
6284
t.false(isDuplexStream(fs.createWriteStream(tempy.file())));
85+
t.false(isDuplexStream(new http.OutgoingMessage()));
86+
t.false(isDuplexStream(new http.IncomingMessage()));
87+
t.false(isDuplexStream(new http.ServerResponse({})));
88+
t.false(isDuplexStream(new http.ClientRequest('http://example.com')));
89+
t.false(isDuplexStream({}));
90+
t.false(isDuplexStream(null));
91+
t.false(isDuplexStream(undefined));
92+
t.false(isDuplexStream(''));
6393
});
6494

6595
test('isTransformStream()', t => {
6696
t.true(isTransformStream(new Stream.Transform()));
6797
t.true(isTransformStream(new Stream.PassThrough()));
68-
t.false(isTransformStream(new Stream.Duplex()));
6998
t.false(isTransformStream(new Stream.Stream()));
7099
t.false(isTransformStream(new Stream.Readable()));
71100
t.false(isTransformStream(new Stream.Writable()));
101+
t.false(isTransformStream(new Stream.Duplex()));
72102
t.false(isTransformStream(fs.createReadStream('test.js')));
73103
t.false(isTransformStream(fs.createWriteStream(tempy.file())));
104+
t.false(isTransformStream(new http.OutgoingMessage()));
105+
t.false(isTransformStream(new http.IncomingMessage()));
106+
t.false(isTransformStream(new http.ServerResponse({})));
107+
t.false(isTransformStream(new http.ClientRequest('http://example.com')));
108+
t.false(isTransformStream(new net.Socket()));
109+
t.false(isTransformStream({}));
110+
t.false(isTransformStream(null));
111+
t.false(isTransformStream(undefined));
112+
t.false(isTransformStream(''));
74113
});

0 commit comments

Comments
 (0)