@hono/node-server 1.2.1 → 1.2.2

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/index.js CHANGED
@@ -41,7 +41,6 @@ var import_node_http = require("http");
41
41
 
42
42
  // src/listener.ts
43
43
  var import_node_stream = require("stream");
44
- var import_promises = require("stream/promises");
45
44
 
46
45
  // src/globals.ts
47
46
  var import_node_crypto = __toESM(require("crypto"));
@@ -59,6 +58,47 @@ global.fetch = (info, init) => {
59
58
  return webFetch(info, init);
60
59
  };
61
60
 
61
+ // src/utils.ts
62
+ function writeFromReadableStream(stream, writable) {
63
+ if (stream.locked) {
64
+ throw new TypeError("ReadableStream is locked.");
65
+ }
66
+ const reader = stream.getReader();
67
+ if (writable.destroyed) {
68
+ reader.cancel();
69
+ return;
70
+ }
71
+ writable.on("drain", onDrain);
72
+ writable.on("close", cancel);
73
+ writable.on("error", cancel);
74
+ reader.read().then(flow, cancel);
75
+ return reader.closed.finally(() => {
76
+ writable.off("close", cancel);
77
+ writable.off("error", cancel);
78
+ writable.off("drain", onDrain);
79
+ });
80
+ function cancel(error) {
81
+ reader.cancel(error).catch(() => {
82
+ });
83
+ if (error)
84
+ writable.destroy(error);
85
+ }
86
+ function onDrain() {
87
+ reader.read().then(flow, cancel);
88
+ }
89
+ function flow({ done, value }) {
90
+ try {
91
+ if (done) {
92
+ writable.end();
93
+ } else if (writable.write(value)) {
94
+ return reader.read().then(flow, cancel);
95
+ }
96
+ } catch (e) {
97
+ cancel(e);
98
+ }
99
+ }
100
+ }
101
+
62
102
  // src/listener.ts
63
103
  var regBuffer = /^no$/i;
64
104
  var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
@@ -81,7 +121,7 @@ var getRequestListener = (fetchCallback) => {
81
121
  }
82
122
  let res;
83
123
  try {
84
- res = await fetchCallback(new Request(url.toString(), init));
124
+ res = await fetchCallback(new Request(url, init));
85
125
  } catch (e) {
86
126
  res = new Response(null, { status: 500 });
87
127
  if (e instanceof Error) {
@@ -91,24 +131,28 @@ var getRequestListener = (fetchCallback) => {
91
131
  }
92
132
  }
93
133
  const resHeaderRecord = {};
134
+ const cookies = [];
94
135
  for (const [k, v] of res.headers) {
95
- resHeaderRecord[k] = v;
96
136
  if (k === "set-cookie") {
97
- outgoing.setHeader(k, res.headers.getSetCookie(k));
137
+ cookies.push(v);
98
138
  } else {
99
- outgoing.setHeader(k, v);
139
+ resHeaderRecord[k] = v;
100
140
  }
101
141
  }
102
- outgoing.statusCode = res.status;
142
+ if (cookies.length > 0) {
143
+ resHeaderRecord["set-cookie"] = cookies;
144
+ }
103
145
  if (res.body) {
104
146
  try {
105
147
  if (resHeaderRecord["transfer-encoding"] || resHeaderRecord["content-encoding"] || resHeaderRecord["content-length"] || // nginx buffering variant
106
- regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
107
- await (0, import_promises.pipeline)(import_node_stream.Readable.fromWeb(res.body), outgoing);
148
+ resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
149
+ outgoing.writeHead(res.status, resHeaderRecord);
150
+ await writeFromReadableStream(res.body, outgoing);
108
151
  } else {
109
- const text = await res.text();
110
- outgoing.setHeader("Content-Length", Buffer.byteLength(text));
111
- outgoing.end(text);
152
+ const buffer = await res.arrayBuffer();
153
+ resHeaderRecord["content-length"] = buffer.byteLength;
154
+ outgoing.writeHead(res.status, resHeaderRecord);
155
+ outgoing.end(new Uint8Array(buffer));
112
156
  }
113
157
  } catch (e) {
114
158
  const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
@@ -120,6 +164,7 @@ var getRequestListener = (fetchCallback) => {
120
164
  }
121
165
  }
122
166
  } else {
167
+ outgoing.writeHead(res.status, resHeaderRecord);
123
168
  outgoing.end();
124
169
  }
125
170
  };
package/dist/index.mjs CHANGED
@@ -3,7 +3,6 @@ import { createServer as createServerHTTP } from "http";
3
3
 
4
4
  // src/listener.ts
5
5
  import { Readable } from "stream";
6
- import { pipeline } from "stream/promises";
7
6
 
8
7
  // src/globals.ts
9
8
  import crypto from "crypto";
