Spaces:
Paused
Paused
| "use client"; | |
| import localforage from "localforage"; | |
| export type AuthRole = "admin" | "user"; | |
| export type StoredAuthSession = { | |
| key: string; | |
| role: AuthRole; | |
| subjectId: string; | |
| name: string; | |
| }; | |
| export const AUTH_KEY_STORAGE_KEY = "chatgpt2api_auth_key"; | |
| export const AUTH_SESSION_STORAGE_KEY = "chatgpt2api_auth_session"; | |
| const authStorage = localforage.createInstance({ | |
| name: "chatgpt2api", | |
| storeName: "auth", | |
| }); | |
| function normalizeSession(value: unknown, fallbackKey = ""): StoredAuthSession | null { | |
| if (!value || typeof value !== "object") { | |
| return null; | |
| } | |
| const candidate = value as Partial<StoredAuthSession>; | |
| const key = String(candidate.key || fallbackKey || "").trim(); | |
| const role = candidate.role === "admin" || candidate.role === "user" ? candidate.role : null; | |
| if (!key || !role) { | |
| return null; | |
| } | |
| return { | |
| key, | |
| role, | |
| subjectId: String(candidate.subjectId || "").trim(), | |
| name: String(candidate.name || "").trim(), | |
| }; | |
| } | |
| export function getDefaultRouteForRole(role: AuthRole) { | |
| return role === "admin" ? "/accounts" : "/image"; | |
| } | |
| export async function getStoredAuthKey() { | |
| if (typeof window === "undefined") { | |
| return ""; | |
| } | |
| const value = await authStorage.getItem<string>(AUTH_KEY_STORAGE_KEY); | |
| return String(value || "").trim(); | |
| } | |
| export async function getStoredAuthSession() { | |
| if (typeof window === "undefined") { | |
| return null; | |
| } | |
| const [storedKey, storedSession] = await Promise.all([ | |
| authStorage.getItem<string>(AUTH_KEY_STORAGE_KEY), | |
| authStorage.getItem<StoredAuthSession>(AUTH_SESSION_STORAGE_KEY), | |
| ]); | |
| const normalizedSession = normalizeSession(storedSession, String(storedKey || "")); | |
| if (normalizedSession) { | |
| if (normalizedSession.key !== String(storedKey || "").trim()) { | |
| await authStorage.setItem(AUTH_KEY_STORAGE_KEY, normalizedSession.key); | |
| } | |
| return normalizedSession; | |
| } | |
| if (String(storedKey || "").trim()) { | |
| await clearStoredAuthSession(); | |
| } | |
| return null; | |
| } | |
| export async function setStoredAuthSession(session: StoredAuthSession) { | |
| const normalizedSession = normalizeSession(session); | |
| if (!normalizedSession) { | |
| await clearStoredAuthSession(); | |
| return; | |
| } | |
| await Promise.all([ | |
| authStorage.setItem(AUTH_KEY_STORAGE_KEY, normalizedSession.key), | |
| authStorage.setItem(AUTH_SESSION_STORAGE_KEY, normalizedSession), | |
| ]); | |
| } | |
| export async function setStoredAuthKey(authKey: string) { | |
| const normalizedAuthKey = String(authKey || "").trim(); | |
| if (!normalizedAuthKey) { | |
| await clearStoredAuthSession(); | |
| return; | |
| } | |
| await authStorage.setItem(AUTH_KEY_STORAGE_KEY, normalizedAuthKey); | |
| } | |
| export async function clearStoredAuthSession() { | |
| if (typeof window === "undefined") { | |
| return; | |
| } | |
| await Promise.all([ | |
| authStorage.removeItem(AUTH_KEY_STORAGE_KEY), | |
| authStorage.removeItem(AUTH_SESSION_STORAGE_KEY), | |
| ]); | |
| } | |
| export async function clearStoredAuthKey() { | |
| await clearStoredAuthSession(); | |
| } | |