onerway-analytics 1.2.0 → 1.3.0

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.
@@ -999,7 +999,7 @@ var OnrwayAnalytics = (() => {
999
999
 
1000
1000
  // src/core/analytics.ts
1001
1001
  var globalBatchCounter = 0;
1002
- var Analytics = class {
1002
+ var Analytics = class _Analytics {
1003
1003
  constructor(config) {
1004
1004
  this.buffer = [];
1005
1005
  this.bufferTimer = null;
@@ -1053,6 +1053,14 @@ var OnrwayAnalytics = (() => {
1053
1053
  this.trackPageView();
1054
1054
  }
1055
1055
  }
1056
+ static {
1057
+ // HOTFIX (production): retry / recovery / localStorage persistence DISABLED.
1058
+ // Reason: retry loop + parallel recoverFailedEvents + fire-and-forget
1059
+ // setTimeout caused 70+ concurrent in-flight requests on network errors.
1060
+ // Flip this flag to true (and uncomment the StorageQueue.enqueue blocks)
1061
+ // to restore the original behavior once the retry mechanism is rewritten.
1062
+ this.RETRY_ENABLED = false;
1063
+ }
1056
1064
  track(eventName, properties, options) {
1057
1065
  if (!eventName || typeof eventName !== "string") {
1058
1066
  this.log("Invalid event name");
@@ -1239,10 +1247,7 @@ var OnrwayAnalytics = (() => {
1239
1247
  if (events.length === 0) return;
1240
1248
  const apiKey = this.resolveApiKey();
1241
1249
  if (!apiKey) {
1242
- this.log("No API key configured, dropping events");
1243
- for (const event of events) {
1244
- StorageQueue.enqueue(event);
1245
- }
1250
+ this.log("No API key configured, dropping events (retry disabled)");
1246
1251
  return;
1247
1252
  }
1248
1253
  const payload = this.buildPayload(events);
@@ -1251,7 +1256,8 @@ var OnrwayAnalytics = (() => {
1251
1256
  this.log(`Batch sent successfully: ${events.length} events`);
1252
1257
  } catch (error) {
1253
1258
  this.log(`Batch send failed (attempt ${retryCount + 1}/${this.config.maxRetryCount + 1}):`, error);
1254
- if (retryCount < this.config.maxRetryCount) {
1259
+ const retryEnabled = _Analytics.RETRY_ENABLED;
1260
+ if (retryEnabled && retryCount < this.config.maxRetryCount) {
1255
1261
  const delay = 1e3 * Math.pow(2, retryCount);
1256
1262
  this.log(`Retrying in ${delay}ms...`);
1257
1263
  this.retrying += 1;
@@ -1263,10 +1269,7 @@ var OnrwayAnalytics = (() => {
1263
1269
  }
1264
1270
  }, delay);
1265
1271
  } else {
1266
- this.log("Max retries reached, persisting events to localStorage");
1267
- for (const event of events) {
1268
- StorageQueue.enqueue(event);
1269
- }
1272
+ this.log("Max retries reached / retry disabled, dropping events");
1270
1273
  }
1271
1274
  }
1272
1275
  }
@@ -1284,6 +1287,10 @@ var OnrwayAnalytics = (() => {
1284
1287
  recoverFailedEvents() {
1285
1288
  if (this.config.disableServer) return;
1286
1289
  if (!this.sampled) return;
1290
+ if (!_Analytics.RETRY_ENABLED) {
1291
+ StorageQueue.clear();
1292
+ return;
1293
+ }
1287
1294
  const failedEvents = StorageQueue.recover();
1288
1295
  if (failedEvents.length > 0) {
1289
1296
  this.log(`Recovered ${failedEvents.length} failed events from storage`);
@@ -1342,9 +1349,7 @@ var OnrwayAnalytics = (() => {
1342
1349
  }
1343
1350
  }
1344
1351
  } catch {
1345
- for (const event of events) {
1346
- StorageQueue.enqueue(event);
1347
- }
1352
+ this.log("Failed to flush buffer on unload, dropping events (retry disabled)");
1348
1353
  }
1349
1354
  };
1350
1355
  this.unloadHandler = handler;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts", "../../src/types/index.ts", "../../src/utils/index.ts", "../../src/core/session-manager.ts", "../../src/core/sender.ts", "../../src/core/storage.ts", "../../src/core/context-collector.ts", "../../src/core/auto-track.ts", "../../src/core/error-monitor.ts", "../../src/core/gtm-loader.ts", "../../node_modules/web-vitals/dist/web-vitals.js", "../../src/core/performance-monitor.ts", "../../src/core/gtm-manager.ts", "../../src/core/analytics.ts"],
4
- "sourcesContent": ["export { Analytics, createAnalytics } from './core/analytics';\r\nexport { Sender } from './core/sender';\r\nexport { StorageQueue } from './core/storage';\r\nexport { SessionManager } from './core/session-manager';\r\nexport { initAutoTrack } from './core/auto-track';\r\nexport type { AutoTrackAPI } from './core/auto-track';\r\nexport { initErrorMonitor } from './core/error-monitor';\r\nexport type { ErrorMonitorAPI } from './core/error-monitor';\r\nexport { GTMManager } from './core/gtm-manager';\r\nexport { initPerformanceMonitor } from './core/performance-monitor';\r\nexport type { PerformanceMonitorAPI } from './core/performance-monitor';\r\nexport { collectContext, collectMarketing } from './core/context-collector';\r\n\r\nexport type {\r\n AnalyticsConfig,\r\n AnalyticsPayload,\r\n EventPayload,\r\n EventProperties,\r\n EventContext,\r\n ContextPayload,\r\n MarketingPayload,\r\n BrowserInfo,\r\n OSInfo,\r\n TrackOptions,\r\n TrackEvent,\r\n QueueItem,\r\n UserProfile,\r\n Environment,\r\n PerformanceConfig,\r\n GTMConfig,\r\n} from './types';\r\n\r\nexport {\r\n API_KEY_MAP,\r\n SDK_VERSION,\r\n DEFAULT_CONFIG,\r\n STORAGE_KEYS,\r\n} from './types';\r\n\r\nexport {\r\n generateUUID,\r\n generateId,\r\n getTimestamp,\r\n isObject,\r\n merge,\r\n detectBrowser,\r\n detectOS,\r\n getDeviceType,\r\n getScreenSize,\r\n getPageUrl,\r\n getReferrer,\r\n getHostname,\r\n getTimezone,\r\n getLanguage,\r\n getCountryFromLanguage,\r\n parseUTMParams,\r\n isBrowser,\r\n truncateText,\r\n} from './utils';\r\n", "export type Environment = 'beta' | 'development' | 'test' | 'testing' | 'sit' | 'uat' | 'prod' | 'production';\r\n\r\nexport interface BrowserInfo {\r\n name: string;\r\n version: string;\r\n}\r\n\r\nexport interface OSInfo {\r\n name: string;\r\n version: string;\r\n}\r\n\r\nexport interface ContextPayload {\r\n sdk_version: string;\r\n app_key: string;\r\n screen_width: number;\r\n screen_height: number;\r\n user_agent: string;\r\n referrer: string;\r\n hostname: string;\r\n browser: BrowserInfo;\r\n operating_system: OSInfo;\r\n device_type: 'mobile' | 'tablet' | 'desktop';\r\n country: string;\r\n language: string;\r\n merchant_language: string;\r\n timezone: string;\r\n client_type: string;\r\n}\r\n\r\nexport interface MarketingPayload {\r\n utm_source?: string;\r\n utm_medium?: string;\r\n utm_campaign?: string;\r\n utm_term?: string;\r\n utm_content?: string;\r\n landing_page?: string;\r\n referrer_url?: string;\r\n}\r\n\r\nexport interface EventProperties {\r\n system?: string;\r\n domain?: string;\r\n scene?: string;\r\n action?: string;\r\n target_type?: string;\r\n target_id?: string;\r\n page_url?: string;\r\n flow_id?: string;\r\n entity_type?: string;\r\n entity_id?: string;\r\n status?: string;\r\n response_code?: string;\r\n response_msg?: string;\r\n duration_ms?: number;\r\n request_id?: string;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface EventContext {\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface EventPayload {\r\n event_id: string;\r\n event_name: string;\r\n batch_event_index: number;\r\n batch_ordering_id: string;\r\n batch_page_id: string;\r\n timestamp: number;\r\n key_event: boolean;\r\n event_properties: EventProperties;\r\n context?: EventContext;\r\n}\r\n\r\nexport interface AnalyticsPayload {\r\n client_id: string;\r\n user_id?: string;\r\n session_id: string;\r\n user_properties?: Record<string, unknown>;\r\n context: ContextPayload;\r\n marketing: MarketingPayload;\r\n events: EventPayload[];\r\n}\r\n\r\nexport interface PerformanceConfig {\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface GTMConfig {\r\n containerId: string;\r\n enabled: boolean;\r\n dataLayerName?: string;\r\n}\r\n\r\nexport interface AnalyticsConfig {\r\n appKey?: string;\r\n serverUrl: string;\r\n apiKey?: string;\r\n env?: Environment;\r\n debug?: boolean;\r\n autoTrack?: boolean;\r\n autoTrackPageView?: boolean;\r\n system?: string;\r\n domain?: string;\r\n keyEvents?: string[];\r\n bufferFlushInterval?: number;\r\n bufferMaxSize?: number;\r\n maxRetryCount?: number;\r\n sessionTimeout?: number;\r\n autoTrackSelector?: string;\r\n performance?: PerformanceConfig;\r\n gtm?: GTMConfig;\r\n disableServer?: boolean;\r\n sampleRate?: number;\r\n\r\n /** @deprecated use appKey instead */\r\n appId?: string;\r\n}\r\n\r\nexport interface TrackOptions {\r\n keyEvent?: boolean;\r\n}\r\n\r\nexport interface UserProfile {\r\n userId?: string;\r\n anonymousId?: string;\r\n attributes?: Record<string, unknown>;\r\n}\r\n\r\n/** @deprecated use EventPayload instead */\r\nexport interface TrackEvent {\r\n event: string;\r\n properties?: Record<string, unknown>;\r\n timestamp?: number;\r\n}\r\n\r\n/** @deprecated use AnalyticsPayload instead */\r\nexport interface QueueItem {\r\n id: string;\r\n event: TrackEvent;\r\n retryCount: number;\r\n}\r\n\r\nexport interface StorageQueueItem {\r\n event: EventPayload;\r\n storedAt: number;\r\n}\r\n\r\nexport interface RetryEntry {\r\n events: EventPayload[];\r\n retryCount: number;\r\n timer: ReturnType<typeof setTimeout> | null;\r\n}\r\n\r\nexport const API_KEY_MAP: Record<string, string> = {\r\n beta: '5skbadERCne5HKSS9a1EXz5RetUiEfpP',\r\n development: '5skbadERCne5HKSS9a1EXz5RetUiEfpP',\r\n test: 'Dguh5yxNDEwyQlqDmikmd7ImruaOp8c8',\r\n testing: 'Dguh5yxNDEwyQlqDmikmd7ImruaOp8c8',\r\n sit: 'Dguh5yxNDEwyQlqDmikmd7ImruaOp8c8',\r\n uat: 'W565QolX6clTuL1Kqgpp0JmUqBkWKY6i',\r\n prod: 'HUk5Kogyuv9zH5qDA2qSCjVEnhanSkf8',\r\n production: 'HUk5Kogyuv9zH5qDA2qSCjVEnhanSkf8',\r\n};\r\n\r\nexport const SDK_VERSION = '1.0.0';\r\n\r\nexport const DEFAULT_CONFIG = {\r\n debug: false,\r\n autoTrack: true,\r\n bufferFlushInterval: 5000,\r\n bufferMaxSize: 25,\r\n maxRetryCount: 3,\r\n sessionTimeout: 30 * 60 * 1000,\r\n clientType: 'WEB',\r\n merchantLanguage: 'en',\r\n} as const;\r\n\r\nexport const STORAGE_KEYS = {\r\n FAILED_QUEUE: '__analytics_failed_queue__',\r\n CLIENT_ID: '__analytics_client_id__',\r\n LANDING_PAGE: '__analytics_landing_page__',\r\n REFERRER_URL: '__analytics_referrer_url__',\r\n UTM_PARAMS: '__analytics_utm_params__',\r\n} as const;\r\n\r\n// WARNING: These keys are embedded in the built bundle and visible to end users.\r\n// For production deployments, pass apiKey directly in AnalyticsConfig to avoid\r\n// exposing environment keys in source code.\r\n\r\nexport const MAX_STORAGE_ITEMS = 500;\r\n", "import { BrowserInfo, OSInfo } from '../types';\r\n\r\nexport function generateId(): string {\r\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\r\n}\r\n\r\nexport function getTimestamp(): number {\r\n return Date.now();\r\n}\r\n\r\nexport function isObject(value: unknown): value is Record<string, unknown> {\r\n return Object.prototype.toString.call(value) === '[object Object]';\r\n}\r\n\r\nexport function merge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {\r\n const result = { ...target };\r\n for (const key in source) {\r\n if (Object.prototype.hasOwnProperty.call(source, key)) {\r\n result[key] = source[key] as T[Extract<keyof T, string>];\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nexport function generateUUID(): string {\r\n const hex = '0123456789abcdef';\r\n const template = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';\r\n return template.replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return hex[v];\r\n });\r\n}\r\n\r\nexport function generateShortId(): string {\r\n return Math.random().toString(36).substring(2, 10);\r\n}\r\n\r\nexport function detectBrowser(): BrowserInfo {\r\n if (typeof navigator === 'undefined') return { name: 'Unknown', version: '0' };\r\n\r\n const ua = navigator.userAgent;\r\n const edgeMatch = ua.match(/Edg\\/(\\d+)/);\r\n if (edgeMatch) return { name: 'Edge', version: edgeMatch[1] };\r\n\r\n const chromeMatch = ua.match(/Chrome\\/(\\d+)/);\r\n const safariMatch = ua.match(/Safari\\/(\\d+)/);\r\n\r\n if (chromeMatch && !ua.includes('Edg') && !ua.includes('OPR')) {\r\n return { name: 'Chrome', version: chromeMatch[1] };\r\n }\r\n\r\n const firefoxMatch = ua.match(/Firefox\\/(\\d+)/);\r\n if (firefoxMatch) return { name: 'Firefox', version: firefoxMatch[1] };\r\n\r\n const opMatch = ua.match(/OPR\\/(\\d+)/);\r\n if (opMatch) return { name: 'Opera', version: opMatch[1] };\r\n\r\n if (safariMatch && !ua.includes('Chrome')) {\r\n const versionMatch = ua.match(/Version\\/(\\d+)/);\r\n return { name: 'Safari', version: versionMatch ? versionMatch[1] : safariMatch[1] };\r\n }\r\n\r\n const ieMatch = ua.match(/(?:MSIE |Trident\\/.*; rv:)(\\d+)/);\r\n if (ieMatch) return { name: 'IE', version: ieMatch[1] };\r\n\r\n return { name: 'Unknown', version: '0' };\r\n}\r\n\r\nexport function detectOS(): OSInfo {\r\n if (typeof navigator === 'undefined') return { name: 'Unknown', version: '0' };\r\n\r\n const ua = navigator.userAgent;\r\n const platform = navigator.platform || '';\r\n\r\n if (ua.includes('Windows NT 10')) return { name: 'Windows', version: '10' };\r\n if (ua.includes('Windows NT 6.3')) return { name: 'Windows', version: '8.1' };\r\n if (ua.includes('Windows NT 6.2')) return { name: 'Windows', version: '8' };\r\n if (ua.includes('Windows NT 6.1')) return { name: 'Windows', version: '7' };\r\n if (/Windows NT \\d/.test(ua)) return { name: 'Windows', version: ua.match(/Windows NT (\\d+\\.?\\d*)/)?.[1] || '0' };\r\n\r\n const macMatch = ua.match(/Mac OS X (\\d+[._]\\d+)/);\r\n if (macMatch) return { name: 'macOS', version: macMatch[1].replace('_', '.') };\r\n\r\n if (platform.startsWith('Mac')) return { name: 'macOS', version: '0' };\r\n\r\n if (/Android (\\d+\\.?\\d*)/.test(ua)) return { name: 'Android', version: ua.match(/Android (\\d+\\.?\\d*)/)?.[1] || '0' };\r\n\r\n if (/iPhone|iPad|iPod/.test(ua)) {\r\n const iosMatch = ua.match(/OS (\\d+[._]\\d+)/);\r\n return { name: 'iOS', version: iosMatch ? iosMatch[1].replace('_', '.') : '0' };\r\n }\r\n\r\n if (/Linux/.test(ua) || platform.includes('Linux')) return { name: 'Linux', version: '0' };\r\n\r\n return { name: 'Unknown', version: '0' };\r\n}\r\n\r\nexport function getDeviceType(): 'mobile' | 'tablet' | 'desktop' {\r\n if (typeof window === 'undefined' || typeof navigator === 'undefined') return 'desktop';\r\n\r\n const width = window.screen.width;\r\n const hasTouch = navigator.maxTouchPoints > 0;\r\n\r\n if (width < 768 && hasTouch) return 'mobile';\r\n if (width >= 768 && width <= 1024 && hasTouch) return 'tablet';\r\n return 'desktop';\r\n}\r\n\r\nexport function getScreenSize(): { width: number; height: number } {\r\n if (typeof window === 'undefined') return { width: 0, height: 0 };\r\n return {\r\n width: window.screen.width,\r\n height: window.screen.height,\r\n };\r\n}\r\n\r\nexport function getPageUrl(): string {\r\n if (typeof window === 'undefined') return '';\r\n return window.location.href;\r\n}\r\n\r\nexport function getReferrer(): string {\r\n if (typeof document === 'undefined') return '';\r\n return document.referrer || '';\r\n}\r\n\r\nexport function getHostname(): string {\r\n if (typeof window === 'undefined') return '';\r\n return window.location.host.split(':')[0];\r\n}\r\n\r\nexport function getTimezone(): string {\r\n try {\r\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n } catch {\r\n return 'UTC';\r\n }\r\n}\r\n\r\nexport function getLanguage(): string {\r\n if (typeof navigator === 'undefined') return 'en-US';\r\n return navigator.language || 'en-US';\r\n}\r\n\r\nexport function getCountryFromLanguage(language: string): string {\r\n const parts = language.split('-');\r\n if (parts.length > 1) return parts[1].toUpperCase();\r\n const langMap: Record<string, string> = {\r\n zh: 'CN', en: 'US', ja: 'JP', ko: 'KR', fr: 'FR',\r\n de: 'DE', es: 'ES', pt: 'BR', ru: 'RU', ar: 'SA',\r\n };\r\n return langMap[parts[0]] || parts[0].toUpperCase();\r\n}\r\n\r\nexport function parseUTMParams(): Record<string, string> {\r\n if (typeof window === 'undefined') return {};\r\n\r\n const params: Record<string, string> = {};\r\n const searchParams = new URLSearchParams(window.location.search);\r\n const utmKeys = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];\r\n\r\n for (const key of utmKeys) {\r\n const value = searchParams.get(key);\r\n if (value) params[key] = value;\r\n }\r\n\r\n return params;\r\n}\r\n\r\nexport function isBrowser(): boolean {\r\n return typeof window !== 'undefined' && typeof document !== 'undefined';\r\n}\r\n\r\nexport function safeLocalStorageGet(key: string): string | null {\r\n try {\r\n return localStorage.getItem(key);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function safeLocalStorageSet(key: string, value: string): boolean {\r\n try {\r\n localStorage.setItem(key, value);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function safeLocalStorageRemove(key: string): void {\r\n try {\r\n localStorage.removeItem(key);\r\n } catch {\r\n // ignore\r\n }\r\n}\r\n\r\nexport function safeSessionStorageGet(key: string): string | null {\r\n try {\r\n return sessionStorage.getItem(key);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function safeSessionStorageSet(key: string, value: string): boolean {\r\n try {\r\n sessionStorage.setItem(key, value);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function safeSessionStorageRemove(key: string): void {\r\n try {\r\n sessionStorage.removeItem(key);\r\n } catch {\r\n // ignore\r\n }\r\n}\r\n\r\nexport function truncateText(text: string, maxLength: number): string {\r\n if (!text) return '';\r\n const trimmed = text.trim().replace(/\\s+/g, ' ');\r\n return trimmed.length > maxLength ? trimmed.substring(0, maxLength) + '...' : trimmed;\r\n}\r\n", "import { generateUUID, safeSessionStorageGet, safeSessionStorageSet, safeSessionStorageRemove } from '../utils';\r\n\r\nconst SESSION_KEY = '__analytics_session__';\r\nconst SESSION_DEFAULT_TIMEOUT = 30 * 60 * 1000;\r\n\r\ninterface SessionData {\r\n sessionId: string;\r\n createdAt: number;\r\n}\r\n\r\nexport class SessionManager {\r\n private sessionId: string;\r\n private createdAt: number = 0;\r\n private timeout: number;\r\n\r\n constructor(timeout: number = SESSION_DEFAULT_TIMEOUT) {\r\n this.timeout = timeout;\r\n const existing = this.loadSession();\r\n if (existing && !this.isExpired(existing)) {\r\n this.sessionId = existing.sessionId;\r\n this.createdAt = existing.createdAt;\r\n } else {\r\n this.sessionId = this.createNewSession();\r\n this.createdAt = Date.now();\r\n }\r\n }\r\n\r\n getSessionId(): string {\r\n if (this.isExpired({ sessionId: this.sessionId, createdAt: this.createdAt })) {\r\n this.sessionId = this.createNewSession();\r\n }\r\n return this.sessionId;\r\n }\r\n\r\n refresh(): void {\r\n this.sessionId = this.createNewSession();\r\n }\r\n\r\n private loadSession(): SessionData | null {\r\n try {\r\n const raw = safeSessionStorageGet(SESSION_KEY);\r\n if (!raw) return null;\r\n return JSON.parse(raw) as SessionData;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private saveSession(): void {\r\n const data: SessionData = {\r\n sessionId: this.sessionId,\r\n createdAt: this.createdAt,\r\n };\r\n safeSessionStorageSet(SESSION_KEY, JSON.stringify(data));\r\n }\r\n\r\n private isExpired(data: SessionData): boolean {\r\n return Date.now() - data.createdAt > this.timeout;\r\n }\r\n\r\n private createNewSession(): string {\r\n const id = generateUUID();\r\n this.sessionId = id;\r\n this.createdAt = Date.now();\r\n this.saveSession();\r\n return id;\r\n }\r\n}\r\n", "import { AnalyticsPayload } from '../types';\r\n\r\nexport class Sender {\r\n static async send(payload: AnalyticsPayload, serverUrl: string, apiKey: string): Promise<void> {\r\n if (Sender.supportsKeepalive()) {\r\n return Sender.fetchSend(payload, serverUrl, apiKey);\r\n }\r\n return Sender.xhrSend(payload, serverUrl, apiKey);\r\n }\r\n\r\n static async sendBeacon(payload: AnalyticsPayload, serverUrl: string, apiKey: string): Promise<void> {\r\n if (typeof navigator === 'undefined' || !navigator.sendBeacon) {\r\n throw new Error('sendBeacon not available');\r\n }\r\n\r\n const url = Sender.buildBeaconUrl(serverUrl, apiKey);\r\n const blob = new Blob([JSON.stringify(payload)], { type: 'application/json' });\r\n const success = navigator.sendBeacon(url, blob);\r\n\r\n if (!success) {\r\n throw new Error('sendBeacon rejected payload');\r\n }\r\n }\r\n\r\n static async fetchSend(payload: AnalyticsPayload, serverUrl: string, apiKey: string): Promise<void> {\r\n const response = await fetch(serverUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n apiKey,\r\n },\r\n body: JSON.stringify(payload),\r\n keepalive: true,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n }\r\n\r\n static async xhrSend(payload: AnalyticsPayload, serverUrl: string, apiKey: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open('POST', serverUrl);\r\n xhr.setRequestHeader('Content-Type', 'application/json');\r\n xhr.setRequestHeader('apiKey', apiKey);\r\n xhr.timeout = 10000;\r\n\r\n xhr.onload = () => {\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n resolve();\r\n } else {\r\n reject(new Error(`HTTP ${xhr.status}: ${xhr.statusText}`));\r\n }\r\n };\r\n\r\n xhr.onerror = () => reject(new Error('XHR network error'));\r\n xhr.ontimeout = () => reject(new Error('XHR timeout'));\r\n\r\n xhr.send(JSON.stringify(payload));\r\n });\r\n }\r\n\r\n private static supportsKeepalive(): boolean {\r\n try {\r\n return typeof Request !== 'undefined' && 'keepalive' in Request.prototype;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private static buildBeaconUrl(serverUrl: string, apiKey: string): string {\r\n const separator = serverUrl.includes('?') ? '&' : '?';\r\n return `${serverUrl}${separator}apiKey=${encodeURIComponent(apiKey)}`;\r\n }\r\n}\r\n", "import { EventPayload, StorageQueueItem, STORAGE_KEYS, MAX_STORAGE_ITEMS } from '../types';\r\nimport { safeLocalStorageGet, safeLocalStorageSet, safeLocalStorageRemove } from '../utils';\r\n\r\nconst MAX_EVENT_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours\r\n\r\nexport class StorageQueue {\r\n static enqueue(event: EventPayload): void {\r\n try {\r\n const queue = StorageQueue.readQueue();\r\n queue.push({ event, storedAt: Date.now() });\r\n\r\n while (queue.length > MAX_STORAGE_ITEMS) {\r\n queue.shift();\r\n }\r\n\r\n safeLocalStorageSet(STORAGE_KEYS.FAILED_QUEUE, JSON.stringify(queue));\r\n } catch {\r\n // Silently fail if storage is unavailable\r\n }\r\n }\r\n\r\n static recover(): EventPayload[] {\r\n try {\r\n const queue = StorageQueue.readQueue();\r\n StorageQueue.clear();\r\n\r\n const now = Date.now();\r\n const events = queue\r\n .filter((item) => now - item.storedAt < MAX_EVENT_AGE_MS)\r\n .map((item) => item.event);\r\n return events;\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n static clear(): void {\r\n safeLocalStorageRemove(STORAGE_KEYS.FAILED_QUEUE);\r\n }\r\n\r\n static getQueueSize(): number {\r\n return StorageQueue.readQueue().length;\r\n }\r\n\r\n private static readQueue(): StorageQueueItem[] {\r\n try {\r\n const raw = safeLocalStorageGet(STORAGE_KEYS.FAILED_QUEUE);\r\n if (!raw) return [];\r\n const parsed = JSON.parse(raw);\r\n if (!Array.isArray(parsed)) return [];\r\n return parsed;\r\n } catch {\r\n return [];\r\n }\r\n }\r\n}\r\n", "import {\r\n ContextPayload,\r\n MarketingPayload,\r\n SDK_VERSION,\r\n STORAGE_KEYS,\r\n} from '../types';\r\nimport {\r\n detectBrowser,\r\n detectOS,\r\n getDeviceType,\r\n getScreenSize,\r\n getHostname,\r\n getReferrer,\r\n getTimezone,\r\n getLanguage,\r\n getCountryFromLanguage,\r\n parseUTMParams,\r\n safeLocalStorageGet,\r\n safeLocalStorageSet,\r\n isBrowser,\r\n} from '../utils';\r\n\r\nexport function collectContext(appKey: string, merchantLanguage: string, clientType: string): ContextPayload {\r\n const screen = getScreenSize();\r\n\r\n return {\r\n sdk_version: SDK_VERSION,\r\n app_key: appKey,\r\n screen_width: screen.width,\r\n screen_height: screen.height,\r\n user_agent: isBrowser() ? navigator.userAgent : '',\r\n referrer: getReferrer(),\r\n hostname: getHostname(),\r\n browser: detectBrowser(),\r\n operating_system: detectOS(),\r\n device_type: getDeviceType(),\r\n country: getCountryFromLanguage(getLanguage()),\r\n language: getLanguage(),\r\n merchant_language: merchantLanguage,\r\n timezone: getTimezone(),\r\n client_type: clientType,\r\n };\r\n}\r\n\r\nexport function collectMarketing(): MarketingPayload {\r\n if (!isBrowser()) return {};\r\n\r\n // If current URL has UTM params (new campaign visit), update the cache and use them.\r\n // If not (SPA internal navigation), fall back to cached value so attribution is preserved.\r\n let utm: Record<string, string> = {};\r\n const freshUtm = parseUTMParams();\r\n if (Object.keys(freshUtm).length > 0) {\r\n utm = freshUtm;\r\n safeLocalStorageSet(STORAGE_KEYS.UTM_PARAMS, JSON.stringify(utm));\r\n } else {\r\n const storedUtm = safeLocalStorageGet(STORAGE_KEYS.UTM_PARAMS);\r\n if (storedUtm) {\r\n try { utm = JSON.parse(storedUtm); } catch { /* ignore corrupt value */ }\r\n }\r\n }\r\n\r\n let landingPage = safeLocalStorageGet(STORAGE_KEYS.LANDING_PAGE);\r\n if (!landingPage) {\r\n landingPage = window.location.href;\r\n safeLocalStorageSet(STORAGE_KEYS.LANDING_PAGE, landingPage);\r\n }\r\n\r\n let referrerUrl = safeLocalStorageGet(STORAGE_KEYS.REFERRER_URL);\r\n if (referrerUrl === null && document.referrer) {\r\n referrerUrl = document.referrer;\r\n safeLocalStorageSet(STORAGE_KEYS.REFERRER_URL, referrerUrl);\r\n }\r\n\r\n return {\r\n ...utm,\r\n landing_page: landingPage || window.location.href,\r\n referrer_url: referrerUrl || '',\r\n };\r\n}\r\n", "import { truncateText } from '../utils';\r\n\r\nconst TRACK_ATTR_PREFIX = 'data-track-';\r\nconst IGNORE_ATTR = 'data-track-ignore';\r\nconst NAME_ATTR = 'data-track-name';\r\nconst PROPS_ATTR = 'data-track-properties';\r\n\r\nexport interface AutoTrackAPI {\r\n track(eventName: string, properties?: Record<string, unknown>): void;\r\n debug?: boolean;\r\n}\r\n\r\nexport function initAutoTrack(api: AutoTrackAPI, selector?: string): void {\r\n if (typeof document === 'undefined') return;\r\n\r\n const handler = (e: Event): void => {\r\n try {\r\n const target = e.target as HTMLElement;\r\n if (!target) return;\r\n\r\n if (shouldIgnoreElement(target)) return;\r\n\r\n if (selector) {\r\n const scope = document.querySelector(selector);\r\n if (scope && !scope.contains(target)) return;\r\n }\r\n\r\n const eventName = getTrackName(target);\r\n const properties = collectElementProperties(target);\r\n\r\n api.track(eventName, properties);\r\n } catch {\r\n // Fail silently to avoid breaking user's page\r\n }\r\n };\r\n\r\n document.addEventListener('click', handler, true);\r\n}\r\n\r\nfunction shouldIgnoreElement(element: HTMLElement): boolean {\r\n let current: HTMLElement | null = element;\r\n while (current) {\r\n if (current.hasAttribute(IGNORE_ATTR)) return true;\r\n current = current.parentElement;\r\n }\r\n return false;\r\n}\r\n\r\nfunction getTrackName(element: HTMLElement): string {\r\n const name = element.getAttribute(NAME_ATTR);\r\n if (name) return name;\r\n\r\n const id = element.id ? `_${element.id.replace(/[^\\w-]/g, '_')}` : '';\r\n const tag = element.tagName.toLowerCase();\r\n return `click_${tag}${id}`;\r\n}\r\n\r\nfunction collectElementProperties(element: HTMLElement): Record<string, unknown> {\r\n const props: Record<string, unknown> = {\r\n action: 'click',\r\n target_type: inferTargetType(element),\r\n target_id: getTargetId(element),\r\n target_tag: element.tagName.toLowerCase(),\r\n target_class: getTruncatedClassName(element),\r\n target_text: truncateText(element.innerText || '', 50),\r\n };\r\n\r\n if (element.hasAttribute('href') || element.closest('a')) {\r\n const anchor = element.closest('a');\r\n if (anchor) {\r\n props.target_href = anchor.getAttribute('href') || '';\r\n }\r\n }\r\n\r\n const customProps = collectDataTrackProps(element);\r\n Object.assign(props, customProps);\r\n\r\n return props;\r\n}\r\n\r\nfunction inferTargetType(element: HTMLElement): string {\r\n const tag = element.tagName.toLowerCase();\r\n if (tag === 'a' || tag === 'button') return 'button';\r\n if (tag === 'input') {\r\n const type = (element as HTMLInputElement).type;\r\n if (type === 'submit' || type === 'button' || type === 'reset') return 'button';\r\n if (type === 'checkbox' || type === 'radio') return 'checkbox';\r\n return 'input';\r\n }\r\n if (tag === 'select') return 'select';\r\n if (tag === 'img') return 'image';\r\n if (tag === 'form') return 'form';\r\n if (tag === 'textarea') return 'input';\r\n return 'element';\r\n}\r\n\r\nfunction getTargetId(element: HTMLElement): string {\r\n if (element.id) return element.id;\r\n\r\n const name = element.getAttribute('name');\r\n if (name) return name;\r\n\r\n const dataTestId = element.getAttribute('data-testid') || element.getAttribute('data-test-id');\r\n if (dataTestId) return dataTestId;\r\n\r\n return '';\r\n}\r\n\r\nfunction getTruncatedClassName(element: HTMLElement): string {\r\n const cls = typeof element.className === 'string' ? element.className : '';\r\n return truncateText(cls, 100);\r\n}\r\n\r\nfunction collectDataTrackProps(element: HTMLElement): Record<string, unknown> {\r\n const props: Record<string, unknown> = {};\r\n const trackName = element.getAttribute(NAME_ATTR);\r\n if (trackName) props.name = trackName;\r\n\r\n const rawProps = element.getAttribute(PROPS_ATTR);\r\n if (rawProps) {\r\n try {\r\n const parsed = JSON.parse(rawProps);\r\n Object.assign(props, parsed);\r\n } catch {\r\n // Invalid JSON, ignore\r\n }\r\n }\r\n\r\n for (const attr of Array.from(element.attributes)) {\r\n if (attr.name.startsWith(TRACK_ATTR_PREFIX) && attr.name !== NAME_ATTR && attr.name !== PROPS_ATTR && attr.name !== IGNORE_ATTR) {\r\n const key = attr.name.replace(TRACK_ATTR_PREFIX, '');\r\n props[key] = attr.value;\r\n }\r\n }\r\n\r\n return props;\r\n}\r\n", "export interface ErrorMonitorAPI {\r\n track(eventName: string, properties?: Record<string, unknown>): void;\r\n}\r\n\r\nexport function initErrorMonitor(api: ErrorMonitorAPI): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n window.addEventListener('error', (event: ErrorEvent) => {\r\n try {\r\n const { message, filename, lineno, colno, error } = event;\r\n\r\n const isResourceError = !message && event.target !== window;\r\n if (isResourceError) return;\r\n\r\n api.track('error_event', {\r\n action: 'error',\r\n target_type: 'system',\r\n error_type: 'window_error',\r\n error_message: message || 'Unknown error',\r\n error_filename: filename || '',\r\n error_lineno: lineno || 0,\r\n error_colno: colno || 0,\r\n error_stack: error instanceof Error ? error.stack : '',\r\n error_name: error instanceof Error ? error.name : '',\r\n });\r\n } catch {\r\n // Fail silently to avoid recursive error reporting\r\n }\r\n });\r\n\r\n window.addEventListener('unhandledrejection', (event: PromiseRejectionEvent) => {\r\n try {\r\n const { reason } = event;\r\n\r\n let errorMessage = 'Unhandled Promise Rejection';\r\n let errorStack = '';\r\n let errorName = 'PromiseRejection';\r\n\r\n if (reason instanceof Error) {\r\n errorMessage = reason.message;\r\n errorStack = reason.stack || '';\r\n errorName = reason.name;\r\n } else if (typeof reason === 'string') {\r\n errorMessage = reason;\r\n } else {\r\n try {\r\n errorMessage = JSON.stringify(reason);\r\n } catch {\r\n errorMessage = String(reason);\r\n }\r\n }\r\n\r\n api.track('error_event', {\r\n action: 'error',\r\n target_type: 'system',\r\n error_type: 'unhandled_rejection',\r\n error_message: errorMessage,\r\n error_stack: errorStack,\r\n error_name: errorName,\r\n });\r\n } catch {\r\n // Fail silently\r\n }\r\n });\r\n}\r\n", "import { GTMConfig } from '../types';\n\nexport function initGTM(config: GTMConfig): void {\n if (!config.enabled || !config.containerId) return;\n if (typeof window === 'undefined') return;\n\n const dataLayerName = config.dataLayerName || 'dataLayer';\n const w = window as unknown as Record<string, unknown>;\n\n // Initialize dataLayer before the script loads so queued pushes are preserved\n if (!Array.isArray(w[dataLayerName])) {\n w[dataLayerName] = [];\n }\n (w[dataLayerName] as unknown[]).push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' });\n\n // Inject <head> script if not already present\n const existingScript = document.querySelector(\n `script[src*=\"googletagmanager.com/gtm.js?id=${config.containerId}\"]`\n );\n if (!existingScript) {\n const dl = dataLayerName !== 'dataLayer' ? `&l=${encodeURIComponent(dataLayerName)}` : '';\n const script = document.createElement('script');\n script.async = true;\n script.src = `https://www.googletagmanager.com/gtm.js?id=${config.containerId}${dl}`;\n const firstScript = document.getElementsByTagName('script')[0];\n firstScript.parentNode?.insertBefore(script, firstScript);\n }\n\n // Inject <body> noscript fallback if not already present\n if (!document.querySelector(`noscript[data-gtm-id=\"${config.containerId}\"]`)) {\n const noscript = document.createElement('noscript');\n noscript.setAttribute('data-gtm-id', config.containerId);\n const iframe = document.createElement('iframe');\n iframe.src = `https://www.googletagmanager.com/ns.html?id=${config.containerId}`;\n iframe.height = '0';\n iframe.width = '0';\n iframe.style.display = 'none';\n iframe.style.visibility = 'hidden';\n noscript.appendChild(iframe);\n if (document.body) {\n document.body.insertBefore(noscript, document.body.firstChild);\n }\n }\n}\n", "let e=-1;const t=t=>{addEventListener(\"pageshow\",n=>{n.persisted&&(e=n.timeStamp,t(n))},!0)},n=(e,t,n,i)=>{let s,o;return r=>{t.value>=0&&(r||i)&&(o=t.value-(s??0),(o||void 0===s)&&(s=t.value,t.delta=o,t.rating=((e,t)=>e>t[1]?\"poor\":e>t[0]?\"needs-improvement\":\"good\")(t.value,n),e(t)))}},i=e=>{requestAnimationFrame(()=>requestAnimationFrame(e))},s=()=>{const e=performance.getEntriesByType(\"navigation\")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},o=()=>s()?.activationStart??0,r=(t,n=-1)=>{const i=s();let r=\"navigate\";e>=0?r=\"back-forward-cache\":i&&(document.prerendering||o()>0?r=\"prerender\":document.wasDiscarded?r=\"restore\":i.type&&(r=i.type.replace(/_/g,\"-\")));return{name:t,value:n,rating:\"good\",delta:0,entries:[],id:`v5-${Date.now()}-${Math.floor(8999999999999*Math.random())+1e12}`,navigationType:r}},c=new WeakMap;function a(e,t){return c.get(e)||c.set(e,new t),c.get(e)}class d{t;i=0;o=[];h(e){if(e.hadRecentInput)return;const t=this.o[0],n=this.o.at(-1);this.i&&t&&n&&e.startTime-n.startTime<1e3&&e.startTime-t.startTime<5e3?(this.i+=e.value,this.o.push(e)):(this.i=e.value,this.o=[e]),this.t?.(e)}}const h=(e,t,n={})=>{try{if(PerformanceObserver.supportedEntryTypes.includes(e)){const i=new PerformanceObserver(e=>{queueMicrotask(()=>{t(e.getEntries())})});return i.observe({type:e,buffered:!0,...n}),i}}catch{}},f=e=>{let t=!1;return()=>{t||(e(),t=!0)}};let l=-1;const u=new Set,m=()=>\"hidden\"!==document.visibilityState||document.prerendering?1/0:0,g=e=>{if(\"hidden\"===document.visibilityState){if(\"visibilitychange\"===e.type)for(const e of u)e();isFinite(l)||(l=\"visibilitychange\"===e.type?e.timeStamp:0,removeEventListener(\"prerenderingchange\",g,!0))}},p=()=>{if(l<0){const e=o(),n=document.prerendering?void 0:globalThis.performance.getEntriesByType(\"visibility-state\").find(t=>\"hidden\"===t.name&&t.startTime>=e)?.startTime;l=n??m(),addEventListener(\"visibilitychange\",g,!0),addEventListener(\"prerenderingchange\",g,!0),t(()=>{setTimeout(()=>{l=m()})})}return{get firstHiddenTime(){return l},onHidden(e){u.add(e)}}},v=e=>{document.prerendering?addEventListener(\"prerenderingchange\",e,!0):e()},y=[1800,3e3],T=(e,s={})=>{v(()=>{const c=p();let a,d=r(\"FCP\");const f=h(\"paint\",e=>{for(const t of e)\"first-contentful-paint\"===t.name&&(f.disconnect(),t.startTime<c.firstHiddenTime&&(d.value=Math.max(t.startTime-o(),0),d.entries.push(t),a(!0)))});f&&(a=n(e,d,y,s.reportAllChanges),t(t=>{d=r(\"FCP\"),a=n(e,d,y,s.reportAllChanges),i(()=>{d.value=performance.now()-t.timeStamp,a(!0)})}))})},E=[.1,.25],b=(e,s={})=>{const o=p();T(f(()=>{let c,f=r(\"CLS\",0);const l=a(s,d),u=e=>{for(const t of e)l.h(t);l.i>f.value&&(f.value=l.i,f.entries=l.o,c())},m=h(\"layout-shift\",u);m&&(c=n(e,f,E,s.reportAllChanges),o.onHidden(()=>{u(m.takeRecords()),c(!0)}),t(()=>{l.i=0,f=r(\"CLS\",0),c=n(e,f,E,s.reportAllChanges),i(c)}),setTimeout(c))}))};let L=0,P=1/0,_=0;const M=e=>{for(const t of e)t.interactionId&&(P=Math.min(P,t.interactionId),_=Math.max(_,t.interactionId),L=_?(_-P)/7+1:0)};let w;const C=()=>w?L:performance.interactionCount??0,I=()=>{\"interactionCount\"in performance||w||(w=h(\"event\",M,{durationThreshold:0}))};let F=0;class k{l=[];u=new Map;m;p;v(){F=C(),this.l.length=0,this.u.clear()}T(){const e=Math.min(this.l.length-1,Math.floor((C()-F)/50));return this.l[e]}h(e){if(this.m?.(e),!e.interactionId&&\"first-input\"!==e.entryType)return;const t=this.l.at(-1);let n=this.u.get(e.interactionId);if(n||this.l.length<10||e.duration>t.L){if(n?e.duration>n.L?(n.entries=[e],n.L=e.duration):e.duration===n.L&&e.startTime===n.entries[0].startTime&&n.entries.push(e):(n={id:e.interactionId,entries:[e],L:e.duration},this.u.set(n.id,n),this.l.push(n)),this.l.sort((e,t)=>t.L-e.L),this.l.length>10){const e=this.l.splice(10);for(const t of e)this.u.delete(t.id)}this.p?.(n)}}}const A=e=>{const t=globalThis.requestIdleCallback||setTimeout,n=globalThis.cancelIdleCallback||clearTimeout;if(\"hidden\"===document.visibilityState)e();else{const i=f(e);let s=-1;const o=()=>{n(s),i()};addEventListener(\"visibilitychange\",o,{once:!0,capture:!0}),s=t(()=>{removeEventListener(\"visibilitychange\",o,{capture:!0}),i()})}},B=[200,500],S=(e,i={})=>{if(!globalThis.PerformanceEventTiming||!(\"interactionId\"in PerformanceEventTiming.prototype))return;const s=p();v(()=>{I();let o,c=r(\"INP\");const d=a(i,k),f=e=>{A(()=>{for(const t of e)d.h(t);const t=d.T();t&&t.L!==c.value&&(c.value=t.L,c.entries=t.entries,o())})},l=h(\"event\",f,{durationThreshold:i.durationThreshold??40});o=n(e,c,B,i.reportAllChanges),l&&(l.observe({type:\"first-input\",buffered:!0}),s.onHidden(()=>{f(l.takeRecords()),o(!0)}),t(()=>{d.v(),c=r(\"INP\"),o=n(e,c,B,i.reportAllChanges)}))})};class q{m;h(e){this.m?.(e)}}const N=[2500,4e3],x=(e,s={})=>{v(()=>{const c=p();let d,l=r(\"LCP\");const u=a(s,q),m=e=>{s.reportAllChanges||(e=e.slice(-1));for(const t of e)u.h(t),t.startTime<c.firstHiddenTime&&(l.value=Math.max(t.startTime-o(),0),l.entries=[t],d())},g=h(\"largest-contentful-paint\",m);if(g){d=n(e,l,N,s.reportAllChanges);const o=f(()=>{m(g.takeRecords()),g.disconnect(),d(!0)}),c=e=>{e.isTrusted&&(A(o),removeEventListener(e.type,c,{capture:!0}))};for(const e of[\"keydown\",\"click\",\"visibilitychange\"])addEventListener(e,c,{capture:!0});t(t=>{l=r(\"LCP\"),d=n(e,l,N,s.reportAllChanges),i(()=>{l.value=performance.now()-t.timeStamp,d(!0)})})}})},H=[800,1800],O=e=>{document.prerendering?v(()=>O(e)):\"complete\"!==document.readyState?addEventListener(\"load\",()=>O(e),!0):setTimeout(e)},$=(e,i={})=>{let c=r(\"TTFB\"),a=n(e,c,H,i.reportAllChanges);O(()=>{const d=s();d&&(c.value=Math.max(d.responseStart-o(),0),c.entries=[d],a(!0),t(()=>{c=r(\"TTFB\",0),a=n(e,c,H,i.reportAllChanges),a(!0)}))})};export{E as CLSThresholds,y as FCPThresholds,B as INPThresholds,N as LCPThresholds,H as TTFBThresholds,b as onCLS,T as onFCP,S as onINP,x as onLCP,$ as onTTFB};\n", "import {\n onLCP,\n onFCP,\n onCLS,\n onINP,\n onTTFB,\n} from 'web-vitals';\nimport type { MetricType } from 'web-vitals';\n\nimport type { Analytics } from './analytics';\nimport type { PerformanceConfig } from '../types';\n\nexport type PerformanceMonitorAPI = Pick<Analytics, 'track'>;\n\nfunction normalize(value: number, isCLS: boolean): number {\n if (isCLS) {\n return Math.round(value * 10000) / 10000;\n }\n return Math.round(value);\n}\n\nfunction reportMetric(api: PerformanceMonitorAPI, metric: MetricType): void {\n const isCLS = metric.name === 'CLS';\n const properties: Record<string, unknown> = {\n action: 'metric',\n target_type: 'performance',\n metric_name: metric.name,\n metric_value: normalize(metric.value, isCLS),\n metric_rating: metric.rating,\n delta: normalize(metric.delta, isCLS),\n metric_id: metric.id,\n navigation_type: metric.navigationType,\n };\n\n if (metric.name === 'LCP') {\n const entry = metric.entries[metric.entries.length - 1] as LargestContentfulPaint | undefined;\n if (entry) {\n properties.lcp_element = entry.element?.tagName?.toLowerCase() || '';\n properties.lcp_url = entry.url || '';\n properties.lcp_size = entry.size;\n }\n }\n\n api.track('web_vital', properties);\n}\n\nexport function initPerformanceMonitor(\n api: PerformanceMonitorAPI,\n config: PerformanceConfig = {},\n): void {\n if (config.enabled === false) return;\n\n try {\n onLCP((metric) => reportMetric(api, metric));\n onFCP((metric) => reportMetric(api, metric));\n onCLS((metric) => reportMetric(api, metric));\n onINP((metric) => reportMetric(api, metric));\n onTTFB((metric) => reportMetric(api, metric));\n } catch {\n // Web Vitals API not supported in this browser\n }\n}\n", "declare global {\n interface Window {\n dataLayer: unknown[];\n }\n}\n\nexport class GTMManager {\n private _initialized = false;\n private _containerId: string | undefined;\n private _dataLayerName = 'dataLayer';\n\n get ready(): boolean {\n return this._initialized && typeof window !== 'undefined';\n }\n\n get containerId(): string | undefined {\n return this._containerId;\n }\n\n push(data: Record<string, unknown>): void {\n if (!this.ready) return;\n const w = window as unknown as Record<string, unknown>;\n const dl = w[this._dataLayerName];\n if (Array.isArray(dl)) {\n dl.push(data);\n }\n }\n\n track(eventName: string, properties?: Record<string, unknown>): void {\n this.push({ event: eventName, ...(properties || {}) });\n }\n\n setUserId(userId: string | null): void {\n this.push({ userId: userId ?? undefined });\n }\n\n setUserProperties(properties: Record<string, unknown>): void {\n this.push(properties);\n }\n\n _init(containerId: string, dataLayerName = 'dataLayer'): void {\n this._containerId = containerId;\n this._dataLayerName = dataLayerName;\n this._initialized = true;\n }\n\n _destroy(): void {\n this._initialized = false;\n this._containerId = undefined;\n }\n}\n", "import {\r\n AnalyticsConfig,\r\n AnalyticsPayload,\r\n EventPayload,\r\n EventProperties,\r\n TrackOptions,\r\n UserProfile,\r\n API_KEY_MAP,\r\n DEFAULT_CONFIG,\r\n STORAGE_KEYS,\r\n} from '../types';\r\nimport { SessionManager } from './session-manager';\r\nimport { Sender } from './sender';\r\nimport { StorageQueue } from './storage';\r\nimport { collectContext, collectMarketing } from './context-collector';\r\nimport { initAutoTrack } from './auto-track';\r\nimport { initErrorMonitor } from './error-monitor';\r\nimport { initGTM } from './gtm-loader';\r\nimport { initPerformanceMonitor } from './performance-monitor';\r\nimport { GTMManager } from './gtm-manager';\r\nimport {\r\n generateId,\r\n generateUUID,\r\n getTimestamp,\r\n isObject,\r\n isBrowser,\r\n getPageUrl,\r\n safeLocalStorageGet,\r\n safeLocalStorageSet,\r\n} from '../utils';\r\n\r\nlet globalBatchCounter = 0;\r\n\r\nexport class Analytics {\r\n private config: Required<Pick<AnalyticsConfig, 'debug' | 'autoTrack' | 'bufferFlushInterval' | 'bufferMaxSize' | 'maxRetryCount'>> & AnalyticsConfig;\r\n private sessionManager: SessionManager;\r\n private buffer: EventPayload[] = [];\r\n private bufferTimer: ReturnType<typeof setTimeout> | null = null;\r\n private userId: string | null = null;\r\n private userProps: Record<string, unknown> = {};\r\n private batchPageId: string;\r\n private clientId: string;\r\n private merchantLang: string;\r\n private clientType: string;\r\n private sampled: boolean;\r\n private initialized = false;\r\n private retrying = 0;\r\n private unloadHandler: (() => void) | null = null;\r\n gtm: GTMManager;\r\n\r\n constructor(config: AnalyticsConfig) {\r\n this.gtm = new GTMManager();\r\n\r\n this.config = {\r\n debug: false,\r\n autoTrack: true,\r\n bufferFlushInterval: DEFAULT_CONFIG.bufferFlushInterval,\r\n bufferMaxSize: DEFAULT_CONFIG.bufferMaxSize,\r\n maxRetryCount: DEFAULT_CONFIG.maxRetryCount,\r\n ...config,\r\n };\r\n\r\n const appKey = this.config.appKey || this.config.appId || 'unknown';\r\n if (this.config.appId) this.config.appKey = appKey;\r\n\r\n this.clientId = this.getOrCreateClientId();\r\n this.merchantLang = DEFAULT_CONFIG.merchantLanguage;\r\n this.clientType = DEFAULT_CONFIG.clientType;\r\n this.batchPageId = this.generateBatchPageId();\r\n this.sessionManager = new SessionManager(this.config.sessionTimeout);\r\n this.sampled = this.resolveSampling();\r\n\r\n if (isBrowser()) {\r\n this.recoverFailedEvents();\r\n }\r\n\r\n this.registerBeforeUnload();\r\n\r\n if (this.config.autoTrack && isBrowser()) {\r\n initAutoTrack(this, this.config.autoTrackSelector);\r\n }\r\n\r\n if (isBrowser()) {\r\n initErrorMonitor(this);\r\n }\r\n\r\n if (isBrowser() && this.config.performance?.enabled !== false) {\r\n initPerformanceMonitor(this, this.config.performance);\r\n }\r\n\r\n if (isBrowser() && this.config.gtm?.enabled) {\r\n initGTM(this.config.gtm);\r\n this.gtm._init(this.config.gtm.containerId, this.config.gtm.dataLayerName);\r\n this.log('GTM initialized with containerId:', this.config.gtm.containerId);\r\n }\r\n\r\n this.initialized = true;\r\n this.log('Analytics SDK initialized', {\r\n appKey: this.config.appKey,\r\n clientId: this.clientId,\r\n sessionId: this.sessionManager.getSessionId(),\r\n });\r\n\r\n if (isBrowser() && this.config.autoTrackPageView !== false) {\r\n this.trackPageView();\r\n }\r\n }\r\n\r\n track(eventName: string, properties?: Record<string, unknown>, options?: TrackOptions): void {\r\n if (!eventName || typeof eventName !== 'string') {\r\n this.log('Invalid event name');\r\n return;\r\n }\r\n\r\n if (!this.sampled) return;\r\n\r\n const normalizedProps = properties && isObject(properties) ? properties : {};\r\n const isKeyEvent = options?.keyEvent === true || this.isKeyEvent(eventName);\r\n\r\n if (this.gtm.ready) {\r\n this.gtm.track(eventName, {\r\n ...normalizedProps,\r\n session_id: this.sessionManager.getSessionId(),\r\n page_url: isBrowser() ? getPageUrl() : '',\r\n referrer: isBrowser() ? document.referrer : '',\r\n });\r\n }\r\n\r\n if (this.config.disableServer) return;\r\n\r\n const event: EventPayload = {\r\n event_id: generateUUID(),\r\n event_name: eventName,\r\n batch_event_index: 0,\r\n batch_ordering_id: this.generateBatchOrderingId(),\r\n batch_page_id: this.batchPageId,\r\n timestamp: getTimestamp(),\r\n key_event: isKeyEvent,\r\n event_properties: this.buildEventProperties(normalizedProps),\r\n };\r\n\r\n if (isKeyEvent) {\r\n this.flushKeyEvent(event);\r\n return;\r\n }\r\n\r\n this.buffer.push(event);\r\n this.scheduleBufferFlush();\r\n\r\n if (this.buffer.length >= this.config.bufferMaxSize) {\r\n this.flushBuffer();\r\n }\r\n }\r\n\r\n identify(userId: string, attributes?: Record<string, unknown>): void {\r\n const wasAnonymous = !this.userId;\r\n this.userId = userId;\r\n if (attributes && isObject(attributes)) {\r\n this.userProps = attributes;\r\n }\r\n if (this.gtm.ready) {\r\n this.gtm.setUserId(userId);\r\n if (attributes && isObject(attributes)) {\r\n this.gtm.setUserProperties(attributes);\r\n }\r\n }\r\n this.log('User identified:', { userId, attributes });\r\n\r\n if (wasAnonymous && this.buffer.length > 0) {\r\n this.flushBuffer();\r\n }\r\n }\r\n\r\n setMerchantLanguage(language: string): void {\r\n this.merchantLang = language;\r\n }\r\n\r\n setClientType(clientType: string): void {\r\n this.clientType = clientType;\r\n }\r\n\r\n reset(): void {\r\n this.userId = null;\r\n this.userProps = {};\r\n this.buffer = [];\r\n if (this.bufferTimer) {\r\n clearTimeout(this.bufferTimer);\r\n this.bufferTimer = null;\r\n }\r\n if (this.gtm.ready) {\r\n this.gtm.setUserId(null);\r\n }\r\n this.log('Analytics reset');\r\n }\r\n\r\n getUserProfile(): UserProfile {\r\n return {\r\n userId: this.userId ?? undefined,\r\n anonymousId: this.clientId,\r\n attributes: this.userProps,\r\n };\r\n }\r\n\r\n getSessionId(): string {\r\n return this.sessionManager.getSessionId();\r\n }\r\n\r\n getClientId(): string {\r\n return this.clientId;\r\n }\r\n\r\n flush(): void {\r\n this.flushBuffer();\r\n }\r\n\r\n private log(...args: unknown[]): void {\r\n if (this.config.debug) {\r\n console.log('[Analytics]', ...args);\r\n }\r\n }\r\n\r\n private resolveSampling(): boolean {\r\n const rate = this.config.sampleRate ?? 1;\r\n if (rate >= 1) return true;\r\n if (rate <= 0) return false;\r\n const decision = Math.random() < rate;\r\n this.log(`Sampling decision: ${decision ? 'included' : 'excluded'} (sampleRate=${rate})`);\r\n return decision;\r\n }\r\n\r\n private getOrCreateClientId(): string {\r\n if (!isBrowser()) return generateUUID();\r\n\r\n let clientId = safeLocalStorageGet(STORAGE_KEYS.CLIENT_ID);\r\n if (!clientId) {\r\n clientId = generateUUID();\r\n safeLocalStorageSet(STORAGE_KEYS.CLIENT_ID, clientId);\r\n }\r\n return clientId;\r\n }\r\n\r\n private resolveApiKey(): string {\r\n if (this.config.apiKey) return this.config.apiKey;\r\n\r\n if (this.config.env) {\r\n const key = API_KEY_MAP[this.config.env];\r\n if (key) return key;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private isKeyEvent(eventName: string): boolean {\r\n if (!this.config.keyEvents || this.config.keyEvents.length === 0) return false;\r\n return this.config.keyEvents.includes(eventName);\r\n }\r\n\r\n private generateBatchPageId(): string {\r\n return `${getTimestamp().toString(36)}-${generateId().split('-')[1] || Math.random().toString(36).slice(2, 9)}`;\r\n }\r\n\r\n private generateBatchOrderingId(): string {\r\n globalBatchCounter += 1;\r\n return `${getTimestamp()}-${globalBatchCounter}`;\r\n }\r\n\r\n private buildEventProperties(properties: Record<string, unknown>): EventProperties {\r\n const defaults: EventProperties = {\r\n system: this.config.system || '',\r\n domain: this.config.domain || '',\r\n scene: '',\r\n action: '',\r\n target_type: '',\r\n target_id: '',\r\n page_url: isBrowser() ? getPageUrl() : '',\r\n };\r\n\r\n const merged: EventProperties = {};\r\n for (const key of Object.keys(defaults)) {\r\n const k = key as keyof EventProperties;\r\n const val = defaults[k];\r\n if (val !== undefined && val !== '') {\r\n (merged as Record<string, unknown>)[k] = val;\r\n }\r\n }\r\n for (const key of Object.keys(properties)) {\r\n (merged as Record<string, unknown>)[key] = properties[key];\r\n }\r\n\r\n return merged;\r\n }\r\n\r\n private scheduleBufferFlush(): void {\r\n if (this.bufferTimer) return;\r\n\r\n this.bufferTimer = setTimeout(() => {\r\n this.flushBuffer();\r\n }, this.config.bufferFlushInterval);\r\n }\r\n\r\n private flushBuffer(): void {\r\n if (this.config.disableServer) return;\r\n\r\n if (this.bufferTimer) {\r\n clearTimeout(this.bufferTimer);\r\n this.bufferTimer = null;\r\n }\r\n\r\n if (this.buffer.length === 0) return;\r\n\r\n // Wait for inflight retries to settle before sending a new batch\r\n if (this.retrying > 0) {\r\n this.scheduleBufferFlush();\r\n return;\r\n }\r\n\r\n const events = this.buffer.splice(0, this.buffer.length);\r\n events.forEach((e, i) => {\r\n e.batch_event_index = i;\r\n });\r\n\r\n this.log(`Flushing ${events.length} events`);\r\n this.sendBatch(events, 0);\r\n }\r\n\r\n private flushKeyEvent(event: EventPayload): void {\r\n if (this.config.disableServer) return;\r\n\r\n this.log('Flushing key event:', event.event_name);\r\n this.sendBatch([event], 0);\r\n }\r\n\r\n private async sendBatch(events: EventPayload[], retryCount: number): Promise<void> {\r\n if (events.length === 0) return;\r\n\r\n const apiKey = this.resolveApiKey();\r\n if (!apiKey) {\r\n this.log('No API key configured, dropping events');\r\n for (const event of events) {\r\n StorageQueue.enqueue(event);\r\n }\r\n return;\r\n }\r\n\r\n const payload = this.buildPayload(events);\r\n\r\n try {\r\n await Sender.send(payload, this.config.serverUrl, apiKey);\r\n this.log(`Batch sent successfully: ${events.length} events`);\r\n } catch (error) {\r\n this.log(`Batch send failed (attempt ${retryCount + 1}/${this.config.maxRetryCount + 1}):`, error);\r\n\r\n if (retryCount < this.config.maxRetryCount) {\r\n const delay = 1000 * Math.pow(2, retryCount);\r\n this.log(`Retrying in ${delay}ms...`);\r\n this.retrying += 1;\r\n setTimeout(() => {\r\n this.retrying -= 1;\r\n this.sendBatch(events, retryCount + 1);\r\n if (this.buffer.length > 0) {\r\n this.scheduleBufferFlush();\r\n }\r\n }, delay);\r\n } else {\r\n this.log('Max retries reached, persisting events to localStorage');\r\n for (const event of events) {\r\n StorageQueue.enqueue(event);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private buildPayload(events: EventPayload[]): AnalyticsPayload {\r\n return {\r\n client_id: this.clientId,\r\n user_id: this.userId || '',\r\n session_id: this.sessionManager.getSessionId(),\r\n user_properties: Object.keys(this.userProps).length > 0 ? this.userProps : undefined,\r\n context: collectContext(this.config.appKey || this.config.appId || 'unknown', this.merchantLang, this.clientType),\r\n marketing: collectMarketing(),\r\n events,\r\n };\r\n }\r\n\r\n private recoverFailedEvents(): void {\r\n if (this.config.disableServer) return;\r\n if (!this.sampled) return;\r\n\r\n const failedEvents = StorageQueue.recover();\r\n if (failedEvents.length > 0) {\r\n this.log(`Recovered ${failedEvents.length} failed events from storage`);\r\n\r\n for (const event of failedEvents) {\r\n event.batch_ordering_id = this.generateBatchOrderingId();\r\n event.batch_page_id = this.batchPageId;\r\n event.batch_event_index = 0;\r\n }\r\n\r\n const batchSize = this.config.bufferMaxSize;\r\n for (let i = 0; i < failedEvents.length; i += batchSize) {\r\n const batch = failedEvents.slice(i, i + batchSize);\r\n batch.forEach((e, idx) => {\r\n e.batch_event_index = idx;\r\n });\r\n this.sendBatch(batch, 0);\r\n }\r\n }\r\n }\r\n\r\n destroy(): void {\r\n if (this.unloadHandler) {\r\n window.removeEventListener('beforeunload', this.unloadHandler);\r\n window.removeEventListener('pagehide', this.unloadHandler);\r\n this.unloadHandler = null;\r\n }\r\n if (this.bufferTimer) {\r\n clearTimeout(this.bufferTimer);\r\n this.bufferTimer = null;\r\n }\r\n }\r\n\r\n private registerBeforeUnload(): void {\r\n if (!isBrowser() || this.config.disableServer) return;\r\n\r\n const handler = (): void => {\r\n if (this.buffer.length === 0) return;\r\n\r\n const events = this.buffer.splice(0, this.buffer.length);\r\n events.forEach((e, i) => {\r\n e.batch_event_index = i;\r\n });\r\n\r\n const apiKey = this.resolveApiKey();\r\n if (!apiKey) return;\r\n\r\n const payload = this.buildPayload(events);\r\n\r\n try {\r\n if (typeof navigator !== 'undefined' && navigator.sendBeacon) {\r\n const url = `${this.config.serverUrl}${this.config.serverUrl.includes('?') ? '&' : '?'}apiKey=${encodeURIComponent(apiKey)}`;\r\n const blob = new Blob([JSON.stringify(payload)], { type: 'application/json' });\r\n const success = navigator.sendBeacon(url, blob);\r\n if (!success) throw new Error('sendBeacon rejected');\r\n } else {\r\n // XHR sync as fallback \u2014 tries to send but doesn't block page unload\r\n try {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open('POST', this.config.serverUrl, false);\r\n xhr.setRequestHeader('Content-Type', 'application/json');\r\n xhr.setRequestHeader('apiKey', apiKey);\r\n xhr.timeout = 2000;\r\n xhr.send(JSON.stringify(payload));\r\n } catch {\r\n // XHR failed during unload\r\n }\r\n }\r\n } catch {\r\n for (const event of events) {\r\n StorageQueue.enqueue(event);\r\n }\r\n }\r\n };\r\n\r\n this.unloadHandler = handler;\r\n window.addEventListener('beforeunload', handler);\r\n window.addEventListener('pagehide', handler);\r\n }\r\n\r\n private trackPageView(): void {\r\n if (!isBrowser()) return;\r\n\r\n this.track('page_view', {\r\n action: 'view',\r\n target_type: 'page',\r\n page_url: getPageUrl(),\r\n referrer: document.referrer || '',\r\n });\r\n }\r\n}\r\n\r\nexport function createAnalytics(config: AnalyticsConfig): Analytics {\r\n return new Analytics(config);\r\n}\r\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["export { Analytics, createAnalytics } from './core/analytics';\r\nexport { Sender } from './core/sender';\r\nexport { StorageQueue } from './core/storage';\r\nexport { SessionManager } from './core/session-manager';\r\nexport { initAutoTrack } from './core/auto-track';\r\nexport type { AutoTrackAPI } from './core/auto-track';\r\nexport { initErrorMonitor } from './core/error-monitor';\r\nexport type { ErrorMonitorAPI } from './core/error-monitor';\r\nexport { GTMManager } from './core/gtm-manager';\r\nexport { initPerformanceMonitor } from './core/performance-monitor';\r\nexport type { PerformanceMonitorAPI } from './core/performance-monitor';\r\nexport { collectContext, collectMarketing } from './core/context-collector';\r\n\r\nexport type {\r\n AnalyticsConfig,\r\n AnalyticsPayload,\r\n EventPayload,\r\n EventProperties,\r\n EventContext,\r\n ContextPayload,\r\n MarketingPayload,\r\n BrowserInfo,\r\n OSInfo,\r\n TrackOptions,\r\n TrackEvent,\r\n QueueItem,\r\n UserProfile,\r\n Environment,\r\n PerformanceConfig,\r\n GTMConfig,\r\n} from './types';\r\n\r\nexport {\r\n API_KEY_MAP,\r\n SDK_VERSION,\r\n DEFAULT_CONFIG,\r\n STORAGE_KEYS,\r\n} from './types';\r\n\r\nexport {\r\n generateUUID,\r\n generateId,\r\n getTimestamp,\r\n isObject,\r\n merge,\r\n detectBrowser,\r\n detectOS,\r\n getDeviceType,\r\n getScreenSize,\r\n getPageUrl,\r\n getReferrer,\r\n getHostname,\r\n getTimezone,\r\n getLanguage,\r\n getCountryFromLanguage,\r\n parseUTMParams,\r\n isBrowser,\r\n truncateText,\r\n} from './utils';\r\n", "export type Environment = 'beta' | 'development' | 'test' | 'testing' | 'sit' | 'uat' | 'prod' | 'production';\r\n\r\nexport interface BrowserInfo {\r\n name: string;\r\n version: string;\r\n}\r\n\r\nexport interface OSInfo {\r\n name: string;\r\n version: string;\r\n}\r\n\r\nexport interface ContextPayload {\r\n sdk_version: string;\r\n app_key: string;\r\n screen_width: number;\r\n screen_height: number;\r\n user_agent: string;\r\n referrer: string;\r\n hostname: string;\r\n browser: BrowserInfo;\r\n operating_system: OSInfo;\r\n device_type: 'mobile' | 'tablet' | 'desktop';\r\n country: string;\r\n language: string;\r\n merchant_language: string;\r\n timezone: string;\r\n client_type: string;\r\n}\r\n\r\nexport interface MarketingPayload {\r\n utm_source?: string;\r\n utm_medium?: string;\r\n utm_campaign?: string;\r\n utm_term?: string;\r\n utm_content?: string;\r\n landing_page?: string;\r\n referrer_url?: string;\r\n}\r\n\r\nexport interface EventProperties {\r\n system?: string;\r\n domain?: string;\r\n scene?: string;\r\n action?: string;\r\n target_type?: string;\r\n target_id?: string;\r\n page_url?: string;\r\n flow_id?: string;\r\n entity_type?: string;\r\n entity_id?: string;\r\n status?: string;\r\n response_code?: string;\r\n response_msg?: string;\r\n duration_ms?: number;\r\n request_id?: string;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface EventContext {\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface EventPayload {\r\n event_id: string;\r\n event_name: string;\r\n batch_event_index: number;\r\n batch_ordering_id: string;\r\n batch_page_id: string;\r\n timestamp: number;\r\n key_event: boolean;\r\n event_properties: EventProperties;\r\n context?: EventContext;\r\n}\r\n\r\nexport interface AnalyticsPayload {\r\n client_id: string;\r\n user_id?: string;\r\n session_id: string;\r\n user_properties?: Record<string, unknown>;\r\n context: ContextPayload;\r\n marketing: MarketingPayload;\r\n events: EventPayload[];\r\n}\r\n\r\nexport interface PerformanceConfig {\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface GTMConfig {\r\n containerId: string;\r\n enabled: boolean;\r\n dataLayerName?: string;\r\n}\r\n\r\nexport interface AnalyticsConfig {\r\n appKey?: string;\r\n serverUrl: string;\r\n apiKey?: string;\r\n env?: Environment;\r\n debug?: boolean;\r\n autoTrack?: boolean;\r\n autoTrackPageView?: boolean;\r\n system?: string;\r\n domain?: string;\r\n keyEvents?: string[];\r\n bufferFlushInterval?: number;\r\n bufferMaxSize?: number;\r\n maxRetryCount?: number;\r\n sessionTimeout?: number;\r\n autoTrackSelector?: string;\r\n performance?: PerformanceConfig;\r\n gtm?: GTMConfig;\r\n disableServer?: boolean;\r\n sampleRate?: number;\r\n\r\n /** @deprecated use appKey instead */\r\n appId?: string;\r\n}\r\n\r\nexport interface TrackOptions {\r\n keyEvent?: boolean;\r\n}\r\n\r\nexport interface UserProfile {\r\n userId?: string;\r\n anonymousId?: string;\r\n attributes?: Record<string, unknown>;\r\n}\r\n\r\n/** @deprecated use EventPayload instead */\r\nexport interface TrackEvent {\r\n event: string;\r\n properties?: Record<string, unknown>;\r\n timestamp?: number;\r\n}\r\n\r\n/** @deprecated use AnalyticsPayload instead */\r\nexport interface QueueItem {\r\n id: string;\r\n event: TrackEvent;\r\n retryCount: number;\r\n}\r\n\r\nexport interface StorageQueueItem {\r\n event: EventPayload;\r\n storedAt: number;\r\n}\r\n\r\nexport interface RetryEntry {\r\n events: EventPayload[];\r\n retryCount: number;\r\n timer: ReturnType<typeof setTimeout> | null;\r\n}\r\n\r\nexport const API_KEY_MAP: Record<string, string> = {\r\n beta: '5skbadERCne5HKSS9a1EXz5RetUiEfpP',\r\n development: '5skbadERCne5HKSS9a1EXz5RetUiEfpP',\r\n test: 'Dguh5yxNDEwyQlqDmikmd7ImruaOp8c8',\r\n testing: 'Dguh5yxNDEwyQlqDmikmd7ImruaOp8c8',\r\n sit: 'Dguh5yxNDEwyQlqDmikmd7ImruaOp8c8',\r\n uat: 'W565QolX6clTuL1Kqgpp0JmUqBkWKY6i',\r\n prod: 'HUk5Kogyuv9zH5qDA2qSCjVEnhanSkf8',\r\n production: 'HUk5Kogyuv9zH5qDA2qSCjVEnhanSkf8',\r\n};\r\n\r\nexport const SDK_VERSION = '1.0.0';\r\n\r\nexport const DEFAULT_CONFIG = {\r\n debug: false,\r\n autoTrack: true,\r\n bufferFlushInterval: 5000,\r\n bufferMaxSize: 25,\r\n maxRetryCount: 3,\r\n sessionTimeout: 30 * 60 * 1000,\r\n clientType: 'WEB',\r\n merchantLanguage: 'en',\r\n} as const;\r\n\r\nexport const STORAGE_KEYS = {\r\n FAILED_QUEUE: '__analytics_failed_queue__',\r\n CLIENT_ID: '__analytics_client_id__',\r\n LANDING_PAGE: '__analytics_landing_page__',\r\n REFERRER_URL: '__analytics_referrer_url__',\r\n UTM_PARAMS: '__analytics_utm_params__',\r\n} as const;\r\n\r\n// WARNING: These keys are embedded in the built bundle and visible to end users.\r\n// For production deployments, pass apiKey directly in AnalyticsConfig to avoid\r\n// exposing environment keys in source code.\r\n\r\nexport const MAX_STORAGE_ITEMS = 500;\r\n", "import { BrowserInfo, OSInfo } from '../types';\r\n\r\nexport function generateId(): string {\r\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\r\n}\r\n\r\nexport function getTimestamp(): number {\r\n return Date.now();\r\n}\r\n\r\nexport function isObject(value: unknown): value is Record<string, unknown> {\r\n return Object.prototype.toString.call(value) === '[object Object]';\r\n}\r\n\r\nexport function merge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {\r\n const result = { ...target };\r\n for (const key in source) {\r\n if (Object.prototype.hasOwnProperty.call(source, key)) {\r\n result[key] = source[key] as T[Extract<keyof T, string>];\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nexport function generateUUID(): string {\r\n const hex = '0123456789abcdef';\r\n const template = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';\r\n return template.replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return hex[v];\r\n });\r\n}\r\n\r\nexport function generateShortId(): string {\r\n return Math.random().toString(36).substring(2, 10);\r\n}\r\n\r\nexport function detectBrowser(): BrowserInfo {\r\n if (typeof navigator === 'undefined') return { name: 'Unknown', version: '0' };\r\n\r\n const ua = navigator.userAgent;\r\n const edgeMatch = ua.match(/Edg\\/(\\d+)/);\r\n if (edgeMatch) return { name: 'Edge', version: edgeMatch[1] };\r\n\r\n const chromeMatch = ua.match(/Chrome\\/(\\d+)/);\r\n const safariMatch = ua.match(/Safari\\/(\\d+)/);\r\n\r\n if (chromeMatch && !ua.includes('Edg') && !ua.includes('OPR')) {\r\n return { name: 'Chrome', version: chromeMatch[1] };\r\n }\r\n\r\n const firefoxMatch = ua.match(/Firefox\\/(\\d+)/);\r\n if (firefoxMatch) return { name: 'Firefox', version: firefoxMatch[1] };\r\n\r\n const opMatch = ua.match(/OPR\\/(\\d+)/);\r\n if (opMatch) return { name: 'Opera', version: opMatch[1] };\r\n\r\n if (safariMatch && !ua.includes('Chrome')) {\r\n const versionMatch = ua.match(/Version\\/(\\d+)/);\r\n return { name: 'Safari', version: versionMatch ? versionMatch[1] : safariMatch[1] };\r\n }\r\n\r\n const ieMatch = ua.match(/(?:MSIE |Trident\\/.*; rv:)(\\d+)/);\r\n if (ieMatch) return { name: 'IE', version: ieMatch[1] };\r\n\r\n return { name: 'Unknown', version: '0' };\r\n}\r\n\r\nexport function detectOS(): OSInfo {\r\n if (typeof navigator === 'undefined') return { name: 'Unknown', version: '0' };\r\n\r\n const ua = navigator.userAgent;\r\n const platform = navigator.platform || '';\r\n\r\n if (ua.includes('Windows NT 10')) return { name: 'Windows', version: '10' };\r\n if (ua.includes('Windows NT 6.3')) return { name: 'Windows', version: '8.1' };\r\n if (ua.includes('Windows NT 6.2')) return { name: 'Windows', version: '8' };\r\n if (ua.includes('Windows NT 6.1')) return { name: 'Windows', version: '7' };\r\n if (/Windows NT \\d/.test(ua)) return { name: 'Windows', version: ua.match(/Windows NT (\\d+\\.?\\d*)/)?.[1] || '0' };\r\n\r\n const macMatch = ua.match(/Mac OS X (\\d+[._]\\d+)/);\r\n if (macMatch) return { name: 'macOS', version: macMatch[1].replace('_', '.') };\r\n\r\n if (platform.startsWith('Mac')) return { name: 'macOS', version: '0' };\r\n\r\n if (/Android (\\d+\\.?\\d*)/.test(ua)) return { name: 'Android', version: ua.match(/Android (\\d+\\.?\\d*)/)?.[1] || '0' };\r\n\r\n if (/iPhone|iPad|iPod/.test(ua)) {\r\n const iosMatch = ua.match(/OS (\\d+[._]\\d+)/);\r\n return { name: 'iOS', version: iosMatch ? iosMatch[1].replace('_', '.') : '0' };\r\n }\r\n\r\n if (/Linux/.test(ua) || platform.includes('Linux')) return { name: 'Linux', version: '0' };\r\n\r\n return { name: 'Unknown', version: '0' };\r\n}\r\n\r\nexport function getDeviceType(): 'mobile' | 'tablet' | 'desktop' {\r\n if (typeof window === 'undefined' || typeof navigator === 'undefined') return 'desktop';\r\n\r\n const width = window.screen.width;\r\n const hasTouch = navigator.maxTouchPoints > 0;\r\n\r\n if (width < 768 && hasTouch) return 'mobile';\r\n if (width >= 768 && width <= 1024 && hasTouch) return 'tablet';\r\n return 'desktop';\r\n}\r\n\r\nexport function getScreenSize(): { width: number; height: number } {\r\n if (typeof window === 'undefined') return { width: 0, height: 0 };\r\n return {\r\n width: window.screen.width,\r\n height: window.screen.height,\r\n };\r\n}\r\n\r\nexport function getPageUrl(): string {\r\n if (typeof window === 'undefined') return '';\r\n return window.location.href;\r\n}\r\n\r\nexport function getReferrer(): string {\r\n if (typeof document === 'undefined') return '';\r\n return document.referrer || '';\r\n}\r\n\r\nexport function getHostname(): string {\r\n if (typeof window === 'undefined') return '';\r\n return window.location.host.split(':')[0];\r\n}\r\n\r\nexport function getTimezone(): string {\r\n try {\r\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n } catch {\r\n return 'UTC';\r\n }\r\n}\r\n\r\nexport function getLanguage(): string {\r\n if (typeof navigator === 'undefined') return 'en-US';\r\n return navigator.language || 'en-US';\r\n}\r\n\r\nexport function getCountryFromLanguage(language: string): string {\r\n const parts = language.split('-');\r\n if (parts.length > 1) return parts[1].toUpperCase();\r\n const langMap: Record<string, string> = {\r\n zh: 'CN', en: 'US', ja: 'JP', ko: 'KR', fr: 'FR',\r\n de: 'DE', es: 'ES', pt: 'BR', ru: 'RU', ar: 'SA',\r\n };\r\n return langMap[parts[0]] || parts[0].toUpperCase();\r\n}\r\n\r\nexport function parseUTMParams(): Record<string, string> {\r\n if (typeof window === 'undefined') return {};\r\n\r\n const params: Record<string, string> = {};\r\n const searchParams = new URLSearchParams(window.location.search);\r\n const utmKeys = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];\r\n\r\n for (const key of utmKeys) {\r\n const value = searchParams.get(key);\r\n if (value) params[key] = value;\r\n }\r\n\r\n return params;\r\n}\r\n\r\nexport function isBrowser(): boolean {\r\n return typeof window !== 'undefined' && typeof document !== 'undefined';\r\n}\r\n\r\nexport function safeLocalStorageGet(key: string): string | null {\r\n try {\r\n return localStorage.getItem(key);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function safeLocalStorageSet(key: string, value: string): boolean {\r\n try {\r\n localStorage.setItem(key, value);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function safeLocalStorageRemove(key: string): void {\r\n try {\r\n localStorage.removeItem(key);\r\n } catch {\r\n // ignore\r\n }\r\n}\r\n\r\nexport function safeSessionStorageGet(key: string): string | null {\r\n try {\r\n return sessionStorage.getItem(key);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function safeSessionStorageSet(key: string, value: string): boolean {\r\n try {\r\n sessionStorage.setItem(key, value);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function safeSessionStorageRemove(key: string): void {\r\n try {\r\n sessionStorage.removeItem(key);\r\n } catch {\r\n // ignore\r\n }\r\n}\r\n\r\nexport function truncateText(text: string, maxLength: number): string {\r\n if (!text) return '';\r\n const trimmed = text.trim().replace(/\\s+/g, ' ');\r\n return trimmed.length > maxLength ? trimmed.substring(0, maxLength) + '...' : trimmed;\r\n}\r\n", "import { generateUUID, safeSessionStorageGet, safeSessionStorageSet, safeSessionStorageRemove } from '../utils';\r\n\r\nconst SESSION_KEY = '__analytics_session__';\r\nconst SESSION_DEFAULT_TIMEOUT = 30 * 60 * 1000;\r\n\r\ninterface SessionData {\r\n sessionId: string;\r\n createdAt: number;\r\n}\r\n\r\nexport class SessionManager {\r\n private sessionId: string;\r\n private createdAt: number = 0;\r\n private timeout: number;\r\n\r\n constructor(timeout: number = SESSION_DEFAULT_TIMEOUT) {\r\n this.timeout = timeout;\r\n const existing = this.loadSession();\r\n if (existing && !this.isExpired(existing)) {\r\n this.sessionId = existing.sessionId;\r\n this.createdAt = existing.createdAt;\r\n } else {\r\n this.sessionId = this.createNewSession();\r\n this.createdAt = Date.now();\r\n }\r\n }\r\n\r\n getSessionId(): string {\r\n if (this.isExpired({ sessionId: this.sessionId, createdAt: this.createdAt })) {\r\n this.sessionId = this.createNewSession();\r\n }\r\n return this.sessionId;\r\n }\r\n\r\n refresh(): void {\r\n this.sessionId = this.createNewSession();\r\n }\r\n\r\n private loadSession(): SessionData | null {\r\n try {\r\n const raw = safeSessionStorageGet(SESSION_KEY);\r\n if (!raw) return null;\r\n return JSON.parse(raw) as SessionData;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private saveSession(): void {\r\n const data: SessionData = {\r\n sessionId: this.sessionId,\r\n createdAt: this.createdAt,\r\n };\r\n safeSessionStorageSet(SESSION_KEY, JSON.stringify(data));\r\n }\r\n\r\n private isExpired(data: SessionData): boolean {\r\n return Date.now() - data.createdAt > this.timeout;\r\n }\r\n\r\n private createNewSession(): string {\r\n const id = generateUUID();\r\n this.sessionId = id;\r\n this.createdAt = Date.now();\r\n this.saveSession();\r\n return id;\r\n }\r\n}\r\n", "import { AnalyticsPayload } from '../types';\r\n\r\nexport class Sender {\r\n static async send(payload: AnalyticsPayload, serverUrl: string, apiKey: string): Promise<void> {\r\n if (Sender.supportsKeepalive()) {\r\n return Sender.fetchSend(payload, serverUrl, apiKey);\r\n }\r\n return Sender.xhrSend(payload, serverUrl, apiKey);\r\n }\r\n\r\n static async sendBeacon(payload: AnalyticsPayload, serverUrl: string, apiKey: string): Promise<void> {\r\n if (typeof navigator === 'undefined' || !navigator.sendBeacon) {\r\n throw new Error('sendBeacon not available');\r\n }\r\n\r\n const url = Sender.buildBeaconUrl(serverUrl, apiKey);\r\n const blob = new Blob([JSON.stringify(payload)], { type: 'application/json' });\r\n const success = navigator.sendBeacon(url, blob);\r\n\r\n if (!success) {\r\n throw new Error('sendBeacon rejected payload');\r\n }\r\n }\r\n\r\n static async fetchSend(payload: AnalyticsPayload, serverUrl: string, apiKey: string): Promise<void> {\r\n const response = await fetch(serverUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n apiKey,\r\n },\r\n body: JSON.stringify(payload),\r\n keepalive: true,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n }\r\n\r\n static async xhrSend(payload: AnalyticsPayload, serverUrl: string, apiKey: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open('POST', serverUrl);\r\n xhr.setRequestHeader('Content-Type', 'application/json');\r\n xhr.setRequestHeader('apiKey', apiKey);\r\n xhr.timeout = 10000;\r\n\r\n xhr.onload = () => {\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n resolve();\r\n } else {\r\n reject(new Error(`HTTP ${xhr.status}: ${xhr.statusText}`));\r\n }\r\n };\r\n\r\n xhr.onerror = () => reject(new Error('XHR network error'));\r\n xhr.ontimeout = () => reject(new Error('XHR timeout'));\r\n\r\n xhr.send(JSON.stringify(payload));\r\n });\r\n }\r\n\r\n private static supportsKeepalive(): boolean {\r\n try {\r\n return typeof Request !== 'undefined' && 'keepalive' in Request.prototype;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private static buildBeaconUrl(serverUrl: string, apiKey: string): string {\r\n const separator = serverUrl.includes('?') ? '&' : '?';\r\n return `${serverUrl}${separator}apiKey=${encodeURIComponent(apiKey)}`;\r\n }\r\n}\r\n", "import { EventPayload, StorageQueueItem, STORAGE_KEYS, MAX_STORAGE_ITEMS } from '../types';\r\nimport { safeLocalStorageGet, safeLocalStorageSet, safeLocalStorageRemove } from '../utils';\r\n\r\nconst MAX_EVENT_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours\r\n\r\nexport class StorageQueue {\r\n static enqueue(event: EventPayload): void {\r\n try {\r\n const queue = StorageQueue.readQueue();\r\n queue.push({ event, storedAt: Date.now() });\r\n\r\n while (queue.length > MAX_STORAGE_ITEMS) {\r\n queue.shift();\r\n }\r\n\r\n safeLocalStorageSet(STORAGE_KEYS.FAILED_QUEUE, JSON.stringify(queue));\r\n } catch {\r\n // Silently fail if storage is unavailable\r\n }\r\n }\r\n\r\n static recover(): EventPayload[] {\r\n try {\r\n const queue = StorageQueue.readQueue();\r\n StorageQueue.clear();\r\n\r\n const now = Date.now();\r\n const events = queue\r\n .filter((item) => now - item.storedAt < MAX_EVENT_AGE_MS)\r\n .map((item) => item.event);\r\n return events;\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n static clear(): void {\r\n safeLocalStorageRemove(STORAGE_KEYS.FAILED_QUEUE);\r\n }\r\n\r\n static getQueueSize(): number {\r\n return StorageQueue.readQueue().length;\r\n }\r\n\r\n private static readQueue(): StorageQueueItem[] {\r\n try {\r\n const raw = safeLocalStorageGet(STORAGE_KEYS.FAILED_QUEUE);\r\n if (!raw) return [];\r\n const parsed = JSON.parse(raw);\r\n if (!Array.isArray(parsed)) return [];\r\n return parsed;\r\n } catch {\r\n return [];\r\n }\r\n }\r\n}\r\n", "import {\r\n ContextPayload,\r\n MarketingPayload,\r\n SDK_VERSION,\r\n STORAGE_KEYS,\r\n} from '../types';\r\nimport {\r\n detectBrowser,\r\n detectOS,\r\n getDeviceType,\r\n getScreenSize,\r\n getHostname,\r\n getReferrer,\r\n getTimezone,\r\n getLanguage,\r\n getCountryFromLanguage,\r\n parseUTMParams,\r\n safeLocalStorageGet,\r\n safeLocalStorageSet,\r\n isBrowser,\r\n} from '../utils';\r\n\r\nexport function collectContext(appKey: string, merchantLanguage: string, clientType: string): ContextPayload {\r\n const screen = getScreenSize();\r\n\r\n return {\r\n sdk_version: SDK_VERSION,\r\n app_key: appKey,\r\n screen_width: screen.width,\r\n screen_height: screen.height,\r\n user_agent: isBrowser() ? navigator.userAgent : '',\r\n referrer: getReferrer(),\r\n hostname: getHostname(),\r\n browser: detectBrowser(),\r\n operating_system: detectOS(),\r\n device_type: getDeviceType(),\r\n country: getCountryFromLanguage(getLanguage()),\r\n language: getLanguage(),\r\n merchant_language: merchantLanguage,\r\n timezone: getTimezone(),\r\n client_type: clientType,\r\n };\r\n}\r\n\r\nexport function collectMarketing(): MarketingPayload {\r\n if (!isBrowser()) return {};\r\n\r\n // If current URL has UTM params (new campaign visit), update the cache and use them.\r\n // If not (SPA internal navigation), fall back to cached value so attribution is preserved.\r\n let utm: Record<string, string> = {};\r\n const freshUtm = parseUTMParams();\r\n if (Object.keys(freshUtm).length > 0) {\r\n utm = freshUtm;\r\n safeLocalStorageSet(STORAGE_KEYS.UTM_PARAMS, JSON.stringify(utm));\r\n } else {\r\n const storedUtm = safeLocalStorageGet(STORAGE_KEYS.UTM_PARAMS);\r\n if (storedUtm) {\r\n try { utm = JSON.parse(storedUtm); } catch { /* ignore corrupt value */ }\r\n }\r\n }\r\n\r\n let landingPage = safeLocalStorageGet(STORAGE_KEYS.LANDING_PAGE);\r\n if (!landingPage) {\r\n landingPage = window.location.href;\r\n safeLocalStorageSet(STORAGE_KEYS.LANDING_PAGE, landingPage);\r\n }\r\n\r\n let referrerUrl = safeLocalStorageGet(STORAGE_KEYS.REFERRER_URL);\r\n if (referrerUrl === null && document.referrer) {\r\n referrerUrl = document.referrer;\r\n safeLocalStorageSet(STORAGE_KEYS.REFERRER_URL, referrerUrl);\r\n }\r\n\r\n return {\r\n ...utm,\r\n landing_page: landingPage || window.location.href,\r\n referrer_url: referrerUrl || '',\r\n };\r\n}\r\n", "import { truncateText } from '../utils';\r\n\r\nconst TRACK_ATTR_PREFIX = 'data-track-';\r\nconst IGNORE_ATTR = 'data-track-ignore';\r\nconst NAME_ATTR = 'data-track-name';\r\nconst PROPS_ATTR = 'data-track-properties';\r\n\r\nexport interface AutoTrackAPI {\r\n track(eventName: string, properties?: Record<string, unknown>): void;\r\n debug?: boolean;\r\n}\r\n\r\nexport function initAutoTrack(api: AutoTrackAPI, selector?: string): void {\r\n if (typeof document === 'undefined') return;\r\n\r\n const handler = (e: Event): void => {\r\n try {\r\n const target = e.target as HTMLElement;\r\n if (!target) return;\r\n\r\n if (shouldIgnoreElement(target)) return;\r\n\r\n if (selector) {\r\n const scope = document.querySelector(selector);\r\n if (scope && !scope.contains(target)) return;\r\n }\r\n\r\n const eventName = getTrackName(target);\r\n const properties = collectElementProperties(target);\r\n\r\n api.track(eventName, properties);\r\n } catch {\r\n // Fail silently to avoid breaking user's page\r\n }\r\n };\r\n\r\n document.addEventListener('click', handler, true);\r\n}\r\n\r\nfunction shouldIgnoreElement(element: HTMLElement): boolean {\r\n let current: HTMLElement | null = element;\r\n while (current) {\r\n if (current.hasAttribute(IGNORE_ATTR)) return true;\r\n current = current.parentElement;\r\n }\r\n return false;\r\n}\r\n\r\nfunction getTrackName(element: HTMLElement): string {\r\n const name = element.getAttribute(NAME_ATTR);\r\n if (name) return name;\r\n\r\n const id = element.id ? `_${element.id.replace(/[^\\w-]/g, '_')}` : '';\r\n const tag = element.tagName.toLowerCase();\r\n return `click_${tag}${id}`;\r\n}\r\n\r\nfunction collectElementProperties(element: HTMLElement): Record<string, unknown> {\r\n const props: Record<string, unknown> = {\r\n action: 'click',\r\n target_type: inferTargetType(element),\r\n target_id: getTargetId(element),\r\n target_tag: element.tagName.toLowerCase(),\r\n target_class: getTruncatedClassName(element),\r\n target_text: truncateText(element.innerText || '', 50),\r\n };\r\n\r\n if (element.hasAttribute('href') || element.closest('a')) {\r\n const anchor = element.closest('a');\r\n if (anchor) {\r\n props.target_href = anchor.getAttribute('href') || '';\r\n }\r\n }\r\n\r\n const customProps = collectDataTrackProps(element);\r\n Object.assign(props, customProps);\r\n\r\n return props;\r\n}\r\n\r\nfunction inferTargetType(element: HTMLElement): string {\r\n const tag = element.tagName.toLowerCase();\r\n if (tag === 'a' || tag === 'button') return 'button';\r\n if (tag === 'input') {\r\n const type = (element as HTMLInputElement).type;\r\n if (type === 'submit' || type === 'button' || type === 'reset') return 'button';\r\n if (type === 'checkbox' || type === 'radio') return 'checkbox';\r\n return 'input';\r\n }\r\n if (tag === 'select') return 'select';\r\n if (tag === 'img') return 'image';\r\n if (tag === 'form') return 'form';\r\n if (tag === 'textarea') return 'input';\r\n return 'element';\r\n}\r\n\r\nfunction getTargetId(element: HTMLElement): string {\r\n if (element.id) return element.id;\r\n\r\n const name = element.getAttribute('name');\r\n if (name) return name;\r\n\r\n const dataTestId = element.getAttribute('data-testid') || element.getAttribute('data-test-id');\r\n if (dataTestId) return dataTestId;\r\n\r\n return '';\r\n}\r\n\r\nfunction getTruncatedClassName(element: HTMLElement): string {\r\n const cls = typeof element.className === 'string' ? element.className : '';\r\n return truncateText(cls, 100);\r\n}\r\n\r\nfunction collectDataTrackProps(element: HTMLElement): Record<string, unknown> {\r\n const props: Record<string, unknown> = {};\r\n const trackName = element.getAttribute(NAME_ATTR);\r\n if (trackName) props.name = trackName;\r\n\r\n const rawProps = element.getAttribute(PROPS_ATTR);\r\n if (rawProps) {\r\n try {\r\n const parsed = JSON.parse(rawProps);\r\n Object.assign(props, parsed);\r\n } catch {\r\n // Invalid JSON, ignore\r\n }\r\n }\r\n\r\n for (const attr of Array.from(element.attributes)) {\r\n if (attr.name.startsWith(TRACK_ATTR_PREFIX) && attr.name !== NAME_ATTR && attr.name !== PROPS_ATTR && attr.name !== IGNORE_ATTR) {\r\n const key = attr.name.replace(TRACK_ATTR_PREFIX, '');\r\n props[key] = attr.value;\r\n }\r\n }\r\n\r\n return props;\r\n}\r\n", "export interface ErrorMonitorAPI {\r\n track(eventName: string, properties?: Record<string, unknown>): void;\r\n}\r\n\r\nexport function initErrorMonitor(api: ErrorMonitorAPI): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n window.addEventListener('error', (event: ErrorEvent) => {\r\n try {\r\n const { message, filename, lineno, colno, error } = event;\r\n\r\n const isResourceError = !message && event.target !== window;\r\n if (isResourceError) return;\r\n\r\n api.track('error_event', {\r\n action: 'error',\r\n target_type: 'system',\r\n error_type: 'window_error',\r\n error_message: message || 'Unknown error',\r\n error_filename: filename || '',\r\n error_lineno: lineno || 0,\r\n error_colno: colno || 0,\r\n error_stack: error instanceof Error ? error.stack : '',\r\n error_name: error instanceof Error ? error.name : '',\r\n });\r\n } catch {\r\n // Fail silently to avoid recursive error reporting\r\n }\r\n });\r\n\r\n window.addEventListener('unhandledrejection', (event: PromiseRejectionEvent) => {\r\n try {\r\n const { reason } = event;\r\n\r\n let errorMessage = 'Unhandled Promise Rejection';\r\n let errorStack = '';\r\n let errorName = 'PromiseRejection';\r\n\r\n if (reason instanceof Error) {\r\n errorMessage = reason.message;\r\n errorStack = reason.stack || '';\r\n errorName = reason.name;\r\n } else if (typeof reason === 'string') {\r\n errorMessage = reason;\r\n } else {\r\n try {\r\n errorMessage = JSON.stringify(reason);\r\n } catch {\r\n errorMessage = String(reason);\r\n }\r\n }\r\n\r\n api.track('error_event', {\r\n action: 'error',\r\n target_type: 'system',\r\n error_type: 'unhandled_rejection',\r\n error_message: errorMessage,\r\n error_stack: errorStack,\r\n error_name: errorName,\r\n });\r\n } catch {\r\n // Fail silently\r\n }\r\n });\r\n}\r\n", "import { GTMConfig } from '../types';\r\n\r\nexport function initGTM(config: GTMConfig): void {\r\n if (!config.enabled || !config.containerId) return;\r\n if (typeof window === 'undefined') return;\r\n\r\n const dataLayerName = config.dataLayerName || 'dataLayer';\r\n const w = window as unknown as Record<string, unknown>;\r\n\r\n // Initialize dataLayer before the script loads so queued pushes are preserved\r\n if (!Array.isArray(w[dataLayerName])) {\r\n w[dataLayerName] = [];\r\n }\r\n (w[dataLayerName] as unknown[]).push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' });\r\n\r\n // Inject <head> script if not already present\r\n const existingScript = document.querySelector(\r\n `script[src*=\"googletagmanager.com/gtm.js?id=${config.containerId}\"]`\r\n );\r\n if (!existingScript) {\r\n const dl = dataLayerName !== 'dataLayer' ? `&l=${encodeURIComponent(dataLayerName)}` : '';\r\n const script = document.createElement('script');\r\n script.async = true;\r\n script.src = `https://www.googletagmanager.com/gtm.js?id=${config.containerId}${dl}`;\r\n const firstScript = document.getElementsByTagName('script')[0];\r\n firstScript.parentNode?.insertBefore(script, firstScript);\r\n }\r\n\r\n // Inject <body> noscript fallback if not already present\r\n if (!document.querySelector(`noscript[data-gtm-id=\"${config.containerId}\"]`)) {\r\n const noscript = document.createElement('noscript');\r\n noscript.setAttribute('data-gtm-id', config.containerId);\r\n const iframe = document.createElement('iframe');\r\n iframe.src = `https://www.googletagmanager.com/ns.html?id=${config.containerId}`;\r\n iframe.height = '0';\r\n iframe.width = '0';\r\n iframe.style.display = 'none';\r\n iframe.style.visibility = 'hidden';\r\n noscript.appendChild(iframe);\r\n if (document.body) {\r\n document.body.insertBefore(noscript, document.body.firstChild);\r\n }\r\n }\r\n}\r\n", "let e=-1;const t=t=>{addEventListener(\"pageshow\",n=>{n.persisted&&(e=n.timeStamp,t(n))},!0)},n=(e,t,n,i)=>{let s,o;return r=>{t.value>=0&&(r||i)&&(o=t.value-(s??0),(o||void 0===s)&&(s=t.value,t.delta=o,t.rating=((e,t)=>e>t[1]?\"poor\":e>t[0]?\"needs-improvement\":\"good\")(t.value,n),e(t)))}},i=e=>{requestAnimationFrame(()=>requestAnimationFrame(e))},s=()=>{const e=performance.getEntriesByType(\"navigation\")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},o=()=>s()?.activationStart??0,r=(t,n=-1)=>{const i=s();let r=\"navigate\";e>=0?r=\"back-forward-cache\":i&&(document.prerendering||o()>0?r=\"prerender\":document.wasDiscarded?r=\"restore\":i.type&&(r=i.type.replace(/_/g,\"-\")));return{name:t,value:n,rating:\"good\",delta:0,entries:[],id:`v5-${Date.now()}-${Math.floor(8999999999999*Math.random())+1e12}`,navigationType:r}},c=new WeakMap;function a(e,t){return c.get(e)||c.set(e,new t),c.get(e)}class d{t;i=0;o=[];h(e){if(e.hadRecentInput)return;const t=this.o[0],n=this.o.at(-1);this.i&&t&&n&&e.startTime-n.startTime<1e3&&e.startTime-t.startTime<5e3?(this.i+=e.value,this.o.push(e)):(this.i=e.value,this.o=[e]),this.t?.(e)}}const h=(e,t,n={})=>{try{if(PerformanceObserver.supportedEntryTypes.includes(e)){const i=new PerformanceObserver(e=>{queueMicrotask(()=>{t(e.getEntries())})});return i.observe({type:e,buffered:!0,...n}),i}}catch{}},f=e=>{let t=!1;return()=>{t||(e(),t=!0)}};let l=-1;const u=new Set,m=()=>\"hidden\"!==document.visibilityState||document.prerendering?1/0:0,g=e=>{if(\"hidden\"===document.visibilityState){if(\"visibilitychange\"===e.type)for(const e of u)e();isFinite(l)||(l=\"visibilitychange\"===e.type?e.timeStamp:0,removeEventListener(\"prerenderingchange\",g,!0))}},p=()=>{if(l<0){const e=o(),n=document.prerendering?void 0:globalThis.performance.getEntriesByType(\"visibility-state\").find(t=>\"hidden\"===t.name&&t.startTime>=e)?.startTime;l=n??m(),addEventListener(\"visibilitychange\",g,!0),addEventListener(\"prerenderingchange\",g,!0),t(()=>{setTimeout(()=>{l=m()})})}return{get firstHiddenTime(){return l},onHidden(e){u.add(e)}}},v=e=>{document.prerendering?addEventListener(\"prerenderingchange\",e,!0):e()},y=[1800,3e3],T=(e,s={})=>{v(()=>{const c=p();let a,d=r(\"FCP\");const f=h(\"paint\",e=>{for(const t of e)\"first-contentful-paint\"===t.name&&(f.disconnect(),t.startTime<c.firstHiddenTime&&(d.value=Math.max(t.startTime-o(),0),d.entries.push(t),a(!0)))});f&&(a=n(e,d,y,s.reportAllChanges),t(t=>{d=r(\"FCP\"),a=n(e,d,y,s.reportAllChanges),i(()=>{d.value=performance.now()-t.timeStamp,a(!0)})}))})},E=[.1,.25],b=(e,s={})=>{const o=p();T(f(()=>{let c,f=r(\"CLS\",0);const l=a(s,d),u=e=>{for(const t of e)l.h(t);l.i>f.value&&(f.value=l.i,f.entries=l.o,c())},m=h(\"layout-shift\",u);m&&(c=n(e,f,E,s.reportAllChanges),o.onHidden(()=>{u(m.takeRecords()),c(!0)}),t(()=>{l.i=0,f=r(\"CLS\",0),c=n(e,f,E,s.reportAllChanges),i(c)}),setTimeout(c))}))};let L=0,P=1/0,_=0;const M=e=>{for(const t of e)t.interactionId&&(P=Math.min(P,t.interactionId),_=Math.max(_,t.interactionId),L=_?(_-P)/7+1:0)};let w;const C=()=>w?L:performance.interactionCount??0,I=()=>{\"interactionCount\"in performance||w||(w=h(\"event\",M,{durationThreshold:0}))};let F=0;class k{l=[];u=new Map;m;p;v(){F=C(),this.l.length=0,this.u.clear()}T(){const e=Math.min(this.l.length-1,Math.floor((C()-F)/50));return this.l[e]}h(e){if(this.m?.(e),!e.interactionId&&\"first-input\"!==e.entryType)return;const t=this.l.at(-1);let n=this.u.get(e.interactionId);if(n||this.l.length<10||e.duration>t.L){if(n?e.duration>n.L?(n.entries=[e],n.L=e.duration):e.duration===n.L&&e.startTime===n.entries[0].startTime&&n.entries.push(e):(n={id:e.interactionId,entries:[e],L:e.duration},this.u.set(n.id,n),this.l.push(n)),this.l.sort((e,t)=>t.L-e.L),this.l.length>10){const e=this.l.splice(10);for(const t of e)this.u.delete(t.id)}this.p?.(n)}}}const A=e=>{const t=globalThis.requestIdleCallback||setTimeout,n=globalThis.cancelIdleCallback||clearTimeout;if(\"hidden\"===document.visibilityState)e();else{const i=f(e);let s=-1;const o=()=>{n(s),i()};addEventListener(\"visibilitychange\",o,{once:!0,capture:!0}),s=t(()=>{removeEventListener(\"visibilitychange\",o,{capture:!0}),i()})}},B=[200,500],S=(e,i={})=>{if(!globalThis.PerformanceEventTiming||!(\"interactionId\"in PerformanceEventTiming.prototype))return;const s=p();v(()=>{I();let o,c=r(\"INP\");const d=a(i,k),f=e=>{A(()=>{for(const t of e)d.h(t);const t=d.T();t&&t.L!==c.value&&(c.value=t.L,c.entries=t.entries,o())})},l=h(\"event\",f,{durationThreshold:i.durationThreshold??40});o=n(e,c,B,i.reportAllChanges),l&&(l.observe({type:\"first-input\",buffered:!0}),s.onHidden(()=>{f(l.takeRecords()),o(!0)}),t(()=>{d.v(),c=r(\"INP\"),o=n(e,c,B,i.reportAllChanges)}))})};class q{m;h(e){this.m?.(e)}}const N=[2500,4e3],x=(e,s={})=>{v(()=>{const c=p();let d,l=r(\"LCP\");const u=a(s,q),m=e=>{s.reportAllChanges||(e=e.slice(-1));for(const t of e)u.h(t),t.startTime<c.firstHiddenTime&&(l.value=Math.max(t.startTime-o(),0),l.entries=[t],d())},g=h(\"largest-contentful-paint\",m);if(g){d=n(e,l,N,s.reportAllChanges);const o=f(()=>{m(g.takeRecords()),g.disconnect(),d(!0)}),c=e=>{e.isTrusted&&(A(o),removeEventListener(e.type,c,{capture:!0}))};for(const e of[\"keydown\",\"click\",\"visibilitychange\"])addEventListener(e,c,{capture:!0});t(t=>{l=r(\"LCP\"),d=n(e,l,N,s.reportAllChanges),i(()=>{l.value=performance.now()-t.timeStamp,d(!0)})})}})},H=[800,1800],O=e=>{document.prerendering?v(()=>O(e)):\"complete\"!==document.readyState?addEventListener(\"load\",()=>O(e),!0):setTimeout(e)},$=(e,i={})=>{let c=r(\"TTFB\"),a=n(e,c,H,i.reportAllChanges);O(()=>{const d=s();d&&(c.value=Math.max(d.responseStart-o(),0),c.entries=[d],a(!0),t(()=>{c=r(\"TTFB\",0),a=n(e,c,H,i.reportAllChanges),a(!0)}))})};export{E as CLSThresholds,y as FCPThresholds,B as INPThresholds,N as LCPThresholds,H as TTFBThresholds,b as onCLS,T as onFCP,S as onINP,x as onLCP,$ as onTTFB};\n", "import {\r\n onLCP,\r\n onFCP,\r\n onCLS,\r\n onINP,\r\n onTTFB,\r\n} from 'web-vitals';\r\nimport type { MetricType } from 'web-vitals';\r\n\r\nimport type { Analytics } from './analytics';\r\nimport type { PerformanceConfig } from '../types';\r\n\r\nexport type PerformanceMonitorAPI = Pick<Analytics, 'track'>;\r\n\r\nfunction normalize(value: number, isCLS: boolean): number {\r\n if (isCLS) {\r\n return Math.round(value * 10000) / 10000;\r\n }\r\n return Math.round(value);\r\n}\r\n\r\nfunction reportMetric(api: PerformanceMonitorAPI, metric: MetricType): void {\r\n const isCLS = metric.name === 'CLS';\r\n const properties: Record<string, unknown> = {\r\n action: 'metric',\r\n target_type: 'performance',\r\n metric_name: metric.name,\r\n metric_value: normalize(metric.value, isCLS),\r\n metric_rating: metric.rating,\r\n delta: normalize(metric.delta, isCLS),\r\n metric_id: metric.id,\r\n navigation_type: metric.navigationType,\r\n };\r\n\r\n if (metric.name === 'LCP') {\r\n const entry = metric.entries[metric.entries.length - 1] as LargestContentfulPaint | undefined;\r\n if (entry) {\r\n properties.lcp_element = entry.element?.tagName?.toLowerCase() || '';\r\n properties.lcp_url = entry.url || '';\r\n properties.lcp_size = entry.size;\r\n }\r\n }\r\n\r\n api.track('web_vital', properties);\r\n}\r\n\r\nexport function initPerformanceMonitor(\r\n api: PerformanceMonitorAPI,\r\n config: PerformanceConfig = {},\r\n): void {\r\n if (config.enabled === false) return;\r\n\r\n try {\r\n onLCP((metric) => reportMetric(api, metric));\r\n onFCP((metric) => reportMetric(api, metric));\r\n onCLS((metric) => reportMetric(api, metric));\r\n onINP((metric) => reportMetric(api, metric));\r\n onTTFB((metric) => reportMetric(api, metric));\r\n } catch {\r\n // Web Vitals API not supported in this browser\r\n }\r\n}\r\n", "declare global {\r\n interface Window {\r\n dataLayer: unknown[];\r\n }\r\n}\r\n\r\nexport class GTMManager {\r\n private _initialized = false;\r\n private _containerId: string | undefined;\r\n private _dataLayerName = 'dataLayer';\r\n\r\n get ready(): boolean {\r\n return this._initialized && typeof window !== 'undefined';\r\n }\r\n\r\n get containerId(): string | undefined {\r\n return this._containerId;\r\n }\r\n\r\n push(data: Record<string, unknown>): void {\r\n if (!this.ready) return;\r\n const w = window as unknown as Record<string, unknown>;\r\n const dl = w[this._dataLayerName];\r\n if (Array.isArray(dl)) {\r\n dl.push(data);\r\n }\r\n }\r\n\r\n track(eventName: string, properties?: Record<string, unknown>): void {\r\n this.push({ event: eventName, ...(properties || {}) });\r\n }\r\n\r\n setUserId(userId: string | null): void {\r\n this.push({ userId: userId ?? undefined });\r\n }\r\n\r\n setUserProperties(properties: Record<string, unknown>): void {\r\n this.push(properties);\r\n }\r\n\r\n _init(containerId: string, dataLayerName = 'dataLayer'): void {\r\n this._containerId = containerId;\r\n this._dataLayerName = dataLayerName;\r\n this._initialized = true;\r\n }\r\n\r\n _destroy(): void {\r\n this._initialized = false;\r\n this._containerId = undefined;\r\n }\r\n}\r\n", "import {\r\n AnalyticsConfig,\r\n AnalyticsPayload,\r\n EventPayload,\r\n EventProperties,\r\n TrackOptions,\r\n UserProfile,\r\n API_KEY_MAP,\r\n DEFAULT_CONFIG,\r\n STORAGE_KEYS,\r\n} from '../types';\r\nimport { SessionManager } from './session-manager';\r\nimport { Sender } from './sender';\r\nimport { StorageQueue } from './storage';\r\nimport { collectContext, collectMarketing } from './context-collector';\r\nimport { initAutoTrack } from './auto-track';\r\nimport { initErrorMonitor } from './error-monitor';\r\nimport { initGTM } from './gtm-loader';\r\nimport { initPerformanceMonitor } from './performance-monitor';\r\nimport { GTMManager } from './gtm-manager';\r\nimport {\r\n generateId,\r\n generateUUID,\r\n getTimestamp,\r\n isObject,\r\n isBrowser,\r\n getPageUrl,\r\n safeLocalStorageGet,\r\n safeLocalStorageSet,\r\n} from '../utils';\r\n\r\nlet globalBatchCounter = 0;\r\n\r\nexport class Analytics {\r\n private config: Required<Pick<AnalyticsConfig, 'debug' | 'autoTrack' | 'bufferFlushInterval' | 'bufferMaxSize' | 'maxRetryCount'>> & AnalyticsConfig;\r\n private sessionManager: SessionManager;\r\n private buffer: EventPayload[] = [];\r\n private bufferTimer: ReturnType<typeof setTimeout> | null = null;\r\n private userId: string | null = null;\r\n private userProps: Record<string, unknown> = {};\r\n private batchPageId: string;\r\n private clientId: string;\r\n private merchantLang: string;\r\n private clientType: string;\r\n private sampled: boolean;\r\n private initialized = false;\r\n private retrying = 0;\r\n\r\n // HOTFIX (production): retry / recovery / localStorage persistence DISABLED.\r\n // Reason: retry loop + parallel recoverFailedEvents + fire-and-forget\r\n // setTimeout caused 70+ concurrent in-flight requests on network errors.\r\n // Flip this flag to true (and uncomment the StorageQueue.enqueue blocks)\r\n // to restore the original behavior once the retry mechanism is rewritten.\r\n private static readonly RETRY_ENABLED = false;\r\n private unloadHandler: (() => void) | null = null;\r\n gtm: GTMManager;\r\n\r\n constructor(config: AnalyticsConfig) {\r\n this.gtm = new GTMManager();\r\n\r\n this.config = {\r\n debug: false,\r\n autoTrack: true,\r\n bufferFlushInterval: DEFAULT_CONFIG.bufferFlushInterval,\r\n bufferMaxSize: DEFAULT_CONFIG.bufferMaxSize,\r\n maxRetryCount: DEFAULT_CONFIG.maxRetryCount,\r\n ...config,\r\n };\r\n\r\n const appKey = this.config.appKey || this.config.appId || 'unknown';\r\n if (this.config.appId) this.config.appKey = appKey;\r\n\r\n this.clientId = this.getOrCreateClientId();\r\n this.merchantLang = DEFAULT_CONFIG.merchantLanguage;\r\n this.clientType = DEFAULT_CONFIG.clientType;\r\n this.batchPageId = this.generateBatchPageId();\r\n this.sessionManager = new SessionManager(this.config.sessionTimeout);\r\n this.sampled = this.resolveSampling();\r\n\r\n if (isBrowser()) {\r\n this.recoverFailedEvents();\r\n }\r\n\r\n this.registerBeforeUnload();\r\n\r\n if (this.config.autoTrack && isBrowser()) {\r\n initAutoTrack(this, this.config.autoTrackSelector);\r\n }\r\n\r\n if (isBrowser()) {\r\n initErrorMonitor(this);\r\n }\r\n\r\n if (isBrowser() && this.config.performance?.enabled !== false) {\r\n initPerformanceMonitor(this, this.config.performance);\r\n }\r\n\r\n if (isBrowser() && this.config.gtm?.enabled) {\r\n initGTM(this.config.gtm);\r\n this.gtm._init(this.config.gtm.containerId, this.config.gtm.dataLayerName);\r\n this.log('GTM initialized with containerId:', this.config.gtm.containerId);\r\n }\r\n\r\n this.initialized = true;\r\n this.log('Analytics SDK initialized', {\r\n appKey: this.config.appKey,\r\n clientId: this.clientId,\r\n sessionId: this.sessionManager.getSessionId(),\r\n });\r\n\r\n if (isBrowser() && this.config.autoTrackPageView !== false) {\r\n this.trackPageView();\r\n }\r\n }\r\n\r\n track(eventName: string, properties?: Record<string, unknown>, options?: TrackOptions): void {\r\n if (!eventName || typeof eventName !== 'string') {\r\n this.log('Invalid event name');\r\n return;\r\n }\r\n\r\n if (!this.sampled) return;\r\n\r\n const normalizedProps = properties && isObject(properties) ? properties : {};\r\n const isKeyEvent = options?.keyEvent === true || this.isKeyEvent(eventName);\r\n\r\n if (this.gtm.ready) {\r\n this.gtm.track(eventName, {\r\n ...normalizedProps,\r\n session_id: this.sessionManager.getSessionId(),\r\n page_url: isBrowser() ? getPageUrl() : '',\r\n referrer: isBrowser() ? document.referrer : '',\r\n });\r\n }\r\n\r\n if (this.config.disableServer) return;\r\n\r\n const event: EventPayload = {\r\n event_id: generateUUID(),\r\n event_name: eventName,\r\n batch_event_index: 0,\r\n batch_ordering_id: this.generateBatchOrderingId(),\r\n batch_page_id: this.batchPageId,\r\n timestamp: getTimestamp(),\r\n key_event: isKeyEvent,\r\n event_properties: this.buildEventProperties(normalizedProps),\r\n };\r\n\r\n if (isKeyEvent) {\r\n this.flushKeyEvent(event);\r\n return;\r\n }\r\n\r\n this.buffer.push(event);\r\n this.scheduleBufferFlush();\r\n\r\n if (this.buffer.length >= this.config.bufferMaxSize) {\r\n this.flushBuffer();\r\n }\r\n }\r\n\r\n identify(userId: string, attributes?: Record<string, unknown>): void {\r\n const wasAnonymous = !this.userId;\r\n this.userId = userId;\r\n if (attributes && isObject(attributes)) {\r\n this.userProps = attributes;\r\n }\r\n if (this.gtm.ready) {\r\n this.gtm.setUserId(userId);\r\n if (attributes && isObject(attributes)) {\r\n this.gtm.setUserProperties(attributes);\r\n }\r\n }\r\n this.log('User identified:', { userId, attributes });\r\n\r\n if (wasAnonymous && this.buffer.length > 0) {\r\n this.flushBuffer();\r\n }\r\n }\r\n\r\n setMerchantLanguage(language: string): void {\r\n this.merchantLang = language;\r\n }\r\n\r\n setClientType(clientType: string): void {\r\n this.clientType = clientType;\r\n }\r\n\r\n reset(): void {\r\n this.userId = null;\r\n this.userProps = {};\r\n this.buffer = [];\r\n if (this.bufferTimer) {\r\n clearTimeout(this.bufferTimer);\r\n this.bufferTimer = null;\r\n }\r\n if (this.gtm.ready) {\r\n this.gtm.setUserId(null);\r\n }\r\n this.log('Analytics reset');\r\n }\r\n\r\n getUserProfile(): UserProfile {\r\n return {\r\n userId: this.userId ?? undefined,\r\n anonymousId: this.clientId,\r\n attributes: this.userProps,\r\n };\r\n }\r\n\r\n getSessionId(): string {\r\n return this.sessionManager.getSessionId();\r\n }\r\n\r\n getClientId(): string {\r\n return this.clientId;\r\n }\r\n\r\n flush(): void {\r\n this.flushBuffer();\r\n }\r\n\r\n private log(...args: unknown[]): void {\r\n if (this.config.debug) {\r\n console.log('[Analytics]', ...args);\r\n }\r\n }\r\n\r\n private resolveSampling(): boolean {\r\n const rate = this.config.sampleRate ?? 1;\r\n if (rate >= 1) return true;\r\n if (rate <= 0) return false;\r\n const decision = Math.random() < rate;\r\n this.log(`Sampling decision: ${decision ? 'included' : 'excluded'} (sampleRate=${rate})`);\r\n return decision;\r\n }\r\n\r\n private getOrCreateClientId(): string {\r\n if (!isBrowser()) return generateUUID();\r\n\r\n let clientId = safeLocalStorageGet(STORAGE_KEYS.CLIENT_ID);\r\n if (!clientId) {\r\n clientId = generateUUID();\r\n safeLocalStorageSet(STORAGE_KEYS.CLIENT_ID, clientId);\r\n }\r\n return clientId;\r\n }\r\n\r\n private resolveApiKey(): string {\r\n if (this.config.apiKey) return this.config.apiKey;\r\n\r\n if (this.config.env) {\r\n const key = API_KEY_MAP[this.config.env];\r\n if (key) return key;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private isKeyEvent(eventName: string): boolean {\r\n if (!this.config.keyEvents || this.config.keyEvents.length === 0) return false;\r\n return this.config.keyEvents.includes(eventName);\r\n }\r\n\r\n private generateBatchPageId(): string {\r\n return `${getTimestamp().toString(36)}-${generateId().split('-')[1] || Math.random().toString(36).slice(2, 9)}`;\r\n }\r\n\r\n private generateBatchOrderingId(): string {\r\n globalBatchCounter += 1;\r\n return `${getTimestamp()}-${globalBatchCounter}`;\r\n }\r\n\r\n private buildEventProperties(properties: Record<string, unknown>): EventProperties {\r\n const defaults: EventProperties = {\r\n system: this.config.system || '',\r\n domain: this.config.domain || '',\r\n scene: '',\r\n action: '',\r\n target_type: '',\r\n target_id: '',\r\n page_url: isBrowser() ? getPageUrl() : '',\r\n };\r\n\r\n const merged: EventProperties = {};\r\n for (const key of Object.keys(defaults)) {\r\n const k = key as keyof EventProperties;\r\n const val = defaults[k];\r\n if (val !== undefined && val !== '') {\r\n (merged as Record<string, unknown>)[k] = val;\r\n }\r\n }\r\n for (const key of Object.keys(properties)) {\r\n (merged as Record<string, unknown>)[key] = properties[key];\r\n }\r\n\r\n return merged;\r\n }\r\n\r\n private scheduleBufferFlush(): void {\r\n if (this.bufferTimer) return;\r\n\r\n this.bufferTimer = setTimeout(() => {\r\n this.flushBuffer();\r\n }, this.config.bufferFlushInterval);\r\n }\r\n\r\n private flushBuffer(): void {\r\n if (this.config.disableServer) return;\r\n\r\n if (this.bufferTimer) {\r\n clearTimeout(this.bufferTimer);\r\n this.bufferTimer = null;\r\n }\r\n\r\n if (this.buffer.length === 0) return;\r\n\r\n // Wait for inflight retries to settle before sending a new batch\r\n if (this.retrying > 0) {\r\n this.scheduleBufferFlush();\r\n return;\r\n }\r\n\r\n const events = this.buffer.splice(0, this.buffer.length);\r\n events.forEach((e, i) => {\r\n e.batch_event_index = i;\r\n });\r\n\r\n this.log(`Flushing ${events.length} events`);\r\n this.sendBatch(events, 0);\r\n }\r\n\r\n private flushKeyEvent(event: EventPayload): void {\r\n if (this.config.disableServer) return;\r\n\r\n this.log('Flushing key event:', event.event_name);\r\n this.sendBatch([event], 0);\r\n }\r\n\r\n private async sendBatch(events: EventPayload[], retryCount: number): Promise<void> {\r\n if (events.length === 0) return;\r\n\r\n const apiKey = this.resolveApiKey();\r\n if (!apiKey) {\r\n this.log('No API key configured, dropping events (retry disabled)');\r\n // HOTFIX (production): localStorage persistence disabled. Original:\r\n // for (const event of events) {\r\n // StorageQueue.enqueue(event);\r\n // }\r\n return;\r\n }\r\n\r\n const payload = this.buildPayload(events);\r\n\r\n try {\r\n await Sender.send(payload, this.config.serverUrl, apiKey);\r\n this.log(`Batch sent successfully: ${events.length} events`);\r\n } catch (error) {\r\n this.log(`Batch send failed (attempt ${retryCount + 1}/${this.config.maxRetryCount + 1}):`, error);\r\n\r\n // ====================================================================\r\n // HOTFIX (production): retry / localStorage persistence DISABLED.\r\n // Reason: retry loop + parallel recoverFailedEvents + fire-and-forget\r\n // setTimeout caused 70+ concurrent in-flight requests on network errors.\r\n // DO NOT DELETE the block below \u2014 the original implementation must be\r\n // restored once the retry mechanism is rewritten (track via ticket).\r\n // ====================================================================\r\n const retryEnabled = Analytics.RETRY_ENABLED;\r\n if (retryEnabled && retryCount < this.config.maxRetryCount) {\r\n const delay = 1000 * Math.pow(2, retryCount);\r\n this.log(`Retrying in ${delay}ms...`);\r\n this.retrying += 1;\r\n setTimeout(() => {\r\n this.retrying -= 1;\r\n this.sendBatch(events, retryCount + 1);\r\n if (this.buffer.length > 0) {\r\n this.scheduleBufferFlush();\r\n }\r\n }, delay);\r\n } else {\r\n this.log('Max retries reached / retry disabled, dropping events');\r\n // HOTFIX (production): localStorage persistence disabled. Original:\r\n // for (const event of events) {\r\n // StorageQueue.enqueue(event);\r\n // }\r\n }\r\n }\r\n }\r\n\r\n private buildPayload(events: EventPayload[]): AnalyticsPayload {\r\n return {\r\n client_id: this.clientId,\r\n user_id: this.userId || '',\r\n session_id: this.sessionManager.getSessionId(),\r\n user_properties: Object.keys(this.userProps).length > 0 ? this.userProps : undefined,\r\n context: collectContext(this.config.appKey || this.config.appId || 'unknown', this.merchantLang, this.clientType),\r\n marketing: collectMarketing(),\r\n events,\r\n };\r\n }\r\n\r\n private recoverFailedEvents(): void {\r\n if (this.config.disableServer) return;\r\n if (!this.sampled) return;\r\n if (!Analytics.RETRY_ENABLED) {\r\n // HOTFIX (production): storage recovery disabled. Clean any stale items\r\n // so they don't accumulate forever.\r\n StorageQueue.clear();\r\n return;\r\n }\r\n\r\n const failedEvents = StorageQueue.recover();\r\n if (failedEvents.length > 0) {\r\n this.log(`Recovered ${failedEvents.length} failed events from storage`);\r\n\r\n for (const event of failedEvents) {\r\n event.batch_ordering_id = this.generateBatchOrderingId();\r\n event.batch_page_id = this.batchPageId;\r\n event.batch_event_index = 0;\r\n }\r\n\r\n const batchSize = this.config.bufferMaxSize;\r\n for (let i = 0; i < failedEvents.length; i += batchSize) {\r\n const batch = failedEvents.slice(i, i + batchSize);\r\n batch.forEach((e, idx) => {\r\n e.batch_event_index = idx;\r\n });\r\n this.sendBatch(batch, 0);\r\n }\r\n }\r\n }\r\n\r\n destroy(): void {\r\n if (this.unloadHandler) {\r\n window.removeEventListener('beforeunload', this.unloadHandler);\r\n window.removeEventListener('pagehide', this.unloadHandler);\r\n this.unloadHandler = null;\r\n }\r\n if (this.bufferTimer) {\r\n clearTimeout(this.bufferTimer);\r\n this.bufferTimer = null;\r\n }\r\n }\r\n\r\n private registerBeforeUnload(): void {\r\n if (!isBrowser() || this.config.disableServer) return;\r\n\r\n const handler = (): void => {\r\n if (this.buffer.length === 0) return;\r\n\r\n const events = this.buffer.splice(0, this.buffer.length);\r\n events.forEach((e, i) => {\r\n e.batch_event_index = i;\r\n });\r\n\r\n const apiKey = this.resolveApiKey();\r\n if (!apiKey) return;\r\n\r\n const payload = this.buildPayload(events);\r\n\r\n try {\r\n if (typeof navigator !== 'undefined' && navigator.sendBeacon) {\r\n const url = `${this.config.serverUrl}${this.config.serverUrl.includes('?') ? '&' : '?'}apiKey=${encodeURIComponent(apiKey)}`;\r\n const blob = new Blob([JSON.stringify(payload)], { type: 'application/json' });\r\n const success = navigator.sendBeacon(url, blob);\r\n if (!success) throw new Error('sendBeacon rejected');\r\n } else {\r\n // XHR sync as fallback \u2014 tries to send but doesn't block page unload\r\n try {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open('POST', this.config.serverUrl, false);\r\n xhr.setRequestHeader('Content-Type', 'application/json');\r\n xhr.setRequestHeader('apiKey', apiKey);\r\n xhr.timeout = 2000;\r\n xhr.send(JSON.stringify(payload));\r\n } catch {\r\n // XHR failed during unload\r\n }\r\n }\r\n } catch {\r\n // HOTFIX (production): localStorage persistence disabled. Original:\r\n // for (const event of events) {\r\n // StorageQueue.enqueue(event);\r\n // }\r\n this.log('Failed to flush buffer on unload, dropping events (retry disabled)');\r\n }\r\n };\r\n\r\n this.unloadHandler = handler;\r\n window.addEventListener('beforeunload', handler);\r\n window.addEventListener('pagehide', handler);\r\n }\r\n\r\n private trackPageView(): void {\r\n if (!isBrowser()) return;\r\n\r\n this.track('page_view', {\r\n action: 'view',\r\n target_type: 'page',\r\n page_url: getPageUrl(),\r\n referrer: document.referrer || '',\r\n });\r\n }\r\n}\r\n\r\nexport function createAnalytics(config: AnalyticsConfig): Analytics {\r\n return new Analytics(config);\r\n}\r\n"],
5
+ "mappings": "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",
6
6
  "names": ["c", "r", "v", "e", "w", "t", "n", "e", "i", "s", "o", "r", "c", "a", "d", "f", "l", "u", "m", "g", "w", "k", "e", "i"]
7
7
  }
@@ -14,6 +14,7 @@ export declare class Analytics {
14
14
  private sampled;
15
15
  private initialized;
16
16
  private retrying;
17
+ private static readonly RETRY_ENABLED;
17
18
  private unloadHandler;
18
19
  gtm: GTMManager;
19
20
  constructor(config: AnalyticsConfig);
@@ -1 +1 @@
1
- {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/core/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAIf,YAAY,EACZ,WAAW,EAIZ,MAAM,UAAU,CAAC;AASlB,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAc3C,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAuI;IACrJ,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,WAAW,CAA8C;IACjE,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,aAAa,CAA6B;IAClD,GAAG,EAAE,UAAU,CAAC;gBAEJ,MAAM,EAAE,eAAe;IA0DnC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IA8C5F,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAmBpE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI3C,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIvC,KAAK,IAAI,IAAI;IAcb,cAAc,IAAI,WAAW;IAQ7B,YAAY,IAAI,MAAM;IAItB,WAAW,IAAI,MAAM;IAIrB,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,GAAG;IAMX,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,uBAAuB;IAK/B,OAAO,CAAC,oBAAoB;IA0B5B,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,WAAW;IAyBnB,OAAO,CAAC,aAAa;YAOP,SAAS;IAwCvB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,IAAI,IAAI;IAYf,OAAO,CAAC,oBAAoB;IA+C5B,OAAO,CAAC,aAAa;CAUtB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAElE"}
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/core/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAIf,YAAY,EACZ,WAAW,EAIZ,MAAM,UAAU,CAAC;AASlB,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAc3C,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAuI;IACrJ,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,WAAW,CAA8C;IACjE,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAK;IAOrB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAS;IAC9C,OAAO,CAAC,aAAa,CAA6B;IAClD,GAAG,EAAE,UAAU,CAAC;gBAEJ,MAAM,EAAE,eAAe;IA0DnC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IA8C5F,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAmBpE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI3C,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIvC,KAAK,IAAI,IAAI;IAcb,cAAc,IAAI,WAAW;IAQ7B,YAAY,IAAI,MAAM;IAItB,WAAW,IAAI,MAAM;IAIrB,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,GAAG;IAMX,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,uBAAuB;IAK/B,OAAO,CAAC,oBAAoB;IA0B5B,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,WAAW;IAyBnB,OAAO,CAAC,aAAa;YAOP,SAAS;IAkDvB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,mBAAmB;IA+B3B,OAAO,IAAI,IAAI;IAYf,OAAO,CAAC,oBAAoB;IAiD5B,OAAO,CAAC,aAAa;CAUtB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAElE"}
@@ -265,10 +265,11 @@ export class Analytics {
265
265
  return;
266
266
  const apiKey = this.resolveApiKey();
267
267
  if (!apiKey) {
268
- this.log('No API key configured, dropping events');
269
- for (const event of events) {
270
- StorageQueue.enqueue(event);
271
- }
268
+ this.log('No API key configured, dropping events (retry disabled)');
269
+ // HOTFIX (production): localStorage persistence disabled. Original:
270
+ // for (const event of events) {
271
+ // StorageQueue.enqueue(event);
272
+ // }
272
273
  return;
273
274
  }
274
275
  const payload = this.buildPayload(events);
@@ -278,7 +279,15 @@ export class Analytics {
278
279
  }
279
280
  catch (error) {
280
281
  this.log(`Batch send failed (attempt ${retryCount + 1}/${this.config.maxRetryCount + 1}):`, error);
281
- if (retryCount < this.config.maxRetryCount) {
282
+ // ====================================================================
283
+ // HOTFIX (production): retry / localStorage persistence DISABLED.
284
+ // Reason: retry loop + parallel recoverFailedEvents + fire-and-forget
285
+ // setTimeout caused 70+ concurrent in-flight requests on network errors.
286
+ // DO NOT DELETE the block below — the original implementation must be
287
+ // restored once the retry mechanism is rewritten (track via ticket).
288
+ // ====================================================================
289
+ const retryEnabled = Analytics.RETRY_ENABLED;
290
+ if (retryEnabled && retryCount < this.config.maxRetryCount) {
282
291
  const delay = 1000 * Math.pow(2, retryCount);
283
292
  this.log(`Retrying in ${delay}ms...`);
284
293
  this.retrying += 1;
@@ -291,10 +300,11 @@ export class Analytics {
291
300
  }, delay);
292
301
  }
293
302
  else {
294
- this.log('Max retries reached, persisting events to localStorage');
295
- for (const event of events) {
296
- StorageQueue.enqueue(event);
297
- }
303
+ this.log('Max retries reached / retry disabled, dropping events');
304
+ // HOTFIX (production): localStorage persistence disabled. Original:
305
+ // for (const event of events) {
306
+ // StorageQueue.enqueue(event);
307
+ // }
298
308
  }
299
309
  }
300
310
  }
@@ -314,6 +324,12 @@ export class Analytics {
314
324
  return;
315
325
  if (!this.sampled)
316
326
  return;
327
+ if (!Analytics.RETRY_ENABLED) {
328
+ // HOTFIX (production): storage recovery disabled. Clean any stale items
329
+ // so they don't accumulate forever.
330
+ StorageQueue.clear();
331
+ return;
332
+ }
317
333
  const failedEvents = StorageQueue.recover();
318
334
  if (failedEvents.length > 0) {
319
335
  this.log(`Recovered ${failedEvents.length} failed events from storage`);
@@ -381,9 +397,11 @@ export class Analytics {
381
397
  }
382
398
  }
383
399
  catch {
384
- for (const event of events) {
385
- StorageQueue.enqueue(event);
386
- }
400
+ // HOTFIX (production): localStorage persistence disabled. Original:
401
+ // for (const event of events) {
402
+ // StorageQueue.enqueue(event);
403
+ // }
404
+ this.log('Failed to flush buffer on unload, dropping events (retry disabled)');
387
405
  }
388
406
  };
389
407
  this.unloadHandler = handler;
@@ -401,6 +419,12 @@ export class Analytics {
401
419
  });
402
420
  }
403
421
  }
422
+ // HOTFIX (production): retry / recovery / localStorage persistence DISABLED.
423
+ // Reason: retry loop + parallel recoverFailedEvents + fire-and-forget
424
+ // setTimeout caused 70+ concurrent in-flight requests on network errors.
425
+ // Flip this flag to true (and uncomment the StorageQueue.enqueue blocks)
426
+ // to restore the original behavior once the retry mechanism is rewritten.
427
+ Analytics.RETRY_ENABLED = false;
404
428
  export function createAnalytics(config) {
405
429
  return new Analytics(config);
406
430
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "onerway-analytics",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Onrway Analytics SDK",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",