@@ -21,6 +20,47 @@ global.fetch = (info, init) => {
21
20
  return webFetch(info, init);
22
21
  };
23
22
 
23
+ // src/utils.ts
24
+ function writeFromReadableStream(stream, writable) {
25
+ if (stream.locked) {
26
+ throw new TypeError("ReadableStream is locked.");
27
+ }
28
+ const reader = stream.getReader();
29
+ if (writable.destroyed) {
30
+ reader.cancel();
31
+ return;
32
+ }
33
+ writable.on("drain", onDrain);
34
+ writable.on("close", cancel);
35
+ writable.on("error", cancel);
36
+ reader.read().then(flow, cancel);
37
+ return reader.closed.finally(() => {
38
+ writable.off("close", cancel);
39
+ writable.off("error", cancel);
40
+ writable.off("drain", onDrain);
41
+ });
42
+ function cancel(error) {
43
+ reader.cancel(error).catch(() => {
44
+ });
45
+ if (error)
46
+ writable.destroy(error);
47
+ }
48
+ function onDrain() {
49
+ reader.read().then(flow, cancel);
50
+ }
51
+ function flow({ done, value }) {
52
+ try {
53
+ if (done) {
54
+ writable.end();
55
+ } else if (writable.write(value)) {
56
+ return reader.read().then(flow, cancel);
57
+ }
58
+ } catch (e) {
59
+ cancel(e);
60
+ }
61
+ }
62
+ }
63
+
24
64
  // src/listener.ts
25
65
  var regBuffer = /^no$/i;
26
66
  var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
@@ -43,7 +83,7 @@ var getRequestListener = (fetchCallback) => {
43
83
  }
44
84
  let res;
45
85
  try {
46
- res = await fetchCallback(new Request(url.toString(), init));
86
+ res = await fetchCallback(new Request(url, init));
47
87
  } catch (e) {
48
88
  res = new Response(null, { status: 500 });
49
89
  if (e instanceof Error) {
@@ -53,24 +93,28 @@ var getRequestListener = (fetchCallback) => {
53
93
  }
54
94
  }
55
95
  const resHeaderRecord = {};
96
+ const cookies = [];
56
97
  for (const [k, v] of res.headers) {
57
- resHeaderRecord[k] = v;
58
98
  if (k === "set-cookie") {
59
- outgoing.setHeader(k, res.headers.getSetCookie(k));
99
+ cookies.push(v);
60
100
  } else {
61
- outgoing.setHeader(k, v);
101
+ resHeaderRecord[k] = v;
62
102
  }
63
103
  }
64
- outgoing.statusCode = res.status;
104
+ if (cookies.length > 0) {
105
+ resHeaderRecord["set-cookie"] = cookies;
106
+ }
65
107
  if (res.body) {
66
108
  try {
67
109
  if (resHeaderRecord["transfer-encoding"] || resHeaderRecord["content-encoding"] || resHeaderRecord["content-length"] || // nginx buffering variant
68
- regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
69
- await pipeline(Readable.fromWeb(res.body), outgoing);
110
+ resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
111
+ outgoing.writeHead(res.status, resHeaderRecord);
112
+ await writeFromReadableStream(res.body, outgoing);
70
113
  } else {
71
- const text = await res.text();
72
- outgoing.setHeader("Content-Length", Buffer.byteLength(text));
73
- outgoing.end(text);
114
+ const buffer = await res.arrayBuffer();
115
+ resHeaderRecord["content-length"] = buffer.byteLength;
116
+ outgoing.writeHead(res.status, resHeaderRecord);
117
+ outgoing.end(new Uint8Array(buffer));
74
118
  }
75
119
  } catch (e) {
76
120
  const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
@@ -82,6 +126,7 @@ var getRequestListener = (fetchCallback) => {
82
126
  }
83
127
  }
84
128
  } else {
129
+ outgoing.writeHead(res.status, resHeaderRecord);
85
130
  outgoing.end();
86
131
  }
87
132
  };
package/dist/listener.js CHANGED
@@ -34,7 +34,6 @@ __export(listener_exports, {
34
34
  });
35
35
  module.exports = __toCommonJS(listener_exports);
36
36
  var import_node_stream = require("stream");
37
- var import_promises = require("stream/promises");
38
37
 
39
38
  // src/globals.ts
40
39
  var import_node_crypto = __toESM(require("crypto"));
@@ -52,6 +51,47 @@ global.fetch = (info, init) => {
52
51
  return webFetch(info, init);
53
52
  };
54
53
 
