diff --git a/app/entry.client.tsx b/app/entry.client.tsx deleted file mode 100644 index fe51283..0000000 --- a/app/entry.client.tsx +++ /dev/null @@ -1,18 +0,0 @@ -/** - * By default, Remix will handle hydrating your app on the client for you. - * 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` ✨ - * For more information, see https://remix.run/file-conventions/entry.client - */ - -import { RemixBrowser } from '@remix-run/react' -import { startTransition, StrictMode } from 'react' -import { hydrateRoot } from 'react-dom/client' - -startTransition(() => { - hydrateRoot( - document, - - - - ) -}) diff --git a/app/entry.server.tsx b/app/entry.server.tsx deleted file mode 100644 index b35cc4e..0000000 --- a/app/entry.server.tsx +++ /dev/null @@ -1,137 +0,0 @@ -/** - * By default, Remix will handle generating the HTTP Response for you. - * 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` ✨ - * For more information, see https://remix.run/file-conventions/entry.server - */ - -import { PassThrough } from 'node:stream' - -import type { EntryContext } from '@remix-run/node' -import { createReadableStreamFromReadable } from '@remix-run/node' -import { RemixServer } from '@remix-run/react' -import { isbot } from 'isbot' -import { renderToPipeableStream } from 'react-dom/server' - -// eslint-disable-next-line @typescript-eslint/naming-convention -const ABORT_DELAY = 5000 - -export default async function handleRequest( - request: Request, - responseStatusCode: number, - responseHeaders: Headers, - remixContext: EntryContext -) { - return isbot(request.headers.get('user-agent') ?? '') - ? handleBotRequest( - request, - responseStatusCode, - responseHeaders, - remixContext - ) - : handleBrowserRequest( - request, - responseStatusCode, - responseHeaders, - remixContext - ) -} - -async function handleBotRequest( - request: Request, - responseStatusCode: number, - responseHeaders: Headers, - remixContext: EntryContext -) { - return new Promise((resolve, reject) => { - let shellRendered = false - const { pipe, abort } = renderToPipeableStream( - , - { - onAllReady() { - shellRendered = true - const body = new PassThrough() - const stream = createReadableStreamFromReadable(body) - - responseHeaders.set('Content-Type', 'text/html') - - resolve( - new Response(stream, { - headers: responseHeaders, - status: responseStatusCode - }) - ) - - pipe(body) - }, - onShellError(error: unknown) { - reject(error) - }, - onError(error: unknown) { - responseStatusCode = 500 - // Log streaming rendering errors from inside the shell. Don't log - // errors encountered during initial shell rendering since they'll - // reject and get logged in handleDocumentRequest. - if (shellRendered) { - console.error(error) - } - } - } - ) - - setTimeout(abort, ABORT_DELAY) - }) -} - -async function handleBrowserRequest( - request: Request, - responseStatusCode: number, - responseHeaders: Headers, - remixContext: EntryContext -) { - return new Promise((resolve, reject) => { - let shellRendered = false - const { pipe, abort } = renderToPipeableStream( - , - { - onShellReady() { - shellRendered = true - const body = new PassThrough() - const stream = createReadableStreamFromReadable(body) - - responseHeaders.set('Content-Type', 'text/html') - - resolve( - new Response(stream, { - headers: responseHeaders, - status: responseStatusCode - }) - ) - - pipe(body) - }, - onShellError(error: unknown) { - reject(error) - }, - onError(error: unknown) { - responseStatusCode = 500 - // Log streaming rendering errors from inside the shell. Don't log - // errors encountered during initial shell rendering since they'll - // reject and get logged in handleDocumentRequest. - if (shellRendered) { - console.error(error) - } - } - } - ) - - setTimeout(abort, ABORT_DELAY) - }) -}