remix-demo
react router (remix) demo
git clone https://9o.is/git/remix-demo.git
entry.server.tsx
(1343B)
1 import { PassThrough } from "stream";
2 import type { EntryContext } from "@remix-run/node";
3 import { Response } from "@remix-run/node";
4 import { RemixServer } from "@remix-run/react";
5 import isbot from "isbot";
6 import { renderToPipeableStream } from "react-dom/server";
7
8 const ABORT_DELAY = 5000;
9
10 export default function handleRequest(
11 request: Request,
12 responseStatusCode: number,
13 responseHeaders: Headers,
14 remixContext: EntryContext
15 ) {
16 const callbackName = isbot(request.headers.get("user-agent"))
17 ? "onAllReady"
18 : "onShellReady";
19
20 return new Promise((resolve, reject) => {
21 let didError = false;
22
23 const { pipe, abort } = renderToPipeableStream(
24 <RemixServer context={remixContext} url={request.url} />,
25 {
26 [callbackName]: () => {
27 const body = new PassThrough();
28
29 responseHeaders.set("Content-Type", "text/html");
30
31 resolve(
32 new Response(body, {
33 headers: responseHeaders,
34 status: didError ? 500 : responseStatusCode,
35 })
36 );
37
38 pipe(body);
39 },
40 onShellError: (err: unknown) => {
41 reject(err);
42 },
43 onError: (error: unknown) => {
44 didError = true;
45
46 console.error(error);
47 },
48 }
49 );
50
51 setTimeout(abort, ABORT_DELAY);
52 });
53 }