| |
| import { oauthLoginUrl, oauthHandleRedirectIfPresent } from "@huggingface/hub"; |
|
|
| const STORAGE_KEY = 'hf_oauth_token'; |
| const USER_INFO_KEY = 'hf_user_info'; |
| const DEV_MODE_KEY = 'hf_dev_mode'; |
|
|
| |
| const isDevelopment = typeof window !== 'undefined' && |
| (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1'); |
|
|
| export interface OAuthUserInfo { |
| id: string; |
| name: string; |
| preferredUsername?: string; |
| avatarUrl?: string; |
| } |
|
|
| export interface OAuthResult { |
| accessToken: string; |
| accessTokenExpiresAt: Date; |
| userInfo: OAuthUserInfo; |
| } |
|
|
| |
| |
| |
| |
| export async function initializeOAuth(): Promise<OAuthResult | null> { |
| try { |
| |
| if (isDevelopment && isDevModeEnabled()) { |
| const storedToken = getStoredToken(); |
| const storedUserInfo = getStoredUserInfo(); |
| |
| if (storedToken && storedUserInfo) { |
| return { |
| accessToken: storedToken, |
| accessTokenExpiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000), |
| userInfo: storedUserInfo, |
| }; |
| } |
| return null; |
| } |
| |
| |
| const oauthResult = await oauthHandleRedirectIfPresent(); |
| |
| if (oauthResult) { |
| |
| storeOAuthData(oauthResult); |
| return oauthResult; |
| } |
| |
| |
| const storedToken = getStoredToken(); |
| const storedUserInfo = getStoredUserInfo(); |
| |
| if (storedToken && storedUserInfo) { |
| return { |
| accessToken: storedToken, |
| accessTokenExpiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000), |
| userInfo: storedUserInfo, |
| }; |
| } |
| |
| return null; |
| } catch (error) { |
| console.error('OAuth initialization error:', error); |
| return null; |
| } |
| } |
|
|
| |
| |
| |
| export async function loginWithHuggingFace(): Promise<void> { |
| try { |
| const loginUrl = await oauthLoginUrl({ |
| |
| redirectUrl: window.location.href, |
| |
| scopes: "openid profile inference-api", |
| }); |
| |
| window.location.href = loginUrl; |
| } catch (error) { |
| console.error('Failed to initiate OAuth login:', error); |
| throw new Error('Failed to start login process'); |
| } |
| } |
|
|
| |
| |
| |
| export function logout(): void { |
| if (typeof window !== 'undefined') { |
| localStorage.removeItem(STORAGE_KEY); |
| localStorage.removeItem(USER_INFO_KEY); |
| localStorage.removeItem(DEV_MODE_KEY); |
| } |
| } |
|
|
| |
| |
| |
| function storeOAuthData(result: OAuthResult): void { |
| if (typeof window !== 'undefined') { |
| localStorage.setItem(STORAGE_KEY, result.accessToken); |
| localStorage.setItem(USER_INFO_KEY, JSON.stringify(result.userInfo)); |
| } |
| } |
|
|
| |
| |
| |
| export function getStoredToken(): string | null { |
| if (typeof window !== 'undefined') { |
| return localStorage.getItem(STORAGE_KEY); |
| } |
| return null; |
| } |
|
|
| |
| |
| |
| export function getStoredUserInfo(): OAuthUserInfo | null { |
| if (typeof window !== 'undefined') { |
| const userInfoStr = localStorage.getItem(USER_INFO_KEY); |
| if (userInfoStr) { |
| try { |
| return JSON.parse(userInfoStr); |
| } catch { |
| return null; |
| } |
| } |
| } |
| return null; |
| } |
|
|
| |
| |
| |
| export function isAuthenticated(): boolean { |
| return getStoredToken() !== null; |
| } |
|
|
| |
| |
| |
| export function loginDevMode(username: string): OAuthResult { |
| const mockToken = `dev_token_${username}_${Date.now()}`; |
| const mockUserInfo: OAuthUserInfo = { |
| id: `dev_${Date.now()}`, |
| name: username, |
| preferredUsername: username.toLowerCase().replace(/\s+/g, '_'), |
| avatarUrl: `https://ui-avatars.com/api/?name=${encodeURIComponent(username)}&background=random&size=128`, |
| }; |
| |
| const result: OAuthResult = { |
| accessToken: mockToken, |
| accessTokenExpiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000), |
| userInfo: mockUserInfo, |
| }; |
| |
| |
| storeOAuthData(result); |
| |
| if (typeof window !== 'undefined') { |
| localStorage.setItem(DEV_MODE_KEY, 'true'); |
| } |
| |
| return result; |
| } |
|
|
| |
| |
| |
| export function isDevModeEnabled(): boolean { |
| if (typeof window !== 'undefined') { |
| return localStorage.getItem(DEV_MODE_KEY) === 'true'; |
| } |
| return false; |
| } |
|
|
| |
| |
| |
| export function isDevelopmentMode(): boolean { |
| return isDevelopment; |
| } |
|
|
|
|