Skip to content

Commit 30522b6

Browse files
committed
improve performance
1 parent 10bf932 commit 30522b6

2 files changed

Lines changed: 35 additions & 12 deletions

File tree

packages/start/src/server/handler.ts

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,30 @@ import { getExpectedRedirectStatus } from "./util.ts";
1515

1616
const SERVER_FN_BASE = "/_server";
1717

18+
try {
19+
const nodeHTTP = await import("http");
20+
const http2 = await import("http2");
21+
22+
function patchListen(proto: any) {
23+
if (!proto || proto.__patched) return;
24+
25+
const original = proto.listen;
26+
proto.listen = function (...args: any[]) {
27+
globalThis.canSendFastNodeStreams = true;
28+
return original.apply(this, args);
29+
};
30+
31+
proto.__patched = true;
32+
}
33+
34+
// http + https
35+
patchListen(nodeHTTP.Server.prototype);
36+
37+
// http2 (discover prototypes safely)
38+
patchListen(Object.getPrototypeOf(http2.createServer()));
39+
patchListen(Object.getPrototypeOf(http2.createSecureServer()));
40+
} catch {}
41+
1842
export function createBaseHandler(
1943
createPageEvent: (e: FetchEvent) => Promise<PageEvent>,
2044
fn: (context: PageEvent) => JSX.Element,
@@ -24,8 +48,7 @@ export function createBaseHandler(
2448
middleware: middleware.length ? middleware.map(decorateMiddleware) : undefined,
2549
handler: decorateHandler(async (e: H3Event) => {
2650
const event = getRequestEvent()!;
27-
const url = new URL(event.request.url);
28-
const pathname = stripBaseUrl(url.pathname);
51+
const pathname = stripBaseUrl(e.url.pathname);
2952

3053
if (pathname.startsWith(SERVER_FN_BASE)) {
3154
const serverFnResponse = await handleServerFunction(e);
@@ -114,7 +137,7 @@ export function createBaseHandler(
114137

115138
// using TransformStream in dev can cause solid-start-dev-server to crash
116139
// when stream is cancelled
117-
if (globalThis.USING_SOLID_START_DEV_SERVER) return stream;
140+
if (globalThis.canSendFastNodeStreams) return stream;
118141

119142
// returning stream directly breaks cloudflare workers
120143
const { writable, readable } = new TransformStream();

packages/start/src/server/server-functions-handler.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ export async function handleServerFunction(h3Event: H3Event) {
7676
const serverReference = request.headers.get("X-Server-Id");
7777
const instance = request.headers.get("X-Server-Instance");
7878
const singleFlight = request.headers.has("X-Single-Flight");
79-
const url = new URL(request.url);
79+
const url = h3Event.url;
8080
let functionId: string | undefined | null;
8181
if (serverReference) {
8282
// invariant(typeof serverReference === "string", "Invalid server function");
@@ -96,7 +96,7 @@ export async function handleServerFunction(h3Event: H3Event) {
9696
let parsed: any[] = [];
9797

9898
// grab bound arguments from url when no JS
99-
if (!instance || h3Event.method === "GET") {
99+
if (!instance || request.method === "GET") {
100100
const args = url.searchParams.get("args");
101101
if (args) {
102102
const json = JSON.parse(args);
@@ -121,7 +121,7 @@ export async function handleServerFunction(h3Event: H3Event) {
121121
});
122122
}
123123
}
124-
if (h3Event.method === "POST") {
124+
if (request.method === "POST") {
125125
const contentType = request.headers.get("content-type");
126126

127127
if (
@@ -176,7 +176,7 @@ export async function handleServerFunction(h3Event: H3Event) {
176176
}
177177

178178
// handle no JS success case
179-
if (!instance) return handleNoJS(result, request, parsed);
179+
if (!instance) return handleNoJS(result, h3Event, parsed);
180180

181181
h3Event.res.headers.set("content-type", "text/javascript");
182182

@@ -200,7 +200,7 @@ export async function handleServerFunction(h3Event: H3Event) {
200200

201201
h3Event.res.headers.set("X-Error", error.replace(/[\r\n]+/g, ""));
202202
} else {
203-
x = handleNoJS(x, request, parsed, true);
203+
x = handleNoJS(x, h3Event, parsed, true);
204204
}
205205
if (instance) {
206206
h3Event.res.headers.set("content-type", "text/javascript");
@@ -210,8 +210,8 @@ export async function handleServerFunction(h3Event: H3Event) {
210210
}
211211
}
212212

213-
function handleNoJS(result: any, request: Request, parsed: any[], thrown?: boolean) {
214-
const url = new URL(request.url);
213+
function handleNoJS(result: any, h3Event: H3Event, parsed: any[], thrown?: boolean) {
214+
const url = h3Event.url;
215215
const isError = result instanceof Error;
216216
let statusCode = 302;
217217
let headers: Headers;
@@ -226,7 +226,7 @@ function handleNoJS(result: any, request: Request, parsed: any[], thrown?: boole
226226
}
227227
} else
228228
headers = new Headers({
229-
Location: new URL(request.headers.get("referer")!).toString(),
229+
Location: new URL(h3Event.req.headers.get("referer")!).toString(),
230230
});
231231
if (result) {
232232
headers.append(
@@ -293,7 +293,7 @@ async function handleSingleFlight(sourceEvent: FetchEvent, result: any): Promise
293293
if (result.headers.has("Location"))
294294
url = new URL(
295295
result.headers.get("Location")!,
296-
new URL(sourceEvent.request.url).origin + import.meta.env.BASE_URL,
296+
sourceEvent.nativeEvent.url.origin + import.meta.env.BASE_URL,
297297
).toString();
298298
}
299299
const event = { ...sourceEvent } as PageEvent;

0 commit comments

Comments
 (0)