@hono/node-server 1.2.1 → 1.2.3

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,46 @@ 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
+ } else if (writable.destroyed) {
66
+ stream.cancel();
67
+ return;
68
+ }
69
+ const reader = stream.getReader();
70
+ writable.on("close", cancel);
71
+ writable.on("error", cancel);
72
+ reader.read().then(flow, cancel);
73
+ return reader.closed.finally(() => {
74
+ writable.off("close", cancel);
75
+ writable.off("error", cancel);
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
+ writable.once("drain", onDrain);
92
+ } else {
93
+ return reader.read().then(flow, cancel);
94
+ }
95
+ } catch (e) {
96
+ cancel(e);
97
+ }
98
+ }
99
+ }
100
+
62
101
  // src/listener.ts
63
102
  var regBuffer = /^no$/i;
64
103
  var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
@@ -81,7 +120,7 @@ var getRequestListener = (fetchCallback) => {
81
120
  }
82
121
  let res;
83
122
  try {
84
- res = await fetchCallback(new Request(url.toString(), init));
123
+ res = await fetchCallback(new Request(url, init));
85
124
  } catch (e) {
86
125
  res = new Response(null, { status: 500 });
87
126
  if (e instanceof Error) {
@@ -91,24 +130,28 @@ var getRequestListener = (fetchCallback) => {
91
130
  }
92
131
  }
93
132
  const resHeaderRecord = {};
133
+ const cookies = [];
94
134
  for (const [k, v] of res.headers) {
95
- resHeaderRecord[k] = v;
96
135
  if (k === "set-cookie") {
97
- outgoing.setHeader(k, res.headers.getSetCookie(k));
136
+ cookies.push(v);
98
137
  } else {
99
- outgoing.setHeader(k, v);
138
+ resHeaderRecord[k] = v;
100
139
  }
101
140
  }
102
- outgoing.statusCode = res.status;
141
+ if (cookies.length > 0) {
142
+ resHeaderRecord["set-cookie"] = cookies;
143
+ }
103
144
  if (res.body) {
104
145
  try {
105
146
  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);
147
+ resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
148
+ outgoing.writeHead(res.status, resHeaderRecord);
149
+ await writeFromReadableStream(res.body, outgoing);
108
150
  } else {
109
- const text = await res.text();
110
- outgoing.setHeader("Content-Length", Buffer.byteLength(text));
111
- outgoing.end(text);
151
+ const buffer = await res.arrayBuffer();
152
+ resHeaderRecord["content-length"] = buffer.byteLength;
153
+ outgoing.writeHead(res.status, resHeaderRecord);
154
+ outgoing.end(new Uint8Array(buffer));
112
155
  }
113
156
  } catch (e) {
114
157
  const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
@@ -120,6 +163,7 @@ var getRequestListener = (fetchCallback) => {
120
163
  }
121
164
  }
122
165
  } else {
166
+ outgoing.writeHead(res.status, resHeaderRecord);
123
167
  outgoing.end();
124
168
  }
125
169
  };
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,46 @@ 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
+ } else if (writable.destroyed) {
28
+ stream.cancel();
29
+ return;
30
+ }
31
+ const reader = stream.getReader();
32
+ writable.on("close", cancel);
33
+ writable.on("error", cancel);
34
+ reader.read().then(flow, cancel);
35
+ return reader.closed.finally(() => {
36
+ writable.off("close", cancel);
37
+ writable.off("error", cancel);
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
+ writable.once("drain", onDrain);
54
+ } else {
55
+ return reader.read().then(flow, cancel);
56
+ }
57
+ } catch (e) {
58
+ cancel(e);
59
+ }
60
+ }
61
+ }
62
+
24
63
  // src/listener.ts
25
64
  var regBuffer = /^no$/i;
26
65
  var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
@@ -43,7 +82,7 @@ var getRequestListener = (fetchCallback) => {
43
82
  }
44
83
  let res;
