@capgo/capacitor-social-login 8.3.17 → 8.3.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"twitter-provider.js","sourceRoot":"","sources":["../../src/twitter-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseSocialLogin } from './base';\nimport type {\n AuthorizationCode,\n LoginResult,\n ProviderResponseMap,\n TwitterLoginOptions,\n TwitterLoginResponse,\n TwitterProfile,\n} from './definitions';\n\ninterface TwitterTokenResponse {\n token_type: 'bearer';\n expires_in: number;\n access_token: string;\n scope: string;\n refresh_token?: string;\n}\n\ninterface TwitterUserResponse {\n data: {\n id: string;\n name: string;\n username: string;\n profile_image_url?: string;\n verified?: boolean;\n } & { email?: string };\n}\n\ninterface TwitterPendingLogin {\n codeVerifier: string;\n redirectUri: string;\n scopes: string[];\n}\n\ninterface TwitterStoredTokens {\n accessToken: string;\n refreshToken?: string;\n expiresAt: number;\n scope: string[];\n tokenType: string;\n userId?: string;\n profile?: TwitterProfile;\n}\n\nexport class TwitterSocialLogin extends BaseSocialLogin {\n private clientId: string | null = null;\n private redirectUrl: string | null = null;\n private defaultScopes: string[] = ['tweet.read', 'users.read'];\n private forceLogin = false;\n private audience?: string;\n private readonly TOKENS_KEY = 'capgo_social_login_twitter_tokens_v1';\n private readonly STATE_PREFIX = 'capgo_social_login_twitter_state_';\n\n async initialize(\n clientId: string | null,\n redirectUrl?: string | null,\n defaultScopes?: string[],\n forceLogin?: boolean,\n audience?: string,\n ): Promise<void> {\n this.clientId = clientId;\n this.redirectUrl = redirectUrl ?? null;\n if (defaultScopes?.length) {\n this.defaultScopes = defaultScopes;\n }\n this.forceLogin = forceLogin ?? false;\n this.audience = audience ?? undefined;\n }\n\n async login<T extends 'twitter'>(\n options: TwitterLoginOptions,\n ): Promise<{ provider: T; result: ProviderResponseMap[T] }> {\n if (!this.clientId) {\n throw new Error('Twitter Client ID not configured. Call initialize() first.');\n }\n\n const redirectUri = options.redirectUrl ?? this.redirectUrl ?? window.location.origin + window.location.pathname;\n const scopes = options.scopes?.length ? options.scopes : this.defaultScopes;\n const state = options.state ?? this.generateState();\n const codeVerifier = options.codeVerifier ?? this.generateCodeVerifier();\n const codeChallenge = await this.generateCodeChallenge(codeVerifier);\n\n this.persistPendingLogin(state, {\n codeVerifier,\n redirectUri,\n scopes,\n });\n\n localStorage.setItem(BaseSocialLogin.OAUTH_STATE_KEY, JSON.stringify({ provider: 'twitter', state }));\n\n const params = new URLSearchParams({\n response_type: 'code',\n client_id: this.clientId,\n redirect_uri: redirectUri,\n scope: scopes.join(' '),\n state,\n code_challenge: codeChallenge,\n code_challenge_method: 'S256',\n });\n if ((options.forceLogin ?? this.forceLogin) === true) {\n params.set('force_login', 'true');\n }\n if (this.audience) {\n params.set('audience', this.audience);\n }\n\n const authUrl = `https://x.com/i/oauth2/authorize?${params.toString()}`;\n const width = 500;\n const height = 650;\n const left = window.screenX + (window.outerWidth - width) / 2;\n const top = window.screenY + (window.outerHeight - height) / 2;\n\n const popup = window.open(authUrl, 'XLogin', `width=${width},height=${height},left=${left},top=${top},popup=1`);\n\n return new Promise((resolve, reject) => {\n if (!popup) {\n reject(new Error('Unable to open login window. Please allow popups.'));\n return;\n }\n\n // Use BroadcastChannel for cross-origin communication (works when postMessage doesn't)\n const channelName = `twitter_oauth_${state}`;\n let broadcastChannel: BroadcastChannel | null = null;\n\n try {\n broadcastChannel = new BroadcastChannel(channelName);\n } catch {\n // BroadcastChannel not supported, fall back to postMessage only\n }\n\n const cleanup = (\n messageHandler: (event: MessageEvent) => void,\n timeoutHandle: number,\n intervalHandle: number,\n ) => {\n window.removeEventListener('message', messageHandler);\n clearTimeout(timeoutHandle);\n clearInterval(intervalHandle);\n if (broadcastChannel) {\n broadcastChannel.close();\n }\n };\n\n const handleOAuthMessage = (data: Record<string, unknown>) => {\n if (data?.type === 'oauth-response') {\n if (data?.provider && data.provider !== 'twitter') {\n return false;\n }\n cleanup(messageHandler, timeoutHandle, popupClosedInterval);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n provider: _ignoredProvider,\n type: _ignoredType,\n ...payload\n } = data as unknown as TwitterLoginResponse & {\n provider?: string;\n type?: string;\n };\n resolve({\n provider: 'twitter' as T,\n result: payload as ProviderResponseMap[T],\n } as { provider: T; result: ProviderResponseMap[T] });\n return true;\n } else if (data?.type === 'oauth-error') {\n if (data?.provider && data.provider !== 'twitter') {\n return false;\n }\n cleanup(messageHandler, timeoutHandle, popupClosedInterval);\n reject(new Error((data.error as string) || 'Twitter login was cancelled.'));\n return true;\n }\n return false;\n };\n\n // Listen for BroadcastChannel messages\n if (broadcastChannel) {\n broadcastChannel.onmessage = (event: MessageEvent) => {\n handleOAuthMessage(event.data);\n };\n }\n\n const messageHandler = (event: MessageEvent) => {\n if (event.origin !== window.location.origin) {\n return;\n }\n handleOAuthMessage(event.data);\n };\n\n window.addEventListener('message', messageHandler);\n\n const timeoutHandle = window.setTimeout(() => {\n cleanup(messageHandler, timeoutHandle, popupClosedInterval);\n try {\n popup.close();\n } catch {\n // Ignore cross-origin errors when closing\n }\n reject(new Error('Twitter login timed out.'));\n }, 300000);\n\n const popupClosedInterval = window.setInterval(() => {\n try {\n // Check if popup is closed - this may throw cross-origin errors for some providers\n if (popup.closed) {\n cleanup(messageHandler, timeoutHandle, popupClosedInterval);\n reject(new Error('Twitter login window was closed.'));\n }\n } catch {\n // Cross-origin error when checking popup.closed - this happens when the popup\n // navigates to a third-party OAuth provider with strict security settings.\n // We can't detect if the window was closed, so we rely on timeout and message handlers.\n clearInterval(popupClosedInterval);\n }\n }, 1000);\n });\n }\n\n async logout(): Promise<void> {\n localStorage.removeItem(this.TOKENS_KEY);\n }\n\n async isLoggedIn(): Promise<{ isLoggedIn: boolean }> {\n const tokens = this.getStoredTokens();\n if (!tokens) {\n return { isLoggedIn: false };\n }\n const isValid = tokens.expiresAt > Date.now();\n if (!isValid) {\n localStorage.removeItem(this.TOKENS_KEY);\n }\n return { isLoggedIn: isValid };\n }\n\n async getAuthorizationCode(): Promise<AuthorizationCode> {\n const tokens = this.getStoredTokens();\n if (!tokens) {\n throw new Error('Twitter access token is not available.');\n }\n return {\n accessToken: tokens.accessToken,\n };\n }\n\n async refresh(): Promise<void> {\n const tokens = this.getStoredTokens();\n if (!tokens?.refreshToken) {\n throw new Error('No Twitter refresh token is available. Include offline.access scope to receive one.');\n }\n\n await this.refreshWithRefreshToken(tokens.refreshToken);\n }\n\n async handleOAuthRedirect(url: URL, expectedState?: string): Promise<LoginResult | { error: string } | null> {\n const params = url.searchParams;\n const stateFromUrl = expectedState ?? params.get('state');\n if (!stateFromUrl) {\n return null;\n }\n\n const pending = this.consumePendingLogin(stateFromUrl);\n if (!pending) {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n return { error: 'Twitter login session expired or state mismatch.' };\n }\n\n const error = params.get('error');\n if (error) {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n return { error: params.get('error_description') || error };\n }\n\n const code = params.get('code');\n if (!code) {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n return { error: 'Twitter authorization code missing from redirect.' };\n }\n\n try {\n const tokens = await this.exchangeAuthorizationCode(code, pending);\n const profile = await this.fetchProfile(tokens.access_token);\n const expiresAt = Date.now() + tokens.expires_in * 1000;\n const scopeArray = tokens.scope.split(' ').filter(Boolean);\n\n this.persistTokens({\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n expiresAt,\n scope: scopeArray,\n tokenType: tokens.token_type,\n userId: profile.id,\n profile,\n });\n\n return {\n provider: 'twitter',\n result: {\n accessToken: {\n token: tokens.access_token,\n tokenType: tokens.token_type,\n expires: new Date(expiresAt).toISOString(),\n userId: profile.id,\n },\n refreshToken: tokens.refresh_token,\n scope: scopeArray,\n tokenType: tokens.token_type,\n expiresIn: tokens.expires_in,\n profile,\n },\n };\n } catch (err) {\n if (err instanceof Error) {\n return { error: err.message };\n }\n return { error: 'Twitter login failed unexpectedly.' };\n } finally {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n }\n }\n\n private async exchangeAuthorizationCode(code: string, pending: TwitterPendingLogin): Promise<TwitterTokenResponse> {\n const params = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: this.clientId ?? '',\n code,\n redirect_uri: pending.redirectUri,\n code_verifier: pending.codeVerifier,\n });\n\n const response = await fetch('https://api.x.com/2/oauth2/token', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params.toString(),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Twitter token exchange failed (${response.status}): ${text}`);\n }\n\n return (await response.json()) as TwitterTokenResponse;\n }\n\n private async refreshWithRefreshToken(refreshToken: string): Promise<void> {\n const params = new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: this.clientId ?? '',\n });\n\n const response = await fetch('https://api.x.com/2/oauth2/token', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params.toString(),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Twitter refresh failed (${response.status}): ${text}`);\n }\n\n const tokens = (await response.json()) as TwitterTokenResponse;\n const profile = await this.fetchProfile(tokens.access_token);\n const expiresAt = Date.now() + tokens.expires_in * 1000;\n const scopeArray = tokens.scope.split(' ').filter(Boolean);\n\n this.persistTokens({\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token ?? refreshToken,\n expiresAt,\n scope: scopeArray,\n tokenType: tokens.token_type,\n userId: profile.id,\n profile,\n });\n }\n\n private async fetchProfile(accessToken: string): Promise<TwitterProfile> {\n const fields = ['profile_image_url', 'verified', 'name', 'username'];\n const response = await fetch(`https://api.x.com/2/users/me?user.fields=${fields.join(',')}`, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Unable to fetch Twitter profile (${response.status}): ${text}`);\n }\n\n const payload = (await response.json()) as TwitterUserResponse;\n if (!payload.data) {\n throw new Error('Twitter profile payload is missing data.');\n }\n\n return {\n id: payload.data.id,\n username: payload.data.username,\n name: payload.data.name ?? null,\n profileImageUrl: payload.data.profile_image_url ?? null,\n verified: payload.data.verified ?? false,\n email: (payload.data as { email?: string }).email ?? null,\n };\n }\n\n private persistTokens(tokens: TwitterStoredTokens): void {\n localStorage.setItem(this.TOKENS_KEY, JSON.stringify(tokens));\n }\n\n private getStoredTokens(): TwitterStoredTokens | null {\n const raw = localStorage.getItem(this.TOKENS_KEY);\n if (!raw) {\n return null;\n }\n try {\n return JSON.parse(raw) as TwitterStoredTokens;\n } catch (err) {\n console.warn('Failed to parse stored Twitter tokens', err);\n return null;\n }\n }\n\n private persistPendingLogin(state: string, payload: TwitterPendingLogin): void {\n localStorage.setItem(`${this.STATE_PREFIX}${state}`, JSON.stringify(payload));\n }\n\n private consumePendingLogin(state: string): TwitterPendingLogin | null {\n const key = `${this.STATE_PREFIX}${state}`;\n const raw = localStorage.getItem(key);\n localStorage.removeItem(key);\n if (!raw) {\n return null;\n }\n try {\n return JSON.parse(raw) as TwitterPendingLogin;\n } catch (err) {\n console.warn('Failed to parse pending Twitter login payload', err);\n return null;\n }\n }\n\n private generateState(): string {\n return [...crypto.getRandomValues(new Uint8Array(16))].map((b) => b.toString(16).padStart(2, '0')).join('');\n }\n\n private generateCodeVerifier(): string {\n const array = new Uint8Array(64);\n crypto.getRandomValues(array);\n return Array.from(array)\n .map((b) => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~'[b % 66])\n .join('');\n }\n\n private async generateCodeChallenge(codeVerifier: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(codeVerifier);\n const digest = await crypto.subtle.digest('SHA-256', data);\n return this.base64UrlEncode(new Uint8Array(digest));\n }\n\n private base64UrlEncode(buffer: Uint8Array): string {\n let binary = '';\n buffer.forEach((b) => (binary += String.fromCharCode(b)));\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n }\n}\n"]}
1
+ {"version":3,"file":"twitter-provider.js","sourceRoot":"","sources":["../../src/twitter-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseSocialLogin } from './base';\nimport type {\n AuthorizationCode,\n LoginResult,\n ProviderResponseMap,\n TwitterLoginOptions,\n TwitterLoginResponse,\n TwitterProfile,\n} from './definitions';\n\ninterface TwitterTokenResponse {\n token_type: 'bearer';\n expires_in: number;\n access_token: string;\n scope: string;\n refresh_token?: string;\n}\n\ninterface TwitterUserResponse {\n data: {\n id: string;\n name: string;\n username: string;\n profile_image_url?: string;\n verified?: boolean;\n } & { email?: string };\n}\n\ninterface TwitterPendingLogin {\n clientId: string;\n codeVerifier: string;\n redirectUri: string;\n scopes: string[];\n}\n\ninterface TwitterStoredTokens {\n accessToken: string;\n refreshToken?: string;\n expiresAt: number;\n scope: string[];\n tokenType: string;\n userId?: string;\n profile?: TwitterProfile;\n}\n\nexport class TwitterSocialLogin extends BaseSocialLogin {\n private clientId: string | null = null;\n private redirectUrl: string | null = null;\n private defaultScopes: string[] = ['tweet.read', 'users.read'];\n private forceLogin = false;\n private audience?: string;\n private readonly TOKENS_KEY = 'capgo_social_login_twitter_tokens_v1';\n private readonly STATE_PREFIX = 'capgo_social_login_twitter_state_';\n\n async initialize(\n clientId: string | null,\n redirectUrl?: string | null,\n defaultScopes?: string[],\n forceLogin?: boolean,\n audience?: string,\n ): Promise<void> {\n this.clientId = clientId;\n this.redirectUrl = redirectUrl ?? null;\n if (defaultScopes?.length) {\n this.defaultScopes = defaultScopes;\n }\n this.forceLogin = forceLogin ?? false;\n this.audience = audience ?? undefined;\n }\n\n async login<T extends 'twitter'>(\n options: TwitterLoginOptions,\n ): Promise<{ provider: T; result: ProviderResponseMap[T] }> {\n if (!this.clientId) {\n throw new Error('Twitter Client ID not configured. Call initialize() first.');\n }\n\n const redirectUri = options.redirectUrl ?? this.redirectUrl ?? window.location.origin + window.location.pathname;\n const scopes = options.scopes?.length ? options.scopes : this.defaultScopes;\n const state = options.state ?? this.generateState();\n const codeVerifier = options.codeVerifier ?? this.generateCodeVerifier();\n const codeChallenge = await this.generateCodeChallenge(codeVerifier);\n\n this.persistPendingLogin(state, {\n clientId: this.clientId,\n codeVerifier,\n redirectUri,\n scopes,\n });\n\n localStorage.setItem(BaseSocialLogin.OAUTH_STATE_KEY, JSON.stringify({ provider: 'twitter', state }));\n\n const params = new URLSearchParams({\n response_type: 'code',\n client_id: this.clientId,\n redirect_uri: redirectUri,\n scope: scopes.join(' '),\n state,\n code_challenge: codeChallenge,\n code_challenge_method: 'S256',\n });\n if ((options.forceLogin ?? this.forceLogin) === true) {\n params.set('force_login', 'true');\n }\n if (this.audience) {\n params.set('audience', this.audience);\n }\n\n const authUrl = `https://x.com/i/oauth2/authorize?${params.toString()}`;\n const width = 500;\n const height = 650;\n const left = window.screenX + (window.outerWidth - width) / 2;\n const top = window.screenY + (window.outerHeight - height) / 2;\n\n const popup = window.open(authUrl, 'XLogin', `width=${width},height=${height},left=${left},top=${top},popup=1`);\n\n return new Promise((resolve, reject) => {\n if (!popup) {\n reject(new Error('Unable to open login window. Please allow popups.'));\n return;\n }\n\n // Use BroadcastChannel for cross-origin communication (works when postMessage doesn't)\n const channelName = `twitter_oauth_${state}`;\n let broadcastChannel: BroadcastChannel | null = null;\n\n try {\n broadcastChannel = new BroadcastChannel(channelName);\n } catch {\n // BroadcastChannel not supported, fall back to postMessage only\n }\n\n const cleanup = (\n messageHandler: (event: MessageEvent) => void,\n timeoutHandle: number,\n intervalHandle: number,\n ) => {\n window.removeEventListener('message', messageHandler);\n clearTimeout(timeoutHandle);\n clearInterval(intervalHandle);\n if (broadcastChannel) {\n broadcastChannel.close();\n }\n };\n\n const handleOAuthMessage = (data: Record<string, unknown>) => {\n if (data?.type === 'oauth-response') {\n if (data?.provider && data.provider !== 'twitter') {\n return false;\n }\n cleanup(messageHandler, timeoutHandle, popupClosedInterval);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n provider: _ignoredProvider,\n type: _ignoredType,\n ...payload\n } = data as unknown as TwitterLoginResponse & {\n provider?: string;\n type?: string;\n };\n resolve({\n provider: 'twitter' as T,\n result: payload as ProviderResponseMap[T],\n } as { provider: T; result: ProviderResponseMap[T] });\n return true;\n } else if (data?.type === 'oauth-error') {\n if (data?.provider && data.provider !== 'twitter') {\n return false;\n }\n cleanup(messageHandler, timeoutHandle, popupClosedInterval);\n reject(new Error((data.error as string) || 'Twitter login was cancelled.'));\n return true;\n }\n return false;\n };\n\n // Listen for BroadcastChannel messages\n if (broadcastChannel) {\n broadcastChannel.onmessage = (event: MessageEvent) => {\n handleOAuthMessage(event.data);\n };\n }\n\n const messageHandler = (event: MessageEvent) => {\n if (event.origin !== window.location.origin) {\n return;\n }\n handleOAuthMessage(event.data);\n };\n\n window.addEventListener('message', messageHandler);\n\n const timeoutHandle = window.setTimeout(() => {\n cleanup(messageHandler, timeoutHandle, popupClosedInterval);\n try {\n popup.close();\n } catch {\n // Ignore cross-origin errors when closing\n }\n reject(new Error('Twitter login timed out.'));\n }, 300000);\n\n const popupClosedInterval = window.setInterval(() => {\n try {\n // Check if popup is closed - this may throw cross-origin errors for some providers\n if (popup.closed) {\n cleanup(messageHandler, timeoutHandle, popupClosedInterval);\n reject(new Error('Twitter login window was closed.'));\n }\n } catch {\n // Cross-origin error when checking popup.closed - this happens when the popup\n // navigates to a third-party OAuth provider with strict security settings.\n // We can't detect if the window was closed, so we rely on timeout and message handlers.\n clearInterval(popupClosedInterval);\n }\n }, 1000);\n });\n }\n\n async logout(): Promise<void> {\n localStorage.removeItem(this.TOKENS_KEY);\n }\n\n async isLoggedIn(): Promise<{ isLoggedIn: boolean }> {\n const tokens = this.getStoredTokens();\n if (!tokens) {\n return { isLoggedIn: false };\n }\n const isValid = tokens.expiresAt > Date.now();\n if (!isValid) {\n localStorage.removeItem(this.TOKENS_KEY);\n }\n return { isLoggedIn: isValid };\n }\n\n async getAuthorizationCode(): Promise<AuthorizationCode> {\n const tokens = this.getStoredTokens();\n if (!tokens) {\n throw new Error('Twitter access token is not available.');\n }\n return {\n accessToken: tokens.accessToken,\n };\n }\n\n async refresh(): Promise<void> {\n const tokens = this.getStoredTokens();\n if (!tokens?.refreshToken) {\n throw new Error('No Twitter refresh token is available. Include offline.access scope to receive one.');\n }\n\n await this.refreshWithRefreshToken(tokens.refreshToken);\n }\n\n async handleOAuthRedirect(url: URL, expectedState?: string): Promise<LoginResult | { error: string } | null> {\n const params = url.searchParams;\n const stateFromUrl = expectedState ?? params.get('state');\n if (!stateFromUrl) {\n return null;\n }\n\n const pending = this.consumePendingLogin(stateFromUrl);\n if (!pending) {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n return { error: 'Twitter login session expired or state mismatch.' };\n }\n\n const error = params.get('error');\n if (error) {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n return { error: params.get('error_description') || error };\n }\n\n const code = params.get('code');\n if (!code) {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n return { error: 'Twitter authorization code missing from redirect.' };\n }\n\n try {\n const tokens = await this.exchangeAuthorizationCode(code, pending);\n const profile = await this.fetchProfile(tokens.access_token);\n const expiresAt = Date.now() + tokens.expires_in * 1000;\n const scopeArray = tokens.scope.split(' ').filter(Boolean);\n\n this.persistTokens({\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n expiresAt,\n scope: scopeArray,\n tokenType: tokens.token_type,\n userId: profile.id,\n profile,\n });\n\n return {\n provider: 'twitter',\n result: {\n accessToken: {\n token: tokens.access_token,\n tokenType: tokens.token_type,\n expires: new Date(expiresAt).toISOString(),\n userId: profile.id,\n },\n refreshToken: tokens.refresh_token,\n scope: scopeArray,\n tokenType: tokens.token_type,\n expiresIn: tokens.expires_in,\n profile,\n },\n };\n } catch (err) {\n if (err instanceof Error) {\n return { error: err.message };\n }\n return { error: 'Twitter login failed unexpectedly.' };\n } finally {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n }\n }\n\n private async exchangeAuthorizationCode(code: string, pending: TwitterPendingLogin): Promise<TwitterTokenResponse> {\n const params = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: pending.clientId,\n code,\n redirect_uri: pending.redirectUri,\n code_verifier: pending.codeVerifier,\n });\n\n const response = await fetch('https://api.x.com/2/oauth2/token', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params.toString(),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Twitter token exchange failed (${response.status}): ${text}`);\n }\n\n return (await response.json()) as TwitterTokenResponse;\n }\n\n private async refreshWithRefreshToken(refreshToken: string): Promise<void> {\n const params = new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: this.clientId ?? '',\n });\n\n const response = await fetch('https://api.x.com/2/oauth2/token', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params.toString(),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Twitter refresh failed (${response.status}): ${text}`);\n }\n\n const tokens = (await response.json()) as TwitterTokenResponse;\n const profile = await this.fetchProfile(tokens.access_token);\n const expiresAt = Date.now() + tokens.expires_in * 1000;\n const scopeArray = tokens.scope.split(' ').filter(Boolean);\n\n this.persistTokens({\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token ?? refreshToken,\n expiresAt,\n scope: scopeArray,\n tokenType: tokens.token_type,\n userId: profile.id,\n profile,\n });\n }\n\n private async fetchProfile(accessToken: string): Promise<TwitterProfile> {\n const fields = ['profile_image_url', 'verified', 'name', 'username'];\n const response = await fetch(`https://api.x.com/2/users/me?user.fields=${fields.join(',')}`, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Unable to fetch Twitter profile (${response.status}): ${text}`);\n }\n\n const payload = (await response.json()) as TwitterUserResponse;\n if (!payload.data) {\n throw new Error('Twitter profile payload is missing data.');\n }\n\n return {\n id: payload.data.id,\n username: payload.data.username,\n name: payload.data.name ?? null,\n profileImageUrl: payload.data.profile_image_url ?? null,\n verified: payload.data.verified ?? false,\n email: (payload.data as { email?: string }).email ?? null,\n };\n }\n\n private persistTokens(tokens: TwitterStoredTokens): void {\n localStorage.setItem(this.TOKENS_KEY, JSON.stringify(tokens));\n }\n\n private getStoredTokens(): TwitterStoredTokens | null {\n const raw = localStorage.getItem(this.TOKENS_KEY);\n if (!raw) {\n return null;\n }\n try {\n return JSON.parse(raw) as TwitterStoredTokens;\n } catch (err) {\n console.warn('Failed to parse stored Twitter tokens', err);\n return null;\n }\n }\n\n private persistPendingLogin(state: string, payload: TwitterPendingLogin): void {\n localStorage.setItem(`${this.STATE_PREFIX}${state}`, JSON.stringify(payload));\n }\n\n private consumePendingLogin(state: string): TwitterPendingLogin | null {\n const key = `${this.STATE_PREFIX}${state}`;\n const raw = localStorage.getItem(key);\n localStorage.removeItem(key);\n if (!raw) {\n return null;\n }\n try {\n return JSON.parse(raw) as TwitterPendingLogin;\n } catch (err) {\n console.warn('Failed to parse pending Twitter login payload', err);\n return null;\n }\n }\n\n private generateState(): string {\n return [...crypto.getRandomValues(new Uint8Array(16))].map((b) => b.toString(16).padStart(2, '0')).join('');\n }\n\n private generateCodeVerifier(): string {\n const array = new Uint8Array(64);\n crypto.getRandomValues(array);\n return Array.from(array)\n .map((b) => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~'[b % 66])\n .join('');\n }\n\n private async generateCodeChallenge(codeVerifier: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(codeVerifier);\n const digest = await crypto.subtle.digest('SHA-256', data);\n return this.base64UrlEncode(new Uint8Array(digest));\n }\n\n private base64UrlEncode(buffer: Uint8Array): string {\n let binary = '';\n buffer.forEach((b) => (binary += String.fromCharCode(b)));\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n }\n}\n"]}
@@ -456,37 +456,69 @@ class FacebookSocialLogin extends BaseSocialLogin {
456
456
  throw new Error('Facebook App ID not set. Call initialize() first.');
457
457
  }
