All files / apps/web/src/utils/server trpc.ts

100% Statements 3/3
100% Branches 0/0
100% Functions 2/2
100% Lines 3/3

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                                                                                                      3x       4x         7x        
import {
	createTRPCClient,
	unstable_localLink as localLink,
} from "@trpc/client";
import type { AnyRouter } from "@trpc/server/unstable-core-do-not-import";
import * as crypto from "node:crypto";
import { doNothing } from "remeda";
import { v4 } from "uuid";
 
import type { AppRouter } from "~app/trpc";
import { getDatabase } from "~db/database";
import { transformer } from "~utils/transformer";
import type { UnauthorizedContext } from "~web/handlers/context";
import { baseLogger } from "~web/providers/logger";
import { env } from "~web/utils/env";
 
/* c8 ignore start */
export const createServerContext = (req: Request): UnauthorizedContext => {
	const active = env.EMAIL_SERVICE_ACTIVE;
	if (active && !env.BASE_URL) {
		throw new Error(
			"Expected to have env variable BASE_URL while creating context with active email",
		);
	}
	return {
		logger: baseLogger,
		database: getDatabase({
			logger: req.headers.get("x-debug")
				? baseLogger.child({ url: req.url || "unknown" })
				: undefined,
			connectionString: env.DATABASE_URL,
			sharedKey: "tRPC",
		}),
		emailOptions: {
			getActive: () => active,
			setActive: () => {
				doNothing();
			},
		},
		baseUrl: env.BASE_URL || "http://example.com/",
		cacheDbOptions: {},
		exchangeRateOptions: {},
		s3Options: {},
		getSalt: () => crypto.randomBytes(64).toString("hex"),
		getUuid: () => v4(),
		reqHeaders: req.headers,
		resHeaders: new Headers(),
	};
};
/* c8 ignore stop */
 
export const getServerTrpcClient = <R extends AnyRouter = AppRouter>(
	router: R,
	req: Request,
) =>
	createTRPCClient<R>({
		links: [
			localLink({
				router,
				transformer,
				createContext: () => Promise.resolve(createServerContext(req)),
			}),
		],
	});