diff --git a/package-lock.json b/package-lock.json index 77b750eaf..785a31754 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,8 @@ "dependencies": { "@netlify/edge-functions": "^2.0.0", "husky": "^8.0.3", - "if-env": "^1.0.4" + "if-env": "^1.0.4", + "isbot": "^3.6.6" }, "devDependencies": { "@netlify/eslint-config-node": "^7.0.1", @@ -10226,6 +10227,14 @@ "dev": true, "license": "MIT" }, + "node_modules/isbot": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/isbot/-/isbot-3.6.6.tgz", + "integrity": "sha512-98aGl1Spbx1led422YFrusDJ4ZutSNOymb2avZ2V4BCCjF3MqAF2k+J2zoaLYahubaFkb+3UyvbVDVlk/Ngrew==", + "engines": { + "node": ">=12" + } + }, "node_modules/isexe": { "version": "2.0.0", "license": "ISC" @@ -23204,6 +23213,11 @@ "version": "2.0.5", "dev": true }, + "isbot": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/isbot/-/isbot-3.6.6.tgz", + "integrity": "sha512-98aGl1Spbx1led422YFrusDJ4ZutSNOymb2avZ2V4BCCjF3MqAF2k+J2zoaLYahubaFkb+3UyvbVDVlk/Ngrew==" + }, "isexe": { "version": "2.0.0" }, diff --git a/package.json b/package.json index bbd6962b8..1d12f2290 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,8 @@ "dependencies": { "@netlify/edge-functions": "^2.0.0", "husky": "^8.0.3", - "if-env": "^1.0.4" + "if-env": "^1.0.4", + "isbot": "^3.6.6" }, "engines": { "node": ">=14" diff --git a/packages/edge-demo-site/app/entry.server.tsx b/packages/edge-demo-site/app/entry.server.tsx index ec0b37c0e..6c76169d3 100644 --- a/packages/edge-demo-site/app/entry.server.tsx +++ b/packages/edge-demo-site/app/entry.server.tsx @@ -1,19 +1,28 @@ -import type { EntryContext } from '@remix-run/node' +import type { EntryContext } from '@remix-run/server-runtime' import { RemixServer } from '@remix-run/react' -import { renderToString } from 'react-dom/server' +import { renderToReadableStream } from 'react-dom/server' +import isbot from 'isbot' -export default function handleRequest( +export default async function handleRequest( request: Request, responseStatusCode: number, responseHeaders: Headers, remixContext: EntryContext, ) { - const markup = renderToString() + const body = await renderToReadableStream(, { + onError() { + responseStatusCode = 500 + }, + }) + + if (isbot(request.headers.get('user-agent'))) { + await body.allReady + } responseHeaders.set('Content-Type', 'text/html') - return new Response('' + markup, { - headers: responseHeaders, + return new Response(body, { status: responseStatusCode, + headers: responseHeaders, }) }