import React from "react";
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
import { createMemoryHistory } from "history";
import { createRouter } from "radix3";
import { renderToReadableStream } from "react-dom/server";
import isbot from "isbot";
import routemap from '/routemap.json' assert {type: 'json'};
import { state } from "../router";
const stringToStream = (str) => {
return new ReadableStream({
controller.enqueue(new TextEncoder().encode(str))
const createTagHtmlInjectTransformer = (
return new TransformStream({
transform(chunk, controller) {
if (!oneTime || !injected) {
const content = new TextDecoder().decode(chunk)
if ((index = content.indexOf(token)) !== -1) {
content.slice(0, index) +
content.slice(index, content.length)
controller.enqueue(new TextEncoder().encode(newContent))
controller.enqueue(chunk)
const createEndHtmlInjectTransformer = (inject) => {
return new TransformStream({
controller.enqueue(new TextEncoder().encode(inject()))
transform(chunk, controller) {
controller.enqueue(chunk)
const render = async (children, {
function transfromStream(stream) {
if (injectBeforeBodyClose) {
createTagHtmlInjectTransformer('</body>', true, injectBeforeBodyClose)
if (injectBeforeHeadClose) {
createTagHtmlInjectTransformer('</head>', true, injectBeforeHeadClose)
if (injectBeforeEveryScript) {
createTagHtmlInjectTransformer(
createEndHtmlInjectTransformer(injectOnEnd)
const reactStream = await renderToReadableStream(children)
await reactStream.allReady;
return transfromStream(reactStream);
const renderPage = async (Page, App, req) => {
const url = new URL(req.url);
const history = createMemoryHistory({
initialEntries: [url.pathname + url.search],
const router = createRouter({
strictTrailingSlash: true,
routes: Object.keys(routemap).reduce((acc, r) => {
acc[r] = React.lazy(() => Promise.resolve({ default: Page }));
const jsScript = url.pathname === "/" ? "/index" : url.pathname;
const helmetContext = {};
globalThis._EDGE_DATA_ = { data: {}, subs: {} };
const stream = await render(
children: _jsx(App, { helmetContext }),
isSeo: isbot(req.headers.get('User-Agent')) || url.search.includes("ec_is_bot=true"),
injectBeforeHeadClose: () =>
Object.keys(helmetContext.helmet)
.map((k) => helmetContext.helmet[k].toString())
+ `<script>globalThis._EDGE_DATA_ = ${JSON.stringify(globalThis._EDGE_DATA_)};</script>`
+ `<script type="module" src="/js${jsScript}.js?hydrate=true"></script>`
return new Response(stream, {
headers: { 'Content-Type': 'text/html' },
export default renderPage;