|
import { createCookieSessionStorage } from "@remix-run/node"; |
|
|
|
export { getSession, commitSession, destroySession }; |
|
|
|
export interface GitHubUserInfo { |
|
userId: string; |
|
login: string; |
|
name?: string; |
|
email?: string; |
|
avatar_url?: string; |
|
} |
|
|
|
export interface HuggingFaceUserInfo { |
|
username: string; |
|
fullName?: string; |
|
email?: string; |
|
avatarUrl?: string; |
|
} |
|
|
|
export interface UserSession { |
|
github?: GitHubUserInfo; |
|
huggingface?: HuggingFaceUserInfo; |
|
isLinked: boolean; |
|
linkedAt?: string; |
|
} |
|
|
|
const sessionSecret = process.env.SESSION_SECRET; |
|
if (!sessionSecret) { |
|
throw new Error('SESSION_SECRET environment variable is required'); |
|
} |
|
|
|
const { getSession, commitSession, destroySession } = createCookieSessionStorage({ |
|
cookie: { |
|
name: "__session", |
|
httpOnly: true, |
|
maxAge: 60 * 60 * 24 * 30, |
|
path: "/", |
|
sameSite: "lax", |
|
secrets: [sessionSecret], |
|
secure: process.env.NODE_ENV === "production", |
|
}, |
|
}); |
|
|
|
export async function requireUserSession(request: Request): Promise<UserSession> { |
|
const session = await getSession(request.headers.get("Cookie")); |
|
const userSession = session.get("user"); |
|
|
|
if (!userSession) { |
|
throw new Response("Unauthorized", { status: 401 }); |
|
} |
|
|
|
return userSession; |
|
} |
|
|
|
export async function getUserSession(request: Request): Promise<UserSession | null> { |
|
const session = await getSession(request.headers.get("Cookie")); |
|
return session.get("user") || null; |
|
} |
|
|