11import { 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' ;
54
65import { getLocal } from "../../.." ;
7- import { expect , fetch , isNode , delay } from "../../test-utils" ;
6+ import { expect , fetch , isNode , nodeOnly } from "../../test-utils" ;
87
98describe ( "Streaming response handler" , function ( ) {
109
@@ -28,15 +27,9 @@ describe("Streaming response handler", function () {
2827 await delay ( 100 ) ;
2928 stream . write ( Buffer . from ( 'world' ) ) ;
3029
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 ) ;
4033
4134 await expect ( responsePromise ) . to . have . status ( 200 ) ;
4235 await expect ( responsePromise ) . to . have . responseText ( 'Hello\nworld!' ) ;
@@ -82,4 +75,27 @@ describe("Streaming response handler", function () {
8275 await expect ( response2 ) . to . have . responseText ( 'World' ) ;
8376 } ) ;
8477
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+
85101} ) ;
0 commit comments