Skip to content

Commit 8ff7eac

Browse files
committed
feat!: migrate to h3 v2
1 parent d9a9c52 commit 8ff7eac

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+225
-376
lines changed

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
"fs-extra": "^11.3.0",
7777
"globby": "^14.1.0",
7878
"gzip-size": "^7.0.0",
79-
"h3": "^1.15.1",
79+
"h3": "npm:[email protected]",
8080
"hookable": "^5.5.3",
8181
"httpxy": "^0.1.7",
8282
"ioredis": "^5.6.0",
@@ -88,7 +88,6 @@
8888
"magicast": "^0.3.5",
8989
"mime": "^4.0.6",
9090
"mlly": "^1.7.4",
91-
"node-mock-http": "^1.0.0",
9291
"ofetch": "^1.4.1",
9392
"ohash": "^2.0.11",
9493
"openapi-typescript": "^7.6.1",
@@ -104,6 +103,7 @@
104103
"serve-placeholder": "^2.0.2",
105104
"serve-static": "^1.16.2",
106105
"source-map": "^0.7.4",
106+
"srvx": "^0.2.5",
107107
"std-env": "^3.8.1",
108108
"ufo": "^1.5.4",
109109
"ultrahtml": "^1.5.3",

pnpm-lock.yaml

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

scripts/bump-nightly.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { globby } from "globby";
44
import { resolve } from "pathe";
55

66
const nightlyPackages = {
7-
h3: "h3-nightly",
7+
// h3: "h3-nightly",
88
} as Record<string, string>;
99

1010
async function loadPackage(dir: string) {

src/core/config/resolvers/imports.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ function getNitroImportsPreset(): Preset[] {
9696
},
9797
{
9898
from: "nitro/runtime/internal/context",
99-
imports: ["useEvent"],
99+
imports: ["useRequest"],
100100
},
101101
{
102102
from: "nitro/runtime/internal/task",

src/core/dev-server/proxy.ts

+6-14
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import type { TLSSocket } from "node:tls";
22
import type { ProxyServerOptions, ProxyServer } from "httpxy";
33
import type { H3Event } from "h3";
4-
54
import { createProxyServer } from "httpxy";
5+
import { fromNodeHandler } from "h3";
66

77
export type HTTPProxy = {
88
proxy: ProxyServer;
9-
handleEvent: (event: H3Event, opts?: ProxyServerOptions) => Promise<void>;
9+
handleEvent: (event: H3Event, opts?: ProxyServerOptions) => any;
1010
};
1111

1212
export function createHTTPProxy(defaults: ProxyServerOptions = {}): HTTPProxy {
@@ -31,19 +31,11 @@ export function createHTTPProxy(defaults: ProxyServerOptions = {}): HTTPProxy {
3131
}
3232
});
3333

34-
const handleEvent = async (event: H3Event, opts: ProxyServerOptions = {}) => {
35-
try {
36-
event._handled = true;
37-
await proxy.web(event.node.req, event.node.res, opts);
38-
} catch (error: any) {
39-
if (error?.code !== "ECONNRESET") {
40-
throw error;
41-
}
42-
}
43-
};
44-
4534
return {
4635
proxy,
47-
handleEvent,
36+
handleEvent(event, opts) {
37+
const handler = fromNodeHandler((req, res) => proxy.web(req, res, opts));
38+
return handler(event);
39+
},
4840
};
4941
}

src/core/dev-server/server.ts

