@hono/node-server 1.8.2 → 1.9.1

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/README.md CHANGED
@@ -212,6 +212,33 @@ type Http2Bindings = {
212
212
  }
213
213
  ```
214
214
 
215
+ ## Direct response from Node.js API
216
+
217
+ You can directly respond to the client from the Node.js API.
218
+ In that case, the response from Hono should be ignored, so return `RESPONSE_ALREADY_SENT`.
219
+
220
+ > [!NOTE]
221
+ > This feature can be used when migrating existing Node.js applications to Hono, but we recommend using Hono's API for new applications.
222
+
223
+ ```ts
224
+ import { serve } from '@hono/node-server'
225
+ import type { HttpBindings } from '@hono/node-server'
226
+ import { RESPONSE_ALREADY_SENT } from '@hono/node-server/utils/response'
227
+ import { Hono } from 'hono'
228
+
229
+ const app = new Hono<{ Bindings: HttpBindings }>()
230
+
231
+ app.get('/', (c) => {
232
+ const { outgoing } = c.env
233
+ outgoing.writeHead(200, { 'Content-Type': 'text/plain' })
234
+ outgoing.end('Hello World\n')
235
+
236
+ return RESPONSE_ALREADY_SENT
237
+ })
238
+
239
+ serve(app)
240
+ ```
241
+
215
242
  ## Related projects
216
243
 
217
244
  - Hono - <https://hono.dev>
package/dist/index.js CHANGED
@@ -138,7 +138,7 @@ var newRequest = (incoming) => {
138
138
  const req = Object.create(requestPrototype);
139
139
  req[incomingKey] = incoming;
140
140
  req[urlKey] = new URL(
141
- `http://${incoming instanceof import_node_http2.Http2ServerRequest ? incoming.authority : incoming.headers.host}${incoming.url}`
141
+ `${incoming instanceof import_node_http2.Http2ServerRequest || incoming.socket && incoming.socket.encrypted ? "https" : "http"}://${incoming instanceof import_node_http2.Http2ServerRequest ? incoming.authority : incoming.headers.host}${incoming.url}`
142
142
  ).href;
143
143
  return req;
144
144
  };
@@ -283,6 +283,9 @@ function getInternalBody(response) {
283
283
  return state && state.body || void 0;
284
284
  }
285
285
 
286
+ // src/utils/response/constants.ts
287
+ var X_ALREADY_SENT = "x-hono-already-sent";
288
+
286
289
  // src/globals.ts
287
290
  var import_node_crypto = __toESM(require("crypto"));
288
291
  var webFetch = global.fetch;
@@ -382,6 +385,7 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
382
385
  outgoing.writeHead(res.status, resHeaderRecord);
383
386
  outgoing.end(new Uint8Array(buffer));
384
387
  }
388
+ } else if (resHeaderRecord[X_ALREADY_SENT]) {
385
389
  } else {
386
390
  outgoing.writeHead(res.status, resHeaderRecord);
387
391
  outgoing.end();
package/dist/index.mjs CHANGED
@@ -100,7 +100,7 @@ var newRequest = (incoming) => {
100
100
  const req = Object.create(requestPrototype);
101
101
  req[incomingKey] = incoming;
102
102
  req[urlKey] = new URL(
103
- `http://${incoming instanceof Http2ServerRequest ? incoming.authority : incoming.headers.host}${incoming.url}`
103
+ `${incoming instanceof Http2ServerRequest || incoming.socket && incoming.socket.encrypted ? "https" : "http"}://${incoming instanceof Http2ServerRequest ? incoming.authority : incoming.headers.host}${incoming.url}`
104
104
  ).href;
105
105
  return req;
106
106
  };
@@ -245,6 +245,9 @@ function getInternalBody(response) {
245
245
  return state && state.body || void 0;
246
246
  }
247
247
 
248
+ // src/utils/response/constants.ts
249
+ var X_ALREADY_SENT = "x-hono-already-sent";
250
+
248
251
  // src/globals.ts
249
252
  import crypto from "crypto";
250
253
  var webFetch = global.fetch;
@@ -344,6 +347,7 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
344
347
  outgoing.writeHead(res.status, resHeaderRecord);
345
348
  outgoing.end(new Uint8Array(buffer));
346
349
  }