458
458
  return new Promise((resolve, reject) => {
459
+ var _a;
460
+ let settled = false;
461
+ let waitingForStatus = false;
462
+ const resolveWithProfile = (authResponse) => {
463
+ if (settled)
464
+ return;
465
+ if (!(authResponse === null || authResponse === void 0 ? void 0 : authResponse.accessToken) || !authResponse.userID) {
466
+ settled = true;
467
+ reject(new Error('Facebook login failed'));
468
+ return;
469
+ }
470
+ const accessToken = authResponse.accessToken;
471
+ const userId = authResponse.userID;
472
+ FB.api('/me', { fields: 'id,name,email,picture' }, (userInfo) => {
473
+ var _a, _b;
474
+ settled = true;
475
+ const result = {
476
+ accessToken: {
477
+ token: accessToken,
478
+ userId,
479
+ },
480
+ profile: {
481
+ userID: userInfo.id,
482
+ name: userInfo.name,
483
+ email: userInfo.email || null,
484
+ imageURL: ((_b = (_a = userInfo.picture) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.url) || null,
485
+ friendIDs: [],
486
+ birthday: null,
487
+ ageRange: null,
488
+ gender: null,
489
+ location: null,
490
+ hometown: null,
491
+ profileURL: null,
492
+ },
493
+ idToken: null,
494
+ };
495
+ resolve({ provider: 'facebook', result });
496
+ });
497
+ };
498
+ const waitForConnected = () => {
499
+ if (settled || waitingForStatus)
500
+ return;
501
+ waitingForStatus = true;
502
+ this.waitForConnection()
503
+ .then((statusResponse) => resolveWithProfile(statusResponse.authResponse))
504
+ .catch((error) => {
505
+ if (settled)
506
+ return;
507
+ settled = true;
508
+ reject(error);
509
+ });
510
+ };
459
511
  FB.login((response) => {
460
512
  if (response.status === 'connected') {
461
- FB.api('/me', { fields: 'id,name,email,picture' }, (userInfo) => {
462
- var _a, _b;
463
- const result = {
464
- accessToken: {
465
- token: response.authResponse.accessToken,
466
- userId: response.authResponse.userID,
467
- },
468
- profile: {
469
- userID: userInfo.id,
470
- name: userInfo.name,
471
- email: userInfo.email || null,
472
- imageURL: ((_b = (_a = userInfo.picture) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.url) || null,
473
- friendIDs: [],
474
- birthday: null,
475
- ageRange: null,
476
- gender: null,
477
- location: null,
478
- hometown: null,
479
- profileURL: null,
480
- },
481
- idToken: null,
482
- };
483
- resolve({ provider: 'facebook', result });
484
- });
513
+ resolveWithProfile(response.authResponse);
514
+ }
515
+ else if (response.status === 'not_authorized' || response.status === 'unknown') {
516
+ reject(new Error('Facebook login was cancelled.'));
485
517
  }
486
518
  else {
487
- reject(new Error('Facebook login failed'));
519
+ waitForConnected();
488
520
  }
489
- }, { scope: options.permissions.join(',') });
521
+ }, ((_a = options.permissions) === null || _a === void 0 ? void 0 : _a.length) ? { scope: options.permissions.join(',') } : undefined);
490
522
  });