+15-15
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,12 @@ import type { IncomingMessage, OutgoingMessage } from "node:http";
22
import type { Duplex } from "node:stream";
33
import type { GetPortInput } from "get-port-please";
44
import type { FSWatcher } from "chokidar";
5-
import type { App } from "h3";
5+
import type { H3 } from "h3";
66
import type { Listener, ListenOptions } from "listhen";
77
import { NodeDevWorker, type DevWorker, type WorkerAddress } from "./worker";
88
import type { Nitro, NitroBuildInfo, NitroDevServer } from "nitro/types";
9-
import {
10-
createApp,
11-
createError,
12-
eventHandler,
13-
fromNodeMiddleware,
14-
toNodeListener,
15-
} from "h3";
9+
import { createH3, createError, eventHandler, fromNodeHandler } from "h3";
10+
import { toNodeHandler } from "srvx/node";
1611
import {
1712
default as devErrorHandler,
1813
defaultHandler as devErrorHandlerInternal,
@@ -53,7 +48,7 @@ let workerIdCtr = 0;
5348
class DevServer {
5449
nitro: Nitro;
5550
workerDir: string;
56-
app: App;
51+
app: H3;
5752
listeners: Listener[] = [];
5853
reloadPromise?: Promise<void>;
5954
watcher?: FSWatcher;
@@ -106,7 +101,10 @@ class DevServer {
106101
}
107102

108103
async listen(port: GetPortInput, opts?: Partial<ListenOptions>) {
109-
const listener = await listhen(toNodeListener(this.app), { port, ...opts });
104+
const listener = await listhen(toNodeHandler(this.app.fetch), {
105+
port,
106+
...opts,
107+
});
110108
this.listeners.push(listener);
111109
listener.server.on("upgrade", (req, sock, head) =>
112110
this.handleUpgrade(req, sock, head)
@@ -193,7 +191,8 @@ class DevServer {
193191

194192
createApp() {
195193
// Init h3 app
196-
const app = createApp({
194+
const app = createH3({
195+
debug: true,
197196
onError: async (error, event) => {
198197
const errorHandler =
199198
this.nitro.options.devErrorHandler || devErrorHandler;
@@ -210,17 +209,18 @@ class DevServer {
210209
}
211210

212211
// Debugging endpoint to view vfs
213-
app.use("/_vfs", createVFSHandler(this.nitro));
212+
app.get("/_vfs", createVFSHandler(this.nitro));
214213

215214
// Serve asset dirs
216215
for (const asset of this.nitro.options.publicAssets) {
217216
const url = joinURL(
218217
this.nitro.options.runtimeConfig.app.baseURL,
219-
asset.baseURL || "/"
218+
asset.baseURL || "/",
219+
"**"
220220
);
221-
app.use(url, fromNodeMiddleware(serveStatic(asset.dir)));
221+
app.use(url, fromNodeHandler(serveStatic(asset.dir)));
222222
if (!asset.fallthrough) {
223-
app.use(url, fromNodeMiddleware(servePlaceholder()));
223+
app.use(url, fromNodeHandler(servePlaceholder()));
224224
}
225225
}
226226

src/core/dev-server/vfs.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { createError, eventHandler, getRequestHeader, getRequestIP } from "h3";
1+
import { createError, eventHandler, getRequestIP } from "h3";
22
import type { Nitro } from "nitro/types";
33

44
export function createVFSHandler(nitro: Nitro) {
@@ -20,7 +20,7 @@ export function createVFSHandler(nitro: Nitro) {
2020
const url = event.path || "";
2121
const isJson =
2222
url.endsWith(".json") ||
23-
getRequestHeader(event, "accept")?.includes("application/json");
23+
event.headers.get("accept")?.includes("application/json");
2424
const id = decodeURIComponent(url.replace(/^(\.json)?\/?/, "") || "");
2525

2626
if (id && !(id in vfsEntries)) {

src/core/index.ts

-10
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,3 @@
1-
import type { AppOptions, H3Event } from "h3";
2-
import type {
3-
CaptureError,
4-
NitroConfig,
5-
NitroOpenAPIConfig,
6-
NitroRouteConfig,
7-
RenderResponse,
8-
RenderContext,
9-
} from "nitro/types";
10-
111
// Core
122
export { createNitro } from "./nitro";
133

src/core/nitro.ts

-3
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,6 @@ export async function createNitro(
5252
createDebugger(nitro.hooks, { tag: "nitro" });
5353
nitro.options.plugins.push(join(runtimeDir, "internal/debug"));
5454
}
55-
if (nitro.options.timing) {
56-
nitro.options.plugins.push(join(runtimeDir, "internal/timing"));
57-
}
5855

5956
// Logger
6057
if (nitro.options.logLevel !== undefined) {

src/presets/_nitro/runtime/nitro-dev.ts

+13-14
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,9 @@ import { Server } from "node:http";
99
import { join } from "node:path";
1010
import nodeCrypto from "node:crypto";
1111
import { parentPort, threadId } from "node:worker_threads";
12+
import { defineEventHandler, getRouterParam } from "h3";
1213
import wsAdapter from "crossws/adapters/node";
13-
import {
14-
defineEventHandler,
15-
getQuery,
16-
getRouterParam,
17-
readBody,
18-
toNodeListener,
19-
} from "h3";
14+
import { toNodeHandler } from "srvx/node";
2015

2116
// globalThis.crypto support for Node.js 18
2217
if (!globalThis.crypto) {
@@ -37,7 +32,7 @@ parentPort?.on("message", (msg) => {
3732

3833
const nitroApp = useNitroApp();
3934

40-
const server = new Server(toNodeListener(nitroApp.h3App));
35+
const server = new Server(toNodeHandler(nitroApp.h3App.fetch));
4136
let listener: Server | undefined;
4237

4338
listen()
@@ -55,7 +50,7 @@ if (import.meta._websocket) {
5550
}
5651

5752
// Register tasks handlers
58-
nitroApp.router.get(
53+
nitroApp.h3App.get(
5954
"/_nitro/tasks",
6055
defineEventHandler(async (event) => {
6156
const _tasks = await Promise.all(
@@ -70,15 +65,19 @@ nitroApp.router.get(
7065
};
7166
})
7267
);
73-
nitroApp.router.use(
68+
69+
nitroApp.h3App.use(
7470
"/_nitro/tasks/:name",
7571
defineEventHandler(async (event) => {
7672
const name = getRouterParam(event, "name") as string;
73+
const body = (await event.request.json().catch(() => ({}))) as Record<
74+
string,
75+
unknown
76+
>;
77+
const query = Object.entries(event.query);
7778
const payload = {
78-
...getQuery(event),
79-
...(await readBody(event)
80-
.then((r) => r?.payload)
81-
.catch(() => ({}))),
79+
...query,
80+
...body,
8281
};
8382
return await runTask(name, { payload });
8483
})

src/presets/aws-amplify/runtime/aws-amplify.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import "#nitro-internal-pollyfills";
22
import { useNitroApp } from "nitro/runtime";
33

44
import { Server } from "node:http";
5-
import { toNodeListener } from "h3";
5+
import { toNodeHandler } from "srvx/node";
66

77
const nitroApp = useNitroApp();
88

9-
const server = new Server(toNodeListener(nitroApp.h3App));
9+
const server = new Server(toNodeHandler(nitroApp.h3App.fetch));
1010

1111
// @ts-ignore
1212
server.listen(3000, (err) => {

src/presets/firebase/runtime/firebase.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import "#nitro-internal-pollyfills";
22
import { useNitroApp } from "nitro/runtime";
33

44
import { onRequest } from "firebase-functions/v2/https";
5-
import { toNodeListener } from "h3";
5+
import { toNodeHandler } from "srvx/node";
66

77
const nitroApp = useNitroApp();
88

@@ -15,5 +15,5 @@ export const __firebaseServerFunctionName__ = onRequest(
1515
invoker: "public",
1616
...firebaseConfig.httpsOptions,
1717
},
18-
toNodeListener(nitroApp.h3App)
18+
toNodeHandler(nitroApp.h3App.fetch)
1919
);

0 commit comments

Comments
 (0)