350
+ } else if (resHeaderRecord[X_ALREADY_SENT]) {
347
351
  } else {
348
352
  outgoing.writeHead(res.status, resHeaderRecord);
349
353
  outgoing.end();
package/dist/listener.js CHANGED
@@ -133,7 +133,7 @@ var newRequest = (incoming) => {
133
133
  const req = Object.create(requestPrototype);
134
134
  req[incomingKey] = incoming;
135
135
  req[urlKey] = new URL(
136
- `http://${incoming instanceof import_node_http2.Http2ServerRequest ? incoming.authority : incoming.headers.host}${incoming.url}`
136
+ `${incoming instanceof import_node_http2.Http2ServerRequest || incoming.socket && incoming.socket.encrypted ? "https" : "http"}://${incoming instanceof import_node_http2.Http2ServerRequest ? incoming.authority : incoming.headers.host}${incoming.url}`
137
137
  ).href;
138
138
  return req;
139
139
  };
@@ -278,6 +278,9 @@ function getInternalBody(response) {
278
278
  return state && state.body || void 0;
279
279
  }
280
280
 
281
+ // src/utils/response/constants.ts
282
+ var X_ALREADY_SENT = "x-hono-already-sent";
283
+
281
284
  // src/globals.ts
282
285
  var import_node_crypto = __toESM(require("crypto"));
283
286
  var webFetch = global.fetch;
@@ -377,6 +380,7 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
377
380
  outgoing.writeHead(res.status, resHeaderRecord);
378
381
  outgoing.end(new Uint8Array(buffer));
379
382
  }
383
+ } else if (resHeaderRecord[X_ALREADY_SENT]) {
380
384
  } else {
381
385
  outgoing.writeHead(res.status, resHeaderRecord);
382
386
  outgoing.end();
package/dist/listener.mjs CHANGED
@@ -97,7 +97,7 @@ var newRequest = (incoming) => {
97
97
  const req = Object.create(requestPrototype);
98
98
  req[incomingKey] = incoming;
99
99
  req[urlKey] = new URL(
100
- `http://${incoming instanceof Http2ServerRequest ? incoming.authority : incoming.headers.host}${incoming.url}`
100
+ `${incoming instanceof Http2ServerRequest || incoming.socket && incoming.socket.encrypted ? "https" : "http"}://${incoming instanceof Http2ServerRequest ? incoming.authority : incoming.headers.host}${incoming.url}`
101
101
  ).href;
102
102
  return req;
103
103
  };
@@ -242,6 +242,9 @@ function getInternalBody(response) {
242
242
  return state && state.body || void 0;
243
243
  }
244
244
 
245
+ // src/utils/response/constants.ts
246
+ var X_ALREADY_SENT = "x-hono-already-sent";
247
+
245
248
  // src/globals.ts
246
249
  import crypto from "crypto";
247
250
  var webFetch = global.fetch;
@@ -341,6 +344,7 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
341
344
  outgoing.writeHead(res.status, resHeaderRecord);
342
345
  outgoing.end(new Uint8Array(buffer));
343
346
  }
347
+ } else if (resHeaderRecord[X_ALREADY_SENT]) {
344
348
  } else {
345
349
  outgoing.writeHead(res.status, resHeaderRecord);
346
350
  outgoing.end();
package/dist/request.js CHANGED
@@ -124,7 +124,7 @@ var newRequest = (incoming) => {
124
124
  const req = Object.create(requestPrototype);
125
125
  req[incomingKey] = incoming;
126
126
  req[urlKey] = new URL(
127
- `http://${incoming instanceof import_node_http2.Http2ServerRequest ? incoming.authority : incoming.headers.host}${incoming.url}`
127
+ `${incoming instanceof import_node_http2.Http2ServerRequest || incoming.socket && incoming.socket.encrypted ? "https" : "http"}://${incoming instanceof import_node_http2.Http2ServerRequest ? incoming.authority : incoming.headers.host}${incoming.url}`
128
128
  ).href;
129
129
  return req;
130
130
  };
package/dist/request.mjs CHANGED
@@ -97,7 +97,7 @@ var newRequest = (incoming) => {
97
97
  const req = Object.create(requestPrototype);
98
98
  req[incomingKey] = incoming;
99
99
  req[urlKey] = new URL(
100
- `http://${incoming instanceof Http2ServerRequest ? incoming.authority : incoming.headers.host}${incoming.url}`
100
+ `${incoming instanceof Http2ServerRequest || incoming.socket && incoming.socket.encrypted ? "https" : "http"}://${incoming instanceof Http2ServerRequest ? incoming.authority : incoming.headers.host}${incoming.url}`
101
101
  ).href;
102
102
  return req;
103
103
  };
package/dist/server.js CHANGED
@@ -135,7 +135,7 @@ var newRequest = (incoming) => {
135
135
  const req = Object.create(requestPrototype);
136
136
  req[incomingKey] = incoming;
137
137
  req[urlKey] = new URL(
138
- `http://${incoming instanceof import_node_http2.Http2ServerRequest ? incoming.authority : incoming.headers.host}${incoming.url}`
138
+ `${incoming instanceof import_node_http2.Http2ServerRequest || incoming.socket && incoming.socket.encrypted ? "https" : "http"}://${incoming instanceof import_node_http2.Http2ServerRequest ? incoming.authority : incoming.headers.host}${incoming.url}`
139
139
  ).href;
140
140
  return req;
141
141
  };
@@ -280,6 +280,9 @@ function getInternalBody(response) {
280
280
  return state && state.body || void 0;
281
281
  }
282
282
 
283
+ // src/utils/response/constants.ts
284
+ var X_ALREADY_SENT = "x-hono-already-sent";
285
+
283
286
  // src/globals.ts
284
287
  var import_node_crypto = __toESM(require("crypto"));
285
288
  var webFetch = global.fetch;
@@ -379,6 +382,7 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
379
382
  outgoing.writeHead(res.status, resHeaderRecord);
380
383
  outgoing.end(new Uint8Array(buffer));
381
384
  }
