import { getCookie, removeCookie, setCookie } from "./cookie"; import type { AuthConfig } from "./types"; export function createTokenManager(config: AuthConfig) { let refreshTimer: ReturnType | null = null; const getCookieDomain = (): string | undefined => { if (typeof window === "undefined") return undefined; if (config.cookieDomain) return config.cookieDomain; return undefined; }; return { getToken(key: string): string | undefined { return getCookie(key); }, setToken(key: string, value: string): void { const domain = getCookieDomain(); const isHttps = typeof window !== "undefined" && window.location.protocol === "https:"; setCookie(key, value, { secure: isHttps, sameSite: "lax", domain, path: "/", }); }, removeToken(key: string): void { const domain = getCookieDomain(); removeCookie(key, { domain, path: "/" }); }, setupRefreshTimer(callback: () => Promise, delayMs: number): void { if (refreshTimer) { clearTimeout(refreshTimer); } refreshTimer = setTimeout(() => { callback().catch((error) => { console.error("Silent refresh timer callback failed:", error); }); }, delayMs); }, clearAuthToken(): void { if (refreshTimer) { clearTimeout(refreshTimer); refreshTimer = null; } this.removeToken(config.claimName); this.removeToken(config.authUserId); }, getAccessToken(): string | undefined { return this.getToken(config.claimName); }, getRefreshToken(): string | undefined { return config.refreshToken ? this.getToken(config.refreshToken) : undefined; }, getUserId(): string | undefined { return this.getToken(config.authUserId); }, }; } export type TokenManager = ReturnType;