54
+ // src/utils.ts
55
+ function writeFromReadableStream(stream, writable) {
56
+ if (stream.locked) {
57
+ throw new TypeError("ReadableStream is locked.");
58
+ }
59
+ const reader = stream.getReader();
60
+ if (writable.destroyed) {
61
+ reader.cancel();
62
+ return;
63
+ }
64
+ writable.on("drain", onDrain);
65
+ writable.on("close", cancel);
66
+ writable.on("error", cancel);
67
+ reader.read().then(flow, cancel);
68
+ return reader.closed.finally(() => {
69
+ writable.off("close", cancel);
70
+ writable.off("error", cancel);
71
+ writable.off("drain", onDrain);
72
+ });
73
+ function cancel(error) {
74
+ reader.cancel(error).catch(() => {
75
+ });
76
+ if (error)
77
+ writable.destroy(error);
78
+ }
79
+ function onDrain() {
80
+ reader.read().then(flow, cancel);
81
+ }
82
+ function flow({ done, value }) {
83
+ try {
84
+ if (done) {
85
+ writable.end();
86
+ } else if (writable.write(value)) {
87
+ return reader.read().then(flow, cancel);
88
+ }
89
+ } catch (e) {
90
+ cancel(e);
91
+ }
92
+ }
93
+ }
94
+
55
95
  // src/listener.ts
56
96
  var regBuffer = /^no$/i;
57
97
  var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
@@ -74,7 +114,7 @@ var getRequestListener = (fetchCallback) => {
74
114
  }
75
115
  let res;
76
116
  try {
77
- res = await fetchCallback(new Request(url.toString(), init));
117
+ res = await fetchCallback(new Request(url, init));
78
118
  } catch (e) {
79
119
  res = new Response(null, { status: 500 });
80
120
  if (e instanceof Error) {
@@ -84,24 +124,28 @@ var getRequestListener = (fetchCallback) => {
84
124
  }
85
125
  }
86
126
  const resHeaderRecord = {};
127
+ const cookies = [];
87
128
  for (const [k, v] of res.headers) {
88
- resHeaderRecord[k] = v;
89
129
  if (k === "set-cookie") {
90
- outgoing.setHeader(k, res.headers.getSetCookie(k));
130
+ cookies.push(v);
91
131
  } else {
92
- outgoing.setHeader(k, v);
132
+ resHeaderRecord[k] = v;
93
133
  }
94
134
  }
95
- outgoing.statusCode = res.status;
135
+ if (cookies.length > 0) {
136
+ resHeaderRecord["set-cookie"] = cookies;
137
+ }
96
138
  if (res.body) {
97
139
  try {
98
140
  if (resHeaderRecord["transfer-encoding"] || resHeaderRecord["content-encoding"] || resHeaderRecord["content-length"] || // nginx buffering variant
99
- regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
100
- await (0, import_promises.pipeline)(import_node_stream.Readable.fromWeb(res.body), outgoing);
141
+ resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
142
+ outgoing.writeHead(res.status, resHeaderRecord);
143
+ await writeFromReadableStream(res.body, outgoing);
101
144
  } else {
102
- const text = await res.text();
103
- outgoing.setHeader("Content-Length", Buffer.byteLength(text));
104
- outgoing.end(text);
145
+ const buffer = await res.arrayBuffer();
146
+ resHeaderRecord["content-length"] = buffer.byteLength;
147
+ outgoing.writeHead(res.status, resHeaderRecord);
148
+ outgoing.end(new Uint8Array(buffer));
105
149
  }
106
150
  } catch (e) {
107
151
  const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
@@ -113,6 +157,7 @@ var getRequestListener = (fetchCallback) => {
113
157
  }
114
158
  }
115
159
  } else {
160
+ outgoing.writeHead(res.status, resHeaderRecord);
116
161
  outgoing.end();
117
162
  }
118
163
  };
package/dist/listener.mjs CHANGED
@@ -1,6 +1,5 @@
1
1
  // src/listener.ts
2
2
  import { Readable } from "stream";
3
- import { pipeline } from "stream/promises";
4
3
 
5
4
  // src/globals.ts
6
5
  import crypto from "crypto";
@@ -18,6 +17,47 @@ global.fetch = (info, init) => {
18
17
  return webFetch(info, init);
19
18
  };
20
19
 
20
+ // src/utils.ts
21
+ function writeFromReadableStream(stream, writable) {
22
+ if (stream.locked) {
23
+ throw new TypeError("ReadableStream is locked.");
24
+ }
25
+ const reader = stream.getReader();
26
+ if (writable.destroyed) {
27
+ reader.cancel();
28
+ return;
29
+ }
30
+ writable.on("drain", onDrain);
31
+ writable.on("close", cancel);
32
+ writable.on("error", cancel);
33
+ reader.read().then(flow, cancel);
34
+ return reader.closed.finally(() => {
35
+ writable.off("close", cancel);
36
+ writable.off("error", cancel);
37
+ writable.off("drain", onDrain);
38
+ });
39
+ function cancel(error) {
40
+ reader.cancel(error).catch(() => {
41
+ });
42
+ if (error)
43
+ writable.destroy(error);
44
+ }
45
+ function onDrain() {
46
+ reader.read().then(flow, cancel);
47
+ }
48
+ function flow({ done, value }) {
49
+ try {
50
+ if (done) {
51
+ writable.end();
52
+ } else if (writable.write(value)) {
53
+ return reader.read().then(flow, cancel);
54
+ }
55
+ } catch (e) {
56
+ cancel(e);
57
+ }
58
+ }
59
+ }
60
+
21
61
  // src/listener.ts
