@tanstack/solid-router
Version:
Modern and scalable routing for Solid applications
50 lines • 2.21 kB
JSX
import * as Solid from 'solid-js/web';
import { isbot } from 'isbot';
import { createSsrStreamResponse, getSsrStatus, transformReadableStreamWithRouter, waitForRequest, } from '@tanstack/router-core/ssr/server';
import { getSolidRenderOptions } from './renderOptions';
export const 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}
{children()}
</>), getSolidRenderOptions(router));
// Cancelling the transform's reader errors this writable, which makes
// Solid's later writes reject and be ignored. Solid exposes no disposal
// handle for unresolved renderer work; see router-core's STREAMING.md.
const { readable, writable } = new TransformStream();
const rendererAbort = isbot(request.headers.get('User-Agent'))
? new AbortController()
: undefined;
const responseStream = transformReadableStreamWithRouter(router, readable, {
rendererSafePoint: 'record-end',
signal,
onAbort: rendererAbort
? (reason) => rendererAbort.abort(reason)
: undefined,
});
if (rendererAbort) {
await waitForRequest(stream, rendererAbort.signal);
}
// The server export returns Promise<void>. Solid's client declaration
// returns void, and this file is also checked under that export condition.
void Promise.resolve(stream.pipeTo(writable)).catch((error) => {
console.error('Error in Solid render stream:', error);
void writable.abort(error).catch(() => { });
});
return createSsrStreamResponse(router, new Response(responseStream, {
status: getSsrStatus(router),
headers: responseHeaders,
}));
}
catch (error) {
router.serverSsr?.cleanup();
throw error;
}
};
//# sourceMappingURL=renderRouterToStream.jsx.map