import { RequestCookie } from "next/dist/compiled/@edge-runtime/cookies"; import { cookies } from "next/headers"; import jwt from "jsonwebtoken"; export const VARIABLES_CONFIG = { APP_URL: process.env.NODE_ENV === "development" ? process.env.DEV_APP_URL : process.env.VERCEL_URL, VERIFIED_USER_IDENTIFIER: process.env.VERIFIED_USER_IDENTIFIER, VERIFICATION_TOKEN: process.env.VERIFICATION_TOKEN, JWT_SECRET: process.env.JWT_SECRET, }; type CookieOptions = { path?: string; domain?: string; secure?: boolean; httpOnly?: boolean; sameSite?: "strict" | "lax" | "none"; maxAge?: number; }; export interface TokenPayload { id: string; role: string; exp: number; } export const setCookie = async ( cookieName: string, value: string, options: CookieOptions = {} ) => { cookies().set(cookieName, value, { secure: process.env.NODE_ENV === "production", sameSite: "lax", maxAge: 60 * 60 * 24, ...options, }); }; export const getCookie = (cookieName: string): RequestCookie | null => { const cookieStore = cookies(); if (cookieStore.has(cookieName)) { return cookieStore.get(cookieName)!; } return null; }; export function generateToken(payload: T, expiresInMs: number): string { const expiresAt = Math.floor(Date.now() / 1000) + expiresInMs / 1000; // Expiración en segundos const secret = VARIABLES_CONFIG.JWT_SECRET!; return jwt.sign( { ...payload, exp: expiresAt }, secret, // Se agrega la expiración en el payload, // Clave secreta del entorno ); } export function extractPayload(token: string): TokenPayload | null { try { const decoded = jwt.decode(token); if (decoded && typeof decoded === "object") { return decoded as TokenPayload; } return null; } catch (error) { console.error("Error decoding token:", error); return null; } } export function isTokenValid(token: string | null): boolean { if (!token) return false; const payload = extractPayload(token); if (!payload) return false; const bufferTime = 5 * 60 * 1000; const expInMillis = payload.exp * 1000; return expInMillis >= Date.now() + bufferTime; }