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