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,
})
}