Initial Mebbling hub implementation

This commit is contained in:
2026-07-19 00:29:30 +08:00
commit e6ebdb0576
41 changed files with 2571 additions and 0 deletions
+15
View File
@@ -0,0 +1,15 @@
import { SignJWT, jwtVerify } from "jose";
import { cookies } from "next/headers";
const secret = () => new TextEncoder().encode(process.env.SESSION_SECRET || "development-only-change-me");
export type Session = { id: number; username: string; role: string };
export async function createSession(user: Session) {
const token = await new SignJWT(user).setProtectedHeader({ alg: "HS256" }).setIssuedAt().setExpirationTime("7d").sign(secret());
(await cookies()).set("hub_session", token, { httpOnly: true, sameSite: "lax", secure: process.env.NODE_ENV === "production", path: "/", maxAge: 604800 });
}
export async function getSession(): Promise<Session | null> {
const token = (await cookies()).get("hub_session")?.value; if (!token) return null;
try { return (await jwtVerify(token, secret())).payload as unknown as Session; } catch { return null; }
}
export async function requireUser() { const user = await getSession(); if (!user) throw new Error("Unauthorized"); return user; }
export async function clearSession() { (await cookies()).delete("hub_session"); }