getu-attribution-v2-sdk 0.5.0 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/AttributionSDK.d.ts.map +1 -1
- package/dist/core/AttributionSDK.js +12 -3
- package/dist/getuai-attribution.min.js +1 -1
- package/dist/index.esm.js +141 -3
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +146 -3
- package/dist/queue/index.d.ts.map +1 -1
- package/dist/queue/index.js +30 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +104 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/types/index.ts","../src/utils/index.ts","../src/storage/index.ts","../src/version.ts","../src/queue/index.ts","../src/utils/rootDomain.ts","../src/core/AttributionSDK.ts","../src/index.ts"],"sourcesContent":["// Event types matching server-side enum exactly\nexport enum EventType {\n // Pre-conversion signals\n PAGE_VIEW = \"page_view\",\n PAGE_CLICK = \"page_click\", // User click journey tracking\n BUTTON_CLICK = \"button_click\", // Button click tracking\n VIDEO_PLAY = \"video_play\",\n\n // Registration funnel\n FORM_SUBMIT = \"form_submit\",\n EMAIL_VERIFICATION = \"email_verification\",\n\n // Login flow\n LOGIN = \"login\",\n\n // Signup flow\n SIGNUP = \"signup\",\n\n // Purchase funnel\n PRODUCT_VIEW = \"product_view\",\n ADD_TO_CART = \"add_to_cart\",\n PURCHASE = \"purchase\",\n\n // Post-conversion / back-office conversion\n AUDIT_APPROVED = \"audit_approved\",\n\n // Custom event (user-defined name passed via custom_event_name field)\n CUSTOM = \"custom\",\n}\n\n// Currency types\nexport enum Currency {\n USD = \"USD\",\n}\n\n// UTM data structure\nexport interface UTMData {\n utm_source?: string | null;\n utm_medium?: string | null;\n utm_campaign?: string | null;\n utm_term?: string | null;\n utm_content?: string | null;\n // Ad tracking identifiers captured from ad platform click URLs\n adgroup_id?: string | null;\n ad_id?: string | null;\n // Source tracking for confidence (see utils/extractAdParams)\n adgroup_id_source?: string | null;\n ad_id_source?: string | null;\n // Platform-native click identifier (gclid/gbraid/wbraid/fbclid/ttclid/...)\n click_id?: string | null;\n click_id_source?: string | null;\n timestamp: number;\n}\n\n// Attribution data structure\nexport interface AttributionData {\n firstTouch: UTMData;\n lastTouch: UTMData;\n touchpoints: UTMData[];\n expiresAt: number;\n}\n\n// Event data structure\nexport interface EventData {\n event_id: string;\n event_type: EventType;\n anonymous_id?: string; // Persistent visitor identifier (SDK v0.5.0+)\n tracking_user_id?: string;\n utm_source?: string | null;\n utm_medium?: string | null;\n utm_campaign?: string | null;\n utm_term?: string | null;\n utm_content?: string | null;\n revenue?: number | null;\n currency?: Currency | null;\n event_data?: Record<string, any> | null;\n // Required when event_type = CUSTOM; ignored for all other event types\n custom_event_name?: string;\n // Ad tracking dimensions\n device?: string | null; // SDK auto-detected: 'desktop' | 'mobile' | 'tablet'\n adgroup_id?: string | null; // From ad platform click URL\n ad_id?: string | null; // From ad platform click URL\n adgroup_id_source?: string | null; // 'explicit' | 'valuetrack' | 'utm_term_numeric'\n ad_id_source?: string | null; // 'explicit' | 'valuetrack' | 'utm_content_numeric'\n click_id?: string | null; // gclid / gbraid / wbraid / fbclid / ttclid / ...\n click_id_source?: string | null; // Which URL param supplied click_id\n // Arbitrary context information; page info should be nested under context.page\n context?: {\n page?: {\n domain?: string | null;\n path?: string | null;\n title?: string | null;\n referrer?: string | null;\n url?: string | null; // for completeness but no querystring\n querystring?: string | null; // URL query string\n query_params?: Record<string, string> | null; // Parsed query parameters as object\n };\n [key: string]: any;\n } | null;\n timestamp?: number;\n}\n\n// Batch event request\nexport interface BatchEventRequest {\n events: EventData[];\n sdk_version: string;\n}\nexport const defaultEndpoint = \"https://attribution.getu.ai/attribution/api\";\n// SDK configuration\nexport interface SDKConfig {\n apiKey: string;\n apiEndpoint?: string;\n batchSize?: number;\n batchInterval?: number; // Default: 2000 (ms)\n maxRetries?: number;\n retryDelay?: number;\n enableDebug?: boolean;\n autoTrack?: boolean;\n // Control whether to automatically track page views on initialization\n autoTrackPageView?: boolean;\n sessionTimeout?: number;\n // Cross-domain UTM tracking configuration\n enableCrossDomainUTM?: boolean;\n crossDomainUTMParams?: string[]; // Which UTM params to pass\n excludeDomains?: string[]; // Domains to exclude from UTM passing\n // Control whether to automatically remove UTM params from the URL after capture\n autoCleanUTM?: boolean;\n // Page view debounce interval in milliseconds (default: 5000ms)\n // Same page can only be tracked once within this interval\n pageViewDebounceInterval?: number;\n // User ID configuration\n userId?: string; // Initial user ID to set on initialization (will be stored in both cookie and sessionStorage)\n // Cross-subdomain session & identity sharing.\n // When set (e.g. \".example.com\"), session_id / user_id / attribution cookies\n // are written with this domain so they're readable on sibling subdomains.\n // When omitted, the SDK auto-detects the broadest writable domain via a\n // cookie-probe heuristic. Pass empty string to force single-origin mode.\n domain?: string;\n}\n\n// Storage interface\nexport interface StorageInterface {\n get(key: string): any;\n set(key: string, value: any): void;\n remove(key: string): void;\n clear(): void;\n}\n\n// Queue interface\nexport interface QueueInterface {\n add(event: EventData): void;\n process(): Promise<void>;\n clear(): void;\n size(): number;\n}\n\n// Logger interface\nexport interface LoggerInterface {\n debug(message: string, ...args: any[]): void;\n info(message: string, ...args: any[]): void;\n warn(message: string, ...args: any[]): void;\n error(message: string, ...args: any[]): void;\n}\n\n// User session data\nexport interface UserSession {\n sessionId: string;\n startTime: number;\n lastActivity: number;\n pageViews: number;\n // The user_id this session was bound to. Used to force session rotation\n // when a *different* non-empty id is set via setUserId() — prevents two\n // distinct users' events sharing the same session_id.\n //\n // Undefined/empty = anonymous session. A subsequent setUserId() on an\n // anonymous session does NOT rotate (this is the normal anonymous→known\n // flow that the backend's association service backfills).\n userId?: string;\n}\n\n// Special events that should be sent immediately\nexport const IMMEDIATE_EVENTS = [\n EventType.PURCHASE,\n EventType.LOGIN,\n EventType.SIGNUP,\n EventType.FORM_SUBMIT,\n EventType.EMAIL_VERIFICATION,\n EventType.AUDIT_APPROVED,\n];\n\n/**\n * User attributes (for identify method)\n */\nexport interface UserTraits {\n email?: string;\n name?: string;\n first_name?: string;\n last_name?: string;\n phone?: string;\n company_name?: string;\n title?: string;\n [key: string]: any; // Support custom attributes\n}\n\n/**\n * Form field mapping configuration\n */\nexport interface FieldMappingConfig {\n email?: string[];\n name?: string[];\n first_name?: string[];\n last_name?: string[];\n phone?: string[];\n company_name?: string[];\n title?: string[];\n}\n\n/**\n * Default field mappings for automatic lead field extraction\n */\nexport const DEFAULT_FIELD_MAPPINGS: FieldMappingConfig = {\n email: ['email', 'e-mail', 'mail', 'user_email', 'email_address'],\n name: ['name', 'full_name', 'fullname', 'username', 'display_name'],\n first_name: ['first_name', 'firstname', 'fname', 'given_name'],\n last_name: ['last_name', 'lastname', 'lname', 'surname', 'family_name'],\n phone: ['phone', 'telephone', 'mobile', 'phone_number', 'tel'],\n company_name: ['company', 'company_name', 'organization', 'org', 'business'],\n title: ['title', 'job_title', 'position', 'role', 'job'],\n};\n","import { LoggerInterface, UTMData } from \"../types\";\n\n// Generate unique ID\nexport function generateId(): string {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n// Generate timestamp in seconds\nexport function getTimestamp(): number {\n return Math.floor(Date.now() / 1000);\n}\n\n// Parse URL parameters — LAST value wins for duplicate keys (existing behavior)\nexport function parseUrlParams(url: string): Record<string, string> {\n const params: Record<string, string> = {};\n try {\n const urlObj = new URL(url);\n urlObj.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n } catch (error) {\n // Handle invalid URLs\n }\n return params;\n}\n\n// Parse URL parameters preserving ALL values for duplicate keys.\n// Use this when duplicate keys carry distinct signals — e.g. Google Ads\n// tracking templates like `utm_term={adgroupid}&utm_term={keyword}` on the\n// same URL need both values to recover adgroup_id.\nexport function parseUrlParamsMulti(url: string): Record<string, string[]> {\n const params: Record<string, string[]> = {};\n try {\n const urlObj = new URL(url);\n const seenKeys = new Set<string>();\n urlObj.searchParams.forEach((_value, key) => {\n seenKeys.add(key);\n });\n seenKeys.forEach((key) => {\n const all = urlObj.searchParams.getAll(key);\n params[key] = all.filter((v) => v != null && v !== \"\");\n });\n } catch (error) {\n // Handle invalid URLs\n }\n return params;\n}\n\n// Extract UTM parameters from URL\nexport function extractUTMParams(url: string): Record<string, string> {\n const params = parseUrlParams(url);\n const utmParams: Record<string, string> = {};\n\n const utmKeys = [\n \"utm_source\",\n \"utm_medium\",\n \"utm_campaign\",\n \"utm_term\",\n \"utm_content\",\n ];\n\n utmKeys.forEach((key) => {\n if (params[key] && params[key].trim() !== \"\") {\n utmParams[key] = params[key].trim();\n }\n });\n\n return utmParams;\n}\n\n// Source tags recorded alongside adgroup_id / ad_id so the server can tell\n// high-confidence explicit IDs apart from Tier-2 numeric inferences.\nexport type AdgroupIdSource = \"explicit\" | \"valuetrack\" | \"utm_term_numeric\";\nexport type AdIdSource = \"explicit\" | \"valuetrack\" | \"utm_content_numeric\";\nexport type ClickIdSource =\n | \"gclid\"\n | \"gbraid\"\n | \"wbraid\"\n | \"fbclid\"\n | \"ttclid\"\n | \"msclkid\"\n | \"twclid\"\n | \"li_fat_id\";\n\nexport interface AdParamsResult {\n adgroup_id?: string;\n ad_id?: string;\n adgroup_id_source?: AdgroupIdSource;\n ad_id_source?: AdIdSource;\n click_id?: string;\n click_id_source?: ClickIdSource;\n}\n\n// Known aliases, in priority order. First hit wins. Matching is case-insensitive\n// for Google aliases; Microsoft-style PascalCase (AdGroupId) is matched via the\n// lowercased form because URLSearchParams preserves case but our iteration\n// normalizes when comparing.\nconst ADGROUP_ALIASES = [\n \"adgroup_id\",\n \"ad_group_id\",\n \"adgroupid\",\n \"adset_id\",\n \"tt_adgroup_id\",\n \"adgroup\",\n] as const;\nconst AD_ALIASES = [\n \"ad_id\",\n \"adid\",\n \"creative_id\",\n \"creative\",\n \"tt_ad_id\",\n] as const;\n// Click identifiers in priority order — gclid is the dominant Google one,\n// gbraid/wbraid are iOS privacy-preserving variants.\nconst CLICK_ID_ALIASES: readonly ClickIdSource[] = [\n \"gclid\",\n \"gbraid\",\n \"wbraid\",\n \"fbclid\",\n \"ttclid\",\n \"msclkid\",\n \"twclid\",\n \"li_fat_id\",\n];\n\n// Google ValueTrack IDs are 64-bit numeric. Empirically 7–15 digits covers\n// observed campaign / adgroup / ad / keyword IDs without false-matching short\n// numeric keywords.\nconst NUMERIC_ID_RE = /^\\d{7,15}$/;\n\n// Case-insensitive lookup into a multi-value param map.\nfunction firstValueCI(\n multi: Record<string, string[]>,\n key: string\n): string | undefined {\n const lower = key.toLowerCase();\n for (const k of Object.keys(multi)) {\n if (k.toLowerCase() === lower) {\n const vals = multi[k];\n for (const v of vals) {\n if (v && v.trim() !== \"\") return v.trim();\n }\n }\n }\n return undefined;\n}\n\n// Extract ad-platform tracking parameters from a URL, covering:\n// - Explicit named params (adgroup_id / ad_group_id / adset_id / tt_adgroup_id / ...)\n// - Unreplaced ValueTrack placeholders (e.g. `adgroup_id={adgroupid}`)\n// - Tier-2 numeric inference (Google advertisers configure utm_term={adgroupid}\n// AND utm_term={keyword} in the same tracking template → one utm_term value\n// is a numeric ID and the other is free-text keyword)\n// - Click identifiers (gclid / gbraid / wbraid / fbclid / ttclid / msclkid /\n// twclid / li_fat_id)\nexport function extractAdParams(url: string): AdParamsResult {\n const multi = parseUrlParamsMulti(url);\n const result: AdParamsResult = {};\n\n // --- Adgroup ID -------------------------------------------------------\n for (const alias of ADGROUP_ALIASES) {\n const v = firstValueCI(multi, alias);\n if (v === undefined) continue;\n // ValueTrack literal that wasn't replaced by Google (advertiser config error)\n if (/^\\{.+\\}$/.test(v)) {\n result.adgroup_id = v;\n result.adgroup_id_source = \"valuetrack\";\n } else {\n result.adgroup_id = v;\n result.adgroup_id_source = \"explicit\";\n }\n break;\n }\n // Tier-2: any utm_term value that looks like a numeric ID\n if (!result.adgroup_id) {\n const utmTerms = firstValueCI(multi, \"utm_term\")\n ? multi[Object.keys(multi).find((k) => k.toLowerCase() === \"utm_term\")!]\n : [];\n for (const v of utmTerms) {\n const trimmed = (v || \"\").trim();\n if (NUMERIC_ID_RE.test(trimmed)) {\n result.adgroup_id = trimmed;\n result.adgroup_id_source = \"utm_term_numeric\";\n break;\n }\n }\n }\n\n // --- Ad ID ------------------------------------------------------------\n for (const alias of AD_ALIASES) {\n const v = firstValueCI(multi, alias);\n if (v === undefined) continue;\n if (/^\\{.+\\}$/.test(v)) {\n result.ad_id = v;\n result.ad_id_source = \"valuetrack\";\n } else {\n result.ad_id = v;\n result.ad_id_source = \"explicit\";\n }\n break;\n }\n // Tier-2: utm_content numeric → likely {creative}\n if (!result.ad_id) {\n const utmContents = firstValueCI(multi, \"utm_content\")\n ? multi[\n Object.keys(multi).find((k) => k.toLowerCase() === \"utm_content\")!\n ]\n : [];\n for (const v of utmContents) {\n const trimmed = (v || \"\").trim();\n if (NUMERIC_ID_RE.test(trimmed)) {\n result.ad_id = trimmed;\n result.ad_id_source = \"utm_content_numeric\";\n break;\n }\n }\n }\n\n // --- Click ID (first non-empty wins, priority order) ------------------\n for (const alias of CLICK_ID_ALIASES) {\n const v = firstValueCI(multi, alias);\n if (v && v.trim() !== \"\") {\n result.click_id = v.trim();\n result.click_id_source = alias;\n break;\n }\n }\n\n return result;\n}\n\n// Detect device type from navigator.userAgent.\n// Returns 'desktop' | 'mobile' | 'tablet'. Tablet checked before mobile\n// because iPad UA strings can contain 'Mobile'.\nexport function detectDevice(): \"desktop\" | \"mobile\" | \"tablet\" {\n const ua = (typeof navigator !== \"undefined\" && navigator.userAgent) || \"\";\n if (/iPad|Tablet|PlayBook|Silk/i.test(ua)) {\n return \"tablet\";\n }\n if (/Mobi|Android|iPhone|iPod/i.test(ua)) {\n return \"mobile\";\n }\n return \"desktop\";\n}\n\n// Check if browser supports localStorage\nexport function isLocalStorageSupported(): boolean {\n try {\n const test = \"__localStorage_test__\";\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch {\n return false;\n }\n}\n\n// Check if browser supports IndexedDB\nexport function isIndexedDBSupported(): boolean {\n return \"indexedDB\" in window;\n}\n\n// Deep clone object\nexport function deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as unknown as T;\n }\n\n if (obj instanceof Array) {\n return obj.map((item) => deepClone(item)) as unknown as T;\n }\n\n if (typeof obj === \"object\") {\n const cloned = {} as T;\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n cloned[key] = deepClone(obj[key]);\n }\n }\n return cloned;\n }\n\n return obj;\n}\n\n// Debounce function\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: ReturnType<typeof setTimeout>;\n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), wait);\n };\n}\n\n// Throttle function\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n limit: number\n): (...args: Parameters<T>) => void {\n let inThrottle: boolean;\n return (...args: Parameters<T>) => {\n if (!inThrottle) {\n func(...args);\n inThrottle = true;\n setTimeout(() => (inThrottle = false), limit);\n }\n };\n}\n\n// Retry function with exponential backoff\nexport async function retry<T>(\n fn: () => Promise<T>,\n maxRetries: number = 3,\n baseDelay: number = 1000\n): Promise<T> {\n let lastError: Error;\n\n for (let i = 0; i <= maxRetries; i++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n if (i === maxRetries) {\n throw lastError;\n }\n\n const delay = baseDelay * Math.pow(2, i);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError!;\n}\n\n// Console logger implementation\nexport class ConsoleLogger implements LoggerInterface {\n private enabled: boolean;\n\n constructor(enabled: boolean = true) {\n this.enabled = enabled;\n }\n\n debug(message: string, ...args: any[]): void {\n if (this.enabled && console.debug) {\n console.debug(`[GetuAI Debug] ${message}`, ...args);\n }\n }\n\n info(message: string, ...args: any[]): void {\n if (this.enabled && console.info) {\n console.info(`[GetuAI Info] ${message}`, ...args);\n }\n }\n\n warn(message: string, ...args: any[]): void {\n if (this.enabled && console.warn) {\n console.warn(`[GetuAI Warn] ${message}`, ...args);\n }\n }\n\n error(message: string, ...args: any[]): void {\n if (this.enabled && console.error) {\n console.error(`[GetuAI Error] ${message}`, ...args);\n }\n }\n}\n\n// Get user agent info\nexport function getUserAgent(): string {\n return navigator.userAgent || \"\";\n}\n\n// Get referrer\nexport function getReferrer(): string {\n return document.referrer || \"\";\n}\n\n// Get current URL\nexport function getCurrentUrl(): string {\n return window.location.href;\n}\n\n// Get page title\nexport function getPageTitle(): string {\n return document.title || \"\";\n}\n\n// Check if user is online\nexport function isOnline(): boolean {\n return navigator.onLine;\n}\n\n// Generate session ID\nexport function generateSessionId(): string {\n return `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n}\n\n// Validate email format\nexport function isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n}\n\n// Format currency\nexport function formatCurrency(\n amount: number,\n currency: string = \"USD\"\n): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: currency,\n }).format(amount);\n}\n\n// Add UTM parameters to URL\nexport function addUTMToURL(\n url: string,\n utmParams: Record<string, string>\n): string {\n try {\n const urlObj = new URL(url);\n\n // Add UTM parameters if they don't already exist\n Object.entries(utmParams).forEach(([key, value]) => {\n if (value && !urlObj.searchParams.has(key)) {\n urlObj.searchParams.set(key, value);\n }\n });\n\n return urlObj.toString();\n } catch (error) {\n // If URL parsing fails, return original URL\n return url;\n }\n}\n\n// Check if domain should be excluded from UTM passing\nexport function shouldExcludeDomain(\n url: string,\n excludeDomains: string[] = []\n): boolean {\n try {\n const urlObj = new URL(url);\n const hostname = urlObj.hostname.toLowerCase();\n\n return excludeDomains.some((domain) => {\n const excludeDomain = domain.toLowerCase();\n return (\n hostname === excludeDomain || hostname.endsWith(`.${excludeDomain}`)\n );\n });\n } catch (error) {\n return false;\n }\n}\n\n// Get domain from URL\nexport function getDomainFromURL(url: string): string | null {\n try {\n const urlObj = new URL(url);\n return urlObj.hostname;\n } catch (error) {\n return null;\n }\n}\n\n// Check if URL is external (different domain)\nexport function isExternalURL(url: string): boolean {\n try {\n const urlObj = new URL(url);\n const currentDomain = window.location.hostname;\n return urlObj.hostname !== currentDomain;\n } catch (error) {\n return false;\n }\n}\n\n// Filter UTM parameters based on configuration\nexport function filterUTMParams(\n utmData: Partial<UTMData>,\n allowedParams: string[] = [\"utm_source\", \"utm_medium\", \"utm_campaign\"]\n): Record<string, string> {\n const filtered: Record<string, string> = {};\n\n allowedParams.forEach((param) => {\n if (utmData[param as keyof UTMData]) {\n filtered[param] = utmData[param as keyof UTMData] as string;\n }\n });\n\n return filtered;\n}\n\n// Get query string from URL\nexport function getQueryString(url?: string): string {\n try {\n const targetUrl = url || window.location.href;\n const urlObj = new URL(targetUrl);\n return urlObj.search;\n } catch (error) {\n return \"\";\n }\n}\n\n// Get query parameters as object\nexport function getQueryParams(url?: string): Record<string, string> {\n try {\n const targetUrl = url || window.location.href;\n const urlObj = new URL(targetUrl);\n const params: Record<string, string> = {};\n\n urlObj.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return params;\n } catch (error) {\n return {};\n }\n}\n\n// Clean URL by removing UTM parameters\nexport function cleanURL(): void {\n try {\n const currentUrl = new URL(window.location.href);\n const utmKeys = [\n \"utm_source\",\n \"utm_medium\",\n \"utm_campaign\",\n \"utm_term\",\n \"utm_content\",\n ];\n\n let hasParams = false;\n\n utmKeys.forEach((key) => {\n if (currentUrl.searchParams.has(key)) {\n currentUrl.searchParams.delete(key);\n hasParams = true;\n }\n });\n\n if (hasParams) {\n // Use replaceState to avoid page reload and history entry\n window.history.replaceState({}, document.title, currentUrl.toString());\n }\n } catch (error) {\n // Handle invalid URLs silently\n console.warn(\"Failed to clean URL:\", error);\n }\n}\n","import {\n StorageInterface,\n AttributionData,\n EventData,\n LoggerInterface,\n UTMData,\n UserTraits,\n} from \"../types\";\nimport {\n isLocalStorageSupported,\n isIndexedDBSupported,\n deepClone,\n ConsoleLogger,\n} from \"../utils\";\n\n// Cookie options for the cross-subdomain write helpers below.\ninterface CookieOptions {\n days?: number;\n domain?: string | null;\n secure?: boolean;\n}\n\nconst ANONYMOUS_ID_COOKIE = \"ga_anon_id\";\nconst ANONYMOUS_ID_LS_KEY = \"ga_anon_id\";\nconst ANONYMOUS_ID_TTL_DAYS = 365;\nconst ANONYMOUS_ID_PREFIX = \"anon_\";\n\nfunction generateAnonymousId(): string {\n if (typeof crypto !== \"undefined\" && typeof (crypto as any).randomUUID === \"function\") {\n return ANONYMOUS_ID_PREFIX + (crypto as any).randomUUID().replace(/-/g, \"\");\n }\n let hex = \"\";\n for (let i = 0; i < 32; i++) {\n hex += Math.floor(Math.random() * 16).toString(16);\n }\n return ANONYMOUS_ID_PREFIX + hex;\n}\n\n// Upper bound on the serialized attribution payload we'll put in a cookie.\n// Chrome/Firefox cap individual cookies at 4096 bytes; 3800 leaves headroom\n// for the name, attributes, and URL-encoding overhead.\nconst MAX_ATTRIB_COOKIE_BYTES = 3800;\n// Keep the most recent touchpoints only when the payload would otherwise\n// exceed the cookie size limit. 20 covers typical journeys while staying\n// well under 4KB even with long UTM values.\nconst TOUCHPOINTS_TRIM_LIMIT = 20;\n\n// LocalStorage implementation\nexport class LocalStorageManager implements StorageInterface {\n private logger: LoggerInterface;\n\n constructor(logger: LoggerInterface) {\n this.logger = logger;\n }\n\n get(key: string): any {\n try {\n if (!isLocalStorageSupported()) {\n this.logger.warn(\"LocalStorage not supported\");\n return null;\n }\n\n const item = localStorage.getItem(key);\n if (item === null) {\n return null;\n }\n\n return JSON.parse(item);\n } catch (error) {\n this.logger.error(\"Error reading from localStorage:\", error);\n return null;\n }\n }\n\n set(key: string, value: any): void {\n try {\n if (!isLocalStorageSupported()) {\n this.logger.warn(\"LocalStorage not supported\");\n return;\n }\n\n localStorage.setItem(key, JSON.stringify(value));\n } catch (error) {\n this.logger.error(\"Error writing to localStorage:\", error);\n // Handle quota exceeded\n this.handleQuotaExceeded();\n }\n }\n\n remove(key: string): void {\n try {\n if (isLocalStorageSupported()) {\n localStorage.removeItem(key);\n }\n } catch (error) {\n this.logger.error(\"Error removing from localStorage:\", error);\n }\n }\n\n clear(): void {\n try {\n if (isLocalStorageSupported()) {\n localStorage.clear();\n }\n } catch (error) {\n this.logger.error(\"Error clearing localStorage:\", error);\n }\n }\n\n private handleQuotaExceeded(): void {\n // Try to clean up old data\n try {\n const keys = Object.keys(localStorage);\n const attributionKeys = keys.filter((key) =>\n key.startsWith(\"attribution_\")\n );\n\n if (attributionKeys.length > 0) {\n // Remove oldest data first\n attributionKeys.sort((a, b) => {\n const aData = this.get(a);\n const bData = this.get(b);\n return (aData?.expiresAt || 0) - (bData?.expiresAt || 0);\n });\n\n // Remove oldest 20% of data\n const toRemove = Math.ceil(attributionKeys.length * 0.2);\n attributionKeys.slice(0, toRemove).forEach((key) => {\n this.remove(key);\n });\n\n this.logger.info(`Cleaned up ${toRemove} old attribution records`);\n }\n } catch (error) {\n this.logger.error(\"Error during quota cleanup:\", error);\n }\n }\n}\n\n// IndexedDB implementation\nexport class IndexedDBManager {\n private dbName: string = \"attribution_events\";\n private dbVersion: number = 1;\n private storeName: string = \"events\";\n private logger: LoggerInterface;\n private db: IDBDatabase | null = null;\n\n constructor(logger: LoggerInterface) {\n this.logger = logger;\n }\n\n async init(): Promise<void> {\n if (!isIndexedDBSupported()) {\n this.logger.warn(\"IndexedDB not supported\");\n return;\n }\n\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(this.dbName, this.dbVersion);\n\n request.onerror = () => {\n this.logger.error(\"Failed to open IndexedDB:\", request.error);\n reject(request.error);\n };\n\n request.onsuccess = () => {\n this.db = request.result;\n this.logger.info(\"IndexedDB initialized successfully\");\n resolve();\n };\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n\n if (!db.objectStoreNames.contains(this.storeName)) {\n const store = db.createObjectStore(this.storeName, {\n keyPath: \"id\",\n autoIncrement: true,\n });\n store.createIndex(\"timestamp\", \"timestamp\", { unique: false });\n store.createIndex(\"sent\", \"sent\", { unique: false });\n store.createIndex(\"queued_at\", \"queued_at\", { unique: false });\n }\n };\n });\n }\n\n async addEvent(event: EventData): Promise<void> {\n if (!this.db) {\n throw new Error(\"IndexedDB not initialized\");\n }\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction([this.storeName], \"readwrite\");\n const store = transaction.objectStore(this.storeName);\n\n const eventRecord = {\n ...event,\n queued_at: Date.now(),\n sent: false,\n };\n\n const request = store.add(eventRecord);\n\n request.onsuccess = () => {\n this.logger.debug(\"Event added to IndexedDB queue\");\n resolve();\n };\n\n request.onerror = () => {\n this.logger.error(\"Failed to add event to IndexedDB:\", request.error);\n reject(request.error);\n };\n });\n }\n\n async getUnsentEvents(limit: number = 100): Promise<EventData[]> {\n if (!this.db) {\n return [];\n }\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction([this.storeName], \"readonly\");\n const store = transaction.objectStore(this.storeName);\n const index = store.index(\"sent\");\n\n const request = index.getAll(IDBKeyRange.only(false), limit);\n\n request.onsuccess = () => {\n const events = request.result.map((record: any) => {\n const { queued_at, sent, ...event } = record;\n return event;\n });\n resolve(events);\n };\n\n request.onerror = () => {\n this.logger.error(\"Failed to get unsent events:\", request.error);\n reject(request.error);\n };\n });\n }\n\n async markEventsAsSent(eventIds: string[]): Promise<void> {\n if (!this.db || eventIds.length === 0) {\n return;\n }\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction([this.storeName], \"readwrite\");\n const store = transaction.objectStore(this.storeName);\n\n let completed = 0;\n let hasError = false;\n\n eventIds.forEach((eventId) => {\n const getRequest = store.get(eventId);\n\n getRequest.onsuccess = () => {\n if (getRequest.result) {\n const record = { ...getRequest.result, sent: true };\n const putRequest = store.put(record);\n\n putRequest.onsuccess = () => {\n completed++;\n if (completed === eventIds.length && !hasError) {\n resolve();\n }\n };\n\n putRequest.onerror = () => {\n hasError = true;\n this.logger.error(\n \"Failed to mark event as sent:\",\n putRequest.error\n );\n reject(putRequest.error);\n };\n } else {\n completed++;\n if (completed === eventIds.length && !hasError) {\n resolve();\n }\n }\n };\n\n getRequest.onerror = () => {\n hasError = true;\n this.logger.error(\n \"Failed to get event for marking as sent:\",\n getRequest.error\n );\n reject(getRequest.error);\n };\n });\n });\n }\n\n async cleanupOldEvents(\n maxAge: number = 7 * 24 * 60 * 60 * 1000\n ): Promise<void> {\n if (!this.db) {\n return;\n }\n\n const cutoffTime = Date.now() - maxAge;\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction([this.storeName], \"readwrite\");\n const store = transaction.objectStore(this.storeName);\n const index = store.index(\"queued_at\");\n\n const request = index.openCursor(IDBKeyRange.upperBound(cutoffTime));\n\n request.onsuccess = () => {\n const cursor = request.result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n this.logger.info(\"Old events cleanup completed\");\n resolve();\n }\n };\n\n request.onerror = () => {\n this.logger.error(\"Failed to cleanup old events:\", request.error);\n reject(request.error);\n };\n });\n }\n\n async getQueueSize(): Promise<number> {\n if (!this.db) {\n return 0;\n }\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction([this.storeName], \"readonly\");\n const store = transaction.objectStore(this.storeName);\n const request = store.count();\n\n request.onsuccess = () => {\n resolve(request.result);\n };\n\n request.onerror = () => {\n this.logger.error(\"Failed to get queue size:\", request.error);\n reject(request.error);\n };\n });\n }\n\n async clear(): Promise<void> {\n if (!this.db) {\n return;\n }\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction([this.storeName], \"readwrite\");\n const store = transaction.objectStore(this.storeName);\n const request = store.clear();\n\n request.onsuccess = () => {\n this.logger.info(\"IndexedDB queue cleared\");\n resolve();\n };\n\n request.onerror = () => {\n this.logger.error(\"Failed to clear IndexedDB queue:\", request.error);\n reject(request.error);\n };\n });\n }\n}\n\n// Attribution storage manager\nexport class AttributionStorageManager {\n private localStorage: LocalStorageManager;\n private indexedDB: IndexedDBManager;\n private logger: LoggerInterface;\n // Legacy localStorage keys — kept for backward-compat reads during migration.\n private readonly UTM_STORAGE_KEY = \"attribution_utm_data\";\n private readonly SESSION_STORAGE_KEY = \"attribution_session\";\n // Cross-subdomain cookie keys.\n private readonly SESSION_COOKIE_KEY = \"_getuai_session\";\n private readonly ATTRIB_COOKIE_KEY = \"_getuai_attrib\";\n private readonly USER_ID_KEY = \"getuai_user_id\";\n private readonly PENDING_EVENTS_KEY = \"getuai_pending_events_v1\";\n private readonly USER_TRAITS_KEY = \"getuai_user_traits\";\n private readonly USER_ID_COOKIE_EXPIRES = 365; // days\n private readonly ATTRIB_COOKIE_EXPIRES = 30; // days\n private readonly SESSION_COOKIE_EXPIRES = 1; // days; session timeout enforces 30min semantics\n\n // Parent-domain for cookies (e.g. \".example.com\"). Null means write host-only\n // cookies — single-origin mode. Set via setCookieDomain() during SDK init.\n private cookieDomain: string | null = null;\n\n constructor(logger: LoggerInterface) {\n this.logger = logger;\n this.localStorage = new LocalStorageManager(logger);\n this.indexedDB = new IndexedDBManager(logger);\n }\n\n /** Set the parent-domain used when writing cross-subdomain cookies. */\n setCookieDomain(domain: string | null): void {\n this.cookieDomain = domain;\n this.logger.debug(\n domain\n ? `🍪 Cookie domain set to ${domain} (cross-subdomain sharing enabled)`\n : \"🍪 Cookie domain not set — using host-only cookies\"\n );\n }\n\n // User ID management - stores in both cookie and localStorage\n setUserId(userId: string): void {\n if (!userId || userId.trim() === \"\") {\n this.logger.warn(\"Cannot set empty user ID\");\n return;\n }\n\n const trimmedUserId = userId.trim();\n\n // Store in cookie (with cross-subdomain domain if configured)\n try {\n this.setCookie(this.USER_ID_KEY, trimmedUserId, {\n days: this.USER_ID_COOKIE_EXPIRES,\n domain: this.cookieDomain,\n });\n this.logger.debug(`👤 User ID stored in cookie: ${trimmedUserId}`);\n } catch (error) {\n this.logger.error(\"Failed to store user ID in cookie:\", error);\n }\n\n // Store in localStorage\n try {\n if (typeof localStorage !== \"undefined\") {\n localStorage.setItem(this.USER_ID_KEY, trimmedUserId);\n this.logger.debug(\n `👤 User ID stored in localStorage: ${trimmedUserId}`\n );\n }\n } catch (error) {\n this.logger.error(\"Failed to store user ID in localStorage:\", error);\n }\n }\n\n getUserId(): string | null {\n // Cookie is authoritative — it's the cross-subdomain shared source of\n // truth, identical to how getSession() reads. localStorage is host-scoped\n // and goes stale when sibling subdomains update the user (e.g. A switches\n // user, B's localStorage still has the old value). Keep reading it as a\n // fallback for cookies-disabled / single-origin mode only.\n let cookieUserId: string | null = null;\n try {\n cookieUserId = this.getCookie(this.USER_ID_KEY);\n } catch (error) {\n this.logger.debug(\"Failed to get user ID from cookie:\", error);\n }\n\n if (cookieUserId) {\n // Repair stale localStorage so any code reading it directly converges.\n try {\n if (\n typeof localStorage !== \"undefined\" &&\n localStorage.getItem(this.USER_ID_KEY) !== cookieUserId\n ) {\n localStorage.setItem(this.USER_ID_KEY, cookieUserId);\n }\n } catch (error) {\n // Ignore sync errors\n }\n return cookieUserId;\n }\n\n // Fallback to localStorage (cookies disabled / pre-migration data).\n try {\n if (typeof localStorage !== \"undefined\") {\n const userId = localStorage.getItem(this.USER_ID_KEY);\n if (userId) {\n return userId;\n }\n }\n } catch (error) {\n this.logger.debug(\"Failed to get user ID from localStorage:\", error);\n }\n\n return null;\n }\n\n removeUserId(): void {\n // Remove from cookie — delete both the host-only and cross-subdomain\n // variants in case a page was loaded before cookieDomain was configured.\n try {\n this.deleteCookie(this.USER_ID_KEY);\n this.logger.debug(\"👤 User ID removed from cookie\");\n } catch (error) {\n this.logger.error(\"Failed to remove user ID from cookie:\", error);\n }\n\n // Remove from localStorage\n try {\n if (typeof localStorage !== \"undefined\") {\n localStorage.removeItem(this.USER_ID_KEY);\n this.logger.debug(\"👤 User ID removed from localStorage\");\n }\n } catch (error) {\n this.logger.error(\"Failed to remove user ID from localStorage:\", error);\n }\n }\n\n /** Get persistent anonymous_id; create + persist one if absent. */\n getAnonymousId(): string {\n // 1) Try cookie first (cross-subdomain reads).\n try {\n const cookieVal = this.getCookie(ANONYMOUS_ID_COOKIE);\n if (cookieVal && cookieVal.startsWith(ANONYMOUS_ID_PREFIX)) {\n try { localStorage.setItem(ANONYMOUS_ID_LS_KEY, cookieVal); } catch {}\n return cookieVal;\n }\n } catch (e) {\n this.logger.debug(\"anonymous_id cookie read failed\", e);\n }\n\n // 2) Fallback: localStorage.\n try {\n const lsVal = typeof localStorage !== \"undefined\"\n ? localStorage.getItem(ANONYMOUS_ID_LS_KEY)\n : null;\n if (lsVal && lsVal.startsWith(ANONYMOUS_ID_PREFIX)) {\n this.setAnonymousId(lsVal);\n return lsVal;\n }\n } catch (e) {\n this.logger.debug(\"anonymous_id localStorage read failed\", e);\n }\n\n // 3) Generate new.\n const id = generateAnonymousId();\n this.setAnonymousId(id);\n this.logger.info(`🆔 Generated new anonymous_id: ${id}`);\n return id;\n }\n\n /** Persist anonymous_id to cookie + localStorage. */\n setAnonymousId(id: string): void {\n if (!id || !id.startsWith(ANONYMOUS_ID_PREFIX)) {\n this.logger.warn(`Refusing to set malformed anonymous_id: ${id}`);\n return;\n }\n try {\n this.setCookie(ANONYMOUS_ID_COOKIE, id, {\n days: ANONYMOUS_ID_TTL_DAYS,\n domain: this.cookieDomain,\n });\n } catch (e) {\n this.logger.error(\"anonymous_id cookie write failed\", e);\n }\n try {\n if (typeof localStorage !== \"undefined\") {\n localStorage.setItem(ANONYMOUS_ID_LS_KEY, id);\n }\n } catch (e) {\n this.logger.error(\"anonymous_id localStorage write failed\", e);\n }\n }\n\n /** Generate a fresh anonymous_id, persist it, and return it. Used on Case X. */\n rotateAnonymousId(): string {\n const newId = generateAnonymousId();\n this.setAnonymousId(newId);\n this.logger.info(`🔄 Rotated anonymous_id: ${newId}`);\n return newId;\n }\n\n // Cookie helper methods\n private setCookie(\n name: string,\n value: string,\n optionsOrDays: CookieOptions | number = {}\n ): boolean {\n try {\n const options: CookieOptions =\n typeof optionsOrDays === \"number\"\n ? { days: optionsOrDays }\n : optionsOrDays;\n const days = options.days ?? this.USER_ID_COOKIE_EXPIRES;\n const expires = new Date();\n expires.setTime(expires.getTime() + days * 24 * 60 * 60 * 1000);\n const secure =\n options.secure ??\n (typeof location !== \"undefined\" && location.protocol === \"https:\");\n const domain = options.domain ?? this.cookieDomain;\n\n const parts: string[] = [\n `${name}=${encodeURIComponent(value)}`,\n `expires=${expires.toUTCString()}`,\n \"path=/\",\n \"SameSite=Lax\",\n ];\n if (domain) parts.push(`domain=${domain}`);\n if (secure) parts.push(\"Secure\");\n document.cookie = parts.join(\";\");\n return true;\n } catch (error) {\n this.logger.error(\"Failed to set cookie:\", error);\n return false;\n }\n }\n\n private getCookie(name: string): string | null {\n try {\n const nameEQ = name + \"=\";\n const ca = document.cookie.split(\";\");\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) === \" \") c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) === 0) {\n return decodeURIComponent(c.substring(nameEQ.length, c.length));\n }\n }\n return null;\n } catch (error) {\n this.logger.error(\"Failed to get cookie:\", error);\n return null;\n }\n }\n\n private deleteCookie(name: string): void {\n try {\n // Delete both host-only and domain-scoped variants so stale cookies\n // written before cookieDomain was configured get cleaned up too.\n document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;`;\n if (this.cookieDomain) {\n document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;domain=${this.cookieDomain};`;\n }\n } catch (error) {\n this.logger.error(\"Failed to delete cookie:\", error);\n }\n }\n\n async init(): Promise<void> {\n await this.indexedDB.init();\n }\n\n // Pending events (best-effort) for unload/redirect scenarios\n getPendingEvents(): EventData[] {\n try {\n const value = this.localStorage.get(this.PENDING_EVENTS_KEY);\n if (!Array.isArray(value)) {\n return [];\n }\n return value as EventData[];\n } catch (error) {\n this.logger.debug(\"Failed to read pending events:\", error);\n return [];\n }\n }\n\n appendPendingEvents(events: EventData[]): void {\n if (!events || events.length === 0) {\n return;\n }\n try {\n const existing = this.getPendingEvents();\n const merged = [...existing, ...events];\n // Keep a reasonable cap to avoid localStorage quota issues\n const capped = merged.slice(-500);\n this.localStorage.set(this.PENDING_EVENTS_KEY, capped);\n } catch (error) {\n this.logger.debug(\"Failed to append pending events:\", error);\n }\n }\n\n removePendingEventsByIds(eventIds: string[]): void {\n if (!eventIds || eventIds.length === 0) {\n return;\n }\n try {\n const existing = this.getPendingEvents();\n if (existing.length === 0) {\n return;\n }\n const idSet = new Set(eventIds);\n const filtered = existing.filter((e) => !idSet.has(e.event_id));\n if (filtered.length === 0) {\n this.localStorage.remove(this.PENDING_EVENTS_KEY);\n } else {\n this.localStorage.set(this.PENDING_EVENTS_KEY, filtered);\n }\n } catch (error) {\n this.logger.debug(\"Failed to remove pending events:\", error);\n }\n }\n\n clearPendingEvents(): void {\n try {\n this.localStorage.remove(this.PENDING_EVENTS_KEY);\n } catch (error) {\n this.logger.debug(\"Failed to clear pending events:\", error);\n }\n }\n\n // UTM data management\n storeUTMData(utmData: Partial<AttributionData>): void {\n try {\n const existingData = this.getUTMData();\n\n // Create default UTM data if none exists\n const defaultUTMData: UTMData = {\n utm_source: \"\",\n utm_medium: \"\",\n utm_campaign: \"\",\n utm_term: \"\",\n utm_content: \"\",\n timestamp: Date.now(),\n };\n\n const newData: AttributionData = {\n firstTouch: existingData?.firstTouch || defaultUTMData,\n lastTouch: existingData?.lastTouch || defaultUTMData,\n touchpoints: existingData?.touchpoints || [],\n ...utmData,\n expiresAt: Date.now() + 30 * 24 * 60 * 60 * 1000, // 30 days\n };\n\n this.writeAttribution(newData);\n this.logger.debug(\"UTM data stored successfully:\", {\n firstTouch: newData.firstTouch,\n lastTouch: newData.lastTouch,\n touchpointsCount: newData.touchpoints.length,\n expiresAt: new Date(newData.expiresAt).toISOString(),\n });\n } catch (error) {\n this.logger.error(\"Failed to store UTM data:\", error);\n }\n }\n\n getUTMData(): AttributionData | null {\n // Cookie is source of truth — it's cross-subdomain shared and survives\n // navigation between e.g. example.com and app.example.com.\n const cookieData = this.readAttributionFromCookie();\n if (cookieData && cookieData.expiresAt && cookieData.expiresAt > Date.now()) {\n return cookieData;\n }\n if (cookieData) {\n this.deleteCookie(this.ATTRIB_COOKIE_KEY);\n }\n\n // Fallback to localStorage (covers: cookies disabled, legacy data pre-migration).\n const lsData = this.localStorage.get(this.UTM_STORAGE_KEY);\n if (lsData && lsData.expiresAt && lsData.expiresAt > Date.now()) {\n return lsData;\n }\n if (lsData) {\n this.localStorage.remove(this.UTM_STORAGE_KEY);\n }\n\n return null;\n }\n\n // Session management\n storeSession(session: any): void {\n // Write to cookie first (cross-subdomain shareable) and mirror to\n // localStorage so the session survives cookie failures / incognito mode.\n try {\n const serialized = JSON.stringify(session);\n this.setCookie(this.SESSION_COOKIE_KEY, serialized, {\n days: this.SESSION_COOKIE_EXPIRES,\n domain: this.cookieDomain,\n });\n } catch (error) {\n this.logger.debug(\"Failed to store session in cookie:\", error);\n }\n this.localStorage.set(this.SESSION_STORAGE_KEY, session);\n }\n\n getSession(): any {\n // Cookie is authoritative when present — it reflects cross-subdomain state.\n try {\n const raw = this.getCookie(this.SESSION_COOKIE_KEY);\n if (raw) {\n return JSON.parse(raw);\n }\n } catch (error) {\n this.logger.debug(\"Failed to parse session cookie:\", error);\n }\n return this.localStorage.get(this.SESSION_STORAGE_KEY);\n }\n\n /**\n * One-shot migration from legacy single-origin localStorage keys to the\n * new cross-subdomain cookies. Called once during SDK init after the\n * cookieDomain has been resolved. Safe to invoke when there's no legacy\n * data — simply no-ops.\n *\n * Strategy: if the cookie is empty but localStorage has a value, copy\n * localStorage → cookie. Keep the localStorage entry as a fallback rather\n * than deleting it, so a downgrade to an older SDK build doesn't lose state.\n */\n migrateLegacyStorage(): void {\n // Session\n try {\n const cookieSession = this.getCookie(this.SESSION_COOKIE_KEY);\n if (!cookieSession) {\n const legacy = this.localStorage.get(this.SESSION_STORAGE_KEY);\n if (legacy) {\n this.setCookie(this.SESSION_COOKIE_KEY, JSON.stringify(legacy), {\n days: this.SESSION_COOKIE_EXPIRES,\n domain: this.cookieDomain,\n });\n this.logger.debug(\"↗️ Migrated legacy session to cookie\");\n }\n }\n } catch (error) {\n this.logger.debug(\"Session migration skipped:\", error);\n }\n\n // Attribution / UTM\n try {\n const cookieAttrib = this.getCookie(this.ATTRIB_COOKIE_KEY);\n if (!cookieAttrib) {\n const legacy = this.localStorage.get(this.UTM_STORAGE_KEY);\n if (\n legacy &&\n legacy.expiresAt &&\n legacy.expiresAt > Date.now()\n ) {\n this.writeAttribution(legacy);\n this.logger.debug(\"↗️ Migrated legacy attribution data to cookie\");\n }\n }\n } catch (error) {\n this.logger.debug(\"Attribution migration skipped:\", error);\n }\n\n // User ID — the old SDK wrote a host-only cookie. If the new cross-domain\n // cookie is missing but localStorage has a user ID, upgrade it so sibling\n // subdomains can read it immediately.\n try {\n if (this.cookieDomain) {\n const existingUid = this.getCookie(this.USER_ID_KEY);\n const lsUid =\n typeof localStorage !== \"undefined\"\n ? localStorage.getItem(this.USER_ID_KEY)\n : null;\n if (!existingUid && lsUid) {\n this.setCookie(this.USER_ID_KEY, lsUid, {\n days: this.USER_ID_COOKIE_EXPIRES,\n domain: this.cookieDomain,\n });\n this.logger.debug(\"↗️ Migrated legacy user ID to cross-subdomain cookie\");\n }\n }\n } catch (error) {\n this.logger.debug(\"User ID migration skipped:\", error);\n }\n }\n\n // --- Attribution cookie helpers ----------------------------------------\n\n private writeAttribution(data: AttributionData): void {\n // Always mirror to localStorage so an oversized/rejected cookie doesn't\n // leave us stateless on this origin.\n this.localStorage.set(this.UTM_STORAGE_KEY, data);\n\n const ttlMs = Math.max(0, data.expiresAt - Date.now());\n const days = Math.max(1, Math.ceil(ttlMs / (24 * 60 * 60 * 1000)));\n\n let payload = encodeURIComponent(JSON.stringify(data));\n if (payload.length > MAX_ATTRIB_COOKIE_BYTES) {\n // Trim touchpoints (oldest first) until we fit.\n const trimmed: AttributionData = {\n ...data,\n touchpoints: (data.touchpoints || []).slice(-TOUCHPOINTS_TRIM_LIMIT),\n };\n payload = encodeURIComponent(JSON.stringify(trimmed));\n if (payload.length > MAX_ATTRIB_COOKIE_BYTES) {\n // Still too large — drop touchpoints entirely, keep first/last touch.\n const minimal: AttributionData = { ...trimmed, touchpoints: [] };\n payload = encodeURIComponent(JSON.stringify(minimal));\n }\n this.logger.debug(\n \"Attribution cookie payload trimmed to fit size limit\"\n );\n this.setCookie(\n this.ATTRIB_COOKIE_KEY,\n decodeURIComponent(payload),\n { days, domain: this.cookieDomain }\n );\n return;\n }\n\n this.setCookie(this.ATTRIB_COOKIE_KEY, JSON.stringify(data), {\n days,\n domain: this.cookieDomain,\n });\n }\n\n private readAttributionFromCookie(): AttributionData | null {\n try {\n const raw = this.getCookie(this.ATTRIB_COOKIE_KEY);\n if (!raw) return null;\n return JSON.parse(raw) as AttributionData;\n } catch (error) {\n this.logger.debug(\"Failed to parse attribution cookie:\", error);\n return null;\n }\n }\n\n // Event queue management\n async queueEvent(event: EventData): Promise<void> {\n try {\n await this.indexedDB.addEvent(event);\n } catch (error) {\n this.logger.error(\"Failed to queue event:\", error);\n throw error;\n }\n }\n\n async getUnsentEvents(limit: number = 100): Promise<EventData[]> {\n return await this.indexedDB.getUnsentEvents(limit);\n }\n\n async markEventsAsSent(eventIds: string[]): Promise<void> {\n await this.indexedDB.markEventsAsSent(eventIds);\n }\n\n async getQueueSize(): Promise<number> {\n return await this.indexedDB.getQueueSize();\n }\n\n async cleanupOldEvents(): Promise<void> {\n await this.indexedDB.cleanupOldEvents();\n }\n\n async clearQueue(): Promise<void> {\n await this.indexedDB.clear();\n }\n\n // Cleanup expired data\n cleanupExpiredData(): void {\n this.getUTMData(); // This will automatically clean up expired UTM data\n }\n\n /**\n * Store user traits (merges with existing traits)\n */\n setUserTraits(traits: UserTraits): void {\n try {\n const existing = this.getUserTraits() || {};\n const merged = { ...existing, ...traits };\n\n // Store to localStorage (persistent)\n if (typeof localStorage !== \"undefined\") {\n localStorage.setItem(this.USER_TRAITS_KEY, JSON.stringify(merged));\n this.logger.debug(\"User traits stored:\", merged);\n }\n } catch (error) {\n this.logger.error(\"Failed to store user traits:\", error);\n }\n }\n\n /**\n * Get user traits\n */\n getUserTraits(): UserTraits | null {\n try {\n if (typeof localStorage !== \"undefined\") {\n const data = localStorage.getItem(this.USER_TRAITS_KEY);\n return data ? JSON.parse(data) : null;\n }\n return null;\n } catch (error) {\n this.logger.error(\"Failed to get user traits:\", error);\n return null;\n }\n }\n\n /**\n * Clear user traits\n */\n clearUserTraits(): void {\n try {\n if (typeof localStorage !== \"undefined\") {\n localStorage.removeItem(this.USER_TRAITS_KEY);\n this.logger.debug(\"User traits cleared\");\n }\n } catch (error) {\n this.logger.error(\"Failed to clear user traits:\", error);\n }\n }\n}\n","/**\n * SDK Version\n * This version is automatically updated from package.json during build\n * DO NOT manually edit this file - it will be overwritten during build\n */\nexport const SDK_VERSION = \"0.5.0\";\n","import {\n QueueInterface,\n EventData,\n BatchEventRequest,\n LoggerInterface,\n IMMEDIATE_EVENTS,\n} from \"../types\";\nimport { retry, debounce, getTimestamp } from \"../utils\";\nimport { SDK_VERSION } from \"../version\";\n\nexport class EventQueueManager implements QueueInterface {\n private queue: EventData[] = [];\n private processing: boolean = false;\n private batchTimer: ReturnType<typeof setTimeout> | null = null;\n private logger: LoggerInterface;\n private apiKey: string;\n private apiEndpoint: string;\n private batchSize: number;\n private batchInterval: number;\n private maxRetries: number;\n private retryDelay: number;\n private sendEvents: (events: EventData[]) => Promise<void>;\n private retryCounts: Map<string, number> = new Map();\n\n constructor(\n logger: LoggerInterface,\n apiKey: string,\n apiEndpoint: string,\n batchSize: number = 100,\n batchInterval: number = 2000,\n maxRetries: number = 3,\n retryDelay: number = 1000,\n sendEvents: (events: EventData[]) => Promise<void>\n ) {\n this.logger = logger;\n this.apiKey = apiKey;\n this.apiEndpoint = apiEndpoint;\n this.batchSize = batchSize;\n this.batchInterval = batchInterval;\n this.maxRetries = maxRetries;\n this.retryDelay = retryDelay;\n this.sendEvents = sendEvents;\n\n // Debounced process function to avoid excessive calls\n this.debouncedProcess = debounce(this.process.bind(this), 100);\n }\n\n add(event: EventData): void {\n // Check if this is an immediate event\n if (IMMEDIATE_EVENTS.includes(event.event_type)) {\n this.logger.debug(\n `Immediate event detected: ${event.event_type}, sending immediately`\n );\n // Do not enqueue first; enqueue only on failure to avoid duplicates.\n this.processImmediate(event);\n return;\n }\n\n this.queue.push(event);\n this.logger.debug(`Event added to queue: ${event.event_type}`);\n this.scheduleBatchProcessing();\n }\n\n async process(): Promise<void> {\n if (this.processing || this.queue.length === 0) {\n return;\n }\n\n this.processing = true;\n const eventsToProcess = this.queue.splice(0, this.batchSize);\n\n try {\n this.logger.debug(\n `Processing ${eventsToProcess.length} events from queue`\n );\n\n await this.sendEvents(eventsToProcess);\n this.resetRetryCounts(eventsToProcess);\n\n this.logger.info(\n `Successfully processed ${eventsToProcess.length} events`\n );\n\n // Events are automatically removed from queue when successfully sent\n // No need to manually clean up as they were already spliced from the queue\n } catch (error) {\n this.logger.error(\"Failed to process events:\", error);\n\n // Put the failed batch back in queue for retry (with max retry cap)\n this.enqueueBatchForRetry(eventsToProcess);\n\n // Schedule retry\n setTimeout(() => {\n this.processing = false;\n this.debouncedProcess();\n }, this.retryDelay);\n\n return;\n }\n\n this.processing = false;\n\n // Process remaining events if any\n if (this.queue.length > 0) {\n this.debouncedProcess();\n }\n }\n\n private async processImmediate(event: EventData): Promise<void> {\n try {\n this.logger.debug(`Processing immediate event: ${event.event_type}`);\n await this.sendEvents([event]);\n this.resetRetryCounts([event]);\n this.logger.info(\n `Immediate event processed successfully: ${event.event_type}`\n );\n } catch (error) {\n this.logger.error(\n `Failed to process immediate event: ${event.event_type}`,\n error\n );\n\n // Add to queue for retry (with max retry cap)\n this.enqueueBatchForRetry([event]);\n }\n }\n\n private scheduleBatchProcessing(): void {\n if (this.batchTimer) {\n clearTimeout(this.batchTimer);\n }\n\n this.batchTimer = setTimeout(() => {\n this.debouncedProcess();\n }, this.batchInterval);\n }\n\n clear(): void {\n this.queue = [];\n if (this.batchTimer) {\n clearTimeout(this.batchTimer);\n this.batchTimer = null;\n }\n this.processing = false;\n this.logger.info(\"Event queue cleared\");\n }\n\n size(): number {\n return this.queue.length;\n }\n\n // Get queue statistics\n getStats(): { size: number; processing: boolean } {\n return {\n size: this.queue.length,\n processing: this.processing,\n };\n }\n\n // Force process all events in queue\n async flush(): Promise<void> {\n this.logger.info(\"Flushing event queue\");\n while (this.queue.length > 0) {\n await this.process();\n }\n }\n\n /**\n * Drain pending events from the in-memory queue (used for unload-safe flushing).\n * This clears any scheduled timers and stops processing.\n */\n drainAll(): EventData[] {\n const drained = this.queue.splice(0, this.queue.length);\n if (this.batchTimer) {\n clearTimeout(this.batchTimer);\n this.batchTimer = null;\n }\n this.processing = false;\n return drained;\n }\n\n private enqueueBatchForRetry(events: EventData[]): void {\n const retryable: EventData[] = [];\n for (const event of events) {\n const attempts = (this.retryCounts.get(event.event_id) || 0) + 1;\n this.retryCounts.set(event.event_id, attempts);\n\n if (attempts > this.maxRetries) {\n this.logger.warn(\n `Dropping event after max retries (${this.maxRetries}): ${event.event_type} (${event.event_id})`\n );\n this.retryCounts.delete(event.event_id);\n continue;\n }\n\n retryable.push(event);\n }\n\n if (retryable.length > 0) {\n this.queue.unshift(...retryable);\n }\n }\n\n private resetRetryCounts(events: EventData[]): void {\n for (const event of events) {\n this.retryCounts.delete(event.event_id);\n }\n }\n\n // Debounced process function\n private debouncedProcess: () => void;\n}\n\n// HTTP client for sending events\nexport class EventHttpClient {\n private logger: LoggerInterface;\n private apiKey: string;\n private apiEndpoint: string;\n private maxRetries: number;\n private retryDelay: number;\n\n constructor(\n logger: LoggerInterface,\n apiKey: string,\n apiEndpoint: string,\n maxRetries: number = 3,\n retryDelay: number = 1000\n ) {\n this.logger = logger;\n this.apiKey = apiKey;\n this.apiEndpoint = apiEndpoint;\n this.maxRetries = maxRetries;\n this.retryDelay = retryDelay;\n }\n\n async sendEvents(events: EventData[]): Promise<void> {\n if (events.length === 0) {\n return;\n }\n\n // Transform events to match server format\n const transformedEvents = events.map((event) => ({\n event_id: event.event_id,\n event_type: event.event_type,\n anonymous_id: event.anonymous_id,\n tracking_user_id: event.tracking_user_id,\n utm_source: event.utm_source || null,\n utm_medium: event.utm_medium || null,\n utm_campaign: event.utm_campaign || null,\n utm_term: event.utm_term || null,\n utm_content: event.utm_content || null,\n revenue: event.revenue || null,\n currency: event.currency || null,\n event_data: event.event_data || null,\n context: event.context || null,\n timestamp: event.timestamp || getTimestamp(), // Convert to seconds\n custom_event_name: event.custom_event_name || undefined,\n }));\n\n const batchRequest: BatchEventRequest = {\n events: transformedEvents,\n sdk_version: SDK_VERSION,\n };\n\n await retry(\n async () => {\n const response = await fetch(`${this.apiEndpoint}/attribution/events`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(batchRequest),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`HTTP ${response.status}: ${errorText}`);\n }\n\n const result = await response.json();\n this.logger.debug(\"Events sent successfully:\", result);\n\n // Return the sent events for cleanup\n return { result, sentEvents: events };\n },\n this.maxRetries,\n this.retryDelay\n );\n }\n\n /**\n * Unload-safe best-effort send. Uses `fetch({ keepalive: true })` so the browser\n * can continue sending even when the page is unloading (redirect / close / refresh).\n *\n * Note: keepalive requests are size-limited by browsers (typically ~64KB).\n */\n async sendEventsKeepalive(events: EventData[]): Promise<void> {\n if (events.length === 0) {\n return;\n }\n\n const transformedEvents = events.map((event) => ({\n event_id: event.event_id,\n event_type: event.event_type,\n anonymous_id: event.anonymous_id,\n tracking_user_id: event.tracking_user_id,\n utm_source: event.utm_source || null,\n utm_medium: event.utm_medium || null,\n utm_campaign: event.utm_campaign || null,\n utm_term: event.utm_term || null,\n utm_content: event.utm_content || null,\n revenue: event.revenue || null,\n currency: event.currency || null,\n event_data: event.event_data || null,\n context: event.context || null,\n timestamp: event.timestamp || getTimestamp(),\n custom_event_name: event.custom_event_name || undefined,\n }));\n\n const batchRequest: BatchEventRequest = {\n events: transformedEvents,\n sdk_version: SDK_VERSION,\n };\n\n const response = await fetch(`${this.apiEndpoint}/attribution/events`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(batchRequest),\n keepalive: true,\n });\n\n if (!response.ok) {\n // Best-effort: do not throw an unreadable body during unload.\n throw new Error(`HTTP ${response.status}`);\n }\n }\n\n /**\n * Unload-safe beacon send.\n *\n * Why: cross-origin `fetch` with Authorization/JSON often triggers preflight, which is frequently\n * canceled during unload/redirect. Beacon avoids preflight by not using custom headers.\n *\n * Requires backend to accept api_key via query param and `text/plain` body.\n */\n sendEventsBeacon(events: EventData[]): boolean {\n if (events.length === 0) {\n return true;\n }\n\n if (\n typeof navigator === \"undefined\" ||\n typeof navigator.sendBeacon !== \"function\"\n ) {\n return false;\n }\n\n const transformedEvents = events.map((event) => ({\n event_id: event.event_id,\n event_type: event.event_type,\n anonymous_id: event.anonymous_id,\n tracking_user_id: event.tracking_user_id,\n utm_source: event.utm_source || null,\n utm_medium: event.utm_medium || null,\n utm_campaign: event.utm_campaign || null,\n utm_term: event.utm_term || null,\n utm_content: event.utm_content || null,\n revenue: event.revenue || null,\n currency: event.currency || null,\n event_data: event.event_data || null,\n context: event.context || null,\n timestamp: event.timestamp || getTimestamp(),\n custom_event_name: event.custom_event_name || undefined,\n }));\n\n const payload: BatchEventRequest = {\n events: transformedEvents,\n sdk_version: SDK_VERSION,\n };\n\n const url = `${\n this.apiEndpoint\n }/attribution/events_beacon?api_key=${encodeURIComponent(this.apiKey)}`;\n\n // Use text/plain to keep it \"simple\" and avoid preflight.\n const blob = new Blob([JSON.stringify(payload)], { type: \"text/plain\" });\n return navigator.sendBeacon(url, blob);\n }\n\n async sendSingleEvent(event: EventData): Promise<void> {\n await this.sendEvents([event]);\n }\n\n // Test connection\n async testConnection(): Promise<boolean> {\n try {\n const response = await fetch(`${this.apiEndpoint}/health`, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n return response.ok;\n } catch (error) {\n this.logger.error(\"Connection test failed:\", error);\n return false;\n }\n }\n}\n\n// Memory queue fallback\nexport class MemoryQueueManager implements QueueInterface {\n private queue: EventData[] = [];\n private maxSize: number;\n private logger: LoggerInterface;\n\n constructor(logger: LoggerInterface, maxSize: number = 1000) {\n this.logger = logger;\n this.maxSize = maxSize;\n }\n\n add(event: EventData): void {\n if (this.queue.length >= this.maxSize) {\n this.logger.warn(\"Memory queue full, removing oldest event\");\n this.queue.shift();\n }\n\n this.queue.push(event);\n this.logger.debug(`Event added to memory queue: ${event.event_type}`);\n }\n\n async process(): Promise<void> {\n // Memory queue doesn't process automatically\n // Events are stored in memory only\n this.logger.debug(\"Memory queue process called (no-op)\");\n }\n\n clear(): void {\n this.queue = [];\n this.logger.info(\"Memory queue cleared\");\n }\n\n size(): number {\n return this.queue.length;\n }\n\n // Get all events from memory queue\n getAllEvents(): EventData[] {\n return [...this.queue];\n }\n\n // Remove events from memory queue\n removeEvents(eventIds: string[]): void {\n this.queue = this.queue.filter(\n (event) => !eventIds.includes(event.event_id)\n );\n }\n}\n","// Root domain detection for cross-subdomain cookie sharing.\n//\n// Writes a probe cookie at progressively shorter hostname suffixes and checks\n// whether the browser accepted it. The browser rejects writes to public\n// suffixes (e.g. \".com\", \".co.uk\", \".github.io\"), so this naturally finds the\n// highest-level parent domain we're allowed to set cookies on — without\n// shipping a Public Suffix List.\n\nconst PROBE_NAME = \"__getuai_probe\";\n\nfunction isIpLiteral(hostname: string): boolean {\n // IPv4\n if (/^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(hostname)) return true;\n // IPv6 (bracketed or bare)\n if (hostname.includes(\":\")) return true;\n return false;\n}\n\nfunction hasDocumentCookieAccess(): boolean {\n try {\n return typeof document !== \"undefined\" && typeof document.cookie === \"string\";\n } catch {\n return false;\n }\n}\n\nfunction writeProbe(domain: string): boolean {\n try {\n document.cookie = `${PROBE_NAME}=1;domain=${domain};path=/;SameSite=Lax`;\n const found = document.cookie\n .split(\";\")\n .some((c) => c.trim().startsWith(`${PROBE_NAME}=`));\n if (found) {\n // Clean up the probe regardless of outcome\n document.cookie = `${PROBE_NAME}=;domain=${domain};path=/;expires=Thu, 01 Jan 1970 00:00:00 GMT`;\n }\n return found;\n } catch {\n return false;\n }\n}\n\n/**\n * Detect the broadest domain that cookies can be written to for the current\n * hostname. Returns a value suitable for the Cookie `domain` attribute\n * (leading dot, e.g. \".example.com\"), or null when cross-subdomain sharing is\n * not possible (localhost, IP literals, sandboxed environments).\n */\nexport function detectCookieDomain(): string | null {\n if (!hasDocumentCookieAccess()) return null;\n\n const hostname = (typeof location !== \"undefined\" && location.hostname) || \"\";\n if (!hostname) return null;\n if (hostname === \"localhost\") return null;\n if (isIpLiteral(hostname)) return null;\n\n const parts = hostname.split(\".\").filter(Boolean);\n if (parts.length < 2) return null; // single-label host, no parent to share with\n\n // Walk from the broadest valid candidate (2 labels, e.g. \".example.com\")\n // toward the full hostname. The first one the browser accepts is the\n // eTLD+1 — the broadest scope we can share cookies on.\n for (let i = parts.length - 2; i >= 0; i--) {\n const candidate = \".\" + parts.slice(i).join(\".\");\n if (writeProbe(candidate)) return candidate;\n }\n\n return null;\n}\n\n/**\n * Normalise a user-supplied domain config value. Accepts \"example.com\" or\n * \".example.com\"; always returns the leading-dot form for consistency with the\n * auto-detected value.\n */\nexport function normaliseDomain(input: string | undefined | null): string | null {\n if (!input) return null;\n const trimmed = input.trim();\n if (!trimmed) return null;\n return trimmed.startsWith(\".\") ? trimmed : \".\" + trimmed;\n}\n","import {\n SDKConfig,\n EventData,\n EventType,\n AttributionData,\n UTMData,\n Currency,\n UserSession,\n IMMEDIATE_EVENTS,\n defaultEndpoint,\n UserTraits,\n DEFAULT_FIELD_MAPPINGS,\n} from \"../types\";\nimport { AttributionStorageManager } from \"../storage\";\nimport { EventQueueManager, EventHttpClient } from \"../queue\";\nimport {\n generateId,\n getTimestamp,\n extractUTMParams,\n extractAdParams,\n detectDevice,\n getCurrentUrl,\n getReferrer,\n getUserAgent,\n getPageTitle,\n generateSessionId,\n isOnline,\n ConsoleLogger,\n addUTMToURL,\n shouldExcludeDomain,\n isExternalURL,\n filterUTMParams,\n cleanURL,\n getQueryString,\n getQueryParams,\n} from \"../utils\";\nimport {\n detectCookieDomain,\n normaliseDomain,\n} from \"../utils/rootDomain\";\n\nexport class AttributionSDK {\n private config: SDKConfig;\n private logger: ConsoleLogger;\n private storage: AttributionStorageManager;\n private httpClient: EventHttpClient;\n private queue: EventQueueManager;\n private session: UserSession | null = null;\n private initialized: boolean = false;\n private autoTrackEnabled: boolean = false;\n private pageViewTrackTimes: Map<string, number> = new Map();\n private cachedPublicIP: string | null = null;\n private publicIPFetchPromise: Promise<string | null> | null = null;\n private initialPageViewTriggered: boolean = false;\n // SPA tracking internals\n private spaTrackingEnabled: boolean = false;\n private lastTrackedPath: string = \"\";\n private originalPushState: typeof history.pushState | null = null;\n private originalReplaceState: typeof history.replaceState | null = null;\n private popstateHandler: ((event: PopStateEvent) => void) | null = null;\n\n constructor(config: SDKConfig) {\n this.config = {\n apiEndpoint: defaultEndpoint,\n batchSize: 100,\n batchInterval: 2000,\n maxRetries: 3,\n retryDelay: 1000,\n enableDebug: false,\n autoTrack: false,\n autoTrackPageView: false,\n sessionTimeout: 30 * 60 * 1000, // 30 minutes\n enableCrossDomainUTM: true,\n crossDomainUTMParams: [\n \"utm_source\",\n \"utm_medium\",\n \"utm_campaign\",\n \"utm_term\",\n \"utm_content\",\n ],\n excludeDomains: [],\n autoCleanUTM: true,\n pageViewDebounceInterval: 5000, // 5 seconds default\n ...config,\n };\n\n this.logger = new ConsoleLogger(this.config.enableDebug);\n this.storage = new AttributionStorageManager(this.logger);\n this.httpClient = new EventHttpClient(\n this.logger,\n this.config.apiKey,\n this.config.apiEndpoint || defaultEndpoint,\n this.config.maxRetries,\n this.config.retryDelay\n );\n\n this.queue = new EventQueueManager(\n this.logger,\n this.config.apiKey,\n this.config.apiEndpoint || defaultEndpoint,\n this.config.batchSize,\n this.config.batchInterval,\n this.config.maxRetries,\n this.config.retryDelay,\n (events) => this.httpClient.sendEvents(events)\n );\n }\n\n async init(): Promise<void> {\n if (this.initialized) {\n this.logger.warn(\"SDK already initialized\");\n return;\n }\n\n try {\n this.logger.info(\"Initializing GetuAI Attribution SDK\");\n\n // Resolve cross-subdomain cookie domain BEFORE any storage read/write\n // so session/user_id/attribution cookies land on the right scope from\n // the very first call. Explicit config wins; otherwise probe-detect.\n const resolvedDomain =\n normaliseDomain(this.config.domain) ??\n detectCookieDomain();\n this.storage.setCookieDomain(resolvedDomain);\n\n // Initialize storage in background (IndexedDB failure should not block SDK initialization)\n void this.storage.init().catch((storageError) => {\n this.logger.warn(\n \"Storage initialization failed (IndexedDB may be unavailable), continuing with basic features:\",\n storageError\n );\n });\n\n // Best-effort: upgrade any legacy single-origin state to the new\n // cross-subdomain cookies so upgraded sites don't lose their session.\n try {\n this.storage.migrateLegacyStorage();\n } catch (migrationError) {\n this.logger.debug(\"Legacy storage migration skipped:\", migrationError);\n }\n\n // Initialize user ID (from config or existing storage)\n this.initializeUserId();\n\n // Initialize session\n this.initializeSession();\n\n // Extract and store UTM data from current URL\n this.extractAndStoreUTMData();\n\n // Setup auto-tracking if enabled\n if (this.config.autoTrack) {\n this.setupAutoTracking();\n }\n\n // Setup online/offline handlers\n this.setupNetworkHandlers();\n\n // Setup page visibility handlers\n this.setupVisibilityHandlers();\n\n // Setup beforeunload handler\n this.setupBeforeUnloadHandler();\n\n // Mark initialized as early as possible so auto page view can be queued\n this.initialized = true;\n this.logger.info(\"🚀 GetuAI Attribution SDK initialized successfully\");\n this.logger.info(\n \"📄 Auto track page view = \" + this.config.autoTrackPageView\n );\n\n // Best-effort: retry pending events from last unload/redirect (do not block init)\n void this.retryPendingEvents().catch((error) => {\n this.logger.warn(\"⚠️ Pending events retry failed\", error);\n });\n\n // Auto track page view if enabled (independent from autoTrack)\n // Also enables SPA route tracking automatically\n if (this.config.autoTrackPageView) {\n this.logger.info(\n \"📄 Auto track page view enabled (including SPA route tracking)\"\n );\n // Record the initial path for SPA tracking\n this.lastTrackedPath = this.getCurrentPath();\n\n // Setup SPA tracking for route changes\n this.setupSPATracking();\n\n // Fire ASAP (microtask) to survive short redirects (e.g. 50ms)\n if (!this.initialPageViewTriggered) {\n this.initialPageViewTriggered = true;\n Promise.resolve()\n .then(() => this.trackPageView())\n .then(() => this.queue.process())\n .then(() => {\n this.logger.info(\"✅ Auto track page view completed\");\n })\n .catch((error) =>\n this.logger.error(\"❌ Auto track page view failed:\", error)\n );\n }\n }\n } catch (error) {\n this.logger.error(\"Failed to initialize SDK:\", error);\n throw error;\n }\n }\n\n // Track event (internal: custom_event_name is the 6th param, only used for CUSTOM type)\n async trackEvent(\n eventType: EventType,\n eventData?: Record<string, any>,\n tracking_user_id?: string,\n revenue?: number,\n currency: Currency = Currency.USD,\n custom_event_name?: string\n ): Promise<void> {\n if (!this.initialized) {\n this.logger.warn(\"SDK not initialized, event not tracked\");\n return;\n }\n\n try {\n const currentUrl = getCurrentUrl();\n // Use cached public IP (best-effort). Do not block tracking on network.\n const ip_address: string | null = this.cachedPublicIP;\n this.ensurePublicIPFetched();\n\n const pageContext = {\n domain: typeof window !== \"undefined\" ? window.location.hostname : null,\n path: typeof window !== \"undefined\" ? window.location.pathname : null,\n title: getPageTitle(),\n referrer: getReferrer(),\n url: currentUrl.split(\"?\")[0],\n querystring: getQueryString(currentUrl),\n query_params: getQueryParams(currentUrl),\n ip_address: ip_address,\n };\n const sessionContext = {\n session_id: this.session?.sessionId,\n start_time: this.session?.startTime,\n last_activity: this.session?.lastActivity,\n page_views: this.session?.pageViews,\n };\n // Use provided tracking_user_id or fallback to stored user ID\n const anonymousId = this.storage.getAnonymousId();\n const finalUserId = tracking_user_id || this.getUserId();\n\n const event: EventData = {\n event_id: generateId(),\n event_type: eventType,\n anonymous_id: anonymousId,\n tracking_user_id: finalUserId || undefined,\n timestamp: getTimestamp(),\n event_data: eventData,\n context: { page: pageContext, session: sessionContext },\n revenue: revenue,\n currency: currency,\n ...(eventType === EventType.CUSTOM && custom_event_name\n ? { custom_event_name }\n : {}),\n ...this.getUTMParams(),\n device: detectDevice(),\n ...this.getAdParams(),\n };\n\n this.logger.debug(`Tracking event: ${eventType}`, event);\n\n // Add to queue\n this.queue.add(event);\n } catch (error) {\n this.logger.error(`Failed to track event ${eventType}:`, error);\n }\n }\n\n // Track custom event\n async trackCustomEvent(\n customEventName: string,\n eventData?: Record<string, any>,\n tracking_user_id?: string,\n revenue?: number,\n currency: Currency = Currency.USD\n ): Promise<void> {\n if (!customEventName || customEventName.trim() === \"\") {\n this.logger.error(\"trackCustomEvent requires a non-empty customEventName\");\n return;\n }\n await this.trackEvent(\n EventType.CUSTOM,\n eventData,\n tracking_user_id,\n revenue,\n currency,\n customEventName.trim()\n );\n }\n\n // Track page view\n async trackPageView(\n pageData?: Record<string, any>,\n tracking_user_id?: string\n ): Promise<void> {\n const currentUrl = getCurrentUrl();\n // Use URL without query string as key for debouncing\n const pageKey = currentUrl.split(\"?\")[0];\n const now = Date.now();\n const debounceInterval = this.config.pageViewDebounceInterval || 5000;\n\n // Check if this page was tracked recently\n const lastTrackTime = this.pageViewTrackTimes.get(pageKey);\n if (lastTrackTime && now - lastTrackTime < debounceInterval) {\n this.logger.debug(\n `Page view debounced: ${pageKey} (last tracked ${\n now - lastTrackTime\n }ms ago)`\n );\n return;\n }\n\n const pageEventData = {\n url: currentUrl,\n title: getPageTitle(),\n referrer: getReferrer(),\n user_agent: getUserAgent(),\n ...pageData,\n };\n\n await this.trackEvent(EventType.PAGE_VIEW, pageEventData, tracking_user_id);\n\n // Update last track time for this page\n this.pageViewTrackTimes.set(pageKey, now);\n\n // Clean up old entries to prevent memory leak (keep only entries from last hour)\n this.cleanupPageViewTrackTimes();\n }\n\n // Clean up old page view track times to prevent memory leak\n private cleanupPageViewTrackTimes(): void {\n const oneHourAgo = Date.now() - 60 * 60 * 1000;\n for (const [pageKey, trackTime] of this.pageViewTrackTimes.entries()) {\n if (trackTime < oneHourAgo) {\n this.pageViewTrackTimes.delete(pageKey);\n }\n }\n }\n\n private ensurePublicIPFetched(): void {\n if (this.cachedPublicIP || this.publicIPFetchPromise) {\n return;\n }\n\n this.publicIPFetchPromise = this.fetchPublicIP()\n .then((ip) => {\n if (ip) {\n this.cachedPublicIP = ip;\n }\n return ip;\n })\n .catch(() => null)\n .finally(() => {\n this.publicIPFetchPromise = null;\n });\n }\n\n // Best-effort fetch of public IP address\n private async fetchPublicIP(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 2000);\n const response = await fetch(\"https://api.ipify.org?format=json\", {\n signal: controller.signal,\n headers: { Accept: \"application/json\" },\n });\n clearTimeout(timeout);\n if (!response.ok) {\n return null;\n }\n const data = await response.json();\n const ip = typeof data?.ip === \"string\" ? data.ip : null;\n return ip;\n } catch (error) {\n this.logger.debug(\"Public IP fetch failed\", error);\n return null;\n }\n }\n\n // Track purchase\n async trackPurchase(\n tracking_user_id: string,\n revenue: number,\n currency: Currency = Currency.USD,\n purchaseData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(\n EventType.PURCHASE,\n purchaseData,\n tracking_user_id,\n revenue,\n currency\n );\n }\n\n // Track login\n async trackLogin(\n tracking_user_id: string,\n loginData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(EventType.LOGIN, loginData, tracking_user_id);\n }\n\n // Track signup\n async trackSignup(\n tracking_user_id: string,\n signupData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(EventType.SIGNUP, signupData, tracking_user_id);\n }\n\n // Track form submission\n async trackFormSubmit(\n tracking_user_id?: string,\n formData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(EventType.FORM_SUBMIT, formData, tracking_user_id);\n }\n\n // Track video play\n async trackVideoPlay(\n tracking_user_id?: string,\n videoData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(EventType.VIDEO_PLAY, videoData, tracking_user_id);\n }\n\n // Track email verification\n async trackEmailVerification(\n tracking_user_id: string,\n verificationData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(\n EventType.EMAIL_VERIFICATION,\n verificationData,\n tracking_user_id\n );\n }\n\n // Track audit approved (conversion)\n async trackAuditApproved(\n tracking_user_id: string,\n auditData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(\n EventType.AUDIT_APPROVED,\n auditData,\n tracking_user_id\n );\n }\n\n // Track purchase with auto user ID (object parameter format)\n async trackPurchaseAuto(options: {\n revenue: number;\n currency?: Currency;\n purchaseData?: Record<string, any>;\n tracking_user_id?: string;\n }): Promise<void> {\n const userId = options.tracking_user_id || this.getUserId();\n if (!userId) {\n this.logger.error(\n \"❌ trackPurchaseAuto requires tracking_user_id. Please set user ID using setUserId() or pass it in options.tracking_user_id.\"\n );\n return;\n }\n await this.trackEvent(\n EventType.PURCHASE,\n options.purchaseData,\n userId,\n options.revenue,\n options.currency || Currency.USD\n );\n }\n\n // Track login with auto user ID (object parameter format)\n async trackLoginAuto(options: {\n loginData?: Record<string, any>;\n tracking_user_id?: string;\n }): Promise<void> {\n const userId = options.tracking_user_id || this.getUserId();\n if (!userId) {\n this.logger.error(\n \"❌ trackLoginAuto requires tracking_user_id. Please set user ID using setUserId() or pass it in options.tracking_user_id.\"\n );\n return;\n }\n await this.trackEvent(EventType.LOGIN, options.loginData, userId);\n }\n\n // Track signup with auto user ID (object parameter format)\n async trackSignupAuto(options: {\n signupData?: Record<string, any>;\n tracking_user_id?: string;\n }): Promise<void> {\n const userId = options.tracking_user_id || this.getUserId();\n if (!userId) {\n this.logger.error(\n \"❌ trackSignupAuto requires tracking_user_id. Please set user ID using setUserId() or pass it in options.tracking_user_id.\"\n );\n return;\n }\n await this.trackEvent(EventType.SIGNUP, options.signupData, userId);\n }\n\n // Track email verification with auto user ID (object parameter format)\n async trackEmailVerificationAuto(options: {\n verificationData?: Record<string, any>;\n tracking_user_id?: string;\n }): Promise<void> {\n const userId = options.tracking_user_id || this.getUserId();\n if (!userId) {\n this.logger.error(\n \"❌ trackEmailVerificationAuto requires tracking_user_id. Please set user ID using setUserId() or pass it in options.tracking_user_id.\"\n );\n return;\n }\n await this.trackEvent(\n EventType.EMAIL_VERIFICATION,\n options.verificationData,\n userId\n );\n }\n\n // Track product view\n async trackProductView(\n tracking_user_id?: string,\n productData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(\n EventType.PRODUCT_VIEW,\n productData,\n tracking_user_id\n );\n }\n\n // Track add to cart\n async trackAddToCart(\n tracking_user_id?: string,\n cartData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(EventType.ADD_TO_CART, cartData, tracking_user_id);\n }\n\n // Track page click for user click journey\n async trackPageClick(\n tracking_user_id?: string,\n clickData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(EventType.PAGE_CLICK, clickData, tracking_user_id);\n }\n\n // Track button click\n async trackButtonClick(\n buttonName?: string,\n tracking_user_id?: string,\n clickData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(\n EventType.BUTTON_CLICK,\n { button_name: buttonName, ...clickData },\n tracking_user_id\n );\n }\n\n // Get attribution data\n getAttributionData(): AttributionData | null {\n return this.storage.getUTMData();\n }\n\n // Manually add UTM parameters to a URL\n addUTMToURL(url: string): string {\n if (!this.config.enableCrossDomainUTM) {\n return url;\n }\n\n const attributionData = this.getAttributionData();\n if (!attributionData) {\n return url;\n }\n\n const utmParams = filterUTMParams(\n attributionData.lastTouch,\n this.config.crossDomainUTMParams\n );\n\n return addUTMToURL(url, utmParams);\n }\n\n // Get current UTM parameters as object\n getCurrentUTMParams(): Record<string, string> {\n const attributionData = this.getAttributionData();\n if (!attributionData) {\n return {};\n }\n\n return filterUTMParams(\n attributionData.lastTouch,\n this.config.crossDomainUTMParams\n );\n }\n\n // Get UTM parameters for events\n private getUTMParams(): Partial<UTMData> {\n const attributionData = this.getAttributionData();\n if (!attributionData) {\n this.logger.debug(\"No attribution data available for UTM params\");\n return {};\n }\n\n const utmParams = {\n utm_source: attributionData.lastTouch.utm_source || null,\n utm_medium: attributionData.lastTouch.utm_medium || null,\n utm_campaign: attributionData.lastTouch.utm_campaign || null,\n utm_term: attributionData.lastTouch.utm_term || null,\n utm_content: attributionData.lastTouch.utm_content || null,\n };\n\n // Filter out empty values and return null for empty strings\n const filteredParams: Partial<UTMData> = {};\n if (utmParams.utm_source && utmParams.utm_source.trim() !== \"\") {\n filteredParams.utm_source = utmParams.utm_source;\n } else {\n filteredParams.utm_source = null;\n }\n if (utmParams.utm_medium && utmParams.utm_medium.trim() !== \"\") {\n filteredParams.utm_medium = utmParams.utm_medium;\n } else {\n filteredParams.utm_medium = null;\n }\n if (utmParams.utm_campaign && utmParams.utm_campaign.trim() !== \"\") {\n filteredParams.utm_campaign = utmParams.utm_campaign;\n } else {\n filteredParams.utm_campaign = null;\n }\n if (utmParams.utm_term && utmParams.utm_term.trim() !== \"\") {\n filteredParams.utm_term = utmParams.utm_term;\n } else {\n filteredParams.utm_term = null;\n }\n if (utmParams.utm_content && utmParams.utm_content.trim() !== \"\") {\n filteredParams.utm_content = utmParams.utm_content;\n } else {\n filteredParams.utm_content = null;\n }\n\n this.logger.debug(\"UTM params for event:\", filteredParams);\n return filteredParams;\n }\n\n // Get ad-platform tracking params (adgroup_id, ad_id, click_id) from stored\n // last-touch attribution data. These flow alongside UTM params and are\n // captured from ad platform click URLs (Google Ads, Meta, TikTok, etc.).\n private getAdParams(): {\n adgroup_id?: string | null;\n ad_id?: string | null;\n adgroup_id_source?: string | null;\n ad_id_source?: string | null;\n click_id?: string | null;\n click_id_source?: string | null;\n } {\n const attributionData = this.getAttributionData();\n if (!attributionData) {\n return {};\n }\n const last = attributionData.lastTouch;\n const nonEmpty = (v?: string | null) =>\n v && typeof v === \"string\" && v.trim() !== \"\" ? v : null;\n return {\n adgroup_id: nonEmpty(last.adgroup_id),\n ad_id: nonEmpty(last.ad_id),\n adgroup_id_source: nonEmpty(last.adgroup_id_source),\n ad_id_source: nonEmpty(last.ad_id_source),\n click_id: nonEmpty(last.click_id),\n click_id_source: nonEmpty(last.click_id_source),\n };\n }\n\n // Initialize user ID\n private initializeUserId(): void {\n // If userId is provided in config, set it (will override existing)\n if (this.config.userId) {\n this.setUserId(this.config.userId);\n this.logger.info(\n `👤 User ID initialized from config: ${this.config.userId}`\n );\n } else {\n // Check if user ID already exists in storage\n const existingUserId = this.getUserId();\n if (existingUserId) {\n this.logger.debug(`👤 Existing user ID found: ${existingUserId}`);\n } else {\n this.logger.debug(\n \"👤 No user ID found, will be set when user identifies\"\n );\n }\n }\n }\n\n // Set user ID — handles Case X (account switch) by rotating anonymous_id +\n // session_id. Anonymous → identified is idempotent on anonymous_id.\n setUserId(userId: string): void {\n if (!userId || userId.trim() === \"\") {\n this.logger.warn(\"Cannot set empty user ID\");\n return;\n }\n\n const trimmed = userId.trim();\n const prevUserId = this.storage.getUserId();\n\n // Idempotent: same user already set.\n if (prevUserId === trimmed) {\n return;\n }\n\n // Case X — distinct previous user means account switch on the same device.\n // Rotate anonymous_id so the new user's events are not stitched onto the\n // previous user's visitor identity.\n if (prevUserId && prevUserId !== trimmed) {\n this.logger.info(\n `👥 User changed (${prevUserId} → ${trimmed}) — rotating anonymous_id + session`\n );\n this.storage.rotateAnonymousId();\n }\n\n this.storage.setUserId(trimmed);\n\n // Bind this user to the current session. If the session was already\n // owned by a *different* non-empty user, force a session rotation\n // — distinct users' activity must not share the same session_id.\n if (this.session) {\n const sessionPrevUserId = this.session.userId;\n if (sessionPrevUserId && sessionPrevUserId !== trimmed) {\n this.logger.info(\n `🔄 Session previously owned by ${sessionPrevUserId} — rotating session for ${trimmed}`\n );\n this.rotateSession(trimmed);\n } else if (sessionPrevUserId !== trimmed) {\n // Anonymous session learning the user's id — attach, no rotation.\n this.session = { ...this.session, userId: trimmed };\n this.storage.storeSession(this.session);\n }\n }\n\n this.logger.info(`👤 User ID set: ${trimmed}`);\n }\n\n // Start a fresh session; used when the current session's owner user_id\n // changes. Preserves no state from the previous session on purpose.\n private rotateSession(userId?: string): void {\n const now = Date.now();\n this.session = {\n sessionId: generateSessionId(),\n startTime: now,\n lastActivity: now,\n pageViews: 0,\n userId,\n };\n this.storage.storeSession(this.session);\n }\n\n // Get user ID\n getUserId(): string | null {\n return this.storage.getUserId();\n }\n\n // Get the SDK's persistent anonymous_id (creates one on first access).\n getAnonymousId(): string {\n return this.storage.getAnonymousId();\n }\n\n // Remove user ID\n removeUserId(): void {\n this.storage.removeUserId();\n this.logger.info(\"👤 User ID removed\");\n }\n\n /**\n * Identify user and set user attributes\n * Used to explicitly set user information, e.g., after login\n *\n * @param userId User unique identifier\n * @param traits User attributes\n *\n * @example\n * sdk.identify('user-123', {\n * email: 'user@example.com',\n * name: 'John Doe',\n * company_name: 'Acme Inc'\n * });\n */\n async identify(userId: string, traits?: UserTraits): Promise<void> {\n if (!this.initialized) {\n this.logger.warn(\"SDK not initialized, identify call queued\");\n return;\n }\n\n if (!userId || userId.trim() === \"\") {\n this.logger.warn(\"Cannot identify with empty user ID\");\n return;\n }\n\n // Set user ID\n this.setUserId(userId);\n\n // Store user traits\n if (traits) {\n this.storage.setUserTraits(traits);\n this.logger.info(`User identified: ${userId}`, traits);\n }\n\n // Send identify event to backend\n await this.trackEvent(\n EventType.FORM_SUBMIT,\n {\n _identify: true,\n _user_traits: traits,\n tracking_user_id: userId,\n },\n userId\n );\n }\n\n /**\n * Get current user traits\n */\n getUserTraits(): UserTraits | null {\n return this.storage.getUserTraits();\n }\n\n /**\n * Get current session ID\n */\n getSessionId(): string | null {\n return this.session?.sessionId || null;\n }\n\n // Initialize user session\n private initializeSession(): void {\n const existingSession = this.storage.getSession();\n const now = Date.now();\n const currentUserId = this.storage.getUserId() ?? undefined;\n\n const withinTimeout =\n existingSession &&\n now - existingSession.lastActivity < this.config.sessionTimeout!;\n\n // If the existing session was bound to a *different* non-empty user\n // than the currently active one, it belongs to someone else — don't\n // extend it. Anonymous → known is still fine (existingSession.userId\n // unset), so backend backfill keeps working.\n const ownerMismatch =\n !!(existingSession?.userId &&\n currentUserId &&\n existingSession.userId !== currentUserId);\n\n if (withinTimeout && !ownerMismatch) {\n // Extend existing session; attach current user id if the session\n // was anonymous until now.\n this.session = {\n ...existingSession,\n lastActivity: now,\n userId: existingSession.userId ?? currentUserId,\n };\n } else {\n if (ownerMismatch) {\n this.logger.info(\n `🔄 Session owner changed (${existingSession?.userId} → ${currentUserId}) — starting new session`\n );\n }\n this.session = {\n sessionId: generateSessionId(),\n startTime: now,\n lastActivity: now,\n pageViews: 0,\n userId: currentUserId,\n };\n }\n\n this.storage.storeSession(this.session);\n this.logger.debug(\"Session initialized:\", this.session);\n }\n\n // Extract and store UTM data from current URL\n private extractAndStoreUTMData(): void {\n const currentUrl = getCurrentUrl();\n const utmParams = extractUTMParams(currentUrl);\n const adParams = extractAdParams(currentUrl);\n\n this.logger.debug(\"Extracting UTM params from URL:\", currentUrl);\n this.logger.debug(\"Found UTM params:\", utmParams);\n this.logger.debug(\"Found ad params:\", adParams);\n\n // Capture if UTM, ad IDs, or click IDs are present\n if (\n Object.keys(utmParams).length === 0 &&\n !adParams.adgroup_id &&\n !adParams.ad_id &&\n !adParams.click_id\n ) {\n this.logger.debug(\"No UTM, ad, or click parameters found in URL\");\n return;\n }\n\n const utmData: UTMData = {\n utm_source: utmParams.utm_source || \"\",\n utm_medium: utmParams.utm_medium || \"\",\n utm_campaign: utmParams.utm_campaign || \"\",\n utm_term: utmParams.utm_term || \"\",\n utm_content: utmParams.utm_content || \"\",\n adgroup_id: adParams.adgroup_id || \"\",\n ad_id: adParams.ad_id || \"\",\n adgroup_id_source: adParams.adgroup_id_source || \"\",\n ad_id_source: adParams.ad_id_source || \"\",\n click_id: adParams.click_id || \"\",\n click_id_source: adParams.click_id_source || \"\",\n timestamp: Date.now(),\n };\n\n const existingData = this.getAttributionData();\n const newData: AttributionData = {\n firstTouch: existingData?.firstTouch || utmData,\n lastTouch: utmData,\n touchpoints: existingData?.touchpoints || [],\n expiresAt: Date.now() + 30 * 24 * 60 * 60 * 1000, // 30 days\n };\n\n // Add to touchpoints if different from last touch\n if (\n !existingData ||\n existingData.lastTouch.utm_source !== utmData.utm_source ||\n existingData.lastTouch.utm_campaign !== utmData.utm_campaign\n ) {\n newData.touchpoints.push(utmData);\n }\n\n this.storage.storeUTMData(newData);\n this.logger.info(\"UTM data extracted and stored successfully:\", utmData);\n\n // Clean URL after storing UTM data to avoid displaying parameters in plain text\n if (this.config.autoCleanUTM) {\n cleanURL();\n }\n }\n\n // Setup auto-tracking\n private setupAutoTracking(): void {\n this.autoTrackEnabled = true;\n\n // Track form interactions\n this.setupFormTracking();\n\n // Track link clicks\n this.setupLinkTracking();\n\n this.logger.info(\"Auto-tracking enabled\");\n }\n\n // Setup form tracking\n private setupFormTracking(): void {\n document.addEventListener(\"submit\", (event) => {\n try {\n const form = event.target as HTMLFormElement;\n if (!form) {\n return;\n }\n\n const fieldValues = this.serializeFormFields(form);\n\n // Extract standardized lead fields\n const leadFields = this.extractLeadFields(fieldValues);\n\n // If email is extracted, automatically store user traits\n if (leadFields.email) {\n this.storage.setUserTraits(leadFields);\n this.logger.debug(\"Lead fields extracted from form:\", leadFields);\n }\n\n this.trackEvent(EventType.FORM_SUBMIT, {\n ...fieldValues,\n // Add standardized lead fields\n _lead_fields: leadFields,\n form_id: form.id || form.name,\n form_action: form.action,\n form_method: form.method,\n });\n } catch (error) {\n this.logger.error(\"Failed to auto-track form submit:\", error);\n }\n });\n }\n\n // Serialize all fields within a form to a flat key-value map\n private serializeFormFields(form: HTMLFormElement): Record<string, any> {\n const result: Record<string, any> = {};\n\n try {\n const formData = new FormData(form);\n // Accumulate multiple values for the same name as arrays\n for (const [name, value] of formData.entries()) {\n const serializedValue = this.serializeFormValue(value);\n\n if (Object.prototype.hasOwnProperty.call(result, name)) {\n const existing = result[name];\n if (Array.isArray(existing)) {\n existing.push(serializedValue);\n result[name] = existing;\n } else {\n result[name] = [existing, serializedValue];\n }\n } else {\n result[name] = serializedValue;\n }\n }\n\n // Ensure all fields are represented, including unchecked radios/checkboxes.\n // For fields without name attribute, use a stable fallback key (id/aria-label/placeholder/index).\n const elements = Array.from(form.elements) as Array<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >;\n\n // Group elements by key\n const nameToElements = new Map<\n string,\n Array<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>\n >();\n for (let index = 0; index < elements.length; index++) {\n const el = elements[index];\n if ((el as any).disabled) continue;\n\n const tagName = el.tagName.toLowerCase();\n const inputType = (el as HTMLInputElement).type?.toLowerCase();\n if (\n tagName === \"button\" ||\n inputType === \"submit\" ||\n inputType === \"reset\"\n ) {\n continue;\n }\n\n const fieldKey = this.getFormFieldKey(el, index);\n if (!fieldKey) {\n continue;\n }\n\n if (!nameToElements.has(fieldKey)) nameToElements.set(fieldKey, []);\n nameToElements.get(fieldKey)!.push(el);\n }\n\n nameToElements.forEach((els, name) => {\n // Determine the dominant type for a group (radio/checkbox take precedence)\n const hasRadio = els.some(\n (e) => (e as HTMLInputElement).type === \"radio\"\n );\n const hasCheckbox = els.some(\n (e) => (e as HTMLInputElement).type === \"checkbox\"\n );\n const hasFile = els.some(\n (e) => (e as HTMLInputElement).type === \"file\"\n );\n const hasSelectMultiple = els.some(\n (e) => e.tagName === \"SELECT\" && (e as HTMLSelectElement).multiple\n );\n const hasPassword = els.some(\n (e) => (e as HTMLInputElement).type === \"password\"\n );\n\n if (hasCheckbox) {\n const checkedValues = (els as HTMLInputElement[])\n .filter((e) => e.type === \"checkbox\")\n .filter((e) => e.checked)\n .map((e) => e.value || \"on\");\n if (!Object.prototype.hasOwnProperty.call(result, name)) {\n result[name] = checkedValues; // [] when none checked\n } else if (!Array.isArray(result[name])) {\n result[name] = [result[name], ...checkedValues];\n }\n return;\n }\n\n if (hasRadio) {\n const checked = (els as HTMLInputElement[])\n .filter((e) => e.type === \"radio\")\n .find((e) => e.checked);\n if (!Object.prototype.hasOwnProperty.call(result, name)) {\n result[name] = checked ? checked.value : null;\n }\n return;\n }\n\n if (hasSelectMultiple) {\n const select = els.find(\n (e) => e.tagName === \"SELECT\" && (e as HTMLSelectElement).multiple\n ) as HTMLSelectElement | undefined;\n if (select) {\n const selectedValues = Array.from(select.selectedOptions).map(\n (opt) => opt.value\n );\n if (!Object.prototype.hasOwnProperty.call(result, name)) {\n result[name] = selectedValues; // [] when none selected\n }\n return;\n }\n }\n\n if (hasFile) {\n const input = els.find(\n (e) => (e as HTMLInputElement).type === \"file\"\n ) as HTMLInputElement | undefined;\n if (input) {\n const files = input.files ? Array.from(input.files) : [];\n if (!Object.prototype.hasOwnProperty.call(result, name)) {\n result[name] = files.map((f) => this.serializeFormValue(f));\n }\n return;\n }\n }\n\n if (hasPassword) {\n // Mask password fields\n if (Object.prototype.hasOwnProperty.call(result, name)) {\n result[name] =\n typeof result[name] === \"string\" ? \"*****\" : result[name];\n } else {\n result[name] = \"*****\";\n }\n return;\n }\n\n // For other inputs/selects/textarea, ensure at least an entry exists\n if (!Object.prototype.hasOwnProperty.call(result, name)) {\n const first = els[0] as\n | HTMLInputElement\n | HTMLSelectElement\n | HTMLTextAreaElement;\n if (first.tagName === \"SELECT\") {\n const select = first as HTMLSelectElement;\n result[name] = select.multiple\n ? Array.from(select.selectedOptions).map((o) => o.value)\n : select.value;\n } else if ((first as HTMLInputElement).type) {\n result[name] = (first as HTMLInputElement).value ?? \"\";\n } else {\n result[name] = (first as HTMLTextAreaElement).value ?? \"\";\n }\n }\n });\n } catch (error) {\n this.logger.error(\"Failed to serialize form fields:\", error);\n }\n\n return result;\n }\n\n private getFormFieldKey(\n el: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement,\n index: number\n ): string | null {\n const name = (el as HTMLInputElement | HTMLSelectElement).name;\n if (name) {\n return name;\n }\n\n if (el.id) {\n return `id_${el.id}`;\n }\n\n const ariaLabel = el.getAttribute(\"aria-label\");\n if (ariaLabel && ariaLabel.trim()) {\n return `aria_${this.normalizeFormFieldKey(ariaLabel)}`;\n }\n\n const placeholder =\n el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement\n ? el.placeholder\n : \"\";\n if (placeholder && placeholder.trim()) {\n return `ph_${this.normalizeFormFieldKey(placeholder)}_${index}`;\n }\n\n return `field_${index}`;\n }\n\n private normalizeFormFieldKey(raw: string): string {\n return raw\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, \"_\")\n .replace(/[^a-z0-9_]/g, \"\")\n .slice(0, 40);\n }\n\n // Convert FormData value to a serializable value\n private serializeFormValue(value: FormDataEntryValue): any {\n if (value instanceof File) {\n return {\n file_name: value.name,\n file_size: value.size,\n file_type: value.type,\n };\n }\n return value;\n }\n\n /**\n * Extract standardized lead fields from form data\n * @param formData Serialized form data\n * @returns Extracted user traits\n */\n private extractLeadFields(formData: Record<string, any>): UserTraits {\n const result: UserTraits = {};\n\n // Iterate through all standard field mappings\n for (const [standardField, aliases] of Object.entries(DEFAULT_FIELD_MAPPINGS)) {\n if (result[standardField]) continue; // Already found, skip\n\n // Look for matching field\n for (const alias of aliases || []) {\n const lowerAlias = alias.toLowerCase();\n\n // Search for matching key in formData\n for (const [key, value] of Object.entries(formData)) {\n if (\n key.toLowerCase() === lowerAlias ||\n key.toLowerCase().includes(lowerAlias)\n ) {\n if (value && typeof value === \"string\" && value.trim()) {\n result[standardField] = value.trim();\n break;\n }\n }\n }\n\n if (result[standardField]) break;\n }\n }\n\n // Combine first_name and last_name into name (if name is empty)\n if (!result.name && (result.first_name || result.last_name)) {\n result.name = [result.first_name, result.last_name]\n .filter(Boolean)\n .join(\" \")\n .trim();\n }\n\n return result;\n }\n\n // Setup link tracking\n private setupLinkTracking(): void {\n document.addEventListener(\"click\", (event) => {\n const target = event.target as HTMLElement;\n const link = target.closest(\"a\");\n\n if (link) {\n const href = link.href;\n const isExternal = isExternalURL(href);\n\n if (isExternal) {\n // Handle cross-domain UTM passing\n this.handleCrossDomainUTM(link, event);\n }\n }\n });\n }\n\n // Handle cross-domain UTM parameter passing\n private handleCrossDomainUTM(link: HTMLAnchorElement, event: Event): void {\n if (!this.config.enableCrossDomainUTM) {\n return;\n }\n\n const href = link.href;\n\n // Check if domain should be excluded\n if (shouldExcludeDomain(href, this.config.excludeDomains)) {\n this.logger.debug(`Domain excluded from UTM passing: ${href}`);\n return;\n }\n\n // Get current UTM data\n const attributionData = this.getAttributionData();\n if (!attributionData) {\n this.logger.debug(\"No UTM data available for cross-domain passing\");\n return;\n }\n\n // Filter UTM parameters based on configuration\n const utmParams = filterUTMParams(\n attributionData.lastTouch,\n this.config.crossDomainUTMParams\n );\n\n if (Object.keys(utmParams).length === 0) {\n this.logger.debug(\"No UTM parameters to pass\");\n return;\n }\n\n // Add UTM parameters to URL\n const enhancedURL = addUTMToURL(href, utmParams);\n\n if (enhancedURL !== href) {\n // Update the link href\n link.href = enhancedURL;\n\n this.logger.debug(\"UTM parameters added to external link:\", {\n original: href,\n enhanced: enhancedURL,\n utmParams,\n });\n\n this.logger.debug(\"Cross-domain UTM passed:\", {\n link_url: enhancedURL,\n original_url: href,\n utm_params_passed: utmParams,\n });\n }\n }\n\n // Setup network handlers\n private setupNetworkHandlers(): void {\n window.addEventListener(\"online\", () => {\n this.logger.info(\"Network connection restored\");\n this.queue.flush();\n });\n\n window.addEventListener(\"offline\", () => {\n this.logger.warn(\"Network connection lost\");\n });\n }\n\n // Setup visibility handlers\n private setupVisibilityHandlers(): void {\n document.addEventListener(\"visibilitychange\", () => {\n if (document.visibilityState === \"hidden\") {\n this.flushOnUnload(\"visibilitychange:hidden\");\n return;\n }\n if (document.visibilityState === \"visible\") {\n this.updateSessionActivity();\n }\n });\n }\n\n // Setup beforeunload handler\n private setupBeforeUnloadHandler(): void {\n window.addEventListener(\"beforeunload\", () => {\n this.flushOnUnload(\"beforeunload\");\n });\n\n // More reliable than beforeunload for modern browsers (incl. mobile)\n window.addEventListener(\"pagehide\", () => {\n this.flushOnUnload(\"pagehide\");\n });\n }\n\n private flushOnUnload(reason: string): void {\n try {\n this.updateSessionActivity();\n const pending = this.queue.drainAll();\n if (pending.length === 0) {\n return;\n }\n\n // Backup first (best-effort). If keepalive succeeds, we'll remove by id.\n this.storage.appendPendingEvents(pending);\n\n this.logger.debug(`🚚 Unload flush triggered: ${reason}`, {\n count: pending.length,\n });\n\n // Prefer beacon (avoid preflight) for redirect/unload scenarios.\n const beaconOk = this.httpClient.sendEventsBeacon(pending);\n if (beaconOk) {\n // Best-effort: remove to avoid duplicates (beacon is queued by browser).\n this.storage.removePendingEventsByIds(pending.map((e) => e.event_id));\n return;\n }\n\n const chunkSize = 20;\n for (let i = 0; i < pending.length; i += chunkSize) {\n const chunk = pending.slice(i, i + chunkSize);\n void this.httpClient\n .sendEventsKeepalive(chunk)\n .then(() => {\n this.storage.removePendingEventsByIds(chunk.map((e) => e.event_id));\n })\n .catch((error) => {\n this.logger.debug(\"Unload keepalive send failed\", error);\n });\n }\n } catch (error) {\n this.logger.debug(\"flushOnUnload failed\", error);\n }\n }\n\n private async retryPendingEvents(): Promise<void> {\n const pending = this.storage.getPendingEvents();\n if (pending.length === 0) {\n return;\n }\n\n this.logger.info(`📦 Retrying pending events: ${pending.length}`);\n try {\n await this.httpClient.sendEvents(pending);\n this.storage.removePendingEventsByIds(pending.map((e) => e.event_id));\n this.logger.info(`✅ Pending events sent: ${pending.length}`);\n } catch (error) {\n this.logger.warn(\"⚠️ Pending events retry failed\", error);\n }\n }\n\n // Get current path (pathname + search) for comparison\n private getCurrentPath(): string {\n if (typeof window === \"undefined\") return \"\";\n return window.location.pathname + window.location.search;\n }\n\n // Setup SPA (Single Page Application) route tracking\n private setupSPATracking(): void {\n if (typeof window === \"undefined\" || typeof history === \"undefined\") {\n this.logger.warn(\"⚠️ SPA tracking not available in this environment\");\n return;\n }\n\n if (this.spaTrackingEnabled) {\n this.logger.warn(\"⚠️ SPA tracking already enabled\");\n return;\n }\n\n this.spaTrackingEnabled = true;\n this.lastTrackedPath = this.getCurrentPath();\n\n // Store original methods\n this.originalPushState = history.pushState.bind(history);\n this.originalReplaceState = history.replaceState.bind(history);\n\n // Create a handler for route changes\n const handleRouteChange = (changeType: string) => {\n const newPath = this.getCurrentPath();\n\n // Only track if path actually changed\n if (newPath === this.lastTrackedPath) {\n this.logger.debug(\n `🔄 [SPA] Route change detected (${changeType}) but path unchanged: ${newPath}`\n );\n return;\n }\n\n this.logger.debug(\n `🔄 [SPA] Route change detected (${changeType}): ${this.lastTrackedPath} -> ${newPath}`\n );\n this.lastTrackedPath = newPath;\n\n // Delay tracking to allow page title and content to update (100ms is sufficient for most frameworks)\n setTimeout(() => {\n this.trackPageView()\n .then(() => {\n // If auto page view is enabled, send ASAP to survive short redirects\n return this.queue.process();\n })\n .then(() => {\n this.logger.debug(`✅ [SPA] Page view tracked for: ${newPath}`);\n })\n .catch((error) => {\n this.logger.error(`❌ [SPA] Failed to track page view:`, error);\n });\n }, 100);\n };\n\n // Override history.pushState\n history.pushState = (\n data: any,\n unused: string,\n url?: string | URL | null\n ) => {\n const result = this.originalPushState!(data, unused, url);\n handleRouteChange(\"pushState\");\n return result;\n };\n\n // Override history.replaceState\n history.replaceState = (\n data: any,\n unused: string,\n url?: string | URL | null\n ) => {\n const result = this.originalReplaceState!(data, unused, url);\n handleRouteChange(\"replaceState\");\n return result;\n };\n\n // Listen for popstate (browser back/forward)\n this.popstateHandler = () => {\n handleRouteChange(\"popstate\");\n };\n window.addEventListener(\"popstate\", this.popstateHandler);\n\n this.logger.info(\"🔄 SPA tracking setup completed\");\n }\n\n // Cleanup SPA tracking (restore original methods)\n private cleanupSPATracking(): void {\n if (!this.spaTrackingEnabled) return;\n\n // Restore original history methods\n if (this.originalPushState) {\n history.pushState = this.originalPushState;\n this.originalPushState = null;\n }\n if (this.originalReplaceState) {\n history.replaceState = this.originalReplaceState;\n this.originalReplaceState = null;\n }\n\n // Remove popstate listener\n if (this.popstateHandler) {\n window.removeEventListener(\"popstate\", this.popstateHandler);\n this.popstateHandler = null;\n }\n\n this.spaTrackingEnabled = false;\n this.logger.info(\"🔄 SPA tracking cleaned up\");\n }\n\n // Update session activity\n private updateSessionActivity(): void {\n if (this.session) {\n this.session.lastActivity = Date.now();\n this.storage.storeSession(this.session);\n }\n }\n\n // Flush all pending events\n async flush(): Promise<void> {\n await this.queue.flush();\n }\n\n // Get SDK status\n getStatus(): {\n initialized: boolean;\n session: UserSession | null;\n queueSize: number;\n online: boolean;\n crossDomainUTM: {\n enabled: boolean;\n currentParams: Record<string, string>;\n };\n spaTracking: {\n enabled: boolean;\n currentPath: string;\n };\n } {\n return {\n initialized: this.initialized,\n session: this.session,\n queueSize: this.queue.size(),\n online: isOnline(),\n crossDomainUTM: {\n enabled: this.config.enableCrossDomainUTM || true,\n currentParams: this.getCurrentUTMParams(),\n },\n spaTracking: {\n enabled: this.spaTrackingEnabled,\n currentPath: this.lastTrackedPath,\n },\n };\n }\n\n // Destroy SDK instance\n destroy(): void {\n this.queue.clear();\n this.autoTrackEnabled = false;\n this.cleanupSPATracking();\n this.initialized = false;\n this.logger.info(\"🗑️ SDK destroyed\");\n }\n}\n","import { AttributionSDK } from \"./core/AttributionSDK\";\nimport {\n SDKConfig,\n EventType,\n Currency,\n EventData,\n AttributionData,\n defaultEndpoint,\n} from \"./types\";\n\n// Global SDK instance\nlet globalSDK: AttributionSDK | null = null;\n\n// Auto-initialization function\nfunction autoInit(): void {\n // Check if SDK is already initialized\n if (globalSDK) {\n return;\n }\n\n // Look for configuration in script tag\n const script = document.currentScript as HTMLScriptElement;\n if (!script) {\n console.warn(\n \"GetuAI SDK: Could not find script tag for auto-initialization\"\n );\n return;\n }\n\n const apiKey = script.getAttribute(\"data-api-key\");\n if (!apiKey) {\n console.warn(\n \"GetuAI SDK: No API key provided. Please add data-api-key attribute to script tag.\"\n );\n return;\n }\n const apiEndpoint =\n script.getAttribute(\"data-api-endpoint\") || defaultEndpoint;\n const config: SDKConfig = {\n apiKey,\n apiEndpoint,\n enableDebug: script.getAttribute(\"data-debug\") === \"true\",\n autoTrack: script.getAttribute(\"data-auto-track\") === \"true\",\n autoTrackPageView:\n script.getAttribute(\"data-auto-track-page-view\") === \"true\",\n autoCleanUTM: script.getAttribute(\"data-auto-clean-utm\") !== \"false\",\n batchSize: parseInt(script.getAttribute(\"data-batch-size\") || \"100\"),\n batchInterval: parseInt(\n script.getAttribute(\"data-batch-interval\") || \"2000\"\n ),\n userId: script.getAttribute(\"data-user-id\") || undefined,\n domain: script.getAttribute(\"data-domain\") || undefined,\n };\n\n // Initialize SDK\n init(config);\n}\n\n// Initialize SDK with configuration\nasync function init(config: SDKConfig): Promise<AttributionSDK> {\n if (globalSDK) {\n console.warn(\"GetuAI SDK: Already initialized\");\n return globalSDK;\n }\n\n try {\n globalSDK = new AttributionSDK(config);\n await globalSDK.init();\n\n // Expose SDK to global scope for debugging\n if (config.enableDebug) {\n (window as any).GetuAISDK = globalSDK;\n }\n\n console.log(\"GetuAI Attribution SDK initialized successfully\");\n\n // Dispatch initialization complete event\n if (typeof window !== \"undefined\") {\n const event = new CustomEvent(\"getuaiSDKReady\", {\n detail: { sdk: globalSDK },\n });\n window.dispatchEvent(event);\n }\n\n return globalSDK;\n } catch (error) {\n console.error(\"GetuAI SDK: Failed to initialize:\", error);\n\n // Dispatch initialization error event\n if (typeof window !== \"undefined\") {\n const event = new CustomEvent(\"getuaiSDKError\", {\n detail: { error },\n });\n window.dispatchEvent(event);\n }\n\n throw error;\n }\n}\n\n// Get current SDK instance\nfunction getSDK(): AttributionSDK | null {\n return globalSDK;\n}\n\n// Wait for SDK to be ready\nfunction waitForSDK(): Promise<AttributionSDK> {\n return new Promise((resolve, reject) => {\n if (globalSDK) {\n resolve(globalSDK);\n return;\n }\n\n // Listen for SDK ready event\n const handleReady = (event: CustomEvent) => {\n window.removeEventListener(\n \"getuaiSDKReady\",\n handleReady as EventListener\n );\n window.removeEventListener(\n \"getuaiSDKError\",\n handleError as EventListener\n );\n resolve(event.detail.sdk);\n };\n\n const handleError = (event: CustomEvent) => {\n window.removeEventListener(\n \"getuaiSDKReady\",\n handleReady as EventListener\n );\n window.removeEventListener(\n \"getuaiSDKError\",\n handleError as EventListener\n );\n reject(event.detail.error);\n };\n\n window.addEventListener(\"getuaiSDKReady\", handleReady as EventListener);\n window.addEventListener(\"getuaiSDKError\", handleError as EventListener);\n\n // Timeout after 10 seconds\n setTimeout(() => {\n window.removeEventListener(\n \"getuaiSDKReady\",\n handleReady as EventListener\n );\n window.removeEventListener(\n \"getuaiSDKError\",\n handleError as EventListener\n );\n reject(new Error(\"SDK initialization timeout\"));\n }, 10000);\n });\n}\n\n// Track event\nasync function trackEvent(\n eventType: EventType,\n eventData?: Record<string, any>,\n tracking_user_id?: string,\n revenue?: number,\n currency: Currency = Currency.USD\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackEvent(\n eventType,\n eventData,\n tracking_user_id,\n revenue,\n currency\n );\n}\n\n// Track page view\nasync function trackPageView(\n pageData?: Record<string, any>,\n tracking_user_id?: string\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackPageView(pageData, tracking_user_id);\n}\n\n// Track purchase\nasync function trackPurchase(\n tracking_user_id: string,\n revenue: number,\n currency: Currency = Currency.USD,\n purchaseData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackPurchase(tracking_user_id, revenue, currency, purchaseData);\n}\n\n// Track login\nasync function trackLogin(\n tracking_user_id: string,\n loginData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackLogin(tracking_user_id, loginData);\n}\n\n// Track signup\n\nasync function trackSignup(\n tracking_user_id: string,\n signupData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackSignup(tracking_user_id, signupData);\n}\n\n// Track form submission\nasync function trackFormSubmit(\n tracking_user_id?: string,\n formData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackFormSubmit(tracking_user_id, formData);\n}\n\n// Track video play\nasync function trackVideoPlay(\n tracking_user_id?: string,\n videoData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackVideoPlay(tracking_user_id, videoData);\n}\n\n// Track email verification\nasync function trackEmailVerification(\n tracking_user_id: string,\n verificationData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackEmailVerification(tracking_user_id, verificationData);\n}\n\n// Track audit approved (conversion)\nasync function trackAuditApproved(\n tracking_user_id: string,\n auditData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackAuditApproved(tracking_user_id, auditData);\n}\n\n// Track purchase with auto user ID (object parameter format)\nasync function trackPurchaseAuto(options: {\n revenue: number;\n currency?: Currency;\n purchaseData?: Record<string, any>;\n tracking_user_id?: string;\n}): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackPurchaseAuto(options);\n}\n\n// Track login with auto user ID (object parameter format)\nasync function trackLoginAuto(options: {\n loginData?: Record<string, any>;\n tracking_user_id?: string;\n}): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackLoginAuto(options);\n}\n\n// Track signup with auto user ID (object parameter format)\nasync function trackSignupAuto(options: {\n signupData?: Record<string, any>;\n tracking_user_id?: string;\n}): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackSignupAuto(options);\n}\n\n// Track email verification with auto user ID (object parameter format)\nasync function trackEmailVerificationAuto(options: {\n verificationData?: Record<string, any>;\n tracking_user_id?: string;\n}): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackEmailVerificationAuto(options);\n}\n\n// Track custom event\nasync function trackCustomEvent(\n customEventName: string,\n eventData?: Record<string, any>,\n tracking_user_id?: string,\n revenue?: number,\n currency: Currency = Currency.USD\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackCustomEvent(customEventName, eventData, tracking_user_id, revenue, currency);\n}\n\n// Track product view\nasync function trackProductView(\n tracking_user_id?: string,\n productData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackProductView(tracking_user_id, productData);\n}\n\n// Track add to cart\nasync function trackAddToCart(\n tracking_user_id?: string,\n cartData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackAddToCart(tracking_user_id, cartData);\n}\n\n// Track page click for user click journey\nasync function trackPageClick(\n tracking_user_id?: string,\n clickData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackPageClick(tracking_user_id, clickData);\n}\n\n// Track button click\nasync function trackButtonClick(\n buttonName?: string,\n tracking_user_id?: string,\n clickData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackButtonClick(buttonName, tracking_user_id, clickData);\n}\n\n// Get attribution data\nfunction getAttributionData() {\n const sdk = getSDK();\n if (!sdk) {\n return null;\n }\n\n return sdk.getAttributionData();\n}\n\n// Flush pending events\nasync function flush(): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.flush();\n}\n\n// Get SDK status\nfunction getStatus() {\n const sdk = getSDK();\n if (!sdk) {\n return null;\n }\n\n return sdk.getStatus();\n}\n\n// Add UTM to URL\nfunction addUTMToURL(url: string): string {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return url;\n }\n\n return sdk.addUTMToURL(url);\n}\n\n// Get current UTM parameters\nfunction getCurrentUTMParams(): Record<string, string> {\n const sdk = getSDK();\n if (!sdk) {\n return {};\n }\n\n return sdk.getCurrentUTMParams();\n}\n\n// Set user ID\nfunction setUserId(userId: string): void {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n sdk.setUserId(userId);\n}\n\n// Get user ID\nfunction getUserId(): string | null {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return null;\n }\n\n return sdk.getUserId();\n}\n\n// Remove user ID\nfunction removeUserId(): void {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n sdk.removeUserId();\n}\n\n// Destroy SDK\nfunction destroy(): void {\n if (globalSDK) {\n globalSDK.destroy();\n globalSDK = null;\n console.log(\"GetuAI SDK destroyed\");\n }\n}\n\n// Extend AttributionSDK class with static methods\nclass AttributionSDKStatic extends AttributionSDK {\n // Static method to initialize SDK\n static async init(config: SDKConfig): Promise<AttributionSDK> {\n return await init(config);\n }\n\n // Static method to track event\n static async trackEvent(\n eventType: EventType,\n eventData?: Record<string, any>,\n tracking_user_id?: string,\n revenue?: number,\n currency: Currency = Currency.USD\n ): Promise<void> {\n return await trackEvent(\n eventType,\n eventData,\n tracking_user_id,\n revenue,\n currency\n );\n }\n\n // Static method to track page view\n static async trackPageView(\n pageData?: Record<string, any>,\n tracking_user_id?: string\n ): Promise<void> {\n return await trackPageView(pageData, tracking_user_id);\n }\n\n // Static method to track purchase\n static async trackPurchase(\n tracking_user_id: string,\n revenue: number,\n currency: Currency = Currency.USD,\n purchaseData?: Record<string, any>\n ): Promise<void> {\n return await trackPurchase(\n tracking_user_id,\n revenue,\n currency,\n purchaseData\n );\n }\n\n // Static method to track login\n static async trackLogin(\n tracking_user_id: string,\n loginData?: Record<string, any>\n ): Promise<void> {\n return await trackLogin(tracking_user_id, loginData);\n }\n\n // Static method to track signup\n static async trackSignup(\n tracking_user_id: string,\n signupData?: Record<string, any>\n ): Promise<void> {\n return await trackSignup(tracking_user_id, signupData);\n }\n\n // Static method to track form submission\n static async trackFormSubmit(\n tracking_user_id?: string,\n formData?: Record<string, any>\n ): Promise<void> {\n return await trackFormSubmit(tracking_user_id, formData);\n }\n\n // Static method to track video play\n static async trackVideoPlay(\n tracking_user_id?: string,\n videoData?: Record<string, any>\n ): Promise<void> {\n return await trackVideoPlay(tracking_user_id, videoData);\n }\n\n // Static method to track email verification\n static async trackEmailVerification(\n tracking_user_id: string,\n verificationData?: Record<string, any>\n ): Promise<void> {\n return await trackEmailVerification(tracking_user_id, verificationData);\n }\n\n // Static method to track purchase with auto user ID\n static async trackPurchaseAuto(options: {\n revenue: number;\n currency?: Currency;\n purchaseData?: Record<string, any>;\n tracking_user_id?: string;\n }): Promise<void> {\n return await trackPurchaseAuto(options);\n }\n\n // Static method to track login with auto user ID\n static async trackLoginAuto(options: {\n loginData?: Record<string, any>;\n tracking_user_id?: string;\n }): Promise<void> {\n return await trackLoginAuto(options);\n }\n\n // Static method to track signup with auto user ID\n static async trackSignupAuto(options: {\n signupData?: Record<string, any>;\n tracking_user_id?: string;\n }): Promise<void> {\n return await trackSignupAuto(options);\n }\n\n // Static method to track email verification with auto user ID\n static async trackEmailVerificationAuto(options: {\n verificationData?: Record<string, any>;\n tracking_user_id?: string;\n }): Promise<void> {\n return await trackEmailVerificationAuto(options);\n }\n\n // Static method to track custom event\n static async trackCustomEvent(\n customEventName: string,\n eventData?: Record<string, any>,\n tracking_user_id?: string,\n revenue?: number,\n currency: Currency = Currency.USD\n ): Promise<void> {\n return await trackCustomEvent(customEventName, eventData, tracking_user_id, revenue, currency);\n }\n\n // Static method to track product view\n static async trackProductView(\n tracking_user_id?: string,\n productData?: Record<string, any>\n ): Promise<void> {\n return await trackProductView(tracking_user_id, productData);\n }\n\n // Static method to track add to cart\n static async trackAddToCart(\n tracking_user_id?: string,\n cartData?: Record<string, any>\n ): Promise<void> {\n return await trackAddToCart(tracking_user_id, cartData);\n }\n\n // Static method to track page click\n static async trackPageClick(\n tracking_user_id?: string,\n clickData?: Record<string, any>\n ): Promise<void> {\n return await trackPageClick(tracking_user_id, clickData);\n }\n\n // Static method to track button click\n static async trackButtonClick(\n buttonName?: string,\n tracking_user_id?: string,\n clickData?: Record<string, any>\n ): Promise<void> {\n return await trackButtonClick(buttonName, tracking_user_id, clickData);\n }\n\n // Static method to get attribution data\n static getAttributionData(): AttributionData | null {\n return getAttributionData();\n }\n\n // Static method to flush events\n static async flush(): Promise<void> {\n return await flush();\n }\n\n // Static method to get status\n static getStatus() {\n return getStatus();\n }\n\n // Static method to add UTM to URL\n static addUTMToURL(url: string): string {\n return addUTMToURL(url);\n }\n\n // Static method to get current UTM parameters\n static getCurrentUTMParams(): Record<string, string> {\n return getCurrentUTMParams();\n }\n\n // Static method to set user ID\n static setUserId(userId: string): void {\n setUserId(userId);\n }\n\n // Static method to get user ID\n static getUserId(): string | null {\n return getUserId();\n }\n\n // Static method to remove user ID\n static removeUserId(): void {\n removeUserId();\n }\n\n // Static method to destroy SDK\n static destroy(): void {\n destroy();\n }\n\n // Static method to get SDK instance\n static getSDK(): AttributionSDK | null {\n return getSDK();\n }\n\n // Static method to wait for SDK\n static waitForSDK(): Promise<AttributionSDK> {\n return waitForSDK();\n }\n}\n\n// Export types\nexport {\n EventType,\n Currency,\n type SDKConfig,\n type EventData,\n type AttributionData,\n};\n\n// Export main functions\nexport {\n init,\n getSDK,\n waitForSDK,\n trackEvent,\n trackPageView,\n trackPageClick,\n trackButtonClick,\n trackPurchase,\n trackLogin,\n trackSignup,\n trackFormSubmit,\n trackVideoPlay,\n trackEmailVerification,\n trackAuditApproved,\n trackCustomEvent,\n trackProductView,\n trackAddToCart,\n trackPurchaseAuto,\n trackLoginAuto,\n trackSignupAuto,\n trackEmailVerificationAuto,\n getAttributionData,\n flush,\n getStatus,\n addUTMToURL,\n getCurrentUTMParams,\n setUserId,\n getUserId,\n removeUserId,\n destroy,\n};\n\n// Export AttributionSDK class for advanced usage\nexport { AttributionSDKStatic as AttributionSDK };\n\n// Auto-initialize if script is loaded with data-api-key\nif (typeof document !== \"undefined\") {\n // Initialize immediately when script loads, don't wait for DOMContentLoaded\n // This ensures SDK is ready before any body scripts execute\n autoInit();\n}\n\n// Expose functions to global scope for browser usage\nif (typeof window !== \"undefined\") {\n (window as any).getuaiSDK = {\n init,\n getSDK,\n waitForSDK,\n trackEvent,\n trackPageView,\n trackPageClick,\n trackButtonClick,\n trackPurchase,\n trackLogin,\n trackSignup,\n trackFormSubmit,\n trackVideoPlay,\n trackEmailVerification,\n trackAuditApproved,\n trackCustomEvent,\n trackProductView,\n trackAddToCart,\n trackPurchaseAuto,\n trackLoginAuto,\n trackSignupAuto,\n trackEmailVerificationAuto,\n getAttributionData,\n flush,\n getStatus,\n addUTMToURL,\n getCurrentUTMParams,\n setUserId,\n getUserId,\n removeUserId,\n destroy,\n EventType,\n Currency,\n AttributionSDK: AttributionSDKStatic, // 暴露带静态方法的AttributionSDK类\n };\n\n // Also expose individual functions for backward compatibility\n (window as any).init = init;\n (window as any).waitForSDK = waitForSDK;\n (window as any).trackEvent = trackEvent;\n (window as any).trackPageView = trackPageView;\n (window as any).trackPageClick = trackPageClick;\n (window as any).trackButtonClick = trackButtonClick;\n (window as any).trackPurchase = trackPurchase;\n (window as any).trackLogin = trackLogin;\n (window as any).trackSignup = trackSignup;\n (window as any).trackFormSubmit = trackFormSubmit;\n (window as any).trackVideoPlay = trackVideoPlay;\n (window as any).trackEmailVerification = trackEmailVerification;\n (window as any).trackProductView = trackProductView;\n (window as any).trackAddToCart = trackAddToCart;\n (window as any).trackPurchaseAuto = trackPurchaseAuto;\n (window as any).trackLoginAuto = trackLoginAuto;\n (window as any).trackSignupAuto = trackSignupAuto;\n (window as any).trackEmailVerificationAuto = trackEmailVerificationAuto;\n (window as any).getAttributionData = getAttributionData;\n (window as any).flush = flush;\n (window as any).getStatus = getStatus;\n (window as any).addUTMToURL = addUTMToURL;\n (window as any).getCurrentUTMParams = getCurrentUTMParams;\n (window as any).setUserId = setUserId;\n (window as any).getUserId = getUserId;\n (window as any).removeUserId = removeUserId;\n (window as any).destroy = destroy;\n (window as any).AttributionSDK = AttributionSDKStatic; // 直接暴露带静态方法的AttributionSDK类\n}\n\n// Default export\nexport default {\n init,\n getSDK,\n waitForSDK,\n trackEvent,\n trackPageView,\n trackPageClick,\n trackButtonClick,\n trackPurchase,\n trackLogin,\n trackSignup,\n trackFormSubmit,\n trackVideoPlay,\n trackEmailVerification,\n trackAuditApproved,\n trackCustomEvent,\n trackProductView,\n trackAddToCart,\n trackPurchaseAuto,\n trackLoginAuto,\n trackSignupAuto,\n trackEmailVerificationAuto,\n getAttributionData,\n flush,\n getStatus,\n addUTMToURL,\n getCurrentUTMParams,\n setUserId,\n getUserId,\n removeUserId,\n destroy,\n EventType,\n Currency,\n AttributionSDK: AttributionSDKStatic, // 包含带静态方法的AttributionSDK类\n};\n"],"names":["addUTMToURL"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/types/index.ts","../src/utils/index.ts","../src/storage/index.ts","../src/version.ts","../src/queue/index.ts","../src/utils/rootDomain.ts","../src/core/AttributionSDK.ts","../src/index.ts"],"sourcesContent":["// Event types matching server-side enum exactly\nexport enum EventType {\n // Pre-conversion signals\n PAGE_VIEW = \"page_view\",\n PAGE_CLICK = \"page_click\", // User click journey tracking\n BUTTON_CLICK = \"button_click\", // Button click tracking\n VIDEO_PLAY = \"video_play\",\n\n // Registration funnel\n FORM_SUBMIT = \"form_submit\",\n EMAIL_VERIFICATION = \"email_verification\",\n\n // Login flow\n LOGIN = \"login\",\n\n // Signup flow\n SIGNUP = \"signup\",\n\n // Purchase funnel\n PRODUCT_VIEW = \"product_view\",\n ADD_TO_CART = \"add_to_cart\",\n PURCHASE = \"purchase\",\n\n // Post-conversion / back-office conversion\n AUDIT_APPROVED = \"audit_approved\",\n\n // Custom event (user-defined name passed via custom_event_name field)\n CUSTOM = \"custom\",\n}\n\n// Currency types\nexport enum Currency {\n USD = \"USD\",\n}\n\n// UTM data structure\nexport interface UTMData {\n utm_source?: string | null;\n utm_medium?: string | null;\n utm_campaign?: string | null;\n utm_term?: string | null;\n utm_content?: string | null;\n // Ad tracking identifiers captured from ad platform click URLs\n adgroup_id?: string | null;\n ad_id?: string | null;\n // Source tracking for confidence (see utils/extractAdParams)\n adgroup_id_source?: string | null;\n ad_id_source?: string | null;\n // Platform-native click identifier (gclid/gbraid/wbraid/fbclid/ttclid/...)\n click_id?: string | null;\n click_id_source?: string | null;\n timestamp: number;\n}\n\n// Attribution data structure\nexport interface AttributionData {\n firstTouch: UTMData;\n lastTouch: UTMData;\n touchpoints: UTMData[];\n expiresAt: number;\n}\n\n// Event data structure\nexport interface EventData {\n event_id: string;\n event_type: EventType;\n anonymous_id?: string; // Persistent visitor identifier (SDK v0.5.0+)\n tracking_user_id?: string;\n utm_source?: string | null;\n utm_medium?: string | null;\n utm_campaign?: string | null;\n utm_term?: string | null;\n utm_content?: string | null;\n revenue?: number | null;\n currency?: Currency | null;\n event_data?: Record<string, any> | null;\n // Required when event_type = CUSTOM; ignored for all other event types\n custom_event_name?: string;\n // Ad tracking dimensions\n device?: string | null; // SDK auto-detected: 'desktop' | 'mobile' | 'tablet'\n adgroup_id?: string | null; // From ad platform click URL\n ad_id?: string | null; // From ad platform click URL\n adgroup_id_source?: string | null; // 'explicit' | 'valuetrack' | 'utm_term_numeric'\n ad_id_source?: string | null; // 'explicit' | 'valuetrack' | 'utm_content_numeric'\n click_id?: string | null; // gclid / gbraid / wbraid / fbclid / ttclid / ...\n click_id_source?: string | null; // Which URL param supplied click_id\n // Arbitrary context information; page info should be nested under context.page\n context?: {\n page?: {\n domain?: string | null;\n path?: string | null;\n title?: string | null;\n referrer?: string | null;\n url?: string | null; // for completeness but no querystring\n querystring?: string | null; // URL query string\n query_params?: Record<string, string> | null; // Parsed query parameters as object\n user_agent?: string | null; // Raw navigator.userAgent — lossless device signal, attached to every event\n };\n [key: string]: any;\n } | null;\n timestamp?: number;\n}\n\n// Batch event request\nexport interface BatchEventRequest {\n events: EventData[];\n sdk_version: string;\n}\nexport const defaultEndpoint = \"https://attribution.getu.ai/attribution/api\";\n// SDK configuration\nexport interface SDKConfig {\n apiKey: string;\n apiEndpoint?: string;\n batchSize?: number;\n batchInterval?: number; // Default: 2000 (ms)\n maxRetries?: number;\n retryDelay?: number;\n enableDebug?: boolean;\n autoTrack?: boolean;\n // Control whether to automatically track page views on initialization\n autoTrackPageView?: boolean;\n sessionTimeout?: number;\n // Cross-domain UTM tracking configuration\n enableCrossDomainUTM?: boolean;\n crossDomainUTMParams?: string[]; // Which UTM params to pass\n excludeDomains?: string[]; // Domains to exclude from UTM passing\n // Control whether to automatically remove UTM params from the URL after capture\n autoCleanUTM?: boolean;\n // Page view debounce interval in milliseconds (default: 5000ms)\n // Same page can only be tracked once within this interval\n pageViewDebounceInterval?: number;\n // User ID configuration\n userId?: string; // Initial user ID to set on initialization (will be stored in both cookie and sessionStorage)\n // Cross-subdomain session & identity sharing.\n // When set (e.g. \".example.com\"), session_id / user_id / attribution cookies\n // are written with this domain so they're readable on sibling subdomains.\n // When omitted, the SDK auto-detects the broadest writable domain via a\n // cookie-probe heuristic. Pass empty string to force single-origin mode.\n domain?: string;\n}\n\n// Storage interface\nexport interface StorageInterface {\n get(key: string): any;\n set(key: string, value: any): void;\n remove(key: string): void;\n clear(): void;\n}\n\n// Queue interface\nexport interface QueueInterface {\n add(event: EventData): void;\n process(): Promise<void>;\n clear(): void;\n size(): number;\n}\n\n// Logger interface\nexport interface LoggerInterface {\n debug(message: string, ...args: any[]): void;\n info(message: string, ...args: any[]): void;\n warn(message: string, ...args: any[]): void;\n error(message: string, ...args: any[]): void;\n}\n\n// User session data\nexport interface UserSession {\n sessionId: string;\n startTime: number;\n lastActivity: number;\n pageViews: number;\n // The user_id this session was bound to. Used to force session rotation\n // when a *different* non-empty id is set via setUserId() — prevents two\n // distinct users' events sharing the same session_id.\n //\n // Undefined/empty = anonymous session. A subsequent setUserId() on an\n // anonymous session does NOT rotate (this is the normal anonymous→known\n // flow that the backend's association service backfills).\n userId?: string;\n}\n\n// Special events that should be sent immediately\nexport const IMMEDIATE_EVENTS = [\n EventType.PURCHASE,\n EventType.LOGIN,\n EventType.SIGNUP,\n EventType.FORM_SUBMIT,\n EventType.EMAIL_VERIFICATION,\n EventType.AUDIT_APPROVED,\n];\n\n/**\n * User attributes (for identify method)\n */\nexport interface UserTraits {\n email?: string;\n name?: string;\n first_name?: string;\n last_name?: string;\n phone?: string;\n company_name?: string;\n title?: string;\n [key: string]: any; // Support custom attributes\n}\n\n/**\n * Form field mapping configuration\n */\nexport interface FieldMappingConfig {\n email?: string[];\n name?: string[];\n first_name?: string[];\n last_name?: string[];\n phone?: string[];\n company_name?: string[];\n title?: string[];\n}\n\n/**\n * Default field mappings for automatic lead field extraction\n */\nexport const DEFAULT_FIELD_MAPPINGS: FieldMappingConfig = {\n email: ['email', 'e-mail', 'mail', 'user_email', 'email_address'],\n name: ['name', 'full_name', 'fullname', 'username', 'display_name'],\n first_name: ['first_name', 'firstname', 'fname', 'given_name'],\n last_name: ['last_name', 'lastname', 'lname', 'surname', 'family_name'],\n phone: ['phone', 'telephone', 'mobile', 'phone_number', 'tel'],\n company_name: ['company', 'company_name', 'organization', 'org', 'business'],\n title: ['title', 'job_title', 'position', 'role', 'job'],\n};\n","import { LoggerInterface, UTMData } from \"../types\";\n\n// Generate unique ID\nexport function generateId(): string {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n// Generate timestamp in seconds\nexport function getTimestamp(): number {\n return Math.floor(Date.now() / 1000);\n}\n\n// Parse URL parameters — LAST value wins for duplicate keys (existing behavior)\nexport function parseUrlParams(url: string): Record<string, string> {\n const params: Record<string, string> = {};\n try {\n const urlObj = new URL(url);\n urlObj.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n } catch (error) {\n // Handle invalid URLs\n }\n return params;\n}\n\n// Parse URL parameters preserving ALL values for duplicate keys.\n// Use this when duplicate keys carry distinct signals — e.g. Google Ads\n// tracking templates like `utm_term={adgroupid}&utm_term={keyword}` on the\n// same URL need both values to recover adgroup_id.\nexport function parseUrlParamsMulti(url: string): Record<string, string[]> {\n const params: Record<string, string[]> = {};\n try {\n const urlObj = new URL(url);\n const seenKeys = new Set<string>();\n urlObj.searchParams.forEach((_value, key) => {\n seenKeys.add(key);\n });\n seenKeys.forEach((key) => {\n const all = urlObj.searchParams.getAll(key);\n params[key] = all.filter((v) => v != null && v !== \"\");\n });\n } catch (error) {\n // Handle invalid URLs\n }\n return params;\n}\n\n// Extract UTM parameters from URL\nexport function extractUTMParams(url: string): Record<string, string> {\n const params = parseUrlParams(url);\n const utmParams: Record<string, string> = {};\n\n const utmKeys = [\n \"utm_source\",\n \"utm_medium\",\n \"utm_campaign\",\n \"utm_term\",\n \"utm_content\",\n ];\n\n utmKeys.forEach((key) => {\n if (params[key] && params[key].trim() !== \"\") {\n utmParams[key] = params[key].trim();\n }\n });\n\n return utmParams;\n}\n\n// Source tags recorded alongside adgroup_id / ad_id so the server can tell\n// high-confidence explicit IDs apart from Tier-2 numeric inferences.\nexport type AdgroupIdSource = \"explicit\" | \"valuetrack\" | \"utm_term_numeric\";\nexport type AdIdSource = \"explicit\" | \"valuetrack\" | \"utm_content_numeric\";\nexport type ClickIdSource =\n | \"gclid\"\n | \"gbraid\"\n | \"wbraid\"\n | \"fbclid\"\n | \"ttclid\"\n | \"msclkid\"\n | \"twclid\"\n | \"li_fat_id\";\n\nexport interface AdParamsResult {\n adgroup_id?: string;\n ad_id?: string;\n adgroup_id_source?: AdgroupIdSource;\n ad_id_source?: AdIdSource;\n click_id?: string;\n click_id_source?: ClickIdSource;\n}\n\n// Known aliases, in priority order. First hit wins. Matching is case-insensitive\n// for Google aliases; Microsoft-style PascalCase (AdGroupId) is matched via the\n// lowercased form because URLSearchParams preserves case but our iteration\n// normalizes when comparing.\nconst ADGROUP_ALIASES = [\n \"adgroup_id\",\n \"ad_group_id\",\n \"adgroupid\",\n \"adset_id\",\n \"tt_adgroup_id\",\n \"adgroup\",\n] as const;\nconst AD_ALIASES = [\n \"ad_id\",\n \"adid\",\n \"creative_id\",\n \"creative\",\n \"tt_ad_id\",\n] as const;\n// Click identifiers in priority order — gclid is the dominant Google one,\n// gbraid/wbraid are iOS privacy-preserving variants.\nconst CLICK_ID_ALIASES: readonly ClickIdSource[] = [\n \"gclid\",\n \"gbraid\",\n \"wbraid\",\n \"fbclid\",\n \"ttclid\",\n \"msclkid\",\n \"twclid\",\n \"li_fat_id\",\n];\n\n// Google ValueTrack IDs are 64-bit numeric. Empirically 7–15 digits covers\n// observed campaign / adgroup / ad / keyword IDs without false-matching short\n// numeric keywords.\nconst NUMERIC_ID_RE = /^\\d{7,15}$/;\n\n// Case-insensitive lookup into a multi-value param map.\nfunction firstValueCI(\n multi: Record<string, string[]>,\n key: string\n): string | undefined {\n const lower = key.toLowerCase();\n for (const k of Object.keys(multi)) {\n if (k.toLowerCase() === lower) {\n const vals = multi[k];\n for (const v of vals) {\n if (v && v.trim() !== \"\") return v.trim();\n }\n }\n }\n return undefined;\n}\n\n// Extract ad-platform tracking parameters from a URL, covering:\n// - Explicit named params (adgroup_id / ad_group_id / adset_id / tt_adgroup_id / ...)\n// - Unreplaced ValueTrack placeholders (e.g. `adgroup_id={adgroupid}`)\n// - Tier-2 numeric inference (Google advertisers configure utm_term={adgroupid}\n// AND utm_term={keyword} in the same tracking template → one utm_term value\n// is a numeric ID and the other is free-text keyword)\n// - Click identifiers (gclid / gbraid / wbraid / fbclid / ttclid / msclkid /\n// twclid / li_fat_id)\nexport function extractAdParams(url: string): AdParamsResult {\n const multi = parseUrlParamsMulti(url);\n const result: AdParamsResult = {};\n\n // --- Adgroup ID -------------------------------------------------------\n for (const alias of ADGROUP_ALIASES) {\n const v = firstValueCI(multi, alias);\n if (v === undefined) continue;\n // ValueTrack literal that wasn't replaced by Google (advertiser config error)\n if (/^\\{.+\\}$/.test(v)) {\n result.adgroup_id = v;\n result.adgroup_id_source = \"valuetrack\";\n } else {\n result.adgroup_id = v;\n result.adgroup_id_source = \"explicit\";\n }\n break;\n }\n // Tier-2: any utm_term value that looks like a numeric ID\n if (!result.adgroup_id) {\n const utmTerms = firstValueCI(multi, \"utm_term\")\n ? multi[Object.keys(multi).find((k) => k.toLowerCase() === \"utm_term\")!]\n : [];\n for (const v of utmTerms) {\n const trimmed = (v || \"\").trim();\n if (NUMERIC_ID_RE.test(trimmed)) {\n result.adgroup_id = trimmed;\n result.adgroup_id_source = \"utm_term_numeric\";\n break;\n }\n }\n }\n\n // --- Ad ID ------------------------------------------------------------\n for (const alias of AD_ALIASES) {\n const v = firstValueCI(multi, alias);\n if (v === undefined) continue;\n if (/^\\{.+\\}$/.test(v)) {\n result.ad_id = v;\n result.ad_id_source = \"valuetrack\";\n } else {\n result.ad_id = v;\n result.ad_id_source = \"explicit\";\n }\n break;\n }\n // Tier-2: utm_content numeric → likely {creative}\n if (!result.ad_id) {\n const utmContents = firstValueCI(multi, \"utm_content\")\n ? multi[\n Object.keys(multi).find((k) => k.toLowerCase() === \"utm_content\")!\n ]\n : [];\n for (const v of utmContents) {\n const trimmed = (v || \"\").trim();\n if (NUMERIC_ID_RE.test(trimmed)) {\n result.ad_id = trimmed;\n result.ad_id_source = \"utm_content_numeric\";\n break;\n }\n }\n }\n\n // --- Click ID (first non-empty wins, priority order) ------------------\n for (const alias of CLICK_ID_ALIASES) {\n const v = firstValueCI(multi, alias);\n if (v && v.trim() !== \"\") {\n result.click_id = v.trim();\n result.click_id_source = alias;\n break;\n }\n }\n\n return result;\n}\n\n// Detect device type from navigator.userAgent.\n// Returns 'desktop' | 'mobile' | 'tablet'. Tablet checked before mobile\n// because iPad UA strings can contain 'Mobile'.\nexport function detectDevice(): \"desktop\" | \"mobile\" | \"tablet\" {\n const ua = (typeof navigator !== \"undefined\" && navigator.userAgent) || \"\";\n if (/iPad|Tablet|PlayBook|Silk/i.test(ua)) {\n return \"tablet\";\n }\n if (/Mobi|Android|iPhone|iPod/i.test(ua)) {\n return \"mobile\";\n }\n return \"desktop\";\n}\n\n// Check if browser supports localStorage\nexport function isLocalStorageSupported(): boolean {\n try {\n const test = \"__localStorage_test__\";\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch {\n return false;\n }\n}\n\n// Check if browser supports IndexedDB\nexport function isIndexedDBSupported(): boolean {\n return \"indexedDB\" in window;\n}\n\n// Deep clone object\nexport function deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as unknown as T;\n }\n\n if (obj instanceof Array) {\n return obj.map((item) => deepClone(item)) as unknown as T;\n }\n\n if (typeof obj === \"object\") {\n const cloned = {} as T;\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n cloned[key] = deepClone(obj[key]);\n }\n }\n return cloned;\n }\n\n return obj;\n}\n\n// Debounce function\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: ReturnType<typeof setTimeout>;\n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), wait);\n };\n}\n\n// Throttle function\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n limit: number\n): (...args: Parameters<T>) => void {\n let inThrottle: boolean;\n return (...args: Parameters<T>) => {\n if (!inThrottle) {\n func(...args);\n inThrottle = true;\n setTimeout(() => (inThrottle = false), limit);\n }\n };\n}\n\n// Retry function with exponential backoff\nexport async function retry<T>(\n fn: () => Promise<T>,\n maxRetries: number = 3,\n baseDelay: number = 1000\n): Promise<T> {\n let lastError: Error;\n\n for (let i = 0; i <= maxRetries; i++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n if (i === maxRetries) {\n throw lastError;\n }\n\n const delay = baseDelay * Math.pow(2, i);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError!;\n}\n\n// Console logger implementation\nexport class ConsoleLogger implements LoggerInterface {\n private enabled: boolean;\n\n constructor(enabled: boolean = true) {\n this.enabled = enabled;\n }\n\n debug(message: string, ...args: any[]): void {\n if (this.enabled && console.debug) {\n console.debug(`[GetuAI Debug] ${message}`, ...args);\n }\n }\n\n info(message: string, ...args: any[]): void {\n if (this.enabled && console.info) {\n console.info(`[GetuAI Info] ${message}`, ...args);\n }\n }\n\n warn(message: string, ...args: any[]): void {\n if (this.enabled && console.warn) {\n console.warn(`[GetuAI Warn] ${message}`, ...args);\n }\n }\n\n error(message: string, ...args: any[]): void {\n if (this.enabled && console.error) {\n console.error(`[GetuAI Error] ${message}`, ...args);\n }\n }\n}\n\n// Get user agent info\nexport function getUserAgent(): string {\n return navigator.userAgent || \"\";\n}\n\n// Get referrer\nexport function getReferrer(): string {\n return document.referrer || \"\";\n}\n\n// Get current URL\nexport function getCurrentUrl(): string {\n return window.location.href;\n}\n\n// ---------------------------------------------------------------------------\n// UTM recovery for late-init scenarios\n// ---------------------------------------------------------------------------\n//\n// When the SDK is bundled into a host framework (e.g. Nuxt) and init() runs\n// after the framework's router has already stripped UTM from the URL via\n// history.replaceState(), reading window.location.href alone loses the\n// attribution. Two fallbacks recover it without any caller cooperation:\n//\n// 1. INITIAL_URL_SNAPSHOT — captured at module-load time. As long as the\n// SDK module is parsed before the host's router runs (the common case\n// for eager-bundled main chunks), this holds the unstripped URL.\n// 2. Performance Navigation Timing — entry.name is pinned to the original\n// navigation URL and is NOT mutated by later history.replaceState calls.\n// This is the last-resort recovery and works even if the SDK module\n// itself is loaded via a lazy chunk after the strip.\n\n// Safe read of window.location.href — returns \"\" if access throws (e.g.\n// cross-origin sandboxed iframe, throwing location/href getter) or if\n// window/location are unavailable (SSR). All location access is inside the\n// try so even a throwing `window.location` getter cannot escape.\nfunction safeCurrentHref(): string {\n if (typeof window === \"undefined\") return \"\";\n try {\n const loc = window.location;\n return loc && typeof loc.href === \"string\" ? loc.href : \"\";\n } catch {\n return \"\";\n }\n}\n\nlet INITIAL_URL_SNAPSHOT: string | null = safeCurrentHref() || null;\n\nconst UTM_KEYS_FOR_DETECTION = [\n \"utm_source\",\n \"utm_medium\",\n \"utm_campaign\",\n \"utm_term\",\n \"utm_content\",\n] as const;\n\n// Detects any attribution signal — UTM keys OR ad/click identifiers\n// (gclid, fbclid, adgroup_id, ad_id, etc.). Both are extracted later by\n// extractAndStoreUTMData(), so the URL chooser must treat either as\n// \"worth recovering\" — otherwise a ?gclid=... URL stripped before init\n// would still lose attribution.\nfunction urlHasAttributionSignal(url: string | null | undefined): boolean {\n if (!url) return false;\n try {\n const u = new URL(url);\n const hasUTM = UTM_KEYS_FOR_DETECTION.some((k) => {\n const v = u.searchParams.get(k);\n return v !== null && v.trim() !== \"\";\n });\n if (hasUTM) return true;\n const ad = extractAdParams(url);\n return Boolean(ad.adgroup_id || ad.ad_id || ad.click_id);\n } catch {\n return false;\n }\n}\n\n// Read the original navigation URL from the Performance Navigation Timing API.\n// Survives history.replaceState — useful when the host framework strips UTM\n// during hydration before the SDK has a chance to read it.\nexport function getNavigationUrl(): string | null {\n if (typeof performance === \"undefined\") return null;\n const getter = (performance as Performance).getEntriesByType;\n if (typeof getter !== \"function\") return null;\n try {\n const entries = getter.call(\n performance,\n \"navigation\"\n ) as PerformanceEntry[];\n if (entries && entries.length > 0) {\n const name = (entries[0] as { name?: string }).name;\n if (typeof name === \"string\" && name.length > 0) return name;\n }\n } catch {\n /* ignore */\n }\n return null;\n}\n\n// Pick the URL most likely to still carry attribution signal (UTM or ad/click\n// IDs): current location → module-load snapshot → navigation timing entry.\n// Falls back to current location if none carry signal (preserves original\n// behavior — extractAndStoreUTMData will then early-return on empty params).\nexport function getBestUTMSourceUrl(): string {\n const current = safeCurrentHref();\n\n if (urlHasAttributionSignal(current)) return current;\n if (urlHasAttributionSignal(INITIAL_URL_SNAPSHOT))\n return INITIAL_URL_SNAPSHOT as string;\n const nav = getNavigationUrl();\n if (urlHasAttributionSignal(nav)) return nav as string;\n return current;\n}\n\n// Test seam: lets tests inject / reset the module-load snapshot. NOT part of\n// the public SDK API — the leading underscores mark it as internal.\nexport function __setInitialUrlSnapshotForTesting(url: string | null): void {\n INITIAL_URL_SNAPSHOT = url;\n}\n\n// Get page title\nexport function getPageTitle(): string {\n return document.title || \"\";\n}\n\n// Check if user is online\nexport function isOnline(): boolean {\n return navigator.onLine;\n}\n\n// Generate session ID\nexport function generateSessionId(): string {\n return `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n}\n\n// Validate email format\nexport function isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n}\n\n// Format currency\nexport function formatCurrency(\n amount: number,\n currency: string = \"USD\"\n): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: currency,\n }).format(amount);\n}\n\n// Add UTM parameters to URL\nexport function addUTMToURL(\n url: string,\n utmParams: Record<string, string>\n): string {\n try {\n const urlObj = new URL(url);\n\n // Add UTM parameters if they don't already exist\n Object.entries(utmParams).forEach(([key, value]) => {\n if (value && !urlObj.searchParams.has(key)) {\n urlObj.searchParams.set(key, value);\n }\n });\n\n return urlObj.toString();\n } catch (error) {\n // If URL parsing fails, return original URL\n return url;\n }\n}\n\n// Check if domain should be excluded from UTM passing\nexport function shouldExcludeDomain(\n url: string,\n excludeDomains: string[] = []\n): boolean {\n try {\n const urlObj = new URL(url);\n const hostname = urlObj.hostname.toLowerCase();\n\n return excludeDomains.some((domain) => {\n const excludeDomain = domain.toLowerCase();\n return (\n hostname === excludeDomain || hostname.endsWith(`.${excludeDomain}`)\n );\n });\n } catch (error) {\n return false;\n }\n}\n\n// Get domain from URL\nexport function getDomainFromURL(url: string): string | null {\n try {\n const urlObj = new URL(url);\n return urlObj.hostname;\n } catch (error) {\n return null;\n }\n}\n\n// Check if URL is external (different domain)\nexport function isExternalURL(url: string): boolean {\n try {\n const urlObj = new URL(url);\n const currentDomain = window.location.hostname;\n return urlObj.hostname !== currentDomain;\n } catch (error) {\n return false;\n }\n}\n\n// Filter UTM parameters based on configuration\nexport function filterUTMParams(\n utmData: Partial<UTMData>,\n allowedParams: string[] = [\"utm_source\", \"utm_medium\", \"utm_campaign\"]\n): Record<string, string> {\n const filtered: Record<string, string> = {};\n\n allowedParams.forEach((param) => {\n if (utmData[param as keyof UTMData]) {\n filtered[param] = utmData[param as keyof UTMData] as string;\n }\n });\n\n return filtered;\n}\n\n// Get query string from URL\nexport function getQueryString(url?: string): string {\n try {\n const targetUrl = url || window.location.href;\n const urlObj = new URL(targetUrl);\n return urlObj.search;\n } catch (error) {\n return \"\";\n }\n}\n\n// Get query parameters as object\nexport function getQueryParams(url?: string): Record<string, string> {\n try {\n const targetUrl = url || window.location.href;\n const urlObj = new URL(targetUrl);\n const params: Record<string, string> = {};\n\n urlObj.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return params;\n } catch (error) {\n return {};\n }\n}\n\n// Clean URL by removing UTM parameters\nexport function cleanURL(): void {\n try {\n const currentUrl = new URL(window.location.href);\n const utmKeys = [\n \"utm_source\",\n \"utm_medium\",\n \"utm_campaign\",\n \"utm_term\",\n \"utm_content\",\n ];\n\n let hasParams = false;\n\n utmKeys.forEach((key) => {\n if (currentUrl.searchParams.has(key)) {\n currentUrl.searchParams.delete(key);\n hasParams = true;\n }\n });\n\n if (hasParams) {\n // Use replaceState to avoid page reload and history entry\n window.history.replaceState({}, document.title, currentUrl.toString());\n }\n } catch (error) {\n // Handle invalid URLs silently\n console.warn(\"Failed to clean URL:\", error);\n }\n}\n","import {\n StorageInterface,\n AttributionData,\n EventData,\n LoggerInterface,\n UTMData,\n UserTraits,\n} from \"../types\";\nimport {\n isLocalStorageSupported,\n isIndexedDBSupported,\n deepClone,\n ConsoleLogger,\n} from \"../utils\";\n\n// Cookie options for the cross-subdomain write helpers below.\ninterface CookieOptions {\n days?: number;\n domain?: string | null;\n secure?: boolean;\n}\n\nconst ANONYMOUS_ID_COOKIE = \"ga_anon_id\";\nconst ANONYMOUS_ID_LS_KEY = \"ga_anon_id\";\nconst ANONYMOUS_ID_TTL_DAYS = 365;\nconst ANONYMOUS_ID_PREFIX = \"anon_\";\n\nfunction generateAnonymousId(): string {\n if (typeof crypto !== \"undefined\" && typeof (crypto as any).randomUUID === \"function\") {\n return ANONYMOUS_ID_PREFIX + (crypto as any).randomUUID().replace(/-/g, \"\");\n }\n let hex = \"\";\n for (let i = 0; i < 32; i++) {\n hex += Math.floor(Math.random() * 16).toString(16);\n }\n return ANONYMOUS_ID_PREFIX + hex;\n}\n\n// Upper bound on the serialized attribution payload we'll put in a cookie.\n// Chrome/Firefox cap individual cookies at 4096 bytes; 3800 leaves headroom\n// for the name, attributes, and URL-encoding overhead.\nconst MAX_ATTRIB_COOKIE_BYTES = 3800;\n// Keep the most recent touchpoints only when the payload would otherwise\n// exceed the cookie size limit. 20 covers typical journeys while staying\n// well under 4KB even with long UTM values.\nconst TOUCHPOINTS_TRIM_LIMIT = 20;\n\n// LocalStorage implementation\nexport class LocalStorageManager implements StorageInterface {\n private logger: LoggerInterface;\n\n constructor(logger: LoggerInterface) {\n this.logger = logger;\n }\n\n get(key: string): any {\n try {\n if (!isLocalStorageSupported()) {\n this.logger.warn(\"LocalStorage not supported\");\n return null;\n }\n\n const item = localStorage.getItem(key);\n if (item === null) {\n return null;\n }\n\n return JSON.parse(item);\n } catch (error) {\n this.logger.error(\"Error reading from localStorage:\", error);\n return null;\n }\n }\n\n set(key: string, value: any): void {\n try {\n if (!isLocalStorageSupported()) {\n this.logger.warn(\"LocalStorage not supported\");\n return;\n }\n\n localStorage.setItem(key, JSON.stringify(value));\n } catch (error) {\n this.logger.error(\"Error writing to localStorage:\", error);\n // Handle quota exceeded\n this.handleQuotaExceeded();\n }\n }\n\n remove(key: string): void {\n try {\n if (isLocalStorageSupported()) {\n localStorage.removeItem(key);\n }\n } catch (error) {\n this.logger.error(\"Error removing from localStorage:\", error);\n }\n }\n\n clear(): void {\n try {\n if (isLocalStorageSupported()) {\n localStorage.clear();\n }\n } catch (error) {\n this.logger.error(\"Error clearing localStorage:\", error);\n }\n }\n\n private handleQuotaExceeded(): void {\n // Try to clean up old data\n try {\n const keys = Object.keys(localStorage);\n const attributionKeys = keys.filter((key) =>\n key.startsWith(\"attribution_\")\n );\n\n if (attributionKeys.length > 0) {\n // Remove oldest data first\n attributionKeys.sort((a, b) => {\n const aData = this.get(a);\n const bData = this.get(b);\n return (aData?.expiresAt || 0) - (bData?.expiresAt || 0);\n });\n\n // Remove oldest 20% of data\n const toRemove = Math.ceil(attributionKeys.length * 0.2);\n attributionKeys.slice(0, toRemove).forEach((key) => {\n this.remove(key);\n });\n\n this.logger.info(`Cleaned up ${toRemove} old attribution records`);\n }\n } catch (error) {\n this.logger.error(\"Error during quota cleanup:\", error);\n }\n }\n}\n\n// IndexedDB implementation\nexport class IndexedDBManager {\n private dbName: string = \"attribution_events\";\n private dbVersion: number = 1;\n private storeName: string = \"events\";\n private logger: LoggerInterface;\n private db: IDBDatabase | null = null;\n\n constructor(logger: LoggerInterface) {\n this.logger = logger;\n }\n\n async init(): Promise<void> {\n if (!isIndexedDBSupported()) {\n this.logger.warn(\"IndexedDB not supported\");\n return;\n }\n\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(this.dbName, this.dbVersion);\n\n request.onerror = () => {\n this.logger.error(\"Failed to open IndexedDB:\", request.error);\n reject(request.error);\n };\n\n request.onsuccess = () => {\n this.db = request.result;\n this.logger.info(\"IndexedDB initialized successfully\");\n resolve();\n };\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n\n if (!db.objectStoreNames.contains(this.storeName)) {\n const store = db.createObjectStore(this.storeName, {\n keyPath: \"id\",\n autoIncrement: true,\n });\n store.createIndex(\"timestamp\", \"timestamp\", { unique: false });\n store.createIndex(\"sent\", \"sent\", { unique: false });\n store.createIndex(\"queued_at\", \"queued_at\", { unique: false });\n }\n };\n });\n }\n\n async addEvent(event: EventData): Promise<void> {\n if (!this.db) {\n throw new Error(\"IndexedDB not initialized\");\n }\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction([this.storeName], \"readwrite\");\n const store = transaction.objectStore(this.storeName);\n\n const eventRecord = {\n ...event,\n queued_at: Date.now(),\n sent: false,\n };\n\n const request = store.add(eventRecord);\n\n request.onsuccess = () => {\n this.logger.debug(\"Event added to IndexedDB queue\");\n resolve();\n };\n\n request.onerror = () => {\n this.logger.error(\"Failed to add event to IndexedDB:\", request.error);\n reject(request.error);\n };\n });\n }\n\n async getUnsentEvents(limit: number = 100): Promise<EventData[]> {\n if (!this.db) {\n return [];\n }\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction([this.storeName], \"readonly\");\n const store = transaction.objectStore(this.storeName);\n const index = store.index(\"sent\");\n\n const request = index.getAll(IDBKeyRange.only(false), limit);\n\n request.onsuccess = () => {\n const events = request.result.map((record: any) => {\n const { queued_at, sent, ...event } = record;\n return event;\n });\n resolve(events);\n };\n\n request.onerror = () => {\n this.logger.error(\"Failed to get unsent events:\", request.error);\n reject(request.error);\n };\n });\n }\n\n async markEventsAsSent(eventIds: string[]): Promise<void> {\n if (!this.db || eventIds.length === 0) {\n return;\n }\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction([this.storeName], \"readwrite\");\n const store = transaction.objectStore(this.storeName);\n\n let completed = 0;\n let hasError = false;\n\n eventIds.forEach((eventId) => {\n const getRequest = store.get(eventId);\n\n getRequest.onsuccess = () => {\n if (getRequest.result) {\n const record = { ...getRequest.result, sent: true };\n const putRequest = store.put(record);\n\n putRequest.onsuccess = () => {\n completed++;\n if (completed === eventIds.length && !hasError) {\n resolve();\n }\n };\n\n putRequest.onerror = () => {\n hasError = true;\n this.logger.error(\n \"Failed to mark event as sent:\",\n putRequest.error\n );\n reject(putRequest.error);\n };\n } else {\n completed++;\n if (completed === eventIds.length && !hasError) {\n resolve();\n }\n }\n };\n\n getRequest.onerror = () => {\n hasError = true;\n this.logger.error(\n \"Failed to get event for marking as sent:\",\n getRequest.error\n );\n reject(getRequest.error);\n };\n });\n });\n }\n\n async cleanupOldEvents(\n maxAge: number = 7 * 24 * 60 * 60 * 1000\n ): Promise<void> {\n if (!this.db) {\n return;\n }\n\n const cutoffTime = Date.now() - maxAge;\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction([this.storeName], \"readwrite\");\n const store = transaction.objectStore(this.storeName);\n const index = store.index(\"queued_at\");\n\n const request = index.openCursor(IDBKeyRange.upperBound(cutoffTime));\n\n request.onsuccess = () => {\n const cursor = request.result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n this.logger.info(\"Old events cleanup completed\");\n resolve();\n }\n };\n\n request.onerror = () => {\n this.logger.error(\"Failed to cleanup old events:\", request.error);\n reject(request.error);\n };\n });\n }\n\n async getQueueSize(): Promise<number> {\n if (!this.db) {\n return 0;\n }\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction([this.storeName], \"readonly\");\n const store = transaction.objectStore(this.storeName);\n const request = store.count();\n\n request.onsuccess = () => {\n resolve(request.result);\n };\n\n request.onerror = () => {\n this.logger.error(\"Failed to get queue size:\", request.error);\n reject(request.error);\n };\n });\n }\n\n async clear(): Promise<void> {\n if (!this.db) {\n return;\n }\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction([this.storeName], \"readwrite\");\n const store = transaction.objectStore(this.storeName);\n const request = store.clear();\n\n request.onsuccess = () => {\n this.logger.info(\"IndexedDB queue cleared\");\n resolve();\n };\n\n request.onerror = () => {\n this.logger.error(\"Failed to clear IndexedDB queue:\", request.error);\n reject(request.error);\n };\n });\n }\n}\n\n// Attribution storage manager\nexport class AttributionStorageManager {\n private localStorage: LocalStorageManager;\n private indexedDB: IndexedDBManager;\n private logger: LoggerInterface;\n // Legacy localStorage keys — kept for backward-compat reads during migration.\n private readonly UTM_STORAGE_KEY = \"attribution_utm_data\";\n private readonly SESSION_STORAGE_KEY = \"attribution_session\";\n // Cross-subdomain cookie keys.\n private readonly SESSION_COOKIE_KEY = \"_getuai_session\";\n private readonly ATTRIB_COOKIE_KEY = \"_getuai_attrib\";\n private readonly USER_ID_KEY = \"getuai_user_id\";\n private readonly PENDING_EVENTS_KEY = \"getuai_pending_events_v1\";\n private readonly USER_TRAITS_KEY = \"getuai_user_traits\";\n private readonly USER_ID_COOKIE_EXPIRES = 365; // days\n private readonly ATTRIB_COOKIE_EXPIRES = 30; // days\n private readonly SESSION_COOKIE_EXPIRES = 1; // days; session timeout enforces 30min semantics\n\n // Parent-domain for cookies (e.g. \".example.com\"). Null means write host-only\n // cookies — single-origin mode. Set via setCookieDomain() during SDK init.\n private cookieDomain: string | null = null;\n\n constructor(logger: LoggerInterface) {\n this.logger = logger;\n this.localStorage = new LocalStorageManager(logger);\n this.indexedDB = new IndexedDBManager(logger);\n }\n\n /** Set the parent-domain used when writing cross-subdomain cookies. */\n setCookieDomain(domain: string | null): void {\n this.cookieDomain = domain;\n this.logger.debug(\n domain\n ? `🍪 Cookie domain set to ${domain} (cross-subdomain sharing enabled)`\n : \"🍪 Cookie domain not set — using host-only cookies\"\n );\n }\n\n // User ID management - stores in both cookie and localStorage\n setUserId(userId: string): void {\n if (!userId || userId.trim() === \"\") {\n this.logger.warn(\"Cannot set empty user ID\");\n return;\n }\n\n const trimmedUserId = userId.trim();\n\n // Store in cookie (with cross-subdomain domain if configured)\n try {\n this.setCookie(this.USER_ID_KEY, trimmedUserId, {\n days: this.USER_ID_COOKIE_EXPIRES,\n domain: this.cookieDomain,\n });\n this.logger.debug(`👤 User ID stored in cookie: ${trimmedUserId}`);\n } catch (error) {\n this.logger.error(\"Failed to store user ID in cookie:\", error);\n }\n\n // Store in localStorage\n try {\n if (typeof localStorage !== \"undefined\") {\n localStorage.setItem(this.USER_ID_KEY, trimmedUserId);\n this.logger.debug(\n `👤 User ID stored in localStorage: ${trimmedUserId}`\n );\n }\n } catch (error) {\n this.logger.error(\"Failed to store user ID in localStorage:\", error);\n }\n }\n\n getUserId(): string | null {\n // Cookie is authoritative — it's the cross-subdomain shared source of\n // truth, identical to how getSession() reads. localStorage is host-scoped\n // and goes stale when sibling subdomains update the user (e.g. A switches\n // user, B's localStorage still has the old value). Keep reading it as a\n // fallback for cookies-disabled / single-origin mode only.\n let cookieUserId: string | null = null;\n try {\n cookieUserId = this.getCookie(this.USER_ID_KEY);\n } catch (error) {\n this.logger.debug(\"Failed to get user ID from cookie:\", error);\n }\n\n if (cookieUserId) {\n // Repair stale localStorage so any code reading it directly converges.\n try {\n if (\n typeof localStorage !== \"undefined\" &&\n localStorage.getItem(this.USER_ID_KEY) !== cookieUserId\n ) {\n localStorage.setItem(this.USER_ID_KEY, cookieUserId);\n }\n } catch (error) {\n // Ignore sync errors\n }\n return cookieUserId;\n }\n\n // Fallback to localStorage (cookies disabled / pre-migration data).\n try {\n if (typeof localStorage !== \"undefined\") {\n const userId = localStorage.getItem(this.USER_ID_KEY);\n if (userId) {\n return userId;\n }\n }\n } catch (error) {\n this.logger.debug(\"Failed to get user ID from localStorage:\", error);\n }\n\n return null;\n }\n\n removeUserId(): void {\n // Remove from cookie — delete both the host-only and cross-subdomain\n // variants in case a page was loaded before cookieDomain was configured.\n try {\n this.deleteCookie(this.USER_ID_KEY);\n this.logger.debug(\"👤 User ID removed from cookie\");\n } catch (error) {\n this.logger.error(\"Failed to remove user ID from cookie:\", error);\n }\n\n // Remove from localStorage\n try {\n if (typeof localStorage !== \"undefined\") {\n localStorage.removeItem(this.USER_ID_KEY);\n this.logger.debug(\"👤 User ID removed from localStorage\");\n }\n } catch (error) {\n this.logger.error(\"Failed to remove user ID from localStorage:\", error);\n }\n }\n\n /** Get persistent anonymous_id; create + persist one if absent. */\n getAnonymousId(): string {\n // 1) Try cookie first (cross-subdomain reads).\n try {\n const cookieVal = this.getCookie(ANONYMOUS_ID_COOKIE);\n if (cookieVal && cookieVal.startsWith(ANONYMOUS_ID_PREFIX)) {\n try { localStorage.setItem(ANONYMOUS_ID_LS_KEY, cookieVal); } catch {}\n return cookieVal;\n }\n } catch (e) {\n this.logger.debug(\"anonymous_id cookie read failed\", e);\n }\n\n // 2) Fallback: localStorage.\n try {\n const lsVal = typeof localStorage !== \"undefined\"\n ? localStorage.getItem(ANONYMOUS_ID_LS_KEY)\n : null;\n if (lsVal && lsVal.startsWith(ANONYMOUS_ID_PREFIX)) {\n this.setAnonymousId(lsVal);\n return lsVal;\n }\n } catch (e) {\n this.logger.debug(\"anonymous_id localStorage read failed\", e);\n }\n\n // 3) Generate new.\n const id = generateAnonymousId();\n this.setAnonymousId(id);\n this.logger.info(`🆔 Generated new anonymous_id: ${id}`);\n return id;\n }\n\n /** Persist anonymous_id to cookie + localStorage. */\n setAnonymousId(id: string): void {\n if (!id || !id.startsWith(ANONYMOUS_ID_PREFIX)) {\n this.logger.warn(`Refusing to set malformed anonymous_id: ${id}`);\n return;\n }\n try {\n this.setCookie(ANONYMOUS_ID_COOKIE, id, {\n days: ANONYMOUS_ID_TTL_DAYS,\n domain: this.cookieDomain,\n });\n } catch (e) {\n this.logger.error(\"anonymous_id cookie write failed\", e);\n }\n try {\n if (typeof localStorage !== \"undefined\") {\n localStorage.setItem(ANONYMOUS_ID_LS_KEY, id);\n }\n } catch (e) {\n this.logger.error(\"anonymous_id localStorage write failed\", e);\n }\n }\n\n /** Generate a fresh anonymous_id, persist it, and return it. Used on Case X. */\n rotateAnonymousId(): string {\n const newId = generateAnonymousId();\n this.setAnonymousId(newId);\n this.logger.info(`🔄 Rotated anonymous_id: ${newId}`);\n return newId;\n }\n\n // Cookie helper methods\n private setCookie(\n name: string,\n value: string,\n optionsOrDays: CookieOptions | number = {}\n ): boolean {\n try {\n const options: CookieOptions =\n typeof optionsOrDays === \"number\"\n ? { days: optionsOrDays }\n : optionsOrDays;\n const days = options.days ?? this.USER_ID_COOKIE_EXPIRES;\n const expires = new Date();\n expires.setTime(expires.getTime() + days * 24 * 60 * 60 * 1000);\n const secure =\n options.secure ??\n (typeof location !== \"undefined\" && location.protocol === \"https:\");\n const domain = options.domain ?? this.cookieDomain;\n\n const parts: string[] = [\n `${name}=${encodeURIComponent(value)}`,\n `expires=${expires.toUTCString()}`,\n \"path=/\",\n \"SameSite=Lax\",\n ];\n if (domain) parts.push(`domain=${domain}`);\n if (secure) parts.push(\"Secure\");\n document.cookie = parts.join(\";\");\n return true;\n } catch (error) {\n this.logger.error(\"Failed to set cookie:\", error);\n return false;\n }\n }\n\n private getCookie(name: string): string | null {\n try {\n const nameEQ = name + \"=\";\n const ca = document.cookie.split(\";\");\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) === \" \") c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) === 0) {\n return decodeURIComponent(c.substring(nameEQ.length, c.length));\n }\n }\n return null;\n } catch (error) {\n this.logger.error(\"Failed to get cookie:\", error);\n return null;\n }\n }\n\n private deleteCookie(name: string): void {\n try {\n // Delete both host-only and domain-scoped variants so stale cookies\n // written before cookieDomain was configured get cleaned up too.\n document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;`;\n if (this.cookieDomain) {\n document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;domain=${this.cookieDomain};`;\n }\n } catch (error) {\n this.logger.error(\"Failed to delete cookie:\", error);\n }\n }\n\n async init(): Promise<void> {\n await this.indexedDB.init();\n }\n\n // Pending events (best-effort) for unload/redirect scenarios\n getPendingEvents(): EventData[] {\n try {\n const value = this.localStorage.get(this.PENDING_EVENTS_KEY);\n if (!Array.isArray(value)) {\n return [];\n }\n return value as EventData[];\n } catch (error) {\n this.logger.debug(\"Failed to read pending events:\", error);\n return [];\n }\n }\n\n appendPendingEvents(events: EventData[]): void {\n if (!events || events.length === 0) {\n return;\n }\n try {\n const existing = this.getPendingEvents();\n const merged = [...existing, ...events];\n // Keep a reasonable cap to avoid localStorage quota issues\n const capped = merged.slice(-500);\n this.localStorage.set(this.PENDING_EVENTS_KEY, capped);\n } catch (error) {\n this.logger.debug(\"Failed to append pending events:\", error);\n }\n }\n\n removePendingEventsByIds(eventIds: string[]): void {\n if (!eventIds || eventIds.length === 0) {\n return;\n }\n try {\n const existing = this.getPendingEvents();\n if (existing.length === 0) {\n return;\n }\n const idSet = new Set(eventIds);\n const filtered = existing.filter((e) => !idSet.has(e.event_id));\n if (filtered.length === 0) {\n this.localStorage.remove(this.PENDING_EVENTS_KEY);\n } else {\n this.localStorage.set(this.PENDING_EVENTS_KEY, filtered);\n }\n } catch (error) {\n this.logger.debug(\"Failed to remove pending events:\", error);\n }\n }\n\n clearPendingEvents(): void {\n try {\n this.localStorage.remove(this.PENDING_EVENTS_KEY);\n } catch (error) {\n this.logger.debug(\"Failed to clear pending events:\", error);\n }\n }\n\n // UTM data management\n storeUTMData(utmData: Partial<AttributionData>): void {\n try {\n const existingData = this.getUTMData();\n\n // Create default UTM data if none exists\n const defaultUTMData: UTMData = {\n utm_source: \"\",\n utm_medium: \"\",\n utm_campaign: \"\",\n utm_term: \"\",\n utm_content: \"\",\n timestamp: Date.now(),\n };\n\n const newData: AttributionData = {\n firstTouch: existingData?.firstTouch || defaultUTMData,\n lastTouch: existingData?.lastTouch || defaultUTMData,\n touchpoints: existingData?.touchpoints || [],\n ...utmData,\n expiresAt: Date.now() + 30 * 24 * 60 * 60 * 1000, // 30 days\n };\n\n this.writeAttribution(newData);\n this.logger.debug(\"UTM data stored successfully:\", {\n firstTouch: newData.firstTouch,\n lastTouch: newData.lastTouch,\n touchpointsCount: newData.touchpoints.length,\n expiresAt: new Date(newData.expiresAt).toISOString(),\n });\n } catch (error) {\n this.logger.error(\"Failed to store UTM data:\", error);\n }\n }\n\n getUTMData(): AttributionData | null {\n // Cookie is source of truth — it's cross-subdomain shared and survives\n // navigation between e.g. example.com and app.example.com.\n const cookieData = this.readAttributionFromCookie();\n if (cookieData && cookieData.expiresAt && cookieData.expiresAt > Date.now()) {\n return cookieData;\n }\n if (cookieData) {\n this.deleteCookie(this.ATTRIB_COOKIE_KEY);\n }\n\n // Fallback to localStorage (covers: cookies disabled, legacy data pre-migration).\n const lsData = this.localStorage.get(this.UTM_STORAGE_KEY);\n if (lsData && lsData.expiresAt && lsData.expiresAt > Date.now()) {\n return lsData;\n }\n if (lsData) {\n this.localStorage.remove(this.UTM_STORAGE_KEY);\n }\n\n return null;\n }\n\n // Session management\n storeSession(session: any): void {\n // Write to cookie first (cross-subdomain shareable) and mirror to\n // localStorage so the session survives cookie failures / incognito mode.\n try {\n const serialized = JSON.stringify(session);\n this.setCookie(this.SESSION_COOKIE_KEY, serialized, {\n days: this.SESSION_COOKIE_EXPIRES,\n domain: this.cookieDomain,\n });\n } catch (error) {\n this.logger.debug(\"Failed to store session in cookie:\", error);\n }\n this.localStorage.set(this.SESSION_STORAGE_KEY, session);\n }\n\n getSession(): any {\n // Cookie is authoritative when present — it reflects cross-subdomain state.\n try {\n const raw = this.getCookie(this.SESSION_COOKIE_KEY);\n if (raw) {\n return JSON.parse(raw);\n }\n } catch (error) {\n this.logger.debug(\"Failed to parse session cookie:\", error);\n }\n return this.localStorage.get(this.SESSION_STORAGE_KEY);\n }\n\n /**\n * One-shot migration from legacy single-origin localStorage keys to the\n * new cross-subdomain cookies. Called once during SDK init after the\n * cookieDomain has been resolved. Safe to invoke when there's no legacy\n * data — simply no-ops.\n *\n * Strategy: if the cookie is empty but localStorage has a value, copy\n * localStorage → cookie. Keep the localStorage entry as a fallback rather\n * than deleting it, so a downgrade to an older SDK build doesn't lose state.\n */\n migrateLegacyStorage(): void {\n // Session\n try {\n const cookieSession = this.getCookie(this.SESSION_COOKIE_KEY);\n if (!cookieSession) {\n const legacy = this.localStorage.get(this.SESSION_STORAGE_KEY);\n if (legacy) {\n this.setCookie(this.SESSION_COOKIE_KEY, JSON.stringify(legacy), {\n days: this.SESSION_COOKIE_EXPIRES,\n domain: this.cookieDomain,\n });\n this.logger.debug(\"↗️ Migrated legacy session to cookie\");\n }\n }\n } catch (error) {\n this.logger.debug(\"Session migration skipped:\", error);\n }\n\n // Attribution / UTM\n try {\n const cookieAttrib = this.getCookie(this.ATTRIB_COOKIE_KEY);\n if (!cookieAttrib) {\n const legacy = this.localStorage.get(this.UTM_STORAGE_KEY);\n if (\n legacy &&\n legacy.expiresAt &&\n legacy.expiresAt > Date.now()\n ) {\n this.writeAttribution(legacy);\n this.logger.debug(\"↗️ Migrated legacy attribution data to cookie\");\n }\n }\n } catch (error) {\n this.logger.debug(\"Attribution migration skipped:\", error);\n }\n\n // User ID — the old SDK wrote a host-only cookie. If the new cross-domain\n // cookie is missing but localStorage has a user ID, upgrade it so sibling\n // subdomains can read it immediately.\n try {\n if (this.cookieDomain) {\n const existingUid = this.getCookie(this.USER_ID_KEY);\n const lsUid =\n typeof localStorage !== \"undefined\"\n ? localStorage.getItem(this.USER_ID_KEY)\n : null;\n if (!existingUid && lsUid) {\n this.setCookie(this.USER_ID_KEY, lsUid, {\n days: this.USER_ID_COOKIE_EXPIRES,\n domain: this.cookieDomain,\n });\n this.logger.debug(\"↗️ Migrated legacy user ID to cross-subdomain cookie\");\n }\n }\n } catch (error) {\n this.logger.debug(\"User ID migration skipped:\", error);\n }\n }\n\n // --- Attribution cookie helpers ----------------------------------------\n\n private writeAttribution(data: AttributionData): void {\n // Always mirror to localStorage so an oversized/rejected cookie doesn't\n // leave us stateless on this origin.\n this.localStorage.set(this.UTM_STORAGE_KEY, data);\n\n const ttlMs = Math.max(0, data.expiresAt - Date.now());\n const days = Math.max(1, Math.ceil(ttlMs / (24 * 60 * 60 * 1000)));\n\n let payload = encodeURIComponent(JSON.stringify(data));\n if (payload.length > MAX_ATTRIB_COOKIE_BYTES) {\n // Trim touchpoints (oldest first) until we fit.\n const trimmed: AttributionData = {\n ...data,\n touchpoints: (data.touchpoints || []).slice(-TOUCHPOINTS_TRIM_LIMIT),\n };\n payload = encodeURIComponent(JSON.stringify(trimmed));\n if (payload.length > MAX_ATTRIB_COOKIE_BYTES) {\n // Still too large — drop touchpoints entirely, keep first/last touch.\n const minimal: AttributionData = { ...trimmed, touchpoints: [] };\n payload = encodeURIComponent(JSON.stringify(minimal));\n }\n this.logger.debug(\n \"Attribution cookie payload trimmed to fit size limit\"\n );\n this.setCookie(\n this.ATTRIB_COOKIE_KEY,\n decodeURIComponent(payload),\n { days, domain: this.cookieDomain }\n );\n return;\n }\n\n this.setCookie(this.ATTRIB_COOKIE_KEY, JSON.stringify(data), {\n days,\n domain: this.cookieDomain,\n });\n }\n\n private readAttributionFromCookie(): AttributionData | null {\n try {\n const raw = this.getCookie(this.ATTRIB_COOKIE_KEY);\n if (!raw) return null;\n return JSON.parse(raw) as AttributionData;\n } catch (error) {\n this.logger.debug(\"Failed to parse attribution cookie:\", error);\n return null;\n }\n }\n\n // Event queue management\n async queueEvent(event: EventData): Promise<void> {\n try {\n await this.indexedDB.addEvent(event);\n } catch (error) {\n this.logger.error(\"Failed to queue event:\", error);\n throw error;\n }\n }\n\n async getUnsentEvents(limit: number = 100): Promise<EventData[]> {\n return await this.indexedDB.getUnsentEvents(limit);\n }\n\n async markEventsAsSent(eventIds: string[]): Promise<void> {\n await this.indexedDB.markEventsAsSent(eventIds);\n }\n\n async getQueueSize(): Promise<number> {\n return await this.indexedDB.getQueueSize();\n }\n\n async cleanupOldEvents(): Promise<void> {\n await this.indexedDB.cleanupOldEvents();\n }\n\n async clearQueue(): Promise<void> {\n await this.indexedDB.clear();\n }\n\n // Cleanup expired data\n cleanupExpiredData(): void {\n this.getUTMData(); // This will automatically clean up expired UTM data\n }\n\n /**\n * Store user traits (merges with existing traits)\n */\n setUserTraits(traits: UserTraits): void {\n try {\n const existing = this.getUserTraits() || {};\n const merged = { ...existing, ...traits };\n\n // Store to localStorage (persistent)\n if (typeof localStorage !== \"undefined\") {\n localStorage.setItem(this.USER_TRAITS_KEY, JSON.stringify(merged));\n this.logger.debug(\"User traits stored:\", merged);\n }\n } catch (error) {\n this.logger.error(\"Failed to store user traits:\", error);\n }\n }\n\n /**\n * Get user traits\n */\n getUserTraits(): UserTraits | null {\n try {\n if (typeof localStorage !== \"undefined\") {\n const data = localStorage.getItem(this.USER_TRAITS_KEY);\n return data ? JSON.parse(data) : null;\n }\n return null;\n } catch (error) {\n this.logger.error(\"Failed to get user traits:\", error);\n return null;\n }\n }\n\n /**\n * Clear user traits\n */\n clearUserTraits(): void {\n try {\n if (typeof localStorage !== \"undefined\") {\n localStorage.removeItem(this.USER_TRAITS_KEY);\n this.logger.debug(\"User traits cleared\");\n }\n } catch (error) {\n this.logger.error(\"Failed to clear user traits:\", error);\n }\n }\n}\n","/**\n * SDK Version\n * This version is automatically updated from package.json during build\n * DO NOT manually edit this file - it will be overwritten during build\n */\nexport const SDK_VERSION = \"0.5.2\";\n","import {\n QueueInterface,\n EventData,\n BatchEventRequest,\n LoggerInterface,\n IMMEDIATE_EVENTS,\n} from \"../types\";\nimport { retry, debounce, getTimestamp } from \"../utils\";\nimport { SDK_VERSION } from \"../version\";\n\nexport class EventQueueManager implements QueueInterface {\n private queue: EventData[] = [];\n private processing: boolean = false;\n private batchTimer: ReturnType<typeof setTimeout> | null = null;\n private logger: LoggerInterface;\n private apiKey: string;\n private apiEndpoint: string;\n private batchSize: number;\n private batchInterval: number;\n private maxRetries: number;\n private retryDelay: number;\n private sendEvents: (events: EventData[]) => Promise<void>;\n private retryCounts: Map<string, number> = new Map();\n\n constructor(\n logger: LoggerInterface,\n apiKey: string,\n apiEndpoint: string,\n batchSize: number = 100,\n batchInterval: number = 2000,\n maxRetries: number = 3,\n retryDelay: number = 1000,\n sendEvents: (events: EventData[]) => Promise<void>\n ) {\n this.logger = logger;\n this.apiKey = apiKey;\n this.apiEndpoint = apiEndpoint;\n this.batchSize = batchSize;\n this.batchInterval = batchInterval;\n this.maxRetries = maxRetries;\n this.retryDelay = retryDelay;\n this.sendEvents = sendEvents;\n\n // Debounced process function to avoid excessive calls\n this.debouncedProcess = debounce(this.process.bind(this), 100);\n }\n\n add(event: EventData): void {\n // Check if this is an immediate event\n if (IMMEDIATE_EVENTS.includes(event.event_type)) {\n this.logger.debug(\n `Immediate event detected: ${event.event_type}, sending immediately`\n );\n // Do not enqueue first; enqueue only on failure to avoid duplicates.\n this.processImmediate(event);\n return;\n }\n\n this.queue.push(event);\n this.logger.debug(`Event added to queue: ${event.event_type}`);\n this.scheduleBatchProcessing();\n }\n\n async process(): Promise<void> {\n if (this.processing || this.queue.length === 0) {\n return;\n }\n\n this.processing = true;\n const eventsToProcess = this.queue.splice(0, this.batchSize);\n\n try {\n this.logger.debug(\n `Processing ${eventsToProcess.length} events from queue`\n );\n\n await this.sendEvents(eventsToProcess);\n this.resetRetryCounts(eventsToProcess);\n\n this.logger.info(\n `Successfully processed ${eventsToProcess.length} events`\n );\n\n // Events are automatically removed from queue when successfully sent\n // No need to manually clean up as they were already spliced from the queue\n } catch (error) {\n this.logger.error(\"Failed to process events:\", error);\n\n // Put the failed batch back in queue for retry (with max retry cap)\n this.enqueueBatchForRetry(eventsToProcess);\n\n // Schedule retry\n setTimeout(() => {\n this.processing = false;\n this.debouncedProcess();\n }, this.retryDelay);\n\n return;\n }\n\n this.processing = false;\n\n // Process remaining events if any\n if (this.queue.length > 0) {\n this.debouncedProcess();\n }\n }\n\n private async processImmediate(event: EventData): Promise<void> {\n try {\n this.logger.debug(`Processing immediate event: ${event.event_type}`);\n await this.sendEvents([event]);\n this.resetRetryCounts([event]);\n this.logger.info(\n `Immediate event processed successfully: ${event.event_type}`\n );\n } catch (error) {\n this.logger.error(\n `Failed to process immediate event: ${event.event_type}`,\n error\n );\n\n // Add to queue for retry (with max retry cap)\n this.enqueueBatchForRetry([event]);\n }\n }\n\n private scheduleBatchProcessing(): void {\n if (this.batchTimer) {\n clearTimeout(this.batchTimer);\n }\n\n this.batchTimer = setTimeout(() => {\n this.debouncedProcess();\n }, this.batchInterval);\n }\n\n clear(): void {\n this.queue = [];\n if (this.batchTimer) {\n clearTimeout(this.batchTimer);\n this.batchTimer = null;\n }\n this.processing = false;\n this.logger.info(\"Event queue cleared\");\n }\n\n size(): number {\n return this.queue.length;\n }\n\n // Get queue statistics\n getStats(): { size: number; processing: boolean } {\n return {\n size: this.queue.length,\n processing: this.processing,\n };\n }\n\n // Force process all events in queue\n async flush(): Promise<void> {\n this.logger.info(\"Flushing event queue\");\n while (this.queue.length > 0) {\n await this.process();\n }\n }\n\n /**\n * Drain pending events from the in-memory queue (used for unload-safe flushing).\n * This clears any scheduled timers and stops processing.\n */\n drainAll(): EventData[] {\n const drained = this.queue.splice(0, this.queue.length);\n if (this.batchTimer) {\n clearTimeout(this.batchTimer);\n this.batchTimer = null;\n }\n this.processing = false;\n return drained;\n }\n\n private enqueueBatchForRetry(events: EventData[]): void {\n const retryable: EventData[] = [];\n for (const event of events) {\n const attempts = (this.retryCounts.get(event.event_id) || 0) + 1;\n this.retryCounts.set(event.event_id, attempts);\n\n if (attempts > this.maxRetries) {\n this.logger.warn(\n `Dropping event after max retries (${this.maxRetries}): ${event.event_type} (${event.event_id})`\n );\n this.retryCounts.delete(event.event_id);\n continue;\n }\n\n retryable.push(event);\n }\n\n if (retryable.length > 0) {\n this.queue.unshift(...retryable);\n }\n }\n\n private resetRetryCounts(events: EventData[]): void {\n for (const event of events) {\n this.retryCounts.delete(event.event_id);\n }\n }\n\n // Debounced process function\n private debouncedProcess: () => void;\n}\n\n// HTTP client for sending events\nexport class EventHttpClient {\n private logger: LoggerInterface;\n private apiKey: string;\n private apiEndpoint: string;\n private maxRetries: number;\n private retryDelay: number;\n\n constructor(\n logger: LoggerInterface,\n apiKey: string,\n apiEndpoint: string,\n maxRetries: number = 3,\n retryDelay: number = 1000\n ) {\n this.logger = logger;\n this.apiKey = apiKey;\n this.apiEndpoint = apiEndpoint;\n this.maxRetries = maxRetries;\n this.retryDelay = retryDelay;\n }\n\n async sendEvents(events: EventData[]): Promise<void> {\n if (events.length === 0) {\n return;\n }\n\n // Transform events to match server format\n const transformedEvents = events.map((event) => ({\n event_id: event.event_id,\n event_type: event.event_type,\n anonymous_id: event.anonymous_id,\n tracking_user_id: event.tracking_user_id,\n utm_source: event.utm_source || null,\n utm_medium: event.utm_medium || null,\n utm_campaign: event.utm_campaign || null,\n utm_term: event.utm_term || null,\n utm_content: event.utm_content || null,\n revenue: event.revenue || null,\n currency: event.currency || null,\n event_data: event.event_data || null,\n context: event.context || null,\n timestamp: event.timestamp || getTimestamp(), // Convert to seconds\n device: event.device || null,\n // Ad-tracking dimensions flow from STORED last-touch attribution, so they\n // survive on conversion events whose current page URL has no ad params —\n // the backend cannot re-derive those from the current page. Forward them.\n adgroup_id: event.adgroup_id || null,\n ad_id: event.ad_id || null,\n adgroup_id_source: event.adgroup_id_source || null,\n ad_id_source: event.ad_id_source || null,\n click_id: event.click_id || null,\n click_id_source: event.click_id_source || null,\n custom_event_name: event.custom_event_name || undefined,\n }));\n\n const batchRequest: BatchEventRequest = {\n events: transformedEvents,\n sdk_version: SDK_VERSION,\n };\n\n await retry(\n async () => {\n const response = await fetch(`${this.apiEndpoint}/attribution/events`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(batchRequest),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`HTTP ${response.status}: ${errorText}`);\n }\n\n const result = await response.json();\n this.logger.debug(\"Events sent successfully:\", result);\n\n // Return the sent events for cleanup\n return { result, sentEvents: events };\n },\n this.maxRetries,\n this.retryDelay\n );\n }\n\n /**\n * Unload-safe best-effort send. Uses `fetch({ keepalive: true })` so the browser\n * can continue sending even when the page is unloading (redirect / close / refresh).\n *\n * Note: keepalive requests are size-limited by browsers (typically ~64KB).\n */\n async sendEventsKeepalive(events: EventData[]): Promise<void> {\n if (events.length === 0) {\n return;\n }\n\n const transformedEvents = events.map((event) => ({\n event_id: event.event_id,\n event_type: event.event_type,\n anonymous_id: event.anonymous_id,\n tracking_user_id: event.tracking_user_id,\n utm_source: event.utm_source || null,\n utm_medium: event.utm_medium || null,\n utm_campaign: event.utm_campaign || null,\n utm_term: event.utm_term || null,\n utm_content: event.utm_content || null,\n revenue: event.revenue || null,\n currency: event.currency || null,\n event_data: event.event_data || null,\n context: event.context || null,\n timestamp: event.timestamp || getTimestamp(),\n device: event.device || null,\n // Ad-tracking dimensions flow from STORED last-touch attribution, so they\n // survive on conversion events whose current page URL has no ad params —\n // the backend cannot re-derive those from the current page. Forward them.\n adgroup_id: event.adgroup_id || null,\n ad_id: event.ad_id || null,\n adgroup_id_source: event.adgroup_id_source || null,\n ad_id_source: event.ad_id_source || null,\n click_id: event.click_id || null,\n click_id_source: event.click_id_source || null,\n custom_event_name: event.custom_event_name || undefined,\n }));\n\n const batchRequest: BatchEventRequest = {\n events: transformedEvents,\n sdk_version: SDK_VERSION,\n };\n\n const response = await fetch(`${this.apiEndpoint}/attribution/events`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(batchRequest),\n keepalive: true,\n });\n\n if (!response.ok) {\n // Best-effort: do not throw an unreadable body during unload.\n throw new Error(`HTTP ${response.status}`);\n }\n }\n\n /**\n * Unload-safe beacon send.\n *\n * Why: cross-origin `fetch` with Authorization/JSON often triggers preflight, which is frequently\n * canceled during unload/redirect. Beacon avoids preflight by not using custom headers.\n *\n * Requires backend to accept api_key via query param and `text/plain` body.\n */\n sendEventsBeacon(events: EventData[]): boolean {\n if (events.length === 0) {\n return true;\n }\n\n if (\n typeof navigator === \"undefined\" ||\n typeof navigator.sendBeacon !== \"function\"\n ) {\n return false;\n }\n\n const transformedEvents = events.map((event) => ({\n event_id: event.event_id,\n event_type: event.event_type,\n anonymous_id: event.anonymous_id,\n tracking_user_id: event.tracking_user_id,\n utm_source: event.utm_source || null,\n utm_medium: event.utm_medium || null,\n utm_campaign: event.utm_campaign || null,\n utm_term: event.utm_term || null,\n utm_content: event.utm_content || null,\n revenue: event.revenue || null,\n currency: event.currency || null,\n event_data: event.event_data || null,\n context: event.context || null,\n timestamp: event.timestamp || getTimestamp(),\n device: event.device || null,\n // Ad-tracking dimensions flow from STORED last-touch attribution, so they\n // survive on conversion events whose current page URL has no ad params —\n // the backend cannot re-derive those from the current page. Forward them.\n adgroup_id: event.adgroup_id || null,\n ad_id: event.ad_id || null,\n adgroup_id_source: event.adgroup_id_source || null,\n ad_id_source: event.ad_id_source || null,\n click_id: event.click_id || null,\n click_id_source: event.click_id_source || null,\n custom_event_name: event.custom_event_name || undefined,\n }));\n\n const payload: BatchEventRequest = {\n events: transformedEvents,\n sdk_version: SDK_VERSION,\n };\n\n const url = `${\n this.apiEndpoint\n }/attribution/events_beacon?api_key=${encodeURIComponent(this.apiKey)}`;\n\n // Use text/plain to keep it \"simple\" and avoid preflight.\n const blob = new Blob([JSON.stringify(payload)], { type: \"text/plain\" });\n return navigator.sendBeacon(url, blob);\n }\n\n async sendSingleEvent(event: EventData): Promise<void> {\n await this.sendEvents([event]);\n }\n\n // Test connection\n async testConnection(): Promise<boolean> {\n try {\n const response = await fetch(`${this.apiEndpoint}/health`, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n return response.ok;\n } catch (error) {\n this.logger.error(\"Connection test failed:\", error);\n return false;\n }\n }\n}\n\n// Memory queue fallback\nexport class MemoryQueueManager implements QueueInterface {\n private queue: EventData[] = [];\n private maxSize: number;\n private logger: LoggerInterface;\n\n constructor(logger: LoggerInterface, maxSize: number = 1000) {\n this.logger = logger;\n this.maxSize = maxSize;\n }\n\n add(event: EventData): void {\n if (this.queue.length >= this.maxSize) {\n this.logger.warn(\"Memory queue full, removing oldest event\");\n this.queue.shift();\n }\n\n this.queue.push(event);\n this.logger.debug(`Event added to memory queue: ${event.event_type}`);\n }\n\n async process(): Promise<void> {\n // Memory queue doesn't process automatically\n // Events are stored in memory only\n this.logger.debug(\"Memory queue process called (no-op)\");\n }\n\n clear(): void {\n this.queue = [];\n this.logger.info(\"Memory queue cleared\");\n }\n\n size(): number {\n return this.queue.length;\n }\n\n // Get all events from memory queue\n getAllEvents(): EventData[] {\n return [...this.queue];\n }\n\n // Remove events from memory queue\n removeEvents(eventIds: string[]): void {\n this.queue = this.queue.filter(\n (event) => !eventIds.includes(event.event_id)\n );\n }\n}\n","// Root domain detection for cross-subdomain cookie sharing.\n//\n// Writes a probe cookie at progressively shorter hostname suffixes and checks\n// whether the browser accepted it. The browser rejects writes to public\n// suffixes (e.g. \".com\", \".co.uk\", \".github.io\"), so this naturally finds the\n// highest-level parent domain we're allowed to set cookies on — without\n// shipping a Public Suffix List.\n\nconst PROBE_NAME = \"__getuai_probe\";\n\nfunction isIpLiteral(hostname: string): boolean {\n // IPv4\n if (/^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(hostname)) return true;\n // IPv6 (bracketed or bare)\n if (hostname.includes(\":\")) return true;\n return false;\n}\n\nfunction hasDocumentCookieAccess(): boolean {\n try {\n return typeof document !== \"undefined\" && typeof document.cookie === \"string\";\n } catch {\n return false;\n }\n}\n\nfunction writeProbe(domain: string): boolean {\n try {\n document.cookie = `${PROBE_NAME}=1;domain=${domain};path=/;SameSite=Lax`;\n const found = document.cookie\n .split(\";\")\n .some((c) => c.trim().startsWith(`${PROBE_NAME}=`));\n if (found) {\n // Clean up the probe regardless of outcome\n document.cookie = `${PROBE_NAME}=;domain=${domain};path=/;expires=Thu, 01 Jan 1970 00:00:00 GMT`;\n }\n return found;\n } catch {\n return false;\n }\n}\n\n/**\n * Detect the broadest domain that cookies can be written to for the current\n * hostname. Returns a value suitable for the Cookie `domain` attribute\n * (leading dot, e.g. \".example.com\"), or null when cross-subdomain sharing is\n * not possible (localhost, IP literals, sandboxed environments).\n */\nexport function detectCookieDomain(): string | null {\n if (!hasDocumentCookieAccess()) return null;\n\n const hostname = (typeof location !== \"undefined\" && location.hostname) || \"\";\n if (!hostname) return null;\n if (hostname === \"localhost\") return null;\n if (isIpLiteral(hostname)) return null;\n\n const parts = hostname.split(\".\").filter(Boolean);\n if (parts.length < 2) return null; // single-label host, no parent to share with\n\n // Walk from the broadest valid candidate (2 labels, e.g. \".example.com\")\n // toward the full hostname. The first one the browser accepts is the\n // eTLD+1 — the broadest scope we can share cookies on.\n for (let i = parts.length - 2; i >= 0; i--) {\n const candidate = \".\" + parts.slice(i).join(\".\");\n if (writeProbe(candidate)) return candidate;\n }\n\n return null;\n}\n\n/**\n * Normalise a user-supplied domain config value. Accepts \"example.com\" or\n * \".example.com\"; always returns the leading-dot form for consistency with the\n * auto-detected value.\n */\nexport function normaliseDomain(input: string | undefined | null): string | null {\n if (!input) return null;\n const trimmed = input.trim();\n if (!trimmed) return null;\n return trimmed.startsWith(\".\") ? trimmed : \".\" + trimmed;\n}\n","import {\n SDKConfig,\n EventData,\n EventType,\n AttributionData,\n UTMData,\n Currency,\n UserSession,\n IMMEDIATE_EVENTS,\n defaultEndpoint,\n UserTraits,\n DEFAULT_FIELD_MAPPINGS,\n} from \"../types\";\nimport { AttributionStorageManager } from \"../storage\";\nimport { EventQueueManager, EventHttpClient } from \"../queue\";\nimport {\n generateId,\n getTimestamp,\n extractUTMParams,\n extractAdParams,\n detectDevice,\n getCurrentUrl,\n getBestUTMSourceUrl,\n getReferrer,\n getUserAgent,\n getPageTitle,\n generateSessionId,\n isOnline,\n ConsoleLogger,\n addUTMToURL,\n shouldExcludeDomain,\n isExternalURL,\n filterUTMParams,\n cleanURL,\n getQueryString,\n getQueryParams,\n} from \"../utils\";\nimport {\n detectCookieDomain,\n normaliseDomain,\n} from \"../utils/rootDomain\";\n\nexport class AttributionSDK {\n private config: SDKConfig;\n private logger: ConsoleLogger;\n private storage: AttributionStorageManager;\n private httpClient: EventHttpClient;\n private queue: EventQueueManager;\n private session: UserSession | null = null;\n private initialized: boolean = false;\n private autoTrackEnabled: boolean = false;\n private pageViewTrackTimes: Map<string, number> = new Map();\n private cachedPublicIP: string | null = null;\n private publicIPFetchPromise: Promise<string | null> | null = null;\n private initialPageViewTriggered: boolean = false;\n // SPA tracking internals\n private spaTrackingEnabled: boolean = false;\n private lastTrackedPath: string = \"\";\n private originalPushState: typeof history.pushState | null = null;\n private originalReplaceState: typeof history.replaceState | null = null;\n private popstateHandler: ((event: PopStateEvent) => void) | null = null;\n\n constructor(config: SDKConfig) {\n this.config = {\n apiEndpoint: defaultEndpoint,\n batchSize: 100,\n batchInterval: 2000,\n maxRetries: 3,\n retryDelay: 1000,\n enableDebug: false,\n autoTrack: false,\n autoTrackPageView: false,\n sessionTimeout: 30 * 60 * 1000, // 30 minutes\n enableCrossDomainUTM: true,\n crossDomainUTMParams: [\n \"utm_source\",\n \"utm_medium\",\n \"utm_campaign\",\n \"utm_term\",\n \"utm_content\",\n ],\n excludeDomains: [],\n autoCleanUTM: true,\n pageViewDebounceInterval: 5000, // 5 seconds default\n ...config,\n };\n\n this.logger = new ConsoleLogger(this.config.enableDebug);\n this.storage = new AttributionStorageManager(this.logger);\n this.httpClient = new EventHttpClient(\n this.logger,\n this.config.apiKey,\n this.config.apiEndpoint || defaultEndpoint,\n this.config.maxRetries,\n this.config.retryDelay\n );\n\n this.queue = new EventQueueManager(\n this.logger,\n this.config.apiKey,\n this.config.apiEndpoint || defaultEndpoint,\n this.config.batchSize,\n this.config.batchInterval,\n this.config.maxRetries,\n this.config.retryDelay,\n (events) => this.httpClient.sendEvents(events)\n );\n }\n\n async init(): Promise<void> {\n if (this.initialized) {\n this.logger.warn(\"SDK already initialized\");\n return;\n }\n\n try {\n this.logger.info(\"Initializing GetuAI Attribution SDK\");\n\n // Resolve cross-subdomain cookie domain BEFORE any storage read/write\n // so session/user_id/attribution cookies land on the right scope from\n // the very first call. Explicit config wins; otherwise probe-detect.\n const resolvedDomain =\n normaliseDomain(this.config.domain) ??\n detectCookieDomain();\n this.storage.setCookieDomain(resolvedDomain);\n\n // Initialize storage in background (IndexedDB failure should not block SDK initialization)\n void this.storage.init().catch((storageError) => {\n this.logger.warn(\n \"Storage initialization failed (IndexedDB may be unavailable), continuing with basic features:\",\n storageError\n );\n });\n\n // Best-effort: upgrade any legacy single-origin state to the new\n // cross-subdomain cookies so upgraded sites don't lose their session.\n try {\n this.storage.migrateLegacyStorage();\n } catch (migrationError) {\n this.logger.debug(\"Legacy storage migration skipped:\", migrationError);\n }\n\n // Initialize user ID (from config or existing storage)\n this.initializeUserId();\n\n // Initialize session\n this.initializeSession();\n\n // Extract and store UTM data from current URL\n this.extractAndStoreUTMData();\n\n // Setup auto-tracking if enabled\n if (this.config.autoTrack) {\n this.setupAutoTracking();\n }\n\n // Setup online/offline handlers\n this.setupNetworkHandlers();\n\n // Setup page visibility handlers\n this.setupVisibilityHandlers();\n\n // Setup beforeunload handler\n this.setupBeforeUnloadHandler();\n\n // Mark initialized as early as possible so auto page view can be queued\n this.initialized = true;\n this.logger.info(\"🚀 GetuAI Attribution SDK initialized successfully\");\n this.logger.info(\n \"📄 Auto track page view = \" + this.config.autoTrackPageView\n );\n\n // Best-effort: retry pending events from last unload/redirect (do not block init)\n void this.retryPendingEvents().catch((error) => {\n this.logger.warn(\"⚠️ Pending events retry failed\", error);\n });\n\n // Auto track page view if enabled (independent from autoTrack)\n // Also enables SPA route tracking automatically\n if (this.config.autoTrackPageView) {\n this.logger.info(\n \"📄 Auto track page view enabled (including SPA route tracking)\"\n );\n // Record the initial path for SPA tracking\n this.lastTrackedPath = this.getCurrentPath();\n\n // Setup SPA tracking for route changes\n this.setupSPATracking();\n\n // Fire ASAP (microtask) to survive short redirects (e.g. 50ms)\n if (!this.initialPageViewTriggered) {\n this.initialPageViewTriggered = true;\n Promise.resolve()\n .then(() => this.trackPageView())\n .then(() => this.queue.process())\n .then(() => {\n this.logger.info(\"✅ Auto track page view completed\");\n })\n .catch((error) =>\n this.logger.error(\"❌ Auto track page view failed:\", error)\n );\n }\n }\n } catch (error) {\n this.logger.error(\"Failed to initialize SDK:\", error);\n throw error;\n }\n }\n\n // Track event (internal: custom_event_name is the 6th param, only used for CUSTOM type)\n async trackEvent(\n eventType: EventType,\n eventData?: Record<string, any>,\n tracking_user_id?: string,\n revenue?: number,\n currency: Currency = Currency.USD,\n custom_event_name?: string\n ): Promise<void> {\n if (!this.initialized) {\n this.logger.warn(\"SDK not initialized, event not tracked\");\n return;\n }\n\n try {\n const currentUrl = getCurrentUrl();\n // Use cached public IP (best-effort). Do not block tracking on network.\n const ip_address: string | null = this.cachedPublicIP;\n this.ensurePublicIPFetched();\n\n const pageContext = {\n domain: typeof window !== \"undefined\" ? window.location.hostname : null,\n path: typeof window !== \"undefined\" ? window.location.pathname : null,\n title: getPageTitle(),\n referrer: getReferrer(),\n url: currentUrl.split(\"?\")[0],\n querystring: getQueryString(currentUrl),\n query_params: getQueryParams(currentUrl),\n ip_address: ip_address,\n // Raw User-Agent on EVERY event (not just page_view): the lossless\n // device signal that lets the backend re-derive any future device\n // classification. Rides in context.page, persisted per-event server-side.\n user_agent: getUserAgent(),\n };\n const sessionContext = {\n session_id: this.session?.sessionId,\n start_time: this.session?.startTime,\n last_activity: this.session?.lastActivity,\n page_views: this.session?.pageViews,\n };\n // Use provided tracking_user_id or fallback to stored user ID\n const anonymousId = this.storage.getAnonymousId();\n const finalUserId = tracking_user_id || this.getUserId();\n\n const event: EventData = {\n event_id: generateId(),\n event_type: eventType,\n anonymous_id: anonymousId,\n tracking_user_id: finalUserId || undefined,\n timestamp: getTimestamp(),\n event_data: eventData,\n context: { page: pageContext, session: sessionContext },\n revenue: revenue,\n currency: currency,\n ...(eventType === EventType.CUSTOM && custom_event_name\n ? { custom_event_name }\n : {}),\n ...this.getUTMParams(),\n device: detectDevice(),\n ...this.getAdParams(),\n };\n\n this.logger.debug(`Tracking event: ${eventType}`, event);\n\n // Add to queue\n this.queue.add(event);\n } catch (error) {\n this.logger.error(`Failed to track event ${eventType}:`, error);\n }\n }\n\n // Track custom event\n async trackCustomEvent(\n customEventName: string,\n eventData?: Record<string, any>,\n tracking_user_id?: string,\n revenue?: number,\n currency: Currency = Currency.USD\n ): Promise<void> {\n if (!customEventName || customEventName.trim() === \"\") {\n this.logger.error(\"trackCustomEvent requires a non-empty customEventName\");\n return;\n }\n await this.trackEvent(\n EventType.CUSTOM,\n eventData,\n tracking_user_id,\n revenue,\n currency,\n customEventName.trim()\n );\n }\n\n // Track page view\n async trackPageView(\n pageData?: Record<string, any>,\n tracking_user_id?: string\n ): Promise<void> {\n const currentUrl = getCurrentUrl();\n // Use URL without query string as key for debouncing\n const pageKey = currentUrl.split(\"?\")[0];\n const now = Date.now();\n const debounceInterval = this.config.pageViewDebounceInterval || 5000;\n\n // Check if this page was tracked recently\n const lastTrackTime = this.pageViewTrackTimes.get(pageKey);\n if (lastTrackTime && now - lastTrackTime < debounceInterval) {\n this.logger.debug(\n `Page view debounced: ${pageKey} (last tracked ${\n now - lastTrackTime\n }ms ago)`\n );\n return;\n }\n\n const pageEventData = {\n url: currentUrl,\n title: getPageTitle(),\n referrer: getReferrer(),\n user_agent: getUserAgent(),\n ...pageData,\n };\n\n await this.trackEvent(EventType.PAGE_VIEW, pageEventData, tracking_user_id);\n\n // Update last track time for this page\n this.pageViewTrackTimes.set(pageKey, now);\n\n // Clean up old entries to prevent memory leak (keep only entries from last hour)\n this.cleanupPageViewTrackTimes();\n }\n\n // Clean up old page view track times to prevent memory leak\n private cleanupPageViewTrackTimes(): void {\n const oneHourAgo = Date.now() - 60 * 60 * 1000;\n for (const [pageKey, trackTime] of this.pageViewTrackTimes.entries()) {\n if (trackTime < oneHourAgo) {\n this.pageViewTrackTimes.delete(pageKey);\n }\n }\n }\n\n private ensurePublicIPFetched(): void {\n if (this.cachedPublicIP || this.publicIPFetchPromise) {\n return;\n }\n\n this.publicIPFetchPromise = this.fetchPublicIP()\n .then((ip) => {\n if (ip) {\n this.cachedPublicIP = ip;\n }\n return ip;\n })\n .catch(() => null)\n .finally(() => {\n this.publicIPFetchPromise = null;\n });\n }\n\n // Best-effort fetch of public IP address\n private async fetchPublicIP(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 2000);\n const response = await fetch(\"https://api.ipify.org?format=json\", {\n signal: controller.signal,\n headers: { Accept: \"application/json\" },\n });\n clearTimeout(timeout);\n if (!response.ok) {\n return null;\n }\n const data = await response.json();\n const ip = typeof data?.ip === \"string\" ? data.ip : null;\n return ip;\n } catch (error) {\n this.logger.debug(\"Public IP fetch failed\", error);\n return null;\n }\n }\n\n // Track purchase\n async trackPurchase(\n tracking_user_id: string,\n revenue: number,\n currency: Currency = Currency.USD,\n purchaseData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(\n EventType.PURCHASE,\n purchaseData,\n tracking_user_id,\n revenue,\n currency\n );\n }\n\n // Track login\n async trackLogin(\n tracking_user_id: string,\n loginData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(EventType.LOGIN, loginData, tracking_user_id);\n }\n\n // Track signup\n async trackSignup(\n tracking_user_id: string,\n signupData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(EventType.SIGNUP, signupData, tracking_user_id);\n }\n\n // Track form submission\n async trackFormSubmit(\n tracking_user_id?: string,\n formData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(EventType.FORM_SUBMIT, formData, tracking_user_id);\n }\n\n // Track video play\n async trackVideoPlay(\n tracking_user_id?: string,\n videoData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(EventType.VIDEO_PLAY, videoData, tracking_user_id);\n }\n\n // Track email verification\n async trackEmailVerification(\n tracking_user_id: string,\n verificationData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(\n EventType.EMAIL_VERIFICATION,\n verificationData,\n tracking_user_id\n );\n }\n\n // Track audit approved (conversion)\n async trackAuditApproved(\n tracking_user_id: string,\n auditData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(\n EventType.AUDIT_APPROVED,\n auditData,\n tracking_user_id\n );\n }\n\n // Track purchase with auto user ID (object parameter format)\n async trackPurchaseAuto(options: {\n revenue: number;\n currency?: Currency;\n purchaseData?: Record<string, any>;\n tracking_user_id?: string;\n }): Promise<void> {\n const userId = options.tracking_user_id || this.getUserId();\n if (!userId) {\n this.logger.error(\n \"❌ trackPurchaseAuto requires tracking_user_id. Please set user ID using setUserId() or pass it in options.tracking_user_id.\"\n );\n return;\n }\n await this.trackEvent(\n EventType.PURCHASE,\n options.purchaseData,\n userId,\n options.revenue,\n options.currency || Currency.USD\n );\n }\n\n // Track login with auto user ID (object parameter format)\n async trackLoginAuto(options: {\n loginData?: Record<string, any>;\n tracking_user_id?: string;\n }): Promise<void> {\n const userId = options.tracking_user_id || this.getUserId();\n if (!userId) {\n this.logger.error(\n \"❌ trackLoginAuto requires tracking_user_id. Please set user ID using setUserId() or pass it in options.tracking_user_id.\"\n );\n return;\n }\n await this.trackEvent(EventType.LOGIN, options.loginData, userId);\n }\n\n // Track signup with auto user ID (object parameter format)\n async trackSignupAuto(options: {\n signupData?: Record<string, any>;\n tracking_user_id?: string;\n }): Promise<void> {\n const userId = options.tracking_user_id || this.getUserId();\n if (!userId) {\n this.logger.error(\n \"❌ trackSignupAuto requires tracking_user_id. Please set user ID using setUserId() or pass it in options.tracking_user_id.\"\n );\n return;\n }\n await this.trackEvent(EventType.SIGNUP, options.signupData, userId);\n }\n\n // Track email verification with auto user ID (object parameter format)\n async trackEmailVerificationAuto(options: {\n verificationData?: Record<string, any>;\n tracking_user_id?: string;\n }): Promise<void> {\n const userId = options.tracking_user_id || this.getUserId();\n if (!userId) {\n this.logger.error(\n \"❌ trackEmailVerificationAuto requires tracking_user_id. Please set user ID using setUserId() or pass it in options.tracking_user_id.\"\n );\n return;\n }\n await this.trackEvent(\n EventType.EMAIL_VERIFICATION,\n options.verificationData,\n userId\n );\n }\n\n // Track product view\n async trackProductView(\n tracking_user_id?: string,\n productData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(\n EventType.PRODUCT_VIEW,\n productData,\n tracking_user_id\n );\n }\n\n // Track add to cart\n async trackAddToCart(\n tracking_user_id?: string,\n cartData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(EventType.ADD_TO_CART, cartData, tracking_user_id);\n }\n\n // Track page click for user click journey\n async trackPageClick(\n tracking_user_id?: string,\n clickData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(EventType.PAGE_CLICK, clickData, tracking_user_id);\n }\n\n // Track button click\n async trackButtonClick(\n buttonName?: string,\n tracking_user_id?: string,\n clickData?: Record<string, any>\n ): Promise<void> {\n await this.trackEvent(\n EventType.BUTTON_CLICK,\n { button_name: buttonName, ...clickData },\n tracking_user_id\n );\n }\n\n // Get attribution data\n getAttributionData(): AttributionData | null {\n return this.storage.getUTMData();\n }\n\n // Manually add UTM parameters to a URL\n addUTMToURL(url: string): string {\n if (!this.config.enableCrossDomainUTM) {\n return url;\n }\n\n const attributionData = this.getAttributionData();\n if (!attributionData) {\n return url;\n }\n\n const utmParams = filterUTMParams(\n attributionData.lastTouch,\n this.config.crossDomainUTMParams\n );\n\n return addUTMToURL(url, utmParams);\n }\n\n // Get current UTM parameters as object\n getCurrentUTMParams(): Record<string, string> {\n const attributionData = this.getAttributionData();\n if (!attributionData) {\n return {};\n }\n\n return filterUTMParams(\n attributionData.lastTouch,\n this.config.crossDomainUTMParams\n );\n }\n\n // Get UTM parameters for events\n private getUTMParams(): Partial<UTMData> {\n const attributionData = this.getAttributionData();\n if (!attributionData) {\n this.logger.debug(\"No attribution data available for UTM params\");\n return {};\n }\n\n const utmParams = {\n utm_source: attributionData.lastTouch.utm_source || null,\n utm_medium: attributionData.lastTouch.utm_medium || null,\n utm_campaign: attributionData.lastTouch.utm_campaign || null,\n utm_term: attributionData.lastTouch.utm_term || null,\n utm_content: attributionData.lastTouch.utm_content || null,\n };\n\n // Filter out empty values and return null for empty strings\n const filteredParams: Partial<UTMData> = {};\n if (utmParams.utm_source && utmParams.utm_source.trim() !== \"\") {\n filteredParams.utm_source = utmParams.utm_source;\n } else {\n filteredParams.utm_source = null;\n }\n if (utmParams.utm_medium && utmParams.utm_medium.trim() !== \"\") {\n filteredParams.utm_medium = utmParams.utm_medium;\n } else {\n filteredParams.utm_medium = null;\n }\n if (utmParams.utm_campaign && utmParams.utm_campaign.trim() !== \"\") {\n filteredParams.utm_campaign = utmParams.utm_campaign;\n } else {\n filteredParams.utm_campaign = null;\n }\n if (utmParams.utm_term && utmParams.utm_term.trim() !== \"\") {\n filteredParams.utm_term = utmParams.utm_term;\n } else {\n filteredParams.utm_term = null;\n }\n if (utmParams.utm_content && utmParams.utm_content.trim() !== \"\") {\n filteredParams.utm_content = utmParams.utm_content;\n } else {\n filteredParams.utm_content = null;\n }\n\n this.logger.debug(\"UTM params for event:\", filteredParams);\n return filteredParams;\n }\n\n // Get ad-platform tracking params (adgroup_id, ad_id, click_id) from stored\n // last-touch attribution data. These flow alongside UTM params and are\n // captured from ad platform click URLs (Google Ads, Meta, TikTok, etc.).\n private getAdParams(): {\n adgroup_id?: string | null;\n ad_id?: string | null;\n adgroup_id_source?: string | null;\n ad_id_source?: string | null;\n click_id?: string | null;\n click_id_source?: string | null;\n } {\n const attributionData = this.getAttributionData();\n if (!attributionData) {\n return {};\n }\n const last = attributionData.lastTouch;\n const nonEmpty = (v?: string | null) =>\n v && typeof v === \"string\" && v.trim() !== \"\" ? v : null;\n return {\n adgroup_id: nonEmpty(last.adgroup_id),\n ad_id: nonEmpty(last.ad_id),\n adgroup_id_source: nonEmpty(last.adgroup_id_source),\n ad_id_source: nonEmpty(last.ad_id_source),\n click_id: nonEmpty(last.click_id),\n click_id_source: nonEmpty(last.click_id_source),\n };\n }\n\n // Initialize user ID\n private initializeUserId(): void {\n // If userId is provided in config, set it (will override existing)\n if (this.config.userId) {\n this.setUserId(this.config.userId);\n this.logger.info(\n `👤 User ID initialized from config: ${this.config.userId}`\n );\n } else {\n // Check if user ID already exists in storage\n const existingUserId = this.getUserId();\n if (existingUserId) {\n this.logger.debug(`👤 Existing user ID found: ${existingUserId}`);\n } else {\n this.logger.debug(\n \"👤 No user ID found, will be set when user identifies\"\n );\n }\n }\n }\n\n // Set user ID — handles Case X (account switch) by rotating anonymous_id +\n // session_id. Anonymous → identified is idempotent on anonymous_id.\n setUserId(userId: string): void {\n if (!userId || userId.trim() === \"\") {\n this.logger.warn(\"Cannot set empty user ID\");\n return;\n }\n\n const trimmed = userId.trim();\n const prevUserId = this.storage.getUserId();\n\n // Idempotent: same user already set.\n if (prevUserId === trimmed) {\n return;\n }\n\n // Case X — distinct previous user means account switch on the same device.\n // Rotate anonymous_id so the new user's events are not stitched onto the\n // previous user's visitor identity.\n if (prevUserId && prevUserId !== trimmed) {\n this.logger.info(\n `👥 User changed (${prevUserId} → ${trimmed}) — rotating anonymous_id + session`\n );\n this.storage.rotateAnonymousId();\n }\n\n this.storage.setUserId(trimmed);\n\n // Bind this user to the current session. If the session was already\n // owned by a *different* non-empty user, force a session rotation\n // — distinct users' activity must not share the same session_id.\n if (this.session) {\n const sessionPrevUserId = this.session.userId;\n if (sessionPrevUserId && sessionPrevUserId !== trimmed) {\n this.logger.info(\n `🔄 Session previously owned by ${sessionPrevUserId} — rotating session for ${trimmed}`\n );\n this.rotateSession(trimmed);\n } else if (sessionPrevUserId !== trimmed) {\n // Anonymous session learning the user's id — attach, no rotation.\n this.session = { ...this.session, userId: trimmed };\n this.storage.storeSession(this.session);\n }\n }\n\n this.logger.info(`👤 User ID set: ${trimmed}`);\n }\n\n // Start a fresh session; used when the current session's owner user_id\n // changes. Preserves no state from the previous session on purpose.\n private rotateSession(userId?: string): void {\n const now = Date.now();\n this.session = {\n sessionId: generateSessionId(),\n startTime: now,\n lastActivity: now,\n pageViews: 0,\n userId,\n };\n this.storage.storeSession(this.session);\n }\n\n // Get user ID\n getUserId(): string | null {\n return this.storage.getUserId();\n }\n\n // Get the SDK's persistent anonymous_id (creates one on first access).\n getAnonymousId(): string {\n return this.storage.getAnonymousId();\n }\n\n // Remove user ID\n removeUserId(): void {\n this.storage.removeUserId();\n this.logger.info(\"👤 User ID removed\");\n }\n\n /**\n * Identify user and set user attributes\n * Used to explicitly set user information, e.g., after login\n *\n * @param userId User unique identifier\n * @param traits User attributes\n *\n * @example\n * sdk.identify('user-123', {\n * email: 'user@example.com',\n * name: 'John Doe',\n * company_name: 'Acme Inc'\n * });\n */\n async identify(userId: string, traits?: UserTraits): Promise<void> {\n if (!this.initialized) {\n this.logger.warn(\"SDK not initialized, identify call queued\");\n return;\n }\n\n if (!userId || userId.trim() === \"\") {\n this.logger.warn(\"Cannot identify with empty user ID\");\n return;\n }\n\n // Set user ID\n this.setUserId(userId);\n\n // Store user traits\n if (traits) {\n this.storage.setUserTraits(traits);\n this.logger.info(`User identified: ${userId}`, traits);\n }\n\n // Send identify event to backend\n await this.trackEvent(\n EventType.FORM_SUBMIT,\n {\n _identify: true,\n _user_traits: traits,\n tracking_user_id: userId,\n },\n userId\n );\n }\n\n /**\n * Get current user traits\n */\n getUserTraits(): UserTraits | null {\n return this.storage.getUserTraits();\n }\n\n /**\n * Get current session ID\n */\n getSessionId(): string | null {\n return this.session?.sessionId || null;\n }\n\n // Initialize user session\n private initializeSession(): void {\n const existingSession = this.storage.getSession();\n const now = Date.now();\n const currentUserId = this.storage.getUserId() ?? undefined;\n\n const withinTimeout =\n existingSession &&\n now - existingSession.lastActivity < this.config.sessionTimeout!;\n\n // If the existing session was bound to a *different* non-empty user\n // than the currently active one, it belongs to someone else — don't\n // extend it. Anonymous → known is still fine (existingSession.userId\n // unset), so backend backfill keeps working.\n const ownerMismatch =\n !!(existingSession?.userId &&\n currentUserId &&\n existingSession.userId !== currentUserId);\n\n if (withinTimeout && !ownerMismatch) {\n // Extend existing session; attach current user id if the session\n // was anonymous until now.\n this.session = {\n ...existingSession,\n lastActivity: now,\n userId: existingSession.userId ?? currentUserId,\n };\n } else {\n if (ownerMismatch) {\n this.logger.info(\n `🔄 Session owner changed (${existingSession?.userId} → ${currentUserId}) — starting new session`\n );\n }\n this.session = {\n sessionId: generateSessionId(),\n startTime: now,\n lastActivity: now,\n pageViews: 0,\n userId: currentUserId,\n };\n }\n\n this.storage.storeSession(this.session);\n this.logger.debug(\"Session initialized:\", this.session);\n }\n\n // Extract and store UTM data from current URL.\n //\n // Uses getBestUTMSourceUrl() (current href → module-load snapshot →\n // Performance Navigation Timing entry) so attribution survives a host\n // framework (e.g. Nuxt router) stripping UTM params via\n // history.replaceState before our init() runs.\n private extractAndStoreUTMData(): void {\n const currentUrl = getBestUTMSourceUrl();\n const utmParams = extractUTMParams(currentUrl);\n const adParams = extractAdParams(currentUrl);\n\n this.logger.debug(\"Extracting UTM params from URL:\", currentUrl);\n this.logger.debug(\"Found UTM params:\", utmParams);\n this.logger.debug(\"Found ad params:\", adParams);\n\n // Capture if UTM, ad IDs, or click IDs are present\n if (\n Object.keys(utmParams).length === 0 &&\n !adParams.adgroup_id &&\n !adParams.ad_id &&\n !adParams.click_id\n ) {\n this.logger.debug(\"No UTM, ad, or click parameters found in URL\");\n return;\n }\n\n const utmData: UTMData = {\n utm_source: utmParams.utm_source || \"\",\n utm_medium: utmParams.utm_medium || \"\",\n utm_campaign: utmParams.utm_campaign || \"\",\n utm_term: utmParams.utm_term || \"\",\n utm_content: utmParams.utm_content || \"\",\n adgroup_id: adParams.adgroup_id || \"\",\n ad_id: adParams.ad_id || \"\",\n adgroup_id_source: adParams.adgroup_id_source || \"\",\n ad_id_source: adParams.ad_id_source || \"\",\n click_id: adParams.click_id || \"\",\n click_id_source: adParams.click_id_source || \"\",\n timestamp: Date.now(),\n };\n\n const existingData = this.getAttributionData();\n const newData: AttributionData = {\n firstTouch: existingData?.firstTouch || utmData,\n lastTouch: utmData,\n touchpoints: existingData?.touchpoints || [],\n expiresAt: Date.now() + 30 * 24 * 60 * 60 * 1000, // 30 days\n };\n\n // Add to touchpoints if different from last touch\n if (\n !existingData ||\n existingData.lastTouch.utm_source !== utmData.utm_source ||\n existingData.lastTouch.utm_campaign !== utmData.utm_campaign\n ) {\n newData.touchpoints.push(utmData);\n }\n\n this.storage.storeUTMData(newData);\n this.logger.info(\"UTM data extracted and stored successfully:\", utmData);\n\n // Clean URL after storing UTM data to avoid displaying parameters in plain text\n if (this.config.autoCleanUTM) {\n cleanURL();\n }\n }\n\n // Setup auto-tracking\n private setupAutoTracking(): void {\n this.autoTrackEnabled = true;\n\n // Track form interactions\n this.setupFormTracking();\n\n // Track link clicks\n this.setupLinkTracking();\n\n this.logger.info(\"Auto-tracking enabled\");\n }\n\n // Setup form tracking\n private setupFormTracking(): void {\n document.addEventListener(\"submit\", (event) => {\n try {\n const form = event.target as HTMLFormElement;\n if (!form) {\n return;\n }\n\n const fieldValues = this.serializeFormFields(form);\n\n // Extract standardized lead fields\n const leadFields = this.extractLeadFields(fieldValues);\n\n // If email is extracted, automatically store user traits\n if (leadFields.email) {\n this.storage.setUserTraits(leadFields);\n this.logger.debug(\"Lead fields extracted from form:\", leadFields);\n }\n\n this.trackEvent(EventType.FORM_SUBMIT, {\n ...fieldValues,\n // Add standardized lead fields\n _lead_fields: leadFields,\n form_id: form.id || form.name,\n form_action: form.action,\n form_method: form.method,\n });\n } catch (error) {\n this.logger.error(\"Failed to auto-track form submit:\", error);\n }\n });\n }\n\n // Serialize all fields within a form to a flat key-value map\n private serializeFormFields(form: HTMLFormElement): Record<string, any> {\n const result: Record<string, any> = {};\n\n try {\n const formData = new FormData(form);\n // Accumulate multiple values for the same name as arrays\n for (const [name, value] of formData.entries()) {\n const serializedValue = this.serializeFormValue(value);\n\n if (Object.prototype.hasOwnProperty.call(result, name)) {\n const existing = result[name];\n if (Array.isArray(existing)) {\n existing.push(serializedValue);\n result[name] = existing;\n } else {\n result[name] = [existing, serializedValue];\n }\n } else {\n result[name] = serializedValue;\n }\n }\n\n // Ensure all fields are represented, including unchecked radios/checkboxes.\n // For fields without name attribute, use a stable fallback key (id/aria-label/placeholder/index).\n const elements = Array.from(form.elements) as Array<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >;\n\n // Group elements by key\n const nameToElements = new Map<\n string,\n Array<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>\n >();\n for (let index = 0; index < elements.length; index++) {\n const el = elements[index];\n if ((el as any).disabled) continue;\n\n const tagName = el.tagName.toLowerCase();\n const inputType = (el as HTMLInputElement).type?.toLowerCase();\n if (\n tagName === \"button\" ||\n inputType === \"submit\" ||\n inputType === \"reset\"\n ) {\n continue;\n }\n\n const fieldKey = this.getFormFieldKey(el, index);\n if (!fieldKey) {\n continue;\n }\n\n if (!nameToElements.has(fieldKey)) nameToElements.set(fieldKey, []);\n nameToElements.get(fieldKey)!.push(el);\n }\n\n nameToElements.forEach((els, name) => {\n // Determine the dominant type for a group (radio/checkbox take precedence)\n const hasRadio = els.some(\n (e) => (e as HTMLInputElement).type === \"radio\"\n );\n const hasCheckbox = els.some(\n (e) => (e as HTMLInputElement).type === \"checkbox\"\n );\n const hasFile = els.some(\n (e) => (e as HTMLInputElement).type === \"file\"\n );\n const hasSelectMultiple = els.some(\n (e) => e.tagName === \"SELECT\" && (e as HTMLSelectElement).multiple\n );\n const hasPassword = els.some(\n (e) => (e as HTMLInputElement).type === \"password\"\n );\n\n if (hasCheckbox) {\n const checkedValues = (els as HTMLInputElement[])\n .filter((e) => e.type === \"checkbox\")\n .filter((e) => e.checked)\n .map((e) => e.value || \"on\");\n if (!Object.prototype.hasOwnProperty.call(result, name)) {\n result[name] = checkedValues; // [] when none checked\n } else if (!Array.isArray(result[name])) {\n result[name] = [result[name], ...checkedValues];\n }\n return;\n }\n\n if (hasRadio) {\n const checked = (els as HTMLInputElement[])\n .filter((e) => e.type === \"radio\")\n .find((e) => e.checked);\n if (!Object.prototype.hasOwnProperty.call(result, name)) {\n result[name] = checked ? checked.value : null;\n }\n return;\n }\n\n if (hasSelectMultiple) {\n const select = els.find(\n (e) => e.tagName === \"SELECT\" && (e as HTMLSelectElement).multiple\n ) as HTMLSelectElement | undefined;\n if (select) {\n const selectedValues = Array.from(select.selectedOptions).map(\n (opt) => opt.value\n );\n if (!Object.prototype.hasOwnProperty.call(result, name)) {\n result[name] = selectedValues; // [] when none selected\n }\n return;\n }\n }\n\n if (hasFile) {\n const input = els.find(\n (e) => (e as HTMLInputElement).type === \"file\"\n ) as HTMLInputElement | undefined;\n if (input) {\n const files = input.files ? Array.from(input.files) : [];\n if (!Object.prototype.hasOwnProperty.call(result, name)) {\n result[name] = files.map((f) => this.serializeFormValue(f));\n }\n return;\n }\n }\n\n if (hasPassword) {\n // Mask password fields\n if (Object.prototype.hasOwnProperty.call(result, name)) {\n result[name] =\n typeof result[name] === \"string\" ? \"*****\" : result[name];\n } else {\n result[name] = \"*****\";\n }\n return;\n }\n\n // For other inputs/selects/textarea, ensure at least an entry exists\n if (!Object.prototype.hasOwnProperty.call(result, name)) {\n const first = els[0] as\n | HTMLInputElement\n | HTMLSelectElement\n | HTMLTextAreaElement;\n if (first.tagName === \"SELECT\") {\n const select = first as HTMLSelectElement;\n result[name] = select.multiple\n ? Array.from(select.selectedOptions).map((o) => o.value)\n : select.value;\n } else if ((first as HTMLInputElement).type) {\n result[name] = (first as HTMLInputElement).value ?? \"\";\n } else {\n result[name] = (first as HTMLTextAreaElement).value ?? \"\";\n }\n }\n });\n } catch (error) {\n this.logger.error(\"Failed to serialize form fields:\", error);\n }\n\n return result;\n }\n\n private getFormFieldKey(\n el: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement,\n index: number\n ): string | null {\n const name = (el as HTMLInputElement | HTMLSelectElement).name;\n if (name) {\n return name;\n }\n\n if (el.id) {\n return `id_${el.id}`;\n }\n\n const ariaLabel = el.getAttribute(\"aria-label\");\n if (ariaLabel && ariaLabel.trim()) {\n return `aria_${this.normalizeFormFieldKey(ariaLabel)}`;\n }\n\n const placeholder =\n el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement\n ? el.placeholder\n : \"\";\n if (placeholder && placeholder.trim()) {\n return `ph_${this.normalizeFormFieldKey(placeholder)}_${index}`;\n }\n\n return `field_${index}`;\n }\n\n private normalizeFormFieldKey(raw: string): string {\n return raw\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, \"_\")\n .replace(/[^a-z0-9_]/g, \"\")\n .slice(0, 40);\n }\n\n // Convert FormData value to a serializable value\n private serializeFormValue(value: FormDataEntryValue): any {\n if (value instanceof File) {\n return {\n file_name: value.name,\n file_size: value.size,\n file_type: value.type,\n };\n }\n return value;\n }\n\n /**\n * Extract standardized lead fields from form data\n * @param formData Serialized form data\n * @returns Extracted user traits\n */\n private extractLeadFields(formData: Record<string, any>): UserTraits {\n const result: UserTraits = {};\n\n // Iterate through all standard field mappings\n for (const [standardField, aliases] of Object.entries(DEFAULT_FIELD_MAPPINGS)) {\n if (result[standardField]) continue; // Already found, skip\n\n // Look for matching field\n for (const alias of aliases || []) {\n const lowerAlias = alias.toLowerCase();\n\n // Search for matching key in formData\n for (const [key, value] of Object.entries(formData)) {\n if (\n key.toLowerCase() === lowerAlias ||\n key.toLowerCase().includes(lowerAlias)\n ) {\n if (value && typeof value === \"string\" && value.trim()) {\n result[standardField] = value.trim();\n break;\n }\n }\n }\n\n if (result[standardField]) break;\n }\n }\n\n // Combine first_name and last_name into name (if name is empty)\n if (!result.name && (result.first_name || result.last_name)) {\n result.name = [result.first_name, result.last_name]\n .filter(Boolean)\n .join(\" \")\n .trim();\n }\n\n return result;\n }\n\n // Setup link tracking\n private setupLinkTracking(): void {\n document.addEventListener(\"click\", (event) => {\n const target = event.target as HTMLElement;\n const link = target.closest(\"a\");\n\n if (link) {\n const href = link.href;\n const isExternal = isExternalURL(href);\n\n if (isExternal) {\n // Handle cross-domain UTM passing\n this.handleCrossDomainUTM(link, event);\n }\n }\n });\n }\n\n // Handle cross-domain UTM parameter passing\n private handleCrossDomainUTM(link: HTMLAnchorElement, event: Event): void {\n if (!this.config.enableCrossDomainUTM) {\n return;\n }\n\n const href = link.href;\n\n // Check if domain should be excluded\n if (shouldExcludeDomain(href, this.config.excludeDomains)) {\n this.logger.debug(`Domain excluded from UTM passing: ${href}`);\n return;\n }\n\n // Get current UTM data\n const attributionData = this.getAttributionData();\n if (!attributionData) {\n this.logger.debug(\"No UTM data available for cross-domain passing\");\n return;\n }\n\n // Filter UTM parameters based on configuration\n const utmParams = filterUTMParams(\n attributionData.lastTouch,\n this.config.crossDomainUTMParams\n );\n\n if (Object.keys(utmParams).length === 0) {\n this.logger.debug(\"No UTM parameters to pass\");\n return;\n }\n\n // Add UTM parameters to URL\n const enhancedURL = addUTMToURL(href, utmParams);\n\n if (enhancedURL !== href) {\n // Update the link href\n link.href = enhancedURL;\n\n this.logger.debug(\"UTM parameters added to external link:\", {\n original: href,\n enhanced: enhancedURL,\n utmParams,\n });\n\n this.logger.debug(\"Cross-domain UTM passed:\", {\n link_url: enhancedURL,\n original_url: href,\n utm_params_passed: utmParams,\n });\n }\n }\n\n // Setup network handlers\n private setupNetworkHandlers(): void {\n window.addEventListener(\"online\", () => {\n this.logger.info(\"Network connection restored\");\n this.queue.flush();\n });\n\n window.addEventListener(\"offline\", () => {\n this.logger.warn(\"Network connection lost\");\n });\n }\n\n // Setup visibility handlers\n private setupVisibilityHandlers(): void {\n document.addEventListener(\"visibilitychange\", () => {\n if (document.visibilityState === \"hidden\") {\n this.flushOnUnload(\"visibilitychange:hidden\");\n return;\n }\n if (document.visibilityState === \"visible\") {\n this.updateSessionActivity();\n }\n });\n }\n\n // Setup beforeunload handler\n private setupBeforeUnloadHandler(): void {\n window.addEventListener(\"beforeunload\", () => {\n this.flushOnUnload(\"beforeunload\");\n });\n\n // More reliable than beforeunload for modern browsers (incl. mobile)\n window.addEventListener(\"pagehide\", () => {\n this.flushOnUnload(\"pagehide\");\n });\n }\n\n private flushOnUnload(reason: string): void {\n try {\n this.updateSessionActivity();\n const pending = this.queue.drainAll();\n if (pending.length === 0) {\n return;\n }\n\n // Backup first (best-effort). If keepalive succeeds, we'll remove by id.\n this.storage.appendPendingEvents(pending);\n\n this.logger.debug(`🚚 Unload flush triggered: ${reason}`, {\n count: pending.length,\n });\n\n // Prefer beacon (avoid preflight) for redirect/unload scenarios.\n const beaconOk = this.httpClient.sendEventsBeacon(pending);\n if (beaconOk) {\n // Best-effort: remove to avoid duplicates (beacon is queued by browser).\n this.storage.removePendingEventsByIds(pending.map((e) => e.event_id));\n return;\n }\n\n const chunkSize = 20;\n for (let i = 0; i < pending.length; i += chunkSize) {\n const chunk = pending.slice(i, i + chunkSize);\n void this.httpClient\n .sendEventsKeepalive(chunk)\n .then(() => {\n this.storage.removePendingEventsByIds(chunk.map((e) => e.event_id));\n })\n .catch((error) => {\n this.logger.debug(\"Unload keepalive send failed\", error);\n });\n }\n } catch (error) {\n this.logger.debug(\"flushOnUnload failed\", error);\n }\n }\n\n private async retryPendingEvents(): Promise<void> {\n const pending = this.storage.getPendingEvents();\n if (pending.length === 0) {\n return;\n }\n\n this.logger.info(`📦 Retrying pending events: ${pending.length}`);\n try {\n await this.httpClient.sendEvents(pending);\n this.storage.removePendingEventsByIds(pending.map((e) => e.event_id));\n this.logger.info(`✅ Pending events sent: ${pending.length}`);\n } catch (error) {\n this.logger.warn(\"⚠️ Pending events retry failed\", error);\n }\n }\n\n // Get current path (pathname + search) for comparison\n private getCurrentPath(): string {\n if (typeof window === \"undefined\") return \"\";\n return window.location.pathname + window.location.search;\n }\n\n // Setup SPA (Single Page Application) route tracking\n private setupSPATracking(): void {\n if (typeof window === \"undefined\" || typeof history === \"undefined\") {\n this.logger.warn(\"⚠️ SPA tracking not available in this environment\");\n return;\n }\n\n if (this.spaTrackingEnabled) {\n this.logger.warn(\"⚠️ SPA tracking already enabled\");\n return;\n }\n\n this.spaTrackingEnabled = true;\n this.lastTrackedPath = this.getCurrentPath();\n\n // Store original methods\n this.originalPushState = history.pushState.bind(history);\n this.originalReplaceState = history.replaceState.bind(history);\n\n // Create a handler for route changes\n const handleRouteChange = (changeType: string) => {\n const newPath = this.getCurrentPath();\n\n // Only track if path actually changed\n if (newPath === this.lastTrackedPath) {\n this.logger.debug(\n `🔄 [SPA] Route change detected (${changeType}) but path unchanged: ${newPath}`\n );\n return;\n }\n\n this.logger.debug(\n `🔄 [SPA] Route change detected (${changeType}): ${this.lastTrackedPath} -> ${newPath}`\n );\n this.lastTrackedPath = newPath;\n\n // Delay tracking to allow page title and content to update (100ms is sufficient for most frameworks)\n setTimeout(() => {\n this.trackPageView()\n .then(() => {\n // If auto page view is enabled, send ASAP to survive short redirects\n return this.queue.process();\n })\n .then(() => {\n this.logger.debug(`✅ [SPA] Page view tracked for: ${newPath}`);\n })\n .catch((error) => {\n this.logger.error(`❌ [SPA] Failed to track page view:`, error);\n });\n }, 100);\n };\n\n // Override history.pushState\n history.pushState = (\n data: any,\n unused: string,\n url?: string | URL | null\n ) => {\n const result = this.originalPushState!(data, unused, url);\n handleRouteChange(\"pushState\");\n return result;\n };\n\n // Override history.replaceState\n history.replaceState = (\n data: any,\n unused: string,\n url?: string | URL | null\n ) => {\n const result = this.originalReplaceState!(data, unused, url);\n handleRouteChange(\"replaceState\");\n return result;\n };\n\n // Listen for popstate (browser back/forward)\n this.popstateHandler = () => {\n handleRouteChange(\"popstate\");\n };\n window.addEventListener(\"popstate\", this.popstateHandler);\n\n this.logger.info(\"🔄 SPA tracking setup completed\");\n }\n\n // Cleanup SPA tracking (restore original methods)\n private cleanupSPATracking(): void {\n if (!this.spaTrackingEnabled) return;\n\n // Restore original history methods\n if (this.originalPushState) {\n history.pushState = this.originalPushState;\n this.originalPushState = null;\n }\n if (this.originalReplaceState) {\n history.replaceState = this.originalReplaceState;\n this.originalReplaceState = null;\n }\n\n // Remove popstate listener\n if (this.popstateHandler) {\n window.removeEventListener(\"popstate\", this.popstateHandler);\n this.popstateHandler = null;\n }\n\n this.spaTrackingEnabled = false;\n this.logger.info(\"🔄 SPA tracking cleaned up\");\n }\n\n // Update session activity\n private updateSessionActivity(): void {\n if (this.session) {\n this.session.lastActivity = Date.now();\n this.storage.storeSession(this.session);\n }\n }\n\n // Flush all pending events\n async flush(): Promise<void> {\n await this.queue.flush();\n }\n\n // Get SDK status\n getStatus(): {\n initialized: boolean;\n session: UserSession | null;\n queueSize: number;\n online: boolean;\n crossDomainUTM: {\n enabled: boolean;\n currentParams: Record<string, string>;\n };\n spaTracking: {\n enabled: boolean;\n currentPath: string;\n };\n } {\n return {\n initialized: this.initialized,\n session: this.session,\n queueSize: this.queue.size(),\n online: isOnline(),\n crossDomainUTM: {\n enabled: this.config.enableCrossDomainUTM || true,\n currentParams: this.getCurrentUTMParams(),\n },\n spaTracking: {\n enabled: this.spaTrackingEnabled,\n currentPath: this.lastTrackedPath,\n },\n };\n }\n\n // Destroy SDK instance\n destroy(): void {\n this.queue.clear();\n this.autoTrackEnabled = false;\n this.cleanupSPATracking();\n this.initialized = false;\n this.logger.info(\"🗑️ SDK destroyed\");\n }\n}\n","import { AttributionSDK } from \"./core/AttributionSDK\";\nimport {\n SDKConfig,\n EventType,\n Currency,\n EventData,\n AttributionData,\n defaultEndpoint,\n} from \"./types\";\n\n// Global SDK instance\nlet globalSDK: AttributionSDK | null = null;\n\n// Auto-initialization function\nfunction autoInit(): void {\n // Check if SDK is already initialized\n if (globalSDK) {\n return;\n }\n\n // Look for configuration in script tag\n const script = document.currentScript as HTMLScriptElement;\n if (!script) {\n console.warn(\n \"GetuAI SDK: Could not find script tag for auto-initialization\"\n );\n return;\n }\n\n const apiKey = script.getAttribute(\"data-api-key\");\n if (!apiKey) {\n console.warn(\n \"GetuAI SDK: No API key provided. Please add data-api-key attribute to script tag.\"\n );\n return;\n }\n const apiEndpoint =\n script.getAttribute(\"data-api-endpoint\") || defaultEndpoint;\n const config: SDKConfig = {\n apiKey,\n apiEndpoint,\n enableDebug: script.getAttribute(\"data-debug\") === \"true\",\n autoTrack: script.getAttribute(\"data-auto-track\") === \"true\",\n autoTrackPageView:\n script.getAttribute(\"data-auto-track-page-view\") === \"true\",\n autoCleanUTM: script.getAttribute(\"data-auto-clean-utm\") !== \"false\",\n batchSize: parseInt(script.getAttribute(\"data-batch-size\") || \"100\"),\n batchInterval: parseInt(\n script.getAttribute(\"data-batch-interval\") || \"2000\"\n ),\n userId: script.getAttribute(\"data-user-id\") || undefined,\n domain: script.getAttribute(\"data-domain\") || undefined,\n };\n\n // Initialize SDK\n init(config);\n}\n\n// Initialize SDK with configuration\nasync function init(config: SDKConfig): Promise<AttributionSDK> {\n if (globalSDK) {\n console.warn(\"GetuAI SDK: Already initialized\");\n return globalSDK;\n }\n\n try {\n globalSDK = new AttributionSDK(config);\n await globalSDK.init();\n\n // Expose SDK to global scope for debugging\n if (config.enableDebug) {\n (window as any).GetuAISDK = globalSDK;\n }\n\n console.log(\"GetuAI Attribution SDK initialized successfully\");\n\n // Dispatch initialization complete event\n if (typeof window !== \"undefined\") {\n const event = new CustomEvent(\"getuaiSDKReady\", {\n detail: { sdk: globalSDK },\n });\n window.dispatchEvent(event);\n }\n\n return globalSDK;\n } catch (error) {\n console.error(\"GetuAI SDK: Failed to initialize:\", error);\n\n // Dispatch initialization error event\n if (typeof window !== \"undefined\") {\n const event = new CustomEvent(\"getuaiSDKError\", {\n detail: { error },\n });\n window.dispatchEvent(event);\n }\n\n throw error;\n }\n}\n\n// Get current SDK instance\nfunction getSDK(): AttributionSDK | null {\n return globalSDK;\n}\n\n// Wait for SDK to be ready\nfunction waitForSDK(): Promise<AttributionSDK> {\n return new Promise((resolve, reject) => {\n if (globalSDK) {\n resolve(globalSDK);\n return;\n }\n\n // Listen for SDK ready event\n const handleReady = (event: CustomEvent) => {\n window.removeEventListener(\n \"getuaiSDKReady\",\n handleReady as EventListener\n );\n window.removeEventListener(\n \"getuaiSDKError\",\n handleError as EventListener\n );\n resolve(event.detail.sdk);\n };\n\n const handleError = (event: CustomEvent) => {\n window.removeEventListener(\n \"getuaiSDKReady\",\n handleReady as EventListener\n );\n window.removeEventListener(\n \"getuaiSDKError\",\n handleError as EventListener\n );\n reject(event.detail.error);\n };\n\n window.addEventListener(\"getuaiSDKReady\", handleReady as EventListener);\n window.addEventListener(\"getuaiSDKError\", handleError as EventListener);\n\n // Timeout after 10 seconds\n setTimeout(() => {\n window.removeEventListener(\n \"getuaiSDKReady\",\n handleReady as EventListener\n );\n window.removeEventListener(\n \"getuaiSDKError\",\n handleError as EventListener\n );\n reject(new Error(\"SDK initialization timeout\"));\n }, 10000);\n });\n}\n\n// Track event\nasync function trackEvent(\n eventType: EventType,\n eventData?: Record<string, any>,\n tracking_user_id?: string,\n revenue?: number,\n currency: Currency = Currency.USD\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackEvent(\n eventType,\n eventData,\n tracking_user_id,\n revenue,\n currency\n );\n}\n\n// Track page view\nasync function trackPageView(\n pageData?: Record<string, any>,\n tracking_user_id?: string\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackPageView(pageData, tracking_user_id);\n}\n\n// Track purchase\nasync function trackPurchase(\n tracking_user_id: string,\n revenue: number,\n currency: Currency = Currency.USD,\n purchaseData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackPurchase(tracking_user_id, revenue, currency, purchaseData);\n}\n\n// Track login\nasync function trackLogin(\n tracking_user_id: string,\n loginData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackLogin(tracking_user_id, loginData);\n}\n\n// Track signup\n\nasync function trackSignup(\n tracking_user_id: string,\n signupData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackSignup(tracking_user_id, signupData);\n}\n\n// Track form submission\nasync function trackFormSubmit(\n tracking_user_id?: string,\n formData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackFormSubmit(tracking_user_id, formData);\n}\n\n// Track video play\nasync function trackVideoPlay(\n tracking_user_id?: string,\n videoData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackVideoPlay(tracking_user_id, videoData);\n}\n\n// Track email verification\nasync function trackEmailVerification(\n tracking_user_id: string,\n verificationData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackEmailVerification(tracking_user_id, verificationData);\n}\n\n// Track audit approved (conversion)\nasync function trackAuditApproved(\n tracking_user_id: string,\n auditData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackAuditApproved(tracking_user_id, auditData);\n}\n\n// Track purchase with auto user ID (object parameter format)\nasync function trackPurchaseAuto(options: {\n revenue: number;\n currency?: Currency;\n purchaseData?: Record<string, any>;\n tracking_user_id?: string;\n}): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackPurchaseAuto(options);\n}\n\n// Track login with auto user ID (object parameter format)\nasync function trackLoginAuto(options: {\n loginData?: Record<string, any>;\n tracking_user_id?: string;\n}): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackLoginAuto(options);\n}\n\n// Track signup with auto user ID (object parameter format)\nasync function trackSignupAuto(options: {\n signupData?: Record<string, any>;\n tracking_user_id?: string;\n}): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackSignupAuto(options);\n}\n\n// Track email verification with auto user ID (object parameter format)\nasync function trackEmailVerificationAuto(options: {\n verificationData?: Record<string, any>;\n tracking_user_id?: string;\n}): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackEmailVerificationAuto(options);\n}\n\n// Track custom event\nasync function trackCustomEvent(\n customEventName: string,\n eventData?: Record<string, any>,\n tracking_user_id?: string,\n revenue?: number,\n currency: Currency = Currency.USD\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackCustomEvent(customEventName, eventData, tracking_user_id, revenue, currency);\n}\n\n// Track product view\nasync function trackProductView(\n tracking_user_id?: string,\n productData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackProductView(tracking_user_id, productData);\n}\n\n// Track add to cart\nasync function trackAddToCart(\n tracking_user_id?: string,\n cartData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackAddToCart(tracking_user_id, cartData);\n}\n\n// Track page click for user click journey\nasync function trackPageClick(\n tracking_user_id?: string,\n clickData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackPageClick(tracking_user_id, clickData);\n}\n\n// Track button click\nasync function trackButtonClick(\n buttonName?: string,\n tracking_user_id?: string,\n clickData?: Record<string, any>\n): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.trackButtonClick(buttonName, tracking_user_id, clickData);\n}\n\n// Get attribution data\nfunction getAttributionData() {\n const sdk = getSDK();\n if (!sdk) {\n return null;\n }\n\n return sdk.getAttributionData();\n}\n\n// Flush pending events\nasync function flush(): Promise<void> {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n await sdk.flush();\n}\n\n// Get SDK status\nfunction getStatus() {\n const sdk = getSDK();\n if (!sdk) {\n return null;\n }\n\n return sdk.getStatus();\n}\n\n// Add UTM to URL\nfunction addUTMToURL(url: string): string {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return url;\n }\n\n return sdk.addUTMToURL(url);\n}\n\n// Get current UTM parameters\nfunction getCurrentUTMParams(): Record<string, string> {\n const sdk = getSDK();\n if (!sdk) {\n return {};\n }\n\n return sdk.getCurrentUTMParams();\n}\n\n// Set user ID\nfunction setUserId(userId: string): void {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n sdk.setUserId(userId);\n}\n\n// Get user ID\nfunction getUserId(): string | null {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return null;\n }\n\n return sdk.getUserId();\n}\n\n// Remove user ID\nfunction removeUserId(): void {\n const sdk = getSDK();\n if (!sdk) {\n console.warn(\"GetuAI SDK: Not initialized. Call init() first.\");\n return;\n }\n\n sdk.removeUserId();\n}\n\n// Destroy SDK\nfunction destroy(): void {\n if (globalSDK) {\n globalSDK.destroy();\n globalSDK = null;\n console.log(\"GetuAI SDK destroyed\");\n }\n}\n\n// Extend AttributionSDK class with static methods\nclass AttributionSDKStatic extends AttributionSDK {\n // Static method to initialize SDK\n static async init(config: SDKConfig): Promise<AttributionSDK> {\n return await init(config);\n }\n\n // Static method to track event\n static async trackEvent(\n eventType: EventType,\n eventData?: Record<string, any>,\n tracking_user_id?: string,\n revenue?: number,\n currency: Currency = Currency.USD\n ): Promise<void> {\n return await trackEvent(\n eventType,\n eventData,\n tracking_user_id,\n revenue,\n currency\n );\n }\n\n // Static method to track page view\n static async trackPageView(\n pageData?: Record<string, any>,\n tracking_user_id?: string\n ): Promise<void> {\n return await trackPageView(pageData, tracking_user_id);\n }\n\n // Static method to track purchase\n static async trackPurchase(\n tracking_user_id: string,\n revenue: number,\n currency: Currency = Currency.USD,\n purchaseData?: Record<string, any>\n ): Promise<void> {\n return await trackPurchase(\n tracking_user_id,\n revenue,\n currency,\n purchaseData\n );\n }\n\n // Static method to track login\n static async trackLogin(\n tracking_user_id: string,\n loginData?: Record<string, any>\n ): Promise<void> {\n return await trackLogin(tracking_user_id, loginData);\n }\n\n // Static method to track signup\n static async trackSignup(\n tracking_user_id: string,\n signupData?: Record<string, any>\n ): Promise<void> {\n return await trackSignup(tracking_user_id, signupData);\n }\n\n // Static method to track form submission\n static async trackFormSubmit(\n tracking_user_id?: string,\n formData?: Record<string, any>\n ): Promise<void> {\n return await trackFormSubmit(tracking_user_id, formData);\n }\n\n // Static method to track video play\n static async trackVideoPlay(\n tracking_user_id?: string,\n videoData?: Record<string, any>\n ): Promise<void> {\n return await trackVideoPlay(tracking_user_id, videoData);\n }\n\n // Static method to track email verification\n static async trackEmailVerification(\n tracking_user_id: string,\n verificationData?: Record<string, any>\n ): Promise<void> {\n return await trackEmailVerification(tracking_user_id, verificationData);\n }\n\n // Static method to track purchase with auto user ID\n static async trackPurchaseAuto(options: {\n revenue: number;\n currency?: Currency;\n purchaseData?: Record<string, any>;\n tracking_user_id?: string;\n }): Promise<void> {\n return await trackPurchaseAuto(options);\n }\n\n // Static method to track login with auto user ID\n static async trackLoginAuto(options: {\n loginData?: Record<string, any>;\n tracking_user_id?: string;\n }): Promise<void> {\n return await trackLoginAuto(options);\n }\n\n // Static method to track signup with auto user ID\n static async trackSignupAuto(options: {\n signupData?: Record<string, any>;\n tracking_user_id?: string;\n }): Promise<void> {\n return await trackSignupAuto(options);\n }\n\n // Static method to track email verification with auto user ID\n static async trackEmailVerificationAuto(options: {\n verificationData?: Record<string, any>;\n tracking_user_id?: string;\n }): Promise<void> {\n return await trackEmailVerificationAuto(options);\n }\n\n // Static method to track custom event\n static async trackCustomEvent(\n customEventName: string,\n eventData?: Record<string, any>,\n tracking_user_id?: string,\n revenue?: number,\n currency: Currency = Currency.USD\n ): Promise<void> {\n return await trackCustomEvent(customEventName, eventData, tracking_user_id, revenue, currency);\n }\n\n // Static method to track product view\n static async trackProductView(\n tracking_user_id?: string,\n productData?: Record<string, any>\n ): Promise<void> {\n return await trackProductView(tracking_user_id, productData);\n }\n\n // Static method to track add to cart\n static async trackAddToCart(\n tracking_user_id?: string,\n cartData?: Record<string, any>\n ): Promise<void> {\n return await trackAddToCart(tracking_user_id, cartData);\n }\n\n // Static method to track page click\n static async trackPageClick(\n tracking_user_id?: string,\n clickData?: Record<string, any>\n ): Promise<void> {\n return await trackPageClick(tracking_user_id, clickData);\n }\n\n // Static method to track button click\n static async trackButtonClick(\n buttonName?: string,\n tracking_user_id?: string,\n clickData?: Record<string, any>\n ): Promise<void> {\n return await trackButtonClick(buttonName, tracking_user_id, clickData);\n }\n\n // Static method to get attribution data\n static getAttributionData(): AttributionData | null {\n return getAttributionData();\n }\n\n // Static method to flush events\n static async flush(): Promise<void> {\n return await flush();\n }\n\n // Static method to get status\n static getStatus() {\n return getStatus();\n }\n\n // Static method to add UTM to URL\n static addUTMToURL(url: string): string {\n return addUTMToURL(url);\n }\n\n // Static method to get current UTM parameters\n static getCurrentUTMParams(): Record<string, string> {\n return getCurrentUTMParams();\n }\n\n // Static method to set user ID\n static setUserId(userId: string): void {\n setUserId(userId);\n }\n\n // Static method to get user ID\n static getUserId(): string | null {\n return getUserId();\n }\n\n // Static method to remove user ID\n static removeUserId(): void {\n removeUserId();\n }\n\n // Static method to destroy SDK\n static destroy(): void {\n destroy();\n }\n\n // Static method to get SDK instance\n static getSDK(): AttributionSDK | null {\n return getSDK();\n }\n\n // Static method to wait for SDK\n static waitForSDK(): Promise<AttributionSDK> {\n return waitForSDK();\n }\n}\n\n// Export types\nexport {\n EventType,\n Currency,\n type SDKConfig,\n type EventData,\n type AttributionData,\n};\n\n// Export main functions\nexport {\n init,\n getSDK,\n waitForSDK,\n trackEvent,\n trackPageView,\n trackPageClick,\n trackButtonClick,\n trackPurchase,\n trackLogin,\n trackSignup,\n trackFormSubmit,\n trackVideoPlay,\n trackEmailVerification,\n trackAuditApproved,\n trackCustomEvent,\n trackProductView,\n trackAddToCart,\n trackPurchaseAuto,\n trackLoginAuto,\n trackSignupAuto,\n trackEmailVerificationAuto,\n getAttributionData,\n flush,\n getStatus,\n addUTMToURL,\n getCurrentUTMParams,\n setUserId,\n getUserId,\n removeUserId,\n destroy,\n};\n\n// Export AttributionSDK class for advanced usage\nexport { AttributionSDKStatic as AttributionSDK };\n\n// Auto-initialize if script is loaded with data-api-key\nif (typeof document !== \"undefined\") {\n // Initialize immediately when script loads, don't wait for DOMContentLoaded\n // This ensures SDK is ready before any body scripts execute\n autoInit();\n}\n\n// Expose functions to global scope for browser usage\nif (typeof window !== \"undefined\") {\n (window as any).getuaiSDK = {\n init,\n getSDK,\n waitForSDK,\n trackEvent,\n trackPageView,\n trackPageClick,\n trackButtonClick,\n trackPurchase,\n trackLogin,\n trackSignup,\n trackFormSubmit,\n trackVideoPlay,\n trackEmailVerification,\n trackAuditApproved,\n trackCustomEvent,\n trackProductView,\n trackAddToCart,\n trackPurchaseAuto,\n trackLoginAuto,\n trackSignupAuto,\n trackEmailVerificationAuto,\n getAttributionData,\n flush,\n getStatus,\n addUTMToURL,\n getCurrentUTMParams,\n setUserId,\n getUserId,\n removeUserId,\n destroy,\n EventType,\n Currency,\n AttributionSDK: AttributionSDKStatic, // 暴露带静态方法的AttributionSDK类\n };\n\n // Also expose individual functions for backward compatibility\n (window as any).init = init;\n (window as any).waitForSDK = waitForSDK;\n (window as any).trackEvent = trackEvent;\n (window as any).trackPageView = trackPageView;\n (window as any).trackPageClick = trackPageClick;\n (window as any).trackButtonClick = trackButtonClick;\n (window as any).trackPurchase = trackPurchase;\n (window as any).trackLogin = trackLogin;\n (window as any).trackSignup = trackSignup;\n (window as any).trackFormSubmit = trackFormSubmit;\n (window as any).trackVideoPlay = trackVideoPlay;\n (window as any).trackEmailVerification = trackEmailVerification;\n (window as any).trackProductView = trackProductView;\n (window as any).trackAddToCart = trackAddToCart;\n (window as any).trackPurchaseAuto = trackPurchaseAuto;\n (window as any).trackLoginAuto = trackLoginAuto;\n (window as any).trackSignupAuto = trackSignupAuto;\n (window as any).trackEmailVerificationAuto = trackEmailVerificationAuto;\n (window as any).getAttributionData = getAttributionData;\n (window as any).flush = flush;\n (window as any).getStatus = getStatus;\n (window as any).addUTMToURL = addUTMToURL;\n (window as any).getCurrentUTMParams = getCurrentUTMParams;\n (window as any).setUserId = setUserId;\n (window as any).getUserId = getUserId;\n (window as any).removeUserId = removeUserId;\n (window as any).destroy = destroy;\n (window as any).AttributionSDK = AttributionSDKStatic; // 直接暴露带静态方法的AttributionSDK类\n}\n\n// Default export\nexport default {\n init,\n getSDK,\n waitForSDK,\n trackEvent,\n trackPageView,\n trackPageClick,\n trackButtonClick,\n trackPurchase,\n trackLogin,\n trackSignup,\n trackFormSubmit,\n trackVideoPlay,\n trackEmailVerification,\n trackAuditApproved,\n trackCustomEvent,\n trackProductView,\n trackAddToCart,\n trackPurchaseAuto,\n trackLoginAuto,\n trackSignupAuto,\n trackEmailVerificationAuto,\n getAttributionData,\n flush,\n getStatus,\n addUTMToURL,\n getCurrentUTMParams,\n setUserId,\n getUserId,\n removeUserId,\n destroy,\n EventType,\n Currency,\n AttributionSDK: AttributionSDKStatic, // 包含带静态方法的AttributionSDK类\n};\n"],"names":["addUTMToURL"],"mappings":"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"}
|