22
62
  var regBuffer = /^no$/i;
23
63
  var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
@@ -40,7 +80,7 @@ var getRequestListener = (fetchCallback) => {
40
80
  }
41
81
  let res;
42
82
  try {
43
- res = await fetchCallback(new Request(url.toString(), init));
83
+ res = await fetchCallback(new Request(url, init));
44
84
  } catch (e) {
45
85
  res = new Response(null, { status: 500 });
46
86
  if (e instanceof Error) {
@@ -50,24 +90,28 @@ var getRequestListener = (fetchCallback) => {
50
90
  }
51
91
  }
52
92
  const resHeaderRecord = {};
93
+ const cookies = [];
53
94
  for (const [k, v] of res.headers) {
54
- resHeaderRecord[k] = v;
55
95
  if (k === "set-cookie") {
56
- outgoing.setHeader(k, res.headers.getSetCookie(k));
96
+ cookies.push(v);
57
97
  } else {
58
- outgoing.setHeader(k, v);
98
+ resHeaderRecord[k] = v;
59
99
  }
60
100
  }
61
- outgoing.statusCode = res.status;
101
+ if (cookies.length > 0) {
102
+ resHeaderRecord["set-cookie"] = cookies;
103
+ }
62
104
  if (res.body) {
63
105
  try {
64
106
  if (resHeaderRecord["transfer-encoding"] || resHeaderRecord["content-encoding"] || resHeaderRecord["content-length"] || // nginx buffering variant
65
- regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
66
- await pipeline(Readable.fromWeb(res.body), outgoing);
107
+ resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
108
+ outgoing.writeHead(res.status, resHeaderRecord);
109
+ await writeFromReadableStream(res.body, outgoing);
67
110
  } else {
68
- const text = await res.text();
69
- outgoing.setHeader("Content-Length", Buffer.byteLength(text));
70
- outgoing.end(text);
111
+ const buffer = await res.arrayBuffer();
112
+ resHeaderRecord["content-length"] = buffer.byteLength;
113
+ outgoing.writeHead(res.status, resHeaderRecord);
114
+ outgoing.end(new Uint8Array(buffer));
71
115
  }
72
116
  } catch (e) {
73
117
  const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
@@ -79,6 +123,7 @@ var getRequestListener = (fetchCallback) => {
79
123
  }
80
124
  }
81
125
  } else {
126
+ outgoing.writeHead(res.status, resHeaderRecord);
82
127
  outgoing.end();
83
128
  }
84
129
  };
package/dist/server.js CHANGED
@@ -38,7 +38,6 @@ var import_node_http = require("http");
38
38
 
39
39
  // src/listener.ts
40
40
  var import_node_stream = require("stream");
41
- var import_promises = require("stream/promises");
42
41
 
43
42
  // src/globals.ts
44
43
  var import_node_crypto = __toESM(require("crypto"));
@@ -56,6 +55,47 @@ global.fetch = (info, init) => {
56
55
  return webFetch(info, init);
57
56
  };
58
57
 
58
+ // src/utils.ts
59
+ function writeFromReadableStream(stream, writable) {
60
+ if (stream.locked) {
61
+ throw new TypeError("ReadableStream is locked.");
62
+ }
63
+ const reader = stream.getReader();
64
+ if (writable.destroyed) {
65
+ reader.cancel();
66
+ return;
67
+ }
68
+ writable.on("drain", onDrain);
69
+ writable.on("close", cancel);
70
+ writable.on("error", cancel);
71
+ reader.read().then(flow, cancel);
72
+ return reader.closed.finally(() => {
73
+ writable.off("close", cancel);
74
+ writable.off("error", cancel);
75
+ writable.off("drain", onDrain);
76
+ });
77
+ function cancel(error) {
78
+ reader.cancel(error).catch(() => {
79
+ });
80
+ if (error)
81
+ writable.destroy(error);
82
+ }
83
+ function onDrain() {
84
+ reader.read().then(flow, cancel);
85
+ }
86
+ function flow({ done, value }) {
87
+ try {
88
+ if (done) {
89
+ writable.end();
90
+ } else if (writable.write(value)) {
91
+ return reader.read().then(flow, cancel);
92
+ }
93
+ } catch (e) {
94
+ cancel(e);
95
+ }
96
+ }
97
+ }
98
+
59
99
  // src/listener.ts
60
100
  var regBuffer = /^no$/i;