45
84
  try {
46
- res = await fetchCallback(new Request(url.toString(), init));
85
+ res = await fetchCallback(new Request(url, init));
47
86
  } catch (e) {
48
87
  res = new Response(null, { status: 500 });
49
88
  if (e instanceof Error) {
@@ -53,24 +92,28 @@ var getRequestListener = (fetchCallback) => {
53
92
  }
54
93
  }
55
94
  const resHeaderRecord = {};
95
+ const cookies = [];
56
96
  for (const [k, v] of res.headers) {
57
- resHeaderRecord[k] = v;
58
97
  if (k === "set-cookie") {
59
- outgoing.setHeader(k, res.headers.getSetCookie(k));
98
+ cookies.push(v);
60
99
  } else {
61
- outgoing.setHeader(k, v);
100
+ resHeaderRecord[k] = v;
62
101
  }
63
102
  }
64
- outgoing.statusCode = res.status;
103
+ if (cookies.length > 0) {
104
+ resHeaderRecord["set-cookie"] = cookies;
105
+ }
65
106
  if (res.body) {
66
107
  try {
67
108
  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);
109
+ resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
110
+ outgoing.writeHead(res.status, resHeaderRecord);
111
+ await writeFromReadableStream(res.body, outgoing);
70
112
  } else {
71
- const text = await res.text();
72
- outgoing.setHeader("Content-Length", Buffer.byteLength(text));
73
- outgoing.end(text);
113
+ const buffer = await res.arrayBuffer();
114
+ resHeaderRecord["content-length"] = buffer.byteLength;
115
+ outgoing.writeHead(res.status, resHeaderRecord);
116
+ outgoing.end(new Uint8Array(buffer));
74
117
  }
75
118
  } catch (e) {
76
119
  const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
@@ -82,6 +125,7 @@ var getRequestListener = (fetchCallback) => {
82
125
  }
83
126
  }
84
127
  } else {
128
+ outgoing.writeHead(res.status, resHeaderRecord);
85
129
  outgoing.end();
86
130
  }
87
131
  };
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,46 @@ 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
+ } else if (writable.destroyed) {
59
+ stream.cancel();
60
+ return;
61
+ }
62
+ const reader = stream.getReader();
63
+ writable.on("close", cancel);
64
+ writable.on("error", cancel);
65
+ reader.read().then(flow, cancel);
66
+ return reader.closed.finally(() => {
67
+ writable.off("close", cancel);
68
+ writable.off("error", cancel);
69
+ });
70
+ function cancel(error) {
71
+ reader.cancel(error).catch(() => {
72
+ });
73
+ if (error)
74
+ writable.destroy(error);
75
+ }
76
+ function onDrain() {
77
+ reader.read().then(flow, cancel);
78
+ }
79
+ function flow({ done, value }) {
80
+ try {
81
+ if (done) {
82
+ writable.end();
83
+ } else if (!writable.write(value)) {
84
+ writable.once("drain", onDrain);
85
+ } else {
86
+ return reader.read().then(flow, cancel);
87
+ }
88
+ } catch (e) {
89
+ cancel(e);
90
+ }
91
+ }
92
+ }
93
+
55
94
  // src/listener.ts
56
95
  var regBuffer = /^no$/i;
57
96
  var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
@@ -74,7 +113,7 @@ var getRequestListener = (fetchCallback) => {
74
113
  }
75
114
  let res;
76
115
  try {
77
- res = await fetchCallback(new Request(url.toString(), init));
116
+ res = await fetchCallback(new Request(url, init));
78
117
  } catch (e) {
79
118
  res = new Response(null, { status: 500 });
80
119
  if (e instanceof Error) {
@@ -84,24 +123,28 @@ var getRequestListener = (fetchCallback) => {
84
123
  }
85
124
  }
86
125
  const resHeaderRecord = {};
126
+ const cookies = [];
87
127
  for (const [k, v] of res.headers) {
88
- resHeaderRecord[k] = v;
89
128
  if (k === "set-cookie") {
90
- outgoing.setHeader(k, res.headers.getSetCookie(k));
129
+ cookies.push(v);
91
130
  } else {
92
- outgoing.setHeader(k, v);
131
+ resHeaderRecord[k] = v;
93
132
  }
94
133
  }
95
- outgoing.statusCode = res.status;
134
+ if (cookies.length > 0) {
135
+ resHeaderRecord["set-cookie"] = cookies;
136
+ }
96
137
  if (res.body) {
97
138
  try {
98
139
  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);
140
+ resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
141
+ outgoing.writeHead(res.status, resHeaderRecord);
142
+ await writeFromReadableStream(res.body, outgoing);
101
143
  } else {
102
- const text = await res.text();
103
- outgoing.setHeader("Content-Length", Buffer.byteLength(text));
104
- outgoing.end(text);
144
+ const buffer = await res.arrayBuffer();
145
+ resHeaderRecord["content-length"] = buffer.byteLength;
146
+ outgoing.writeHead(res.status, resHeaderRecord);
147
+ outgoing.end(new Uint8Array(buffer));
105
148
  }
106
149
  } catch (e) {
107
150
  const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
@@ -113,6 +156,7 @@ var getRequestListener = (fetchCallback) => {
113
156
  }
114
157
  }
