export const ACCESS_TOKEN_KEY = 'cc-client-access-token' export const REFRESH_TOKEN_KEY = 'cc-client-refresh-token' export const OVERSEAS_ACCESS_TOKEN_KEY = 'cc-client-overseas-access-token' export const OVERSEAS_EXPIRES_AT_KEY = 'cc-client-overseas-expires-at' export interface TokenPair { tokenType: string accessToken: string expiresIn: number refreshToken: string refreshExpiresIn: number overseasAccessToken?: string | null overseasExpiresIn?: number } function activeStorage() { if (localStorage.getItem(ACCESS_TOKEN_KEY)) return localStorage return sessionStorage } export function getAccessToken() { return localStorage.getItem(ACCESS_TOKEN_KEY) || sessionStorage.getItem(ACCESS_TOKEN_KEY) || '' } export function getRefreshToken() { return localStorage.getItem(REFRESH_TOKEN_KEY) || sessionStorage.getItem(REFRESH_TOKEN_KEY) || '' } export function getOverseasAccessToken() { const storage = activeStorage() const expiresAt = Number(storage.getItem(OVERSEAS_EXPIRES_AT_KEY) || 0) if (expiresAt <= Date.now() + 30_000) return '' return storage.getItem(OVERSEAS_ACCESS_TOKEN_KEY) || '' } export function persistTokenPair(tokens: TokenPair, remember?: boolean) { const storage = remember === undefined ? activeStorage() : remember ? localStorage : sessionStorage clearSessionTokens() storage.setItem(ACCESS_TOKEN_KEY, tokens.accessToken) storage.setItem(REFRESH_TOKEN_KEY, tokens.refreshToken) if (tokens.overseasAccessToken && Number(tokens.overseasExpiresIn) > 0) { storage.setItem(OVERSEAS_ACCESS_TOKEN_KEY, tokens.overseasAccessToken) storage.setItem(OVERSEAS_EXPIRES_AT_KEY, String(Date.now() + Number(tokens.overseasExpiresIn) * 1000)) } } export function persistTemporaryAccessToken(accessToken: string) { clearSessionTokens() sessionStorage.setItem(ACCESS_TOKEN_KEY, accessToken) } export function clearSessionTokens() { for (const storage of [localStorage, sessionStorage]) { storage.removeItem(ACCESS_TOKEN_KEY) storage.removeItem(REFRESH_TOKEN_KEY) storage.removeItem(OVERSEAS_ACCESS_TOKEN_KEY) storage.removeItem(OVERSEAS_EXPIRES_AT_KEY) storage.removeItem('cc-client-token') } }