/** 解析 JWT payload（RFC 7519 base64url）。 */
export function parseJwtPayload(token: string): Record<string, unknown> | null {
  const parts = token.split(".");
  if (parts.length !== 3) return null;

  try {
    const base64 = parts[1].replace(/-/g, "+").replace(/_/g, "/");
    const padded = base64 + "=".repeat((4 - (base64.length % 4)) % 4);
    const json = atob(padded);
    const payload = JSON.parse(json) as Record<string, unknown>;
    return payload;
  } catch {
    return null;
  }
}

/** 返回 JWT `exp`（秒级 Unix 时间戳），解析失败返回 null。 */
export function parseJwtExp(token: string | null): number | null {
  if (!token) return null;
  const payload = parseJwtPayload(token);
  const exp = payload?.exp;
  return typeof exp === "number" ? exp : null;
}