Skip to content

Commit 7af6110

Browse files
committed
refactor: use handleRequest from vercel preset
1 parent 96dbc2e commit 7af6110

File tree

1 file changed

+12
-128
lines changed

1 file changed

+12
-128
lines changed

app/entry.server.tsx

Lines changed: 12 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -1,135 +1,19 @@
1-
/**
2-
* By default, Remix will handle generating the HTTP Response for you.
3-
* You are free to delete this file if you'd like to, but if you ever want it revealed again, you can run `npx remix reveal` ✨
4-
* For more information, see https://remix.run/file-conventions/entry.server
5-
*/
6-
7-
import { PassThrough } from "node:stream";
8-
9-
import { createReadableStreamFromReadable } from "@react-router/node";
10-
import { isbot } from "isbot";
11-
import { renderToPipeableStream } from "react-dom/server";
1+
import { handleRequest as vercelHandleRequest } from "@vercel/react-router/entry.server";
122
import type { AppLoadContext, EntryContext } from "react-router";
13-
import { ServerRouter } from "react-router";
14-
15-
// see: https://reactrouter.com/explanation/special-files#streamtimeout
16-
export const streamTimeout = 5000;
173

184
export default async function handleRequest(
195
request: Request,
206
responseStatusCode: number,
217
responseHeaders: Headers,
22-
reactRouterContext: EntryContext,
23-
// This is ignored so we can keep it in the template for visibility. Feel
24-
// free to delete this parameter in your app if you're not using it!
25-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
26-
loadContext: AppLoadContext,
27-
) {
28-
return isbot(request.headers.get("user-agent") ?? "")
29-
? handleBotRequest(
30-
request,
31-
responseStatusCode,
32-
responseHeaders,
33-
reactRouterContext,
34-
)
35-
: handleBrowserRequest(
36-
request,
37-
responseStatusCode,
38-
responseHeaders,
39-
reactRouterContext,
40-
);
41-
}
42-
43-
async function handleBotRequest(
44-
request: Request,
45-
responseStatusCode: number,
46-
responseHeaders: Headers,
47-
reactRouterContext: EntryContext,
48-
) {
49-
return new Promise((resolve, reject) => {
50-
let shellRendered = false;
51-
const { pipe, abort } = renderToPipeableStream(
52-
<ServerRouter context={reactRouterContext} url={request.url} />,
53-
{
54-
onAllReady() {
55-
shellRendered = true;
56-
const body = new PassThrough();
57-
const stream = createReadableStreamFromReadable(body);
58-
59-
responseHeaders.set("Content-Type", "text/html");
60-
61-
resolve(
62-
new Response(stream, {
63-
headers: responseHeaders,
64-
status: responseStatusCode,
65-
}),
66-
);
67-
68-
pipe(body);
69-
},
70-
onShellError(error: unknown) {
71-
// eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors
72-
reject(error);
73-
},
74-
onError(error: unknown) {
75-
responseStatusCode = 500;
76-
// Log streaming rendering errors from inside the shell. Don't log
77-
// errors encountered during initial shell rendering since they'll
78-
// reject and get logged in handleDocumentRequest.
79-
if (shellRendered) {
80-
console.error(error);
81-
}
82-
},
83-
},
84-
);
85-
86-
setTimeout(abort, streamTimeout + 1000);
87-
});
88-
}
89-
90-
async function handleBrowserRequest(
91-
request: Request,
92-
responseStatusCode: number,
93-
responseHeaders: Headers,
94-
reactRouterContext: EntryContext,
95-
) {
96-
return new Promise((resolve, reject) => {
97-
let shellRendered = false;
98-
const { pipe, abort } = renderToPipeableStream(
99-
<ServerRouter context={reactRouterContext} url={request.url} />,
100-
{
101-
onShellReady() {
102-
shellRendered = true;
103-
const body = new PassThrough();
104-
const stream = createReadableStreamFromReadable(body);
105-
106-
responseHeaders.set("Content-Type", "text/html");
107-
108-
resolve(
109-
new Response(stream, {
110-
headers: responseHeaders,
111-
status: responseStatusCode,
112-
}),
113-
);
114-
115-
pipe(body);
116-
},
117-
onShellError(error: unknown) {
118-
// eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors
119-
reject(error);
120-
},
121-
onError(error: unknown) {
122-
responseStatusCode = 500;
123-
// Log streaming rendering errors from inside the shell. Don't log
124-
// errors encountered during initial shell rendering since they'll
125-
// reject and get logged in handleDocumentRequest.
126-
if (shellRendered) {
127-
console.error(error);
128-
}
129-
},
130-
},
131-
);
132-
133-
setTimeout(abort, streamTimeout + 1000);
134-
});
8+
routerContext: EntryContext,
9+
loadContext?: AppLoadContext,
10+
): Promise<Response> {
11+
const response = await vercelHandleRequest(
12+
request,
13+
responseStatusCode,
14+
responseHeaders,
15+
routerContext,
16+
loadContext,
17+
);
18+
return response;
13519
}

0 commit comments

Comments
 (0)