61
101
  var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
@@ -78,7 +118,7 @@ var getRequestListener = (fetchCallback) => {
78
118
  }
79
119
  let res;
80
120
  try {
81
- res = await fetchCallback(new Request(url.toString(), init));
121
+ res = await fetchCallback(new Request(url, init));
82
122
  } catch (e) {
83
123
  res = new Response(null, { status: 500 });
84
124
  if (e instanceof Error) {
@@ -88,24 +128,28 @@ var getRequestListener = (fetchCallback) => {
88
128
  }
89
129
  }
90
130
  const resHeaderRecord = {};
131
+ const cookies = [];
91
132
  for (const [k, v] of res.headers) {
92
- resHeaderRecord[k] = v;
93
133
  if (k === "set-cookie") {
94
- outgoing.setHeader(k, res.headers.getSetCookie(k));
134
+ cookies.push(v);
95
135
  } else {
96
- outgoing.setHeader(k, v);
136
+ resHeaderRecord[k] = v;
97
137
  }
98
138
  }
99
- outgoing.statusCode = res.status;
139
+ if (cookies.length > 0) {
140
+ resHeaderRecord["set-cookie"] = cookies;
141
+ }
100
142
  if (res.body) {
101
143
  try {
102
144
  if (resHeaderRecord["transfer-encoding"] || resHeaderRecord["content-encoding"] || resHeaderRecord["content-length"] || // nginx buffering variant
103
- regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
104
- await (0, import_promises.pipeline)(import_node_stream.Readable.fromWeb(res.body), outgoing);
145
+ resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
146
+ outgoing.writeHead(res.status, resHeaderRecord);
147
+ await writeFromReadableStream(res.body, outgoing);
105
148
  } else {
106
- const text = await res.text();
107
- outgoing.setHeader("Content-Length", Buffer.byteLength(text));
108
- outgoing.end(text);
149
+ const buffer = await res.arrayBuffer();
150
+ resHeaderRecord["content-length"] = buffer.byteLength;
151
+ outgoing.writeHead(res.status, resHeaderRecord);
152
+ outgoing.end(new Uint8Array(buffer));
109
153
  }
110
154
  } catch (e) {
111
155
  const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
@@ -117,6 +161,7 @@ var getRequestListener = (fetchCallback) => {
117
161
  }
118
162
  }
119
163
  } else {
164
+ outgoing.writeHead(res.status, resHeaderRecord);
120
165
  outgoing.end();
121
166
  }
122
167
  };
package/dist/server.mjs CHANGED
@@ -3,7 +3,6 @@ import { createServer as createServerHTTP } from "http";
3
3
 
4
4
  // src/listener.ts
5
5
  import { Readable } from "stream";
6
- import { pipeline } from "stream/promises";
7
6
 
8
7
  // src/globals.ts
9
8
  import crypto from "crypto";
@@ -21,6 +20,47 @@ global.fetch = (info, init) => {
21
20
  return webFetch(info, init);
22
21
  };
23
22
 
23
+ // src/utils.ts
24
+ function writeFromReadableStream(stream, writable) {
25
+ if (stream.locked) {
26
+ throw new TypeError("ReadableStream is locked.");
27
+ }
28
+ const reader = stream.getReader();
29
+ if (writable.destroyed) {
30
+ reader.cancel();
31
+ return;
32
+ }
33
+ writable.on("drain", onDrain);
34
+ writable.on("close", cancel);
35
+ writable.on("error", cancel);
36
+ reader.read().then(flow, cancel);
37
+ return reader.closed.finally(() => {
38
+ writable.off("close", cancel);
39
+ writable.off("error", cancel);
40
+ writable.off("drain", onDrain);
41
+ });
42
+ function cancel(error) {
43
+ reader.cancel(error).catch(() => {
44
+ });
45
+ if (error)
46
+ writable.destroy(error);
47
+ }
48
+ function onDrain() {
49
+ reader.read().then(flow, cancel);
50
+ }
51
+ function flow({ done, value }) {
52
+ try {
53
+ if (done) {
54
+ writable.end();
55
+ } else if (writable.write(value)) {
56
+ return reader.read().then(flow, cancel);
57
+ }
58
+ } catch (e) {
59
+ cancel(e);
60
+ }
61
+ }
62
+ }
63
+
24
64
  // src/listener.ts
25
65
  var regBuffer = /^no$/i;
26
66
  var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
@@ -43,7 +83,7 @@ var getRequestListener = (fetchCallback) => {
43
83
  }
44
84
  let res;
