@active-reach/web-sdk 1.0.0 → 1.2.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.
@@ -4,7 +4,7 @@
4
4
  * Real-time SSE architecture for inline content placements.
5
5
  *
6
6
  * Security:
7
- * - XSS Protection: Uses DOM APIs (createElement, textContent) instead of innerHTML
7
+ * - XSS Protection: Uses DOMPurify (when available) with allowlisted tags/attrs; safe text-only fallback
8
8
  * - URL Validation: Prevents javascript: protocol injection
9
9
  * - CSP Compatible: No inline styles in HTML strings
10
10
  *
@@ -1 +1 @@
1
- {"version":3,"file":"AegisPlacementManager.d.ts","sourceRoot":"","sources":["../../src/placements/AegisPlacementManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,mBAAmB,CAAC;IACtF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;CACnD;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,SAAS,CAAU;IAE3B,OAAO,CAAC,UAAU,CAA4C;IAC9D,OAAO,CAAC,KAAK,CAAyC;IACtD,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAK;gBAErB,MAAM,EAAE,oBAAoB;IAUlC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBjC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,GAAG,IAAI;IAiBhF,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAM/B,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IA4CxC,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,UAAU;IAwDlB,OAAO,CAAC,YAAY;IA2EpB,OAAO,CAAC,UAAU;IAsElB,OAAO,CAAC,cAAc;IA6EtB,OAAO,CAAC,WAAW;IAmCnB,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,sBAAsB;IAmE9B,OAAO,CAAC,cAAc;YAUR,UAAU;IA4CxB,OAAO,CAAC,UAAU;IAwDlB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,GAAG;IAMX,OAAO,IAAI,IAAI;CAQhB"}
1
+ {"version":3,"file":"AegisPlacementManager.d.ts","sourceRoot":"","sources":["../../src/placements/AegisPlacementManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,mBAAmB,CAAC;IACtF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;CACnD;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,SAAS,CAAU;IAE3B,OAAO,CAAC,UAAU,CAA4C;IAC9D,OAAO,CAAC,KAAK,CAAyC;IACtD,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAK;gBAErB,MAAM,EAAE,oBAAoB;IAUlC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBjC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,GAAG,IAAI;IAiBhF,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAM/B,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IA4CxC,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,UAAU;IAwDlB,OAAO,CAAC,YAAY;IA2EpB,OAAO,CAAC,UAAU;IAsElB,OAAO,CAAC,cAAc;IA6EtB,OAAO,CAAC,WAAW;IAmCnB,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,sBAAsB;IAmE9B,OAAO,CAAC,cAAc;YAUR,UAAU;IA4CxB,OAAO,CAAC,UAAU;IAwDlB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,YAAY;IAkCpB,OAAO,CAAC,GAAG;IAMX,OAAO,IAAI,IAAI;CAQhB"}
package/dist/react.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import React, { createContext, useState, useEffect, useContext } from "react";
2
- import { A as Aegis } from "./analytics-B11keZ55.mjs";
2
+ import { A as Aegis } from "./analytics-CNtfsb7E.mjs";
3
3
  const AegisContext = createContext({
4
4
  aegis: null,
5
5
  isReady: false
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@active-reach/web-sdk",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "Web SDK for Active Reach Intelligence — event tracking, identity resolution, in-app messaging, web push, and placements",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -1 +0,0 @@
1
- {"version":3,"file":"analytics-B11keZ55.mjs","sources":["../src/types/config.ts","../src/utils/uuid.ts","../src/utils/logger.ts","../src/utils/identity.ts","../src/core/session.ts","../src/core/queue.ts","../src/core/transport.ts","../src/utils/storage.ts","../src/utils/url-parser.ts","../src/utils/device.ts","../src/plugins/registry.ts","../src/utils/consent.ts","../src/core/analytics.ts"],"sourcesContent":["export type CellRegion = 'us-east' | 'us-west' | 'eu-central' | 'ap-south' | 'ap-southeast';\n\nexport interface CellEndpoint {\n region: CellRegion;\n url: string;\n priority: number;\n healthy: boolean;\n}\n\nexport interface AegisConfig {\n write_key: string;\n\n workspace_id?: string;\n \n api_host?: string;\n \n cell_endpoints?: CellEndpoint[];\n \n preferred_region?: CellRegion;\n \n auto_region_detection?: boolean;\n \n batch_size?: number;\n \n batch_interval?: number;\n \n capture_utm?: boolean;\n \n capture_referrer?: boolean;\n \n auto_page_view?: boolean;\n \n session_timeout?: number;\n \n debug?: boolean;\n \n respect_dnt?: boolean;\n \n cross_domain_tracking?: boolean;\n \n cookie_domain?: string;\n \n secure_cookie?: boolean;\n \n enable_offline_mode?: boolean;\n \n max_offline_events?: number;\n \n retry_failed_requests?: boolean;\n \n max_retries?: number;\n \n retry_backoff_multiplier?: number;\n \n request_timeout?: number;\n \n plugins?: string[];\n\n wait_for_consent?: boolean;\n\n default_consent?: {\n analytics?: boolean;\n marketing?: boolean;\n functional?: boolean;\n };\n\n enable_consent_mode?: boolean;\n\n integrate_onetrust?: boolean;\n\n integrate_cookiebot?: boolean;\n\n integrate_google_consent_mode?: boolean;\n\n /** Push notification configuration. When provided, AegisWebPush is initialized. */\n push?: {\n /** VAPID public key for Web Push subscription. */\n vapidPublicKey: string;\n /** Automatically prompt for push permission after SDK init. Default: false. */\n autoPrompt?: boolean;\n /** Delay in ms before showing auto-prompt. Default: 5000. */\n promptDelay?: number;\n /** Path to the service worker file. Default: '/aegis-sw.js'. */\n serviceWorkerPath?: string;\n /** Scope for the service worker registration. Default: '/'. Critical for e-commerce platforms. */\n serviceWorkerScope?: string;\n };\n}\n\nexport interface AegisConfigInternal extends Required<Omit<AegisConfig, 'api_host' | 'cell_endpoints' | 'preferred_region' | 'cookie_domain' | 'plugins' | 'default_consent' | 'workspace_id'>> {\n initialized: boolean;\n workspace_id: string | null;\n api_host: string | null;\n cell_endpoints: CellEndpoint[];\n preferred_region: CellRegion | null;\n cookie_domain: string | null;\n plugins: string[];\n active_cell: CellEndpoint | null;\n default_consent: {\n analytics: boolean;\n marketing: boolean;\n functional: boolean;\n };\n}\n\nexport const DEFAULT_CONFIG: Partial<AegisConfigInternal> = {\n workspace_id: null,\n batch_size: 10,\n batch_interval: 1000,\n capture_utm: true,\n capture_referrer: true,\n auto_page_view: false,\n session_timeout: 30,\n debug: false,\n respect_dnt: true,\n cross_domain_tracking: false,\n secure_cookie: true,\n enable_offline_mode: true,\n max_offline_events: 100,\n retry_failed_requests: true,\n max_retries: 3,\n retry_backoff_multiplier: 2,\n request_timeout: 5000,\n auto_region_detection: true,\n wait_for_consent: false,\n enable_consent_mode: false,\n integrate_onetrust: false,\n integrate_cookiebot: false,\n integrate_google_consent_mode: false,\n default_consent: {\n analytics: false,\n marketing: false,\n functional: true,\n },\n initialized: false,\n api_host: null,\n cell_endpoints: [],\n preferred_region: null,\n cookie_domain: null,\n plugins: [],\n active_cell: null,\n};\n","export function generateUUID(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport function generateSessionId(): string {\n return `sess_${Date.now()}_${generateUUID().slice(0, 8)}`;\n}\n\nexport function generateMessageId(): string {\n return `msg_${Date.now()}_${generateUUID().slice(0, 8)}`;\n}\n","export type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nclass Logger {\n private enabled: boolean = false;\n private prefix: string = '[Aegis SDK]';\n\n enable(): void {\n this.enabled = true;\n }\n\n disable(): void {\n this.enabled = false;\n }\n\n isEnabled(): boolean {\n return this.enabled;\n }\n\n debug(message: string, ...args: any[]): void {\n if (!this.enabled) return;\n console.debug(`${this.prefix} ${message}`, ...args);\n }\n\n info(message: string, ...args: any[]): void {\n if (!this.enabled) return;\n console.info(`${this.prefix} ${message}`, ...args);\n }\n\n warn(message: string, ...args: any[]): void {\n console.warn(`${this.prefix} ${message}`, ...args);\n }\n\n error(message: string, ...args: any[]): void {\n console.error(`${this.prefix} ${message}`, ...args);\n }\n}\n\nexport const logger = new Logger();\n","import { generateUUID } from './uuid';\nimport { Storage } from './storage';\nimport { logger } from './logger';\n\nexport interface IdentityState {\n anonymousId: string;\n userId: string | null;\n traits: Record<string, any>;\n}\n\nexport class Identity {\n private storage: Storage;\n private anonymousId: string;\n private userId: string | null = null;\n private traits: Record<string, any> = {};\n\n constructor(storage: Storage) {\n this.storage = storage;\n this.anonymousId = this.getOrCreateAnonymousId();\n this.loadUserIdentity();\n }\n\n private getOrCreateAnonymousId(): string {\n let id = this.storage.get('anon_id');\n\n if (!id) {\n id = generateUUID();\n this.storage.set('anon_id', id, 365);\n logger.debug('Created new anonymous ID:', id);\n } else {\n logger.debug('Loaded existing anonymous ID:', id);\n }\n\n return id;\n }\n\n private loadUserIdentity(): void {\n const storedUserId = this.storage.get('user_id');\n const storedTraits = this.storage.get('user_traits');\n\n if (storedUserId) {\n this.userId = storedUserId;\n logger.debug('Loaded user ID:', storedUserId);\n }\n\n if (storedTraits) {\n try {\n this.traits = JSON.parse(storedTraits);\n logger.debug('Loaded user traits:', this.traits);\n } catch (error) {\n logger.warn('Failed to parse stored traits:', error);\n this.traits = {};\n }\n }\n }\n\n getAnonymousId(): string {\n return this.anonymousId;\n }\n\n setUserId(userId: string, traits?: Record<string, any>): void {\n this.userId = userId;\n this.storage.set('user_id', userId, 365);\n logger.info('User identified:', userId);\n\n if (traits) {\n this.setTraits(traits);\n }\n }\n\n getUserId(): string | null {\n return this.userId;\n }\n\n setTraits(traits: Record<string, any>): void {\n this.traits = { ...this.traits, ...traits };\n this.storage.set('user_traits', JSON.stringify(this.traits), 365);\n logger.debug('User traits updated:', this.traits);\n }\n\n getTraits(): Record<string, any> {\n return { ...this.traits };\n }\n\n reset(): void {\n this.userId = null;\n this.traits = {};\n this.anonymousId = generateUUID();\n\n this.storage.remove('user_id');\n this.storage.remove('user_traits');\n this.storage.set('anon_id', this.anonymousId, 365);\n\n logger.info('Identity reset, new anonymous ID:', this.anonymousId);\n }\n\n alias(newUserId: string): { previousId: string; newUserId: string } {\n const previousId = this.userId || this.anonymousId;\n\n this.setUserId(newUserId);\n\n logger.info('User aliased:', { previousId, newUserId });\n\n return { previousId, newUserId };\n }\n\n getState(): IdentityState {\n return {\n anonymousId: this.anonymousId,\n userId: this.userId,\n traits: this.getTraits(),\n };\n }\n}\n","import { Storage } from '../utils/storage';\nimport { generateSessionId } from '../utils/uuid';\nimport { logger } from '../utils/logger';\nimport { AdClickIDs } from '../utils/url-parser';\n\nexport interface SessionState {\n sessionId: string;\n startTime: number;\n lastActivityTime: number;\n eventCount: number;\n adClickIDs?: AdClickIDs;\n landingPage?: string;\n}\n\nexport class SessionManager {\n private storage: Storage;\n private sessionId: string;\n private sessionTimeout: number;\n private lastActivityTime: number;\n private sessionStartTime: number;\n private eventCount: number = 0;\n private checkInterval: number | null = null;\n private activityThrottle: number = 1000;\n private lastActivityUpdate: number = 0;\n private adClickIDs: AdClickIDs = {};\n private landingPage?: string;\n\n constructor(storage: Storage, sessionTimeoutMinutes: number = 30) {\n this.storage = storage;\n this.sessionTimeout = sessionTimeoutMinutes * 60 * 1000;\n this.lastActivityTime = Date.now();\n this.sessionStartTime = Date.now();\n\n const session = this.loadSession();\n if (session) {\n this.sessionId = session.sessionId;\n this.sessionStartTime = session.startTime;\n this.lastActivityTime = session.lastActivityTime;\n this.eventCount = session.eventCount;\n this.adClickIDs = session.adClickIDs || {};\n this.landingPage = session.landingPage;\n logger.debug('Session loaded:', session);\n } else {\n this.sessionId = this.createNewSession();\n }\n\n this.startActivityTracking();\n this.startExpiryCheck();\n }\n\n private loadSession(): SessionState | null {\n const sessionData = this.storage.get('session');\n\n if (!sessionData) {\n return null;\n }\n\n try {\n const session: SessionState = JSON.parse(sessionData);\n const elapsed = Date.now() - session.lastActivityTime;\n\n if (elapsed < this.sessionTimeout) {\n return session;\n } else {\n logger.debug('Session expired, creating new session');\n this.storage.remove('session');\n return null;\n }\n } catch (error) {\n logger.warn('Failed to parse session data:', error);\n this.storage.remove('session');\n return null;\n }\n }\n\n private createNewSession(): string {\n const newSessionId = generateSessionId();\n this.sessionStartTime = Date.now();\n this.lastActivityTime = Date.now();\n this.eventCount = 0;\n\n this.persistSession();\n logger.info('New session created:', newSessionId);\n\n return newSessionId;\n }\n\n private persistSession(): void {\n const sessionData: SessionState = {\n sessionId: this.sessionId,\n startTime: this.sessionStartTime,\n lastActivityTime: this.lastActivityTime,\n eventCount: this.eventCount,\n adClickIDs: this.adClickIDs,\n landingPage: this.landingPage,\n };\n\n this.storage.set('session', JSON.stringify(sessionData));\n }\n\n private startActivityTracking(): void {\n const events = ['click', 'scroll', 'keypress', 'mousemove', 'touchstart'];\n\n const activityHandler = () => this.onActivity();\n\n events.forEach((event) => {\n window.addEventListener(event, activityHandler, { passive: true });\n });\n\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n this.onActivity();\n }\n });\n }\n\n private startExpiryCheck(): void {\n this.checkInterval = window.setInterval(() => {\n this.checkSessionExpiry();\n }, 60000);\n }\n\n private onActivity(): void {\n const now = Date.now();\n const timeSinceLastUpdate = now - this.lastActivityUpdate;\n\n if (timeSinceLastUpdate < this.activityThrottle) {\n return;\n }\n\n this.lastActivityUpdate = now;\n const timeSinceLastActivity = now - this.lastActivityTime;\n\n if (timeSinceLastActivity > this.sessionTimeout) {\n logger.info('Session expired due to inactivity, creating new session');\n this.sessionId = this.createNewSession();\n } else {\n this.lastActivityTime = now;\n this.persistSession();\n }\n }\n\n private checkSessionExpiry(): void {\n const elapsed = Date.now() - this.lastActivityTime;\n\n if (elapsed > this.sessionTimeout) {\n logger.info('Session expired during check, creating new session');\n this.sessionId = this.createNewSession();\n }\n }\n\n getSessionId(): string {\n return this.sessionId;\n }\n\n incrementEventCount(): void {\n this.eventCount++;\n this.lastActivityTime = Date.now();\n this.persistSession();\n }\n\n getSessionDuration(): number {\n return Date.now() - this.sessionStartTime;\n }\n\n getEventCount(): number {\n return this.eventCount;\n }\n\n getState(): SessionState {\n return {\n sessionId: this.sessionId,\n startTime: this.sessionStartTime,\n lastActivityTime: this.lastActivityTime,\n eventCount: this.eventCount,\n adClickIDs: this.adClickIDs,\n landingPage: this.landingPage,\n };\n }\n\n setAdClickIDs(adClickIDs: AdClickIDs, landingPage?: string): void {\n if (Object.keys(adClickIDs).length > 0) {\n this.adClickIDs = { ...this.adClickIDs, ...adClickIDs };\n if (landingPage) {\n this.landingPage = landingPage;\n }\n this.persistSession();\n logger.info('Ad click IDs stored in session:', this.adClickIDs);\n }\n }\n\n getAdClickIDs(): AdClickIDs {\n return this.adClickIDs;\n }\n\n getLandingPage(): string | undefined {\n return this.landingPage;\n }\n\n destroy(): void {\n if (this.checkInterval) {\n clearInterval(this.checkInterval);\n this.checkInterval = null;\n }\n }\n}\n","import { AegisEvent } from '../types/events';\nimport { Transport } from './transport';\nimport { Storage } from '../utils/storage';\nimport { logger } from '../utils/logger';\n\nexport interface QueueConfig {\n batchSize: number;\n batchInterval: number;\n enableOfflineMode: boolean;\n maxOfflineEvents: number;\n}\n\nexport class EventQueue {\n private buffer: AegisEvent[] = [];\n private config: QueueConfig;\n private transport: Transport;\n private storage: Storage;\n private flushInterval: number | null = null;\n private isFlushing: boolean = false;\n private offlineQueue: AegisEvent[] = [];\n private isOnline: boolean = navigator.onLine;\n\n constructor(config: QueueConfig, transport: Transport, storage: Storage) {\n this.config = config;\n this.transport = transport;\n this.storage = storage;\n\n if (config.enableOfflineMode) {\n this.loadOfflineQueue();\n this.setupOnlineListener();\n }\n\n this.startFlushTimer();\n this.setupUnloadHandlers();\n }\n\n private loadOfflineQueue(): void {\n const offlineData = this.storage.get('offline_queue');\n\n if (!offlineData) {\n return;\n }\n\n try {\n const events = JSON.parse(offlineData) as AegisEvent[];\n\n if (Array.isArray(events) && events.length > 0) {\n this.offlineQueue = events.slice(0, this.config.maxOfflineEvents);\n logger.info(`Loaded ${this.offlineQueue.length} offline events`);\n\n if (this.isOnline) {\n this.flushOfflineQueue();\n }\n }\n } catch (error) {\n logger.warn('Failed to load offline queue:', error);\n this.storage.remove('offline_queue');\n }\n }\n\n private saveOfflineQueue(): void {\n if (this.offlineQueue.length === 0) {\n this.storage.remove('offline_queue');\n return;\n }\n\n try {\n const data = JSON.stringify(this.offlineQueue);\n this.storage.set('offline_queue', data);\n logger.debug(`Saved ${this.offlineQueue.length} events to offline queue`);\n } catch (error) {\n logger.warn('Failed to save offline queue:', error);\n }\n }\n\n private setupOnlineListener(): void {\n window.addEventListener('online', () => {\n logger.info('Connection restored');\n this.isOnline = true;\n this.flushOfflineQueue();\n this.flush();\n });\n\n window.addEventListener('offline', () => {\n logger.warn('Connection lost, entering offline mode');\n this.isOnline = false;\n });\n }\n\n private async flushOfflineQueue(): Promise<void> {\n if (this.offlineQueue.length === 0) {\n return;\n }\n\n logger.info(`Flushing ${this.offlineQueue.length} offline events`);\n\n const events = [...this.offlineQueue];\n this.offlineQueue = [];\n this.storage.remove('offline_queue');\n\n const result = await this.transport.send(events);\n\n if (!result.success) {\n logger.warn('Failed to send offline events, re-queueing');\n this.offlineQueue = [...events, ...this.offlineQueue].slice(\n 0,\n this.config.maxOfflineEvents\n );\n this.saveOfflineQueue();\n } else {\n logger.info('Offline events sent successfully');\n }\n }\n\n push(event: AegisEvent): void {\n if (!this.isOnline && this.config.enableOfflineMode) {\n this.addToOfflineQueue(event);\n return;\n }\n\n this.buffer.push(event);\n logger.debug('Event queued:', event.type, event);\n\n if (this.buffer.length >= this.config.batchSize) {\n this.flush();\n }\n }\n\n private addToOfflineQueue(event: AegisEvent): void {\n if (this.offlineQueue.length >= this.config.maxOfflineEvents) {\n logger.warn('Offline queue full, dropping oldest event');\n this.offlineQueue.shift();\n }\n\n this.offlineQueue.push(event);\n this.saveOfflineQueue();\n logger.debug('Event added to offline queue');\n }\n\n async flush(): Promise<void> {\n if (this.isFlushing) {\n logger.debug('Flush already in progress, skipping');\n return;\n }\n\n if (this.buffer.length === 0) {\n return;\n }\n\n this.isFlushing = true;\n\n const events = [...this.buffer];\n this.buffer = [];\n\n logger.info(`Flushing ${events.length} events`);\n\n try {\n const result = await this.transport.send(events);\n\n if (!result.success) {\n logger.error('Failed to send events:', result.error);\n\n if (this.config.enableOfflineMode) {\n this.offlineQueue = [...this.offlineQueue, ...events].slice(\n 0,\n this.config.maxOfflineEvents\n );\n this.saveOfflineQueue();\n logger.info('Events saved to offline queue');\n } else {\n this.buffer.unshift(...events);\n logger.warn('Events re-queued for retry');\n }\n } else {\n logger.info('Events sent successfully');\n }\n } catch (error) {\n logger.error('Flush error:', error);\n\n if (this.config.enableOfflineMode) {\n this.offlineQueue = [...this.offlineQueue, ...events].slice(\n 0,\n this.config.maxOfflineEvents\n );\n this.saveOfflineQueue();\n }\n } finally {\n this.isFlushing = false;\n }\n }\n\n private startFlushTimer(): void {\n if (this.flushInterval) {\n clearInterval(this.flushInterval);\n }\n\n this.flushInterval = window.setInterval(() => {\n this.flush();\n }, this.config.batchInterval);\n\n logger.debug(\n `Flush timer started with interval: ${this.config.batchInterval}ms`\n );\n }\n\n private setupUnloadHandlers(): void {\n const flushBeforeUnload = () => {\n if (this.buffer.length > 0 || this.offlineQueue.length > 0) {\n this.persistBufferToOfflineQueue();\n this.flush();\n }\n };\n\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n flushBeforeUnload();\n }\n });\n\n window.addEventListener('beforeunload', flushBeforeUnload);\n\n window.addEventListener('pagehide', flushBeforeUnload);\n }\n\n private persistBufferToOfflineQueue(): void {\n if (this.buffer.length === 0) {\n return;\n }\n\n if (this.config.enableOfflineMode) {\n this.offlineQueue = [...this.offlineQueue, ...this.buffer].slice(\n 0,\n this.config.maxOfflineEvents\n );\n this.saveOfflineQueue();\n logger.debug('Buffer persisted to offline queue before unload');\n }\n }\n\n getQueueSize(): number {\n return this.buffer.length;\n }\n\n getOfflineQueueSize(): number {\n return this.offlineQueue.length;\n }\n\n clear(): void {\n this.buffer = [];\n this.offlineQueue = [];\n this.storage.remove('offline_queue');\n logger.info('Queue cleared');\n }\n\n destroy(): void {\n if (this.flushInterval) {\n clearInterval(this.flushInterval);\n this.flushInterval = null;\n }\n\n this.flush();\n }\n}\n","import { AegisEvent, BatchPayload, BatchResponse } from '../types/events';\nimport { CellEndpoint, CellRegion } from '../types/config';\nimport { logger } from '../utils/logger';\nimport { Storage } from '../utils/storage';\n\nexport interface TransportConfig {\n writeKey: string;\n apiHost: string | null;\n cellEndpoints: CellEndpoint[];\n preferredRegion: CellRegion | null;\n autoRegionDetection: boolean;\n requestTimeout: number;\n retryFailedRequests: boolean;\n maxRetries: number;\n retryBackoffMultiplier: number;\n}\n\nexport interface SendResult {\n success: boolean;\n response?: BatchResponse;\n error?: Error;\n endpoint?: string;\n}\n\nexport class Transport {\n private config: TransportConfig;\n private storage: Storage;\n private activeCell: CellEndpoint | null = null;\n private healthCheckInterval: number | null = null;\n private regionLatencyMap: Map<string, number> = new Map();\n\n constructor(config: TransportConfig, storage: Storage) {\n this.config = config;\n this.storage = storage;\n\n if (config.cellEndpoints.length > 0) {\n this.initializeCellularArchitecture();\n }\n }\n\n private async initializeCellularArchitecture(): Promise<void> {\n const cachedCell = this.loadCachedCell();\n\n if (cachedCell && this.isCellHealthy(cachedCell)) {\n this.activeCell = cachedCell;\n logger.info('Using cached cell:', cachedCell);\n } else {\n await this.selectOptimalCell();\n }\n\n this.startHealthChecks();\n }\n\n private loadCachedCell(): CellEndpoint | null {\n const cached = this.storage.get('active_cell');\n\n if (!cached) {\n return null;\n }\n\n try {\n return JSON.parse(cached) as CellEndpoint;\n } catch (error) {\n logger.warn('Failed to parse cached cell:', error);\n return null;\n }\n }\n\n private saveCachedCell(cell: CellEndpoint): void {\n this.storage.set('active_cell', JSON.stringify(cell), 7);\n }\n\n private isCellHealthy(cell: CellEndpoint): boolean {\n return (\n cell.healthy &&\n this.config.cellEndpoints.some(\n (c) => c.region === cell.region && c.url === cell.url\n )\n );\n }\n\n private async selectOptimalCell(): Promise<void> {\n logger.info('Selecting optimal cell...');\n\n if (this.config.preferredRegion) {\n const preferredCell = this.config.cellEndpoints.find(\n (cell) => cell.region === this.config.preferredRegion && cell.healthy\n );\n\n if (preferredCell) {\n this.activeCell = preferredCell;\n this.saveCachedCell(preferredCell);\n logger.info('Using preferred region cell:', preferredCell);\n return;\n }\n }\n\n if (this.config.autoRegionDetection) {\n await this.detectOptimalRegion();\n } else {\n this.selectCellByPriority();\n }\n }\n\n private async detectOptimalRegion(): Promise<void> {\n const healthyCells = this.config.cellEndpoints.filter((cell) => cell.healthy);\n\n if (healthyCells.length === 0) {\n logger.error('No healthy cells available');\n return;\n }\n\n const latencyPromises = healthyCells.map(async (cell) => {\n const latency = await this.measureLatency(cell);\n this.regionLatencyMap.set(cell.region, latency);\n return { cell, latency };\n });\n\n const results = await Promise.all(latencyPromises);\n results.sort((a, b) => a.latency - b.latency);\n\n const optimalCell = results[0].cell;\n this.activeCell = optimalCell;\n this.saveCachedCell(optimalCell);\n\n logger.info('Optimal cell selected:', {\n region: optimalCell.region,\n latency: results[0].latency,\n });\n }\n\n private async measureLatency(cell: CellEndpoint): Promise<number> {\n const startTime = performance.now();\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 2000);\n\n const response = await fetch(`${cell.url}/health`, {\n method: 'GET',\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok) {\n return performance.now() - startTime;\n } else {\n return Infinity;\n }\n } catch (error) {\n logger.warn(`Health check failed for ${cell.region}:`, error);\n return Infinity;\n }\n }\n\n private selectCellByPriority(): void {\n const sortedCells = [...this.config.cellEndpoints]\n .filter((cell) => cell.healthy)\n .sort((a, b) => a.priority - b.priority);\n\n if (sortedCells.length > 0) {\n this.activeCell = sortedCells[0];\n this.saveCachedCell(sortedCells[0]);\n logger.info('Cell selected by priority:', sortedCells[0]);\n } else {\n logger.error('No healthy cells available');\n }\n }\n\n private startHealthChecks(): void {\n this.healthCheckInterval = window.setInterval(() => {\n this.performHealthChecks();\n }, 60000);\n }\n\n private async performHealthChecks(): Promise<void> {\n const healthPromises = this.config.cellEndpoints.map(async (cell) => {\n const isHealthy = await this.checkCellHealth(cell);\n cell.healthy = isHealthy;\n return { cell, isHealthy };\n });\n\n const results = await Promise.all(healthPromises);\n\n if (this.activeCell && !this.activeCell.healthy) {\n logger.warn('Active cell unhealthy, selecting new cell');\n await this.selectOptimalCell();\n }\n\n logger.debug('Health check results:', results);\n }\n\n private async checkCellHealth(cell: CellEndpoint): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 3000);\n\n const response = await fetch(`${cell.url}/health`, {\n method: 'GET',\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n return response.ok;\n } catch (error) {\n return false;\n }\n }\n\n async send(events: AegisEvent[]): Promise<SendResult> {\n if (events.length === 0) {\n return { success: true };\n }\n\n const endpoint = this.getActiveEndpoint();\n const payload = this.buildPayload(events);\n\n logger.debug('Sending batch:', { endpoint, eventCount: events.length });\n\n if (document.visibilityState === 'hidden' && typeof navigator.sendBeacon === 'function') {\n const result = this.sendViaBeacon(endpoint, payload);\n return Promise.resolve(result);\n } else {\n return this.sendViaFetch(endpoint, payload);\n }\n }\n\n private getActiveEndpoint(): string {\n if (this.activeCell) {\n return `${this.activeCell.url}/v1/batch`;\n }\n\n if (this.config.apiHost) {\n return `${this.config.apiHost}/v1/batch`;\n }\n\n throw new Error('No active endpoint available');\n }\n\n private buildPayload(events: AegisEvent[]): BatchPayload {\n return {\n batch: events,\n sentAt: new Date().toISOString(),\n writeKey: this.config.writeKey,\n context: this.activeCell\n ? {\n cell: {\n region: this.activeCell.region,\n endpoint: this.activeCell.url,\n },\n }\n : undefined,\n };\n }\n\n private sendViaBeacon(endpoint: string, payload: BatchPayload): SendResult | Promise<SendResult> {\n try {\n const blob = new Blob([JSON.stringify(payload)], {\n type: 'application/json',\n });\n\n const sent = navigator.sendBeacon(endpoint, blob);\n\n if (sent) {\n logger.debug('Batch sent via Beacon');\n return { success: true, endpoint };\n } else {\n logger.warn('Beacon send failed, falling back to fetch');\n return this.sendViaFetch(endpoint, payload);\n }\n } catch (error) {\n logger.error('Beacon send error:', error);\n return {\n success: false,\n error: error as Error,\n endpoint,\n };\n }\n }\n\n private async sendViaFetch(\n endpoint: string,\n payload: BatchPayload,\n attempt: number = 1\n ): Promise<SendResult> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n this.config.requestTimeout\n );\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.writeKey}`,\n },\n body: JSON.stringify(payload),\n keepalive: true,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok) {\n const result: BatchResponse = await response.json();\n logger.debug('Batch sent successfully:', result);\n return { success: true, response: result, endpoint };\n } else {\n const errorText = await response.text();\n const error = new Error(\n `HTTP ${response.status}: ${errorText || response.statusText}`\n );\n\n logger.error('Batch send failed:', error);\n\n if (this.shouldRetry(response.status, attempt)) {\n return this.retryRequest(endpoint, payload, attempt);\n }\n\n return { success: false, error, endpoint };\n }\n } catch (error) {\n logger.error('Fetch error:', error);\n\n if (this.shouldRetry(0, attempt)) {\n return this.retryRequest(endpoint, payload, attempt);\n }\n\n return {\n success: false,\n error: error as Error,\n endpoint,\n };\n }\n }\n\n private shouldRetry(statusCode: number, attempt: number): boolean {\n if (!this.config.retryFailedRequests) {\n return false;\n }\n\n if (attempt >= this.config.maxRetries) {\n return false;\n }\n\n if (statusCode === 0) {\n return true;\n }\n\n return statusCode >= 500 || statusCode === 429;\n }\n\n private async retryRequest(\n endpoint: string,\n payload: BatchPayload,\n attempt: number\n ): Promise<SendResult> {\n const delay =\n Math.pow(this.config.retryBackoffMultiplier, attempt) * 1000;\n\n logger.info(`Retrying request in ${delay}ms (attempt ${attempt + 1})`);\n\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n return this.sendViaFetch(endpoint, payload, attempt + 1);\n }\n\n getActiveCell(): CellEndpoint | null {\n return this.activeCell;\n }\n\n getRegionLatencies(): Map<string, number> {\n return new Map(this.regionLatencyMap);\n }\n\n destroy(): void {\n if (this.healthCheckInterval) {\n clearInterval(this.healthCheckInterval);\n this.healthCheckInterval = null;\n }\n }\n}\n","const STORAGE_PREFIX = 'aegis_';\n\nexport interface StorageOptions {\n cookieDomain?: string | null;\n secureCookie?: boolean;\n crossDomain?: boolean;\n}\n\nexport class Storage {\n private useLocalStorage: boolean;\n private options: StorageOptions;\n\n constructor(options: StorageOptions = {}) {\n this.options = options;\n this.useLocalStorage = this.isLocalStorageAvailable();\n }\n\n private isLocalStorageAvailable(): boolean {\n try {\n const test = '__aegis_test__';\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch {\n return false;\n }\n }\n\n set(key: string, value: string, expiryDays: number = 365): void {\n const fullKey = STORAGE_PREFIX + key;\n\n if (this.useLocalStorage) {\n try {\n const item = {\n value,\n expiry: Date.now() + expiryDays * 24 * 60 * 60 * 1000,\n };\n localStorage.setItem(fullKey, JSON.stringify(item));\n } catch (error) {\n console.warn('[Aegis Storage] localStorage.setItem failed:', error);\n }\n }\n\n this.setCookie(fullKey, value, expiryDays);\n }\n\n get(key: string): string | null {\n const fullKey = STORAGE_PREFIX + key;\n\n if (this.useLocalStorage) {\n try {\n const itemStr = localStorage.getItem(fullKey);\n if (itemStr) {\n const item = JSON.parse(itemStr);\n if (Date.now() < item.expiry) {\n return item.value;\n } else {\n localStorage.removeItem(fullKey);\n }\n }\n } catch (error) {\n console.warn('[Aegis Storage] localStorage.getItem failed:', error);\n }\n }\n\n return this.getCookie(fullKey);\n }\n\n remove(key: string): void {\n const fullKey = STORAGE_PREFIX + key;\n\n if (this.useLocalStorage) {\n try {\n localStorage.removeItem(fullKey);\n } catch (error) {\n console.warn('[Aegis Storage] localStorage.removeItem failed:', error);\n }\n }\n\n this.deleteCookie(fullKey);\n }\n\n clear(): void {\n if (this.useLocalStorage) {\n try {\n const keys = Object.keys(localStorage);\n keys.forEach((key) => {\n if (key.startsWith(STORAGE_PREFIX)) {\n localStorage.removeItem(key);\n }\n });\n } catch (error) {\n console.warn('[Aegis Storage] localStorage.clear failed:', error);\n }\n }\n\n const cookies = document.cookie.split(';');\n cookies.forEach((cookie) => {\n const key = cookie.split('=')[0].trim();\n if (key.startsWith(STORAGE_PREFIX)) {\n this.deleteCookie(key);\n }\n });\n }\n\n private setCookie(name: string, value: string, days: number): void {\n try {\n const date = new Date();\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\n const expires = `expires=${date.toUTCString()}`;\n \n let cookieStr = `${name}=${value};${expires};path=/`;\n \n if (this.options.secureCookie && window.location.protocol === 'https:') {\n cookieStr += ';Secure';\n }\n \n cookieStr += ';SameSite=Lax';\n \n if (this.options.cookieDomain) {\n cookieStr += `;domain=${this.options.cookieDomain}`;\n } else if (this.options.crossDomain) {\n const domain = this.getRootDomain();\n if (domain) {\n cookieStr += `;domain=${domain}`;\n }\n }\n \n document.cookie = cookieStr;\n } catch (error) {\n console.warn('[Aegis Storage] setCookie failed:', error);\n }\n }\n\n private getCookie(name: string): string | null {\n try {\n const nameEQ = name + '=';\n const ca = document.cookie.split(';');\n \n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) === ' ') {\n c = c.substring(1, c.length);\n }\n if (c.indexOf(nameEQ) === 0) {\n return c.substring(nameEQ.length, c.length);\n }\n }\n } catch (error) {\n console.warn('[Aegis Storage] getCookie failed:', error);\n }\n \n return null;\n }\n\n private deleteCookie(name: string): void {\n try {\n let cookieStr = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/`;\n \n if (this.options.cookieDomain) {\n cookieStr += `;domain=${this.options.cookieDomain}`;\n } else if (this.options.crossDomain) {\n const domain = this.getRootDomain();\n if (domain) {\n cookieStr += `;domain=${domain}`;\n }\n }\n \n document.cookie = cookieStr;\n } catch (error) {\n console.warn('[Aegis Storage] deleteCookie failed:', error);\n }\n }\n\n private getRootDomain(): string | null {\n try {\n const hostname = window.location.hostname;\n \n if (/^(\\d{1,3}\\.){3}\\d{1,3}$/.test(hostname)) {\n return null;\n }\n \n if (hostname === 'localhost') {\n return null;\n }\n \n const parts = hostname.split('.');\n \n if (parts.length <= 2) {\n return `.${hostname}`;\n }\n \n return `.${parts.slice(-2).join('.')}`;\n } catch (error) {\n console.warn('[Aegis Storage] getRootDomain failed:', error);\n return null;\n }\n }\n}\n","export interface UTMParams {\n source?: string;\n medium?: string;\n campaign?: string;\n term?: string;\n content?: string;\n name?: string;\n}\n\nexport function parseUTMParameters(url?: string): UTMParams {\n try {\n const searchParams = url\n ? new URL(url).searchParams\n : new URLSearchParams(window.location.search);\n\n const utm: UTMParams = {};\n\n const utmKeys: Array<keyof UTMParams> = [\n 'source',\n 'medium',\n 'campaign',\n 'term',\n 'content',\n 'name',\n ];\n\n utmKeys.forEach((key) => {\n const value = searchParams.get(`utm_${key}`);\n if (value) {\n utm[key] = value;\n }\n });\n\n return utm;\n } catch (error) {\n console.warn('[Aegis URL Parser] parseUTMParameters failed:', error);\n return {};\n }\n}\n\nexport function parseQueryParameters(url?: string): Record<string, string> {\n try {\n const searchParams = url\n ? new URL(url).searchParams\n : new URLSearchParams(window.location.search);\n\n const params: Record<string, string> = {};\n\n searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return params;\n } catch (error) {\n console.warn('[Aegis URL Parser] parseQueryParameters failed:', error);\n return {};\n }\n}\n\nexport function getCanonicalURL(): string {\n try {\n const canonical = document.querySelector('link[rel=\"canonical\"]');\n if (canonical && canonical.getAttribute('href')) {\n return canonical.getAttribute('href')!;\n }\n \n return window.location.href;\n } catch (error) {\n console.warn('[Aegis URL Parser] getCanonicalURL failed:', error);\n return window.location.href;\n }\n}\n\nexport function stripQueryParameters(url: string): string {\n try {\n const urlObj = new URL(url);\n return `${urlObj.protocol}//${urlObj.host}${urlObj.pathname}`;\n } catch (error) {\n console.warn('[Aegis URL Parser] stripQueryParameters failed:', error);\n return url;\n }\n}\n\nexport interface AdClickIDs {\n gclid?: string;\n fbclid?: string;\n msclkid?: string;\n ctwa_clid?: string;\n ttclid?: string;\n li_fat_id?: string;\n}\n\nexport function parseAdClickIDs(url?: string): AdClickIDs {\n try {\n const searchParams = url\n ? new URL(url).searchParams\n : new URLSearchParams(window.location.search);\n\n const adClickIDs: AdClickIDs = {};\n\n const clickIDKeys: Array<keyof AdClickIDs> = [\n 'gclid',\n 'fbclid',\n 'msclkid',\n 'ctwa_clid',\n 'ttclid',\n 'li_fat_id',\n ];\n\n clickIDKeys.forEach((key) => {\n const value = searchParams.get(key);\n if (value) {\n adClickIDs[key] = value;\n }\n });\n\n return adClickIDs;\n } catch (error) {\n console.warn('[Aegis URL Parser] parseAdClickIDs failed:', error);\n return {};\n }\n}\n\nexport function hasAdClickIDs(adClickIDs: AdClickIDs): boolean {\n return Object.keys(adClickIDs).length > 0;\n}\n","import { EventContext } from '../types/events';\nimport { parseUTMParameters } from './url-parser';\nimport { AegisConfigInternal } from '../types/config';\nimport type { SessionManager } from '../core/session';\n\nexport function buildContext(config: AegisConfigInternal, session?: SessionManager): EventContext {\n const utm = config.capture_utm ? parseUTMParameters() : undefined;\n const device = detectDevice();\n const os = detectOS();\n const browser = detectBrowser();\n const network = detectNetworkInfo();\n\n const adClickIDs = session?.getAdClickIDs();\n const landingPage = session?.getLandingPage();\n\n return {\n library: {\n name: '@aegis/web-sdk',\n version: '1.0.0',\n },\n page: {\n path: window.location.pathname,\n referrer: config.capture_referrer ? document.referrer : '',\n search: window.location.search,\n title: document.title,\n url: window.location.href,\n hash: window.location.hash,\n },\n userAgent: navigator.userAgent,\n locale: navigator.language,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n screen: {\n width: window.screen.width,\n height: window.screen.height,\n density: window.devicePixelRatio || 1,\n },\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight,\n },\n ...(utm && Object.keys(utm).length > 0 && { campaign: utm }),\n ...(adClickIDs && Object.keys(adClickIDs).length > 0 && { adClickIDs }),\n ...(landingPage && { landingPage }),\n ...(network && { network }),\n ...(device && { device }),\n ...(os && { os }),\n ...(browser && { browser }),\n ...(config.active_cell && {\n cell: {\n region: config.active_cell.region,\n endpoint: config.active_cell.url,\n },\n }),\n };\n}\n\nfunction detectDevice(): EventContext['device'] {\n const ua = navigator.userAgent;\n\n if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(ua)) {\n return { type: 'tablet' };\n }\n\n if (/Mobile|Android|iP(hone|od)|IEMobile|BlackBerry|Kindle|Silk-Accelerated|(hpw|web)OS|Opera M(obi|ini)/.test(ua)) {\n return { type: 'mobile' };\n }\n\n return { type: 'desktop' };\n}\n\nfunction detectOS(): EventContext['os'] {\n const ua = navigator.userAgent;\n\n if (/Windows NT 10/i.test(ua)) return { name: 'Windows', version: '10' };\n if (/Windows NT 6.3/i.test(ua)) return { name: 'Windows', version: '8.1' };\n if (/Windows NT 6.2/i.test(ua)) return { name: 'Windows', version: '8' };\n if (/Windows NT 6.1/i.test(ua)) return { name: 'Windows', version: '7' };\n if (/Windows/i.test(ua)) return { name: 'Windows', version: 'Unknown' };\n\n if (/Mac OS X (\\d+)[._](\\d+)/.test(ua)) {\n const match = ua.match(/Mac OS X (\\d+)[._](\\d+)/);\n return { name: 'macOS', version: `${match![1]}.${match![2]}` };\n }\n if (/Mac/i.test(ua)) return { name: 'macOS', version: 'Unknown' };\n\n if (/Android (\\d+\\.\\d+)/.test(ua)) {\n const match = ua.match(/Android (\\d+\\.\\d+)/);\n return { name: 'Android', version: match![1] };\n }\n if (/Android/i.test(ua)) return { name: 'Android', version: 'Unknown' };\n\n if (/iPhone OS (\\d+)_(\\d+)/.test(ua)) {\n const match = ua.match(/iPhone OS (\\d+)_(\\d+)/);\n return { name: 'iOS', version: `${match![1]}.${match![2]}` };\n }\n if (/iPad.*OS (\\d+)_(\\d+)/.test(ua)) {\n const match = ua.match(/iPad.*OS (\\d+)_(\\d+)/);\n return { name: 'iOS', version: `${match![1]}.${match![2]}` };\n }\n if (/iPhone|iPad/i.test(ua)) return { name: 'iOS', version: 'Unknown' };\n\n if (/Linux/i.test(ua)) return { name: 'Linux', version: 'Unknown' };\n\n return { name: 'Unknown', version: 'Unknown' };\n}\n\nfunction detectBrowser(): EventContext['browser'] {\n const ua = navigator.userAgent;\n\n if (/Edg\\/(\\d+\\.\\d+)/.test(ua)) {\n const match = ua.match(/Edg\\/(\\d+\\.\\d+)/);\n return { name: 'Edge', version: match![1] };\n }\n\n if (/Chrome\\/(\\d+\\.\\d+)/.test(ua) && !/Edg/.test(ua)) {\n const match = ua.match(/Chrome\\/(\\d+\\.\\d+)/);\n return { name: 'Chrome', version: match![1] };\n }\n\n if (/Firefox\\/(\\d+\\.\\d+)/.test(ua)) {\n const match = ua.match(/Firefox\\/(\\d+\\.\\d+)/);\n return { name: 'Firefox', version: match![1] };\n }\n\n if (/Safari\\/(\\d+\\.\\d+)/.test(ua) && !/Chrome/.test(ua)) {\n const match = ua.match(/Version\\/(\\d+\\.\\d+)/);\n return { name: 'Safari', version: match ? match[1] : 'Unknown' };\n }\n\n if (/MSIE (\\d+\\.\\d+)/.test(ua) || /Trident\\//.test(ua)) {\n const match = ua.match(/MSIE (\\d+\\.\\d+)/) || ua.match(/rv:(\\d+\\.\\d+)/);\n return { name: 'Internet Explorer', version: match ? match[1] : 'Unknown' };\n }\n\n return { name: 'Unknown', version: 'Unknown' };\n}\n\nfunction detectNetworkInfo(): EventContext['network'] | undefined {\n try {\n const connection =\n (navigator as any).connection ||\n (navigator as any).mozConnection ||\n (navigator as any).webkitConnection;\n\n if (connection) {\n return {\n effectiveType: connection.effectiveType,\n downlink: connection.downlink,\n rtt: connection.rtt,\n };\n }\n } catch (error) {\n console.warn('[Aegis Device] detectNetworkInfo failed:', error);\n }\n\n return undefined;\n}\n\nexport function isBot(): boolean {\n const ua = navigator.userAgent.toLowerCase();\n const botPatterns = [\n 'bot',\n 'crawl',\n 'spider',\n 'slurp',\n 'mediapartners',\n 'googlebot',\n 'bingbot',\n 'yahoo',\n 'duckduckbot',\n 'baiduspider',\n 'yandex',\n 'facebookexternalhit',\n 'linkedinbot',\n 'twitterbot',\n 'slackbot',\n 'telegrambot',\n 'whatsapp',\n 'pingdom',\n 'uptimerobot',\n ];\n\n return botPatterns.some((pattern) => ua.includes(pattern));\n}\n","import { Plugin } from '../types/plugin';\nimport { logger } from '../utils/logger';\n\nexport class PluginRegistry {\n private plugins: Map<string, Plugin> = new Map();\n\n register(plugin: Plugin): void {\n if (this.plugins.has(plugin.name)) {\n logger.warn(`Plugin \"${plugin.name}\" already registered, skipping`);\n return;\n }\n\n this.plugins.set(plugin.name, plugin);\n logger.info(`Plugin registered: ${plugin.name} v${plugin.version}`);\n }\n\n unregister(pluginName: string): void {\n const plugin = this.plugins.get(pluginName);\n\n if (!plugin) {\n logger.warn(`Plugin \"${pluginName}\" not found`);\n return;\n }\n\n if (plugin.destroy) {\n try {\n plugin.destroy();\n } catch (error) {\n logger.error(`Error destroying plugin \"${pluginName}\":`, error);\n }\n }\n\n this.plugins.delete(pluginName);\n logger.info(`Plugin unregistered: ${pluginName}`);\n }\n\n get(pluginName: string): Plugin | undefined {\n return this.plugins.get(pluginName);\n }\n\n getAll(): Plugin[] {\n return Array.from(this.plugins.values());\n }\n\n async executeHook<T = any>(\n hookName: keyof Plugin,\n ...args: any[]\n ): Promise<T | undefined> {\n for (const plugin of this.plugins.values()) {\n const hook = plugin[hookName];\n\n if (typeof hook === 'function') {\n try {\n const result = await (hook as Function).apply(plugin, args);\n\n if (result !== undefined) {\n return result as T;\n }\n } catch (error) {\n logger.error(\n `Error executing ${String(hookName)} in plugin \"${plugin.name}\":`,\n error\n );\n\n if (plugin.onError) {\n try {\n plugin.onError(error as Error, { hookName, args });\n } catch (onErrorError) {\n logger.error(\n `Error in onError handler for plugin \"${plugin.name}\":`,\n onErrorError\n );\n }\n }\n }\n }\n }\n\n return undefined;\n }\n\n async executeHookChain<T = any>(\n hookName: keyof Plugin,\n initialValue: T,\n ...additionalArgs: any[]\n ): Promise<T> {\n let value = initialValue;\n\n for (const plugin of this.plugins.values()) {\n const hook = plugin[hookName];\n\n if (typeof hook === 'function') {\n try {\n const result = await (hook as Function).apply(plugin, [\n value,\n ...additionalArgs,\n ]);\n\n if (result !== undefined && result !== null) {\n value = result;\n }\n } catch (error) {\n logger.error(\n `Error executing ${String(hookName)} in plugin \"${plugin.name}\":`,\n error\n );\n\n if (plugin.onError) {\n try {\n plugin.onError(error as Error, { hookName, value, additionalArgs });\n } catch (onErrorError) {\n logger.error(\n `Error in onError handler for plugin \"${plugin.name}\":`,\n onErrorError\n );\n }\n }\n }\n }\n }\n\n return value;\n }\n\n async executeHookParallel<T = any>(\n hookName: keyof Plugin,\n ...args: any[]\n ): Promise<T[]> {\n const promises: Promise<T>[] = [];\n\n for (const plugin of this.plugins.values()) {\n const hook = plugin[hookName];\n\n if (typeof hook === 'function') {\n const promise = (async () => {\n try {\n return await (hook as Function).apply(plugin, args);\n } catch (error) {\n logger.error(\n `Error executing ${String(hookName)} in plugin \"${plugin.name}\":`,\n error\n );\n\n if (plugin.onError) {\n try {\n plugin.onError(error as Error, { hookName, args });\n } catch (onErrorError) {\n logger.error(\n `Error in onError handler for plugin \"${plugin.name}\":`,\n onErrorError\n );\n }\n }\n\n return undefined;\n }\n })();\n\n promises.push(promise);\n }\n }\n\n const results = await Promise.all(promises);\n return results.filter((r) => r !== undefined) as T[];\n }\n\n clear(): void {\n for (const plugin of this.plugins.values()) {\n if (plugin.destroy) {\n try {\n plugin.destroy();\n } catch (error) {\n logger.error(`Error destroying plugin \"${plugin.name}\":`, error);\n }\n }\n }\n\n this.plugins.clear();\n logger.info('All plugins cleared');\n }\n}\n","import { Storage } from './storage';\nimport { logger } from './logger';\n\nexport type ConsentCategory =\n | 'analytics'\n | 'marketing'\n | 'functional'\n | 'necessary';\n\nexport interface ConsentPreferences {\n analytics: boolean;\n marketing: boolean;\n functional: boolean;\n necessary: boolean;\n}\n\nexport type ConsentStatus = 'granted' | 'denied' | 'pending';\n\nexport interface ConsentManagerConfig {\n defaultConsent?: Partial<ConsentPreferences>;\n waitForConsent?: boolean;\n consentStorageKey?: string;\n}\n\nexport class ConsentManager {\n private storage: Storage;\n private config: Required<ConsentManagerConfig>;\n private preferences: ConsentPreferences;\n private listeners: Array<(preferences: ConsentPreferences) => void> = [];\n\n constructor(storage: Storage, config: ConsentManagerConfig = {}) {\n this.storage = storage;\n this.config = {\n defaultConsent: config.defaultConsent || {},\n waitForConsent: config.waitForConsent ?? false,\n consentStorageKey: config.consentStorageKey || 'aegis_consent',\n };\n\n this.preferences = this.loadPreferences();\n }\n\n private loadPreferences(): ConsentPreferences {\n const stored = this.storage.get(this.config.consentStorageKey);\n\n if (stored) {\n try {\n const parsed = JSON.parse(stored);\n logger.info('Loaded consent preferences:', parsed);\n return this.mergeWithDefaults(parsed);\n } catch (error) {\n logger.warn('Failed to parse consent preferences:', error);\n }\n }\n\n return this.getDefaultPreferences();\n }\n\n private getDefaultPreferences(): ConsentPreferences {\n return {\n analytics: this.config.defaultConsent.analytics ?? false,\n marketing: this.config.defaultConsent.marketing ?? false,\n functional: this.config.defaultConsent.functional ?? true,\n necessary: true,\n };\n }\n\n private mergeWithDefaults(\n preferences: Partial<ConsentPreferences>\n ): ConsentPreferences {\n return {\n necessary: true,\n analytics: preferences.analytics ?? this.config.defaultConsent.analytics ?? false,\n marketing: preferences.marketing ?? this.config.defaultConsent.marketing ?? false,\n functional: preferences.functional ?? this.config.defaultConsent.functional ?? true,\n };\n }\n\n private savePreferences(): void {\n try {\n this.storage.set(\n this.config.consentStorageKey,\n JSON.stringify(this.preferences),\n 365\n );\n logger.info('Saved consent preferences:', this.preferences);\n } catch (error) {\n logger.error('Failed to save consent preferences:', error);\n }\n }\n\n setConsent(preferences: Partial<ConsentPreferences>): void {\n const updated = { ...this.preferences, ...preferences };\n updated.necessary = true;\n\n this.preferences = updated;\n this.savePreferences();\n this.notifyListeners();\n\n logger.info('Consent updated:', this.preferences);\n }\n\n grantAll(): void {\n this.setConsent({\n analytics: true,\n marketing: true,\n functional: true,\n necessary: true,\n });\n }\n\n denyAll(): void {\n this.setConsent({\n analytics: false,\n marketing: false,\n functional: false,\n necessary: true,\n });\n }\n\n hasConsent(category: ConsentCategory): boolean {\n return this.preferences[category];\n }\n\n getPreferences(): ConsentPreferences {\n return { ...this.preferences };\n }\n\n getStatus(category: ConsentCategory): ConsentStatus {\n if (this.hasConsent(category)) {\n return 'granted';\n }\n\n const stored = this.storage.get(this.config.consentStorageKey);\n if (!stored && this.config.waitForConsent) {\n return 'pending';\n }\n\n return 'denied';\n }\n\n isAnalyticsEnabled(): boolean {\n return this.hasConsent('analytics');\n }\n\n isMarketingEnabled(): boolean {\n return this.hasConsent('marketing');\n }\n\n onChange(callback: (preferences: ConsentPreferences) => void): () => void {\n this.listeners.push(callback);\n\n return () => {\n const index = this.listeners.indexOf(callback);\n if (index > -1) {\n this.listeners.splice(index, 1);\n }\n };\n }\n\n private notifyListeners(): void {\n this.listeners.forEach((listener) => {\n try {\n listener(this.getPreferences());\n } catch (error) {\n logger.error('Consent listener error:', error);\n }\n });\n }\n\n reset(): void {\n this.storage.remove(this.config.consentStorageKey);\n this.preferences = this.getDefaultPreferences();\n this.notifyListeners();\n logger.info('Consent preferences reset');\n }\n\n integrateOneTrust(): void {\n if (typeof window === 'undefined') return;\n\n const oneTrust = (window as any).OneTrust;\n if (!oneTrust) {\n logger.warn('OneTrust not detected');\n return;\n }\n\n const syncWithOneTrust = () => {\n const activeGroups = (window as any).OnetrustActiveGroups || '';\n\n this.setConsent({\n necessary: true,\n functional: activeGroups.includes('C0003'),\n analytics: activeGroups.includes('C0002'),\n marketing: activeGroups.includes('C0004'),\n });\n\n logger.info('Synced with OneTrust consent');\n };\n\n if ((window as any).OptanonWrapper) {\n const originalWrapper = (window as any).OptanonWrapper;\n (window as any).OptanonWrapper = function () {\n originalWrapper();\n syncWithOneTrust();\n };\n } else {\n (window as any).OptanonWrapper = syncWithOneTrust;\n }\n\n syncWithOneTrust();\n }\n\n integrateCookiebot(): void {\n if (typeof window === 'undefined') return;\n\n const cookiebot = (window as any).Cookiebot;\n if (!cookiebot) {\n logger.warn('Cookiebot not detected');\n return;\n }\n\n const syncWithCookiebot = () => {\n const consent = cookiebot.consent || {};\n\n this.setConsent({\n necessary: true,\n functional: consent.preferences || false,\n analytics: consent.statistics || false,\n marketing: consent.marketing || false,\n });\n\n logger.info('Synced with Cookiebot consent');\n };\n\n window.addEventListener('CookiebotOnAccept', syncWithCookiebot);\n window.addEventListener('CookiebotOnDecline', syncWithCookiebot);\n\n if (cookiebot.consent) {\n syncWithCookiebot();\n }\n }\n\n integrateGoogleConsentMode(): void {\n if (typeof window === 'undefined') return;\n\n const gtag = (window as any).gtag;\n if (!gtag) {\n logger.warn('Google Tag Manager not detected');\n return;\n }\n\n const updateGoogleConsent = () => {\n gtag('consent', 'update', {\n ad_storage: this.preferences.marketing ? 'granted' : 'denied',\n analytics_storage: this.preferences.analytics ? 'granted' : 'denied',\n ad_user_data: this.preferences.marketing ? 'granted' : 'denied',\n ad_personalization: this.preferences.marketing ? 'granted' : 'denied',\n functionality_storage: this.preferences.functional ? 'granted' : 'denied',\n personalization_storage: this.preferences.functional ? 'granted' : 'denied',\n security_storage: 'granted',\n });\n\n logger.info('Updated Google Consent Mode');\n };\n\n this.onChange(updateGoogleConsent);\n updateGoogleConsent();\n }\n}\n","import {\n AegisConfig,\n AegisConfigInternal,\n DEFAULT_CONFIG,\n CellEndpoint,\n} from '../types/config';\nimport {\n TrackEvent,\n IdentifyEvent,\n PageEvent,\n GroupEvent,\n AliasEvent,\n AegisEvent,\n} from '../types/events';\nimport { Plugin } from '../types/plugin';\nimport { Identity } from '../utils/identity';\nimport { SessionManager } from './session';\nimport { EventQueue } from './queue';\nimport { Transport } from './transport';\nimport { Storage } from '../utils/storage';\nimport { buildContext, isBot } from '../utils/device';\nimport { generateMessageId } from '../utils/uuid';\nimport { logger } from '../utils/logger';\nimport { PluginRegistry } from '../plugins/registry';\nimport { ConsentManager, ConsentPreferences, ConsentCategory } from '../utils/consent';\nimport { parseAdClickIDs, hasAdClickIDs } from '../utils/url-parser';\n\nexport class Aegis {\n private config: AegisConfigInternal | null = null;\n private storage!: Storage;\n private identity!: Identity;\n private session: SessionManager | null = null;\n private queue: EventQueue | null = null;\n private transport: Transport | null = null;\n private plugins: PluginRegistry = new PluginRegistry();\n private initPromise: Promise<void> | null = null;\n private consent: ConsentManager | null = null;\n\n async init(\n writeKey: string,\n config?: Partial<AegisConfig>\n ): Promise<void> {\n if (this.initPromise) {\n return this.initPromise;\n }\n\n this.initPromise = this._init(writeKey, config);\n return this.initPromise;\n }\n\n private async _init(\n writeKey: string,\n config?: Partial<AegisConfig>\n ): Promise<void> {\n if (this.config?.initialized) {\n logger.warn('SDK already initialized');\n return;\n }\n\n if (this.shouldRespectDNT(config)) {\n logger.info('Do Not Track is enabled, SDK disabled');\n return;\n }\n\n if (isBot()) {\n logger.info('Bot detected, SDK disabled');\n return;\n }\n\n this.config = this.buildConfig(writeKey, config);\n\n if (this.config.debug) {\n logger.enable();\n }\n\n logger.info('Initializing Aegis SDK...', this.config);\n\n this.storage = new Storage({\n cookieDomain: this.config.cookie_domain,\n secureCookie: this.config.secure_cookie,\n crossDomain: this.config.cross_domain_tracking,\n });\n\n this.identity = new Identity(this.storage);\n\n this.consent = new ConsentManager(this.storage, {\n defaultConsent: this.config.default_consent,\n waitForConsent: this.config.wait_for_consent,\n });\n\n if (this.config.integrate_onetrust) {\n this.consent.integrateOneTrust();\n }\n\n if (this.config.integrate_cookiebot) {\n this.consent.integrateCookiebot();\n }\n\n if (this.config.integrate_google_consent_mode) {\n this.consent.integrateGoogleConsentMode();\n }\n\n this.session = new SessionManager(\n this.storage,\n this.config.session_timeout\n );\n\n this.captureAdClickIDsOnInit();\n\n this.transport = new Transport(\n {\n writeKey: this.config.write_key,\n apiHost: this.config.api_host,\n cellEndpoints: this.config.cell_endpoints,\n preferredRegion: this.config.preferred_region,\n autoRegionDetection: this.config.auto_region_detection,\n requestTimeout: this.config.request_timeout,\n retryFailedRequests: this.config.retry_failed_requests,\n maxRetries: this.config.max_retries,\n retryBackoffMultiplier: this.config.retry_backoff_multiplier,\n },\n this.storage\n );\n\n this.config.active_cell = this.transport.getActiveCell();\n\n this.queue = new EventQueue(\n {\n batchSize: this.config.batch_size,\n batchInterval: this.config.batch_interval,\n enableOfflineMode: this.config.enable_offline_mode,\n maxOfflineEvents: this.config.max_offline_events,\n },\n this.transport,\n this.storage\n );\n\n await this.initializePlugins();\n\n if (this.config.auto_page_view) {\n this.page();\n }\n\n logger.info('Aegis SDK initialized successfully');\n }\n\n private buildConfig(\n writeKey: string,\n config?: Partial<AegisConfig>\n ): AegisConfigInternal {\n return {\n ...DEFAULT_CONFIG,\n ...config,\n write_key: writeKey,\n initialized: true,\n } as AegisConfigInternal;\n }\n\n private shouldRespectDNT(config?: Partial<AegisConfig>): boolean {\n const respectDNT = config?.respect_dnt !== false;\n if (!respectDNT) return false;\n\n const dnt =\n navigator.doNotTrack ||\n (window as any).doNotTrack ||\n (navigator as any).msDoNotTrack;\n\n return dnt === '1' || dnt === 'yes';\n }\n\n private captureAdClickIDsOnInit(): void {\n if (!this.session) return;\n\n const adClickIDs = parseAdClickIDs();\n\n if (hasAdClickIDs(adClickIDs)) {\n this.session.setAdClickIDs(adClickIDs, window.location.href);\n logger.info('Ad click IDs captured on page load:', adClickIDs);\n }\n }\n\n private async initializePlugins(): Promise<void> {\n if (!this.config) return;\n\n for (const pluginName of this.config.plugins) {\n logger.debug(`Initializing plugin: ${pluginName}`);\n }\n\n await this.plugins.executeHook('init', this.config);\n }\n\n use(plugin: Plugin): void {\n this.plugins.register(plugin);\n\n if (this.config?.initialized && plugin.init) {\n Promise.resolve(plugin.init(this.config)).catch((error: any) => {\n logger.error(`Failed to initialize plugin \"${plugin.name}\":`, error);\n });\n }\n }\n\n track(eventName: string, properties?: Record<string, any>): void {\n if (!this.assertInitialized()) return;\n\n const event: TrackEvent = {\n type: 'track',\n event: eventName,\n properties: properties || {},\n messageId: generateMessageId(),\n timestamp: new Date().toISOString(),\n anonymousId: this.identity.getAnonymousId(),\n userId: this.identity.getUserId() || undefined,\n sessionId: this.session!.getSessionId(),\n context: buildContext(this.config!, this.session!),\n };\n\n this.captureEvent(event);\n }\n\n identify(userId: string, traits?: Record<string, any>): void {\n if (!this.assertInitialized()) return;\n\n this.identity.setUserId(userId, traits);\n\n const event: IdentifyEvent = {\n type: 'identify',\n traits: traits || {},\n messageId: generateMessageId(),\n timestamp: new Date().toISOString(),\n anonymousId: this.identity.getAnonymousId(),\n userId: userId,\n sessionId: this.session!.getSessionId(),\n context: buildContext(this.config!, this.session!),\n };\n\n this.captureEvent(event);\n }\n\n page(name?: string, properties?: Record<string, any>): void {\n if (!this.assertInitialized()) return;\n\n const event: PageEvent = {\n type: 'page',\n name: name || document.title,\n properties: properties || {},\n messageId: generateMessageId(),\n timestamp: new Date().toISOString(),\n anonymousId: this.identity.getAnonymousId(),\n userId: this.identity.getUserId() || undefined,\n sessionId: this.session!.getSessionId(),\n context: buildContext(this.config!, this.session!),\n };\n\n this.captureEvent(event);\n }\n\n group(groupId: string, traits?: Record<string, any>): void {\n if (!this.assertInitialized()) return;\n\n const event: GroupEvent = {\n type: 'group',\n groupId,\n traits: traits || {},\n messageId: generateMessageId(),\n timestamp: new Date().toISOString(),\n anonymousId: this.identity.getAnonymousId(),\n userId: this.identity.getUserId() || undefined,\n sessionId: this.session!.getSessionId(),\n context: buildContext(this.config!, this.session!),\n };\n\n this.captureEvent(event);\n }\n\n alias(newUserId: string): void {\n if (!this.assertInitialized()) return;\n\n const { previousId } = this.identity.alias(newUserId);\n\n const event: AliasEvent = {\n type: 'alias',\n previousId,\n messageId: generateMessageId(),\n timestamp: new Date().toISOString(),\n anonymousId: this.identity.getAnonymousId(),\n userId: newUserId,\n sessionId: this.session!.getSessionId(),\n context: buildContext(this.config!, this.session!),\n };\n\n this.captureEvent(event);\n }\n\n private async captureEvent(event: AegisEvent): Promise<void> {\n if (this.config?.enable_consent_mode && this.consent) {\n if (event.type === 'track' || event.type === 'page') {\n if (!this.consent.hasConsent('analytics')) {\n logger.debug('Event blocked: analytics consent not granted');\n return;\n }\n }\n }\n\n logger.debug('Capturing event:', event);\n\n const transformedEvent = await this.plugins.executeHookChain(\n 'beforeEventCapture',\n event\n );\n\n if (!transformedEvent) {\n logger.debug('Event cancelled by plugin');\n return;\n }\n\n this.queue!.push(transformedEvent);\n this.session!.incrementEventCount();\n\n await this.plugins.executeHook('afterEventCapture', transformedEvent);\n }\n\n reset(): void {\n if (!this.assertInitialized()) return;\n\n this.identity.reset();\n logger.info('User identity reset');\n }\n\n async flush(): Promise<void> {\n if (!this.assertInitialized()) return;\n\n await this.queue!.flush();\n }\n\n getAnonymousId(): string | null {\n if (!this.identity) return null;\n return this.identity.getAnonymousId();\n }\n\n getUserId(): string | null {\n if (!this.identity) return null;\n return this.identity.getUserId();\n }\n\n getSessionId(): string | null {\n if (!this.session) return null;\n return this.session.getSessionId();\n }\n\n debug(enable: boolean = true): void {\n if (enable) {\n logger.enable();\n } else {\n logger.disable();\n }\n\n if (this.config) {\n this.config.debug = enable;\n }\n }\n\n setCell(cellEndpoint: CellEndpoint): void {\n if (!this.config) {\n logger.warn('SDK not initialized');\n return;\n }\n\n const existingCell = this.config.cell_endpoints.find(\n (c) => c.region === cellEndpoint.region\n );\n\n if (existingCell) {\n Object.assign(existingCell, cellEndpoint);\n } else {\n this.config.cell_endpoints.push(cellEndpoint);\n }\n\n logger.info('Cell endpoint configured:', cellEndpoint);\n }\n\n getCellInfo() {\n if (!this.transport) return null;\n\n return {\n activeCell: this.transport.getActiveCell(),\n latencies: this.transport.getRegionLatencies(),\n };\n }\n\n setConsent(preferences: Partial<ConsentPreferences>): void {\n if (!this.consent) {\n logger.warn('Consent manager not initialized');\n return;\n }\n\n this.consent.setConsent(preferences);\n logger.info('Consent preferences updated');\n }\n\n grantConsent(category?: ConsentCategory): void {\n if (!this.consent) {\n logger.warn('Consent manager not initialized');\n return;\n }\n\n if (category) {\n this.consent.setConsent({ [category]: true });\n } else {\n this.consent.grantAll();\n }\n }\n\n denyConsent(category?: ConsentCategory): void {\n if (!this.consent) {\n logger.warn('Consent manager not initialized');\n return;\n }\n\n if (category) {\n this.consent.setConsent({ [category]: false });\n } else {\n this.consent.denyAll();\n }\n }\n\n hasConsent(category: ConsentCategory): boolean {\n if (!this.consent) {\n return true;\n }\n\n return this.consent.hasConsent(category);\n }\n\n getConsentPreferences(): ConsentPreferences | null {\n if (!this.consent) {\n return null;\n }\n\n return this.consent.getPreferences();\n }\n\n onConsentChange(callback: (preferences: ConsentPreferences) => void): () => void {\n if (!this.consent) {\n logger.warn('Consent manager not initialized');\n return () => {};\n }\n\n return this.consent.onChange(callback);\n }\n\n private assertInitialized(): boolean {\n if (!this.config?.initialized) {\n logger.warn('SDK not initialized. Call aegis.init() first.');\n return false;\n }\n return true;\n }\n\n destroy(): void {\n if (this.queue) {\n this.queue.destroy();\n }\n\n if (this.session) {\n this.session.destroy();\n }\n\n if (this.transport) {\n this.transport.destroy();\n }\n\n this.plugins.clear();\n\n logger.info('SDK destroyed');\n }\n}\n"],"names":[],"mappings":"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"}