{"version":3,"file":"NetworkClient.mjs","sources":["../../../../../../web/src/NetworkClient.ts"],"sourcesContent":["import {\n  AdditionalTelemetryData,\n  baseFetchSDK,\n  baseSubmitFormSDK,\n  createAppSessionId,\n  createEventId,\n  createPersistentId,\n  DEFAULT_INTERVAL_DURATION_MS,\n  DEFAULT_MAX_BATCH_SIZE,\n  EventLogger,\n  INetworkClient,\n  isTestPublicToken,\n  retriableFetchSDK,\n  RetriableSDKRequestInfo,\n  SDKRequestInfo,\n  SDKTelemetry,\n} from '@stytch/core';\nimport { ResponseCommon } from '@stytch/core/public';\n\nimport { B2BSubscriptionDataLayer, ConsumerSubscriptionDataLayer } from './SubscriptionService';\n\nexport class NetworkClient implements INetworkClient {\n  private eventLogger: EventLogger;\n  private readonly baseURL: string;\n\n  constructor(\n    private _publicToken: string,\n    private _subscriptionDataLayer: ConsumerSubscriptionDataLayer | B2BSubscriptionDataLayer,\n    _liveAPIURL: string,\n    _testAPIURL: string,\n    private additionalTelemetryDataFn: () => AdditionalTelemetryData,\n  ) {\n    this.baseURL = _liveAPIURL;\n    if (isTestPublicToken(_publicToken)) {\n      this.baseURL = _testAPIURL;\n    }\n    this.eventLogger = new EventLogger({\n      maxBatchSize: DEFAULT_MAX_BATCH_SIZE,\n      intervalDurationMs: DEFAULT_INTERVAL_DURATION_MS,\n      logEventURL: this.buildSDKUrl('/events'),\n    });\n  }\n\n  // @deprecated Use the new sessions.updateSession() method instead\n  updateSessionToken = () => {\n    return null;\n  };\n\n  logEvent({\n    name,\n    details,\n    error = {},\n  }: {\n    name: string;\n    details: Record<string, unknown>;\n    error?: { error_code?: string; error_description?: string; http_status_code?: string };\n  }): void {\n    this.eventLogger.logEvent(this.createTelemetryBlob(), {\n      public_token: this._publicToken,\n      event_name: name,\n      details: details,\n\n      // Error fields\n      error_code: error.error_code,\n      error_description: error.error_description,\n      http_status_code: error.http_status_code,\n    });\n  }\n\n  createTelemetryBlob(): SDKTelemetry {\n    return {\n      event_id: createEventId(),\n      // TODO: These should be persisted somewhere, not generated per request\n      app_session_id: createAppSessionId(),\n      persistent_id: createPersistentId(),\n\n      client_sent_at: new Date().toISOString(),\n      timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n\n      // Logged in data\n      // This gets passed into the constructor from StytchClient or StytchB2BClient\n      // We pass in the user & session id when the Consumer SDK is being used and member & session id\n      // when the B2B SDK is being used.\n\n      // Why don't we generate this from the session_token in the auth header?\n      // - We don't want to tie analytics ingest to session validation. There's no need to put\n      //   that kind of pressure on API, and ingest could be moved to somewhere that doesn't\n      //   have the ability to validate tokens\n      // - For bulk event batches, we want to keep track of whether or not a user was logged\n      //   in at each event. If we have 10 events, the user logs in at event 5, then they'll have\n      //   a token when they log the batch, but we want to know that they were not logged in for the\n      //   first 4 events\n      ...this.additionalTelemetryDataFn(),\n\n      // Versioning\n      app: {\n        identifier: window.location.hostname,\n      },\n      sdk: {\n        // eslint-disable-next-line lingui/no-unlocalized-strings\n        identifier: 'Stytch.js Javascript SDK',\n        version: STYTCH_PACKAGE_NAME + '@' + STYTCH_PACKAGE_VERSION,\n      },\n    };\n  }\n\n  async fetchSDK<T extends ResponseCommon>({ url, body, method }: SDKRequestInfo): Promise<T> {\n    const sessionToken = this._subscriptionDataLayer.readSessionCookie().session_token;\n    const basicAuthHeader = 'Basic ' + window.btoa(this._publicToken + ':' + (sessionToken || this._publicToken));\n    const xSDKClientHeader = window.btoa(JSON.stringify(this.createTelemetryBlob()));\n    const xSDKParentHostHeader = window.location.origin;\n\n    return baseFetchSDK<T>({\n      basicAuthHeader,\n      body,\n      finalURL: this.buildSDKUrl(url),\n      method,\n      xSDKClientHeader,\n      xSDKParentHostHeader,\n    });\n  }\n\n  async submitFormSDK({ url, body, method }: SDKRequestInfo): Promise<void> {\n    const sessionToken = this._subscriptionDataLayer.readSessionCookie().session_token;\n    const basicAuthHeader = 'Basic ' + window.btoa(this._publicToken + ':' + (sessionToken || this._publicToken));\n    const xSDKClientHeader = window.btoa(JSON.stringify(this.createTelemetryBlob()));\n    const xSDKParentHostHeader = window.location.origin;\n\n    return baseSubmitFormSDK({\n      basicAuthHeader,\n      body,\n      finalURL: this.buildSDKUrl(url),\n      method,\n      xSDKClientHeader,\n      xSDKParentHostHeader,\n    });\n  }\n\n  async retriableFetchSDK<T extends ResponseCommon>({\n    url,\n    body,\n    method,\n    retryCallback,\n  }: RetriableSDKRequestInfo): Promise<T> {\n    const sessionToken = this._subscriptionDataLayer.readSessionCookie().session_token;\n    const basicAuthHeader = 'Basic ' + window.btoa(this._publicToken + ':' + (sessionToken || this._publicToken));\n    const xSDKClientHeader = window.btoa(JSON.stringify(this.createTelemetryBlob()));\n    const xSDKParentHostHeader = window.location.origin;\n\n    return retriableFetchSDK<T>({\n      basicAuthHeader,\n      body,\n      finalURL: this.buildSDKUrl(url),\n      method,\n      xSDKClientHeader,\n      xSDKParentHostHeader,\n      retryCallback,\n    });\n  }\n\n  buildSDKUrl(url: string): string {\n    // eslint-disable-next-line lingui/no-unlocalized-strings\n    return `${this.baseURL}/sdk/v1${url}`;\n  }\n}\n"],"names":["NetworkClient","eventLogger","baseURL","_subscriptionDataLayer","_liveAPIURL","_testAPIURL","_publicToken","additionalTelemetryDataFn","isTestPublicToken","EventLogger","maxBatchSize","DEFAULT_MAX_BATCH_SIZE","intervalDurationMs","DEFAULT_INTERVAL_DURATION_MS","logEventURL","buildSDKUrl","updateSessionToken","logEvent","name","details","error","createTelemetryBlob","public_token","event_name","error_code","error_description","http_status_code","event_id","createEventId","app_session_id","createAppSessionId","persistent_id","createPersistentId","client_sent_at","Date","toISOString","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","app","identifier","window","location","hostname","sdk","version","fetchSDK","url","body","method","sessionToken","readSessionCookie","session_token","basicAuthHeader","btoa","xSDKClientHeader","JSON","stringify","xSDKParentHostHeader","origin","baseFetchSDK","finalURL","submitFormSDK","baseSubmitFormSDK","retriableFetchSDK","retryCallback"],"mappings":"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"}