@tanstack/solid-router
Version:
Modern and scalable routing for Solid applications
40 lines (39 loc) • 1.62 kB
JavaScript
import { getSolidRenderOptions } from "./renderOptions.js";
import * as Solid from "solid-js/web";
import { memo } from "solid-js/web";
import { createSsrStreamResponse, getSsrStatus, transformReadableStreamWithRouter, waitForRequest } from "@tanstack/router-core/ssr/server";
import { isbot } from "isbot";
//#region src/ssr/renderRouterToStream.tsx
var renderRouterToStream = async ({ request, router, responseHeaders, children }) => {
const signal = request.signal;
if (signal.aborted) {
router.serverSsr?.cleanup();
throw signal.reason;
}
try {
const docType = Solid.ssr("<!DOCTYPE html>");
const stream = Solid.renderToStream(() => [docType, memo(children)], getSolidRenderOptions(router));
const { readable, writable } = new TransformStream();
const rendererAbort = isbot(request.headers.get("User-Agent")) ? new AbortController() : void 0;
const responseStream = transformReadableStreamWithRouter(router, readable, {
rendererSafePoint: "record-end",
signal,
onAbort: rendererAbort ? (reason) => rendererAbort.abort(reason) : void 0
});
if (rendererAbort) await waitForRequest(stream, rendererAbort.signal);
Promise.resolve(stream.pipeTo(writable)).catch((error) => {
console.error("Error in Solid render stream:", error);
writable.abort(error).catch(() => {});
});
return createSsrStreamResponse(router, new Response(responseStream, {
status: getSsrStatus(router),
headers: responseHeaders
}));
} catch (error) {
router.serverSsr?.cleanup();
throw error;
}
};
//#endregion
export { renderRouterToStream };
//# sourceMappingURL=renderRouterToStream.js.map