@hono/node-server 1.17.1 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
1
 
2
- export { }
2
+ export { }
package/dist/globals.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
 
2
- export { }
2
+ export { }
package/dist/index.js CHANGED
@@ -291,17 +291,14 @@ Object.setPrototypeOf(Response2, GlobalResponse);
291
291
  Object.setPrototypeOf(Response2.prototype, GlobalResponse.prototype);
292
292
 
293
293
  // src/utils.ts
294
- function writeFromReadableStream(stream, writable) {
295
- if (stream.locked) {
296
- throw new TypeError("ReadableStream is locked.");
297
- } else if (writable.destroyed) {
298
- return;
299
- }
300
- const reader = stream.getReader();
294
+ async function readWithoutBlocking(readPromise) {
295
+ return Promise.race([readPromise, Promise.resolve().then(() => Promise.resolve(void 0))]);
296
+ }
297
+ function writeFromReadableStreamDefaultReader(reader, writable, currentReadPromise) {
301
298
  const handleError = () => {
302
299
  };
303
300
  writable.on("error", handleError);
304
- reader.read().then(flow, handleStreamError);
301
+ (currentReadPromise ?? reader.read()).then(flow, handleStreamError);
305
302
  return reader.closed.finally(() => {
306
303
  writable.off("error", handleError);
307
304
  });
@@ -327,6 +324,14 @@ function writeFromReadableStream(stream, writable) {
327
324
  }
328
325
  }
329
326
  }