45
85
  try {
46
- res = await fetchCallback(new Request(url.toString(), init));
86
+ res = await fetchCallback(new Request(url, init));
47
87
  } catch (e) {
48
88
  res = new Response(null, { status: 500 });
49
89
  if (e instanceof Error) {
@@ -53,24 +93,28 @@ var getRequestListener = (fetchCallback) => {
53
93
  }
54
94
  }
55
95
  const resHeaderRecord = {};
96
+ const cookies = [];
56
97
  for (const [k, v] of res.headers) {
57
- resHeaderRecord[k] = v;
58
98
  if (k === "set-cookie") {
59
- outgoing.setHeader(k, res.headers.getSetCookie(k));
99
+ cookies.push(v);
60
100
  } else {
61
- outgoing.setHeader(k, v);
101
+ resHeaderRecord[k] = v;
62
102
  }
63
103
  }
64
- outgoing.statusCode = res.status;
104
+ if (cookies.length > 0) {
105
+ resHeaderRecord["set-cookie"] = cookies;
106
+ }
65
107
  if (res.body) {
66
108
  try {
67
109
  if (resHeaderRecord["transfer-encoding"] || resHeaderRecord["content-encoding"] || resHeaderRecord["content-length"] || // nginx buffering variant
68
- regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
69
- await pipeline(Readable.fromWeb(res.body), outgoing);
110
+ resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
111
+ outgoing.writeHead(res.status, resHeaderRecord);
112
+ await writeFromReadableStream(res.body, outgoing);
70
113
  } else {
71
- const text = await res.text();
72
- outgoing.setHeader("Content-Length", Buffer.byteLength(text));
73
- outgoing.end(text);
114
+ const buffer = await res.arrayBuffer();
115
+ resHeaderRecord["content-length"] = buffer.byteLength;
116
+ outgoing.writeHead(res.status, resHeaderRecord);
117
+ outgoing.end(new Uint8Array(buffer));
74
118
  }
75
119
  } catch (e) {
76
120
  const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
@@ -82,6 +126,7 @@ var getRequestListener = (fetchCallback) => {
82
126
  }
83
127
  }
84
128
  } else {
129
+ outgoing.writeHead(res.status, resHeaderRecord);
85
130
  outgoing.end();
86
131
  }
87
132
  };
@@ -0,0 +1,5 @@
1
+ import { Writable } from 'node:stream';
2
+
3
+ declare function writeFromReadableStream(stream: ReadableStream<Uint8Array>, writable: Writable): Promise<undefined> | undefined;
4
+
5
+ export { writeFromReadableStream };
@@ -0,0 +1,5 @@
1
+ import { Writable } from 'node:stream';
2
+
3
+ declare function writeFromReadableStream(stream: ReadableStream<Uint8Array>, writable: Writable): Promise<undefined> | undefined;
4
+
5
+ export { writeFromReadableStream };
package/dist/utils.js ADDED
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/utils.ts
21
+ var utils_exports = {};
22
+ __export(utils_exports, {
23
+ writeFromReadableStream: () => writeFromReadableStream
24
+ });
25
+ module.exports = __toCommonJS(utils_exports);
26
+ function writeFromReadableStream(stream, writable) {
27
+ if (stream.locked) {
28
+ throw new TypeError("ReadableStream is locked.");
29
+ }
30
+ const reader = stream.getReader();
31
+ if (writable.destroyed) {
32
+ reader.cancel();
33
+ return;
34
+ }
35
+ writable.on("drain", onDrain);
36
+ writable.on("close", cancel);
37
+ writable.on("error", cancel);
38
+ reader.read().then(flow, cancel);
39
+ return reader.closed.finally(() => {
40
+ writable.off("close", cancel);
41
+ writable.off("error", cancel);
42
+ writable.off("drain", onDrain);
43
+ });
44
+ function cancel(error) {
45
+ reader.cancel(error).catch(() => {
46
+ });
47
+ if (error)
48
+ writable.destroy(error);
49
+ }
50
+ function onDrain() {
51
+ reader.read().then(flow, cancel);
52
+ }
53
+ function flow({ done, value }) {
54
+ try {
55
+ if (done) {
56
+ writable.end();
57
+ } else if (writable.write(value)) {
58
+ return reader.read().then(flow, cancel);
59
+ }
60
+ } catch (e) {
61
+ cancel(e);
62
+ }
63
+ }
64
+ }
65
+ // Annotate the CommonJS export names for ESM import in node:
66
+ 0 && (module.exports = {
67
+ writeFromReadableStream
68
+ });
package/dist/utils.mjs ADDED
@@ -0,0 +1,43 @@
1
+ // src/utils.ts
2
+ function writeFromReadableStream(stream, writable) {
3
+ if (stream.locked) {
4
+ throw new TypeError("ReadableStream is locked.");
5
+ }
6
+ const reader = stream.getReader();
7
+ if (writable.destroyed) {
8
+ reader.cancel();
9
+ return;
10
+ }
11
+ writable.on("drain", onDrain);
12
+ writable.on("close", cancel);
13
+ writable.on("error", cancel);
14
+ reader.read().then(flow, cancel);
15
+ return reader.closed.finally(() => {
16
+ writable.off("close", cancel);
17
+ writable.off("error", cancel);
18
+ writable.off("drain", onDrain);
19
+ });
20
+ function cancel(error) {
21
+ reader.cancel(error).catch(() => {
22
+ });
23
+ if (error)
24
+ writable.destroy(error);
25
+ }
26
+ function onDrain() {
27
+ reader.read().then(flow, cancel);
28
+ }
29
+ function flow({ done, value }) {
30
+ try {
31
+ if (done) {
32
+ writable.end();
33
+ } else if (writable.write(value)) {
34
+ return reader.read().then(flow, cancel);
35
+ }
36
+ } catch (e) {
37
+ cancel(e);
38
+ }
39
+ }
40
+ }
41
+ export {
42
+ writeFromReadableStream
43
+ };
package/dist/vercel.js CHANGED
@@ -36,7 +36,6 @@ module.exports = __toCommonJS(vercel_exports);
36
36
 
