Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | 6x 6x 6x 6x 6x 24x 52x 52x 52x 52x 52x 6x 987x 42x 42x 987x 987x 6x | /// <reference types="vite/client" />
import "./prelude";
import { createElement } from "react";
import * as Sentry from "@sentry/tanstackstart-react";
import type { AnyRouter } from "@tanstack/react-router";
import {
createSsrStreamResponse,
transformReadableStreamWithRouter,
} from "@tanstack/react-router/ssr/server";
import type { HandlerCallback } from "@tanstack/react-router/ssr/server";
import { StartServer } from "@tanstack/react-start-server";
import { createStartHandler, getRequest } from "@tanstack/react-start/server";
import { createServerEntry } from "@tanstack/react-start/server-entry";
import type { ReadableStream as NodeReadableStream } from "node:stream/web";
import ReactDOMServer from "react-dom/server";
import { keys } from "remeda";
import { encryptTag } from "~utils/server/tag";
import { env } from "~web/utils/env";
import type { TreeRouter } from "./router";
const sentryDsn = import.meta.env.VITE_SENTRY_DSN;
if (sentryDsn) {
Sentry.init({ dsn: sentryDsn, tracesSampleRate: 1 });
}
/* oxlint-disable no-console */
Eif (env.PLAYWRIGHT) {
const consoleLogMethods = {
log: console.log,
info: console.info,
warn: console.warn,
error: console.error,
};
for (const method of keys(consoleLogMethods)) {
console[method] = (...args) => {
let testId = "unknown";
try {
const request = getRequest();
testId = request.headers.get("x-test-id") ?? "no-test-id";
} catch {
/* empty */
}
consoleLogMethods[method].apply(console, [encryptTag(testId), ...args]);
};
}
}
/* oxlint-enable no-console */
// Adapted from TanStack's renderRouterToStream, logging only the error message
// instead of React's ~100 line component stack:
// https://github.com/TanStack/router/blob/main/packages/react-router/src/ssr/renderRouterToStream.tsx
const renderServerStream: HandlerCallback<AnyRouter> = async ({
request,
router,
responseHeaders,
}) => {
const stream = await ReactDOMServer.renderToReadableStream(
createElement(StartServer, { router }),
{
signal: request.signal,
nonce: router.options.ssr?.nonce,
progressiveChunkSize: Number.POSITIVE_INFINITY,
onError: (error) => {
Iif (error instanceof Error && error.name === "AbortError") {
return;
}
// oxlint-disable-next-line no-console
console.error(
`Error in renderToReadableStream: ${
error instanceof Error ? error.message : String(error)
}`,
);
},
},
);
const responseStream = transformReadableStreamWithRouter(
router,
stream as unknown as NodeReadableStream,
{
onAbort: () => {
stream.cancel().catch(() => undefined);
},
},
);
return createSsrStreamResponse(
router,
new Response(responseStream as unknown as BodyInit, {
status: router.stores.statusCode.get(),
headers: responseHeaders,
}),
);
};
const fetch = createStartHandler<TreeRouter>(renderServerStream);
export default createServerEntry({ fetch });
|