50 lines
1.4 KiB
TypeScript
50 lines
1.4 KiB
TypeScript
'use server';
|
|
|
|
import { SessionData } from '@/lib/session/session-data.type';
|
|
import { siteConfig } from '@/site.config';
|
|
import { getIronSession, IronSession, SessionOptions } from 'iron-session';
|
|
import { cookies } from 'next/headers';
|
|
|
|
let sessionOptions: SessionOptions | undefined;
|
|
|
|
const getSessionOptions = (): SessionOptions => {
|
|
if (!!sessionOptions) return sessionOptions;
|
|
|
|
const password = process.env.SESSION_SECRET;
|
|
if (!password) {
|
|
throw new Error('SESSION_SECRET is not set in environment variables.');
|
|
}
|
|
|
|
sessionOptions = {
|
|
cookieName: siteConfig.slug,
|
|
password: password,
|
|
cookieOptions: {
|
|
secure: process.env.NODE_ENV === 'production',
|
|
sameSite: 'lax',
|
|
maxAge: 60 * 60 * 24 * 30, // 30 days
|
|
},
|
|
};
|
|
|
|
return sessionOptions;
|
|
};
|
|
|
|
export const getSession = async (): Promise<IronSession<SessionData>> => {
|
|
return await getIronSession(await cookies(), getSessionOptions());
|
|
};
|
|
|
|
export const clearSessionData = async (): Promise<void> => {
|
|
const session = await getSession();
|
|
session.destroy();
|
|
await session.save();
|
|
};
|
|
|
|
export const getSessionData = async (): Promise<SessionData | null> => {
|
|
try {
|
|
const session = await getSession();
|
|
return SessionData.parse(session);
|
|
} catch {
|
|
await clearSessionData();
|
|
}
|
|
return null;
|
|
};
|