115
158
  } else {
159
+ outgoing.writeHead(res.status, resHeaderRecord);
116
160
  outgoing.end();
117
161
  }
118
162
  };
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,46 @@ 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
+ } else if (writable.destroyed) {
25
+ stream.cancel();
26
+ return;
27
+ }
28
+ const reader = stream.getReader();
29
+ writable.on("close", cancel);
30
+ writable.on("error", cancel);
31
+ reader.read().then(flow, cancel);
32
+ return reader.closed.finally(() => {
33
+ writable.off("close", cancel);
34
+ writable.off("error", cancel);
35
+ });
36
+ function cancel(error) {
37
+ reader.cancel(error).catch(() => {
38
+ });
39
+ if (error)
40
+ writable.destroy(error);
41
+ }
42
+ function onDrain() {
43
+ reader.read().then(flow, cancel);
44
+ }
45
+ function flow({ done, value }) {
46
+ try {
47
+ if (done) {
48
+ writable.end();
49
+ } else if (!writable.write(value)) {
50
+ writable.once("drain", onDrain);
51
+ } else {
52
+ return reader.read().then(flow, cancel);
53
+ }
54
+ } catch (e) {
55
+ cancel(e);
56
+ }
57
+ }
58
+ }
59
+
21
60
  // src/listener.ts
22
61
  var regBuffer = /^no$/i;
23
62
  var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
@@ -40,7 +79,7 @@ var getRequestListener = (fetchCallback) => {
40
79
  }
41
80
  let res;
42
81
  try {
43
- res = await fetchCallback(new Request(url.toString(), init));
82
+ res = await fetchCallback(new Request(url, init));
44
83
  } catch (e) {
45
84
  res = new Response(null, { status: 500 });
46
85
  if (e instanceof Error) {
@@ -50,24 +89,28 @@ var getRequestListener = (fetchCallback) => {
50
89
  }
51
90
  }
52
91
  const resHeaderRecord = {};
92
+ const cookies = [];
53
93
  for (const [k, v] of res.headers) {
54
- resHeaderRecord[k] = v;
55
94
  if (k === "set-cookie") {
56
- outgoing.setHeader(k, res.headers.getSetCookie(k));
95
+ cookies.push(v);
57
96
  } else {
58
- outgoing.setHeader(k, v);
97
+ resHeaderRecord[k] = v;
59
98
  }
60
99
  }
61
- outgoing.statusCode = res.status;
100
+ if (cookies.length > 0) {
101
+ resHeaderRecord["set-cookie"] = cookies;
102
+ }
62
103
  if (res.body) {
63
104
  try {
64
105
  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);
106
+ resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
107
+ outgoing.writeHead(res.status, resHeaderRecord);
108
+ await writeFromReadableStream(res.body, outgoing);
67
109
  } else {
68
- const text = await res.text();
69
- outgoing.setHeader("Content-Length", Buffer.byteLength(text));
70
- outgoing.end(text);
110
+ const buffer = await res.arrayBuffer();
111
+ resHeaderRecord["content-length"] = buffer.byteLength;
112
+ outgoing.writeHead(res.status, resHeaderRecord);
113
+ outgoing.end(new Uint8Array(buffer));
71
114
  }
72
115
  } catch (e) {
73
116
  const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
@@ -79,6 +122,7 @@ var getRequestListener = (fetchCallback) => {
79
122
  }
80
123
  }
