@hono/node-server 1.8.1 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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
|
@@ -50,7 +50,7 @@ var Request = class extends GlobalRequest {
|
|
|
50
50
|
}
|
|
51
51
|
if (options?.body instanceof ReadableStream) {
|
|
52
52
|
;
|
|
53
|
-
options.duplex
|
|
53
|
+
options.duplex ??= "half";
|
|
54
54
|
}
|
|
55
55
|
super(input, options);
|
|
56
56
|
}
|
|
@@ -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
|
@@ -12,7 +12,7 @@ var Request = class extends GlobalRequest {
|
|
|
12
12
|
}
|
|
13
13
|
if (options?.body instanceof ReadableStream) {
|
|
14
14
|
;
|
|
15
|
-
options.duplex
|
|
15
|
+
options.duplex ??= "half";
|
|
16
16
|
}
|
|
17
17
|
super(input, options);
|
|
18
18
|
}
|
|
@@ -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
|
@@ -45,7 +45,7 @@ var Request = class extends GlobalRequest {
|
|
|
45
45
|
}
|
|
46
46
|
if (options?.body instanceof ReadableStream) {
|
|
47
47
|
;
|
|
48
|
-
options.duplex
|
|
48
|
+
options.duplex ??= "half";
|
|
49
49
|
}
|
|
50
50
|
super(input, options);
|
|
51
51
|
}
|
|
@@ -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
|
@@ -9,7 +9,7 @@ var Request = class extends GlobalRequest {
|
|
|
9
9
|
}
|
|
10
10
|
if (options?.body instanceof ReadableStream) {
|
|
11
11
|
;
|
|
12
|
-
options.duplex
|
|
12
|
+
options.duplex ??= "half";
|
|
13
13
|
}
|
|
14
14
|
super(input, options);
|
|
15
15
|
}
|
|
@@ -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
package/dist/request.mjs
CHANGED
package/dist/server.js
CHANGED
|
@@ -47,7 +47,7 @@ var Request = class extends GlobalRequest {
|
|
|
47
47
|
}
|
|
48
48
|
if (options?.body instanceof ReadableStream) {
|
|
49
49
|
;
|
|
50
|
-
options.duplex
|
|
50
|
+
options.duplex ??= "half";
|
|
51
51
|
}
|
|
52
52
|
super(input, options);
|
|
53
53
|
}
|
|
@@ -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
|
@@ -12,7 +12,7 @@ var Request = class extends GlobalRequest {
|
|
|
12
12
|
}
|
|
13
13
|
if (options?.body instanceof ReadableStream) {
|
|
14
14
|
;
|
|
15
|
-
options.duplex
|
|
15
|
+
options.duplex ??= "half";
|
|
16
16
|
}
|
|
17
17
|
super(input, options);
|
|
18
18
|
}
|
|
@@ -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
|
@@ -45,7 +45,7 @@ var Request = class extends GlobalRequest {
|
|
|
45
45
|
}
|
|
46
46
|
if (options?.body instanceof ReadableStream) {
|
|
47
47
|
;
|
|
48
|
-
options.duplex
|
|
48
|
+
options.duplex ??= "half";
|
|
49
49
|
}
|
|
50
50
|
super(input, options);
|
|
51
51
|
}
|
|
@@ -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
|
@@ -9,7 +9,7 @@ var Request = class extends GlobalRequest {
|
|
|
9
9
|
}
|
|
10
10
|
if (options?.body instanceof ReadableStream) {
|
|
11
11
|
;
|
|
12
|
-
options.duplex
|
|
12
|
+
options.duplex ??= "half";
|
|
13
13
|
}
|
|
14
14
|
super(input, options);
|
|
15
15
|
}
|
|
@@ -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.0",
|
|
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
|
},
|