@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 +27 -0
- package/dist/index.js +5 -1
- package/dist/index.mjs +5 -1
- package/dist/listener.js +5 -1
- package/dist/listener.mjs +5 -1
- package/dist/request.js +1 -1
- package/dist/request.mjs +1 -1
- package/dist/server.js +5 -1
- package/dist/server.mjs +5 -1
- package/dist/utils/response/constants.d.mts +3 -0
- package/dist/utils/response/constants.d.ts +3 -0
- package/dist/utils/response/constants.js +30 -0
- package/dist/utils/response/constants.mjs +5 -0
- package/dist/utils/response.d.mts +3 -0
- package/dist/utils/response.d.ts +3 -0
- package/dist/utils/response.js +37 -0
- package/dist/utils/response.mjs +10 -0
- package/dist/vercel.js +5 -1
- package/dist/vercel.mjs +5 -1
- package/package.json +9 -1
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,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,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
|
+
});
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
},
|