From b984dfe06eecbf0564dc8c6301e82e8ae32a717a Mon Sep 17 00:00:00 2001 From: Thomas Lathuiliere <40292402+balzdur@users.noreply.github.com> Date: Mon, 29 Jul 2024 10:02:42 +0200 Subject: [PATCH] chore(remix): update entry files (#510) --- packages/app-builder/src/entry.client.tsx | 10 +--- packages/app-builder/src/entry.server.tsx | 57 +++++++++++++------ .../src/services/segment/SegmentScript.tsx | 1 + 3 files changed, 41 insertions(+), 27 deletions(-) diff --git a/packages/app-builder/src/entry.client.tsx b/packages/app-builder/src/entry.client.tsx index 03cc9e503..c6ac7e853 100644 --- a/packages/app-builder/src/entry.client.tsx +++ b/packages/app-builder/src/entry.client.tsx @@ -62,12 +62,4 @@ async function hydrate() { }); } -if (window.requestIdleCallback) { - // eslint-disable-next-line @typescript-eslint/no-misused-promises - window.requestIdleCallback(hydrate); -} else { - // Safari doesn't support requestIdleCallback - // https://caniuse.com/requestidlecallback - // eslint-disable-next-line @typescript-eslint/no-misused-promises - window.setTimeout(hydrate, 1); -} +void hydrate(); diff --git a/packages/app-builder/src/entry.server.tsx b/packages/app-builder/src/entry.server.tsx index 748d11ee9..d981c80f0 100644 --- a/packages/app-builder/src/entry.server.tsx +++ b/packages/app-builder/src/entry.server.tsx @@ -33,30 +33,42 @@ export default async function handleRequest( ); - const userAgent = request.headers.get('user-agent'); - return userAgent && isbot(userAgent) + const prohibitOutOfOrderStreaming = + isBotRequest(request) || remixContext.isSpaMode; + + return prohibitOutOfOrderStreaming ? handleBotRequest(responseStatusCode, responseHeaders, App) : handleBrowserRequest(responseStatusCode, responseHeaders, App); } +function isBotRequest(request: Request) { + const userAgent = request.headers.get('user-agent'); + if (!userAgent) { + return false; + } + + return isbot(userAgent); +} + function handleBotRequest( responseStatusCode: number, responseHeaders: Headers, App: JSX.Element, ) { return new Promise((resolve, reject) => { - let didError = false; - + let shellRendered = false; const { pipe, abort } = renderToPipeableStream(App, { onAllReady() { + shellRendered = true; const body = new PassThrough(); + const stream = createReadableStreamFromReadable(body); responseHeaders.set('Content-Type', 'text/html'); resolve( - new Response(createReadableStreamFromReadable(body), { + new Response(stream, { headers: responseHeaders, - status: didError ? 500 : responseStatusCode, + status: responseStatusCode, }), ); @@ -66,9 +78,13 @@ function handleBotRequest( reject(error); }, onError(error: unknown) { - didError = true; - - console.error(error); + 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); + } }, }); @@ -82,30 +98,35 @@ function handleBrowserRequest( App: JSX.Element, ) { return new Promise((resolve, reject) => { - let didError = false; - + let shellRendered = false; const { pipe, abort } = renderToPipeableStream(App, { onShellReady() { + shellRendered = true; const body = new PassThrough(); + const stream = createReadableStreamFromReadable(body); responseHeaders.set('Content-Type', 'text/html'); resolve( - new Response(createReadableStreamFromReadable(body), { + new Response(stream, { headers: responseHeaders, - status: didError ? 500 : responseStatusCode, + status: responseStatusCode, }), ); pipe(body); }, - onShellError(err: unknown) { - reject(err); + onShellError(error: unknown) { + reject(error); }, onError(error: unknown) { - didError = true; - - console.error(error); + 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); + } }, }); diff --git a/packages/app-builder/src/services/segment/SegmentScript.tsx b/packages/app-builder/src/services/segment/SegmentScript.tsx index 9bcb33499..fd61fdd6d 100644 --- a/packages/app-builder/src/services/segment/SegmentScript.tsx +++ b/packages/app-builder/src/services/segment/SegmentScript.tsx @@ -1,6 +1,7 @@ export function SegmentScript({ script }: { script: string }) { return (