Spaces:
Paused
Paused
File size: 2,982 Bytes
99a7ebb | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | "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();
}
|