37
37
  // src/listener.ts
38
38
  var import_node_stream = require("stream");
39
- var import_promises = require("stream/promises");
40
39
 
41
40
  // src/globals.ts
42
41
  var import_node_crypto = __toESM(require("crypto"));
@@ -54,6 +53,47 @@ global.fetch = (info, init) => {
54
53
  return webFetch(info, init);
55
54
  };
56
55
 
56
+ // src/utils.ts
57
+ function writeFromReadableStream(stream, writable) {
58
+ if (stream.locked) {
59
+ throw new TypeError("ReadableStream is locked.");
60
+ }
61
+ const reader = stream.getReader();
62
+ if (writable.destroyed) {
63
+ reader.cancel();
64
+ return;
65
+ }
66
+ writable.on("drain", onDrain);
67
+ writable.on("close", cancel);
68
+ writable.on("error", cancel);
69
+ reader.read().then(flow, cancel);
70
+ return reader.closed.finally(() => {
71
+ writable.off("close", cancel);
72
+ writable.off("error", cancel);
73
+ writable.off("drain", onDrain);
74
+ });
75
+ function cancel(error) {
76
+ reader.cancel(error).catch(() => {
77
+ });
78
+ if (error)
79
+ writable.destroy(error);
80
+ }
81
+ function onDrain() {
82
+ reader.read().then(flow, cancel);
83
+ }
84
+ function flow({ done, value }) {
85
+ try {
86
+ if (done) {
87
+ writable.end();
88
+ } else if (writable.write(value)) {
89
+ return reader.read().then(flow, cancel);
90
+ }
91
+ } catch (e) {
92
+ cancel(e);
93
+ }
94
+ }
95
+ }
96
+
57
97
  // src/listener.ts
58
98
  var regBuffer = /^no$/i;
59
99
  var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
@@ -76,7 +116,7 @@ var getRequestListener = (fetchCallback) => {
76
116
  }
77
117
  let res;
78
118
  try {
79
- res = await fetchCallback(new Request(url.toString(), init));
119
+ res = await fetchCallback(new Request(url, init));
80
120
  } catch (e) {
81
121
  res = new Response(null, { status: 500 });
82
122
  if (e instanceof Error) {
@@ -86,24 +126,28 @@ var getRequestListener = (fetchCallback) => {
86
126
  }
87
127
  }
88
128
  const resHeaderRecord = {};
129
+ const cookies = [];
89
130
  for (const [k, v] of res.headers) {
90
- resHeaderRecord[k] = v;
91
131
  if (k === "set-cookie") {
92
- outgoing.setHeader(k, res.headers.getSetCookie(k));
132
+ cookies.push(v);
93
133
  } else {
94
- outgoing.setHeader(k, v);
134
+ resHeaderRecord[k] = v;
95
135
  }
96
136
  }
97
- outgoing.statusCode = res.status;
137
+ if (cookies.length > 0) {
138
+ resHeaderRecord["set-cookie"] = cookies;
139
+ }
98
140
  if (res.body) {
99
141
  try {
100
142
  if (resHeaderRecord["transfer-encoding"] || resHeaderRecord["content-encoding"] || resHeaderRecord["content-length"] || // nginx buffering variant
101
- regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
102
- await (0, import_promises.pipeline)(import_node_stream.Readable.fromWeb(res.body), outgoing);
143
+ resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
144
+ outgoing.writeHead(res.status, resHeaderRecord);
145
+ await writeFromReadableStream(res.body, outgoing);
103
146
  } else {
104
- const text = await res.text();
105
- outgoing.setHeader("Content-Length", Buffer.byteLength(text));
106
- outgoing.end(text);
147
+ const buffer = await res.arrayBuffer();
148
+ resHeaderRecord["content-length"] = buffer.byteLength;
149
+ outgoing.writeHead(res.status, resHeaderRecord);
150
+ outgoing.end(new Uint8Array(buffer));
107
151
  }
108
152
  } catch (e) {
109
153
  const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
@@ -115,6 +159,7 @@ var getRequestListener = (fetchCallback) => {
115
159
  }
116
160
  }
117
161
  } else {
162
+ outgoing.writeHead(res.status, resHeaderRecord);
118
163
  outgoing.end();
119
164
  }
120
165
  };
