1
1
import { Buffer } from 'buffer' ;
2
+ import { promisify } from 'util' ;
2
3
import stream from 'stream' ;
4
+ import fs from 'fs' ;
3
5
// @ts -expect-error Fails to find slow-stream/index.d.ts
4
6
import SlowStream from 'slow-stream' ;
5
7
import toReadableStream from 'to-readable-stream' ;
6
8
import getStream from 'get-stream' ;
9
+ import FormData from 'form-data' ;
10
+ import tempy from 'tempy' ;
7
11
import is from '@sindresorhus/is' ;
8
12
import test , { ExecutionContext } from 'ava' ;
9
13
import { Handler } from 'express' ;
@@ -41,6 +45,24 @@ const checkEvents = (t: ExecutionContext, events: Progress[], bodySize?: number)
41
45
42
46
const file = Buffer . alloc ( 1024 * 1024 * 2 ) ;
43
47
48
+ const downloadEndpoint : Handler = ( _request , response ) => {
49
+ response . setHeader ( 'content-length' , file . length ) ;
50
+
51
+ stream . pipeline (
52
+ toReadableStream ( file ) ,
53
+ new SlowStream ( { maxWriteInterval : 50 } ) ,
54
+ response ,
55
+ ( ) => {
56
+ response . end ( ) ;
57
+ } ,
58
+ ) ;
59
+ } ;
60
+
61
+ const noTotalEndpoint : Handler = ( _request , response ) => {
62
+ response . write ( 'hello' ) ;
63
+ response . end ( ) ;
64
+ } ;
65
+
44
66
const uploadEndpoint : Handler = ( request , response ) => {
45
67
stream . pipeline (
46
68
request ,
@@ -51,6 +73,118 @@ const uploadEndpoint: Handler = (request, response) => {
51
73
) ;
52
74
} ;
53
75
76
+ test ( 'download progress' , withServer , async ( t , server , got ) => {
77
+ server . get ( '/' , downloadEndpoint ) ;
78
+
79
+ const events : Progress [ ] = [ ] ;
80
+
81
+ const { body} = await got ( { responseType : 'buffer' } )
82
+ . on ( 'downloadProgress' , event => events . push ( event ) ) ;
83
+
84
+ checkEvents ( t , events , body . length ) ;
85
+ } ) ;
86
+
87
+ test ( 'download progress - missing total size' , withServer , async ( t , server , got ) => {
88
+ server . get ( '/' , noTotalEndpoint ) ;
89
+
90
+ const events : Progress [ ] = [ ] ;
91
+
92
+ await got ( '' ) . on ( 'downloadProgress' , ( event : Progress ) => events . push ( event ) ) ;
93
+
94
+ t . is ( events [ 0 ] ?. total , undefined ) ;
95
+ checkEvents ( t , events ) ;
96
+ } ) ;
97
+
98
+ test ( 'download progress - stream' , withServer , async ( t , server , got ) => {
99
+ server . get ( '/' , downloadEndpoint ) ;
100
+
101
+ const events : Progress [ ] = [ ] ;
102
+
103
+ const stream = got . stream ( { responseType : 'buffer' } )
104
+ . on ( 'downloadProgress' , event => events . push ( event ) ) ;
105
+
106
+ await getStream ( stream ) ;
107
+
108
+ checkEvents ( t , events , file . length ) ;
109
+ } ) ;
110
+
111
+ test ( 'upload progress - file' , withServer , async ( t , server , got ) => {
112
+ server . post ( '/' , uploadEndpoint ) ;
113
+
114
+ const events : Progress [ ] = [ ] ;
115
+
116
+ await got . post ( { body : file } ) . on ( 'uploadProgress' , ( event : Progress ) => events . push ( event ) ) ;
117
+
118
+ checkEvents ( t , events , file . length ) ;
119
+ } ) ;
120
+
121
+ test ( 'upload progress - file stream' , withServer , async ( t , server , got ) => {
122
+ server . post ( '/' , uploadEndpoint ) ;
123
+
124
+ const path = tempy . file ( ) ;
125
+ fs . writeFileSync ( path , file ) ;
126
+
127
+ const { size} = await promisify ( fs . stat ) ( path ) ;
128
+
129
+ const events : Progress [ ] = [ ] ;
130
+
131
+ await got . post ( {
132
+ body : fs . createReadStream ( path ) ,
133
+ headers : {
134
+ 'content-length' : size . toString ( ) ,
135
+ } ,
136
+ } )
137
+ . on ( 'uploadProgress' , ( event : Progress ) => events . push ( event ) ) ;
138
+
139
+ checkEvents ( t , events , file . length ) ;
140
+ } ) ;
141
+
142
+ test ( 'upload progress - form data' , withServer , async ( t , server , got ) => {
143
+ server . post ( '/' , uploadEndpoint ) ;
144
+
145
+ const events : Progress [ ] = [ ] ;
146
+
147
+ const body = new FormData ( ) ;
148
+ body . append ( 'key' , 'value' ) ;
149
+ body . append ( 'file' , file ) ;
150
+
151
+ const size = await promisify ( body . getLength . bind ( body ) ) ( ) ;
152
+
153
+ await got . post ( { body} ) . on ( 'uploadProgress' , ( event : Progress ) => events . push ( event ) ) ;
154
+
155
+ checkEvents ( t , events , size ) ;
156
+ } ) ;
157
+
158
+ test ( 'upload progress - json' , withServer , async ( t , server , got ) => {
159
+ server . post ( '/' , uploadEndpoint ) ;
160
+
161
+ const body = JSON . stringify ( { key : 'value' } ) ;
162
+ const size = Buffer . byteLength ( body ) ;
163
+ const events : Progress [ ] = [ ] ;
164
+
165
+ await got . post ( { body} ) . on ( 'uploadProgress' , ( event : Progress ) => events . push ( event ) ) ;
166
+
167
+ checkEvents ( t , events , size ) ;
168
+ } ) ;
169
+
170
+ test ( 'upload progress - stream with known body size' , withServer , async ( t , server , got ) => {
171
+ server . post ( '/' , uploadEndpoint ) ;
172
+
173
+ const events : Progress [ ] = [ ] ;
174
+ const options = {
175
+ headers : { 'content-length' : file . length . toString ( ) } ,
176
+ } ;
177
+
178
+ const request = got . stream . post ( options )
179
+ . on ( 'uploadProgress' , event => events . push ( event ) ) ;
180
+
181
+ await getStream (
182
+ stream . pipeline ( toReadableStream ( file ) , request , ( ) => { } ) ,
183
+ ) ;
184
+
185
+ checkEvents ( t , events , file . length ) ;
186
+ } ) ;
187
+
54
188
test ( 'upload progress - stream with unknown body size' , withServer , async ( t , server , got ) => {
55
189
server . post ( '/' , uploadEndpoint ) ;
56
190
@@ -66,3 +200,24 @@ test('upload progress - stream with unknown body size', withServer, async (t, se
66
200
t . is ( events [ 0 ] ?. total , undefined ) ;
67
201
checkEvents ( t , events ) ;
68
202
} ) ;
203
+
204
+ test ( 'upload progress - no body' , withServer , async ( t , server , got ) => {
205
+ server . post ( '/' , uploadEndpoint ) ;
206
+
207
+ const events : Progress [ ] = [ ] ;
208
+
209
+ await got . post ( '' ) . on ( 'uploadProgress' , ( event : Progress ) => events . push ( event ) ) ;
210
+
211
+ t . deepEqual ( events , [
212
+ {
213
+ percent : 0 ,
214
+ transferred : 0 ,
215
+ total : undefined ,
216
+ } ,
217
+ {
218
+ percent : 1 ,
219
+ transferred : 0 ,
220
+ total : 0 ,
221
+ } ,
222
+ ] ) ;
223
+ } ) ;
0 commit comments