@hono/node-server 1.17.0 → 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.
package/dist/vercel.mjs CHANGED
@@ -249,30 +249,24 @@ 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
- stream.cancel();
257
- return;
258
- }
259
- const reader = stream.getReader();
260
- writable.on("close", cancel);
261
- writable.on("error", cancel);
262
- reader.read().then(flow, cancel);
252
+ async function readWithoutBlocking(readPromise) {
253
+ return Promise.race([readPromise, Promise.resolve().then(() => Promise.resolve(void 0))]);
254
+ }
255
+ function writeFromReadableStreamDefaultReader(reader, writable, currentReadPromise) {
256
+ const handleError = () => {
257
+ };
258
+ writable.on("error", handleError);
259
+ (currentReadPromise ?? reader.read()).then(flow, handleStreamError);
263
260
  return reader.closed.finally(() => {
264
- writable.off("close", cancel);
265
- writable.off("error", cancel);
261
+ writable.off("error", handleError);
266
262
  });
267
- function cancel(error) {
268
- reader.cancel(error).catch(() => {
269
- });
263
+ function handleStreamError(error) {
270
264
  if (error) {
271
265
  writable.destroy(error);
272
266
  }
273
267
  }
274
268
  function onDrain() {
275
- reader.read().then(flow, cancel);
269
+ reader.read().then(flow, handleStreamError);
276
270
  }
277
271
  function flow({ done, value }) {
278
272
  try {
@@ -281,13 +275,21 @@ function writeFromReadableStream(stream, writable) {
281
275
  } else if (!writable.write(value)) {
282
276
  writable.once("drain", onDrain);
283
277
  } else {
284
- return reader.read().then(flow, cancel);
278
+ return reader.read().then(flow, handleStreamError);
285
279
  }
286
280
  } catch (e) {
287
- cancel(e);
281
+ handleStreamError(e);
288
282
  }
289
283
  }
290
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
+ }
291
293
  var buildOutgoingHttpHeaders = (headers) => {
292
294
  const res = {};
293
295
  if (!(headers instanceof Headers)) {
@@ -329,8 +331,6 @@ global.fetch = (info, init) => {
329
331
 
330
332
  // src/listener.ts
331
333
  var outgoingEnded = Symbol("outgoingEnded");
332
- var regBuffer = /^no$/i;
333
- var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
334
334
  var handleRequestError = () => new Response(null, {
335
335
  status: 400
336
336
  });
@@ -402,23 +402,48 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
402
402
  }
403
403
  const resHeaderRecord = buildOutgoingHttpHeaders(res.headers);
404
404
  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);
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();
417
442
  } 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));
443
+ if (values.length === 0) {
444
+ flushHeaders(outgoing);
445
+ }
446
+ await writeFromReadableStreamDefaultReader(reader, outgoing, currentReadPromise);
422
447
  }
423
448
  } else if (resHeaderRecord[X_ALREADY_SENT]) {
424
449
  } else {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hono/node-server",
3
- "version": "1.17.0",
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",