{"version":3,"file":"HeadlessB2BSessionClient.mjs","sources":["../../../../../../../../core/src/HeadlessClients/b2b/HeadlessB2BSessionClient.ts"],"sourcesContent":["import { ExtractOpaqueTokens, IB2BSubscriptionService, IfOpaqueTokens, INetworkClient } from '../..';\nimport {\n  B2BSessionAccessTokenExchangeOptions,\n  B2BSessionAccessTokenExchangeResponse,\n  B2BSessionAttestOptions,\n  B2BSessionAttestResponse,\n  B2BSessionAuthenticateResponse,\n  B2BSessionExchangeOptions,\n  B2BSessionExchangeResponse,\n  B2BSessionOnChangeCallback,\n  B2BSessionRevokeOptions,\n  IHeadlessB2BSessionClient,\n  MemberSessionInfo,\n  SessionAuthenticateOptions,\n  SessionRevokeResponse,\n  SessionTokens,\n  SessionTokensUpdate,\n  StytchProjectConfigurationInput,\n  UNRECOVERABLE_ERROR_TYPES,\n} from '../../public';\nimport { validateInDev } from '../../utils/dev';\n\nexport class HeadlessB2BSessionClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n  implements IHeadlessB2BSessionClient<TProjectConfiguration>\n{\n  getSync = () => {\n    return this._subscriptionService.getSession();\n  };\n\n  getInfo = (): MemberSessionInfo => ({\n    session: this.getSync(),\n    fromCache: this._subscriptionService.getFromCache(),\n  });\n\n  onChange = (callback: B2BSessionOnChangeCallback) => {\n    return this._subscriptionService.subscribeToState((state) => callback(state?.session ?? null));\n  };\n\n  revoke = async (options?: B2BSessionRevokeOptions) => {\n    /**\n     * Revoke destroys the local state if the API request is successful\n     * or if we return an unrecoverable error (user is unauthenticated)\n     * or if the developer passes in a forceClear option.\n     * If the API request returns a recoverable error (the user is offline),\n     * we do not destroy the local state to let the developer manually add retry\n     * logic to call revoke again.\n     */\n    try {\n      const resp = await this._networkClient.fetchSDK<SessionRevokeResponse>({\n        url: `/b2b/sessions/revoke`,\n        method: 'POST',\n      });\n\n      this._subscriptionService.destroyState();\n\n      return resp;\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    } catch (error: any) {\n      if (options?.forceClear) {\n        this._subscriptionService.destroyState();\n      } else if (UNRECOVERABLE_ERROR_TYPES.includes(error.error_type)) {\n        this._subscriptionService.destroyState();\n      }\n      throw error;\n    }\n  };\n\n  revokeForMember = async (options: { member_id: string }) => {\n    validateInDev('stytch.session.revokeForMember', options, {\n      member_id: 'string',\n    });\n\n    return await this._networkClient.fetchSDK<SessionRevokeResponse>({\n      url: `/b2b/sessions/revoke/${options.member_id}`,\n      method: 'POST',\n    });\n  };\n\n  private _authenticate = async (\n    options?: SessionAuthenticateOptions,\n  ): Promise<B2BSessionAuthenticateResponse<TProjectConfiguration>> => {\n    const initialSession = this._subscriptionService.getSession();\n    const isSessionStale = () =>\n      initialSession?.member_session_id !== this._subscriptionService.getSession()?.member_session_id;\n\n    try {\n      const requestBody = {\n        session_duration_minutes: options?.session_duration_minutes,\n      };\n      const resp = await this._networkClient.fetchSDK<B2BSessionAuthenticateResponse<TProjectConfiguration>>({\n        url: '/b2b/sessions/authenticate',\n        body: requestBody,\n        method: 'POST',\n      });\n\n      if (isSessionStale()) {\n        // [SDK-1336] The session was updated out from under us while the\n        // request was in flight; discard the response and retry\n        return this._authenticate(options);\n      }\n\n      return resp;\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    } catch (error: any) {\n      if (isSessionStale()) {\n        // [SDK-1336] The session was updated out from under us while the\n        // request was in flight; discard the response and retry\n        return this._authenticate(options);\n      }\n\n      if (UNRECOVERABLE_ERROR_TYPES.includes(error.error_type)) {\n        this._subscriptionService.destroySession();\n      }\n      throw error;\n    }\n  };\n\n  authenticate: (\n    options?: SessionAuthenticateOptions,\n  ) => Promise<B2BSessionAuthenticateResponse<TProjectConfiguration>>;\n\n  exchange: (data: B2BSessionExchangeOptions) => Promise<B2BSessionExchangeResponse<TProjectConfiguration>>;\n\n  exchangeAccessToken: (\n    data: B2BSessionAccessTokenExchangeOptions,\n  ) => Promise<B2BSessionAccessTokenExchangeResponse<TProjectConfiguration>>;\n\n  attest: (data: B2BSessionAttestOptions) => Promise<B2BSessionAttestResponse<TProjectConfiguration>>;\n\n  constructor(\n    private _networkClient: INetworkClient,\n    private _subscriptionService: IB2BSubscriptionService<TProjectConfiguration>,\n  ) {\n    this.authenticate = this._subscriptionService.withUpdateSession(this._authenticate);\n\n    this.exchange = this._subscriptionService.withUpdateSession(async (data: B2BSessionExchangeOptions) => {\n      validateInDev('stytch.session.exchange', data, {\n        organization_id: 'string',\n        session_duration_minutes: 'number',\n        locale: 'optionalString',\n      });\n\n      return this._networkClient.fetchSDK<B2BSessionExchangeResponse<TProjectConfiguration>>({\n        url: '/b2b/sessions/exchange',\n        body: data,\n        method: 'POST',\n      });\n    });\n\n    this.exchangeAccessToken = this._subscriptionService.withUpdateSession(\n      async (data: B2BSessionAccessTokenExchangeOptions) => {\n        validateInDev('stytch.session.exchange', data, {\n          access_token: 'string',\n          session_duration_minutes: 'number',\n        });\n        return this._networkClient.fetchSDK<B2BSessionAccessTokenExchangeResponse<TProjectConfiguration>>({\n          url: '/b2b/sessions/exchange_access_token',\n          body: data,\n          method: 'POST',\n        });\n      },\n    );\n\n    this.attest = this._subscriptionService.withUpdateSession(async (data: B2BSessionAttestOptions) => {\n      validateInDev('stytch.session.attest', data, {\n        organization_id: 'optionalString',\n        profile_id: 'string',\n        token: 'string',\n        session_duration_minutes: 'optionalNumber',\n      });\n\n      return this._networkClient.fetchSDK<B2BSessionAttestResponse<TProjectConfiguration>>({\n        url: '/b2b/sessions/attest',\n        body: data,\n        method: 'POST',\n      });\n    });\n  }\n\n  getTokens() {\n    return this._subscriptionService.getTokens() as IfOpaqueTokens<\n      ExtractOpaqueTokens<TProjectConfiguration>,\n      never,\n      SessionTokens | null\n    >;\n  }\n\n  updateSession(tokens: SessionTokensUpdate): void {\n    validateInDev('stytch.session.updateSession', tokens, {\n      session_token: 'string',\n      session_jwt: 'optionalString',\n    });\n    this._subscriptionService.updateTokens(tokens);\n  }\n}\n"],"names":["HeadlessB2BSessionClient","getSync","_subscriptionService","getSession","getInfo","session","fromCache","getFromCache","onChange","callback","subscribeToState","state","revoke","options","resp","_networkClient","fetchSDK","url","method","destroyState","error","forceClear","UNRECOVERABLE_ERROR_TYPES","includes","error_type","revokeForMember","validateInDev","member_id","_authenticate","initialSession","isSessionStale","member_session_id","requestBody","session_duration_minutes","body","destroySession","authenticate","exchange","exchangeAccessToken","attest","withUpdateSession","data","organization_id","locale","access_token","profile_id","token","getTokens","updateSession","tokens","session_token","session_jwt","updateTokens"],"mappings":"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"}