{"version":3,"file":"B2BOneTapProvider.mjs","sources":["../../../../../../../../web/src/b2b/oneTap/B2BOneTapProvider.ts"],"sourcesContent":["import { INetworkClient, IPKCEManager } from '@stytch/core';\nimport { ResponseCommon, StytchAPIError } from '@stytch/core/public';\nimport type { CredentialResponse } from 'google-one-tap';\n\nimport { GoogleOneTapClient } from '../../oneTap/GoogleOneTapClient';\nimport { loadGoogleOneTapClient } from '../../oneTap/OneTapProvider';\n\ntype B2BOneTapStartResponse = ResponseCommon & {\n  google_client_id: string;\n};\n\ntype B2BOneTapSubmitResponse = ResponseCommon & {\n  redirect_url: string;\n};\n\ntype OneTapNotLoadedReason =\n  // These come from the API directly - err.error_type\n  | 'oauth_config_not_found'\n  | 'default_provider_not_allowed'\n  // If we have an unhandled error :$\n  | string;\n\ntype OneTapLoadResult =\n  | { success: true; client: GoogleOneTapClient }\n  | { success: false; reason: OneTapNotLoadedReason };\n\ntype DynamicConfig = Promise<{\n  pkceRequiredForOAuth: boolean;\n}>;\n\nconst DefaultDynamicConfig = Promise.resolve({\n  pkceRequiredForOAuth: false,\n});\n\n/**\n * Handles loading One Tap config from Stytch API and initializing {@link GoogleOneTapClient}\n */\nexport class B2BOneTapProvider {\n  private googleClientID?: string;\n  constructor(\n    private _networkClient: INetworkClient,\n    private _pkceManager: IPKCEManager,\n    private _config: DynamicConfig = DefaultDynamicConfig,\n  ) {}\n\n  private async fetchGoogleStart() {\n    if (this.googleClientID) {\n      return this.googleClientID;\n    }\n    const oneTapStartResp = await this._networkClient.fetchSDK<B2BOneTapStartResponse>({\n      url: '/b2b/oauth/google/onetap/start',\n      method: 'GET',\n    });\n    this.googleClientID = oneTapStartResp.google_client_id;\n    return this.googleClientID;\n  }\n\n  private async submitGoogleOneTapTokenDiscovery({\n    credential,\n    discoveryRedirectUrl,\n  }: {\n    credential: string;\n    discoveryRedirectUrl?: string;\n  }) {\n    let codeChallenge = undefined;\n    const { pkceRequiredForOAuth } = await this._config;\n    if (pkceRequiredForOAuth) {\n      const keyPair = await this._pkceManager.startPKCETransaction();\n      codeChallenge = keyPair.code_challenge;\n    } else {\n      this._pkceManager.clearPKPair();\n    }\n    return await this._networkClient.fetchSDK<B2BOneTapSubmitResponse>({\n      url: '/b2b/oauth/google/onetap/discovery/submit',\n      method: 'POST',\n      body: {\n        id_token: credential,\n        discovery_redirect_url: discoveryRedirectUrl,\n        pkce_code_challenge: codeChallenge,\n      },\n    });\n  }\n\n  private async submitGoogleOneTapToken({\n    credential,\n    organizationId,\n    signupRedirectUrl,\n    loginRedirectUrl,\n  }: {\n    credential: string;\n    organizationId: string;\n    signupRedirectUrl?: string;\n    loginRedirectUrl?: string;\n  }) {\n    let codeChallenge = undefined;\n    const { pkceRequiredForOAuth } = await this._config;\n    if (pkceRequiredForOAuth) {\n      const keyPair = await this._pkceManager.startPKCETransaction();\n      codeChallenge = keyPair.code_challenge;\n    } else {\n      this._pkceManager.clearPKPair();\n    }\n    return await this._networkClient.fetchSDK<B2BOneTapSubmitResponse>({\n      url: '/b2b/oauth/google/onetap/submit',\n      method: 'POST',\n      body: {\n        id_token: credential,\n        organization_id: organizationId,\n        signup_redirect_url: signupRedirectUrl,\n        login_redirect_url: loginRedirectUrl,\n        pkce_code_challenge: codeChallenge,\n      },\n    });\n  }\n\n  async createOneTapClient(): Promise<OneTapLoadResult> {\n    let googleClientId: string;\n    try {\n      googleClientId = await this.fetchGoogleStart();\n    } catch (e) {\n      const err = StytchAPIError.from(e);\n      return { success: false, reason: err.error_type };\n    }\n\n    if (googleClientId === '') {\n      return { success: false, reason: 'oauth_config_not_found' };\n    }\n    const client = new GoogleOneTapClient(await loadGoogleOneTapClient(), googleClientId);\n    return { success: true, client };\n  }\n\n  createOnDiscoverySuccessHandler =\n    ({\n      discoveryRedirectUrl,\n      onSuccess,\n      onError,\n    }: {\n      discoveryRedirectUrl?: string;\n      onSuccess: (redirect_url: string) => void;\n      onError?: (error: Error) => void;\n    }) =>\n    async (response: CredentialResponse) => {\n      const { credential } = response;\n      let submitPromise = this.submitGoogleOneTapTokenDiscovery({\n        credential,\n        discoveryRedirectUrl,\n      }).then((result) => onSuccess(result.redirect_url));\n      if (onError) {\n        submitPromise = submitPromise.catch((error) => onError(error));\n      }\n      await submitPromise;\n    };\n\n  createOnSuccessHandler =\n    ({\n      organizationId,\n      signupRedirectUrl,\n      loginRedirectUrl,\n      onSuccess,\n      onError,\n    }: {\n      organizationId: string;\n      signupRedirectUrl?: string;\n      loginRedirectUrl?: string;\n      onSuccess: (redirect_url: string) => void;\n      onError?: (error: Error) => void;\n    }) =>\n    async (response: CredentialResponse) => {\n      const { credential } = response;\n      let submitPromise = this.submitGoogleOneTapToken({\n        credential,\n        organizationId,\n        signupRedirectUrl,\n        loginRedirectUrl,\n      }).then((result) => onSuccess(result.redirect_url));\n      if (onError) {\n        submitPromise = submitPromise.catch((error) => onError(error));\n      }\n      await submitPromise;\n    };\n\n  redirectOnSuccess = (redirect_url: string) => {\n    window.location.href = redirect_url;\n  };\n}\n"],"names":["DefaultDynamicConfig","Promise","resolve","pkceRequiredForOAuth","B2BOneTapProvider","googleClientID","_networkClient","_pkceManager","_config","fetchGoogleStart","oneTapStartResp","fetchSDK","url","method","google_client_id","submitGoogleOneTapTokenDiscovery","credential","discoveryRedirectUrl","codeChallenge","undefined","keyPair","startPKCETransaction","code_challenge","clearPKPair","body","id_token","discovery_redirect_url","pkce_code_challenge","submitGoogleOneTapToken","organizationId","signupRedirectUrl","loginRedirectUrl","organization_id","signup_redirect_url","login_redirect_url","createOneTapClient","googleClientId","e","err","StytchAPIError","from","success","reason","error_type","client","GoogleOneTapClient","loadGoogleOneTapClient","createOnDiscoverySuccessHandler","onSuccess","onError","response","submitPromise","then","result","redirect_url","catch","error","createOnSuccessHandler","redirectOnSuccess","window","location","href"],"mappings":"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"}