chatgpt2api / web /src /store /auth.ts
tx1538's picture
Upload 179 files
9d7ddb9 verified
Raw
History Blame
2.98 kB
"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();
}