[{"data":1,"prerenderedAt":1161},["ShallowReactive",2],{"navigation_docs":3,"-use-cases-better-auth-middleware":424,"-use-cases-better-auth-middleware-surround":1156},[4,25,75,230,338,393],{"title":5,"path":6,"stem":7,"children":8,"page":24},"Start","\u002Fstart","1.start",[9,14,19],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fstart\u002Finstallation","1.start\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F3.quick-start","i-lucide-zap",false,{"title":26,"path":27,"stem":28,"children":29,"page":24},"Learn","\u002Flearn","2.learn",[30,35,40,45,50,55,60,65,70],{"title":31,"path":32,"stem":33,"icon":34},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":36,"path":37,"stem":38,"icon":39},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":41,"path":42,"stem":43,"icon":44},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":46,"path":47,"stem":48,"icon":49},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":51,"path":52,"stem":53,"icon":54},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":56,"path":57,"stem":58,"icon":59},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":61,"path":62,"stem":63,"icon":64},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":66,"path":67,"stem":68,"icon":69},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":71,"path":72,"stem":73,"icon":74},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":76,"path":77,"stem":78,"children":79,"page":24},"Integrate","\u002Fintegrate","3.integrate",[80,84,147],{"title":31,"path":81,"stem":82,"icon":83},"\u002Fintegrate\u002Foverview","3.integrate\u002F0.overview","i-lucide-plug",{"title":85,"path":86,"stem":87,"children":88,"page":24},"Adapters","\u002Fintegrate\u002Fadapters","3.integrate\u002Fadapters",[89,92,132],{"title":31,"path":90,"stem":91,"icon":34},"\u002Fintegrate\u002Fadapters\u002Foverview","3.integrate\u002Fadapters\u002F01.overview",{"title":93,"path":94,"stem":95,"children":96,"page":24},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","3.integrate\u002Fadapters\u002Fcloud",[97,102,107,112,117,122,127],{"title":98,"path":99,"stem":100,"icon":101},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","3.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":103,"path":104,"stem":105,"icon":106},"OTLP","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fotlp","3.integrate\u002Fadapters\u002Fcloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":108,"path":109,"stem":110,"icon":111},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","3.integrate\u002Fadapters\u002Fcloud\u002F03.posthog","i-simple-icons-posthog",{"title":113,"path":114,"stem":115,"icon":116},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","3.integrate\u002Fadapters\u002Fcloud\u002F04.sentry","i-simple-icons-sentry",{"title":118,"path":119,"stem":120,"icon":121},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","3.integrate\u002Fadapters\u002Fcloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":123,"path":124,"stem":125,"icon":126},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","3.integrate\u002Fadapters\u002Fcloud\u002F06.datadog","i-simple-icons-datadog",{"title":128,"path":129,"stem":130,"icon":131},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fhyperdx","3.integrate\u002Fadapters\u002Fcloud\u002F07.hyperdx","i-custom-hyperdx",{"title":133,"path":134,"stem":135,"children":136,"page":24},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","3.integrate\u002Fadapters\u002Fself-hosted",[137,142],{"title":138,"path":139,"stem":140,"icon":141},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","3.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":143,"path":144,"stem":145,"icon":146},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","3.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":148,"path":149,"stem":150,"children":151,"page":24},"Frameworks","\u002Fintegrate\u002Fframeworks","3.integrate\u002Fframeworks",[152,156,161,166,171,176,181,186,191,196,201,206,211,216,220,225],{"title":31,"path":153,"stem":154,"icon":155},"\u002Fintegrate\u002Fframeworks\u002Foverview","3.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":157,"path":158,"stem":159,"icon":160},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","3.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":162,"path":163,"stem":164,"icon":165},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","3.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":167,"path":168,"stem":169,"icon":170},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","3.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":172,"path":173,"stem":174,"icon":175},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","3.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":177,"path":178,"stem":179,"icon":180},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","3.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":182,"path":183,"stem":184,"icon":185},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","3.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":187,"path":188,"stem":189,"icon":190},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","3.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":192,"path":193,"stem":194,"icon":195},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","3.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":197,"path":198,"stem":199,"icon":200},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","3.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":202,"path":203,"stem":204,"icon":205},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","3.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":207,"path":208,"stem":209,"icon":210},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","3.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":212,"path":213,"stem":214,"icon":215},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","3.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":217,"path":218,"stem":219,"icon":69},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","3.integrate\u002Fframeworks\u002F13.standalone",{"title":221,"path":222,"stem":223,"icon":224},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","3.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":226,"path":227,"stem":228,"icon":229},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","3.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":231,"path":232,"stem":233,"children":234,"page":24},"Use Cases","\u002Fuse-cases","4.use-cases",[235,239,244,273,301,333],{"title":31,"path":236,"stem":237,"icon":238},"\u002Fuse-cases\u002Foverview","4.use-cases\u002F0.overview","i-lucide-list-checks",{"title":240,"path":241,"stem":242,"icon":243},"Client Logging","\u002Fuse-cases\u002Fclient-logging","4.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":245,"icon":246,"path":247,"stem":248,"children":249,"page":24},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","4.use-cases\u002F2.ai-sdk",[250,253,258,263,268],{"title":31,"path":251,"stem":252,"icon":34},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","4.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":254,"path":255,"stem":256,"icon":257},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","4.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":259,"path":260,"stem":261,"icon":262},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","4.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":264,"path":265,"stem":266,"icon":267},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","4.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":269,"path":270,"stem":271,"icon":272},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","4.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":274,"icon":275,"path":276,"stem":277,"children":278,"page":24},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","4.use-cases\u002F3.better-auth",[279,282,287,292,296],{"title":31,"path":280,"stem":281,"icon":34},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","4.use-cases\u002F3.better-auth\u002F01.overview",{"title":283,"path":284,"stem":285,"icon":286},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","4.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":288,"path":289,"stem":290,"icon":291},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","4.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":293,"path":294,"stem":295,"icon":243},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","4.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":297,"path":298,"stem":299,"icon":300},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","4.use-cases\u002F3.better-auth\u002F05.performance","i-lucide-gauge",{"title":302,"icon":303,"path":304,"stem":305,"children":306,"page":24},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","4.use-cases\u002F4.audit",[307,310,315,320,325,329],{"title":31,"path":308,"stem":309,"icon":34},"\u002Fuse-cases\u002Faudit\u002Foverview","4.use-cases\u002F4.audit\u002F01.overview",{"title":311,"path":312,"stem":313,"icon":314},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","4.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":316,"path":317,"stem":318,"icon":319},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","4.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":321,"path":322,"stem":323,"icon":324},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","4.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":326,"path":327,"stem":328,"icon":303},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","4.use-cases\u002F4.audit\u002F05.compliance",{"title":330,"path":331,"stem":332,"icon":74},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","4.use-cases\u002F4.audit\u002F06.recipes",{"title":334,"path":335,"stem":336,"icon":337},"Enrichers","\u002Fuse-cases\u002Fenrichers","4.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":339,"path":340,"stem":341,"children":342,"page":24},"Extend","\u002Fextend","5.extend",[343,347,352,357,362,366,370,374,378,383,388],{"title":31,"path":344,"stem":345,"icon":346},"\u002Fextend\u002Foverview","5.extend\u002F0.overview","i-lucide-blocks",{"title":348,"path":349,"stem":350,"icon":351},"Stream","\u002Fextend\u002Fstream","5.extend\u002F1.stream","i-lucide-radio-tower",{"title":353,"path":354,"stem":355,"icon":356},"Custom framework","\u002Fextend\u002Fcustom-framework","5.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":358,"path":359,"stem":360,"icon":361},"FS reader","\u002Fextend\u002Ffs-reader","5.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":330,"path":363,"stem":364,"icon":365},"\u002Fextend\u002Fconsumer-recipes","5.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":367,"path":368,"stem":369,"icon":346},"Plugins","\u002Fextend\u002Fplugins","5.extend\u002F4.plugins",{"title":371,"path":372,"stem":373,"icon":337},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","5.extend\u002F5.custom-enrichers",{"title":375,"path":376,"stem":377,"icon":59},"Tail sampling","\u002Fextend\u002Ftail-sampling","5.extend\u002F6.tail-sampling",{"title":379,"path":380,"stem":381,"icon":382},"Identity headers","\u002Fextend\u002Fidentity-headers","5.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":384,"path":385,"stem":386,"icon":387},"Custom drains","\u002Fextend\u002Fcustom-drains","5.extend\u002F8.custom-drains","i-lucide-share-2",{"title":389,"path":390,"stem":391,"icon":392},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","5.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":394,"path":395,"stem":396,"children":397,"page":24},"Reference","\u002Freference","6.reference",[398,403,406,411,415,420],{"title":399,"path":400,"stem":401,"icon":402},"Configuration","\u002Freference\u002Fconfiguration","6.reference\u002F1.configuration","i-lucide-settings",{"title":297,"path":404,"stem":405,"icon":300},"\u002Freference\u002Fperformance","6.reference\u002F2.performance",{"title":407,"path":408,"stem":409,"icon":410},"Vite Plugin","\u002Freference\u002Fvite-plugin","6.reference\u002F3.vite-plugin","i-custom-vite",{"title":412,"path":413,"stem":414,"icon":303},"Best Practices","\u002Freference\u002Fbest-practices","6.reference\u002F4.best-practices",{"title":416,"path":417,"stem":418,"icon":419},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","6.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":421,"path":422,"stem":423,"icon":337},"Agent Skills","\u002Freference\u002Fagent-skills","6.reference\u002F6.agent-skills",{"id":425,"title":426,"body":427,"description":1145,"extension":1146,"links":1147,"meta":1152,"navigation":1153,"path":289,"seo":1154,"stem":290,"__hash__":1155},"docs\u002F4.use-cases\u002F3.better-auth\u002F03.middleware.md","createAuthMiddleware",{"type":428,"value":429,"toc":1139},"minimark",[430,441,596,610,614,625,728,732,735,820,823,878,900,904,910,1085,1097,1118,1122,1135],[431,432,433,436,437,440],"p",{},[434,435,426],"code",{}," wraps ",[434,438,439],{},"identifyUser"," with the things you need on every request: route filtering, session resolution timing, lifecycle hooks, and silent error handling. Call it once at startup, then use the returned function in your framework's middleware\u002Fhook system.",[442,443,449],"pre",{"className":444,"code":445,"filename":446,"language":447,"meta":448,"style":448},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createAuthMiddleware } from 'evlog\u002Fbetter-auth'\n\nconst identify = createAuthMiddleware(auth, {\n  exclude: ['\u002Fapi\u002Fauth\u002F**', '\u002Fapi\u002Fpublic\u002F**'],\n  include: ['\u002Fapi\u002F**'],\n  maskEmail: true,\n})\n","server\u002Fmiddleware\u002Fauth-identify.ts","typescript","",[434,450,451,484,491,516,552,573,587],{"__ignoreMap":448},[452,453,456,460,464,468,471,474,477,481],"span",{"class":454,"line":455},"line",1,[452,457,459],{"class":458},"s7zQu","import",[452,461,463],{"class":462},"sMK4o"," {",[452,465,467],{"class":466},"sTEyZ"," createAuthMiddleware",[452,469,470],{"class":462}," }",[452,472,473],{"class":458}," from",[452,475,476],{"class":462}," '",[452,478,480],{"class":479},"sfazB","evlog\u002Fbetter-auth",[452,482,483],{"class":462},"'\n",[452,485,487],{"class":454,"line":486},2,[452,488,490],{"emptyLinePlaceholder":489},true,"\n",[452,492,494,498,501,504,507,510,513],{"class":454,"line":493},3,[452,495,497],{"class":496},"spNyl","const",[452,499,500],{"class":466}," identify ",[452,502,503],{"class":462},"=",[452,505,467],{"class":506},"s2Zo4",[452,508,509],{"class":466},"(auth",[452,511,512],{"class":462},",",[452,514,515],{"class":462}," {\n",[452,517,519,523,526,529,532,535,537,539,541,544,546,549],{"class":454,"line":518},4,[452,520,522],{"class":521},"swJcz","  exclude",[452,524,525],{"class":462},":",[452,527,528],{"class":466}," [",[452,530,531],{"class":462},"'",[452,533,534],{"class":479},"\u002Fapi\u002Fauth\u002F**",[452,536,531],{"class":462},[452,538,512],{"class":462},[452,540,476],{"class":462},[452,542,543],{"class":479},"\u002Fapi\u002Fpublic\u002F**",[452,545,531],{"class":462},[452,547,548],{"class":466},"]",[452,550,551],{"class":462},",\n",[452,553,555,558,560,562,564,567,569,571],{"class":454,"line":554},5,[452,556,557],{"class":521},"  include",[452,559,525],{"class":462},[452,561,528],{"class":466},[452,563,531],{"class":462},[452,565,566],{"class":479},"\u002Fapi\u002F**",[452,568,531],{"class":462},[452,570,548],{"class":466},[452,572,551],{"class":462},[452,574,576,579,581,585],{"class":454,"line":575},6,[452,577,578],{"class":521},"  maskEmail",[452,580,525],{"class":462},[452,582,584],{"class":583},"sfNiH"," true",[452,586,551],{"class":462},[452,588,590,593],{"class":454,"line":589},7,[452,591,592],{"class":462},"}",[452,594,595],{"class":466},")\n",[431,597,598,599,602,603,605,606,609],{},"The function signature is ",[434,600,601],{},"(log, headers, path?) => Promise\u003Cboolean>",". It resolves the session, calls ",[434,604,439],{},", captures timing into ",[434,607,608],{},"auth.resolvedIn",", fires lifecycle hooks, and silently catches errors so session resolution never breaks a request.",[611,612,259],"h2",{"id":613},"options",[431,615,616,617,624],{},"Inherits all ",[618,619,621,623],"a",{"href":620},"\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user#options",[434,622,439],{}," options",", plus:",[626,627,628,647],"table",{},[629,630,631],"thead",{},[632,633,634,638,641,644],"tr",{},[635,636,637],"th",{},"Option",[635,639,640],{},"Type",[635,642,643],{},"Default",[635,645,646],{},"Description",[648,649,650,671,690,709],"tbody",{},[632,651,652,658,663,668],{},[653,654,655],"td",{},[434,656,657],{},"exclude",[653,659,660],{},[434,661,662],{},"string[]",[653,664,665],{},[434,666,667],{},"['\u002Fapi\u002Fauth\u002F**']",[653,669,670],{},"Route patterns to skip (glob).",[632,672,673,678,682,687],{},[653,674,675],{},[434,676,677],{},"include",[653,679,680],{},[434,681,662],{},[653,683,684],{},[434,685,686],{},"undefined",[653,688,689],{},"If set, only matching routes are resolved.",[632,691,692,697,702,706],{},[653,693,694],{},[434,695,696],{},"onIdentify",[653,698,699],{},[434,700,701],{},"(log, session) => void",[653,703,704],{},[434,705,686],{},[653,707,708],{},"Called after successful identification.",[632,710,711,716,721,725],{},[653,712,713],{},[434,714,715],{},"onAnonymous",[653,717,718],{},[434,719,720],{},"(log) => void",[653,722,723],{},[434,724,686],{},[653,726,727],{},"Called when no session is found.",[611,729,731],{"id":730},"route-filtering","Route Filtering",[431,733,734],{},"Skip Better Auth's own routes and any public endpoints to avoid wasted database queries:",[442,736,738],{"className":444,"code":737,"language":447,"meta":448,"style":448},"const identify = createAuthMiddleware(auth, {\n  exclude: [\n    '\u002Fapi\u002Fauth\u002F**',     \u002F\u002F Better Auth itself\n    '\u002Fapi\u002Fpublic\u002F**',   \u002F\u002F Public endpoints\n    '\u002Fapi\u002Fhealth',      \u002F\u002F Health checks\n  ],\n})\n",[434,739,740,756,765,780,793,807,814],{"__ignoreMap":448},[452,741,742,744,746,748,750,752,754],{"class":454,"line":455},[452,743,497],{"class":496},[452,745,500],{"class":466},[452,747,503],{"class":462},[452,749,467],{"class":506},[452,751,509],{"class":466},[452,753,512],{"class":462},[452,755,515],{"class":462},[452,757,758,760,762],{"class":454,"line":486},[452,759,522],{"class":521},[452,761,525],{"class":462},[452,763,764],{"class":466}," [\n",[452,766,767,770,772,774,776],{"class":454,"line":493},[452,768,769],{"class":462},"    '",[452,771,534],{"class":479},[452,773,531],{"class":462},[452,775,512],{"class":462},[452,777,779],{"class":778},"sHwdD","     \u002F\u002F Better Auth itself\n",[452,781,782,784,786,788,790],{"class":454,"line":518},[452,783,769],{"class":462},[452,785,543],{"class":479},[452,787,531],{"class":462},[452,789,512],{"class":462},[452,791,792],{"class":778},"   \u002F\u002F Public endpoints\n",[452,794,795,797,800,802,804],{"class":454,"line":554},[452,796,769],{"class":462},[452,798,799],{"class":479},"\u002Fapi\u002Fhealth",[452,801,531],{"class":462},[452,803,512],{"class":462},[452,805,806],{"class":778},"      \u002F\u002F Health checks\n",[452,808,809,812],{"class":454,"line":575},[452,810,811],{"class":466},"  ]",[452,813,551],{"class":462},[452,815,816,818],{"class":454,"line":589},[452,817,592],{"class":462},[452,819,595],{"class":466},[431,821,822],{},"For high-traffic apps, flip the model — only resolve sessions on routes that need them:",[442,824,826],{"className":444,"code":825,"language":447,"meta":448,"style":448},"const identify = createAuthMiddleware(auth, {\n  include: ['\u002Fapi\u002Fdashboard\u002F**', '\u002Fapi\u002Faccount\u002F**'],\n})\n",[434,827,828,844,872],{"__ignoreMap":448},[452,829,830,832,834,836,838,840,842],{"class":454,"line":455},[452,831,497],{"class":496},[452,833,500],{"class":466},[452,835,503],{"class":462},[452,837,467],{"class":506},[452,839,509],{"class":466},[452,841,512],{"class":462},[452,843,515],{"class":462},[452,845,846,848,850,852,854,857,859,861,863,866,868,870],{"class":454,"line":486},[452,847,557],{"class":521},[452,849,525],{"class":462},[452,851,528],{"class":466},[452,853,531],{"class":462},[452,855,856],{"class":479},"\u002Fapi\u002Fdashboard\u002F**",[452,858,531],{"class":462},[452,860,512],{"class":462},[452,862,476],{"class":462},[452,864,865],{"class":479},"\u002Fapi\u002Faccount\u002F**",[452,867,531],{"class":462},[452,869,548],{"class":466},[452,871,551],{"class":462},[452,873,874,876],{"class":454,"line":493},[452,875,592],{"class":462},[452,877,595],{"class":466},[431,879,880,882,883,885,886,889,890,893,894,896,897,899],{},[434,881,677],{}," and ",[434,884,657],{}," use glob patterns (",[434,887,888],{},"*",", ",[434,891,892],{},"**","). Provide both if you need granular control — ",[434,895,657],{}," wins over ",[434,898,677],{},".",[611,901,903],{"id":902},"lifecycle-hooks","Lifecycle Hooks",[431,905,906,907,909],{},"Use ",[434,908,696],{}," to react to user identification — for example, force-keep logs for premium users via tail sampling:",[442,911,913],{"className":444,"code":912,"filename":446,"language":447,"meta":448,"style":448},"const identify = createAuthMiddleware(auth, {\n  onIdentify: (log, session) => {\n    if (session.user.plan === 'enterprise') {\n      log.set({ _forceKeep: true })\n    }\n  },\n  onAnonymous: (log) => {\n    log.set({ anonymous: true })\n  },\n})\n",[434,914,915,931,958,994,1021,1026,1031,1048,1073,1078],{"__ignoreMap":448},[452,916,917,919,921,923,925,927,929],{"class":454,"line":455},[452,918,497],{"class":496},[452,920,500],{"class":466},[452,922,503],{"class":462},[452,924,467],{"class":506},[452,926,509],{"class":466},[452,928,512],{"class":462},[452,930,515],{"class":462},[452,932,933,936,938,941,945,947,950,953,956],{"class":454,"line":486},[452,934,935],{"class":506},"  onIdentify",[452,937,525],{"class":462},[452,939,940],{"class":462}," (",[452,942,944],{"class":943},"sHdIc","log",[452,946,512],{"class":462},[452,948,949],{"class":943}," session",[452,951,952],{"class":462},")",[452,954,955],{"class":496}," =>",[452,957,515],{"class":462},[452,959,960,963,965,968,970,973,975,978,981,983,986,988,991],{"class":454,"line":493},[452,961,962],{"class":458},"    if",[452,964,940],{"class":521},[452,966,967],{"class":466},"session",[452,969,899],{"class":462},[452,971,972],{"class":466},"user",[452,974,899],{"class":462},[452,976,977],{"class":466},"plan",[452,979,980],{"class":462}," ===",[452,982,476],{"class":462},[452,984,985],{"class":479},"enterprise",[452,987,531],{"class":462},[452,989,990],{"class":521},") ",[452,992,993],{"class":462},"{\n",[452,995,996,999,1001,1004,1007,1010,1013,1015,1017,1019],{"class":454,"line":518},[452,997,998],{"class":466},"      log",[452,1000,899],{"class":462},[452,1002,1003],{"class":506},"set",[452,1005,1006],{"class":521},"(",[452,1008,1009],{"class":462},"{",[452,1011,1012],{"class":521}," _forceKeep",[452,1014,525],{"class":462},[452,1016,584],{"class":583},[452,1018,470],{"class":462},[452,1020,595],{"class":521},[452,1022,1023],{"class":454,"line":554},[452,1024,1025],{"class":462},"    }\n",[452,1027,1028],{"class":454,"line":575},[452,1029,1030],{"class":462},"  },\n",[452,1032,1033,1036,1038,1040,1042,1044,1046],{"class":454,"line":589},[452,1034,1035],{"class":506},"  onAnonymous",[452,1037,525],{"class":462},[452,1039,940],{"class":462},[452,1041,944],{"class":943},[452,1043,952],{"class":462},[452,1045,955],{"class":496},[452,1047,515],{"class":462},[452,1049,1051,1054,1056,1058,1060,1062,1065,1067,1069,1071],{"class":454,"line":1050},8,[452,1052,1053],{"class":466},"    log",[452,1055,899],{"class":462},[452,1057,1003],{"class":506},[452,1059,1006],{"class":521},[452,1061,1009],{"class":462},[452,1063,1064],{"class":521}," anonymous",[452,1066,525],{"class":462},[452,1068,584],{"class":583},[452,1070,470],{"class":462},[452,1072,595],{"class":521},[452,1074,1076],{"class":454,"line":1075},9,[452,1077,1030],{"class":462},[452,1079,1081,1083],{"class":454,"line":1080},10,[452,1082,592],{"class":462},[452,1084,595],{"class":466},[431,1086,1087,1088,1090,1091,1093,1094,1096],{},"Hooks fire after the session is resolved and ",[434,1089,439],{}," has set its fields. They run on every request that passes the ",[434,1092,677],{},"\u002F",[434,1095,657],{}," filter, so keep them fast and side-effect-free.",[1098,1099,1100,1105],"tip",{},[431,1101,1102,1103,525],{},"Common patterns for ",[434,1104,696],{},[1106,1107,1108,1112,1115],"ul",{},[1109,1110,1111],"li",{},"Force-keep audit logs for admins or high-value plans.",[1109,1113,1114],{},"Tag the request with feature flags or tenant info loaded from the session.",[1109,1116,1117],{},"Increment a per-user counter for billing.",[611,1119,1121],{"id":1120},"error-handling","Error Handling",[431,1123,1124,1125,1128,1129,882,1131,1134],{},"The middleware catches every error from ",[434,1126,1127],{},"getSession"," and logs nothing — your request keeps flowing whether the auth backend is up or down. The wide event still includes ",[434,1130,608],{},[434,1132,1133],{},"auth.identified: false"," so you can alert on session resolution health from your dashboards.",[1136,1137,1138],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":448,"searchDepth":486,"depth":486,"links":1140},[1141,1142,1143,1144],{"id":613,"depth":486,"text":259},{"id":730,"depth":486,"text":731},{"id":902,"depth":486,"text":903},{"id":1120,"depth":486,"text":1121},"Framework-agnostic factory with route filtering, session timing, and lifecycle hooks. Call it once at startup and reuse across requests.","md",[1148,1151],{"label":283,"icon":286,"to":284,"color":1149,"variant":1150},"neutral","subtle",{"label":297,"icon":300,"to":298,"color":1149,"variant":1150},{},{"title":288,"icon":291},{"title":426,"description":1145},"Ft-jGRp0Xs3NjYmYAXhrK-z4jsNG1S1GJbOMZWpMh0E",[1157,1159],{"title":283,"path":284,"stem":285,"description":1158,"icon":286,"children":-1},"The core building block — extract safe user fields, mask emails, and capture plugin data (organizations, roles, 2FA) from a Better Auth session.",{"title":293,"path":294,"stem":295,"description":1160,"icon":243,"children":-1},"Mirror the server-side user identity into client-side logs by watching the Better Auth session and calling setIdentity.",1778365369762]