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