Add request-scoped context for session.getUser()

Use AsyncLocalStorage to provide request context so services can access
the current user without needing Call passed through every function.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-11 14:56:10 -06:00
parent afcb447b2b
commit 55f5cc699d
3 changed files with 36 additions and 4 deletions

27
express/context.ts Normal file
View File

@@ -0,0 +1,27 @@
// context.ts
//
// Request-scoped context using AsyncLocalStorage.
// Allows services to access request data (like the current user) without
// needing to pass Call through every function.
import { AsyncLocalStorage } from "node:async_hooks";
import { AnonymousUser, type MaybeUser } from "./user";
type RequestContext = {
user: MaybeUser;
};
const asyncLocalStorage = new AsyncLocalStorage<RequestContext>();
// Run a function within a request context
function runWithContext<T>(context: RequestContext, fn: () => T): T {
return asyncLocalStorage.run(context, fn);
}
// Get the current user from context, or AnonymousUser if not in a request
function getCurrentUser(): MaybeUser {
const context = asyncLocalStorage.getStore();
return context?.user ?? AnonymousUser;
}
export { getCurrentUser, runWithContext, type RequestContext };