mirror of
https://github.com/saltbo/zpan.git
synced 2026-09-19 10:01:12 +08:00
better-auth starts its $context init synchronously inside betterAuth(), within whichever request constructs the instance. Init eagerly resolves all social providers, and ours were 35 async functions doing one D1 query each. When the isolate's first request didn't touch auth (share SSR, /r/*, public APIs) or disconnected mid-init, its I/O context died with the queries in flight and $context never settled — on Workers a pending promise awaited from a later request never resolves, so the cached auth instance hung every subsequent auth call in the isolate (the recurring "get-session pending forever / 10s timeout" reports). - load all OAuth provider configs with one snapshot query; register builtin providers as static objects (init does zero per-provider I/O) - await auth.$context before returning from createAuth so a cached instance can never carry a pending promise tied to its creating request - only load captcha config for captcha-protected endpoints instead of every /api/auth/* request - cache the resolved site public origin at module scope (the WeakMap was keyed by the per-request db instance and never hit on Workers); cache settled values only, never promises - client: share one in-flight get-session across callers regardless of TTL, cache resolved values for 5s, never cache failures Regression tests pin the invariants: createAuth performs exactly one DB query during init and returns with $context already settled. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>