1+ import * as stream from 'stream' ;
12import * as net from 'net' ;
23import * as http from 'http' ;
34import * as https from 'https' ;
@@ -24,17 +25,27 @@ export interface RequestDefinition {
2425export interface RequestOptions {
2526}
2627
27- export interface ResponseDefinition {
28+ export type ResponseStreamEvents =
29+ | ResponseHead
30+ | ResponseBodyPart ;
31+ // Other notable events: errors (via 'error' event) and clean closure (via 'end').
32+
33+ export interface ResponseHead {
34+ type : 'response-head' ;
2835 statusCode : number ;
2936 statusMessage ?: string ;
3037 headers : RawHeaders ;
31- rawBody ?: Buffer ;
3238}
3339
34- export async function sendRequest (
40+ export interface ResponseBodyPart {
41+ type : 'response-body-part' ;
42+ data : Buffer ;
43+ }
44+
45+ export function sendRequest (
3546 requestDefn : RequestDefinition ,
3647 options : RequestOptions
37- ) : Promise < ResponseDefinition > {
48+ ) : stream . Readable {
3849 const url = new URL ( requestDefn . url ) ;
3950
4051 const request = ( url . protocol === 'https' ? https : http ) . request ( requestDefn . url , {
@@ -60,19 +71,34 @@ export async function sendRequest(
6071 request . end ( ) ;
6172 }
6273
63- const response = await new Promise < http . IncomingMessage > ( ( resolve , reject ) => {
74+ const resultsStream = new stream . Readable ( {
75+ objectMode : true ,
76+ read ( ) { } // Can't pull data - we manually fill this with .push() instead.
77+ } ) ;
78+
79+ new Promise < http . IncomingMessage > ( ( resolve , reject ) => {
6480 request . on ( 'error' , reject ) ;
6581 request . on ( 'response' , resolve ) ;
82+ } ) . then ( ( response ) => {
83+ resultsStream . push ( {
84+ type : 'response-head' ,
85+ statusCode : response . statusCode ! ,
86+ statusMessage : response . statusMessage ,
87+ headers : pairFlatRawHeaders ( response . rawHeaders )
88+ } ) ;
89+
90+ response . on ( 'data' , ( data ) => resultsStream . push ( {
91+ type : 'response-body-part' ,
92+ data
93+ } ) ) ;
94+
95+ response . on ( 'end' , ( ) => resultsStream . push ( null ) ) ;
96+ } ) . catch ( ( error ) => {
97+ resultsStream . destroy ( error ) ;
98+ request . destroy ( ) ;
6699 } ) ;
67100
68- const body = await streamToBuffer ( response ) ;
69-
70- return {
71- statusCode : response . statusCode ! ,
72- statusMessage : response . statusMessage ,
73- headers : pairFlatRawHeaders ( response . rawHeaders ) ,
74- rawBody : body
75- }
101+ return resultsStream ;
76102}
77103
78104/**
0 commit comments