{"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","member_id","_authenticate","initialSession","isSessionStale","member_session_id","requestBody","session_duration_minutes","body","destroySession","authenticate","exchange","exchangeAccessToken","attest","withUpdateSession","data","getTokens","updateSession","tokens","updateTokens"],"mappings":";;AAsBO,MAAMA,wBAAAA,CAAAA;;;IAGXC,OAAAA,GAAU,IAAA;AACR,QAAA,OAAO,IAAI,CAACC,oBAAoB,CAACC,UAAU,EAAA;KAC7C;AAEAC,IAAAA,OAAAA,GAAU,KAA0B;YAClCC,OAAAA,EAAS,IAAI,CAACJ,OAAO,EAAA;AACrBK,YAAAA,SAAAA,EAAW,IAAI,CAACJ,oBAAoB,CAACK,YAAY;AACnD,SAAA,CAAA;AAEAC,IAAAA,QAAAA,GAAW,CAACC,QAAAA,GAAAA;QACV,OAAO,IAAI,CAACP,oBAAoB,CAACQ,gBAAgB,CAAC,CAACC,KAAAA,GAAUF,QAAAA,CAASE,KAAAA,EAAON,OAAAA,IAAW,IAAA,CAAA,CAAA;KAC1F;AAEAO,IAAAA,MAAAA,GAAS,OAAOC,OAAAA,GAAAA;AACd;;;;;;;AAOC,QACD,IAAI;AACF,YAAA,MAAMC,OAAO,MAAM,IAAI,CAACC,cAAc,CAACC,QAAQ,CAAwB;gBACrEC,GAAAA,EAAK,CAAC,oBAAoB,CAAC;gBAC3BC,MAAAA,EAAQ;AACV,aAAA,CAAA;YAEA,IAAI,CAAChB,oBAAoB,CAACiB,YAAY,EAAA;YAEtC,OAAOL,IAAAA;;AAET,QAAA,CAAA,CAAE,OAAOM,KAAAA,EAAY;AACnB,YAAA,IAAIP,SAASQ,UAAAA,EAAY;gBACvB,IAAI,CAACnB,oBAAoB,CAACiB,YAAY,EAAA;AACxC,YAAA,CAAA,MAAO,IAAIG,yBAAAA,CAA0BC,QAAQ,CAACH,KAAAA,CAAMI,UAAU,CAAA,EAAG;gBAC/D,IAAI,CAACtB,oBAAoB,CAACiB,YAAY,EAAA;AACxC,YAAA;YACA,MAAMC,KAAAA;AACR,QAAA;KACF;AAEAK,IAAAA,eAAAA,GAAkB,OAAOZ,OAAAA,GAAAA;AAKvB,QAAA,OAAO,MAAM,IAAI,CAACE,cAAc,CAACC,QAAQ,CAAwB;AAC/DC,YAAAA,GAAAA,EAAK,CAAC,qBAAqB,EAAEJ,OAAAA,CAAQa,SAAS,CAAA,CAAE;YAChDR,MAAAA,EAAQ;AACV,SAAA,CAAA;KACF;AAEQS,IAAAA,aAAAA,GAAgB,OACtBd,OAAAA,GAAAA;AAEA,QAAA,MAAMe,cAAAA,GAAiB,IAAI,CAAC1B,oBAAoB,CAACC,UAAU,EAAA;QAC3D,MAAM0B,cAAAA,GAAiB,IACrBD,cAAAA,EAAgBE,iBAAAA,KAAsB,IAAI,CAAC5B,oBAAoB,CAACC,UAAU,EAAA,EAAI2B,iBAAAA;QAEhF,IAAI;AACF,YAAA,MAAMC,WAAAA,GAAc;AAClBC,gBAAAA,wBAAAA,EAA0BnB,OAAAA,EAASmB;AACrC,aAAA;AACA,YAAA,MAAMlB,OAAO,MAAM,IAAI,CAACC,cAAc,CAACC,QAAQ,CAAwD;gBACrGC,GAAAA,EAAK,4BAAA;gBACLgB,IAAAA,EAAMF,WAAAA;gBACNb,MAAAA,EAAQ;AACV,aAAA,CAAA;AAEA,YAAA,IAAIW,cAAAA,EAAAA,EAAkB;;;gBAGpB,OAAO,IAAI,CAACF,aAAa,CAACd,OAAAA,CAAAA;AAC5B,YAAA;YAEA,OAAOC,IAAAA;;AAET,QAAA,CAAA,CAAE,OAAOM,KAAAA,EAAY;AACnB,YAAA,IAAIS,cAAAA,EAAAA,EAAkB;;;gBAGpB,OAAO,IAAI,CAACF,aAAa,CAACd,OAAAA,CAAAA;AAC5B,YAAA;AAEA,YAAA,IAAIS,yBAAAA,CAA0BC,QAAQ,CAACH,KAAAA,CAAMI,UAAU,CAAA,EAAG;gBACxD,IAAI,CAACtB,oBAAoB,CAACgC,cAAc,EAAA;AAC1C,YAAA;YACA,MAAMd,KAAAA;AACR,QAAA;KACF;IAEAe,YAAAA;IAIAC,QAAAA;IAEAC,mBAAAA;IAIAC,MAAAA;AAEA,IAAA,WAAA,CACE,cAAsC,EAC9BpC,oBAAoE,CAC5E;aAFQa,cAAAA,GAAAA,cAAAA;aACAb,oBAAAA,GAAAA,oBAAAA;QAER,IAAI,CAACiC,YAAY,GAAG,IAAI,CAACjC,oBAAoB,CAACqC,iBAAiB,CAAC,IAAI,CAACZ,aAAa,CAAA;QAElF,IAAI,CAACS,QAAQ,GAAG,IAAI,CAAClC,oBAAoB,CAACqC,iBAAiB,CAAC,OAAOC,IAAAA,GAAAA;AAOjE,YAAA,OAAO,IAAI,CAACzB,cAAc,CAACC,QAAQ,CAAoD;gBACrFC,GAAAA,EAAK,wBAAA;gBACLgB,IAAAA,EAAMO,IAAAA;gBACNtB,MAAAA,EAAQ;AACV,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;QAEA,IAAI,CAACmB,mBAAmB,GAAG,IAAI,CAACnC,oBAAoB,CAACqC,iBAAiB,CACpE,OAAOC,IAAAA,GAAAA;AAKL,YAAA,OAAO,IAAI,CAACzB,cAAc,CAACC,QAAQ,CAA+D;gBAChGC,GAAAA,EAAK,qCAAA;gBACLgB,IAAAA,EAAMO,IAAAA;gBACNtB,MAAAA,EAAQ;AACV,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;QAGF,IAAI,CAACoB,MAAM,GAAG,IAAI,CAACpC,oBAAoB,CAACqC,iBAAiB,CAAC,OAAOC,IAAAA,GAAAA;AAQ/D,YAAA,OAAO,IAAI,CAACzB,cAAc,CAACC,QAAQ,CAAkD;gBACnFC,GAAAA,EAAK,sBAAA;gBACLgB,IAAAA,EAAMO,IAAAA;gBACNtB,MAAAA,EAAQ;AACV,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA;IAEAuB,SAAAA,GAAY;AACV,QAAA,OAAO,IAAI,CAACvC,oBAAoB,CAACuC,SAAS,EAAA;AAK5C,IAAA;AAEAC,IAAAA,aAAAA,CAAcC,MAA2B,EAAQ;AAK/C,QAAA,IAAI,CAACzC,oBAAoB,CAAC0C,YAAY,CAACD,MAAAA,CAAAA;AACzC,IAAA;AACF;;;;"}