package/dist/vercel.mjs CHANGED
@@ -1,6 +1,5 @@
1
1
  // src/listener.ts
2
2
  import { Readable } from "stream";
3
- import { pipeline } from "stream/promises";
4
3
 
5
4
  // src/globals.ts
6
5
  import crypto from "crypto";
@@ -18,6 +17,47 @@ global.fetch = (info, init) => {
18
17
  return webFetch(info, init);
19
18
  };
20
19
 
20
+ // src/utils.ts
21
+ function writeFromReadableStream(stream, writable) {
22
+ if (stream.locked) {
23
+ throw new TypeError("ReadableStream is locked.");
24
+ }
25
+ const reader = stream.getReader();
26
+ if (writable.destroyed) {
27
+ reader.cancel();
28
+ return;
29
+ }
30
+ writable.on("drain", onDrain);
31
+ writable.on("close", cancel);
32
+ writable.on("error", cancel);
33
+ reader.read().then(flow, cancel);
34
+ return reader.closed.finally(() => {
35
+ writable.off("close", cancel);
36
+ writable.off("error", cancel);
37
+ writable.off("drain", onDrain);
38
+ });
39
+ function cancel(error) {
40
+ reader.cancel(error).catch(() => {
41
+ });
42
+ if (error)
43
+ writable.destroy(error);
44
+ }
45
+ function onDrain() {
46
+ reader.read().then(flow, cancel);
47
+ }
48
+ function flow({ done, value }) {
49
+ try {
50
+ if (done) {
51
+ writable.end();
52
+ } else if (writable.write(value)) {
53
+ return reader.read().then(flow, cancel);
54
+ }
55
+ } catch (e) {
56
+ cancel(e);
57
+ }
58
+ }
59
+ }
60
+
21
61
  // src/listener.ts
22
62
  var regBuffer = /^no$/i;
23
63
  var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
@@ -40,7 +80,7 @@ var getRequestListener = (fetchCallback) => {
40
80
  }
41
81
  let res;
42
82
  try {
43
- res = await fetchCallback(new Request(url.toString(), init));
83
+ res = await fetchCallback(new Request(url, init));
44
84
  } catch (e) {
45
85
  res = new Response(null, { status: 500 });
46
86
  if (e instanceof Error) {
@@ -50,24 +90,28 @@ var getRequestListener = (fetchCallback) => {
50
90
  }
51
91
  }
52
92
  const resHeaderRecord = {};
93
+ const cookies = [];
53
94
  for (const [k, v] of res.headers) {
54
- resHeaderRecord[k] = v;
55
95
  if (k === "set-cookie") {
56
- outgoing.setHeader(k, res.headers.getSetCookie(k));
96
+ cookies.push(v);
57
97
  } else {
58
- outgoing.setHeader(k, v);
98
+ resHeaderRecord[k] = v;
59
99
  }
60
100
  }
61
- outgoing.statusCode = res.status;
101
+ if (cookies.length > 0) {
102
+ resHeaderRecord["set-cookie"] = cookies;
103
+ }
62
104
  if (res.body) {
63
105
  try {
64
106
  if (resHeaderRecord["transfer-encoding"] || resHeaderRecord["content-encoding"] || resHeaderRecord["content-length"] || // nginx buffering variant
65
- regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
66
- await pipeline(Readable.fromWeb(res.body), outgoing);
107
+ resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
108
+ outgoing.writeHead(res.status, resHeaderRecord);
109
+ await writeFromReadableStream(res.body, outgoing);
67
110
  } else {
68
- const text = await res.text();
69
- outgoing.setHeader("Content-Length", Buffer.byteLength(text));
70
- outgoing.end(text);
111
+ const buffer = await res.arrayBuffer();
112
+ resHeaderRecord["content-length"] = buffer.byteLength;
113
+ outgoing.writeHead(res.status, resHeaderRecord);
114
+ outgoing.end(new Uint8Array(buffer));
71
115
  }
72
116
  } catch (e) {
73
117
  const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
@@ -79,6 +123,7 @@ var getRequestListener = (fetchCallback) => {
79
123
  }
80
124
  }
81
125
  } else {
126
+ outgoing.writeHead(res.status, resHeaderRecord);
82
127
  outgoing.end();
83
128
  }
84
129
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hono/node-server",
3
- "version": "1.2.1",
3
+ "version": "1.2.2",
4
4
  "description": "Node.js Adapter for Hono",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",