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 }