385
+ } else if (resHeaderRecord[X_ALREADY_SENT]) {
382
386
  } else {
383
387
  outgoing.writeHead(res.status, resHeaderRecord);
384
388
  outgoing.end();
package/dist/server.mjs CHANGED
@@ -100,7 +100,7 @@ var newRequest = (incoming) => {
100
100
  const req = Object.create(requestPrototype);
101
101
  req[incomingKey] = incoming;
102
102
  req[urlKey] = new URL(
103
- `http://${incoming instanceof Http2ServerRequest ? incoming.authority : incoming.headers.host}${incoming.url}`
103
+ `${incoming instanceof Http2ServerRequest || incoming.socket && incoming.socket.encrypted ? "https" : "http"}://${incoming instanceof Http2ServerRequest ? incoming.authority : incoming.headers.host}${incoming.url}`
104
104
  ).href;
105
105
  return req;
106
106
  };
@@ -245,6 +245,9 @@ function getInternalBody(response) {
245
245
  return state && state.body || void 0;
246
246
  }
247
247
 
248
+ // src/utils/response/constants.ts
249
+ var X_ALREADY_SENT = "x-hono-already-sent";
250
+
248
251
  // src/globals.ts
249
252
  import crypto from "crypto";
250
253
  var webFetch = global.fetch;
@@ -344,6 +347,7 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
344
347
  outgoing.writeHead(res.status, resHeaderRecord);
345
348
  outgoing.end(new Uint8Array(buffer));
346
349
  }
350
+ } else if (resHeaderRecord[X_ALREADY_SENT]) {
347
351
  } else {
348
352
  outgoing.writeHead(res.status, resHeaderRecord);
349
353
  outgoing.end();
@@ -0,0 +1,3 @@
1
+ declare const X_ALREADY_SENT = "x-hono-already-sent";
2
+
3
+ export { X_ALREADY_SENT };
@@ -0,0 +1,3 @@
1
+ declare const X_ALREADY_SENT = "x-hono-already-sent";
2
+
3
+ export { X_ALREADY_SENT };
@@ -0,0 +1,30 @@
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/response/constants.ts
21
+ var constants_exports = {};
22
+ __export(constants_exports, {
23
+ X_ALREADY_SENT: () => X_ALREADY_SENT
24
+ });
25
+ module.exports = __toCommonJS(constants_exports);
26
+ var X_ALREADY_SENT = "x-hono-already-sent";
27
+ // Annotate the CommonJS export names for ESM import in node:
28
+ 0 && (module.exports = {
29
+ X_ALREADY_SENT
30
+ });
@@ -0,0 +1,5 @@
1
+ // src/utils/response/constants.ts
2
+ var X_ALREADY_SENT = "x-hono-already-sent";
3
+ export {
4
+ X_ALREADY_SENT
5
+ };
@@ -0,0 +1,3 @@
1
+ declare const RESPONSE_ALREADY_SENT: Response;
2
+
3
+ export { RESPONSE_ALREADY_SENT };
@@ -0,0 +1,3 @@
1
+ declare const RESPONSE_ALREADY_SENT: Response;
2
+
3
+ export { RESPONSE_ALREADY_SENT };
@@ -0,0 +1,37 @@
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/response.ts
21
+ var response_exports = {};
22
+ __export(response_exports, {
23
+ RESPONSE_ALREADY_SENT: () => RESPONSE_ALREADY_SENT
24
+ });
25
+ module.exports = __toCommonJS(response_exports);
26
+
27
+ // src/utils/response/constants.ts
28
+ var X_ALREADY_SENT = "x-hono-already-sent";
29
+
30
+ // src/utils/response.ts
31
+ var RESPONSE_ALREADY_SENT = new Response(null, {
32
+ headers: { [X_ALREADY_SENT]: "true" }
33
+ });
34
+ // Annotate the CommonJS export names for ESM import in node:
35
+ 0 && (module.exports = {
36
+ RESPONSE_ALREADY_SENT
37
+ });
@@ -0,0 +1,10 @@
1
+ // src/utils/response/constants.ts
2
+ var X_ALREADY_SENT = "x-hono-already-sent";
3
+
4
+ // src/utils/response.ts
5
+ var RESPONSE_ALREADY_SENT = new Response(null, {
6
+ headers: { [X_ALREADY_SENT]: "true" }
7
+ });
8
+ export {
9
+ RESPONSE_ALREADY_SENT
10
+ };
package/dist/vercel.js CHANGED
@@ -133,7 +133,7 @@ var newRequest = (incoming) => {
133
133
  const req = Object.create(requestPrototype);
134
134
  req[incomingKey] = incoming;
135
135
  req[urlKey] = new URL(
136
- `http://${incoming instanceof import_node_http2.Http2ServerRequest ? incoming.authority : incoming.headers.host}${incoming.url}`
136
+ `${incoming instanceof import_node_http2.Http2ServerRequest || incoming.socket && incoming.socket.encrypted ? "https" : "http"}://${incoming instanceof import_node_http2.Http2ServerRequest ? incoming.authority : incoming.headers.host}${incoming.url}`
137
137
  ).href;
138
138
  return req;
139
139
  };
@@ -278,6 +278,9 @@ function getInternalBody(response) {
278
278
  return state && state.body || void 0;
279
279
  }
280
280
 
281
+ // src/utils/response/constants.ts
282
+ var X_ALREADY_SENT = "x-hono-already-sent";
283
+
281
284
  // src/globals.ts
282
285
  var import_node_crypto = __toESM(require("crypto"));
283
286
  var webFetch = global.fetch;
@@ -377,6 +380,7 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
377
380
  outgoing.writeHead(res.status, resHeaderRecord);
378
381
  outgoing.end(new Uint8Array(buffer));
379
382
  }
