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.client.tsx b/packages/edge-demo-site/app/entry.client.tsx
index 65258e665..6c76169d3 100644
--- a/packages/edge-demo-site/app/entry.client.tsx
+++ b/packages/edge-demo-site/app/entry.client.tsx
@@ -1,22 +1,28 @@
-import { RemixBrowser } from '@remix-run/react'
-import { startTransition, StrictMode } from 'react'
-import { hydrateRoot } from 'react-dom/client'
+import type { EntryContext } from '@remix-run/server-runtime'
+import { RemixServer } from '@remix-run/react'
+import { renderToReadableStream } from 'react-dom/server'
+import isbot from 'isbot'
-function hydrate() {
- startTransition(() => {
- hydrateRoot(
- document,
-
-
- ,
- )
+export default async function handleRequest(
+ request: Request,
+ responseStatusCode: number,
+ responseHeaders: Headers,
+ remixContext: EntryContext,
+) {
+ const body = await renderToReadableStream(, {
+ onError() {
+ responseStatusCode = 500
+ },
})
-}
-if (typeof requestIdleCallback === 'function') {
- requestIdleCallback(hydrate)
-} else {
- // Safari doesn't support requestIdleCallback
- // https://caniuse.com/requestidlecallback
- setTimeout(hydrate, 1)
+ if (isbot(request.headers.get('user-agent'))) {
+ await body.allReady
+ }
+
+ responseHeaders.set('Content-Type', 'text/html')
+
+ return new Response(body, {
+ status: responseStatusCode,
+ headers: responseHeaders,
+ })
}