Skip to content

Commit 632952b

Browse files
authored
refactor!: fully migrate to fetch api using srvx (#989)
1 parent 130130d commit 632952b

31 files changed

+256
-1109
lines changed

docs/1.guide/2.app.md

-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ When initializing an h3 app, you can register global hooks:
3737
- `onError`
3838
- `onRequest`
3939
- `onBeforeResponse`
40-
- `onAfterResponse`
4140

4241
These hooks are called for every request and can be used to add global logic to your app such as logging, error handling, etc.
4342

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
"dependencies": {
4343
"cookie-es": "^2.0.0",
4444
"rou3": "^0.5.1",
45+
"srvx": "^0.2.5",
4546
"uncrypto": "^0.1.3"
4647
},
4748
"resolutions": {

playground/app.ts

-13
This file was deleted.

pnpm-lock.yaml

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/_deprecated.ts

+1-5
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,7 @@ import type {
1010
RequestHeaders,
1111
} from "./types";
1212
import { iterable, noContent, redirect } from "./utils/response";
13-
import {
14-
defineNodeHandler,
15-
fromNodeHandler,
16-
toNodeHandler,
17-
} from "./adapters/node";
13+
import { defineNodeHandler, fromNodeHandler, toNodeHandler } from "./adapters";
1814
import { defineEventHandler, defineLazyEventHandler } from "./handler";
1915
import { proxy } from "./utils/proxy";
2016
import { createH3 } from "./h3";

src/adapters.ts

+94
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import type { IncomingMessage, ServerResponse } from "node:http";
2+
import type { NodeHandler, NodeMiddleware } from "./types/node";
3+
import type {
4+
H3,
5+
EventHandler,
6+
H3EventContext,
7+
EventHandlerResponse,
8+
} from "./types";
9+
import { toNodeHandler as _toNodeHandler } from "srvx/node";
10+
import { createError } from "./error";
11+
12+
export function toWebHandler(
13+
app: H3,
14+
): (request: Request, context?: H3EventContext) => Promise<Response> {
15+
return (request, context) => {
16+
return Promise.resolve(app.fetch(request, { h3: context }));
17+
};
18+
}
19+
20+
export function fromWebHandler(
21+
handler: (request: Request, context?: H3EventContext) => Promise<Response>,
22+
): EventHandler {
23+
return (event) => handler(event.request, event.context);
24+
}
25+
26+
/**
27+
* Convert a Node.js handler function (req, res, next?) to an EventHandler.
28+
*
29+
* **Note:** The returned event handler requires to be executed with h3 Node.js handler.
30+
*/
31+
export function fromNodeHandler(handler: NodeMiddleware): EventHandler;
32+
export function fromNodeHandler(handler: NodeHandler): EventHandler;
33+
export function fromNodeHandler(
34+
handler: NodeHandler | NodeMiddleware,
35+
): EventHandler {
36+
if (typeof handler !== "function") {
37+
throw new TypeError(`Invalid handler. It should be a function: ${handler}`);
38+
}
39+
return (event) => {
40+
if (!event.node) {
41+
throw new Error(
42+
"[h3] Executing Node.js middleware is not supported in this server!",
43+
);
44+
}
45+
return callNodeHandler(
46+
handler,
47+
event.node.req,
48+
event.node.res,
49+
) as EventHandlerResponse;
50+
};
51+
}
52+
53+
export function defineNodeHandler(handler: NodeHandler) {
54+
return handler;
55+
}
56+
57+
export function defineNodeMiddleware(handler: NodeMiddleware) {
58+
return handler;
59+
}
60+
61+
/**
62+
* Convert H3 app instance to a NodeHandler with (IncomingMessage, ServerResponse) => void signature.
63+
*/
64+
export function toNodeHandler(app: H3): NodeHandler {
65+
return _toNodeHandler(app.fetch);
66+
}
67+
68+
function callNodeHandler(
69+
handler: NodeHandler | NodeMiddleware,
70+
req: IncomingMessage,
71+
res: ServerResponse,
72+
) {
73+
const isMiddleware = handler.length > 2;
74+
return new Promise((resolve, reject) => {
75+
const next = (err?: Error) => {
76+
if (isMiddleware) {
77+
res.off("close", next);
78+
res.off("error", next);
79+
}
80+
return err ? reject(createError(err)) : resolve(undefined);
81+
};
82+
try {
83+
const returned = handler(req, res, next);
84+
if (isMiddleware && returned === undefined) {
85+
res.once("close", next);
86+
res.once("error", next);
87+
} else {
88+
resolve(returned);
89+
}
90+
} catch (error) {
91+
next(error as Error);
92+
}
93+
});
94+
}

src/adapters/base/event.ts

-40
This file was deleted.

src/adapters/node/event.ts

-60
This file was deleted.

src/adapters/node/index.ts

-95
This file was deleted.

0 commit comments

Comments
 (0)