Files
hideyoshi-blog/src/lib/session/session-storage.ts

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;
};