1import { RequestContext, createRequestHandler } from "rakkasjs";
2import { cookie } from "@hattip/cookie";
3
4import {
5 QueryCache,
6 QueryClient,
7 QueryClientProvider,
8} from "@tanstack/react-query";
9import { uneval } from "devalue";
10import { trpc } from "./utils/trpc";
11import { trpcClient } from "./utils/client";
12
13declare module "rakkasjs" {
14 interface ServerSideLocals {
15 session: any;
16 }
17}
18
19type CreateRequestHandlerParams = Parameters<typeof createRequestHandler>;
20
21const attachSession = async (ctx: RequestContext) => {
22 try {
23
24
25
26
27
28 ctx.locals.session = {
29 user: "jeffery",
30 };
31 } catch (error) {
32 throw new Error("Failed to attach session");
33 }
34};
35const logger = async (ctx: RequestContext) => {
36 try {
37 console.log("========", ctx.ip, "=============");
38 } catch (error) {
39 throw new Error("Failed to attach session");
40 }
41};
42
43export default createRequestHandler({
44 middleware: {
45
46
47
48 beforePages: [cookie(), attachSession],
49
50
51
52 beforeApiRoutes: [logger],
53
54
55
56 beforeNotFound: [],
57 },
58
59 createPageHooks(ctx) {
60 let queries = Object.create(null);
61 console.log("hattip ctx", ctx.request.url);
62 return {
63 wrapApp(app) {
64 const queryCache = new QueryCache({
65 onSuccess(data, query) {
66
67 queries[query.queryHash] = data;
68 },
69 });
70
71 const queryClient = new QueryClient({
72 queryCache,
73 defaultOptions: {
74 queries: {
75 suspense: true,
76 staleTime: Infinity,
77 refetchOnWindowFocus: false,
78 refetchOnReconnect: false,
79 },
80 },
81 });
82
83 return (
84 <trpc.Provider
85 client={trpcClient(ctx.request.url)}
86 queryClient={queryClient}
87 >
88 <QueryClientProvider client={queryClient}>
89 {app}
90 </QueryClientProvider>
91 </trpc.Provider>
92 );
93 },
94
95 emitToDocumentHead() {
96 return `<script>$TQD=Object.create(null);$TQS=data=>Object.assign($TQD,data);</script>`;
97 },
98
99 emitBeforeSsrChunk() {
100 if (Object.keys(queries).length === 0) return "";
101
102
103
104
105 const queriesString = uneval(queries);
106 queries = Object.create(null);
107 return `<script>$TQS(${queriesString})</script>`;
108 },
109 };
110 },
111});
112