{"version":3,"file":"SubscriptionService.mjs","sources":["../../../../../../web/src/SubscriptionService.ts"],"sourcesContent":["import {\n  AllowedOpaqueTokens,\n  CommonAuthenticateOptions,\n  ExtractOpaqueTokens,\n  IB2BSubscriptionService,\n  IConsumerSubscriptionService,\n  IfOpaqueTokens,\n  InternalSessionUpdateOptions,\n  ISubscriptionService,\n  logger,\n  OpaqueTokensNeverConfig,\n  SessionUpdateOptions,\n} from '@stytch/core';\nimport {\n  AuthenticateResponse,\n  B2BAuthenticateResponse,\n  B2BAuthenticateResponseWithMFA,\n  B2BDiscoveryAuthenticateResponse,\n  B2BState,\n  ConsumerState,\n  Member,\n  Organization,\n  SessionTokens,\n  SessionTokensUpdate,\n  StytchClientOptions,\n  StytchProjectConfigurationInput,\n  UnsubscribeFunction,\n  User,\n} from '@stytch/core/public';\nimport { createDeepEqual } from '@stytch/js-utils';\nimport Cookies from 'js-cookie';\n\nimport { hasMultipleCookies, isLocalhost } from '../src/utils';\nimport {\n  getKeyBoundStorage,\n  getPersistentStorageKey,\n  IKeyBoundStorage,\n  safeLocalStorage,\n  safeSessionStorage,\n  StorageKey,\n} from './utils/storage';\n\ntype SubscriberFunction<T> = (value: T | null) => void;\ntype Subscribers<T> = Record<string, SubscriberFunction<T>>;\n\nconst STYTCH_SESSION_COOKIE = 'stytch_session';\nconst STYTCH_SESSION_JWT_COOKIE = 'stytch_session_jwt';\nconst STYTCH_INTERMEDIATE_SESSION_TOKEN_COOKIE = 'stytch_intermediate_session_token';\nconst SEEN_DOMAINS_KEY = 'seen_domains';\n\nexport class SubscriptionDataLayer<T extends ConsumerState | B2BState> {\n  publicToken: string;\n  state: T | null;\n  private readonly _opaqueTokenCookieName: string | null = null;\n  private readonly _jwtCookieName: string | null = null;\n  private readonly _cookiePath: string | null = null;\n  private readonly _domain: string | null = null;\n  private readonly _cookieAvailableToSubdomains: boolean = false;\n  private readonly _istCookieName: string | null = null;\n\n  subscriptions: Subscribers<T & SessionUpdateOptions>;\n\n  private readonly _localStorage: IKeyBoundStorage;\n  readonly browserSessionStorage: IKeyBoundStorage;\n\n  constructor(publicToken: string, options?: StytchClientOptions) {\n    this.publicToken = publicToken;\n    this.state = null;\n    this.subscriptions = {};\n\n    // Initialize storage utilities\n    this._localStorage = getKeyBoundStorage(safeLocalStorage, publicToken);\n    this.browserSessionStorage = getKeyBoundStorage(safeSessionStorage, publicToken);\n\n    if (options?.cookieOptions) {\n      this._opaqueTokenCookieName = options.cookieOptions.opaqueTokenCookieName || null;\n      this._jwtCookieName = options.cookieOptions.jwtCookieName || null;\n      this._cookiePath = options.cookieOptions.path || null;\n      this._domain = options.cookieOptions.domain || null;\n      this._cookieAvailableToSubdomains = options.cookieOptions.availableToSubdomains || false;\n      this._istCookieName = options.cookieOptions.istCookieName || null;\n    }\n\n    const localStorageState = this._localStorage.getItem('');\n\n    if (!localStorageState) {\n      return;\n    }\n    let parsedState: unknown;\n    try {\n      parsedState = JSON.parse(localStorageState);\n    } catch {\n      // Overwrite the bad data with nulls\n      this.syncToLocalStorage();\n      return;\n    }\n    // TODO: Validate the data looks decent & matches Session/User format\n    this.state = parsedState as T;\n  }\n\n  protected get opaqueTokenCookieName(): string {\n    return this._opaqueTokenCookieName ?? STYTCH_SESSION_COOKIE;\n  }\n\n  protected get jwtCookieName(): string {\n    return this._jwtCookieName ?? STYTCH_SESSION_JWT_COOKIE;\n  }\n\n  protected get istCookieName(): string {\n    return this._istCookieName ?? STYTCH_INTERMEDIATE_SESSION_TOKEN_COOKIE;\n  }\n\n  readSessionCookie() {\n    return {\n      session_token: Cookies.get(this.opaqueTokenCookieName),\n      session_jwt: Cookies.get(this.jwtCookieName),\n    };\n  }\n\n  readIntermediateSessionTokenCookie() {\n    return Cookies.get(this.istCookieName);\n  }\n\n  writeSessionCookie(stateDiff: StateWithReadableTokensLoggedIn<T>) {\n    const { state, session_token, session_jwt } = stateDiff;\n\n    const cookieOpts = SubscriptionDataLayer.generateCookieOpts({\n      expiresAt: state?.session?.expires_at ?? '',\n      availableToSubdomains: this._cookieAvailableToSubdomains,\n      path: this._cookiePath,\n      domain: this._domain,\n    });\n\n    if (cookieOpts.domain) {\n      this.addSeenDomain(cookieOpts.domain);\n    }\n\n    Cookies.set(this.opaqueTokenCookieName, session_token, cookieOpts);\n    Cookies.set(this.jwtCookieName, session_jwt, cookieOpts);\n\n    /**\n     * If a developer flips the boolean value of availableToSubdomains at any point,\n     * there will be two cookies set which will could cause the user to log out since\n     * the js-cookie API always returns the first cookie set. Thus, we will clear the\n     * cookie that doesn't relate to the current cookie options.\n     */\n\n    const alternateCookieOptions = SubscriptionDataLayer.generateCookieOpts({\n      expiresAt: state?.session?.expires_at ?? '',\n      availableToSubdomains: !this._cookieAvailableToSubdomains,\n      path: this._cookiePath,\n      domain: this._domain,\n    });\n\n    if (alternateCookieOptions.domain) {\n      this.addSeenDomain(alternateCookieOptions.domain);\n    }\n\n    if (hasMultipleCookies(this.jwtCookieName)) {\n      Cookies.remove(this.jwtCookieName, alternateCookieOptions);\n    }\n\n    if (hasMultipleCookies(this.opaqueTokenCookieName)) {\n      Cookies.remove(this.opaqueTokenCookieName, alternateCookieOptions);\n    }\n\n    if (hasMultipleCookies(this.jwtCookieName)) {\n      logger.warn(\n        'Could not remove extraneous JWT cookie. This might happen if the cookie has been set using multiple `path` settings, and may produce unwanted behavior.',\n      );\n    }\n\n    if (hasMultipleCookies(this.opaqueTokenCookieName)) {\n      logger.warn('Could not remove extraneous opaque token cookie.');\n    }\n  }\n\n  writeIntermediateSessionTokenCookie(IST: string) {\n    // ISTs are valid for 10 minutes\n    const expiresAtTime = new Date(Date.now() + 10 * 60000);\n    const cookieOpts = SubscriptionDataLayer.generateCookieOpts({\n      expiresAt: expiresAtTime.toString(),\n      availableToSubdomains: this._cookieAvailableToSubdomains,\n      path: this._cookiePath,\n      domain: this._domain,\n    });\n\n    Cookies.set(this.istCookieName, IST, cookieOpts);\n  }\n\n  removeSessionCookie() {\n    this.removeCookies([this.opaqueTokenCookieName, this.jwtCookieName]);\n  }\n\n  removeISTCookie() {\n    this.removeCookies([this.istCookieName]);\n  }\n\n  removeCookies(cookiesToRemove: string[]) {\n    /**\n     * Spray and Pray approach:\n     * In order to delete a cookie, both the path and domain must match exactly\n     * We don't always know how the cookie was set - we can use the path & info that the SDK was created with\n     * but if the SDK settings have changed (e.g. a dev is developing) then things might get strange.\n     * Note: it is _impossible_ to reliably delete a cookie if you don't know what path it was set at - thank,; internet\n     * Our best effort approach is to just list off the likely combinations\n     *\n     * As of 2025-07-14, we track all domains that have been used to set cookies and try to delete\n     * cookies from all of them to handle cases where domains change (e.g. something.com -> web.something.com)\n     */\n\n    // Get all previously seen domains\n    const trackedDomains = this.getSeenDomains();\n    // Include the current domain and null (no domain) in our attempts\n    const allDomains = [this._domain, null, ...trackedDomains];\n    // Remove duplicates\n    const uniqueDomains = [...new Set(allDomains)];\n\n    [true, false].forEach((availableToSubdomains) => {\n      [this._cookiePath, null].forEach((path) => {\n        uniqueDomains.forEach((domain) => {\n          const cookieOpts = SubscriptionDataLayer.generateCookieOpts({\n            expiresAt: new Date(0).toString(),\n            availableToSubdomains,\n            path,\n            domain,\n          });\n          cookiesToRemove.forEach((cookieName) => {\n            Cookies.remove(cookieName, cookieOpts);\n          });\n        });\n      });\n    });\n  }\n\n  syncToLocalStorage(): void {\n    this._localStorage.setItem('', JSON.stringify(this.state));\n  }\n\n  getItem(key: StorageKey): string | null {\n    return this._localStorage.getItem(key);\n  }\n\n  setItem(key: StorageKey, value: string): void {\n    this._localStorage.setItem(key, value);\n  }\n\n  removeItem(key: StorageKey): void {\n    this._localStorage.removeItem(key);\n  }\n\n  /**\n   * Get all previously seen domains from local storage\n   */\n  private getSeenDomains(): string[] {\n    const storedDomains = this.getItem(SEEN_DOMAINS_KEY);\n\n    if (!storedDomains) {\n      return [];\n    }\n\n    try {\n      const parsed = JSON.parse(storedDomains);\n      return Array.isArray(parsed) ? parsed : [];\n    } catch {\n      return [];\n    }\n  }\n\n  /**\n   * Add a domain to the seen domains list\n   */\n  private addSeenDomain(domain: string | null): void {\n    if (!domain) {\n      return;\n    }\n\n    const storedDomains = this.getSeenDomains();\n    if (!storedDomains.includes(domain)) {\n      storedDomains.push(domain);\n      this.setItem(SEEN_DOMAINS_KEY, JSON.stringify(storedDomains));\n    }\n  }\n\n  static generateCookieOpts({\n    path,\n    domain,\n    availableToSubdomains,\n    expiresAt,\n  }: {\n    path: string | null;\n    domain: string | null;\n    availableToSubdomains: boolean;\n    expiresAt: string;\n  }): Cookies.CookieAttributes {\n    const cookieOpts: Cookies.CookieAttributes = {\n      expires: new Date(expiresAt),\n      sameSite: 'lax',\n    };\n\n    if (path) {\n      cookieOpts.path = path;\n    }\n\n    if (isLocalhost()) {\n      // We do not require HTTPS for localhost / local development\n      // TODO: Could investigate disabling HTTPS for test projects\n      cookieOpts.secure = false;\n    } else {\n      if (availableToSubdomains) {\n        // Domain must be expressly configured in order for the cookie to\n        // be sent to subdomains\n        // UNLESS it is localhost, in which case domain should not be set\n        // cf. https://stackoverflow.com/questions/1134290/cookies-on-localhost-with-explicit-domain\n        cookieOpts.domain = domain || window.location.host;\n      }\n      cookieOpts.secure = true;\n    }\n    return cookieOpts;\n  }\n}\n\nexport class ConsumerSubscriptionDataLayer extends SubscriptionDataLayer<ConsumerState> {}\nexport class B2BSubscriptionDataLayer extends SubscriptionDataLayer<B2BState> {}\n\n/**\n * We want multiple instances of the same Stytch SDK for the same project in the same page to\n * effectively share state - to do this, we create a single cache for the data layer.\n * In order to preserve the cache state across project hot module reloads, we bind it to\n * the global window object using a stytch-internal symbol.\n *\n * This also allows various StytchClients to communicate across package boundaries -\n * consider the following scenario:\n * - Next App splits out bundles per-page\n * - Next App uses Headless Client on all pages, and UI Client on one page\n *    - UI client page includes its own copy of Headless Client (since UI depends on Headless CLient)\n * - B/C of code splitting & recombining, if someone navigates from a Headless page to a UI page\n *   the there will actually be two copies of the HeadlessClient loaded,\n *   one in the main bundle, and one included inside the UI Client code\n * - So using an in-memory global object will not suffice, we'll end up with two global objects in two diff packages\n */\ntype ConsumerDataLayerCache = Record<string, SubscriptionDataLayer<ConsumerState>>;\ntype B2BDataLayerCache = Record<string, SubscriptionDataLayer<B2BState>>;\n\nconst consumerDataLayerCacheSymbol = Symbol.for('__stytch_DataLayer');\nconst b2bDataLayerCacheSymbol = Symbol.for('__stytch_b2b_DataLayer');\n\nconst getConsumerDataLayerCache = (): ConsumerDataLayerCache => {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const wdw = window as any;\n  if (!wdw[consumerDataLayerCacheSymbol]) {\n    wdw[consumerDataLayerCacheSymbol] = {};\n  }\n  return wdw[consumerDataLayerCacheSymbol];\n};\n\nconst getB2BDataLayerCache = (): B2BDataLayerCache => {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const wdw = window as any;\n  if (!wdw[b2bDataLayerCacheSymbol]) {\n    wdw[b2bDataLayerCacheSymbol] = {};\n  }\n  return wdw[b2bDataLayerCacheSymbol];\n};\n\nexport const __clearConsumerDataLayerCache = () => {\n  const dataLayerCache = getConsumerDataLayerCache();\n  Object.keys(dataLayerCache).forEach((key) => delete dataLayerCache[key]);\n};\n\nexport const __clearB2BDataLayerCache = () => {\n  const dataLayerCache = getB2BDataLayerCache();\n  Object.keys(dataLayerCache).forEach((key) => delete dataLayerCache[key]);\n};\n\nexport const getConsumerDataLayer = (\n  publicToken: string,\n  options?: StytchClientOptions,\n): ConsumerSubscriptionDataLayer => {\n  const dataLayerCache = getConsumerDataLayerCache();\n  if (!dataLayerCache[publicToken]) {\n    dataLayerCache[publicToken] = new ConsumerSubscriptionDataLayer(publicToken, options);\n  }\n  return dataLayerCache[publicToken];\n};\n\nexport const getB2BDataLayer = (publicToken: string, options?: StytchClientOptions): B2BSubscriptionDataLayer => {\n  const dataLayerCache = getB2BDataLayerCache();\n  if (!dataLayerCache[publicToken]) {\n    dataLayerCache[publicToken] = new B2BSubscriptionDataLayer(publicToken, options);\n  }\n  return dataLayerCache[publicToken];\n};\n\nconst addSubscriber = <T>(collection: Subscribers<T>, subscriber: SubscriberFunction<T>): UnsubscribeFunction => {\n  const uniqueId = Math.random().toString(36).slice(-10);\n  collection[uniqueId] = subscriber;\n  return () => delete collection[uniqueId];\n};\n\nconst notifySubscribers = <T>(collection: Subscribers<T>, value: T | null): void => {\n  Object.values(collection).forEach((cb) => cb(value));\n};\n\ntype StateWithReadableTokensLoggedIn<T> = {\n  state: T | null;\n  intermediate_session_token: null;\n  session_token: string;\n  session_jwt: string;\n};\n\ntype StateIfOpaqueTokensLoggedIn<T> = {\n  state: T | null;\n  intermediate_session_token: null;\n  session_token: true;\n  session_jwt: true;\n};\n\ntype StateWithTokensLoggedIn<T> = StateWithReadableTokensLoggedIn<T> | StateIfOpaqueTokensLoggedIn<T>;\n\ntype StateWithTokensLoggedOut = {\n  state: null;\n  session_token: null;\n  session_jwt: null;\n  intermediate_session_token: null;\n};\n\ntype StateWithReadableIntermediateSessionToken = {\n  state: null;\n  session_token: null;\n  session_jwt: null;\n  intermediate_session_token: string;\n};\n\ntype StateWithOpaqueIntermediateSessionToken = {\n  state: null;\n  session_token: null;\n  session_jwt: null;\n  intermediate_session_token: true;\n};\n\ntype StateWithIntermediateSessionToken =\n  | StateWithReadableIntermediateSessionToken\n  | StateWithOpaqueIntermediateSessionToken;\n\ntype StateWithTokensDiff<T> = StateWithTokensLoggedIn<T> | StateWithTokensLoggedOut | StateWithIntermediateSessionToken;\n\nconst deepEqualData = createDeepEqual({\n  KEYS_TO_EXCLUDE: ['last_accessed_at'],\n});\n\nexport class BaseSubscriptionService<T extends ConsumerState | B2BState, TOpaqueTokens extends AllowedOpaqueTokens>\n  implements ISubscriptionService<T, TOpaqueTokens>\n{\n  /**\n   * Whether the state was retrieved from the cache and is awaiting a refresh\n   */\n  private fromCache = true;\n\n  constructor(\n    private _publicToken: string,\n    private _datalayer: SubscriptionDataLayer<T>,\n    { usingCustomApiEndpoint }: { usingCustomApiEndpoint: boolean },\n  ) {\n    window.addEventListener('storage', this._listen);\n\n    // If a custom API endpoint is being used, the session may be being managed\n    // by HttpOnly cookies, which we can't detect.\n    if (!usingCustomApiEndpoint) {\n      // If the session does not exist in localstorage (like if we are in an iframe)\n      // then the cookie might still be set and we can retrieve the session via an API call\n      const { session_token } = this._datalayer.readSessionCookie();\n      if (!session_token) {\n        this.destroySession();\n        return;\n      }\n    }\n  }\n\n  // Listening for state changes across tabs\n  private _listen = (e: StorageEvent) => {\n    if (e.key !== getPersistentStorageKey(this._publicToken, '')) {\n      return;\n    }\n\n    const parsedValue = e.newValue === null || e.newValue === 'null' ? null : (JSON.parse(e.newValue) as T);\n    this.updateState(parsedValue, true);\n  };\n\n  getTokens(): IfOpaqueTokens<TOpaqueTokens, never, SessionTokens | null> {\n    const { session_token, session_jwt } = this._datalayer.readSessionCookie();\n    if (!(typeof session_token === 'string') || !(typeof session_jwt === 'string')) {\n      return null as IfOpaqueTokens<TOpaqueTokens, never, SessionTokens | null>;\n    }\n    return { session_token, session_jwt } as IfOpaqueTokens<TOpaqueTokens, never, SessionTokens | null>;\n  }\n\n  getIntermediateSessionToken(): string | null {\n    return this._datalayer.readIntermediateSessionTokenCookie() || null;\n  }\n\n  destroyState() {\n    this.updateStateAndTokens({\n      state: null,\n      session_token: null,\n      session_jwt: null,\n      intermediate_session_token: null,\n    });\n  }\n\n  destroySession() {\n    this._datalayer.removeSessionCookie();\n    this.updateState(null);\n  }\n\n  _updateStateAndTokensInternal(stateDiff: StateWithTokensDiff<T>, options: InternalSessionUpdateOptions) {\n    const oldStateValue = this._datalayer.state;\n    const newStateValue = stateDiff.state === null ? null : ({ ...this._datalayer.state, ...stateDiff.state } as T);\n    this._datalayer.state = newStateValue;\n    const wasCached = this.getFromCache();\n    this.setCacheRefreshed();\n\n    // NOTE: This means that our tab executes first before we signal the state change to other tabs\n    // TODO: Should we avoid notifying subscribers in the same thread? Should we put\n    // notifications in a setImmediate or setTimeout(..., 0)?\n    // Should subscribers let us know if they are active/passive when they sign up?\n    if (wasCached || !deepEqualData(oldStateValue, newStateValue)) {\n      let notification: (T & SessionUpdateOptions) | null;\n      if (newStateValue == null || options.fromCache) {\n        notification = newStateValue;\n      } else {\n        notification = {\n          ...newStateValue,\n          sessionDurationMinutes: options.sessionDurationMinutes,\n        };\n      }\n\n      notifySubscribers(this._datalayer.subscriptions, notification);\n    }\n  }\n\n  updateStateAndTokens(\n    stateDiff: StateWithTokensDiff<T>,\n    options: InternalSessionUpdateOptions = { fromCache: false },\n  ) {\n    if (stateDiff.state) {\n      if (typeof stateDiff.session_token === 'string') {\n        this._datalayer.writeSessionCookie(stateDiff);\n      } else {\n        // The session token is opaque, so let's clear any residual session\n        // cookies that may have been left over\n        this._datalayer.removeSessionCookie();\n      }\n      this._datalayer.removeISTCookie();\n    } else if (stateDiff.intermediate_session_token) {\n      if (typeof stateDiff.intermediate_session_token === 'string') {\n        this._datalayer.writeIntermediateSessionTokenCookie(stateDiff.intermediate_session_token);\n      } else {\n        // The intermediate session token is opaque, so let's clear any residual\n        // intermediate session token cookies that may have been left over\n        this._datalayer.removeISTCookie();\n      }\n      this._datalayer.removeSessionCookie();\n    } else {\n      this._datalayer.removeSessionCookie();\n      this._datalayer.removeISTCookie();\n    }\n\n    this._updateStateAndTokensInternal(stateDiff, options);\n\n    this._datalayer.syncToLocalStorage();\n  }\n\n  updateState(state: T | null, fromExternalSource = false) {\n    const oldStateValue = this._datalayer.state;\n    const newStateValue = state === null ? null : ({ ...this._datalayer.state, ...state } as T);\n    this._datalayer.state = newStateValue;\n    const wasCached = this.getFromCache();\n    this.setCacheRefreshed();\n\n    const hasStateChanged = !deepEqualData(oldStateValue, newStateValue);\n    if (wasCached || hasStateChanged) {\n      notifySubscribers(this._datalayer.subscriptions, newStateValue);\n\n      // If there is no state change, or if this update was itself triggered by\n      // a storage event, there is no need to sync to local storage since the\n      // state is already in sync.\n      if (hasStateChanged && !fromExternalSource) {\n        // Delay notifying other tabs until after we have refreshed ourselves\n        this._datalayer.syncToLocalStorage();\n      }\n    }\n  }\n\n  updateTokens(tokens: SessionTokensUpdate) {\n    const { session_token, session_jwt } = tokens;\n    const cookie = this._datalayer.readSessionCookie();\n    const diff = {\n      ...cookie,\n      session_token,\n      session_jwt,\n    } as StateWithTokensDiff<T>;\n    if (typeof session_token === 'string' || typeof session_jwt === 'string') {\n      this._datalayer.writeSessionCookie(diff as StateWithReadableTokensLoggedIn<T>);\n      this._datalayer.removeISTCookie();\n    } else {\n      this._datalayer.removeSessionCookie();\n    }\n  }\n\n  subscribeToState(callback: SubscriberFunction<T & SessionUpdateOptions>): UnsubscribeFunction {\n    return addSubscriber(this._datalayer.subscriptions, callback);\n  }\n\n  getState(): T | null {\n    return this._datalayer.state;\n  }\n\n  destroy() {\n    window.removeEventListener('storage', this._listen);\n  }\n\n  syncFromDeviceStorage() {\n    return null;\n  }\n\n  getFromCache(): boolean {\n    return this.fromCache;\n  }\n\n  setCacheRefreshed() {\n    this.fromCache = false;\n  }\n}\n\nexport class ConsumerSubscriptionService<TProjectConfiguration extends StytchProjectConfigurationInput>\n  extends BaseSubscriptionService<ConsumerState, ExtractOpaqueTokens<TProjectConfiguration>>\n  implements IConsumerSubscriptionService<TProjectConfiguration>\n{\n  updateUser = (user: User) => this.updateState({ user });\n  getUser = () => this.getState()?.user ?? null;\n  getSession = () => this.getState()?.session ?? null;\n  updateSession: IConsumerSubscriptionService<TProjectConfiguration>['updateSession'] = (resp, options) => {\n    const { session, user, session_jwt, session_token } = resp;\n\n    if (session_token && session_jwt) {\n      this.updateStateAndTokens(\n        {\n          state: { session, user },\n          session_jwt,\n          session_token,\n          intermediate_session_token: null,\n        },\n        {\n          fromCache: false,\n          sessionDurationMinutes: options?.sessionDurationMinutes,\n        },\n      );\n    } else {\n      this.updateStateAndTokens(\n        {\n          state: { session, user },\n          session_token: true,\n          session_jwt: true,\n          intermediate_session_token: null,\n        },\n        {\n          fromCache: false,\n          sessionDurationMinutes: options?.sessionDurationMinutes,\n        },\n      );\n    }\n  };\n\n  withUpdateSession =\n    <\n      Args extends [] | [options?: CommonAuthenticateOptions] | (string | CommonAuthenticateOptions)[],\n      Ret extends AuthenticateResponse<TProjectConfiguration & OpaqueTokensNeverConfig> | null,\n    >(\n      authenticate: (...args: Args) => Promise<Ret>,\n    ): ((...args: Args) => Promise<Ret>) =>\n    async (...args) => {\n      const resp = await authenticate(...args);\n      if (resp != null) {\n        const options = args.find((a): a is CommonAuthenticateOptions => a != null && !(typeof a === 'string'));\n        this.updateSession(resp, {\n          sessionDurationMinutes: options?.session_duration_minutes,\n        });\n      }\n      return resp;\n    };\n}\n\nexport class B2BSubscriptionService<TProjectConfiguration extends StytchProjectConfigurationInput>\n  extends BaseSubscriptionService<B2BState, ExtractOpaqueTokens<TProjectConfiguration>>\n  implements IB2BSubscriptionService<TProjectConfiguration>\n{\n  updateMember = (member: Member) => this.updateState({ member });\n  getMember = () => this.getState()?.member ?? null;\n  updateOrganization = (organization: Organization) => this.updateState({ organization });\n  getOrganization = () => this.getState()?.organization ?? null;\n  getSession = () => this.getState()?.session ?? null;\n  updateSession: IB2BSubscriptionService<TProjectConfiguration>['updateSession'] = (resp, options) => {\n    if ('member_session' in resp && resp.member_session) {\n      const tokens =\n        resp.session_token && resp.session_jwt\n          ? { session_token: resp.session_token, session_jwt: resp.session_jwt }\n          : ({ session_token: true, session_jwt: true } as const);\n\n      this.updateStateAndTokens(\n        {\n          state: {\n            session: resp.member_session,\n            member: resp.member,\n            organization: resp.organization,\n          },\n          ...tokens,\n          intermediate_session_token: null,\n        },\n        {\n          fromCache: false,\n          sessionDurationMinutes: options?.sessionDurationMinutes,\n        },\n      );\n    } else {\n      this.updateStateAndTokens(\n        {\n          state: null,\n          session_token: null,\n          session_jwt: null,\n          intermediate_session_token: resp.intermediate_session_token || true,\n        },\n        {\n          fromCache: false,\n          sessionDurationMinutes: options?.sessionDurationMinutes,\n        },\n      );\n    }\n  };\n\n  withUpdateSession =\n    <\n      Options extends CommonAuthenticateOptions | undefined,\n      Ret extends\n        | B2BAuthenticateResponse<TProjectConfiguration & OpaqueTokensNeverConfig>\n        | B2BAuthenticateResponseWithMFA<TProjectConfiguration & OpaqueTokensNeverConfig>\n        | B2BDiscoveryAuthenticateResponse<TProjectConfiguration & OpaqueTokensNeverConfig>,\n    >(\n      authenticate: (options: Options) => Promise<Ret>,\n    ): ((options: Options) => Promise<Ret>) =>\n    async (options) => {\n      const resp = await authenticate(options);\n      this.updateSession(resp, {\n        sessionDurationMinutes: options?.session_duration_minutes,\n      });\n      return resp;\n    };\n}\n"],"names":["STYTCH_SESSION_COOKIE","STYTCH_SESSION_JWT_COOKIE","STYTCH_INTERMEDIATE_SESSION_TOKEN_COOKIE","SEEN_DOMAINS_KEY","SubscriptionDataLayer","publicToken","state","_opaqueTokenCookieName","_jwtCookieName","_cookiePath","_domain","_cookieAvailableToSubdomains","_istCookieName","subscriptions","_localStorage","browserSessionStorage","options","getKeyBoundStorage","safeLocalStorage","safeSessionStorage","cookieOptions","opaqueTokenCookieName","jwtCookieName","path","domain","availableToSubdomains","istCookieName","localStorageState","getItem","parsedState","JSON","parse","syncToLocalStorage","readSessionCookie","session_token","Cookies","get","session_jwt","readIntermediateSessionTokenCookie","writeSessionCookie","stateDiff","cookieOpts","generateCookieOpts","expiresAt","session","expires_at","addSeenDomain","set","alternateCookieOptions","hasMultipleCookies","remove","logger","warn","writeIntermediateSessionTokenCookie","IST","expiresAtTime","Date","now","toString","removeSessionCookie","removeCookies","removeISTCookie","cookiesToRemove","trackedDomains","getSeenDomains","allDomains","uniqueDomains","Set","forEach","cookieName","setItem","stringify","key","value","removeItem","storedDomains","parsed","Array","isArray","includes","push","expires","sameSite","isLocalhost","secure","window","location","host","ConsumerSubscriptionDataLayer","B2BSubscriptionDataLayer","consumerDataLayerCacheSymbol","Symbol","for","b2bDataLayerCacheSymbol","getConsumerDataLayerCache","wdw","getB2BDataLayerCache","getConsumerDataLayer","dataLayerCache","getB2BDataLayer","addSubscriber","collection","subscriber","uniqueId","Math","random","slice","notifySubscribers","Object","values","cb","deepEqualData","createDeepEqual","KEYS_TO_EXCLUDE","BaseSubscriptionService","fromCache","_publicToken","_datalayer","usingCustomApiEndpoint","addEventListener","_listen","destroySession","e","getPersistentStorageKey","parsedValue","newValue","updateState","getTokens","getIntermediateSessionToken","destroyState","updateStateAndTokens","intermediate_session_token","_updateStateAndTokensInternal","oldStateValue","newStateValue","wasCached","getFromCache","setCacheRefreshed","notification","sessionDurationMinutes","fromExternalSource","hasStateChanged","updateTokens","tokens","cookie","diff","subscribeToState","callback","getState","destroy","removeEventListener","syncFromDeviceStorage","ConsumerSubscriptionService","updateUser","user","getUser","getSession","updateSession","resp","withUpdateSession","authenticate","args","find","a","session_duration_minutes","B2BSubscriptionService","updateMember","member","getMember","updateOrganization","organization","getOrganization","member_session"],"mappings":"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"}