{"version":3,"file":"HeadlessPasswordClient.mjs","sources":["../../../../../../../core/src/HeadlessClients/HeadlessPasswordClient.ts"],"sourcesContent":["import { IConsumerSubscriptionService } from '..';\nimport { IDFPProtectedAuthProvider } from '../DFPProtectedAuthProvider';\nimport { INetworkClient } from '../NetworkClient';\nimport { IPKCEManager } from '../PKCEManager';\nimport {\n  IHeadlessPasswordClient,\n  PasswordAuthenticateOptions,\n  PasswordAuthenticateResponse,\n  PasswordCreateOptions,\n  PasswordCreateResponse,\n  PasswordResetByEmailOptions,\n  PasswordResetByEmailResponse,\n  PasswordResetByEmailStartOptions,\n  PasswordResetByEmailStartResponse,\n  PasswordResetByExistingPasswordOptions,\n  PasswordResetByExistingPasswordResponse,\n  PasswordResetBySessionOptions,\n  PasswordResetBySessionResponse,\n  PasswordStrengthCheckOptions,\n  PasswordStrengthCheckResponse,\n  StytchProjectConfigurationInput,\n} from '../public';\nimport { omitUser, WithUser } from '../utils';\nimport { validateInDev } from '../utils/dev';\n\ntype DynamicConfig = Promise<{\n  pkceRequiredForPasswordResets: boolean;\n}>;\n\nconst DefaultDynamicConfig = Promise.resolve({\n  pkceRequiredForPasswordResets: false,\n});\n\nexport class HeadlessPasswordClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n  implements IHeadlessPasswordClient<TProjectConfiguration>\n{\n  create: (options: PasswordCreateOptions) => Promise<PasswordCreateResponse<TProjectConfiguration>>;\n\n  authenticate: (options: PasswordAuthenticateOptions) => Promise<PasswordAuthenticateResponse<TProjectConfiguration>>;\n\n  resetByEmail: (options: PasswordResetByEmailOptions) => Promise<PasswordResetByEmailResponse<TProjectConfiguration>>;\n\n  resetByExistingPassword: (\n    options: PasswordResetByExistingPasswordOptions,\n  ) => Promise<PasswordResetByExistingPasswordResponse<TProjectConfiguration>>;\n\n  resetBySession: (\n    options: PasswordResetBySessionOptions,\n  ) => Promise<PasswordResetBySessionResponse<TProjectConfiguration>>;\n\n  constructor(\n    private _networkClient: INetworkClient,\n    private _subscriptionService: IConsumerSubscriptionService<TProjectConfiguration>,\n    private _pkceManager: IPKCEManager,\n    private _config: DynamicConfig = DefaultDynamicConfig,\n    private dfpProtectedAuth: IDFPProtectedAuthProvider,\n  ) {\n    this.create = this._subscriptionService.withUpdateSession(\n      async (options: PasswordCreateOptions): Promise<PasswordCreateResponse<TProjectConfiguration>> => {\n        validateInDev('stytch.passwords.create', options, {\n          password: 'string',\n          email: 'string',\n          session_duration_minutes: 'number',\n        });\n\n        const { dfp_telemetry_id, captcha_token } = await this.dfpProtectedAuth.getDFPTelemetryIDAndCaptcha();\n\n        const resp = await this._networkClient.retriableFetchSDK<\n          WithUser<PasswordCreateResponse<TProjectConfiguration>>\n        >({\n          url: '/passwords',\n          method: 'POST',\n          body: {\n            email: options.email,\n            password: options.password,\n            session_duration_minutes: options.session_duration_minutes,\n            captcha_token,\n            dfp_telemetry_id,\n          },\n          retryCallback: this.dfpProtectedAuth.retryWithCaptchaAndDFP,\n        });\n\n        return omitUser(resp);\n      },\n    );\n\n    this.authenticate = this._subscriptionService.withUpdateSession(\n      async (options: PasswordAuthenticateOptions): Promise<PasswordAuthenticateResponse<TProjectConfiguration>> => {\n        validateInDev('stytch.passwords.authenticate', options, {\n          password: 'string',\n          email: 'string',\n          session_duration_minutes: 'number',\n        });\n\n        const { dfp_telemetry_id, captcha_token } = await this.dfpProtectedAuth.getDFPTelemetryIDAndCaptcha();\n\n        const resp = await this._networkClient.retriableFetchSDK<\n          WithUser<PasswordAuthenticateResponse<TProjectConfiguration>>\n        >({\n          url: '/passwords/authenticate',\n          method: 'POST',\n          body: {\n            email: options.email,\n            password: options.password,\n            session_duration_minutes: options.session_duration_minutes,\n            captcha_token,\n            dfp_telemetry_id,\n          },\n          retryCallback: this.dfpProtectedAuth.retryWithCaptchaAndDFP,\n        });\n\n        return omitUser(resp);\n      },\n    );\n\n    this.resetByEmail = this._subscriptionService.withUpdateSession(\n      async (options: PasswordResetByEmailOptions): Promise<PasswordResetByEmailResponse<TProjectConfiguration>> => {\n        validateInDev('stytch.passwords.resetByEmail', options, {\n          token: 'string',\n          password: 'string',\n          session_duration_minutes: 'number',\n        });\n\n        const { dfp_telemetry_id, captcha_token } = await this.dfpProtectedAuth.getDFPTelemetryIDAndCaptcha();\n        const pkPair = await this._pkceManager.getPKPair();\n        const code_verifier = pkPair?.code_verifier;\n\n        const resp = await this._networkClient.retriableFetchSDK<\n          WithUser<PasswordResetByEmailResponse<TProjectConfiguration>>\n        >({\n          url: '/passwords/email/reset',\n          method: 'POST',\n          body: {\n            token: options.token,\n            password: options.password,\n            session_duration_minutes: options.session_duration_minutes,\n            captcha_token,\n            code_verifier,\n            dfp_telemetry_id,\n          },\n          retryCallback: this.dfpProtectedAuth.retryWithCaptchaAndDFP,\n        });\n\n        this._pkceManager.clearPKPair();\n\n        return omitUser(resp);\n      },\n    );\n\n    this.resetByExistingPassword = this._subscriptionService.withUpdateSession(\n      async (\n        options: PasswordResetByExistingPasswordOptions,\n      ): Promise<PasswordResetByExistingPasswordResponse<TProjectConfiguration>> => {\n        validateInDev('stytch.passwords.resetByExistingPassword', options, {\n          email: 'string',\n          existing_password: 'string',\n          new_password: 'string',\n          session_duration_minutes: 'number',\n        });\n\n        const { dfp_telemetry_id, captcha_token } = await this.dfpProtectedAuth.getDFPTelemetryIDAndCaptcha();\n\n        const resp = await this._networkClient.retriableFetchSDK<\n          WithUser<PasswordResetByExistingPasswordResponse<TProjectConfiguration>>\n        >({\n          url: '/passwords/existing_password/reset',\n          method: 'POST',\n          body: {\n            email: options.email,\n            existing_password: options.existing_password,\n            new_password: options.new_password,\n            session_duration_minutes: options.session_duration_minutes,\n            dfp_telemetry_id,\n            captcha_token,\n          },\n          retryCallback: this.dfpProtectedAuth.retryWithCaptchaAndDFP,\n        });\n\n        return omitUser(resp);\n      },\n    );\n\n    this.resetBySession = this._subscriptionService.withUpdateSession(\n      async (\n        options: PasswordResetBySessionOptions,\n      ): Promise<PasswordResetBySessionResponse<TProjectConfiguration>> => {\n        validateInDev('stytch.passwords.resetBySession', options, {\n          password: 'string',\n        });\n\n        const { dfp_telemetry_id, captcha_token } = await this.dfpProtectedAuth.getDFPTelemetryIDAndCaptcha();\n\n        return this._networkClient.retriableFetchSDK<PasswordResetBySessionResponse<TProjectConfiguration>>({\n          url: '/passwords/session/reset',\n          method: 'POST',\n          body: {\n            password: options.password,\n            session_duration_minutes: options.session_duration_minutes,\n            dfp_telemetry_id,\n            captcha_token,\n          },\n          retryCallback: this.dfpProtectedAuth.retryWithCaptchaAndDFP,\n        });\n      },\n    );\n  }\n\n  private async getCodeChallenge(): Promise<string | undefined> {\n    const { pkceRequiredForPasswordResets } = await this._config;\n    if (!pkceRequiredForPasswordResets) {\n      return undefined;\n    }\n    let keyPair = await this._pkceManager.getPKPair();\n    if (keyPair) {\n      return keyPair.code_challenge;\n    }\n    keyPair = await this._pkceManager.startPKCETransaction();\n    return keyPair.code_challenge;\n  }\n\n  async resetByEmailStart(options: PasswordResetByEmailStartOptions): Promise<PasswordResetByEmailStartResponse> {\n    validateInDev('stytch.passwords.resetByEmailStart', options, {\n      email: 'string',\n      login_redirect_url: 'optionalString',\n      reset_password_redirect_url: 'optionalString',\n      reset_password_template_id: 'optionalString',\n      reset_password_expiration_minutes: 'optionalNumber',\n      locale: 'optionalString',\n    });\n\n    const code_challenge = await this.getCodeChallenge();\n    const { dfp_telemetry_id, captcha_token } = await this.dfpProtectedAuth.getDFPTelemetryIDAndCaptcha();\n\n    return this._networkClient.retriableFetchSDK<PasswordResetByEmailStartResponse>({\n      url: '/passwords/email/reset/start',\n      method: 'POST',\n      body: {\n        email: options.email,\n        login_redirect_url: options.login_redirect_url,\n        reset_password_redirect_url: options.reset_password_redirect_url,\n        reset_password_expiration_minutes: options.reset_password_expiration_minutes,\n        reset_password_template_id: options.reset_password_template_id,\n        locale: options.locale,\n        code_challenge,\n        captcha_token,\n        dfp_telemetry_id,\n      },\n      retryCallback: this.dfpProtectedAuth.retryWithCaptchaAndDFP,\n    });\n  }\n\n  async strengthCheck(options: PasswordStrengthCheckOptions): Promise<PasswordStrengthCheckResponse> {\n    validateInDev('stytch.passwords.strengthCheck', options, {\n      email: 'optionalString',\n      password: 'string',\n    });\n\n    return this._networkClient.fetchSDK<PasswordStrengthCheckResponse>({\n      url: '/passwords/strength_check',\n      method: 'POST',\n      body: {\n        email: options.email,\n        password: options.password,\n      },\n    });\n  }\n}\n"],"names":["DefaultDynamicConfig","Promise","resolve","pkceRequiredForPasswordResets","HeadlessPasswordClient","create","authenticate","resetByEmail","resetByExistingPassword","resetBySession","_subscriptionService","_pkceManager","_config","dfpProtectedAuth","_networkClient","withUpdateSession","options","dfp_telemetry_id","captcha_token","getDFPTelemetryIDAndCaptcha","resp","retriableFetchSDK","url","method","body","email","password","session_duration_minutes","retryCallback","retryWithCaptchaAndDFP","omitUser","pkPair","getPKPair","code_verifier","token","clearPKPair","existing_password","new_password","getCodeChallenge","undefined","keyPair","code_challenge","startPKCETransaction","resetByEmailStart","login_redirect_url","reset_password_redirect_url","reset_password_expiration_minutes","reset_password_template_id","locale","strengthCheck","fetchSDK"],"mappings":"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"}