storage.ts 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { AgentUser } from "@/features/agent/types";
  2. const AGENT_ID_KEY = "agent_user_id";
  3. const AGENT_USERNAME_KEY = "agent_username";
  4. const AGENT_ROLE_KEY = "agent_role";
  5. const AGENT_WS_TOKEN_KEY = "agent_ws_token";
  6. const AGENT_WS_TOKEN_EXP_KEY = "agent_ws_token_exp";
  7. const isBrowser = () => typeof window !== "undefined";
  8. export function getAgentUser(): AgentUser | null {
  9. if (!isBrowser()) {
  10. return null;
  11. }
  12. const id = window.localStorage.getItem(AGENT_ID_KEY);
  13. const username = window.localStorage.getItem(AGENT_USERNAME_KEY);
  14. const role = window.localStorage.getItem(AGENT_ROLE_KEY);
  15. const permissionsRaw = window.localStorage.getItem("agent_permissions");
  16. if (!id || !username) {
  17. return null;
  18. }
  19. const parsedId = Number.parseInt(id, 10);
  20. if (Number.isNaN(parsedId)) {
  21. return null;
  22. }
  23. return {
  24. id: parsedId,
  25. username,
  26. role: role ?? "",
  27. permissions: (() => {
  28. if (!permissionsRaw) return undefined;
  29. try {
  30. const parsed = JSON.parse(permissionsRaw);
  31. return Array.isArray(parsed) ? (parsed as string[]) : undefined;
  32. } catch {
  33. return undefined;
  34. }
  35. })(),
  36. };
  37. }
  38. export function setAgentUser(agent: AgentUser): void {
  39. if (!isBrowser()) {
  40. return;
  41. }
  42. window.localStorage.setItem(AGENT_ID_KEY, String(agent.id));
  43. window.localStorage.setItem(AGENT_USERNAME_KEY, agent.username);
  44. window.localStorage.setItem(AGENT_ROLE_KEY, agent.role ?? "");
  45. if (agent.permissions) {
  46. window.localStorage.setItem("agent_permissions", JSON.stringify(agent.permissions));
  47. } else {
  48. window.localStorage.removeItem("agent_permissions");
  49. }
  50. }
  51. export function clearAgentUser(): void {
  52. if (!isBrowser()) {
  53. return;
  54. }
  55. window.localStorage.removeItem(AGENT_ID_KEY);
  56. window.localStorage.removeItem(AGENT_USERNAME_KEY);
  57. window.localStorage.removeItem(AGENT_ROLE_KEY);
  58. window.localStorage.removeItem("agent_permissions");
  59. window.localStorage.removeItem(AGENT_WS_TOKEN_KEY);
  60. window.localStorage.removeItem(AGENT_WS_TOKEN_EXP_KEY);
  61. }
  62. export function getAgentWSToken(): string | null {
  63. if (!isBrowser()) return null;
  64. const token = window.localStorage.getItem(AGENT_WS_TOKEN_KEY);
  65. const expRaw = window.localStorage.getItem(AGENT_WS_TOKEN_EXP_KEY);
  66. if (!token || !expRaw) return null;
  67. const exp = Number.parseInt(expRaw, 10);
  68. if (Number.isNaN(exp)) return null;
  69. const nowSec = Math.floor(Date.now() / 1000);
  70. if (exp <= nowSec) return null;
  71. return token;
  72. }
  73. export function setAgentWSToken(token: string, expireAtUnix: number): void {
  74. if (!isBrowser()) return;
  75. window.localStorage.setItem(AGENT_WS_TOKEN_KEY, token);
  76. window.localStorage.setItem(AGENT_WS_TOKEN_EXP_KEY, String(expireAtUnix));
  77. }