{"version":3,"file":"growthbook-tracking.mjs","names":["loadSDKVersion","EVENT_EXPERIMENT_VIEWED","EVENT_FEATURE_EVALUATED","SDK_VERSION","parseString","value","utf8ByteLength","str","TextEncoder","encode","length","parseAttributes","attributes","user_id","device_id","anonymous_id","id","page_id","session_id","utmCampaign","utmContent","utmMedium","utmSource","utmTerm","pageTitle","nested","_objectWithoutProperties","_excluded","topLevel","utm_campaign","undefined","utm_content","utm_medium","utm_source","utm_term","page_title","getEventPayload","_ref","eventName","properties","url","_objectSpread","event_name","properties_json","sdk_language","sdk_version","context_json","track","_ref2","clientKey","ingestorHost","events","useBeacon","endpoint","concat","body","JSON","stringify","navigator","sendBeacon","Blob","type","e","fetch","method","headers","Accept","credentials","keepalive","console","error","growthbookTrackingPlugin","queueFlushInterval","enable","debug","dedupeCacheSize","dedupeKeyAttributes","eventFilter","transport","arguments","gb","getClientKey","Error","eventCache","Set","isMultiUser","_q","timer","promise","flushDone","flush","unloading","clearTimeout","done","setEventLogger","userContext","data","dedupeKeyData","featureEvaluatedIdentityAttributes","Object","keys","key","k","has","delete","add","size","oldest","values","next","payload","log","parse","push","Promise","resolve","setTimeout","catch","document","visibilityState","onVisibilityChange","addEventListener","onDestroy","removeEventListener","window","onPageHide","prevEvents","Array","isArray","gbEvents","event","isDestroyed","logEvent"],"sources":["../../../src/plugins/growthbook-tracking.ts"],"sourcesContent":["import { loadSDKVersion } from \"../util\";\nimport type { Attributes, EventProperties } from \"../types/growthbook\";\nimport type { GrowthBook } from \"../GrowthBook\";\nimport type {\n  GrowthBookClient,\n  UserScopedGrowthBook,\n} from \"../GrowthBookClient\";\nimport { EVENT_EXPERIMENT_VIEWED, EVENT_FEATURE_EVALUATED } from \"../core\";\n\nconst SDK_VERSION = loadSDKVersion();\n\ntype GlobalTrackedEvent = {\n  eventName: string;\n  properties: Record<string, unknown>;\n};\ndeclare global {\n  interface Window {\n    gbEvents?:\n      | (GlobalTrackedEvent | string)[]\n      | {\n          push: (event: GlobalTrackedEvent | string) => void;\n        };\n  }\n}\n\ntype EventPayload = {\n  event_name: string;\n  properties_json: Record<string, unknown>;\n  sdk_language: string;\n  sdk_version: string;\n  url: string;\n  context_json: Record<string, unknown>;\n  user_id: string | null;\n  device_id: string | null;\n  page_id: string | null;\n  session_id: string | null;\n  page_title?: string;\n  utm_source?: string;\n  utm_medium?: string;\n  utm_campaign?: string;\n  utm_term?: string;\n  utm_content?: string;\n};\n\nfunction parseString(value: unknown): null | string {\n  return typeof value === \"string\" ? value : null;\n}\n\nfunction utf8ByteLength(str: string): number {\n  return typeof TextEncoder !== \"undefined\"\n    ? new TextEncoder().encode(str).length\n    : str.length * 3; // conservative upper bound without TextEncoder\n}\n\nfunction parseAttributes(attributes: Attributes): {\n  nested: Attributes;\n  topLevel: {\n    user_id: string | null;\n    device_id: string | null;\n    page_id: string | null;\n    session_id: string | null;\n    page_title?: string;\n    utm_source?: string;\n    utm_medium?: string;\n    utm_campaign?: string;\n    utm_term?: string;\n    utm_content?: string;\n  };\n} {\n  const {\n    user_id,\n    device_id,\n    anonymous_id,\n    id,\n    page_id,\n    session_id,\n    utmCampaign,\n    utmContent,\n    utmMedium,\n    utmSource,\n    utmTerm,\n    pageTitle,\n    ...nested\n  } = attributes;\n\n  return {\n    nested,\n    topLevel: {\n      user_id: parseString(user_id),\n      device_id: parseString(device_id || anonymous_id || id),\n      page_id: parseString(page_id),\n      session_id: parseString(session_id),\n      utm_campaign: parseString(utmCampaign) || undefined,\n      utm_content: parseString(utmContent) || undefined,\n      utm_medium: parseString(utmMedium) || undefined,\n      utm_source: parseString(utmSource) || undefined,\n      utm_term: parseString(utmTerm) || undefined,\n      page_title: parseString(pageTitle) || undefined,\n    },\n  };\n}\n\ntype EventData = {\n  eventName: string;\n  properties: EventProperties;\n  attributes: Attributes;\n  url: string;\n};\n\nfunction getEventPayload({\n  eventName,\n  properties,\n  attributes,\n  url,\n}: EventData): EventPayload {\n  const { nested, topLevel } = parseAttributes(attributes || {});\n\n  return {\n    event_name: eventName,\n    properties_json: properties || {},\n    ...topLevel,\n    sdk_language: \"js\",\n    sdk_version: SDK_VERSION,\n    url: url,\n    context_json: nested,\n  };\n}\n\nexport type TrackingTransport = \"auto\" | \"beacon\" | \"fetch\";\n\nasync function track({\n  clientKey,\n  ingestorHost,\n  events,\n  useBeacon,\n}: {\n  events: EventPayload[];\n  clientKey: string;\n  ingestorHost?: string;\n  useBeacon?: boolean;\n}) {\n  if (!events.length) return;\n\n  const endpoint = `${\n    ingestorHost || \"https://us1.gb-ingest.com\"\n  }/track?client_key=${clientKey}`;\n  const body = JSON.stringify(events);\n\n  // sendBeacon is queued by the browser and survives page unload even where\n  // fetch keepalive is unsupported. text/plain keeps it a CORS simple request.\n  // Unlike the fetch below, sendBeacon cannot omit credentials; use\n  // transport \"fetch\" if cookies must never reach the ingestor origin.\n  if (useBeacon && typeof navigator !== \"undefined\" && navigator.sendBeacon) {\n    try {\n      if (\n        navigator.sendBeacon(endpoint, new Blob([body], { type: \"text/plain\" }))\n      ) {\n        return;\n      }\n      // Beacon rejected (e.g. payload over the beacon quota) - fall through\n    } catch (e) {\n      // Fall through to fetch\n    }\n  }\n\n  try {\n    await fetch(endpoint, {\n      method: \"POST\",\n      body,\n      headers: {\n        Accept: \"application/json\",\n        \"Content-Type\": \"text/plain\",\n      },\n      credentials: \"omit\",\n      // Let the request outlive the page; exposures fired just before a\n      // navigation (e.g. redirect tests) are otherwise cancelled by the\n      // browser. Keepalive bodies share a 64KB in-flight *byte* quota and\n      // larger ones are rejected outright, so oversized batches skip it.\n      keepalive: utf8ByteLength(body) < 60000,\n    });\n  } catch (e) {\n    console.error(\"Failed to track event\", e);\n  }\n}\n\nexport function growthbookTrackingPlugin({\n  queueFlushInterval = 100,\n  ingestorHost,\n  enable = true,\n  debug,\n  dedupeCacheSize = 1000,\n  dedupeKeyAttributes = [],\n  eventFilter,\n  transport = \"auto\",\n}: {\n  // TODO: add option to allow filtering out certain attributes that contain PII\n  queueFlushInterval?: number;\n  ingestorHost?: string;\n  enable?: boolean;\n  debug?: boolean;\n  dedupeCacheSize?: number;\n  dedupeKeyAttributes?: string[];\n  eventFilter?: (event: EventData) => boolean;\n  // \"auto\" (default): fetch with keepalive, plus sendBeacon when the page is\n  // unloading. \"beacon\": always prefer sendBeacon. \"fetch\": never use beacon.\n  transport?: TrackingTransport;\n} = {}) {\n  return (gb: GrowthBook | UserScopedGrowthBook | GrowthBookClient) => {\n    const clientKey = gb.getClientKey();\n    if (!clientKey) {\n      throw new Error(\"clientKey must be specified to use event logging\");\n    }\n\n    // LRU cache for events to avoid duplicates\n    const eventCache = new Set<string>();\n\n    const isMultiUser = \"createScopedInstance\" in gb;\n\n    if (\"setEventLogger\" in gb) {\n      let _q: EventPayload[] = [];\n      let timer: NodeJS.Timeout | null = null;\n      let promise: Promise<void> | null = null;\n      let flushDone: (() => void) | null = null;\n      const flush = async (unloading?: boolean) => {\n        const events = _q;\n        _q = [];\n        timer && clearTimeout(timer);\n        timer = null;\n        // Release the in-flight promise so later events schedule a new flush\n        // (an unload flush cancels the timer that would have released it,\n        // which would otherwise stall the queue for the rest of the page)\n        const done = flushDone;\n        flushDone = null;\n        promise = null;\n        try {\n          events.length &&\n            (await track({\n              clientKey,\n              events,\n              ingestorHost,\n              useBeacon:\n                transport === \"beacon\" || (transport === \"auto\" && !!unloading),\n            }));\n        } finally {\n          done && done();\n        }\n      };\n      gb.setEventLogger(async (eventName, properties, userContext) => {\n        const data: EventData = {\n          eventName,\n          properties,\n          attributes: userContext.attributes || {},\n          url: userContext.url || \"\",\n        };\n\n        // Skip logging if the event is being filtered\n        if (eventFilter && !eventFilter(data)) {\n          return;\n        }\n\n        // De-dupe Feature Evaluated and Experiment Viewed events\n        if (\n          eventName === EVENT_FEATURE_EVALUATED ||\n          eventName === EVENT_EXPERIMENT_VIEWED\n        ) {\n          // Build the key for de-duping\n          const dedupeKeyData: Record<string, unknown> = {\n            eventName,\n            properties,\n          };\n          // Feature Evaluated has no unit identity, unlike Experiment Viewed\n          const featureEvaluatedIdentityAttributes = dedupeKeyAttributes.length\n            ? dedupeKeyAttributes\n            : isMultiUser && eventName === EVENT_FEATURE_EVALUATED\n              ? Object.keys(data.attributes)\n              : [];\n\n          for (const key of featureEvaluatedIdentityAttributes) {\n            dedupeKeyData[\"attr:\" + key] = data.attributes[key];\n          }\n\n          const k = JSON.stringify(dedupeKeyData);\n          // Duplicate event fired recently, move to end of LRU cache and skip\n          if (eventCache.has(k)) {\n            eventCache.delete(k);\n            eventCache.add(k);\n            return;\n          }\n          eventCache.add(k);\n\n          // If the cache is too big, remove the oldest item\n          if (eventCache.size > dedupeCacheSize) {\n            const oldest = eventCache.values().next().value;\n            oldest && eventCache.delete(oldest);\n          }\n        }\n\n        const payload = getEventPayload(data);\n\n        debug &&\n          console.log(\n            \"Logging event to GrowthBook\",\n            JSON.parse(JSON.stringify(payload)),\n          );\n        if (!enable) return;\n\n        _q.push(payload);\n\n        // Only one in-progress promise at a time\n        if (!promise) {\n          promise = new Promise((resolve) => {\n            flushDone = resolve;\n            // Flush the queue after a delay\n            timer = setTimeout(() => {\n              flush().catch(console.error);\n            }, queueFlushInterval);\n          });\n        }\n        await promise;\n      });\n\n      // Flush the queue on page unload. Listeners are removed on destroy so\n      // SPA re-inits don't accumulate handlers over dead instances.\n      if (typeof document !== \"undefined\" && document.visibilityState) {\n        const onVisibilityChange = () => {\n          if (document.visibilityState === \"hidden\") {\n            flush(true).catch(console.error);\n          }\n        };\n        document.addEventListener(\"visibilitychange\", onVisibilityChange);\n        \"onDestroy\" in gb &&\n          gb.onDestroy(() =>\n            document.removeEventListener(\n              \"visibilitychange\",\n              onVisibilityChange,\n            ),\n          );\n      }\n      // pagehide fires on navigations where visibilitychange may not\n      if (typeof window !== \"undefined\") {\n        const onPageHide = () => {\n          flush(true).catch(console.error);\n        };\n        window.addEventListener(\"pagehide\", onPageHide);\n        \"onDestroy\" in gb &&\n          gb.onDestroy(() =>\n            window.removeEventListener(\"pagehide\", onPageHide),\n          );\n      }\n\n      // Flush the queue when the growthbook instance is destroyed\n      \"onDestroy\" in gb &&\n        gb.onDestroy(() => {\n          flush().catch(console.error);\n        });\n    }\n\n    // Listen on window.gbEvents.push if in a browser\n    // This makes it easier to integrate with Segment, GTM, etc.\n    if (typeof window !== \"undefined\" && !(\"createScopedInstance\" in gb)) {\n      const prevEvents = Array.isArray(window.gbEvents) ? window.gbEvents : [];\n      window.gbEvents = {\n        push: (event: GlobalTrackedEvent | string) => {\n          if (\"isDestroyed\" in gb && gb.isDestroyed()) {\n            // If trying to log and the instance has been destroyed, switch back to just an array\n            // This will let the next GrowthBook instance pick it up\n            window.gbEvents = [event];\n            return;\n          }\n\n          if (typeof event === \"string\") {\n            gb.logEvent(event);\n          } else if (event) {\n            gb.logEvent(event.eventName, event.properties);\n          }\n        },\n      };\n      for (const event of prevEvents) {\n        window.gbEvents.push(event);\n      }\n    }\n  };\n}\n"],"mappings":"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","ignoreList":[]}