{"version":3,"file":"HeadlessOAuthClient.mjs","sources":["../../../../../../../core/src/HeadlessClients/HeadlessOAuthClient.ts"],"sourcesContent":["import { IConsumerSubscriptionService, INetworkClient, IPKCEManager } from '..';\nimport {\n  IHeadlessOAuthClient,\n  OAuthAttachResponse,\n  OAuthAuthenticateOptions,\n  OAuthAuthenticateResponse,\n  OAuthGetURLOptions,\n  OAuthProviders,\n  StytchProjectConfigurationInput,\n} from '../public';\nimport { isTestPublicToken, logger, omitUser, WithUser } from '../utils';\nimport { validateInDev } from '../utils/dev';\n\ntype DynamicConfig = Promise<{\n  cnameDomain: null | string;\n  pkceRequiredForOAuth: boolean;\n}>;\ntype Config = {\n  publicToken: string;\n  testAPIURL: string;\n  liveAPIURL: string;\n};\n\nexport class HeadlessOAuthClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n  implements IHeadlessOAuthClient<TProjectConfiguration>\n{\n  authenticate: (\n    token: string,\n    options: OAuthAuthenticateOptions,\n  ) => Promise<OAuthAuthenticateResponse<TProjectConfiguration>>;\n\n  constructor(\n    private _networkClient: INetworkClient,\n    private _subscriptionService: IConsumerSubscriptionService<TProjectConfiguration>,\n    private _pkceManager: IPKCEManager,\n    private _dynamicConfig: DynamicConfig,\n    private _config: Config,\n  ) {\n    this.authenticate = this._subscriptionService.withUpdateSession(\n      async (token: string, options: OAuthAuthenticateOptions) => {\n        validateInDev(\n          'stytch.oauth.authenticate',\n          { token, ...options },\n          {\n            token: 'string',\n            session_duration_minutes: 'number',\n          },\n        );\n\n        const keyPair = await this._pkceManager.getPKPair();\n\n        if (!keyPair) {\n          logger.warn(\n            'No code verifier found in local storage for OAuth flow.\\n' +\n              'Consider using stytch.oauth.$provider.start() to add PKCE to your OAuth flows for added security.\\n' +\n              'See https://stytch.com/docs/oauth#guides_pkce for more information.',\n          );\n        }\n\n        const resp = await this._networkClient.fetchSDK<WithUser<OAuthAuthenticateResponse<TProjectConfiguration>>>({\n          url: '/oauth/authenticate',\n          method: 'POST',\n          body: {\n            token,\n            code_verifier: keyPair?.code_verifier,\n            ...options,\n          },\n        });\n\n        this._pkceManager.clearPKPair();\n\n        return omitUser(resp);\n      },\n    );\n  }\n\n  google = {\n    start: this.startOAuthFlow(OAuthProviders.Google),\n  };\n\n  apple = {\n    start: this.startOAuthFlow(OAuthProviders.Apple),\n  };\n\n  microsoft = {\n    start: this.startOAuthFlow(OAuthProviders.Microsoft),\n  };\n\n  github = {\n    start: this.startOAuthFlow(OAuthProviders.Github),\n  };\n\n  gitlab = {\n    start: this.startOAuthFlow(OAuthProviders.GitLab),\n  };\n\n  facebook = {\n    start: this.startOAuthFlow(OAuthProviders.Facebook),\n  };\n\n  discord = {\n    start: this.startOAuthFlow(OAuthProviders.Discord),\n  };\n\n  salesforce = {\n    start: this.startOAuthFlow(OAuthProviders.Salesforce),\n  };\n\n  slack = {\n    start: this.startOAuthFlow(OAuthProviders.Slack),\n  };\n\n  amazon = {\n    start: this.startOAuthFlow(OAuthProviders.Amazon),\n  };\n\n  bitbucket = {\n    start: this.startOAuthFlow(OAuthProviders.Bitbucket),\n  };\n\n  linkedin = {\n    start: this.startOAuthFlow(OAuthProviders.LinkedIn),\n  };\n\n  coinbase = {\n    start: this.startOAuthFlow(OAuthProviders.Coinbase),\n  };\n\n  twitch = {\n    start: this.startOAuthFlow(OAuthProviders.Twitch),\n  };\n\n  twitter = {\n    start: this.startOAuthFlow(OAuthProviders.Twitter),\n  };\n\n  tiktok = {\n    start: this.startOAuthFlow(OAuthProviders.TikTok),\n  };\n\n  snapchat = {\n    start: this.startOAuthFlow(OAuthProviders.Snapchat),\n  };\n\n  figma = {\n    start: this.startOAuthFlow(OAuthProviders.Figma),\n  };\n\n  yahoo = {\n    start: this.startOAuthFlow(OAuthProviders.Yahoo),\n  };\n\n  async attach(provider: string): Promise<OAuthAttachResponse> {\n    validateInDev('stytch.oauth.attach', { provider }, { provider: 'string' });\n    return await this._networkClient.fetchSDK<OAuthAttachResponse>({\n      url: '/oauth/attach',\n      method: 'POST',\n      body: { provider },\n    });\n  }\n\n  private async getBaseApiUrl() {\n    const { cnameDomain } = await this._dynamicConfig;\n    if (cnameDomain) {\n      // The API returns cname domains without a protocol - assume HTTPS\n      return `https://${cnameDomain}`;\n    }\n    // Our TestAPIURL and LiveAPIURL should have the HTTPS protocol already attached\n    // Don't add it twice!\n    if (isTestPublicToken(this._config.publicToken)) {\n      return this._config.testAPIURL;\n    }\n    return this._config.liveAPIURL;\n  }\n\n  private startOAuthFlow(providerType: OAuthProviders) {\n    return async ({\n      login_redirect_url,\n      signup_redirect_url,\n      custom_scopes,\n      provider_params,\n      oauth_attach_token,\n    }: OAuthGetURLOptions = {}): Promise<void> => {\n      const { cnameDomain, pkceRequiredForOAuth } = await this._dynamicConfig;\n      const baseURL = await this.getBaseApiUrl();\n\n      this._networkClient.logEvent({\n        name: 'start_oauth_flow',\n        details: {\n          provider_type: providerType,\n          custom_scopes,\n          cname_domain: cnameDomain,\n          pkce: pkceRequiredForOAuth,\n          provider_params,\n        },\n      });\n\n      const oauthUrl = new URL(`${baseURL}/v1/public/oauth/${providerType}/start`);\n      oauthUrl.searchParams.set('public_token', this._config.publicToken);\n\n      if (pkceRequiredForOAuth) {\n        const keyPair = await this._pkceManager.startPKCETransaction();\n        oauthUrl.searchParams.set('code_challenge', keyPair.code_challenge);\n      } else {\n        this._pkceManager.clearPKPair();\n      }\n\n      if (custom_scopes) {\n        validateInDev(\n          'startOAuthFlow',\n          { custom_scopes },\n          {\n            custom_scopes: 'stringArray',\n          },\n        );\n        oauthUrl.searchParams.set('custom_scopes', custom_scopes.join(' '));\n      }\n      if (provider_params) {\n        validateInDev(\n          'startOAuthFlow',\n          { provider_params },\n          {\n            provider_params: 'optionalObject',\n          },\n        );\n        for (const key in provider_params) {\n          oauthUrl.searchParams.set('provider_' + key, provider_params[key]);\n        }\n      }\n      if (login_redirect_url) oauthUrl.searchParams.set('login_redirect_url', login_redirect_url);\n      if (signup_redirect_url) oauthUrl.searchParams.set('signup_redirect_url', signup_redirect_url);\n      if (oauth_attach_token) oauthUrl.searchParams.set('oauth_attach_token', oauth_attach_token);\n\n      this.navigate(oauthUrl);\n    };\n  }\n\n  // Public so it can be mocked in tests\n  navigate(url: URL) {\n    window.location.href = url.toString();\n  }\n}\n"],"names":["HeadlessOAuthClient","authenticate","_subscriptionService","_pkceManager","_config","_networkClient","_dynamicConfig","withUpdateSession","token","options","validateInDev","session_duration_minutes","keyPair","getPKPair","logger","warn","resp","fetchSDK","url","method","body","code_verifier","clearPKPair","omitUser","google","start","startOAuthFlow","OAuthProviders","Google","apple","Apple","microsoft","Microsoft","github","Github","gitlab","GitLab","facebook","Facebook","discord","Discord","salesforce","Salesforce","slack","Slack","amazon","Amazon","bitbucket","Bitbucket","linkedin","LinkedIn","coinbase","Coinbase","twitch","Twitch","twitter","Twitter","tiktok","TikTok","snapchat","Snapchat","figma","Figma","yahoo","Yahoo","attach","provider","getBaseApiUrl","cnameDomain","isTestPublicToken","publicToken","testAPIURL","liveAPIURL","providerType","login_redirect_url","signup_redirect_url","custom_scopes","provider_params","oauth_attach_token","pkceRequiredForOAuth","baseURL","logEvent","name","details","provider_type","cname_domain","pkce","oauthUrl","URL","searchParams","set","startPKCETransaction","code_challenge","join","key","navigate","window","location","href","toString"],"mappings":"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"}