383
+ } else if (resHeaderRecord[X_ALREADY_SENT]) {
380
384
  } else {
381
385
  outgoing.writeHead(res.status, resHeaderRecord);
382
386
  outgoing.end();
package/dist/vercel.mjs CHANGED
@@ -97,7 +97,7 @@ var newRequest = (incoming) => {
97
97
  const req = Object.create(requestPrototype);
98
98
  req[incomingKey] = incoming;
99
99
  req[urlKey] = new URL(
100
- `http://${incoming instanceof Http2ServerRequest ? incoming.authority : incoming.headers.host}${incoming.url}`
100
+ `${incoming instanceof Http2ServerRequest || incoming.socket && incoming.socket.encrypted ? "https" : "http"}://${incoming instanceof Http2ServerRequest ? incoming.authority : incoming.headers.host}${incoming.url}`
101
101
  ).href;
102
102
  return req;
103
103
  };
@@ -242,6 +242,9 @@ function getInternalBody(response) {
242
242
  return state && state.body || void 0;
243
243
  }
244
244
 
245
+ // src/utils/response/constants.ts
246
+ var X_ALREADY_SENT = "x-hono-already-sent";
247
+
245
248
  // src/globals.ts
246
249
  import crypto from "crypto";
247
250
  var webFetch = global.fetch;
@@ -341,6 +344,7 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
341
344
  outgoing.writeHead(res.status, resHeaderRecord);
342
345
  outgoing.end(new Uint8Array(buffer));
343
346
  }
347
+ } else if (resHeaderRecord[X_ALREADY_SENT]) {
344
348
  } else {
345
349
  outgoing.writeHead(res.status, resHeaderRecord);
346
350
  outgoing.end();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hono/node-server",
3
- "version": "1.8.2",
3
+ "version": "1.9.1",
4
4
  "description": "Node.js Adapter for Hono",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -22,6 +22,11 @@
22
22
  "types": "./dist/vercel.d.ts",
23
23
  "require": "./dist/vercel.js",
24
24
  "import": "./dist/vercel.mjs"
25
+ },
26
+ "./utils/*": {
27
+ "types": "./dist/utils/*.d.ts",
28
+ "require": "./dist/utils/*.js",
29
+ "import": "./dist/utils/*.mjs"
25
30
  }
26
31
  },
27
32
  "typesVersions": {
@@ -34,6 +39,9 @@
34
39
  ],
35
40
  "vercel": [
36
41
  "./dist/vercel.d.ts"
42
+ ],
43
+ "utils/*": [
44
+ "./dist/utils/*.d.ts"
37
45
  ]
38
46
  }
39
47
  },