export function parseJwtPayload(token: string): Record | null { const parts = token.split("."); if (parts.length < 2) return null; try { const normalized = parts[1].replace(/-/g, "+").replace(/_/g, "/"); const decoded = typeof window !== "undefined" ? window.atob(normalized) : Buffer.from(normalized, "base64").toString("utf8"); return JSON.parse(decoded) as Record; } catch { return null; } } export function isJwtExpired(token: string, skewSeconds = 15): boolean { const payload = parseJwtPayload(token); const exp = typeof payload?.exp === "number" ? payload.exp : null; if (!exp) return false; const now = Math.floor(Date.now() / 1000); return exp <= now + skewSeconds; }