327
+ function writeFromReadableStream(stream, writable) {
328
+ if (stream.locked) {
329
+ throw new TypeError("ReadableStream is locked.");
330
+ } else if (writable.destroyed) {
331
+ return;
332
+ }
333
+ return writeFromReadableStreamDefaultReader(stream.getReader(), writable);
334
+ }
330
335
  var buildOutgoingHttpHeaders = (headers) => {
331
336
  const res = {};
332
337
  if (!(headers instanceof Headers)) {
@@ -368,8 +373,6 @@ global.fetch = (info, init) => {
368
373
 
369
374
  // src/listener.ts
370
375
  var outgoingEnded = Symbol("outgoingEnded");
371
- var regBuffer = /^no$/i;
372
- var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
373
376
  var handleRequestError = () => new Response(null, {
374
377
  status: 400
375
378
  });
@@ -441,23 +444,48 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
441
444
  }
442
445
  const resHeaderRecord = buildOutgoingHttpHeaders(res.headers);
443
446
  if (res.body) {
444
- const {
445
- "transfer-encoding": transferEncoding,
446
- "content-encoding": contentEncoding,
447
- "content-length": contentLength,
448
- "x-accel-buffering": accelBuffering,
449
- "content-type": contentType
450
- } = resHeaderRecord;
451
- if (transferEncoding || contentEncoding || contentLength || // nginx buffering variant
452
- accelBuffering && regBuffer.test(accelBuffering) || !regContentType.test(contentType)) {
453
- outgoing.writeHead(res.status, resHeaderRecord);
454
- flushHeaders(outgoing);
455
- await writeFromReadableStream(res.body, outgoing);
447
+ const reader = res.body.getReader();
448
+ const values = [];
449
+ let done = false;
450
+ let currentReadPromise = void 0;
451
+ for (let i = 0; i < 2; i++) {
452
+ currentReadPromise = reader.read();
453
+ const chunk = await readWithoutBlocking(currentReadPromise).catch((e) => {
454
+ console.error(e);
455
+ done = true;
456
+ });
457
+ if (!chunk) {
458
+ if (i === 1 && resHeaderRecord["transfer-encoding"] !== "chunked") {
459
+ await new Promise((resolve) => setTimeout(resolve));
460
+ i--;
461
+ continue;
462
+ }
463
+ break;
464
+ }
465
+ currentReadPromise = void 0;
466
+ if (chunk.value) {
467
+ values.push(chunk.value);
468
+ }
469
+ if (chunk.done) {
470
+ done = true;
471
+ break;
472
+ }
473
+ }
474
+ if (done && !("content-length" in resHeaderRecord)) {
475
+ resHeaderRecord["content-length"] = values.reduce((acc, value) => acc + value.length, 0);
476
+ }
477
+ outgoing.writeHead(res.status, resHeaderRecord);
478
+ values.forEach((value) => {
479
+ ;
480
+ outgoing.write(value);
481
+ });
482
+ if (done) {
483
+ outgoing.end();
456
484
  } else {
457
- const buffer = await res.arrayBuffer();
458
- resHeaderRecord["content-length"] = buffer.byteLength;
459
- outgoing.writeHead(res.status, resHeaderRecord);
460
- outgoing.end(new Uint8Array(buffer));
485
+ if (values.length === 0) {
486
+ flushHeaders(outgoing);
487
+ }
488
+ await writeFromReadableStreamDefaultReader(reader, outgoing, currentReadPromise);
461
489
  }
462
490
  } else if (resHeaderRecord[X_ALREADY_SENT]) {
463
491
  } else {
package/dist/index.mjs CHANGED
@@ -252,17 +252,14 @@ Object.setPrototypeOf(Response2, GlobalResponse);
252
252
  Object.setPrototypeOf(Response2.prototype, GlobalResponse.prototype);
253
253
 
254
254
  // src/utils.ts
255
- function writeFromReadableStream(stream, writable) {
256
- if (stream.locked) {
257
- throw new TypeError("ReadableStream is locked.");
258
- } else if (writable.destroyed) {
259
- return;
260
- }
261
- const reader = stream.getReader();
255
+ async function readWithoutBlocking(readPromise) {
256
+ return Promise.race([readPromise, Promise.resolve().then(() => Promise.resolve(void 0))]);
257
+ }
258
+ function writeFromReadableStreamDefaultReader(reader, writable, currentReadPromise) {
262
259
  const handleError = () => {
263
260
  };
264
261
  writable.on("error", handleError);
265
- reader.read().then(flow, handleStreamError);
262
+ (currentReadPromise ?? reader.read()).then(flow, handleStreamError);
266
263
  return reader.closed.finally(() => {
267
264
  writable.off("error", handleError);
268
265
  });
@@ -288,6 +285,14 @@ function writeFromReadableStream(stream, writable) {
288
285
  }
289
286
  }
290
287
  }
288
+ function writeFromReadableStream(stream, writable) {
289
+ if (stream.locked) {
290
+ throw new TypeError("ReadableStream is locked.");
291
+ } else if (writable.destroyed) {
292
+ return;
293
+ }
294
+ return writeFromReadableStreamDefaultReader(stream.getReader(), writable);
295
+ }
291
296
  var buildOutgoingHttpHeaders = (headers) => {
292
297
  const res = {};
293
298
  if (!(headers instanceof Headers)) {
@@ -329,8 +334,6 @@ global.fetch = (info, init) => {
329
334
 
330
335
  // src/listener.ts
331
336
  var outgoingEnded = Symbol("outgoingEnded");
332
- var regBuffer = /^no$/i;
333
- var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
334
337
  var handleRequestError = () => new Response(null, {
335
338
  status: 400
336
339
  });
@@ -402,23 +405,48 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
402
405
  }
403
406
  const resHeaderRecord = buildOutgoingHttpHeaders(res.headers);
404
407
  if (res.body) {
405
- const {
406
- "transfer-encoding": transferEncoding,
407
- "content-encoding": contentEncoding,
408
- "content-length": contentLength,
409
- "x-accel-buffering": accelBuffering,
410
- "content-type": contentType
411
- } = resHeaderRecord;
412
- if (transferEncoding || contentEncoding || contentLength || // nginx buffering variant
413
- accelBuffering && regBuffer.test(accelBuffering) || !regContentType.test(contentType)) {
414
- outgoing.writeHead(res.status, resHeaderRecord);
415
- flushHeaders(outgoing);
416
- await writeFromReadableStream(res.body, outgoing);
408
+ const reader = res.body.getReader();
409
+ const values = [];
410
+ let done = false;
411
+ let currentReadPromise = void 0;
412
+ for (let i = 0; i < 2; i++) {
413
+ currentReadPromise = reader.read();
414
+ const chunk = await readWithoutBlocking(currentReadPromise).catch((e) => {
415
+ console.error(e);
416
+ done = true;
417
+ });
418
+ if (!chunk) {
419
+ if (i === 1 && resHeaderRecord["transfer-encoding"] !== "chunked") {
420
+ await new Promise((resolve) => setTimeout(resolve));
421
+ i--;
422
+ continue;
423
+ }
424
+ break;
425
+ }
426
+ currentReadPromise = void 0;
427
+ if (chunk.value) {
428
+ values.push(chunk.value);
429
+ }
430
+ if (chunk.done) {
431
+ done = true;
432
+ break;
433
+ }
434
+ }
435
+ if (done && !("content-length" in resHeaderRecord)) {
436
+ resHeaderRecord["content-length"] = values.reduce((acc, value) => acc + value.length, 0);
437
+ }
438
+ outgoing.writeHead(res.status, resHeaderRecord);
439
+ values.forEach((value) => {
440
+ ;
441
+ outgoing.write(value);
442
+ });
443
+ if (done) {
444
+ outgoing.end();
417
445
  } else {
418
- const buffer = await res.arrayBuffer();
419
- resHeaderRecord["content-length"] = buffer.byteLength;
420
- outgoing.writeHead(res.status, resHeaderRecord);
421
- outgoing.end(new Uint8Array(buffer));
446
+ if (values.length === 0) {
447
+ flushHeaders(outgoing);
448
+ }
449
+ await writeFromReadableStreamDefaultReader(reader, outgoing, currentReadPromise);
422
450
  }
423
451
  } else if (resHeaderRecord[X_ALREADY_SENT]) {
424
452
  } else {
package/dist/listener.js CHANGED
@@ -283,17 +283,14 @@ Object.setPrototypeOf(Response2, GlobalResponse);
283
283
  Object.setPrototypeOf(Response2.prototype, GlobalResponse.prototype);
284
284
 
285
285
  // src/utils.ts
286
- function writeFromReadableStream(stream, writable) {
287
- if (stream.locked) {
288
- throw new TypeError("ReadableStream is locked.");
289
- } else if (writable.destroyed) {
290
- return;
291
- }
292
- const reader = stream.getReader();
286
+ async function readWithoutBlocking(readPromise) {
287
+ return Promise.race([readPromise, Promise.resolve().then(() => Promise.resolve(void 0))]);
288
+ }
289
+ function writeFromReadableStreamDefaultReader(reader, writable, currentReadPromise) {
293
290
  const handleError = () => {
294
291
  };
295
292
  writable.on("error", handleError);
296
- reader.read().then(flow, handleStreamError);
293
+ (currentReadPromise ?? reader.read()).then(flow, handleStreamError);
297
294
  return reader.closed.finally(() => {
298
295
  writable.off("error", handleError);
299
296
  });
@@ -319,6 +316,14 @@ function writeFromReadableStream(stream, writable) {
319
316
  }
320
317
  }
321
318
  }
319
+ function writeFromReadableStream(stream, writable) {
320
+ if (stream.locked) {
321
+ throw new TypeError("ReadableStream is locked.");
322
+ } else if (writable.destroyed) {
323
+ return;
324
+ }
325
+ return writeFromReadableStreamDefaultReader(stream.getReader(), writable);
326
+ }
322
327
  var buildOutgoingHttpHeaders = (headers) => {
323
328
  const res = {};
324
329
  if (!(headers instanceof Headers)) {
@@ -360,8 +365,6 @@ global.fetch = (info, init) => {
360
365
 
361
366
  // src/listener.ts
362
367
  var outgoingEnded = Symbol("outgoingEnded");
363
- var regBuffer = /^no$/i;
364
- var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
365
368
  var handleRequestError = () => new Response(null, {
366
369
  status: 400
367
370
  });
@@ -433,23 +436,48 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
433
436
  }
434
437
  const resHeaderRecord = buildOutgoingHttpHeaders(res.headers);
435
438
  if (res.body) {
436
- const {
437
- "transfer-encoding": transferEncoding,
438
- "content-encoding": contentEncoding,
439
- "content-length": contentLength,
440
- "x-accel-buffering": accelBuffering,
441
- "content-type": contentType
442
- } = resHeaderRecord;
443
- if (transferEncoding || contentEncoding || contentLength || // nginx buffering variant
444
- accelBuffering && regBuffer.test(accelBuffering) || !regContentType.test(contentType)) {
445
- outgoing.writeHead(res.status, resHeaderRecord);
446
- flushHeaders(outgoing);
447
- await writeFromReadableStream(res.body, outgoing);
439
+ const reader = res.body.getReader();
440
+ const values = [];
441
+ let done = false;
442
+ let currentReadPromise = void 0;
443
+ for (let i = 0; i < 2; i++) {
444
+ currentReadPromise = reader.read();
445
+ const chunk = await readWithoutBlocking(currentReadPromise).catch((e) => {
446
+ console.error(e);
447
+ done = true;
448
+ });
449
+ if (!chunk) {
450
+ if (i === 1 && resHeaderRecord["transfer-encoding"] !== "chunked") {
451
+ await new Promise((resolve) => setTimeout(resolve));
452
+ i--;
453
+ continue;
454
+ }
455
+ break;
456
+ }
457
+ currentReadPromise = void 0;
458
+ if (chunk.value) {
459
+ values.push(chunk.value);
460
+ }
461
+ if (chunk.done) {
462
+ done = true;
463
+ break;
464
+ }
465
+ }
466
+ if (done && !("content-length" in resHeaderRecord)) {
467
+ resHeaderRecord["content-length"] = values.reduce((acc, value) => acc + value.length, 0);
468
+ }
469
+ outgoing.writeHead(res.status, resHeaderRecord);
470
+ values.forEach((value) => {
471
+ ;
472
+ outgoing.write(value);
473
+ });
474
+ if (done) {
475
+ outgoing.end();
448
476
  } else {
449
- const buffer = await res.arrayBuffer();
450
- resHeaderRecord["content-length"] = buffer.byteLength;
451
- outgoing.writeHead(res.status, resHeaderRecord);
452
- outgoing.end(new Uint8Array(buffer));
477
+ if (values.length === 0) {
478
+ flushHeaders(outgoing);
479
+ }
480
+ await writeFromReadableStreamDefaultReader(reader, outgoing, currentReadPromise);
453
481
  }
454
482
  } else if (resHeaderRecord[X_ALREADY_SENT]) {
455
483
  } else {
package/dist/listener.mjs CHANGED
@@ -249,17 +249,14 @@ Object.setPrototypeOf(Response2, GlobalResponse);
249
249
  Object.setPrototypeOf(Response2.prototype, GlobalResponse.prototype);
250
250
 
251
251
  // src/utils.ts
252
- function writeFromReadableStream(stream, writable) {
253
- if (stream.locked) {
254
- throw new TypeError("ReadableStream is locked.");
255
- } else if (writable.destroyed) {
256
- return;
257
- }
258
- const reader = stream.getReader();
252
+ async function readWithoutBlocking(readPromise) {
253
+ return Promise.race([readPromise, Promise.resolve().then(() => Promise.resolve(void 0))]);
254
+ }
255
+ function writeFromReadableStreamDefaultReader(reader, writable, currentReadPromise) {
259
256
  const handleError = () => {
260
257
  };
261
258
  writable.on("error", handleError);
262
- reader.read().then(flow, handleStreamError);
259
+ (currentReadPromise ?? reader.read()).then(flow, handleStreamError);
263
260
  return reader.closed.finally(() => {
264
261
  writable.off("error", handleError);
265
262
  });
@@ -285,6 +282,14 @@ function writeFromReadableStream(stream, writable) {
285
282
  }
286
283
  }
287
284
  }
285
+ function writeFromReadableStream(stream, writable) {
286
+ if (stream.locked) {
287
+ throw new TypeError("ReadableStream is locked.");
288
+ } else if (writable.destroyed) {
289
+ return;
290
+ }
291
+ return writeFromReadableStreamDefaultReader(stream.getReader(), writable);
292
+ }
288
293
  var buildOutgoingHttpHeaders = (headers) => {
289
294
  const res = {};
290
295
  if (!(headers instanceof Headers)) {
@@ -326,8 +331,6 @@ global.fetch = (info, init) => {
326
331
 
327
332
  // src/listener.ts
328
333
  var outgoingEnded = Symbol("outgoingEnded");
329
- var regBuffer = /^no$/i;
330
- var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
331
334
  var handleRequestError = () => new Response(null, {
332
335
  status: 400
333
336
  });
@@ -399,23 +402,48 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
399
402
  }
400
403
  const resHeaderRecord = buildOutgoingHttpHeaders(res.headers);
401
404
  if (res.body) {
402
- const {
403
- "transfer-encoding": transferEncoding,
404
- "content-encoding": contentEncoding,
405
- "content-length": contentLength,
406
- "x-accel-buffering": accelBuffering,
407
- "content-type": contentType
408
- } = resHeaderRecord;
409
- if (transferEncoding || contentEncoding || contentLength || // nginx buffering variant
410
- accelBuffering && regBuffer.test(accelBuffering) || !regContentType.test(contentType)) {
411
- outgoing.writeHead(res.status, resHeaderRecord);
412
- flushHeaders(outgoing);
413
- await writeFromReadableStream(res.body, outgoing);
405
+ const reader = res.body.getReader();
406
+ const values = [];
407
+ let done = false;
408
+ let currentReadPromise = void 0;
409
+ for (let i = 0; i < 2; i++) {
410
+ currentReadPromise = reader.read();
411
+ const chunk = await readWithoutBlocking(currentReadPromise).catch((e) => {
412
+ console.error(e);
413
+ done = true;
414
+ });
415
+ if (!chunk) {
416
+ if (i === 1 && resHeaderRecord["transfer-encoding"] !== "chunked") {
417
+ await new Promise((resolve) => setTimeout(resolve));
418
+ i--;
419
+ continue;
420
+ }
421
+ break;
422
+ }
423
+ currentReadPromise = void 0;
424
+ if (chunk.value) {
425
+ values.push(chunk.value);
426
+ }
427
+ if (chunk.done) {
428
+ done = true;
429
+ break;
430
+ }
431
+ }
432
+ if (done && !("content-length" in resHeaderRecord)) {
433
+ resHeaderRecord["content-length"] = values.reduce((acc, value) => acc + value.length, 0);
434
+ }
435
+ outgoing.writeHead(res.status, resHeaderRecord);
436
+ values.forEach((value) => {
437
+ ;
438
+ outgoing.write(value);
439
+ });
440
+ if (done) {
441
+ outgoing.end();
414
442
  } else {
415
- const buffer = await res.arrayBuffer();
416
- resHeaderRecord["content-length"] = buffer.byteLength;
417
- outgoing.writeHead(res.status, resHeaderRecord);
418
- outgoing.end(new Uint8Array(buffer));
443
+ if (values.length === 0) {
444
+ flushHeaders(outgoing);
445
+ }
446
+ await writeFromReadableStreamDefaultReader(reader, outgoing, currentReadPromise);
419
447
  }
420
448
  } else if (resHeaderRecord[X_ALREADY_SENT]) {
421
449
  } else {
@@ -22,4 +22,4 @@ declare const abortControllerKey: unique symbol;
22
22
  declare const getAbortController: unique symbol;
23
23
  declare const newRequest: (incoming: IncomingMessage | Http2ServerRequest, defaultHostname?: string) => any;
24
24
 
25
- export { GlobalRequest, IncomingMessageWithWrapBodyStream, Request, RequestError, abortControllerKey, getAbortController, newRequest, toRequestError, wrapBodyStream };
25
+ export { GlobalRequest, type IncomingMessageWithWrapBodyStream, Request, RequestError, abortControllerKey, getAbortController, newRequest, toRequestError, wrapBodyStream };
package/dist/request.d.ts CHANGED
@@ -22,4 +22,4 @@ declare const abortControllerKey: unique symbol;
22
22
  declare const getAbortController: unique symbol;
23
23
  declare const newRequest: (incoming: IncomingMessage | Http2ServerRequest, defaultHostname?: string) => any;
24
24
 
25
- export { GlobalRequest, IncomingMessageWithWrapBodyStream, Request, RequestError, abortControllerKey, getAbortController, newRequest, toRequestError, wrapBodyStream };
25
+ export { GlobalRequest, type IncomingMessageWithWrapBodyStream, Request, RequestError, abortControllerKey, getAbortController, newRequest, toRequestError, wrapBodyStream };
@@ -23,4 +23,4 @@ declare class Response {
23
23
  get ok(): boolean;
24
24
  }
25
25
 
26
- export { GlobalResponse, InternalCache, Response, cacheKey };
26
+ export { GlobalResponse, type InternalCache, Response, cacheKey };
@@ -23,4 +23,4 @@ declare class Response {
23
23
  get ok(): boolean;
24
24
  }
25
25
 
26
- export { GlobalResponse, InternalCache, Response, cacheKey };
26
+ export { GlobalResponse, type InternalCache, Response, cacheKey };
@@ -14,4 +14,4 @@ type ServeStaticOptions<E extends Env = Env> = {
14
14
  };
15
15
  declare const serveStatic: <E extends Env = any>(options?: ServeStaticOptions<E>) => MiddlewareHandler<E>;
16
16
 
17
- export { ServeStaticOptions, serveStatic };
17
+ export { type ServeStaticOptions, serveStatic };
@@ -14,4 +14,4 @@ type ServeStaticOptions<E extends Env = Env> = {
14
14
  };
15
15
  declare const serveStatic: <E extends Env = any>(options?: ServeStaticOptions<E>) => MiddlewareHandler<E>;
16
16
 
17
- export { ServeStaticOptions, serveStatic };
17
+ export { type ServeStaticOptions, serveStatic };
package/dist/server.js CHANGED
@@ -287,17 +287,14 @@ Object.setPrototypeOf(Response2, GlobalResponse);
287
287
  Object.setPrototypeOf(Response2.prototype, GlobalResponse.prototype);
288
288
 
289
289
  // src/utils.ts
290
- function writeFromReadableStream(stream, writable) {
291
- if (stream.locked) {
292
- throw new TypeError("ReadableStream is locked.");
293
- } else if (writable.destroyed) {
294
- return;
295
- }
296
- const reader = stream.getReader();
290
+ async function readWithoutBlocking(readPromise) {
291
+ return Promise.race([readPromise, Promise.resolve().then(() => Promise.resolve(void 0))]);
292
+ }
293
+ function writeFromReadableStreamDefaultReader(reader, writable, currentReadPromise) {
297
294
  const handleError = () => {
298
295
  };
299
296
  writable.on("error", handleError);
300
- reader.read().then(flow, handleStreamError);
297
+ (currentReadPromise ?? reader.read()).then(flow, handleStreamError);
301
298
  return reader.closed.finally(() => {
302
299
  writable.off("error", handleError);
303
300
  });
@@ -323,6 +320,14 @@ function writeFromReadableStream(stream, writable) {
323
320
  }
324
321
  }
325
322
  }
323
+ function writeFromReadableStream(stream, writable) {
324
+ if (stream.locked) {
325
+ throw new TypeError("ReadableStream is locked.");
326
+ } else if (writable.destroyed) {
327
+ return;
328
+ }
329
+ return writeFromReadableStreamDefaultReader(stream.getReader(), writable);
330
+ }
326
331
  var buildOutgoingHttpHeaders = (headers) => {
327
332
  const res = {};
328
333
  if (!(headers instanceof Headers)) {
@@ -364,8 +369,6 @@ global.fetch = (info, init) => {
364
369
 
365
370
  // src/listener.ts
366
371
  var outgoingEnded = Symbol("outgoingEnded");
367
- var regBuffer = /^no$/i;
368
- var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
369
372
  var handleRequestError = () => new Response(null, {
370
373
  status: 400
371
374
  });
@@ -437,23 +440,48 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
437
440
  }
438
441
  const resHeaderRecord = buildOutgoingHttpHeaders(res.headers);
439
442
  if (res.body) {
440
- const {
441
- "transfer-encoding": transferEncoding,
442
- "content-encoding": contentEncoding,
443
- "content-length": contentLength,
444
- "x-accel-buffering": accelBuffering,
445
- "content-type": contentType
446
- } = resHeaderRecord;
447
- if (transferEncoding || contentEncoding || contentLength || // nginx buffering variant
448
- accelBuffering && regBuffer.test(accelBuffering) || !regContentType.test(contentType)) {
449
- outgoing.writeHead(res.status, resHeaderRecord);
450
- flushHeaders(outgoing);
451
- await writeFromReadableStream(res.body, outgoing);
443
+ const reader = res.body.getReader();
444
+ const values = [];
445
+ let done = false;
446
+ let currentReadPromise = void 0;
447
+ for (let i = 0; i < 2; i++) {
448
+ currentReadPromise = reader.read();
449
+ const chunk = await readWithoutBlocking(currentReadPromise).catch((e) => {
450
+ console.error(e);
451
+ done = true;
452
+ });
453
+ if (!chunk) {
454
+ if (i === 1 && resHeaderRecord["transfer-encoding"] !== "chunked") {
455
+ await new Promise((resolve) => setTimeout(resolve));
456
+ i--;
457
+ continue;
458
+ }
459
+ break;
460
+ }
461
+ currentReadPromise = void 0;
462
+ if (chunk.value) {
463
+ values.push(chunk.value);
464
+ }
465
+ if (chunk.done) {
466
+ done = true;
467
+ break;
468
+ }
469
+ }
470
+ if (done && !("content-length" in resHeaderRecord)) {
471
+ resHeaderRecord["content-length"] = values.reduce((acc, value) => acc + value.length, 0);
472
+ }
473
+ outgoing.writeHead(res.status, resHeaderRecord);
474
+ values.forEach((value) => {
475
+ ;
476
+ outgoing.write(value);
477
+ });
478
+ if (done) {
479
+ outgoing.end();
452
480
  } else {
453
- const buffer = await res.arrayBuffer();
454
- resHeaderRecord["content-length"] = buffer.byteLength;
455
- outgoing.writeHead(res.status, resHeaderRecord);
456
- outgoing.end(new Uint8Array(buffer));
481
+ if (values.length === 0) {
482
+ flushHeaders(outgoing);
483
+ }
484
+ await writeFromReadableStreamDefaultReader(reader, outgoing, currentReadPromise);
457
485
  }
458
486
  } else if (resHeaderRecord[X_ALREADY_SENT]) {
459
487
  } else {
package/dist/server.mjs CHANGED
@@ -252,17 +252,14 @@ Object.setPrototypeOf(Response2, GlobalResponse);
252
252
  Object.setPrototypeOf(Response2.prototype, GlobalResponse.prototype);
253
253
 
254
254
  // src/utils.ts
255
- function writeFromReadableStream(stream, writable) {
256
- if (stream.locked) {
257
- throw new TypeError("ReadableStream is locked.");
258
- } else if (writable.destroyed) {
259
- return;
260
- }
261
- const reader = stream.getReader();
255
+ async function readWithoutBlocking(readPromise) {
256
+ return Promise.race([readPromise, Promise.resolve().then(() => Promise.resolve(void 0))]);
257
+ }
258
+ function writeFromReadableStreamDefaultReader(reader, writable, currentReadPromise) {
262
259
  const handleError = () => {
263
260
  };
264
261
  writable.on("error", handleError);
265
- reader.read().then(flow, handleStreamError);
262
+ (currentReadPromise ?? reader.read()).then(flow, handleStreamError);
266
263
  return reader.closed.finally(() => {
267
264
  writable.off("error", handleError);
268
265
  });
@@ -288,6 +285,14 @@ function writeFromReadableStream(stream, writable) {
288
285
  }
289
286
  }
290
287
  }
288
+ function writeFromReadableStream(stream, writable) {
289
+ if (stream.locked) {
290
+ throw new TypeError("ReadableStream is locked.");
291
+ } else if (writable.destroyed) {
292
+ return;
293
+ }
294
+ return writeFromReadableStreamDefaultReader(stream.getReader(), writable);
295
+ }
291
296
  var buildOutgoingHttpHeaders = (headers) => {
292
297
  const res = {};
293
298
  if (!(headers instanceof Headers)) {
@@ -329,8 +334,6 @@ global.fetch = (info, init) => {
329
334
 
330
335
  // src/listener.ts
331
336
  var outgoingEnded = Symbol("outgoingEnded");
332
- var regBuffer = /^no$/i;
333
- var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
334
337
  var handleRequestError = () => new Response(null, {
335
338
  status: 400
336
339
  });
@@ -402,23 +405,48 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
402
405
  }
403
406
  const resHeaderRecord = buildOutgoingHttpHeaders(res.headers);
404
407
  if (res.body) {
405
- const {
406
- "transfer-encoding": transferEncoding,
407
- "content-encoding": contentEncoding,
408
- "content-length": contentLength,
409
- "x-accel-buffering": accelBuffering,
410
- "content-type": contentType
411
- } = resHeaderRecord;
412
- if (transferEncoding || contentEncoding || contentLength || // nginx buffering variant
413
- accelBuffering && regBuffer.test(accelBuffering) || !regContentType.test(contentType)) {
414
- outgoing.writeHead(res.status, resHeaderRecord);
415
- flushHeaders(outgoing);
416
- await writeFromReadableStream(res.body, outgoing);
408
+ const reader = res.body.getReader();
409
+ const values = [];
410
+ let done = false;
411
+ let currentReadPromise = void 0;
412
+ for (let i = 0; i < 2; i++) {
413
+ currentReadPromise = reader.read();
414
+ const chunk = await readWithoutBlocking(currentReadPromise).catch((e) => {
415
+ console.error(e);
416
+ done = true;
417
+ });
418
+ if (!chunk) {
419
+ if (i === 1 && resHeaderRecord["transfer-encoding"] !== "chunked") {
420
+ await new Promise((resolve) => setTimeout(resolve));
421
+ i--;
422
+ continue;
423
+ }
424
+ break;
425
+ }
426
+ currentReadPromise = void 0;
427
+ if (chunk.value) {
428
+ values.push(chunk.value);
429
+ }
430
+ if (chunk.done) {
431
+ done = true;
432
+ break;
433
+ }
434
+ }
435
+ if (done && !("content-length" in resHeaderRecord)) {
436
+ resHeaderRecord["content-length"] = values.reduce((acc, value) => acc + value.length, 0);
437
+ }
438
+ outgoing.writeHead(res.status, resHeaderRecord);
439
+ values.forEach((value) => {
440
+ ;
441
+ outgoing.write(value);
442
+ });
443
+ if (done) {
444
+ outgoing.end();
417
445
  } else {
418
- const buffer = await res.arrayBuffer();
419
- resHeaderRecord["content-length"] = buffer.byteLength;
420
- outgoing.writeHead(res.status, resHeaderRecord);
421
- outgoing.end(new Uint8Array(buffer));
446
+ if (values.length === 0) {
447
+ flushHeaders(outgoing);
448
+ }
449
+ await writeFromReadableStreamDefaultReader(reader, outgoing, currentReadPromise);
422
450
  }
423
451
  } else if (resHeaderRecord[X_ALREADY_SENT]) {
424
452
  } else {
package/dist/types.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { IncomingMessage, ServerResponse, Server, ServerOptions as ServerOptions$1, createServer } from 'node:http';
2
- import { Http2ServerRequest, Http2ServerResponse, Http2Server, Http2SecureServer, ServerOptions as ServerOptions$3, createServer as createServer$2, SecureServerOptions, createSecureServer } from 'node:http2';
1
+ import { IncomingMessage, ServerResponse, ServerOptions as ServerOptions$1, createServer, Server } from 'node:http';
2
+ import { Http2ServerRequest, Http2ServerResponse, ServerOptions as ServerOptions$3, createServer as createServer$2, SecureServerOptions, createSecureServer, Http2Server, Http2SecureServer } from 'node:http2';
3
3
  import { ServerOptions as ServerOptions$2, createServer as createServer$1 } from 'node:https';
4
4
 
5
5
  type HttpBindings = {
@@ -41,4 +41,4 @@ type Options = {
41
41
  } & ServerOptions;
42
42
  type CustomErrorHandler = (err: unknown) => void | Response | Promise<void | Response>;
43
43
 
44
- export { CustomErrorHandler, FetchCallback, Http2Bindings, HttpBindings, NextHandlerOption, Options, ServerOptions, ServerType };
44
+ export type { CustomErrorHandler, FetchCallback, Http2Bindings, HttpBindings, NextHandlerOption, Options, ServerOptions, ServerType };
package/dist/types.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { IncomingMessage, ServerResponse, Server, ServerOptions as ServerOptions$1, createServer } from 'node:http';
2
- import { Http2ServerRequest, Http2ServerResponse, Http2Server, Http2SecureServer, ServerOptions as ServerOptions$3, createServer as createServer$2, SecureServerOptions, createSecureServer } from 'node:http2';
1
+ import { IncomingMessage, ServerResponse, ServerOptions as ServerOptions$1, createServer, Server } from 'node:http';
2
+ import { Http2ServerRequest, Http2ServerResponse, ServerOptions as ServerOptions$3, createServer as createServer$2, SecureServerOptions, createSecureServer, Http2Server, Http2SecureServer } from 'node:http2';
3
3
  import { ServerOptions as ServerOptions$2, createServer as createServer$1 } from 'node:https';
4
4
 
5
5
  type HttpBindings = {
@@ -41,4 +41,4 @@ type Options = {
41
41
  } & ServerOptions;
42
42
  type CustomErrorHandler = (err: unknown) => void | Response | Promise<void | Response>;
43
43
 
44
- export { CustomErrorHandler, FetchCallback, Http2Bindings, HttpBindings, NextHandlerOption, Options, ServerOptions, ServerType };
44
+ export type { CustomErrorHandler, FetchCallback, Http2Bindings, HttpBindings, NextHandlerOption, Options, ServerOptions, ServerType };
package/dist/utils.d.mts CHANGED
@@ -1,7 +1,9 @@
1
1
  import { OutgoingHttpHeaders } from 'node:http';
2
2
  import { Writable } from 'node:stream';
3
3
 
4
- declare function writeFromReadableStream(stream: ReadableStream<Uint8Array>, writable: Writable): Promise<void> | undefined;
4
+ declare function readWithoutBlocking(readPromise: Promise<ReadableStreamReadResult<Uint8Array>>): Promise<ReadableStreamReadResult<Uint8Array> | undefined>;
5
+ declare function writeFromReadableStreamDefaultReader(reader: ReadableStreamDefaultReader<Uint8Array>, writable: Writable, currentReadPromise?: Promise<ReadableStreamReadResult<Uint8Array>> | undefined): Promise<undefined>;
6
+ declare function writeFromReadableStream(stream: ReadableStream<Uint8Array>, writable: Writable): Promise<undefined> | undefined;
5
7
  declare const buildOutgoingHttpHeaders: (headers: Headers | HeadersInit | null | undefined) => OutgoingHttpHeaders;
6
8
 
7
- export { buildOutgoingHttpHeaders, writeFromReadableStream };
9
+ export { buildOutgoingHttpHeaders, readWithoutBlocking, writeFromReadableStream, writeFromReadableStreamDefaultReader };
package/dist/utils.d.ts CHANGED
@@ -1,7 +1,9 @@
1
1
  import { OutgoingHttpHeaders } from 'node:http';
2
2
  import { Writable } from 'node:stream';
3
3
 
4
- declare function writeFromReadableStream(stream: ReadableStream<Uint8Array>, writable: Writable): Promise<void> | undefined;
4
+ declare function readWithoutBlocking(readPromise: Promise<ReadableStreamReadResult<Uint8Array>>): Promise<ReadableStreamReadResult<Uint8Array> | undefined>;
5
+ declare function writeFromReadableStreamDefaultReader(reader: ReadableStreamDefaultReader<Uint8Array>, writable: Writable, currentReadPromise?: Promise<ReadableStreamReadResult<Uint8Array>> | undefined): Promise<undefined>;
6
+ declare function writeFromReadableStream(stream: ReadableStream<Uint8Array>, writable: Writable): Promise<undefined> | undefined;
5
7
  declare const buildOutgoingHttpHeaders: (headers: Headers | HeadersInit | null | undefined) => OutgoingHttpHeaders;
6
8
 
7
- export { buildOutgoingHttpHeaders, writeFromReadableStream };
9
+ export { buildOutgoingHttpHeaders, readWithoutBlocking, writeFromReadableStream, writeFromReadableStreamDefaultReader };
package/dist/utils.js CHANGED
@@ -21,20 +21,19 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var utils_exports = {};
22
22
  __export(utils_exports, {
23
23
  buildOutgoingHttpHeaders: () => buildOutgoingHttpHeaders,
24
- writeFromReadableStream: () => writeFromReadableStream
24
+ readWithoutBlocking: () => readWithoutBlocking,
25
+ writeFromReadableStream: () => writeFromReadableStream,
26
+ writeFromReadableStreamDefaultReader: () => writeFromReadableStreamDefaultReader
25
27
  });
26
28
  module.exports = __toCommonJS(utils_exports);
27
- function writeFromReadableStream(stream, writable) {
28
- if (stream.locked) {
29
- throw new TypeError("ReadableStream is locked.");
30
- } else if (writable.destroyed) {
31
- return;
32
- }
33
- const reader = stream.getReader();
29
+ async function readWithoutBlocking(readPromise) {
30
+ return Promise.race([readPromise, Promise.resolve().then(() => Promise.resolve(void 0))]);
31
+ }
32
+ function writeFromReadableStreamDefaultReader(reader, writable, currentReadPromise) {
34
33
  const handleError = () => {
35
34
  };
36
35
  writable.on("error", handleError);
37
- reader.read().then(flow, handleStreamError);
36
+ (currentReadPromise ?? reader.read()).then(flow, handleStreamError);
38
37
  return reader.closed.finally(() => {
39
38
  writable.off("error", handleError);
40
39
  });
@@ -60,6 +59,14 @@ function writeFromReadableStream(stream, writable) {
60
59
  }
61
60
  }
62
61
  }
62
+ function writeFromReadableStream(stream, writable) {
63
+ if (stream.locked) {
64
+ throw new TypeError("ReadableStream is locked.");
65
+ } else if (writable.destroyed) {
66
+ return;
67
+ }
68
+ return writeFromReadableStreamDefaultReader(stream.getReader(), writable);
69
+ }
63
70
  var buildOutgoingHttpHeaders = (headers) => {
64
71
  const res = {};
65
72
  if (!(headers instanceof Headers)) {
@@ -82,5 +89,7 @@ var buildOutgoingHttpHeaders = (headers) => {
82
89
  // Annotate the CommonJS export names for ESM import in node:
83
90
  0 && (module.exports = {
84
91
  buildOutgoingHttpHeaders,
85
- writeFromReadableStream
92
+ readWithoutBlocking,
93
+ writeFromReadableStream,
94
+ writeFromReadableStreamDefaultReader
86
95
  });
package/dist/utils.mjs CHANGED
@@ -1,15 +1,12 @@
1
1
  // src/utils.ts
2
- function writeFromReadableStream(stream, writable) {
3
- if (stream.locked) {
4
- throw new TypeError("ReadableStream is locked.");
5
- } else if (writable.destroyed) {
6
- return;
7
- }
8
- const reader = stream.getReader();
2
+ async function readWithoutBlocking(readPromise) {
3
+ return Promise.race([readPromise, Promise.resolve().then(() => Promise.resolve(void 0))]);
4
+ }
5
+ function writeFromReadableStreamDefaultReader(reader, writable, currentReadPromise) {
9
6
  const handleError = () => {
10
7
  };
11
8
  writable.on("error", handleError);
12
- reader.read().then(flow, handleStreamError);
9
+ (currentReadPromise ?? reader.read()).then(flow, handleStreamError);
13
10
  return reader.closed.finally(() => {
14
11
  writable.off("error", handleError);
15
12
  });
@@ -35,6 +32,14 @@ function writeFromReadableStream(stream, writable) {
35
32
  }
36
33
  }
37
34
  }
35
+ function writeFromReadableStream(stream, writable) {
36
+ if (stream.locked) {
37
+ throw new TypeError("ReadableStream is locked.");
38
+ } else if (writable.destroyed) {
39
+ return;
40
+ }
41
+ return writeFromReadableStreamDefaultReader(stream.getReader(), writable);
42
+ }
38
43
  var buildOutgoingHttpHeaders = (headers) => {
39
44
  const res = {};
40
45
  if (!(headers instanceof Headers)) {
@@ -56,5 +61,7 @@ var buildOutgoingHttpHeaders = (headers) => {
56
61
  };
57
62
  export {
58
63
  buildOutgoingHttpHeaders,
59
- writeFromReadableStream
64
+ readWithoutBlocking,
65
+ writeFromReadableStream,
66
+ writeFromReadableStreamDefaultReader
60
67
  };
package/dist/vercel.js CHANGED
@@ -285,17 +285,14 @@ Object.setPrototypeOf(Response2, GlobalResponse);
285
285
  Object.setPrototypeOf(Response2.prototype, GlobalResponse.prototype);
286
286
 
287
287
  // src/utils.ts
288
- function writeFromReadableStream(stream, writable) {
289
- if (stream.locked) {
290
- throw new TypeError("ReadableStream is locked.");
291
- } else if (writable.destroyed) {
292
- return;
293
- }
294
- const reader = stream.getReader();
288
+ async function readWithoutBlocking(readPromise) {
289
+ return Promise.race([readPromise, Promise.resolve().then(() => Promise.resolve(void 0))]);
290
+ }
291
+ function writeFromReadableStreamDefaultReader(reader, writable, currentReadPromise) {
295
292
  const handleError = () => {
296
293
  };
297
294
  writable.on("error", handleError);
298
- reader.read().then(flow, handleStreamError);
295
+ (currentReadPromise ?? reader.read()).then(flow, handleStreamError);
299
296
  return reader.closed.finally(() => {
300
297
  writable.off("error", handleError);
301
298
  });
@@ -321,6 +318,14 @@ function writeFromReadableStream(stream, writable) {
321
318
  }
322
319
  }
323
320
  }
321
+ function writeFromReadableStream(stream, writable) {
322
+ if (stream.locked) {
323
+ throw new TypeError("ReadableStream is locked.");
324
+ } else if (writable.destroyed) {
325
+ return;
326
+ }
327
+ return writeFromReadableStreamDefaultReader(stream.getReader(), writable);
328
+ }
324
329
  var buildOutgoingHttpHeaders = (headers) => {
325
330
  const res = {};
326
331
  if (!(headers instanceof Headers)) {
@@ -362,8 +367,6 @@ global.fetch = (info, init) => {
362
367
 
363
368
  // src/listener.ts
364
369
  var outgoingEnded = Symbol("outgoingEnded");
365
- var regBuffer = /^no$/i;
366
- var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
367
370
  var handleRequestError = () => new Response(null, {
368
371
  status: 400
369
372
  });
@@ -435,23 +438,48 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
435
438
  }
436
439
  const resHeaderRecord = buildOutgoingHttpHeaders(res.headers);
437
440
  if (res.body) {
438
- const {
439
- "transfer-encoding": transferEncoding,
440
- "content-encoding": contentEncoding,
441
- "content-length": contentLength,
442
- "x-accel-buffering": accelBuffering,
443
- "content-type": contentType
444
- } = resHeaderRecord;
445
- if (transferEncoding || contentEncoding || contentLength || // nginx buffering variant
446
- accelBuffering && regBuffer.test(accelBuffering) || !regContentType.test(contentType)) {
447
- outgoing.writeHead(res.status, resHeaderRecord);
448
- flushHeaders(outgoing);
449
- await writeFromReadableStream(res.body, outgoing);
441
+ const reader = res.body.getReader();
442
+ const values = [];
443
+ let done = false;
444
+ let currentReadPromise = void 0;
445
+ for (let i = 0; i < 2; i++) {
446
+ currentReadPromise = reader.read();
447
+ const chunk = await readWithoutBlocking(currentReadPromise).catch((e) => {
448
+ console.error(e);
449
+ done = true;
450
+ });
451
+ if (!chunk) {
452
+ if (i === 1 && resHeaderRecord["transfer-encoding"] !== "chunked") {
453
+ await new Promise((resolve) => setTimeout(resolve));
454
+ i--;
455
+ continue;
456
+ }
457
+ break;
458
+ }
459
+ currentReadPromise = void 0;
460
+ if (chunk.value) {
461
+ values.push(chunk.value);
462
+ }
463
+ if (chunk.done) {
464
+ done = true;
465
+ break;
466
+ }
467
+ }
468
+ if (done && !("content-length" in resHeaderRecord)) {
469
+ resHeaderRecord["content-length"] = values.reduce((acc, value) => acc + value.length, 0);
470
+ }
471
+ outgoing.writeHead(res.status, resHeaderRecord);
472
+ values.forEach((value) => {
473
+ ;
474
+ outgoing.write(value);
475
+ });
476
+ if (done) {
477
+ outgoing.end();
450
478
  } else {
451
- const buffer = await res.arrayBuffer();
452
- resHeaderRecord["content-length"] = buffer.byteLength;
453
- outgoing.writeHead(res.status, resHeaderRecord);
454
- outgoing.end(new Uint8Array(buffer));
479
+ if (values.length === 0) {
480
+ flushHeaders(outgoing);
481
+ }
482
+ await writeFromReadableStreamDefaultReader(reader, outgoing, currentReadPromise);
455
483
  }
456
484
  } else if (resHeaderRecord[X_ALREADY_SENT]) {
457
485
  } else {
package/dist/vercel.mjs CHANGED
@@ -249,17 +249,14 @@ Object.setPrototypeOf(Response2, GlobalResponse);
249
249
  Object.setPrototypeOf(Response2.prototype, GlobalResponse.prototype);
250
250
 
251
251
  // src/utils.ts
252
- function writeFromReadableStream(stream, writable) {
253
- if (stream.locked) {
254
- throw new TypeError("ReadableStream is locked.");
255
- } else if (writable.destroyed) {
256
- return;
257
- }
258
- const reader = stream.getReader();
252
+ async function readWithoutBlocking(readPromise) {
253
+ return Promise.race([readPromise, Promise.resolve().then(() => Promise.resolve(void 0))]);
254
+ }
255
+ function writeFromReadableStreamDefaultReader(reader, writable, currentReadPromise) {
259
256
  const handleError = () => {
260
257
  };
261
258
  writable.on("error", handleError);
262
- reader.read().then(flow, handleStreamError);
259
+ (currentReadPromise ?? reader.read()).then(flow, handleStreamError);
263
260
  return reader.closed.finally(() => {
264
261
  writable.off("error", handleError);
265
262
  });
@@ -285,6 +282,14 @@ function writeFromReadableStream(stream, writable) {
285
282
  }
286
283
  }
287
284
  }
285
+ function writeFromReadableStream(stream, writable) {
286
+ if (stream.locked) {
287
+ throw new TypeError("ReadableStream is locked.");
288
+ } else if (writable.destroyed) {
289
+ return;
290
+ }
291
+ return writeFromReadableStreamDefaultReader(stream.getReader(), writable);
292
+ }
288
293
  var buildOutgoingHttpHeaders = (headers) => {
289
294
  const res = {};
290
295
  if (!(headers instanceof Headers)) {
@@ -326,8 +331,6 @@ global.fetch = (info, init) => {
326
331
 
327
332
  // src/listener.ts
328
333
  var outgoingEnded = Symbol("outgoingEnded");
329
- var regBuffer = /^no$/i;
330
- var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
331
334
  var handleRequestError = () => new Response(null, {
332
335
  status: 400
333
336
  });
@@ -399,23 +402,48 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
399
402
  }
400
403
  const resHeaderRecord = buildOutgoingHttpHeaders(res.headers);
401
404
  if (res.body) {
402
- const {
403
- "transfer-encoding": transferEncoding,
404
- "content-encoding": contentEncoding,
405
- "content-length": contentLength,
406
- "x-accel-buffering": accelBuffering,
407
- "content-type": contentType
408
- } = resHeaderRecord;
409
- if (transferEncoding || contentEncoding || contentLength || // nginx buffering variant
410
- accelBuffering && regBuffer.test(accelBuffering) || !regContentType.test(contentType)) {
411
- outgoing.writeHead(res.status, resHeaderRecord);
412
- flushHeaders(outgoing);
413
- await writeFromReadableStream(res.body, outgoing);
405
+ const reader = res.body.getReader();
406
+ const values = [];
407
+ let done = false;
408
+ let currentReadPromise = void 0;
409
+ for (let i = 0; i < 2; i++) {
410
+ currentReadPromise = reader.read();
411
+ const chunk = await readWithoutBlocking(currentReadPromise).catch((e) => {
412
+ console.error(e);
413
+ done = true;
414
+ });
415
+ if (!chunk) {
416
+ if (i === 1 && resHeaderRecord["transfer-encoding"] !== "chunked") {
417
+ await new Promise((resolve) => setTimeout(resolve));
418
+ i--;
419
+ continue;
420
+ }
421
+ break;
422
+ }
423
+ currentReadPromise = void 0;
424
+ if (chunk.value) {
425
+ values.push(chunk.value);
426
+ }
427
+ if (chunk.done) {
428
+ done = true;
429
+ break;
430
+ }
431
+ }
432
+ if (done && !("content-length" in resHeaderRecord)) {
433
+ resHeaderRecord["content-length"] = values.reduce((acc, value) => acc + value.length, 0);
434
+ }
435
+ outgoing.writeHead(res.status, resHeaderRecord);
436
+ values.forEach((value) => {
437
+ ;
438
+ outgoing.write(value);
439
+ });
440
+ if (done) {
441
+ outgoing.end();
414
442
  } else {
415
- const buffer = await res.arrayBuffer();
416
- resHeaderRecord["content-length"] = buffer.byteLength;
417
- outgoing.writeHead(res.status, resHeaderRecord);
418
- outgoing.end(new Uint8Array(buffer));
443
+ if (values.length === 0) {
444
+ flushHeaders(outgoing);
445
+ }
446
+ await writeFromReadableStreamDefaultReader(reader, outgoing, currentReadPromise);
419
447
  }
420
448
  } else if (resHeaderRecord[X_ALREADY_SENT]) {
421
449
  } else {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hono/node-server",
3
- "version": "1.17.1",
3
+ "version": "1.18.0",
4
4
  "description": "Node.js Adapter for Hono",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",