[{"data":1,"prerenderedAt":1369},["ShallowReactive",2],{"navigation_docs":3,"-core-concepts-sessions":152,"-core-concepts-sessions-surround":1364},[4,42,68,110,131],{"title":5,"path":6,"stem":7,"children":8,"icon":11},"Getting Started","/getting-started","1.getting-started/0.index",[9,12,17,22,27,32,37],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-sparkles",{"title":13,"path":14,"stem":15,"icon":16},"Installation","/getting-started/installation","1.getting-started/1.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Configuration","/getting-started/configuration","1.getting-started/2.configuration","i-lucide-settings",{"title":23,"path":24,"stem":25,"icon":26},"Client Setup","/getting-started/client-setup","1.getting-started/3.client-setup","i-lucide-monitor",{"title":28,"path":29,"stem":30,"icon":31},"Type Augmentation","/getting-started/type-augmentation","1.getting-started/4.type-augmentation","i-lucide-type",{"title":33,"path":34,"stem":35,"icon":36},"Schema Generation (NuxtHub)","/getting-started/schema-generation","1.getting-started/5.schema-generation","i-lucide-database",{"title":38,"path":39,"stem":40,"icon":41},"How It Works","/getting-started/how-it-works","1.getting-started/6.how-it-works","i-lucide-workflow",{"title":43,"path":44,"stem":45,"children":46,"page":67},"Core Concepts","/core-concepts","2.core-concepts",[47,51,55,59,63],{"title":48,"path":49,"stem":50},"serverAuth()","/core-concepts/server-auth","2.core-concepts/1.server-auth",{"title":52,"path":53,"stem":54},"Sessions","/core-concepts/sessions","2.core-concepts/2.sessions",{"title":56,"path":57,"stem":58},"Route Protection","/core-concepts/route-protection","2.core-concepts/3.route-protection",{"title":60,"path":61,"stem":62},"Auto‑Imports and Aliases","/core-concepts/auto-imports-aliases","2.core-concepts/4.auto-imports-aliases",{"title":64,"path":65,"stem":66},"Security & Caveats","/core-concepts/security-caveats","2.core-concepts/5.security-caveats",false,{"title":69,"path":70,"stem":71,"children":72,"page":67},"Guides","/guides","3.guides",[73,77,81,85,89,94,98,102,106],{"title":74,"path":75,"stem":76},"Role‑Based Access","/guides/role-based-access","3.guides/1.role-based-access",{"title":78,"path":79,"stem":80},"OAuth Providers","/guides/oauth-providers","3.guides/2.oauth-providers",{"title":82,"path":83,"stem":84},"Custom Database","/guides/custom-database","3.guides/3.custom-database",{"title":86,"path":87,"stem":88},"Database-less Mode","/guides/database-less-mode","3.guides/4.database-less-mode",{"title":90,"path":91,"stem":92,"icon":93},"External Auth Backend","/guides/external-auth-backend","3.guides/5.external-auth-backend","i-lucide-server",{"title":95,"path":96,"stem":97},"Migrating from nuxt-auth-utils","/guides/migrate-from-nuxt-auth-utils","3.guides/6.migrate-from-nuxt-auth-utils",{"title":99,"path":100,"stem":101},"Two-Factor Authentication (TOTP + Backup Codes)","/guides/two-factor-auth","3.guides/7.two-factor-auth",{"title":103,"path":104,"stem":105},"Testing","/guides/testing","3.guides/8.testing",{"title":107,"path":108,"stem":109},"Production Deployment","/guides/production-deployment","3.guides/9.production-deployment",{"title":111,"path":112,"stem":113,"children":114,"page":67},"Integrations","/integrations","4.integrations",[115,119,123,127],{"title":116,"path":117,"stem":118},"NuxtHub","/integrations/nuxthub","4.integrations/1.nuxthub",{"title":120,"path":121,"stem":122},"DevTools","/integrations/devtools","4.integrations/2.devtools",{"title":124,"path":125,"stem":126},"Convex","/integrations/convex","4.integrations/3.convex",{"title":128,"path":129,"stem":130},"i18n","/integrations/i18n","4.integrations/4.i18n",{"title":132,"path":133,"stem":134,"children":135,"page":67},"API Reference","/api","5.api",[136,140,144,148],{"title":137,"path":138,"stem":139},"Composables","/api/composables","5.api/1.composables",{"title":141,"path":142,"stem":143},"Server Utilities","/api/server-utils","5.api/2.server-utils",{"title":145,"path":146,"stem":147},"Components","/api/components","5.api/3.components",{"title":149,"path":150,"stem":151},"Types","/api/types","5.api/4.types",{"id":153,"title":52,"body":154,"description":1358,"extension":1359,"links":1360,"meta":1361,"navigation":184,"path":53,"seo":1362,"stem":54,"__hash__":1363},"docs/2.core-concepts/2.sessions.md",{"type":155,"value":156,"toc":1347},"minimark",[157,234,238,316,321,324,370,373,402,513,518,525,533,596,600,610,614,621,624,690,693,761,764,768,771,775,779,942,946,949,1031,1035,1038,1146,1149,1202,1206,1209,1340,1343],[158,159,160],"code-collapse",{},[161,162,168],"pre",{"className":163,"code":164,"filename":165,"language":166,"meta":167,"style":167},"language-txt shiki shiki-themes one-light synthwave-84 synthwave-84","Handle sessions with @onmax/nuxt-better-auth using useUserSession().\n\n- `useUserSession()` is auto-imported and returns: user, session, loggedIn, ready, signOut, fetchSession\n- SSR: session is fetched server-side via cookies and hydrated — `ready` is `true` after hydration\n- Client: use `useSignIn()`, `useSignUp()`, or `useAuthClient()` for Better Auth client methods\n- Split model: use `useUserSession()` in pages/components, use `requireUserSession(event)` in server handlers\n- Configure session lifetime in `server/auth.config.ts` via `session.expiresIn` and `session.cookieCache`\n- Use `\u003CBetterAuthState>` or `ready` ref to avoid loading flashes\n- Force refresh: `fetchSession({ force: true })`\n- Custom auth action sync: `runWithSessionRefresh(() => $fetch('/api/auth/...'))`\n","Prompt","txt","",[169,170,171,179,186,192,198,204,210,216,222,228],"code",{"__ignoreMap":167},[172,173,176],"span",{"class":174,"line":175},"line",1,[172,177,178],{},"Handle sessions with @onmax/nuxt-better-auth using useUserSession().\n",[172,180,182],{"class":174,"line":181},2,[172,183,185],{"emptyLinePlaceholder":184},true,"\n",[172,187,189],{"class":174,"line":188},3,[172,190,191],{},"- `useUserSession()` is auto-imported and returns: user, session, loggedIn, ready, signOut, fetchSession\n",[172,193,195],{"class":174,"line":194},4,[172,196,197],{},"- SSR: session is fetched server-side via cookies and hydrated — `ready` is `true` after hydration\n",[172,199,201],{"class":174,"line":200},5,[172,202,203],{},"- Client: use `useSignIn()`, `useSignUp()`, or `useAuthClient()` for Better Auth client methods\n",[172,205,207],{"class":174,"line":206},6,[172,208,209],{},"- Split model: use `useUserSession()` in pages/components, use `requireUserSession(event)` in server handlers\n",[172,211,213],{"class":174,"line":212},7,[172,214,215],{},"- Configure session lifetime in `server/auth.config.ts` via `session.expiresIn` and `session.cookieCache`\n",[172,217,219],{"class":174,"line":218},8,[172,220,221],{},"- Use `\u003CBetterAuthState>` or `ready` ref to avoid loading flashes\n",[172,223,225],{"class":174,"line":224},9,[172,226,227],{},"- Force refresh: `fetchSession({ force: true })`\n",[172,229,231],{"class":174,"line":230},10,[172,232,233],{},"- Custom auth action sync: `runWithSessionRefresh(() => $fetch('/api/auth/...'))`\n",[235,236,237],"p",{},"Use this page when you want to understand how session state moves between SSR, hydration, client updates, and server-side access.",[161,239,244],{"className":240,"code":241,"filename":242,"language":243,"meta":167,"style":167},"language-ts shiki shiki-themes one-light synthwave-84 synthwave-84","const {\n  user,\n  session,\n  loggedIn,\n  ready,\n  signOut,\n  fetchSession,\n} = useUserSession()\n","pages/dashboard.vue","ts",[169,245,246,256,265,272,279,286,293,300],{"__ignoreMap":167},[172,247,248,252],{"class":174,"line":175},[172,249,251],{"class":250},"sqe1H","const",[172,253,255],{"class":254},"s17Py"," {\n",[172,257,258,262],{"class":174,"line":181},[172,259,261],{"class":260},"s6Rhl","  user",[172,263,264],{"class":254},",\n",[172,266,267,270],{"class":174,"line":188},[172,268,269],{"class":260},"  session",[172,271,264],{"class":254},[172,273,274,277],{"class":174,"line":194},[172,275,276],{"class":260},"  loggedIn",[172,278,264],{"class":254},[172,280,281,284],{"class":174,"line":200},[172,282,283],{"class":260},"  ready",[172,285,264],{"class":254},[172,287,288,291],{"class":174,"line":206},[172,289,290],{"class":260},"  signOut",[172,292,264],{"class":254},[172,294,295,298],{"class":174,"line":212},[172,296,297],{"class":260},"  fetchSession",[172,299,264],{"class":254},[172,301,302,305,309,313],{"class":174,"line":218},[172,303,304],{"class":254},"} ",[172,306,308],{"class":307},"sQBpM","=",[172,310,312],{"class":311},"sfT9l"," useUserSession",[172,314,315],{"class":254},"()\n",[317,318,320],"h2",{"id":319},"ssr-behavior","SSR behavior",[235,322,323],{},"During server-side rendering (SSR), the module fetches the session using incoming request cookies and populates state before rendering. A client plugin then keeps the state in sync after hydration.",[325,326,327,351,364],"ul",{},[328,329,330,334,335,338,339,342,343,346,347,350],"li",{},[331,332,333],"strong",{},"Server render:"," ",[169,336,337],{},"user"," and ",[169,340,341],{},"session"," are set when a valid session cookie exists, and ",[169,344,345],{},"ready"," is ",[169,348,349],{},"true",".",[328,352,353,334,356,359,360,363],{},[331,354,355],{},"Server runtime client access:",[169,357,358],{},"useAuthClient()"," returns ",[169,361,362],{},"null"," during SSR.",[328,365,366,369],{},[331,367,368],{},"After hydration:"," State stays in sync with client-side updates.",[235,371,372],{},"Use a split model:",[325,374,375,390],{},[328,376,377,378,381,382,385,386,389],{},"In pages and components, use ",[169,379,380],{},"useUserSession()"," state and SSR-safe fetch helpers (",[169,383,384],{},"useAuthRequestFetch",", ",[169,387,388],{},"useAuthAsyncData",").",[328,391,392,393,385,396,385,399,389],{},"In server handlers and routes, use server utilities (",[169,394,395],{},"serverAuth",[169,397,398],{},"getUserSession",[169,400,401],{},"requireUserSession",[161,403,406],{"className":240,"code":404,"filename":405,"language":243,"meta":167,"style":167},"export default defineEventHandler(async (event) => {\n  const { user } = await requireUserSession(event)\n  return { id: user.id, email: user.email }\n})\n","server/api/profile.get.ts",[169,407,408,441,470,508],{"__ignoreMap":167},[172,409,410,413,417,420,423,426,429,433,436,439],{"class":174,"line":175},[172,411,412],{"class":250},"export",[172,414,416],{"class":415},"sKg8T"," default",[172,418,419],{"class":311}," defineEventHandler",[172,421,422],{"class":254},"(",[172,424,425],{"class":250},"async",[172,427,428],{"class":254}," (",[172,430,432],{"class":431},"sgisi","event",[172,434,435],{"class":254},") ",[172,437,438],{"class":250},"=>",[172,440,255],{"class":254},[172,442,443,446,449,451,454,456,459,462,464,467],{"class":174,"line":181},[172,444,445],{"class":250},"  const",[172,447,448],{"class":254}," { ",[172,450,337],{"class":260},[172,452,453],{"class":254}," } ",[172,455,308],{"class":307},[172,457,458],{"class":250}," await",[172,460,461],{"class":311}," requireUserSession",[172,463,422],{"class":254},[172,465,432],{"class":466},"sYvLG",[172,468,469],{"class":254},")\n",[172,471,472,475,477,480,484,488,490,492,494,497,499,501,503,505],{"class":174,"line":188},[172,473,474],{"class":250},"  return",[172,476,448],{"class":254},[172,478,479],{"class":466},"id",[172,481,483],{"class":482},"sVnqq",":",[172,485,487],{"class":486},"svFNh"," user",[172,489,350],{"class":254},[172,491,479],{"class":466},[172,493,385],{"class":254},[172,495,496],{"class":466},"email",[172,498,483],{"class":482},[172,500,487],{"class":486},[172,502,350],{"class":254},[172,504,496],{"class":466},[172,506,507],{"class":254}," }\n",[172,509,510],{"class":174,"line":194},[172,511,512],{"class":254},"})\n",[514,515,517],"h3",{"id":516},"optional-skip-hydrated-ssr-session-fetch","Optional: Skip Hydrated SSR Session Fetch",[235,519,520,521,524],{},"By default, SSR pages still bootstrap the client session with an initial ",[169,522,523],{},"/api/auth/get-session"," request. This enables Better Auth's session refresh behavior.",[235,526,527,528,338,530,532],{},"If you want to skip that request when ",[169,529,337],{},[169,531,341],{}," are already hydrated from SSR, enable the option below:",[161,534,537],{"className":240,"code":535,"filename":536,"language":243,"meta":167,"style":167},"export default defineNuxtConfig({\n  auth: {\n    session: {\n      skipHydratedSsrGetSession: true,\n    },\n  },\n})\n","nuxt.config.ts",[169,538,539,551,560,569,582,587,592],{"__ignoreMap":167},[172,540,541,543,545,548],{"class":174,"line":175},[172,542,412],{"class":250},[172,544,416],{"class":415},[172,546,547],{"class":311}," defineNuxtConfig",[172,549,550],{"class":254},"({\n",[172,552,553,556,558],{"class":174,"line":181},[172,554,555],{"class":466},"  auth",[172,557,483],{"class":482},[172,559,255],{"class":254},[172,561,562,565,567],{"class":174,"line":188},[172,563,564],{"class":466},"    session",[172,566,483],{"class":482},[172,568,255],{"class":254},[172,570,571,574,576,580],{"class":174,"line":194},[172,572,573],{"class":466},"      skipHydratedSsrGetSession",[172,575,483],{"class":482},[172,577,579],{"class":578},"s3ZNE"," true",[172,581,264],{"class":254},[172,583,584],{"class":174,"line":200},[172,585,586],{"class":254},"    },\n",[172,588,589],{"class":174,"line":206},[172,590,591],{"class":254},"  },\n",[172,593,594],{"class":174,"line":212},[172,595,512],{"class":254},[597,598,599],"warning",{},"When enabled, the module skips Better Auth's session refresh manager on those SSR pages (focus, polling, broadcast). Session state will still sync after auth actions that trigger a session signal.",[235,601,602,603,605,606,609],{},"For prerendered or cached pages, the client plugin fetches the session after mount. Use ",[169,604,345],{}," or ",[169,607,608],{},"\u003CBetterAuthState>"," to avoid flashes in those cases.",[317,611,613],{"id":612},"auth-readiness-vs-domain-data-readiness","Auth Readiness vs Domain Data Readiness",[235,615,616,338,618,620],{},[169,617,345],{},[169,619,608],{}," guarantee only that auth hydration has finished. They do not guarantee that additional auth-bound domain data (billing state, role membership, entitlements) has loaded.",[235,622,623],{},"When rendering UI that depends on both auth and domain data, fetch that domain data SSR-first:",[161,625,628],{"className":240,"code":626,"filename":627,"language":243,"meta":167,"style":167},"const { data: customerState } = await useFetch('/api/auth/customer/state')\nconst { data: customerById } = await useFetch('/api/auth/customer/123/state')\n","pages/app.vue",[169,629,630,662],{"__ignoreMap":167},[172,631,632,634,636,639,642,645,647,649,651,654,656,660],{"class":174,"line":175},[172,633,251],{"class":250},[172,635,448],{"class":254},[172,637,638],{"class":466},"data",[172,640,641],{"class":254},": ",[172,643,644],{"class":260},"customerState",[172,646,453],{"class":254},[172,648,308],{"class":307},[172,650,458],{"class":250},[172,652,653],{"class":311}," useFetch",[172,655,422],{"class":254},[172,657,659],{"class":658},"sPAZv","'/api/auth/customer/state'",[172,661,469],{"class":254},[172,663,664,666,668,670,672,675,677,679,681,683,685,688],{"class":174,"line":181},[172,665,251],{"class":250},[172,667,448],{"class":254},[172,669,638],{"class":466},[172,671,641],{"class":254},[172,673,674],{"class":260},"customerById",[172,676,453],{"class":254},[172,678,308],{"class":307},[172,680,458],{"class":250},[172,682,653],{"class":311},[172,684,422],{"class":254},[172,686,687],{"class":658},"'/api/auth/customer/123/state'",[172,689,469],{"class":254},[235,691,692],{},"Endpoint payloads are inferred from your Better Auth config (core + plugins), including dynamic auth paths.",[161,694,696],{"className":240,"code":695,"filename":627,"language":243,"meta":167,"style":167},"const { data: customerState, pending, error } = await useAuthAsyncData(\n  'customer-state',\n  requestFetch => requestFetch('/api/auth/customer/state'),\n)\n",[169,697,698,732,739,757],{"__ignoreMap":167},[172,699,700,702,704,706,708,710,712,715,717,720,722,724,726,729],{"class":174,"line":175},[172,701,251],{"class":250},[172,703,448],{"class":254},[172,705,638],{"class":466},[172,707,641],{"class":254},[172,709,644],{"class":260},[172,711,385],{"class":254},[172,713,714],{"class":260},"pending",[172,716,385],{"class":254},[172,718,719],{"class":260},"error",[172,721,453],{"class":254},[172,723,308],{"class":307},[172,725,458],{"class":250},[172,727,728],{"class":311}," useAuthAsyncData",[172,730,731],{"class":254},"(\n",[172,733,734,737],{"class":174,"line":181},[172,735,736],{"class":658},"  'customer-state'",[172,738,264],{"class":254},[172,740,741,744,747,750,752,754],{"class":174,"line":188},[172,742,743],{"class":431},"  requestFetch",[172,745,746],{"class":250}," =>",[172,748,749],{"class":311}," requestFetch",[172,751,422],{"class":254},[172,753,659],{"class":658},[172,755,756],{"class":254},"),\n",[172,758,759],{"class":174,"line":194},[172,760,469],{"class":254},[235,762,763],{},"This prevents first-paint UI flips where unauthenticated defaults briefly appear before domain data resolves.",[317,765,767],{"id":766},"cookie-vs-database-sessions","Cookie vs Database Sessions",[235,769,770],{},"Database sessions (default): stored in DB, revocable, visible in admin\nJWE sessions (database-less): encrypted cookie, no server storage",[772,773],"read-more",{"to":774},"https://www.better-auth.com/docs/concepts/session-management",[317,776,778],{"id":777},"handling-loading-state","Handling Loading State",[161,780,785],{"className":781,"code":782,"filename":783,"language":784,"meta":167,"style":167},"language-vue shiki shiki-themes one-light synthwave-84 synthwave-84","\u003Cscript setup lang=\"ts\">\nconst { user, loggedIn, ready } = useUserSession()\n\u003C/script>\n\n\u003Ctemplate>\n  \u003Cdiv v-if=\"!ready\">Loading...\u003C/div>\n  \u003Cdiv v-else-if=\"loggedIn\">Welcome, {{ user?.name }}\u003C/div>\n  \u003Cdiv v-else>Please log in\u003C/div>\n\u003C/template>\n","pages/protected.vue","vue",[169,786,787,813,839,848,852,861,889,914,934],{"__ignoreMap":167},[172,788,789,793,797,801,804,807,810],{"class":174,"line":175},[172,790,792],{"class":791},"sL9le","\u003C",[172,794,796],{"class":795},"stweg","script",[172,798,800],{"class":799},"s0frj"," setup",[172,802,803],{"class":799}," lang",[172,805,308],{"class":806},"sNM9w",[172,808,809],{"class":658},"\"ts\"",[172,811,812],{"class":791},">\n",[172,814,815,817,820,822,824,827,829,831,833,835,837],{"class":174,"line":181},[172,816,251],{"class":250},[172,818,448],{"class":819},"sEEOt",[172,821,337],{"class":260},[172,823,385],{"class":819},[172,825,826],{"class":260},"loggedIn",[172,828,385],{"class":819},[172,830,345],{"class":260},[172,832,453],{"class":819},[172,834,308],{"class":307},[172,836,312],{"class":311},[172,838,315],{"class":819},[172,840,841,844,846],{"class":174,"line":188},[172,842,843],{"class":791},"\u003C/",[172,845,796],{"class":795},[172,847,812],{"class":791},[172,849,850],{"class":174,"line":194},[172,851,185],{"emptyLinePlaceholder":184},[172,853,854,856,859],{"class":174,"line":200},[172,855,792],{"class":791},[172,857,858],{"class":795},"template",[172,860,812],{"class":791},[172,862,863,866,869,872,874,877,880,883,885,887],{"class":174,"line":206},[172,864,865],{"class":791},"  \u003C",[172,867,868],{"class":795},"div",[172,870,871],{"class":799}," v-if",[172,873,308],{"class":806},[172,875,876],{"class":658},"\"!ready\"",[172,878,879],{"class":791},">",[172,881,882],{"class":819},"Loading...",[172,884,843],{"class":791},[172,886,868],{"class":795},[172,888,812],{"class":791},[172,890,891,893,895,898,900,903,905,908,910,912],{"class":174,"line":212},[172,892,865],{"class":791},[172,894,868],{"class":795},[172,896,897],{"class":799}," v-else-if",[172,899,308],{"class":806},[172,901,902],{"class":658},"\"loggedIn\"",[172,904,879],{"class":791},[172,906,907],{"class":819},"Welcome, {{ user?.name }}",[172,909,843],{"class":791},[172,911,868],{"class":795},[172,913,812],{"class":791},[172,915,916,918,920,923,925,928,930,932],{"class":174,"line":218},[172,917,865],{"class":791},[172,919,868],{"class":795},[172,921,922],{"class":799}," v-else",[172,924,879],{"class":791},[172,926,927],{"class":819},"Please log in",[172,929,843],{"class":791},[172,931,868],{"class":795},[172,933,812],{"class":791},[172,935,936,938,940],{"class":174,"line":224},[172,937,843],{"class":791},[172,939,858],{"class":795},[172,941,812],{"class":791},[317,943,945],{"id":944},"server-side-session-access","Server-Side Session Access",[235,947,948],{},"For server handlers and API routes, use the server utilities:",[161,950,951],{"className":240,"code":404,"filename":405,"language":243,"meta":167,"style":167},[169,952,953,975,997,1027],{"__ignoreMap":167},[172,954,955,957,959,961,963,965,967,969,971,973],{"class":174,"line":175},[172,956,412],{"class":250},[172,958,416],{"class":415},[172,960,419],{"class":311},[172,962,422],{"class":254},[172,964,425],{"class":250},[172,966,428],{"class":254},[172,968,432],{"class":431},[172,970,435],{"class":254},[172,972,438],{"class":250},[172,974,255],{"class":254},[172,976,977,979,981,983,985,987,989,991,993,995],{"class":174,"line":181},[172,978,445],{"class":250},[172,980,448],{"class":254},[172,982,337],{"class":260},[172,984,453],{"class":254},[172,986,308],{"class":307},[172,988,458],{"class":250},[172,990,461],{"class":311},[172,992,422],{"class":254},[172,994,432],{"class":466},[172,996,469],{"class":254},[172,998,999,1001,1003,1005,1007,1009,1011,1013,1015,1017,1019,1021,1023,1025],{"class":174,"line":188},[172,1000,474],{"class":250},[172,1002,448],{"class":254},[172,1004,479],{"class":466},[172,1006,483],{"class":482},[172,1008,487],{"class":486},[172,1010,350],{"class":254},[172,1012,479],{"class":466},[172,1014,385],{"class":254},[172,1016,496],{"class":466},[172,1018,483],{"class":482},[172,1020,487],{"class":486},[172,1022,350],{"class":254},[172,1024,496],{"class":466},[172,1026,507],{"class":254},[172,1028,1029],{"class":174,"line":194},[172,1030,512],{"class":254},[317,1032,1034],{"id":1033},"session-refresh","Session Refresh",[235,1036,1037],{},"Force refresh the session data:",[161,1039,1041],{"className":781,"code":1040,"language":784,"meta":167,"style":167},"\u003Cscript setup lang=\"ts\">\nconst { fetchSession, ready } = useUserSession()\n\u003C/script>\n\n\u003Ctemplate>\n  \u003Cbutton :disabled=\"!ready\" @click=\"fetchSession({ force: true })\">\n    Refresh session\n  \u003C/button>\n\u003C/template>\n",[169,1042,1043,1059,1080,1088,1092,1100,1124,1129,1138],{"__ignoreMap":167},[172,1044,1045,1047,1049,1051,1053,1055,1057],{"class":174,"line":175},[172,1046,792],{"class":791},[172,1048,796],{"class":795},[172,1050,800],{"class":799},[172,1052,803],{"class":799},[172,1054,308],{"class":806},[172,1056,809],{"class":658},[172,1058,812],{"class":791},[172,1060,1061,1063,1065,1068,1070,1072,1074,1076,1078],{"class":174,"line":181},[172,1062,251],{"class":250},[172,1064,448],{"class":819},[172,1066,1067],{"class":260},"fetchSession",[172,1069,385],{"class":819},[172,1071,345],{"class":260},[172,1073,453],{"class":819},[172,1075,308],{"class":307},[172,1077,312],{"class":311},[172,1079,315],{"class":819},[172,1081,1082,1084,1086],{"class":174,"line":188},[172,1083,843],{"class":791},[172,1085,796],{"class":795},[172,1087,812],{"class":791},[172,1089,1090],{"class":174,"line":194},[172,1091,185],{"emptyLinePlaceholder":184},[172,1093,1094,1096,1098],{"class":174,"line":200},[172,1095,792],{"class":791},[172,1097,858],{"class":795},[172,1099,812],{"class":791},[172,1101,1102,1104,1107,1110,1112,1114,1117,1119,1122],{"class":174,"line":206},[172,1103,865],{"class":791},[172,1105,1106],{"class":795},"button",[172,1108,1109],{"class":799}," :disabled",[172,1111,308],{"class":806},[172,1113,876],{"class":658},[172,1115,1116],{"class":799}," @click",[172,1118,308],{"class":806},[172,1120,1121],{"class":658},"\"fetchSession({ force: true })\"",[172,1123,812],{"class":791},[172,1125,1126],{"class":174,"line":212},[172,1127,1128],{"class":819},"    Refresh session\n",[172,1130,1131,1134,1136],{"class":174,"line":218},[172,1132,1133],{"class":791},"  \u003C/",[172,1135,1106],{"class":795},[172,1137,812],{"class":791},[172,1139,1140,1142,1144],{"class":174,"line":224},[172,1141,843],{"class":791},[172,1143,858],{"class":795},[172,1145,812],{"class":791},[235,1147,1148],{},"When a custom Better Auth endpoint creates or changes the current session, wrap the action so Nuxt refreshes session state after a successful response:",[161,1150,1153],{"className":240,"code":1151,"filename":1152,"language":243,"meta":167,"style":167},"await runWithSessionRefresh(() =>\n  $fetch('/api/auth/sign-in/custom', { method: 'POST', body }),\n)\n","pages/login.vue",[169,1154,1155,1169,1198],{"__ignoreMap":167},[172,1156,1157,1160,1163,1166],{"class":174,"line":175},[172,1158,1159],{"class":250},"await",[172,1161,1162],{"class":311}," runWithSessionRefresh",[172,1164,1165],{"class":254},"(() ",[172,1167,1168],{"class":250},"=>\n",[172,1170,1171,1174,1176,1179,1182,1185,1187,1190,1192,1195],{"class":174,"line":181},[172,1172,1173],{"class":311},"  $fetch",[172,1175,422],{"class":254},[172,1177,1178],{"class":658},"'/api/auth/sign-in/custom'",[172,1180,1181],{"class":254},", { ",[172,1183,1184],{"class":466},"method",[172,1186,483],{"class":482},[172,1188,1189],{"class":658}," 'POST'",[172,1191,385],{"class":254},[172,1193,1194],{"class":486},"body",[172,1196,1197],{"class":254}," }),\n",[172,1199,1200],{"class":174,"line":188},[172,1201,469],{"class":254},[317,1203,1205],{"id":1204},"session-lifetime","Session Lifetime",[235,1207,1208],{},"Configure session duration in your auth config:",[161,1210,1213],{"className":240,"code":1211,"filename":1212,"language":243,"meta":167,"style":167},"import { defineServerAuth } from '@onmax/nuxt-better-auth/config'\n\nexport default defineServerAuth({\n  session: {\n    expiresIn: 60 * 60 * 24 * 7, // 7 days\n    cookieCache: {\n      enabled: true,\n      maxAge: 5 * 60, // 5 minutes\n    },\n  },\n})\n","server/auth.config.ts",[169,1214,1215,1233,1237,1248,1256,1288,1297,1308,1327,1331,1335],{"__ignoreMap":167},[172,1216,1217,1220,1222,1225,1227,1230],{"class":174,"line":175},[172,1218,1219],{"class":250},"import",[172,1221,448],{"class":254},[172,1223,1224],{"class":466},"defineServerAuth",[172,1226,453],{"class":254},[172,1228,1229],{"class":250},"from",[172,1231,1232],{"class":658}," '@onmax/nuxt-better-auth/config'\n",[172,1234,1235],{"class":174,"line":181},[172,1236,185],{"emptyLinePlaceholder":184},[172,1238,1239,1241,1243,1246],{"class":174,"line":188},[172,1240,412],{"class":250},[172,1242,416],{"class":415},[172,1244,1245],{"class":311}," defineServerAuth",[172,1247,550],{"class":254},[172,1249,1250,1252,1254],{"class":174,"line":194},[172,1251,269],{"class":466},[172,1253,483],{"class":482},[172,1255,255],{"class":254},[172,1257,1258,1261,1263,1266,1270,1272,1274,1277,1279,1282,1284],{"class":174,"line":200},[172,1259,1260],{"class":466},"    expiresIn",[172,1262,483],{"class":482},[172,1264,1265],{"class":578}," 60",[172,1267,1269],{"class":1268},"sn-Jc"," *",[172,1271,1265],{"class":578},[172,1273,1269],{"class":1268},[172,1275,1276],{"class":578}," 24",[172,1278,1269],{"class":1268},[172,1280,1281],{"class":578}," 7",[172,1283,385],{"class":254},[172,1285,1287],{"class":1286},"st7cf","// 7 days\n",[172,1289,1290,1293,1295],{"class":174,"line":206},[172,1291,1292],{"class":466},"    cookieCache",[172,1294,483],{"class":482},[172,1296,255],{"class":254},[172,1298,1299,1302,1304,1306],{"class":174,"line":212},[172,1300,1301],{"class":466},"      enabled",[172,1303,483],{"class":482},[172,1305,579],{"class":578},[172,1307,264],{"class":254},[172,1309,1310,1313,1315,1318,1320,1322,1324],{"class":174,"line":218},[172,1311,1312],{"class":466},"      maxAge",[172,1314,483],{"class":482},[172,1316,1317],{"class":578}," 5",[172,1319,1269],{"class":1268},[172,1321,1265],{"class":578},[172,1323,385],{"class":254},[172,1325,1326],{"class":1286},"// 5 minutes\n",[172,1328,1329],{"class":174,"line":224},[172,1330,586],{"class":254},[172,1332,1333],{"class":174,"line":230},[172,1334,591],{"class":254},[172,1336,1338],{"class":174,"line":1337},11,[172,1339,512],{"class":254},[772,1341],{"to":146,"title":1342},"BetterAuthState component",[1344,1345,1346],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sqe1H, html code.shiki .sqe1H{--shiki-light:#A626A4;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .s17Py, html code.shiki .s17Py{--shiki-light:#383A42;--shiki-default:#BBBBBB;--shiki-dark:#BBBBBB}html pre.shiki code .s6Rhl, html code.shiki .s6Rhl{--shiki-light:#986801;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}html pre.shiki code .sQBpM, html code.shiki .sQBpM{--shiki-light:#0184BC;--shiki-default:#FFFFFFEE;--shiki-dark:#FFFFFFEE}html pre.shiki code .sfT9l, html code.shiki .sfT9l{--shiki-light:#4078F2;--shiki-default:#36F9F6;--shiki-dark:#36F9F6}html pre.shiki code .sKg8T, html code.shiki .sKg8T{--shiki-light:#E45649;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .sgisi, html code.shiki .sgisi{--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-default:#FF7EDB;--shiki-default-font-style:italic;--shiki-dark:#FF7EDB;--shiki-dark-font-style:italic}html pre.shiki code .sYvLG, html code.shiki .sYvLG{--shiki-light:#E45649;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}html pre.shiki code .sVnqq, html code.shiki .sVnqq{--shiki-light:#0184BC;--shiki-default:#B6B1B1;--shiki-dark:#B6B1B1}html pre.shiki code .svFNh, html code.shiki .svFNh{--shiki-light:#383A42;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}html pre.shiki code .s3ZNE, html code.shiki .s3ZNE{--shiki-light:#986801;--shiki-default:#F97E72;--shiki-dark:#F97E72}html pre.shiki code .sPAZv, html code.shiki .sPAZv{--shiki-light:#50A14F;--shiki-default:#FF8B39;--shiki-dark:#FF8B39}html pre.shiki code .sL9le, html code.shiki .sL9le{--shiki-light:#383A42;--shiki-default:#36F9F6;--shiki-dark:#36F9F6}html pre.shiki code .stweg, html code.shiki .stweg{--shiki-light:#E45649;--shiki-default:#72F1B8;--shiki-dark:#72F1B8}html pre.shiki code .s0frj, html code.shiki .s0frj{--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-default:#FEDE5D;--shiki-default-font-style:italic;--shiki-dark:#FEDE5D;--shiki-dark-font-style:italic}html pre.shiki code .sNM9w, html code.shiki .sNM9w{--shiki-light:#383A42;--shiki-default:#B6B1B1;--shiki-dark:#B6B1B1}html pre.shiki code .sEEOt, html code.shiki .sEEOt{--shiki-light:#383A42;--shiki-default:#FFFFFFEE;--shiki-dark:#FFFFFFEE}html pre.shiki code .sn-Jc, html code.shiki .sn-Jc{--shiki-light:#0184BC;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .st7cf, html code.shiki .st7cf{--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-default:#848BBD;--shiki-default-font-style:italic;--shiki-dark:#848BBD;--shiki-dark-font-style:italic}",{"title":167,"searchDepth":181,"depth":181,"links":1348},[1349,1352,1353,1354,1355,1356,1357],{"id":319,"depth":181,"text":320,"children":1350},[1351],{"id":516,"depth":188,"text":517},{"id":612,"depth":181,"text":613},{"id":766,"depth":181,"text":767},{"id":777,"depth":181,"text":778},{"id":944,"depth":181,"text":945},{"id":1033,"depth":181,"text":1034},{"id":1204,"depth":181,"text":1205},"Access reactive session state with SSR support using `useUserSession()`.","md",null,{},{"title":52,"description":1358},"Q1JMmMMBH5RDkVvQY2w6b6DKzAb0-MiEQ2xpAeohBnM",[1365,1367],{"title":48,"path":49,"stem":50,"description":1366,"children":-1},"When to reach for the full Better Auth server instance.",{"title":56,"path":57,"stem":58,"description":1368,"children":-1},"Learn how to protect your pages and API routes using a layered approach.",1782799803271]