import axios from "axios"; import type { AxiosResponse } from "axios"; import { clientRuntime, DESKTOP_SERVER_URL_CHANGED_EVENT, getAppMetadataHeaders } from "../runtime"; const authClient = axios.create({ baseURL: clientRuntime.apiBaseUrl(), timeout: 15000, }); export const refreshAuthClientBaseUrl = (): void => { authClient.defaults.baseURL = clientRuntime.apiBaseUrl(); }; if (typeof window !== "undefined") { window.addEventListener(DESKTOP_SERVER_URL_CHANGED_EVENT, refreshAuthClientBaseUrl); } authClient.interceptors.request.use((config) => { config.headers = config.headers || {}; Object.assign(config.headers, getAppMetadataHeaders()); return config; }); export type ExtendResponse = { accessToken: string; expiresAt: string; }; export type LoginKeyResponse = { key_id: string; public_key: string; challenge: string; expires_at: string; }; export type SessionHeartbeatResponse = { status: "online"; last_seen_at: string; client_ip: string | null; }; export type EncryptedPasswordRequest = { key_id: string; challenge: string; ciphertext: string; }; export const extendToken = (token: string): Promise> => authClient.post( "/api/v1/auth/extend", {}, { headers: { Authorization: `Bearer ${token}`, }, } ); export const getLoginKey = (): Promise> => authClient.get("/api/v1/auth/login-key"); export const heartbeatSession = (token: string): Promise> => authClient.post( "/api/v1/auth/session/heartbeat", {}, { headers: { Authorization: `Bearer ${token}` }, timeout: 5000 }, ); export const logoutSession = (token: string): Promise> => authClient.post( "/api/v1/auth/session/logout", {}, { headers: { Authorization: `Bearer ${token}` } }, ); export default authClient;