diff --git a/bifrost-fastify/index.ts b/bifrost-fastify/index.ts index 0fcf4f8..e210939 100644 --- a/bifrost-fastify/index.ts +++ b/bifrost-fastify/index.ts @@ -83,13 +83,17 @@ export const viteProxyPlugin: FastifyPluginAsync< return reply.code(404).type("text/html").send("Not Found"); } - const { pipe, statusCode, headers } = httpResponse; - const stream = new PassThrough(); - pipe(stream); - return reply - .status(statusCode) - .headers(Object.fromEntries(headers)) - .send(stream); + const { statusCode, headers, getBody } = httpResponse; + return ( + reply + .status(statusCode) + .headers(Object.fromEntries(headers)) + // This disables any possibility of real streaming. To re-enable streaming we should adopt vike-photon and rewrite wrapped proxy as a Vike middleware. + // Why not pipe? Because Vike gives us `pipe` which sends data into a Writable, but Fastify's reply.send only accepts a ReadableStream. Passthrough can convert but causes race conditions + // We would have to pipe into reply.raw, but that skips Fastify's reply handling (like onSend hooks) + // Photon/universal-middleware solves this with some hacks around reply.body + .send(await getBody()) + ); } await fastify.register(accepts); fastify.decorateRequest("bifrostPageId", null); @@ -122,6 +126,10 @@ export const viteProxyPlugin: FastifyPluginAsync< req.vikePageContext = pageContext; const proxyMode = pageContext.config?.proxyMode; + if (!proxyMode) { + req.log.info(`bifrost: rendering page ${pageContext.pageId}`); + return replyWithPage(reply, pageContext); + } switch (proxyMode) { case "passthru": { @@ -163,9 +171,6 @@ export const viteProxyPlugin: FastifyPluginAsync< } break; } - default: - req.log.info(`bifrost: rendering page ${pageContext.pageId}`); - return replyWithPage(reply, pageContext); } if (pageContext.urlParsed) { diff --git a/bifrost-fastify/package.json b/bifrost-fastify/package.json index 3cd713a..74e8e1c 100644 --- a/bifrost-fastify/package.json +++ b/bifrost-fastify/package.json @@ -19,7 +19,7 @@ "peerDependencies": { "@alignable/bifrost": "1.0.15", "fastify": "^5.0.0", - "vike": ">=0.4.248", + "vike": ">=0.4.251", "vite": ">=6" }, "devDependencies": { diff --git a/bifrost/package.json b/bifrost/package.json index ba30a4b..6b3808a 100644 --- a/bifrost/package.json +++ b/bifrost/package.json @@ -45,7 +45,7 @@ "peerDependencies": { "react": ">=18", "typescript": ">=4.7", - "vike": ">=0.4.248", + "vike": ">=0.4.251", "vike-react": ">=0.6.11" }, "devDependencies": { @@ -60,7 +60,7 @@ "typescript": "^5.0.4", "vike-react": "0.6.11", "vite": "^6.3.5", - "vike": "0.4.250", + "vike": "0.4.252", "cross-env": "^7.0.3" } } diff --git a/bifrost/renderer/config.ts b/bifrost/renderer/config.ts index d687483..bdd2ee1 100644 --- a/bifrost/renderer/config.ts +++ b/bifrost/renderer/config.ts @@ -40,6 +40,8 @@ export default { case "wrapped": return { Page: "import:@alignable/bifrost/__internal/renderer/wrapped/Page:default" as any, + onRenderHtml: + "import:@alignable/bifrost/__internal/renderer/wrapped/onRenderHtml:default", onBeforeRenderHtml: "import:@alignable/bifrost/__internal/renderer/wrapped/onBeforeRenderHtml:default", onBeforeRender: diff --git a/bifrost/renderer/wrapped/onRenderHtml.ts b/bifrost/renderer/wrapped/onRenderHtml.ts new file mode 100644 index 0000000..d1fef12 --- /dev/null +++ b/bifrost/renderer/wrapped/onRenderHtml.ts @@ -0,0 +1,12 @@ +import { dangerouslySkipEscape } from "vike/server"; +// @ts-ignore vike-react import typescript is wrong +import { onRenderHtml as vikeReactRender } from "vike-react/__internal/integration/onRenderHtml"; +import { PageContextServer } from "vike/types"; + +const emptydocument = dangerouslySkipEscape(""); +export default async function onRenderHtml(pageContext: PageContextServer) { + if (pageContext._wrappedServerOnly) { + return await vikeReactRender(pageContext); + } + return { documentHtml: emptydocument }; +} diff --git a/package-lock.json b/package-lock.json index fa4cd38..b9c4da7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,14 +37,14 @@ "tsup": "^7.1.0", "turbolinks": "5.3.0-beta.1", "typescript": "^5.0.4", - "vike": "0.4.250", + "vike": "0.4.252", "vike-react": "0.6.11", "vite": "^6.3.5" }, "peerDependencies": { "react": ">=18", "typescript": ">=4.7", - "vike": ">=0.4.248", + "vike": ">=0.4.251", "vike-react": ">=0.6.11" } }, @@ -77,7 +77,7 @@ "peerDependencies": { "@alignable/bifrost": "1.0.15", "fastify": "^5.0.0", - "vike": ">=0.4.248", + "vike": ">=0.4.251", "vite": ">=6" } }, @@ -1833,9 +1833,9 @@ "license": "MIT" }, "node_modules/@brillout/vite-plugin-server-entry": { - "version": "0.7.15", - "resolved": "https://registry.npmjs.org/@brillout/vite-plugin-server-entry/-/vite-plugin-server-entry-0.7.15.tgz", - "integrity": "sha512-0ClgcmjkhJoHbI6KhbjZlXMeA9qn/EPLXEVssjCE6IVYnVb4bTYuq635c44n7jV3GkjcgFHCQWBmNw0OAGiUvQ==", + "version": "0.7.17", + "resolved": "https://registry.npmjs.org/@brillout/vite-plugin-server-entry/-/vite-plugin-server-entry-0.7.17.tgz", + "integrity": "sha512-MfvSytYl51J2B+RrHvRXMdRNc1U2lHG/K9Gw05/jdPY2iYU2YQKdEzsPswfEWnt3fd1TrXF27h/fx5DIRn19jw==", "license": "MIT", "dependencies": { "@brillout/import": "^0.2.6", @@ -7951,9 +7951,9 @@ "license": "MIT" }, "node_modules/vike": { - "version": "0.4.250", - "resolved": "https://registry.npmjs.org/vike/-/vike-0.4.250.tgz", - "integrity": "sha512-ZTsVEL3V4JT7hHqRbvjiQotoIGrwWTmh2RIzkbpNtUDhzbrMIVljcFuzLjzAvjpiL86gRL/bHSKS0DSnFPlmqw==", + "version": "0.4.252", + "resolved": "https://registry.npmjs.org/vike/-/vike-0.4.252.tgz", + "integrity": "sha512-hH3q92yYupWth4fN6TYAK62JLmZELrWXUpna0+n20iEVFT+x917ah7q2zxR+oLhVq8eeDNPHn47OOMUCjUS9nw==", "license": "MIT", "dependencies": { "@babel/core": "^7.28.5", @@ -7962,7 +7962,7 @@ "@brillout/json-serializer": "^0.5.21", "@brillout/picocolors": "^1.0.30", "@brillout/require-shim": "^0.1.2", - "@brillout/vite-plugin-server-entry": "^0.7.15", + "@brillout/vite-plugin-server-entry": "^0.7.17", "cac": "^6.0.0", "es-module-lexer": "^1.0.0", "esbuild": ">=0.19.0", @@ -8461,7 +8461,7 @@ "@vitejs/plugin-react": "^4.7.0", "fastify": "^5.6.2", "uuid": "^9.0.0", - "vike": "0.4.250", + "vike": "0.4.252", "vike-react": "^0.6.10", "vite": "^6.3.5" }, diff --git a/tests/vite/package.json b/tests/vite/package.json index 49c9bd6..e01aecd 100644 --- a/tests/vite/package.json +++ b/tests/vite/package.json @@ -21,7 +21,7 @@ "@vitejs/plugin-react": "^4.7.0", "fastify": "^5.6.2", "uuid": "^9.0.0", - "vike": "0.4.250", + "vike": "0.4.252", "vike-react": "^0.6.10", "vite": "^6.3.5" }, diff --git a/tests/vite/pages/custom-vite/+Page.tsx b/tests/vite/pages/custom-vite/+Page.tsx index 9617e88..0235bd0 100644 --- a/tests/vite/pages/custom-vite/+Page.tsx +++ b/tests/vite/pages/custom-vite/+Page.tsx @@ -4,22 +4,24 @@ import { usePageContext } from "vike-react/usePageContext"; export default function Page() { const { urlParsed } = usePageContext(); + const pageData = urlParsed.search["page"]; return ( <>