81
124
  } else {
125
+ outgoing.writeHead(res.status, resHeaderRecord);
82
126
  outgoing.end();
83
127
  }
84
128
  };
@@ -191,11 +191,9 @@ var serveStatic = (options = { root: "" }) => {
191
191
  }
192
192
  c.header("Accept-Ranges", "bytes");
193
193
  c.header("Date", stat.birthtime.toUTCString());
194
- let start = 0;
195
- let end = stat.size - 1;
196
- const parts = range.replace(/bytes=/, "").split("-");
197
- start = parseInt(parts[0], 10);
198
- end = parts[1] ? parseInt(parts[1], 10) : end;
194
+ const parts = range.replace(/bytes=/, "").split("-", 2);
195
+ const start = parts[0] ? parseInt(parts[0], 10) : 0;
196
+ let end = parts[1] ? parseInt(parts[1], 10) : stat.size - 1;
199
197
  if (size < end - start + 1) {
200
198
  end = size - 1;
201
199
  }
@@ -167,11 +167,9 @@ var serveStatic = (options = { root: "" }) => {
167
167
  }
168
168
  c.header("Accept-Ranges", "bytes");
169
169
  c.header("Date", stat.birthtime.toUTCString());
170
- let start = 0;
171
- let end = stat.size - 1;
172
- const parts = range.replace(/bytes=/, "").split("-");
173
- start = parseInt(parts[0], 10);
174
- end = parts[1] ? parseInt(parts[1], 10) : end;
170
+ const parts = range.replace(/bytes=/, "").split("-", 2);
171
+ const start = parts[0] ? parseInt(parts[0], 10) : 0;
172
+ let end = parts[1] ? parseInt(parts[1], 10) : stat.size - 1;
175
173
  if (size < end - start + 1) {
176
174
  end = size - 1;
177
175
  }
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,46 @@ 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
+ } else if (writable.destroyed) {
63
+ stream.cancel();
64
+ return;
65
+ }
66
+ const reader = stream.getReader();
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
+ });
74
+ function cancel(error) {
75
+ reader.cancel(error).catch(() => {
76
+ });
77
+ if (error)
78
+ writable.destroy(error);
79
+ }
80
+ function onDrain() {
81
+ reader.read().then(flow, cancel);
82
+ }
83
+ function flow({ done, value }) {
84
+ try {
85
+ if (done) {
86
+ writable.end();
87
+ } else if (!writable.write(value)) {
88
+ writable.once("drain", onDrain);
89
+ } else {
90
+ return reader.read().then(flow, cancel);
91
+ }
92
+ } catch (e) {
93
+ cancel(e);
94
+ }
95
+ }
96
+ }
97
+
59
98
  // src/listener.ts
60
99
  var regBuffer = /^no$/i;
61
100
  var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
@@ -78,7 +117,7 @@ var getRequestListener = (fetchCallback) => {
78
117
  }
79
118
  let res;
80
119
  try {
81
- res = await fetchCallback(new Request(url.toString(), init));
120
+ res = await fetchCallback(new Request(url, init));
82
121
  } catch (e) {
83
122
  res = new Response(null, { status: 500 });
84
123
  if (e instanceof Error) {
@@ -88,24 +127,28 @@ var getRequestListener = (fetchCallback) => {
88
127
  }
89
128
  }
90
129
  const resHeaderRecord = {};
130
+ const cookies = [];
91
131
  for (const [k, v] of res.headers) {
92
- resHeaderRecord[k] = v;
93
132
  if (k === "set-cookie") {
94
- outgoing.setHeader(k, res.headers.getSetCookie(k));
133
+ cookies.push(v);
95
134
  } else {
96
- outgoing.setHeader(k, v);
135
+ resHeaderRecord[k] = v;
97
136
  }
98
137
  }
99
- outgoing.statusCode = res.status;
138
+ if (cookies.length > 0) {
139
+ resHeaderRecord["set-cookie"] = cookies;
140
+ }
100
141
  if (res.body) {
101
142
  try {
102
143
  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);
144
+ resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
145
+ outgoing.writeHead(res.status, resHeaderRecord);
146
+ await writeFromReadableStream(res.body, outgoing);
105
147
  } else {
106
- const text = await res.text();
107
- outgoing.setHeader("Content-Length", Buffer.byteLength(text));
108
- outgoing.end(text);
148
+ const buffer = await res.arrayBuffer();
149
+ resHeaderRecord["content-length"] = buffer.byteLength;
150
+ outgoing.writeHead(res.status, resHeaderRecord);
151
+ outgoing.end(new Uint8Array(buffer));
109
152
  }
110
153
  } catch (e) {
111
154
  const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
@@ -117,6 +160,7 @@ var getRequestListener = (fetchCallback) => {
117
160
  }
118
161
  }