491
523
  }
492
524
  async logout() {
@@ -517,6 +549,38 @@ class FacebookSocialLogin extends BaseSocialLogin {
517
549
  async refresh(options) {
518
550
  await this.login(options);
519
551
  }
552
+ waitForConnection(timeoutMs = 120000, pollIntervalMs = 500) {
553
+ const start = Date.now();
554
+ return new Promise((resolve, reject) => {
555
+ let finished = false;
556
+ const pollStatus = () => {
557
+ if (finished)
558
+ return;
559
+ FB.getLoginStatus((response) => {
560
+ var _a;
561
+ if (finished)
562
+ return;
563
+ if (response.status === 'connected' && ((_a = response.authResponse) === null || _a === void 0 ? void 0 : _a.accessToken)) {
564
+ finished = true;
565
+ resolve(response);
566
+ return;
567
+ }
568
+ if (response.status === 'not_authorized' || response.status === 'unknown') {
569
+ finished = true;
570
+ reject(new Error('Facebook login was cancelled.'));
571
+ return;
572
+ }
573
+ if (Date.now() - start >= timeoutMs) {
574
+ finished = true;
575
+ reject(new Error('Facebook login failed or timed out'));
576
+ return;
577
+ }
578
+ setTimeout(pollStatus, pollIntervalMs);
579
+ });
580
+ };
581
+ pollStatus();
582
+ });
583
+ }
520
584
  async loadFacebookScript(locale) {
521
585
  if (this.scriptLoaded)
522
586
  return;
@@ -855,13 +919,21 @@ class GoogleSocialLogin extends BaseSocialLogin {
855
919
  reject(new Error('Failed to open popup'));
856
920
  return;
857
921
  }
858
- const cleanup = () => {
922
+ const cleanup = (shouldClose = false) => {
859
923
  window.removeEventListener('message', handleMessage);
860
924
  clearInterval(popupClosedInterval);
861
925
  clearTimeout(timeoutHandle);
862
926
  if (broadcastChannel) {
863
927
  broadcastChannel.close();
864
928
  }
929
+ if (shouldClose) {
930
+ try {
931
+ popup.close();
932
+ }
933
+ catch (_a) {
934
+ // Ignore cross-origin errors when closing the popup
935
+ }
936
+ }
865
937
  };
866
938
  const processOAuthResponse = (data) => {
867
939
  if (this.loginType === 'online') {
@@ -912,11 +984,11 @@ class GoogleSocialLogin extends BaseSocialLogin {
912
984
  if (event.origin !== window.location.origin || ((_b = (_a = event.data) === null || _a === void 0 ? void 0 : _a.source) === null || _b === void 0 ? void 0 : _b.startsWith('angular')))
913
985
  return;
914
986
  if (((_c = event.data) === null || _c === void 0 ? void 0 : _c.type) === 'oauth-response') {
915
- cleanup();
987
+ cleanup(true);
916
988
  processOAuthResponse(event.data);
917
989
  }
918
990
  else if (((_d = event.data) === null || _d === void 0 ? void 0 : _d.type) === 'oauth-error') {
919
- cleanup();
991
+ cleanup(true);
920
992
  const errorMessage = event.data.error || 'User cancelled the OAuth flow';
921
993
  reject(new Error(errorMessage));
922
994
  }
@@ -930,11 +1002,11 @@ class GoogleSocialLogin extends BaseSocialLogin {
930
1002
  if ((_a = data === null || data === void 0 ? void 0 : data.source) === null || _a === void 0 ? void 0 : _a.toString().startsWith('angular'))
931
1003
  return;
932
1004
  if ((data === null || data === void 0 ? void 0 : data.type) === 'oauth-response') {
933
- cleanup();
1005
+ cleanup(true);
934
1006
  processOAuthResponse(data);
935
1007
  }
936
1008
  else if ((data === null || data === void 0 ? void 0 : data.type) === 'oauth-error') {
937
- cleanup();
1009
+ cleanup(true);
938
1010
  const errorMessage = data.error || 'User cancelled the OAuth flow';
939
1011
  reject(new Error(errorMessage));
940
1012
  }
@@ -943,13 +1015,7 @@ class GoogleSocialLogin extends BaseSocialLogin {
943
1015
  window.addEventListener('message', handleMessage);
944
1016
  // Timeout after 5 minutes
945
1017
  timeoutHandle = setTimeout(() => {
946
- cleanup();
947
- try {
948
- popup.close();
949
- }
950
- catch (_a) {
951
- // Ignore cross-origin errors when closing
952
- }
1018
+ cleanup(true);
953
1019
  reject(new Error('OAuth timeout'));
954
1020
  }, 300000);
955
1021
  popupClosedInterval = setInterval(() => {
@@ -977,10 +1043,13 @@ class GoogleSocialLogin extends BaseSocialLogin {
977
1043
  */
978
1044
  class OAuth2SocialLogin extends BaseSocialLogin {
979
1045
  constructor() {
980
- super(...arguments);
1046
+ super();
981
1047
  this.providers = new Map();
982
1048
  this.TOKENS_KEY_PREFIX = 'capgo_social_login_oauth2_tokens_';
983
1049
  this.STATE_PREFIX = 'capgo_social_login_oauth2_state_';
1050
+ this.CONFIG_KEY_PREFIX = 'capgo_social_login_oauth2_config_';
1051
+ // Restore configurations from localStorage for popup window context
1052
+ this.restoreConfigurationsFromStorage();
984
1053
  }
985
1054
  normalizeScopeValue(scope) {
986
1055
  if (!scope)
@@ -1009,6 +1078,7 @@ class OAuth2SocialLogin extends BaseSocialLogin {
1009
1078
  }
1010
1079
  return {
1011
1080
  appId,
1081
+ clientSecret: config.clientSecret,
1012
1082
  issuerUrl: config.issuerUrl,
1013
1083
  authorizationBaseUrl,
1014
1084
  accessTokenEndpoint,
@@ -1062,6 +1132,8 @@ class OAuth2SocialLogin extends BaseSocialLogin {
1062
1132
  logoutUrl: config.logoutUrl,
1063
1133
  });
1064
1134
  }
1135
+ // Persist updated configuration after discovery
1136
+ this.persistConfiguration(providerId, config);
1065
1137
  }
1066
1138
  /**
1067
1139
  * Initialize multiple OAuth2 providers
@@ -1082,6 +1154,8 @@ class OAuth2SocialLogin extends BaseSocialLogin {
1082
1154
  }
1083
1155
  // Pre-resolve discovery on web if issuerUrl is provided.
1084
1156
  await this.ensureDiscovered(providerId);
1157
+ // Persist configuration to localStorage so it's available in popup window context
1158
+ this.persistConfiguration(providerId, internalConfig);
1085
1159
  }
1086
1160
  }
1087
1161
  getProvider(providerId) {
@@ -1094,6 +1168,37 @@ class OAuth2SocialLogin extends BaseSocialLogin {
1094
1168
  getTokensKey(providerId) {
1095
1169
  return `${this.TOKENS_KEY_PREFIX}${providerId}`;
1096
1170
  }
1171
+ getConfigKey(providerId) {
1172
+ return `${this.CONFIG_KEY_PREFIX}${providerId}`;
1173
+ }
1174
+ persistConfiguration(providerId, config) {
1175
+ try {
1176
+ localStorage.setItem(this.getConfigKey(providerId), JSON.stringify(config));
1177
+ }
1178
+ catch (err) {
1179
+ console.warn(`Failed to persist OAuth2 configuration for provider '${providerId}'`, err);
1180
+ }
1181
+ }
1182
+ restoreConfigurationsFromStorage() {
1183
+ // Restore all provider configurations from localStorage
1184
+ // This is needed for popup window context where the parent's in-memory state is not available
1185
+ const keys = Object.keys(localStorage);
1186
+ for (const key of keys) {
1187
+ if (key.startsWith(this.CONFIG_KEY_PREFIX)) {
1188
+ const providerId = key.substring(this.CONFIG_KEY_PREFIX.length);
1189
+ try {
1190
+ const raw = localStorage.getItem(key);
1191
+ if (raw) {
1192
+ const config = JSON.parse(raw);
1193
+ this.providers.set(providerId, config);
1194
+ }
1195
+ }
1196
+ catch (err) {
1197
+ console.warn(`Failed to restore OAuth2 configuration for provider '${providerId}'`, err);
1198
+ }
1199
+ }
1200
+ }
1201
+ }
1097
1202
  async login(options) {
1098
1203
  var _a, _b, _c, _d, _e, _f, _g, _h, _j;
1099
1204
  const { providerId } = options;
@@ -1471,6 +1576,9 @@ class OAuth2SocialLogin extends BaseSocialLogin {
1471
1576
  if (config.pkceEnabled) {
1472
1577
  params.set('code_verifier', pending.codeVerifier);
1473
1578
  }
1579
+ if (config.clientSecret) {
1580
+ params.set('client_secret', config.clientSecret);
1581
+ }
1474
1582
  if (config.additionalTokenParameters) {
1475
1583
  for (const [k, v] of Object.entries(config.additionalTokenParameters)) {
1476
1584
  params.set(k, v);
@@ -1502,6 +1610,9 @@ class OAuth2SocialLogin extends BaseSocialLogin {
1502
1610
  refresh_token: refreshToken,
1503
1611
  client_id: config.appId,
1504
1612
  });
1613
+ if (config.clientSecret) {
1614
+ params.set('client_secret', config.clientSecret);
1615
+ }
1505
1616
  if (config.additionalTokenParameters) {
1506
1617
  for (const [k, v] of Object.entries(config.additionalTokenParameters)) {
1507
1618
  params.set(k, v);
@@ -1663,6 +1774,7 @@ class TwitterSocialLogin extends BaseSocialLogin {
1663
1774
  const codeVerifier = (_e = options.codeVerifier) !== null && _e !== void 0 ? _e : this.generateCodeVerifier();
1664
1775
  const codeChallenge = await this.generateCodeChallenge(codeVerifier);
1665
1776
  this.persistPendingLogin(state, {
1777
+ clientId: this.clientId,
1666
1778
  codeVerifier,
1667
1779
  redirectUri,
1668
1780
  scopes,
@@ -1868,10 +1980,9 @@ class TwitterSocialLogin extends BaseSocialLogin {
1868
1980
  }
1869
1981
  }
1870
1982
  async exchangeAuthorizationCode(code, pending) {
1871
- var _a;
1872
1983
  const params = new URLSearchParams({
1873
1984
  grant_type: 'authorization_code',
1874
- client_id: (_a = this.clientId) !== null && _a !== void 0 ? _a : '',
1985
+ client_id: pending.clientId,
1875
1986
  code,
1876
1987
  redirect_uri: pending.redirectUri,
1877
1988
  code_verifier: pending.codeVerifier,