@@ -4,6 +4,7 @@ const { test } = require('tap')
4
4
const {
5
5
Response
6
6
} = require ( '../../' )
7
+ const { ReadableStream } = require ( 'stream/web' )
7
8
8
9
test ( 'arg validation' , async ( t ) => {
9
10
// constructor
@@ -164,3 +165,68 @@ test('Modifying headers using Headers.prototype.set', (t) => {
164
165
165
166
t . end ( )
166
167
} )
168
+
169
+ // https://github.com/nodejs/node/issues/43838
170
+ test ( 'constructing a Response with a ReadableStream body' , async ( t ) => {
171
+ const text = '{"foo":"bar"}'
172
+ const uint8 = new TextEncoder ( ) . encode ( text )
173
+
174
+ t . test ( 'Readable stream with Uint8Array chunks' , async ( t ) => {
175
+ const readable = new ReadableStream ( {
176
+ start ( controller ) {
177
+ controller . enqueue ( uint8 )
178
+ controller . close ( )
179
+ }
180
+ } )
181
+
182
+ const response1 = new Response ( readable )
183
+ const response2 = response1 . clone ( )
184
+ const response3 = response1 . clone ( )
185
+
186
+ t . equal ( await response1 . text ( ) , text )
187
+ t . same ( await response2 . arrayBuffer ( ) , uint8 . buffer )
188
+ t . same ( await response3 . json ( ) , JSON . parse ( text ) )
189
+
190
+ t . end ( )
191
+ } )
192
+
193
+ t . test ( 'Readable stream with non-Uint8Array chunks' , async ( t ) => {
194
+ const readable = new ReadableStream ( {
195
+ start ( controller ) {
196
+ controller . enqueue ( text ) // string
197
+ controller . close ( )
198
+ }
199
+ } )
200
+
201
+ const response = new Response ( readable )
202
+
203
+ await t . rejects ( response . text ( ) , TypeError )
204
+
205
+ t . end ( )
206
+ } )
207
+
208
+ t . test ( 'Readable with ArrayBuffer chunk still throws' , async ( t ) => {
209
+ const readable = new ReadableStream ( {
210
+ start ( controller ) {
211
+ controller . enqueue ( uint8 . buffer )
212
+ controller . close ( )
213
+ }
214
+ } )
215
+
216
+ const response1 = new Response ( readable )
217
+ const response2 = response1 . clone ( )
218
+ const response3 = response1 . clone ( )
219
+ // const response4 = response1.clone()
220
+
221
+ await t . rejects ( response1 . arrayBuffer ( ) , TypeError )
222
+ await t . rejects ( response2 . text ( ) , TypeError )
223
+ await t . rejects ( response3 . json ( ) , TypeError )
224
+ // TODO: on Node v16.8.0, this throws a TypeError
225
+ // because the body is detected as disturbed.
226
+ // await t.rejects(response4.blob(), TypeError)
227
+
228
+ t . end ( )
229
+ } )
230
+
231
+ t . end ( )
232
+ } )
0 commit comments