119
162
  } else {
163
+ outgoing.writeHead(res.status, resHeaderRecord);
120
164
  outgoing.end();
121
165
  }
122
166
  };
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,46 @@ 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
+ } else if (writable.destroyed) {
28
+ stream.cancel();
29
+ return;
30
+ }
31
+ const reader = stream.getReader();
32
+ writable.on("close", cancel);
33
+ writable.on("error", cancel);
34
+ reader.read().then(flow, cancel);
35
+ return reader.closed.finally(() => {
36
+ writable.off("close", cancel);
37
+ writable.off("error", cancel);
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
+ writable.once("drain", onDrain);
54
+ } else {
55
+ return reader.read().then(flow, cancel);
56
+ }
57
+ } catch (e) {
58
+ cancel(e);
59
+ }
60
+ }
61
+ }
62
+
24
63
  // src/listener.ts
25
64
  var regBuffer = /^no$/i;
26
65
  var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
@@ -43,7 +82,7 @@ var getRequestListener = (fetchCallback) => {
43
82
  }
44
83
  let res;
45
84
  try {
46
- res = await fetchCallback(new Request(url.toString(), init));
85
+ res = await fetchCallback(new Request(url, init));
47
86
  } catch (e) {
48
87
  res = new Response(null, { status: 500 });
49
88
  if (e instanceof Error) {
@@ -53,24 +92,28 @@ var getRequestListener = (fetchCallback) => {
53
92
  }
54
93
  }
55
94
  const resHeaderRecord = {};
95
+ const cookies = [];
56
96
  for (const [k, v] of res.headers) {
57
- resHeaderRecord[k] = v;
58
97
  if (k === "set-cookie") {
59
- outgoing.setHeader(k, res.headers.getSetCookie(k));
98
+ cookies.push(v);
60
99
  } else {
61
- outgoing.setHeader(k, v);
100
+ resHeaderRecord[k] = v;
62
101
  }
63
102
  }
64
- outgoing.statusCode = res.status;
103
+ if (cookies.length > 0) {
104
+ resHeaderRecord["set-cookie"] = cookies;
105
+ }
65
106
  if (res.body) {
66
107
  try {
67
108
  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);
109
+ resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
110
+ outgoing.writeHead(res.status, resHeaderRecord);
111
+ await writeFromReadableStream(res.body, outgoing);
70
112
  } else {
71
- const text = await res.text();
72
- outgoing.setHeader("Content-Length", Buffer.byteLength(text));
73
- outgoing.end(text);
113
+ const buffer = await res.arrayBuffer();
114
+ resHeaderRecord["content-length"] = buffer.byteLength;
115
+ outgoing.writeHead(res.status, resHeaderRecord);
116
+ outgoing.end(new Uint8Array(buffer));
74
117
  }
75
118
  } catch (e) {
76
119
  const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
@@ -82,6 +125,7 @@ var getRequestListener = (fetchCallback) => {
82
125
  }
83
126
  }
84
127
  } else {
128
+ outgoing.writeHead(res.status, resHeaderRecord);
85
129
  outgoing.end();
86
130
  }
87
131
  };
