1
1
import { Buffer } from 'buffer' ;
2
- import { PassThrough } from 'stream' ;
3
-
4
- import * as semver from 'semver' ;
2
+ import { PassThrough , Readable } from 'stream' ;
3
+ import { delay , getDeferred , ErrorLike } from '@httptoolkit/util' ;
5
4
6
5
import { getLocal } from "../../.." ;
7
- import { expect , fetch , isNode , delay } from "../../test-utils" ;
6
+ import { expect , fetch , isNode , nodeOnly } from "../../test-utils" ;
8
7
9
8
describe ( "Streaming response handler" , function ( ) {
10
9
@@ -28,15 +27,9 @@ describe("Streaming response handler", function () {
28
27
await delay ( 100 ) ;
29
28
stream . write ( Buffer . from ( 'world' ) ) ;
30
29
31
- if ( ! process . version || semver . major ( process . version ) >= 8 ) {
32
- let arrayBuffer = new Uint8Array ( 1 ) ;
33
- arrayBuffer [ 0 ] = '!' . charCodeAt ( 0 ) ;
34
- stream . write ( arrayBuffer ) ;
35
- } else {
36
- // Node < 8 doesn't support streaming array buffers
37
- stream . write ( '!' ) ;
38
- }
39
- stream . end ( ) ;
30
+ let arrayBuffer = new Uint8Array ( 1 ) ;
31
+ arrayBuffer [ 0 ] = '!' . charCodeAt ( 0 ) ;
32
+ stream . end ( arrayBuffer ) ;
40
33
41
34
await expect ( responsePromise ) . to . have . status ( 200 ) ;
42
35
await expect ( responsePromise ) . to . have . responseText ( 'Hello\nworld!' ) ;
@@ -82,4 +75,27 @@ describe("Streaming response handler", function () {
82
75
await expect ( response2 ) . to . have . responseText ( 'World' ) ;
83
76
} ) ;
84
77
78
+ nodeOnly ( ( ) => {
79
+ it ( "should abort the response if the stream throws an error" , async ( ) => {
80
+ const serverResponseStream = new PassThrough ( ) ;
81
+ await server . forGet ( '/stream' ) . thenStream ( 200 , serverResponseStream ) ;
82
+
83
+ serverResponseStream . write ( 'Hello\n' ) ;
84
+
85
+ const response = await fetch ( server . urlFor ( '/stream' ) ) ;
86
+
87
+ expect ( response . status ) . to . equal ( 200 ) ;
88
+
89
+ const clientResponseStream = response . body as any as Readable ;
90
+ expect ( clientResponseStream . read ( ) . toString ( ) ) . to . equal ( 'Hello\n' ) ;
91
+
92
+ const errorPromise = getDeferred < Error > ( ) ;
93
+ clientResponseStream . on ( 'error' , ( err ) => errorPromise . resolve ( err ) ) ;
94
+
95
+ serverResponseStream . destroy ( new Error ( "Stream error" ) ) ;
96
+ const error : ErrorLike = await errorPromise ;
97
+ expect ( error . code ) . to . equal ( 'ERR_STREAM_PREMATURE_CLOSE' ) ;
98
+ } ) ;
99
+ } ) ;
100
+
85
101
} ) ;
0 commit comments