{"version":3,"file":"HeadlessSessionClient.mjs","sources":["../../../../../../../core/src/HeadlessClients/HeadlessSessionClient.ts"],"sourcesContent":["import { IConsumerSubscriptionService, INetworkClient } from '..';\nimport {\n  ConsumerState,\n  IHeadlessSessionClient,\n  SessionAccessTokenExchangeOptions,\n  SessionAccessTokenExchangeResponse,\n  SessionAttestOptions,\n  SessionAttestResponse,\n  SessionAuthenticateOptions,\n  SessionAuthenticateResponse,\n  SessionInfo,\n  SessionOnChangeCallback,\n  SessionRevokeOptions,\n  SessionRevokeResponse,\n  SessionTokens,\n  SessionTokensUpdate,\n  StytchProjectConfigurationInput,\n  UNRECOVERABLE_ERROR_TYPES,\n} from '../public';\nimport { ExtractOpaqueTokens, IfOpaqueTokens } from '../typeConfig';\nimport { omitUser, WithUser } from '../utils';\nimport { validateInDev } from '../utils/dev';\n\nexport class HeadlessSessionClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n  implements IHeadlessSessionClient<TProjectConfiguration>\n{\n  authenticate: (options?: SessionAuthenticateOptions) => Promise<SessionAuthenticateResponse<TProjectConfiguration>>;\n\n  exchangeAccessToken: (\n    data: SessionAccessTokenExchangeOptions,\n  ) => Promise<SessionAccessTokenExchangeResponse<TProjectConfiguration>>;\n\n  attest: (data: SessionAttestOptions) => Promise<SessionAttestResponse<TProjectConfiguration>>;\n\n  constructor(\n    private _networkClient: INetworkClient,\n    private _subscriptionService: IConsumerSubscriptionService<TProjectConfiguration>,\n  ) {\n    this.authenticate = this._subscriptionService.withUpdateSession(this._authenticate);\n\n    this.exchangeAccessToken = this._subscriptionService.withUpdateSession(\n      async (data: SessionAccessTokenExchangeOptions) => {\n        validateInDev('stytch.session.exchangeAccessToken', data, {\n          access_token: 'string',\n          session_duration_minutes: 'number',\n        });\n        const resp = await this._networkClient.fetchSDK<\n          WithUser<SessionAccessTokenExchangeResponse<TProjectConfiguration>>\n        >({\n          url: '/sessions/exchange_access_token',\n          body: data,\n          method: 'POST',\n        });\n\n        return omitUser(resp);\n      },\n    );\n\n    this.attest = this._subscriptionService.withUpdateSession(async (data: SessionAttestOptions) => {\n      validateInDev('stytch.session.attest', data, {\n        profile_id: 'string',\n        token: 'string',\n        session_duration_minutes: 'optionalNumber',\n      });\n\n      return this._networkClient.fetchSDK<SessionAttestResponse<TProjectConfiguration>>({\n        url: '/sessions/attest',\n        body: data,\n        method: 'POST',\n      });\n    });\n  }\n\n  getSync = () => {\n    return this._subscriptionService.getSession();\n  };\n\n  getInfo = (): SessionInfo => {\n    const session = this.getSync();\n    const fromCache = this._subscriptionService.getFromCache();\n    return { session, fromCache };\n  };\n\n  onChange = (callback: SessionOnChangeCallback) => {\n    let lastVal = this._subscriptionService.getSession();\n    const listener = (state: ConsumerState | null) => {\n      if (state?.session !== lastVal) {\n        lastVal = state?.session ?? null;\n        callback(lastVal);\n      }\n    };\n    return this._subscriptionService.subscribeToState(listener);\n  };\n\n  revoke = async (options?: SessionRevokeOptions) => {\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 passses 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\n    try {\n      const resp = await this._networkClient.fetchSDK<SessionRevokeResponse>({\n        url: `/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  private _authenticate = async (\n    options?: SessionAuthenticateOptions,\n  ): Promise<SessionAuthenticateResponse<TProjectConfiguration>> => {\n    const initialSession = this._subscriptionService.getSession();\n    const isSessionStale = () => initialSession?.session_id !== this._subscriptionService.getSession()?.session_id;\n\n    try {\n      const requestBody = {\n        session_duration_minutes: options?.session_duration_minutes,\n      };\n      const resp = await this._networkClient.fetchSDK<WithUser<SessionAuthenticateResponse<TProjectConfiguration>>>({\n        url: '/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 omitUser(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  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":["HeadlessSessionClient","authenticate","exchangeAccessToken","attest","_subscriptionService","_networkClient","withUpdateSession","_authenticate","data","validateInDev","access_token","session_duration_minutes","resp","fetchSDK","url","body","method","omitUser","profile_id","token","getSync","getSession","getInfo","session","fromCache","getFromCache","onChange","callback","lastVal","listener","state","subscribeToState","revoke","options","destroyState","error","forceClear","UNRECOVERABLE_ERROR_TYPES","includes","error_type","initialSession","isSessionStale","session_id","requestBody","destroySession","getTokens","updateSession","tokens","session_token","session_jwt","updateTokens"],"mappings":"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"}