@@ -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,67 @@
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
+ } else if (writable.destroyed) {
30
+ stream.cancel();
31
+ return;
32
+ }
33
+ const reader = stream.getReader();
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
+ });
41
+ function cancel(error) {
42
+ reader.cancel(error).catch(() => {
43
+ });
44
+ if (error)
45
+ writable.destroy(error);
46
+ }
47
+ function onDrain() {
48
+ reader.read().then(flow, cancel);
49
+ }
50
+ function flow({ done, value }) {
51
+ try {
52
+ if (done) {
53
+ writable.end();
54
+ } else if (!writable.write(value)) {
55
+ writable.once("drain", onDrain);
56
+ } else {
57
+ return reader.read().then(flow, cancel);
58
+ }
59
+ } catch (e) {
60
+ cancel(e);
61
+ }
62
+ }
63
+ }
64
+ // Annotate the CommonJS export names for ESM import in node:
65
+ 0 && (module.exports = {
66
+ writeFromReadableStream
67
+ });
package/dist/utils.mjs ADDED
@@ -0,0 +1,42 @@
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
+ stream.cancel();
7
+ return;
8
+ }
9
+ const reader = stream.getReader();
10
+ writable.on("close", cancel);
11
+ writable.on("error", cancel);
12
+ reader.read().then(flow, cancel);
13
+ return reader.closed.finally(() => {
14
+ writable.off("close", cancel);
15
+ writable.off("error", cancel);
16
+ });
17
+ function cancel(error) {
18
+ reader.cancel(error).catch(() => {
19
+ });
20
+ if (error)
21
+ writable.destroy(error);
22
+ }
23
+ function onDrain() {
24
+ reader.read().then(flow, cancel);
25
+ }
26
+ function flow({ done, value }) {
27
+ try {
28
+ if (done) {
29
+ writable.end();
30
+ } else if (!writable.write(value)) {
31
+ writable.once("drain", onDrain);
32
+ } else {
33
+ return reader.read().then(flow, cancel);
34
+ }
35
+ } catch (e) {
36
+ cancel(e);
37
+ }
38
+ }
39
+ }
40
+ export {
41
+ writeFromReadableStream
42
+ };
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,46 @@ 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
+ } else if (writable.destroyed) {
61
+ stream.cancel();
62
+ return;
63
+ }
64
+ const reader = stream.getReader();
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
+ });
72
+ function cancel(error) {
73
+ reader.cancel(error).catch(() => {
74
+ });
75
+ if (error)
76
+ writable.destroy(error);
77
+ }
78
+ function onDrain() {
79
+ reader.read().then(flow, cancel);
80
+ }
81
+ function flow({ done, value }) {
82
+ try {
83
+ if (done) {
84
+ writable.end();
85
+ } else if (!writable.write(value)) {
86
+ writable.once("drain", onDrain);
87
+ } else {
88
+ return reader.read().then(flow, cancel);
89
+ }
90
+ } catch (e) {
91
+ cancel(e);
92
+ }
93
+ }
94
+ }
95
+
57
96
  // src/listener.ts
58
97
  var regBuffer = /^no$/i;
59
98
  var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
@@ -76,7 +115,7 @@ var getRequestListener = (fetchCallback) => {
76
115
  }
77
116
  let res;
78
117
  try {
79
- res = await fetchCallback(new Request(url.toString(), init));
118
+ res = await fetchCallback(new Request(url, init));
80
119
  } catch (e) {
81
120
  res = new Response(null, { status: 500 });
82
121
  if (e instanceof Error) {
@@ -86,24 +125,28 @@ var getRequestListener = (fetchCallback) => {
86
125
  }
87
126
  }
88
127
  const resHeaderRecord = {};
128
+ const cookies = [];
89
129
  for (const [k, v] of res.headers) {
90
- resHeaderRecord[k] = v;
91
130
  if (k === "set-cookie") {
92
- outgoing.setHeader(k, res.headers.getSetCookie(k));
131
+ cookies.push(v);
93
132
  } else {
94
- outgoing.setHeader(k, v);
133
+ resHeaderRecord[k] = v;
95
134
  }
96
135
  }
97
- outgoing.statusCode = res.status;
136
+ if (cookies.length > 0) {
137
+ resHeaderRecord["set-cookie"] = cookies;
138
+ }
98
139
  if (res.body) {
99
140
  try {
100
141
  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);
142
+ resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
143
+ outgoing.writeHead(res.status, resHeaderRecord);
144
+ await writeFromReadableStream(res.body, outgoing);
103
145
  } else {
104
- const text = await res.text();
105
- outgoing.setHeader("Content-Length", Buffer.byteLength(text));
106
- outgoing.end(text);
146
+ const buffer = await res.arrayBuffer();
147
+ resHeaderRecord["content-length"] = buffer.byteLength;
148
+ outgoing.writeHead(res.status, resHeaderRecord);
149
+ outgoing.end(new Uint8Array(buffer));
107
150
  }
108
151
  } catch (e) {
109
152
  const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
@@ -115,6 +158,7 @@ var getRequestListener = (fetchCallback) => {
115
158
  }
116
159
  }
