[{"data":1,"prerenderedAt":1158},["ShallowReactive",2],{"navigation_docs":3,"-logging-better-auth-middleware":421,"-logging-better-auth-middleware-surround":1153},[4,35,159,201,289,318,405],{"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,299,304,309,314],{"title":295,"path":296,"stem":297,"icon":298},"Identity headers","\u002Fbuild-on-top\u002Fidentity-headers","5.build-on-top\u002F1.identity-headers","i-lucide-fingerprint",{"title":300,"path":301,"stem":302,"icon":303},"Stream API","\u002Fbuild-on-top\u002Fstream-api","5.build-on-top\u002F2.stream-api","i-lucide-radio-tower",{"title":305,"path":306,"stem":307,"icon":308},"SSE bridge","\u002Fbuild-on-top\u002Fsse-bridge","5.build-on-top\u002F3.sse-bridge","i-lucide-wifi",{"title":310,"path":311,"stem":312,"icon":313},"FS reader","\u002Fbuild-on-top\u002Ffs-reader","5.build-on-top\u002F4.fs-reader","i-lucide-folder-search",{"title":156,"path":315,"stem":316,"icon":317},"\u002Fbuild-on-top\u002Frecipes","5.build-on-top\u002F4.recipes","i-lucide-chef-hat",{"title":319,"path":320,"stem":321,"children":322,"page":34},"Adapters","\u002Fadapters","6.adapters",[323,326,366,381],{"title":41,"path":324,"stem":325,"icon":44},"\u002Fadapters\u002Foverview","6.adapters\u002F01.overview",{"title":327,"path":328,"stem":329,"children":330,"page":34},"Cloud destinations","\u002Fadapters\u002Fcloud","6.adapters\u002F02.cloud",[331,336,341,346,351,356,361],{"title":332,"path":333,"stem":334,"icon":335},"Axiom","\u002Fadapters\u002Fcloud\u002Faxiom","6.adapters\u002F02.cloud\u002F01.axiom","i-custom-axiom",{"title":337,"path":338,"stem":339,"icon":340},"OTLP","\u002Fadapters\u002Fcloud\u002Fotlp","6.adapters\u002F02.cloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":342,"path":343,"stem":344,"icon":345},"PostHog","\u002Fadapters\u002Fcloud\u002Fposthog","6.adapters\u002F02.cloud\u002F03.posthog","i-simple-icons-posthog",{"title":347,"path":348,"stem":349,"icon":350},"Sentry","\u002Fadapters\u002Fcloud\u002Fsentry","6.adapters\u002F02.cloud\u002F04.sentry","i-simple-icons-sentry",{"title":352,"path":353,"stem":354,"icon":355},"Better Stack","\u002Fadapters\u002Fcloud\u002Fbetter-stack","6.adapters\u002F02.cloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":357,"path":358,"stem":359,"icon":360},"Datadog","\u002Fadapters\u002Fcloud\u002Fdatadog","6.adapters\u002F02.cloud\u002F06.datadog","i-simple-icons-datadog",{"title":362,"path":363,"stem":364,"icon":365},"HyperDX","\u002Fadapters\u002Fcloud\u002Fhyperdx","6.adapters\u002F02.cloud\u002F07.hyperdx","i-custom-hyperdx",{"title":367,"path":368,"stem":369,"children":370,"page":34},"Self-hosted","\u002Fadapters\u002Fself-hosted","6.adapters\u002F03.self-hosted",[371,376],{"title":372,"path":373,"stem":374,"icon":375},"File System","\u002Fadapters\u002Fself-hosted\u002Ffs","6.adapters\u002F03.self-hosted\u002F01.fs","i-lucide-hard-drive",{"title":377,"path":378,"stem":379,"icon":380},"NuxtHub","\u002Fadapters\u002Fself-hosted\u002Fnuxthub","6.adapters\u002F03.self-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":382,"path":383,"stem":384,"children":385,"page":34},"Building blocks","\u002Fadapters\u002Fbuilding-blocks","6.adapters\u002F04.building-blocks",[386,391,396,400],{"title":387,"path":388,"stem":389,"icon":390},"Pipeline","\u002Fadapters\u002Fbuilding-blocks\u002Fpipeline","6.adapters\u002F04.building-blocks\u002F01.pipeline","i-lucide-workflow",{"title":392,"path":393,"stem":394,"icon":395},"HTTP","\u002Fadapters\u002Fbuilding-blocks\u002Fhttp","6.adapters\u002F04.building-blocks\u002F02.http","i-lucide-globe",{"title":397,"path":398,"stem":399,"icon":83},"Custom Adapters","\u002Fadapters\u002Fbuilding-blocks\u002Fcustom","6.adapters\u002F04.building-blocks\u002F03.custom",{"title":401,"path":402,"stem":403,"icon":404},"Toolkit","\u002Fadapters\u002Fbuilding-blocks\u002Ftoolkit","6.adapters\u002F04.building-blocks\u002F04.toolkit","i-lucide-blocks",{"title":406,"path":407,"stem":408,"children":409,"page":34},"Enrichers","\u002Fenrichers","7.enrichers",[410,413,417],{"title":41,"path":411,"stem":412,"icon":28},"\u002Fenrichers\u002Foverview","7.enrichers\u002F1.overview",{"title":414,"path":415,"stem":416,"icon":288},"Built-in","\u002Fenrichers\u002Fbuilt-in","7.enrichers\u002F2.built-in",{"title":418,"path":419,"stem":420,"icon":83},"Custom","\u002Fenrichers\u002Fcustom","7.enrichers\u002F3.custom",{"id":422,"title":423,"body":424,"description":1142,"extension":1143,"links":1144,"meta":1149,"navigation":1150,"path":115,"seo":1151,"stem":116,"__hash__":1152},"docs\u002F2.logging\u002F7.better-auth\u002F03.middleware.md","createAuthMiddleware",{"type":425,"value":426,"toc":1136},"minimark",[427,438,593,607,611,622,725,729,732,817,820,875,897,901,907,1082,1094,1115,1119,1132],[428,429,430,433,434,437],"p",{},[431,432,423],"code",{}," wraps ",[431,435,436],{},"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.",[439,440,446],"pre",{"className":441,"code":442,"filename":443,"language":444,"meta":445,"style":445},"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","",[431,447,448,481,488,513,549,570,584],{"__ignoreMap":445},[449,450,453,457,461,465,468,471,474,478],"span",{"class":451,"line":452},"line",1,[449,454,456],{"class":455},"s7zQu","import",[449,458,460],{"class":459},"sMK4o"," {",[449,462,464],{"class":463},"sTEyZ"," createAuthMiddleware",[449,466,467],{"class":459}," }",[449,469,470],{"class":455}," from",[449,472,473],{"class":459}," '",[449,475,477],{"class":476},"sfazB","evlog\u002Fbetter-auth",[449,479,480],{"class":459},"'\n",[449,482,484],{"class":451,"line":483},2,[449,485,487],{"emptyLinePlaceholder":486},true,"\n",[449,489,491,495,498,501,504,507,510],{"class":451,"line":490},3,[449,492,494],{"class":493},"spNyl","const",[449,496,497],{"class":463}," identify ",[449,499,500],{"class":459},"=",[449,502,464],{"class":503},"s2Zo4",[449,505,506],{"class":463},"(auth",[449,508,509],{"class":459},",",[449,511,512],{"class":459}," {\n",[449,514,516,520,523,526,529,532,534,536,538,541,543,546],{"class":451,"line":515},4,[449,517,519],{"class":518},"swJcz","  exclude",[449,521,522],{"class":459},":",[449,524,525],{"class":463}," [",[449,527,528],{"class":459},"'",[449,530,531],{"class":476},"\u002Fapi\u002Fauth\u002F**",[449,533,528],{"class":459},[449,535,509],{"class":459},[449,537,473],{"class":459},[449,539,540],{"class":476},"\u002Fapi\u002Fpublic\u002F**",[449,542,528],{"class":459},[449,544,545],{"class":463},"]",[449,547,548],{"class":459},",\n",[449,550,552,555,557,559,561,564,566,568],{"class":451,"line":551},5,[449,553,554],{"class":518},"  include",[449,556,522],{"class":459},[449,558,525],{"class":463},[449,560,528],{"class":459},[449,562,563],{"class":476},"\u002Fapi\u002F**",[449,565,528],{"class":459},[449,567,545],{"class":463},[449,569,548],{"class":459},[449,571,573,576,578,582],{"class":451,"line":572},6,[449,574,575],{"class":518},"  maskEmail",[449,577,522],{"class":459},[449,579,581],{"class":580},"sfNiH"," true",[449,583,548],{"class":459},[449,585,587,590],{"class":451,"line":586},7,[449,588,589],{"class":459},"}",[449,591,592],{"class":463},")\n",[428,594,595,596,599,600,602,603,606],{},"The function signature is ",[431,597,598],{},"(log, headers, path?) => Promise\u003Cboolean>",". It resolves the session, calls ",[431,601,436],{},", captures timing into ",[431,604,605],{},"auth.resolvedIn",", fires lifecycle hooks, and silently catches errors so session resolution never breaks a request.",[608,609,85],"h2",{"id":610},"options",[428,612,613,614,621],{},"Inherits all ",[615,616,618,620],"a",{"href":617},"\u002Flogging\u002Fbetter-auth\u002Fidentify-user#options",[431,619,436],{}," options",", plus:",[623,624,625,644],"table",{},[626,627,628],"thead",{},[629,630,631,635,638,641],"tr",{},[632,633,634],"th",{},"Option",[632,636,637],{},"Type",[632,639,640],{},"Default",[632,642,643],{},"Description",[645,646,647,668,687,706],"tbody",{},[629,648,649,655,660,665],{},[650,651,652],"td",{},[431,653,654],{},"exclude",[650,656,657],{},[431,658,659],{},"string[]",[650,661,662],{},[431,663,664],{},"['\u002Fapi\u002Fauth\u002F**']",[650,666,667],{},"Route patterns to skip (glob).",[629,669,670,675,679,684],{},[650,671,672],{},[431,673,674],{},"include",[650,676,677],{},[431,678,659],{},[650,680,681],{},[431,682,683],{},"undefined",[650,685,686],{},"If set, only matching routes are resolved.",[629,688,689,694,699,703],{},[650,690,691],{},[431,692,693],{},"onIdentify",[650,695,696],{},[431,697,698],{},"(log, session) => void",[650,700,701],{},[431,702,683],{},[650,704,705],{},"Called after successful identification.",[629,707,708,713,718,722],{},[650,709,710],{},[431,711,712],{},"onAnonymous",[650,714,715],{},[431,716,717],{},"(log) => void",[650,719,720],{},[431,721,683],{},[650,723,724],{},"Called when no session is found.",[608,726,728],{"id":727},"route-filtering","Route Filtering",[428,730,731],{},"Skip Better Auth's own routes and any public endpoints to avoid wasted database queries:",[439,733,735],{"className":441,"code":734,"language":444,"meta":445,"style":445},"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",[431,736,737,753,762,777,790,804,811],{"__ignoreMap":445},[449,738,739,741,743,745,747,749,751],{"class":451,"line":452},[449,740,494],{"class":493},[449,742,497],{"class":463},[449,744,500],{"class":459},[449,746,464],{"class":503},[449,748,506],{"class":463},[449,750,509],{"class":459},[449,752,512],{"class":459},[449,754,755,757,759],{"class":451,"line":483},[449,756,519],{"class":518},[449,758,522],{"class":459},[449,760,761],{"class":463}," [\n",[449,763,764,767,769,771,773],{"class":451,"line":490},[449,765,766],{"class":459},"    '",[449,768,531],{"class":476},[449,770,528],{"class":459},[449,772,509],{"class":459},[449,774,776],{"class":775},"sHwdD","     \u002F\u002F Better Auth itself\n",[449,778,779,781,783,785,787],{"class":451,"line":515},[449,780,766],{"class":459},[449,782,540],{"class":476},[449,784,528],{"class":459},[449,786,509],{"class":459},[449,788,789],{"class":775},"   \u002F\u002F Public endpoints\n",[449,791,792,794,797,799,801],{"class":451,"line":551},[449,793,766],{"class":459},[449,795,796],{"class":476},"\u002Fapi\u002Fhealth",[449,798,528],{"class":459},[449,800,509],{"class":459},[449,802,803],{"class":775},"      \u002F\u002F Health checks\n",[449,805,806,809],{"class":451,"line":572},[449,807,808],{"class":463},"  ]",[449,810,548],{"class":459},[449,812,813,815],{"class":451,"line":586},[449,814,589],{"class":459},[449,816,592],{"class":463},[428,818,819],{},"For high-traffic apps, flip the model — only resolve sessions on routes that need them:",[439,821,823],{"className":441,"code":822,"language":444,"meta":445,"style":445},"const identify = createAuthMiddleware(auth, {\n  include: ['\u002Fapi\u002Fdashboard\u002F**', '\u002Fapi\u002Faccount\u002F**'],\n})\n",[431,824,825,841,869],{"__ignoreMap":445},[449,826,827,829,831,833,835,837,839],{"class":451,"line":452},[449,828,494],{"class":493},[449,830,497],{"class":463},[449,832,500],{"class":459},[449,834,464],{"class":503},[449,836,506],{"class":463},[449,838,509],{"class":459},[449,840,512],{"class":459},[449,842,843,845,847,849,851,854,856,858,860,863,865,867],{"class":451,"line":483},[449,844,554],{"class":518},[449,846,522],{"class":459},[449,848,525],{"class":463},[449,850,528],{"class":459},[449,852,853],{"class":476},"\u002Fapi\u002Fdashboard\u002F**",[449,855,528],{"class":459},[449,857,509],{"class":459},[449,859,473],{"class":459},[449,861,862],{"class":476},"\u002Fapi\u002Faccount\u002F**",[449,864,528],{"class":459},[449,866,545],{"class":463},[449,868,548],{"class":459},[449,870,871,873],{"class":451,"line":490},[449,872,589],{"class":459},[449,874,592],{"class":463},[428,876,877,879,880,882,883,886,887,890,891,893,894,896],{},[431,878,674],{}," and ",[431,881,654],{}," use glob patterns (",[431,884,885],{},"*",", ",[431,888,889],{},"**","). Provide both if you need granular control — ",[431,892,654],{}," wins over ",[431,895,674],{},".",[608,898,900],{"id":899},"lifecycle-hooks","Lifecycle Hooks",[428,902,903,904,906],{},"Use ",[431,905,693],{}," to react to user identification — for example, force-keep logs for premium users via tail sampling:",[439,908,910],{"className":441,"code":909,"filename":443,"language":444,"meta":445,"style":445},"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",[431,911,912,928,955,991,1018,1023,1028,1045,1070,1075],{"__ignoreMap":445},[449,913,914,916,918,920,922,924,926],{"class":451,"line":452},[449,915,494],{"class":493},[449,917,497],{"class":463},[449,919,500],{"class":459},[449,921,464],{"class":503},[449,923,506],{"class":463},[449,925,509],{"class":459},[449,927,512],{"class":459},[449,929,930,933,935,938,942,944,947,950,953],{"class":451,"line":483},[449,931,932],{"class":503},"  onIdentify",[449,934,522],{"class":459},[449,936,937],{"class":459}," (",[449,939,941],{"class":940},"sHdIc","log",[449,943,509],{"class":459},[449,945,946],{"class":940}," session",[449,948,949],{"class":459},")",[449,951,952],{"class":493}," =>",[449,954,512],{"class":459},[449,956,957,960,962,965,967,970,972,975,978,980,983,985,988],{"class":451,"line":490},[449,958,959],{"class":455},"    if",[449,961,937],{"class":518},[449,963,964],{"class":463},"session",[449,966,896],{"class":459},[449,968,969],{"class":463},"user",[449,971,896],{"class":459},[449,973,974],{"class":463},"plan",[449,976,977],{"class":459}," ===",[449,979,473],{"class":459},[449,981,982],{"class":476},"enterprise",[449,984,528],{"class":459},[449,986,987],{"class":518},") ",[449,989,990],{"class":459},"{\n",[449,992,993,996,998,1001,1004,1007,1010,1012,1014,1016],{"class":451,"line":515},[449,994,995],{"class":463},"      log",[449,997,896],{"class":459},[449,999,1000],{"class":503},"set",[449,1002,1003],{"class":518},"(",[449,1005,1006],{"class":459},"{",[449,1008,1009],{"class":518}," _forceKeep",[449,1011,522],{"class":459},[449,1013,581],{"class":580},[449,1015,467],{"class":459},[449,1017,592],{"class":518},[449,1019,1020],{"class":451,"line":551},[449,1021,1022],{"class":459},"    }\n",[449,1024,1025],{"class":451,"line":572},[449,1026,1027],{"class":459},"  },\n",[449,1029,1030,1033,1035,1037,1039,1041,1043],{"class":451,"line":586},[449,1031,1032],{"class":503},"  onAnonymous",[449,1034,522],{"class":459},[449,1036,937],{"class":459},[449,1038,941],{"class":940},[449,1040,949],{"class":459},[449,1042,952],{"class":493},[449,1044,512],{"class":459},[449,1046,1048,1051,1053,1055,1057,1059,1062,1064,1066,1068],{"class":451,"line":1047},8,[449,1049,1050],{"class":463},"    log",[449,1052,896],{"class":459},[449,1054,1000],{"class":503},[449,1056,1003],{"class":518},[449,1058,1006],{"class":459},[449,1060,1061],{"class":518}," anonymous",[449,1063,522],{"class":459},[449,1065,581],{"class":580},[449,1067,467],{"class":459},[449,1069,592],{"class":518},[449,1071,1073],{"class":451,"line":1072},9,[449,1074,1027],{"class":459},[449,1076,1078,1080],{"class":451,"line":1077},10,[449,1079,589],{"class":459},[449,1081,592],{"class":463},[428,1083,1084,1085,1087,1088,1090,1091,1093],{},"Hooks fire after the session is resolved and ",[431,1086,436],{}," has set its fields. They run on every request that passes the ",[431,1089,674],{},"\u002F",[431,1092,654],{}," filter, so keep them fast and side-effect-free.",[1095,1096,1097,1102],"tip",{},[428,1098,1099,1100,522],{},"Common patterns for ",[431,1101,693],{},[1103,1104,1105,1109,1112],"ul",{},[1106,1107,1108],"li",{},"Force-keep audit logs for admins or high-value plans.",[1106,1110,1111],{},"Tag the request with feature flags or tenant info loaded from the session.",[1106,1113,1114],{},"Increment a per-user counter for billing.",[608,1116,1118],{"id":1117},"error-handling","Error Handling",[428,1120,1121,1122,1125,1126,879,1128,1131],{},"The middleware catches every error from ",[431,1123,1124],{},"getSession"," and logs nothing — your request keeps flowing whether the auth backend is up or down. The wide event still includes ",[431,1127,605],{},[431,1129,1130],{},"auth.identified: false"," so you can alert on session resolution health from your dashboards.",[1133,1134,1135],"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":445,"searchDepth":483,"depth":483,"links":1137},[1138,1139,1140,1141],{"id":610,"depth":483,"text":85},{"id":727,"depth":483,"text":728},{"id":899,"depth":483,"text":900},{"id":1117,"depth":483,"text":1118},"Framework-agnostic factory with route filtering, session timing, and lifecycle hooks. Call it once at startup and reuse across requests.","md",[1145,1148],{"label":109,"icon":112,"to":110,"color":1146,"variant":1147},"neutral","subtle",{"label":123,"icon":126,"to":124,"color":1146,"variant":1147},{},{"title":114,"icon":117},{"title":423,"description":1142},"ZixjaO8WGr0DIrrPIzupQI4fZZLVn2bM3EBBAoqYgdg",[1154,1156],{"title":109,"path":110,"stem":111,"description":1155,"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":1157,"icon":69,"children":-1},"Mirror the server-side user identity into client-side logs by watching the Better Auth session and calling setIdentity.",1778330170212]