@tanstack/solid-router
Version:
Modern and scalable routing for Solid applications
87 lines (86 loc) • 3.3 kB
JavaScript
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
let _tanstack_router_core = require("@tanstack/router-core");
let solid_js_web = require("solid-js/web");
solid_js_web = require_runtime.__toESM(solid_js_web, 1);
let _tanstack_router_core_ssr_server = require("@tanstack/router-core/ssr/server");
let isbot = require("isbot");
//#region src/ssr/renderRouterToStream.tsx
var noop = () => {};
async function waitForReadyOrAbort(ready, signal) {
let cleanup = noop;
try {
await Promise.race([ready, new Promise((resolve) => {
const onAbort = () => resolve();
cleanup = () => signal.removeEventListener("abort", onAbort);
signal.addEventListener("abort", onAbort, { once: true });
if (signal.aborted) resolve();
})]);
} finally {
cleanup();
}
}
var renderRouterToStream = async ({ request, router, responseHeaders, children }) => {
const { writable, readable } = new TransformStream();
const docType = solid_js_web.ssr("<!DOCTYPE html>");
const serovalPlugins = (router.options?.serializationAdapters || router.options.ssr?.serializationAdapters)?.map((adapter) => {
return (0, _tanstack_router_core.makeSsrSerovalPlugin)(adapter, { didRun: false });
});
const stream = solid_js_web.renderToStream(() => [docType, (0, solid_js_web.memo)(children)], {
nonce: router.options.ssr?.nonce,
plugins: serovalPlugins
});
const innerWriter = writable.getWriter();
let writerDone = false;
const releaseWriter = () => {
try {
innerWriter.releaseLock();
} catch {}
};
const abortSolidPipe = (reason) => {
if (writerDone) return;
writerDone = true;
innerWriter.abort(reason).catch(() => {}).finally(releaseWriter);
};
const onRequestAbort = () => {
abortSolidPipe(request.signal.reason);
};
if (request.signal.aborted) onRequestAbort();
else {
request.signal.addEventListener("abort", onRequestAbort, { once: true });
router.serverSsr?.onCleanup(() => {
request.signal.removeEventListener("abort", onRequestAbort);
});
}
if ((0, isbot.isbot)(request.headers.get("User-Agent"))) await waitForReadyOrAbort(Promise.resolve(stream), request.signal);
const solidWritable = new WritableStream({
write(chunk) {
return innerWriter.write(chunk);
},
close() {
writerDone = true;
return innerWriter.close().finally(releaseWriter);
},
abort(reason) {
writerDone = true;
return innerWriter.abort(reason).finally(releaseWriter);
}
});
if (!request.signal.aborted) try {
Promise.resolve(stream.pipeTo(solidWritable)).catch((err) => {
if (writerDone || err?.name === "AbortError" || err?.code === "ABORT_ERR") return;
console.error("Error in Solid render stream:", err);
abortSolidPipe(err);
});
} catch (err) {
if (err?.name !== "AbortError" && err?.code !== "ABORT_ERR") console.error("Error in Solid render stream:", err);
abortSolidPipe(err);
}
const responseStream = (0, _tanstack_router_core_ssr_server.transformReadableStreamWithRouter)(router, readable, { onAbort: abortSolidPipe });
return (0, _tanstack_router_core_ssr_server.createSsrStreamResponse)(router, new Response(responseStream, {
status: router.stores.statusCode.get(),
headers: responseHeaders
}));
};
//#endregion
exports.renderRouterToStream = renderRouterToStream;
//# sourceMappingURL=renderRouterToStream.cjs.map