2026-01-25 16:21:00 +00:00
|
|
|
import type { Context, Next } from "hono"
|
|
|
|
|
|
2026-02-22 20:59:19 +00:00
|
|
|
import type { AuthSession, AuthUser } from "./session.ts"
|
2026-01-25 16:21:00 +00:00
|
|
|
|
2026-02-22 20:59:19 +00:00
|
|
|
import { auth } from "./index.ts"
|
2026-01-25 16:21:00 +00:00
|
|
|
|
|
|
|
|
export interface SessionVariables {
|
2026-02-22 20:59:19 +00:00
|
|
|
user: AuthUser | null
|
|
|
|
|
session: AuthSession | null
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
declare module "hono" {
|
|
|
|
|
interface ContextVariableMap extends SessionVariables {}
|
2026-01-25 16:21:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Middleware that attaches session and user to the context.
|
|
|
|
|
* Does not reject unauthenticated requests - use requireSession for that.
|
|
|
|
|
*/
|
|
|
|
|
export async function sessionMiddleware(c: Context, next: Next): Promise<void> {
|
|
|
|
|
const session = await auth.api.getSession({ headers: c.req.raw.headers })
|
|
|
|
|
|
|
|
|
|
if (session) {
|
|
|
|
|
c.set("user", session.user)
|
|
|
|
|
c.set("session", session.session)
|
|
|
|
|
} else {
|
|
|
|
|
c.set("user", null)
|
|
|
|
|
c.set("session", null)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await next()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Middleware that requires a valid session. Returns 401 if not authenticated.
|
|
|
|
|
*/
|
|
|
|
|
export async function requireSession(c: Context, next: Next): Promise<Response | void> {
|
|
|
|
|
const session = await auth.api.getSession({ headers: c.req.raw.headers })
|
|
|
|
|
|
|
|
|
|
if (!session) {
|
|
|
|
|
return c.json({ error: "Unauthorized" }, 401)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
c.set("user", session.user)
|
|
|
|
|
c.set("session", session.session)
|
|
|
|
|
await next()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get session from headers. Useful for WebSocket upgrade validation.
|
|
|
|
|
*/
|
|
|
|
|
export async function getSessionFromHeaders(
|
|
|
|
|
headers: Headers,
|
2026-02-22 20:59:19 +00:00
|
|
|
): Promise<{ user: AuthUser; session: AuthSession } | null> {
|
2026-01-25 16:21:00 +00:00
|
|
|
const session = await auth.api.getSession({ headers })
|
|
|
|
|
return session
|
|
|
|
|
}
|