117
160
  } else {
161
+ outgoing.writeHead(res.status, resHeaderRecord);
118
162
  outgoing.end();
119
163
  }
120
164
  };
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,46 @@ 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
+ } else if (writable.destroyed) {
25
+ stream.cancel();
26
+ return;
27
+ }
28
+ const reader = stream.getReader();
29
+ writable.on("close", cancel);
30
+ writable.on("error", cancel);
31
+ reader.read().then(flow, cancel);
32
+ return reader.closed.finally(() => {
33
+ writable.off("close", cancel);
34
+ writable.off("error", cancel);
35
+ });
36
+ function cancel(error) {
37
+ reader.cancel(error).catch(() => {
38
+ });
39
+ if (error)
40
+ writable.destroy(error);
41
+ }
42
+ function onDrain() {
43
+ reader.read().then(flow, cancel);
44
+ }
45
+ function flow({ done, value }) {
46
+ try {
47
+ if (done) {
48
+ writable.end();
49
+ } else if (!writable.write(value)) {
50
+ writable.once("drain", onDrain);
51
+ } else {
52
+ return reader.read().then(flow, cancel);
53
+ }
54
+ } catch (e) {
55
+ cancel(e);
56
+ }
57
+ }
58
+ }
59
+
21
60
  // src/listener.ts
22
61
  var regBuffer = /^no$/i;
23
62
  var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
@@ -40,7 +79,7 @@ var getRequestListener = (fetchCallback) => {
40
79
  }
41
80
  let res;
42
81
  try {
43
- res = await fetchCallback(new Request(url.toString(), init));
82
+ res = await fetchCallback(new Request(url, init));
44
83
  } catch (e) {
45
84
  res = new Response(null, { status: 500 });
46
85
  if (e instanceof Error) {
@@ -50,24 +89,28 @@ var getRequestListener = (fetchCallback) => {
50
89
  }
51
90
  }
52
91
  const resHeaderRecord = {};
92
+ const cookies = [];
53
93
  for (const [k, v] of res.headers) {
54
- resHeaderRecord[k] = v;
55
94
  if (k === "set-cookie") {
56
- outgoing.setHeader(k, res.headers.getSetCookie(k));
95
+ cookies.push(v);
57
96
  } else {
58
- outgoing.setHeader(k, v);
97
+ resHeaderRecord[k] = v;
59
98
  }
60
99
  }
61
- outgoing.statusCode = res.status;
100
+ if (cookies.length > 0) {
101
+ resHeaderRecord["set-cookie"] = cookies;
102
+ }
62
103
  if (res.body) {
63
104
  try {
64
105
  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);
106
+ resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
107
+ outgoing.writeHead(res.status, resHeaderRecord);
108
+ await writeFromReadableStream(res.body, outgoing);
67
109
  } else {
68
- const text = await res.text();
69
- outgoing.setHeader("Content-Length", Buffer.byteLength(text));
70
- outgoing.end(text);
110
+ const buffer = await res.arrayBuffer();
111
+ resHeaderRecord["content-length"] = buffer.byteLength;
112
+ outgoing.writeHead(res.status, resHeaderRecord);
113
+ outgoing.end(new Uint8Array(buffer));
71
114
  }
72
115
  } catch (e) {
73
116
  const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
@@ -79,6 +122,7 @@ var getRequestListener = (fetchCallback) => {
79
122
  }
80
123
  }
81
124
  } else {
125
+ outgoing.writeHead(res.status, resHeaderRecord);
82
126
  outgoing.end();
83
127
  }
84
128
  };
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.3",
4
4
  "description": "Node.js Adapter for Hono",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",