@@ -5,6 +5,7 @@ import type { Readable } from 'node:stream';
5
5
import {
6
6
createDeferredPromise ,
7
7
fakePromise ,
8
+ handleMaybePromise ,
8
9
isPromise ,
9
10
MaybePromise ,
10
11
} from '@whatwg-node/promise-helpers' ;
@@ -317,6 +318,14 @@ function sendAsyncIterable(serverResponse: NodeResponse, asyncIterable: AsyncIte
317
318
return pump ( ) ;
318
319
}
319
320
321
+ function safeWrite ( chunk : any , serverResponse : NodeResponse ) {
322
+ // @ts -expect-error http and http2 writes are actually compatible
323
+ const result = serverResponse . write ( chunk ) ;
324
+ if ( ! result ) {
325
+ return new Promise ( resolve => serverResponse . once ( 'drain' , resolve ) ) ;
326
+ }
327
+ }
328
+
320
329
export function sendNodeResponse (
321
330
fetchResponse : Response ,
322
331
serverResponse : NodeResponse ,
@@ -354,10 +363,10 @@ export function sendNodeResponse(
354
363
// @ts -expect-error - _buffer is a private property
355
364
fetchResponse . _buffer ;
356
365
if ( bufOfRes ) {
357
- // @ts -expect-error http and http2 writes are actually compatible
358
- serverResponse . write ( bufOfRes ) ;
359
- endResponse ( serverResponse ) ;
360
- return ;
366
+ return handleMaybePromise (
367
+ ( ) => safeWrite ( bufOfRes , serverResponse ) ,
368
+ ( ) => endResponse ( serverResponse ) ,
369
+ ) ;
361
370
}
362
371
363
372
// Other fetch implementations
@@ -371,11 +380,10 @@ export function sendNodeResponse(
371
380
// @ts -expect-error - Uint8Array is a valid body type
372
381
fetchBody [ Symbol . toStringTag ] === 'Uint8Array'
373
382
) {
374
- serverResponse
375
- // @ts -expect-error http and http2 writes are actually compatible
376
- . write ( fetchBody ) ;
377
- endResponse ( serverResponse ) ;
378
- return ;
383
+ return handleMaybePromise (
384
+ ( ) => safeWrite ( fetchBody , serverResponse ) ,
385
+ ( ) => endResponse ( serverResponse ) ,
386
+ ) ;
379
387
}
380
388
381
389
configureSocket ( nodeRequest ) ;
0 commit comments