const SESSION_DURATION_MS = 30 * 24 * 60 * 60 * 1000;
export async function hashPassword(password: string): Promise<string> {
return await Bun.password.hash(password, { algorithm: "bcrypt", cost: 10 });
}
export async function verifyPassword(
password: string,
hash: string
): Promise<boolean> {
return await Bun.password.verify(password, hash);
}
export function generateSessionToken(): string {
const bytes = crypto.getRandomValues(new Uint8Array(32));
return Array.from(bytes)
.map((b) => b.toString(16).padStart(2, "0"))
.join("");
}
export function sessionCookieOptions(): {
httpOnly: boolean;
secure: boolean;
sameSite: "Lax";
path: string;
maxAge: number;
} {
return {
httpOnly: true,
secure: process.env.NODE_ENV === "production",
sameSite: "Lax",
path: "/",
maxAge: SESSION_DURATION_MS / 1000,
};
}
export function sessionExpiry(): Date {
return new Date(Date.now() + SESSION_DURATION_MS);
}
|