@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.
- package/README.md +103 -0
- package/dist/aegis.min.js +1 -1
- package/dist/aegis.min.js.map +1 -1
- package/dist/{analytics-B11keZ55.mjs → analytics-CNtfsb7E.mjs} +214 -2
- package/dist/analytics-CNtfsb7E.mjs.map +1 -0
- package/dist/core/analytics.d.ts +13 -0
- package/dist/core/analytics.d.ts.map +1 -1
- package/dist/ecommerce/index.d.ts +46 -0
- package/dist/ecommerce/index.d.ts.map +1 -0
- package/dist/ecommerce/types.d.ts +77 -0
- package/dist/ecommerce/types.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +70 -1
- package/dist/index.js.map +1 -1
- package/dist/placements/AegisPlacementManager.d.ts +1 -1
- package/dist/placements/AegisPlacementManager.d.ts.map +1 -1
- package/dist/react.js +1 -1
- package/package.json +1 -1
- package/dist/analytics-B11keZ55.mjs.map +0 -1
|
@@ -1016,7 +1016,7 @@ function buildContext(config, session) {
|
|
|
1016
1016
|
const landingPage = session == null ? void 0 : session.getLandingPage();
|
|
1017
1017
|
return {
|
|
1018
1018
|
library: {
|
|
1019
|
-
name: "@
|
|
1019
|
+
name: "@active-reach/web-sdk",
|
|
1020
1020
|
version: "1.0.0"
|
|
1021
1021
|
},
|
|
1022
1022
|
page: {
|
|
@@ -1495,6 +1495,163 @@ class ConsentManager {
|
|
|
1495
1495
|
updateGoogleConsent();
|
|
1496
1496
|
}
|
|
1497
1497
|
}
|
|
1498
|
+
function sumItems(products) {
|
|
1499
|
+
return products.reduce((sum, p) => sum + (p.quantity ?? 1), 0);
|
|
1500
|
+
}
|
|
1501
|
+
function mapProducts(products) {
|
|
1502
|
+
return products.map((p) => ({
|
|
1503
|
+
product_id: p.product_id,
|
|
1504
|
+
sku: p.sku ?? p.product_id,
|
|
1505
|
+
name: p.name,
|
|
1506
|
+
price: p.price,
|
|
1507
|
+
quantity: p.quantity ?? 1,
|
|
1508
|
+
currency: p.currency,
|
|
1509
|
+
category: p.category,
|
|
1510
|
+
brand: p.brand,
|
|
1511
|
+
variant_id: p.variant_id,
|
|
1512
|
+
variant_label: p.variant_label,
|
|
1513
|
+
position: p.position
|
|
1514
|
+
}));
|
|
1515
|
+
}
|
|
1516
|
+
class EcommerceTracker {
|
|
1517
|
+
constructor(aegis) {
|
|
1518
|
+
this.aegis = aegis;
|
|
1519
|
+
}
|
|
1520
|
+
// -- Product Discovery --
|
|
1521
|
+
productViewed(product) {
|
|
1522
|
+
this.aegis.track("product_viewed", {
|
|
1523
|
+
product_id: product.product_id,
|
|
1524
|
+
sku: product.sku ?? product.product_id,
|
|
1525
|
+
name: product.name,
|
|
1526
|
+
price: product.price,
|
|
1527
|
+
currency: product.currency ?? "INR",
|
|
1528
|
+
category: product.category,
|
|
1529
|
+
brand: product.brand,
|
|
1530
|
+
variant_id: product.variant_id,
|
|
1531
|
+
variant_label: product.variant_label,
|
|
1532
|
+
image_url: product.image_url,
|
|
1533
|
+
url: product.url
|
|
1534
|
+
});
|
|
1535
|
+
}
|
|
1536
|
+
productListViewed(list) {
|
|
1537
|
+
this.aegis.track("product_list_viewed", {
|
|
1538
|
+
list_id: list.list_id,
|
|
1539
|
+
list_name: list.list_name,
|
|
1540
|
+
category: list.category,
|
|
1541
|
+
products: mapProducts(list.products)
|
|
1542
|
+
});
|
|
1543
|
+
}
|
|
1544
|
+
searchPerformed(search) {
|
|
1545
|
+
this.aegis.track("search_performed", {
|
|
1546
|
+
query: search.query,
|
|
1547
|
+
results_count: search.results_count,
|
|
1548
|
+
filters: search.filters
|
|
1549
|
+
});
|
|
1550
|
+
}
|
|
1551
|
+
// -- Cart --
|
|
1552
|
+
addToCart(product) {
|
|
1553
|
+
this.aegis.track("cart_item_added", {
|
|
1554
|
+
product_id: product.product_id,
|
|
1555
|
+
sku: product.sku ?? product.product_id,
|
|
1556
|
+
name: product.name,
|
|
1557
|
+
price: product.price,
|
|
1558
|
+
quantity: product.quantity ?? 1,
|
|
1559
|
+
currency: product.currency ?? "INR",
|
|
1560
|
+
category: product.category,
|
|
1561
|
+
brand: product.brand,
|
|
1562
|
+
variant_id: product.variant_id,
|
|
1563
|
+
variant_label: product.variant_label
|
|
1564
|
+
});
|
|
1565
|
+
}
|
|
1566
|
+
removeFromCart(product) {
|
|
1567
|
+
this.aegis.track("cart_item_removed", {
|
|
1568
|
+
product_id: product.product_id,
|
|
1569
|
+
sku: product.sku ?? product.product_id,
|
|
1570
|
+
name: product.name,
|
|
1571
|
+
price: product.price,
|
|
1572
|
+
quantity: product.quantity ?? 1,
|
|
1573
|
+
currency: product.currency ?? "INR",
|
|
1574
|
+
variant_id: product.variant_id
|
|
1575
|
+
});
|
|
1576
|
+
}
|
|
1577
|
+
cartViewed(cart) {
|
|
1578
|
+
this.aegis.track("cart_viewed", {
|
|
1579
|
+
cart_id: cart.cart_id,
|
|
1580
|
+
value: cart.value,
|
|
1581
|
+
currency: cart.currency ?? "INR",
|
|
1582
|
+
num_items: sumItems(cart.products),
|
|
1583
|
+
products: mapProducts(cart.products)
|
|
1584
|
+
});
|
|
1585
|
+
}
|
|
1586
|
+
// -- Checkout --
|
|
1587
|
+
checkoutStarted(checkout) {
|
|
1588
|
+
this.aegis.track("checkout_started", {
|
|
1589
|
+
checkout_id: checkout.checkout_id,
|
|
1590
|
+
value: checkout.value,
|
|
1591
|
+
currency: checkout.currency ?? "INR",
|
|
1592
|
+
num_items: sumItems(checkout.products),
|
|
1593
|
+
coupon: checkout.coupon,
|
|
1594
|
+
shipping: checkout.shipping,
|
|
1595
|
+
tax: checkout.tax,
|
|
1596
|
+
products: mapProducts(checkout.products)
|
|
1597
|
+
});
|
|
1598
|
+
}
|
|
1599
|
+
checkoutStep(step, options) {
|
|
1600
|
+
this.aegis.track("checkout_step", {
|
|
1601
|
+
step,
|
|
1602
|
+
...options
|
|
1603
|
+
});
|
|
1604
|
+
}
|
|
1605
|
+
// -- Order --
|
|
1606
|
+
orderCompleted(order) {
|
|
1607
|
+
this.aegis.track("order_completed", {
|
|
1608
|
+
order_id: order.order_id,
|
|
1609
|
+
value: order.value,
|
|
1610
|
+
revenue: order.revenue ?? order.value,
|
|
1611
|
+
currency: order.currency ?? "INR",
|
|
1612
|
+
num_items: sumItems(order.products),
|
|
1613
|
+
coupon: order.coupon,
|
|
1614
|
+
shipping: order.shipping,
|
|
1615
|
+
tax: order.tax,
|
|
1616
|
+
discount: order.discount,
|
|
1617
|
+
payment_method: order.payment_method,
|
|
1618
|
+
products: mapProducts(order.products)
|
|
1619
|
+
});
|
|
1620
|
+
}
|
|
1621
|
+
orderRefunded(orderId, value, products) {
|
|
1622
|
+
this.aegis.track("order_refunded", {
|
|
1623
|
+
order_id: orderId,
|
|
1624
|
+
value,
|
|
1625
|
+
products: products ? mapProducts(products) : void 0
|
|
1626
|
+
});
|
|
1627
|
+
}
|
|
1628
|
+
// -- Coupons --
|
|
1629
|
+
couponApplied(coupon) {
|
|
1630
|
+
this.aegis.track("coupon_applied", { ...coupon });
|
|
1631
|
+
}
|
|
1632
|
+
couponRemoved(coupon) {
|
|
1633
|
+
this.aegis.track("coupon_removed", { ...coupon });
|
|
1634
|
+
}
|
|
1635
|
+
// -- Wishlist --
|
|
1636
|
+
wishlistItemAdded(wishlist) {
|
|
1637
|
+
this.aegis.track("wishlist_item_added", {
|
|
1638
|
+
wishlist_id: wishlist.wishlist_id,
|
|
1639
|
+
wishlist_name: wishlist.wishlist_name,
|
|
1640
|
+
product_id: wishlist.product.product_id,
|
|
1641
|
+
sku: wishlist.product.sku ?? wishlist.product.product_id,
|
|
1642
|
+
name: wishlist.product.name,
|
|
1643
|
+
price: wishlist.product.price,
|
|
1644
|
+
variant_id: wishlist.product.variant_id
|
|
1645
|
+
});
|
|
1646
|
+
}
|
|
1647
|
+
// -- Promotions --
|
|
1648
|
+
promotionViewed(promo) {
|
|
1649
|
+
this.aegis.track("promotion_viewed", { ...promo });
|
|
1650
|
+
}
|
|
1651
|
+
promotionClicked(promo) {
|
|
1652
|
+
this.aegis.track("promotion_clicked", { ...promo });
|
|
1653
|
+
}
|
|
1654
|
+
}
|
|
1498
1655
|
class Aegis {
|
|
1499
1656
|
constructor() {
|
|
1500
1657
|
this.config = null;
|
|
@@ -1504,6 +1661,11 @@ class Aegis {
|
|
|
1504
1661
|
this.plugins = new PluginRegistry();
|
|
1505
1662
|
this.initPromise = null;
|
|
1506
1663
|
this.consent = null;
|
|
1664
|
+
this._ecommerce = null;
|
|
1665
|
+
this._lastPageUrl = null;
|
|
1666
|
+
this._popstateHandler = null;
|
|
1667
|
+
this._originalPushState = null;
|
|
1668
|
+
this._originalReplaceState = null;
|
|
1507
1669
|
}
|
|
1508
1670
|
async init(writeKey, config) {
|
|
1509
1671
|
if (this.initPromise) {
|
|
@@ -1583,9 +1745,51 @@ class Aegis {
|
|
|
1583
1745
|
await this.initializePlugins();
|
|
1584
1746
|
if (this.config.auto_page_view) {
|
|
1585
1747
|
this.page();
|
|
1748
|
+
this.startSPATracking();
|
|
1586
1749
|
}
|
|
1587
1750
|
logger.info("Aegis SDK initialized successfully");
|
|
1588
1751
|
}
|
|
1752
|
+
/**
|
|
1753
|
+
* SPA navigation tracking — monkey-patches pushState/replaceState and
|
|
1754
|
+
* listens for popstate to fire page() on every client-side route change.
|
|
1755
|
+
*/
|
|
1756
|
+
startSPATracking() {
|
|
1757
|
+
this._lastPageUrl = window.location.href;
|
|
1758
|
+
const onRouteChange = () => {
|
|
1759
|
+
const currentUrl = window.location.href;
|
|
1760
|
+
if (currentUrl === this._lastPageUrl) return;
|
|
1761
|
+
this._lastPageUrl = currentUrl;
|
|
1762
|
+
setTimeout(() => {
|
|
1763
|
+
this.page();
|
|
1764
|
+
}, 50);
|
|
1765
|
+
};
|
|
1766
|
+
this._popstateHandler = onRouteChange;
|
|
1767
|
+
window.addEventListener("popstate", this._popstateHandler);
|
|
1768
|
+
this._originalPushState = history.pushState.bind(history);
|
|
1769
|
+
this._originalReplaceState = history.replaceState.bind(history);
|
|
1770
|
+
history.pushState = (...args) => {
|
|
1771
|
+
this._originalPushState(...args);
|
|
1772
|
+
onRouteChange();
|
|
1773
|
+
};
|
|
1774
|
+
history.replaceState = (...args) => {
|
|
1775
|
+
this._originalReplaceState(...args);
|
|
1776
|
+
onRouteChange();
|
|
1777
|
+
};
|
|
1778
|
+
}
|
|
1779
|
+
stopSPATracking() {
|
|
1780
|
+
if (this._popstateHandler) {
|
|
1781
|
+
window.removeEventListener("popstate", this._popstateHandler);
|
|
1782
|
+
this._popstateHandler = null;
|
|
1783
|
+
}
|
|
1784
|
+
if (this._originalPushState) {
|
|
1785
|
+
history.pushState = this._originalPushState;
|
|
1786
|
+
this._originalPushState = null;
|
|
1787
|
+
}
|
|
1788
|
+
if (this._originalReplaceState) {
|
|
1789
|
+
history.replaceState = this._originalReplaceState;
|
|
1790
|
+
this._originalReplaceState = null;
|
|
1791
|
+
}
|
|
1792
|
+
}
|
|
1589
1793
|
buildConfig(writeKey, config) {
|
|
1590
1794
|
return {
|
|
1591
1795
|
...DEFAULT_CONFIG,
|
|
@@ -1833,7 +2037,14 @@ class Aegis {
|
|
|
1833
2037
|
}
|
|
1834
2038
|
return true;
|
|
1835
2039
|
}
|
|
2040
|
+
get ecommerce() {
|
|
2041
|
+
if (!this._ecommerce) {
|
|
2042
|
+
this._ecommerce = new EcommerceTracker(this);
|
|
2043
|
+
}
|
|
2044
|
+
return this._ecommerce;
|
|
2045
|
+
}
|
|
1836
2046
|
destroy() {
|
|
2047
|
+
this.stopSPATracking();
|
|
1837
2048
|
if (this.queue) {
|
|
1838
2049
|
this.queue.destroy();
|
|
1839
2050
|
}
|
|
@@ -1849,6 +2060,7 @@ class Aegis {
|
|
|
1849
2060
|
}
|
|
1850
2061
|
export {
|
|
1851
2062
|
Aegis as A,
|
|
2063
|
+
EcommerceTracker as E,
|
|
1852
2064
|
logger as l
|
|
1853
2065
|
};
|
|
1854
|
-
//# sourceMappingURL=analytics-
|
|
2066
|
+
//# sourceMappingURL=analytics-CNtfsb7E.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics-CNtfsb7E.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/ecommerce/index.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: '@active-reach/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","/**\n * E-Commerce helper methods for the Aegis SDK.\n *\n * Provides standardized e-commerce event tracking that maps to the\n * Active Reach Intelligence data governance pipeline.\n *\n * Event names follow the canonical mapper:\n * product_viewed → engagement.product_view\n * product_list_viewed → engagement.product_list_view\n * cart_item_added → cart_item_added\n * cart_item_removed → cart_item_removed\n * cart_viewed → cart_viewed\n * checkout_started → checkout_started\n * checkout_step → checkout_step\n * order_completed → transaction.purchase\n * order_refunded → transaction.refund\n * coupon_applied → coupon_applied\n * coupon_removed → coupon_removed\n * search_performed → search_performed\n * wishlist_item_added → wishlist_item_added\n * promotion_viewed → promotion_viewed\n * promotion_clicked → promotion_clicked\n */\n\nimport type { Aegis } from '../core/analytics';\nimport type {\n EcommerceProduct,\n EcommerceCart,\n EcommerceCheckout,\n EcommerceOrder,\n EcommerceCoupon,\n EcommerceSearch,\n EcommerceProductList,\n EcommerceWishlist,\n EcommercePromotion,\n} from './types';\n\nfunction sumItems(products: EcommerceProduct[]): number {\n return products.reduce((sum, p) => sum + (p.quantity ?? 1), 0);\n}\n\nfunction mapProducts(products: EcommerceProduct[]) {\n return products.map((p) => ({\n product_id: p.product_id,\n sku: p.sku ?? p.product_id,\n name: p.name,\n price: p.price,\n quantity: p.quantity ?? 1,\n currency: p.currency,\n category: p.category,\n brand: p.brand,\n variant_id: p.variant_id,\n variant_label: p.variant_label,\n position: p.position,\n }));\n}\n\nexport class EcommerceTracker {\n constructor(private aegis: Aegis) {}\n\n // -- Product Discovery --\n\n productViewed(product: EcommerceProduct): void {\n this.aegis.track('product_viewed', {\n product_id: product.product_id,\n sku: product.sku ?? product.product_id,\n name: product.name,\n price: product.price,\n currency: product.currency ?? 'INR',\n category: product.category,\n brand: product.brand,\n variant_id: product.variant_id,\n variant_label: product.variant_label,\n image_url: product.image_url,\n url: product.url,\n });\n }\n\n productListViewed(list: EcommerceProductList): void {\n this.aegis.track('product_list_viewed', {\n list_id: list.list_id,\n list_name: list.list_name,\n category: list.category,\n products: mapProducts(list.products),\n });\n }\n\n searchPerformed(search: EcommerceSearch): void {\n this.aegis.track('search_performed', {\n query: search.query,\n results_count: search.results_count,\n filters: search.filters,\n });\n }\n\n // -- Cart --\n\n addToCart(product: EcommerceProduct): void {\n this.aegis.track('cart_item_added', {\n product_id: product.product_id,\n sku: product.sku ?? product.product_id,\n name: product.name,\n price: product.price,\n quantity: product.quantity ?? 1,\n currency: product.currency ?? 'INR',\n category: product.category,\n brand: product.brand,\n variant_id: product.variant_id,\n variant_label: product.variant_label,\n });\n }\n\n removeFromCart(product: EcommerceProduct): void {\n this.aegis.track('cart_item_removed', {\n product_id: product.product_id,\n sku: product.sku ?? product.product_id,\n name: product.name,\n price: product.price,\n quantity: product.quantity ?? 1,\n currency: product.currency ?? 'INR',\n variant_id: product.variant_id,\n });\n }\n\n cartViewed(cart: EcommerceCart): void {\n this.aegis.track('cart_viewed', {\n cart_id: cart.cart_id,\n value: cart.value,\n currency: cart.currency ?? 'INR',\n num_items: sumItems(cart.products),\n products: mapProducts(cart.products),\n });\n }\n\n // -- Checkout --\n\n checkoutStarted(checkout: EcommerceCheckout): void {\n this.aegis.track('checkout_started', {\n checkout_id: checkout.checkout_id,\n value: checkout.value,\n currency: checkout.currency ?? 'INR',\n num_items: sumItems(checkout.products),\n coupon: checkout.coupon,\n shipping: checkout.shipping,\n tax: checkout.tax,\n products: mapProducts(checkout.products),\n });\n }\n\n checkoutStep(step: number, options?: Record<string, unknown>): void {\n this.aegis.track('checkout_step', {\n step,\n ...options,\n });\n }\n\n // -- Order --\n\n orderCompleted(order: EcommerceOrder): void {\n this.aegis.track('order_completed', {\n order_id: order.order_id,\n value: order.value,\n revenue: order.revenue ?? order.value,\n currency: order.currency ?? 'INR',\n num_items: sumItems(order.products),\n coupon: order.coupon,\n shipping: order.shipping,\n tax: order.tax,\n discount: order.discount,\n payment_method: order.payment_method,\n products: mapProducts(order.products),\n });\n }\n\n orderRefunded(orderId: string, value?: number, products?: EcommerceProduct[]): void {\n this.aegis.track('order_refunded', {\n order_id: orderId,\n value,\n products: products ? mapProducts(products) : undefined,\n });\n }\n\n // -- Coupons --\n\n couponApplied(coupon: EcommerceCoupon): void {\n this.aegis.track('coupon_applied', { ...coupon });\n }\n\n couponRemoved(coupon: EcommerceCoupon): void {\n this.aegis.track('coupon_removed', { ...coupon });\n }\n\n // -- Wishlist --\n\n wishlistItemAdded(wishlist: EcommerceWishlist): void {\n this.aegis.track('wishlist_item_added', {\n wishlist_id: wishlist.wishlist_id,\n wishlist_name: wishlist.wishlist_name,\n product_id: wishlist.product.product_id,\n sku: wishlist.product.sku ?? wishlist.product.product_id,\n name: wishlist.product.name,\n price: wishlist.product.price,\n variant_id: wishlist.product.variant_id,\n });\n }\n\n // -- Promotions --\n\n promotionViewed(promo: EcommercePromotion): void {\n this.aegis.track('promotion_viewed', { ...promo });\n }\n\n promotionClicked(promo: EcommercePromotion): void {\n this.aegis.track('promotion_clicked', { ...promo });\n }\n}\n\nexport type {\n EcommerceProduct,\n EcommerceCart,\n EcommerceCheckout,\n EcommerceOrder,\n EcommerceCoupon,\n EcommerceSearch,\n EcommerceProductList,\n EcommerceWishlist,\n EcommercePromotion,\n} from './types';\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';\nimport { EcommerceTracker } from '../ecommerce';\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 private _ecommerce: EcommerceTracker | null = null;\n private _lastPageUrl: string | null = null;\n private _popstateHandler: (() => void) | null = null;\n private _originalPushState: typeof history.pushState | null = null;\n private _originalReplaceState: typeof history.replaceState | 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 this.startSPATracking();\n }\n\n logger.info('Aegis SDK initialized successfully');\n }\n\n /**\n * SPA navigation tracking — monkey-patches pushState/replaceState and\n * listens for popstate to fire page() on every client-side route change.\n */\n private startSPATracking(): void {\n this._lastPageUrl = window.location.href;\n\n const onRouteChange = () => {\n // Debounce: only fire if URL actually changed\n const currentUrl = window.location.href;\n if (currentUrl === this._lastPageUrl) return;\n this._lastPageUrl = currentUrl;\n\n // Small delay to let the framework update document.title\n setTimeout(() => {\n this.page();\n }, 50);\n };\n\n // Listen for browser back/forward\n this._popstateHandler = onRouteChange;\n window.addEventListener('popstate', this._popstateHandler);\n\n // Monkey-patch pushState and replaceState\n this._originalPushState = history.pushState.bind(history);\n this._originalReplaceState = history.replaceState.bind(history);\n\n history.pushState = (...args: Parameters<typeof history.pushState>) => {\n this._originalPushState!(...args);\n onRouteChange();\n };\n\n history.replaceState = (...args: Parameters<typeof history.replaceState>) => {\n this._originalReplaceState!(...args);\n onRouteChange();\n };\n }\n\n private stopSPATracking(): void {\n if (this._popstateHandler) {\n window.removeEventListener('popstate', this._popstateHandler);\n this._popstateHandler = null;\n }\n\n if (this._originalPushState) {\n history.pushState = this._originalPushState;\n this._originalPushState = null;\n }\n\n if (this._originalReplaceState) {\n history.replaceState = this._originalReplaceState;\n this._originalReplaceState = null;\n }\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 get ecommerce(): EcommerceTracker {\n if (!this._ecommerce) {\n this._ecommerce = new EcommerceTracker(this);\n }\n return this._ecommerce;\n }\n\n destroy(): void {\n this.stopSPATracking();\n\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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"}
|
package/dist/core/analytics.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { AegisConfig, CellEndpoint } from '../types/config';
|
|
2
2
|
import { Plugin } from '../types/plugin';
|
|
3
3
|
import { ConsentPreferences, ConsentCategory } from '../utils/consent';
|
|
4
|
+
import { EcommerceTracker } from '../ecommerce';
|
|
4
5
|
export declare class Aegis {
|
|
5
6
|
private config;
|
|
6
7
|
private storage;
|
|
@@ -11,8 +12,19 @@ export declare class Aegis {
|
|
|
11
12
|
private plugins;
|
|
12
13
|
private initPromise;
|
|
13
14
|
private consent;
|
|
15
|
+
private _ecommerce;
|
|
16
|
+
private _lastPageUrl;
|
|
17
|
+
private _popstateHandler;
|
|
18
|
+
private _originalPushState;
|
|
19
|
+
private _originalReplaceState;
|
|
14
20
|
init(writeKey: string, config?: Partial<AegisConfig>): Promise<void>;
|
|
15
21
|
private _init;
|
|
22
|
+
/**
|
|
23
|
+
* SPA navigation tracking — monkey-patches pushState/replaceState and
|
|
24
|
+
* listens for popstate to fire page() on every client-side route change.
|
|
25
|
+
*/
|
|
26
|
+
private startSPATracking;
|
|
27
|
+
private stopSPATracking;
|
|
16
28
|
private buildConfig;
|
|
17
29
|
private shouldRespectDNT;
|
|
18
30
|
private captureAdClickIDsOnInit;
|
|
@@ -42,6 +54,7 @@ export declare class Aegis {
|
|
|
42
54
|
getConsentPreferences(): ConsentPreferences | null;
|
|
43
55
|
onConsentChange(callback: (preferences: ConsentPreferences) => void): () => void;
|
|
44
56
|
private assertInitialized;
|
|
57
|
+
get ecommerce(): EcommerceTracker;
|
|
45
58
|
destroy(): void;
|
|
46
59
|
}
|
|
47
60
|
//# sourceMappingURL=analytics.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/core/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAGX,YAAY,EACb,MAAM,iBAAiB,CAAC;AASzB,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAUzC,OAAO,EAAkB,kBAAkB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/core/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAGX,YAAY,EACb,MAAM,iBAAiB,CAAC;AASzB,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAUzC,OAAO,EAAkB,kBAAkB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,kBAAkB,CAAyC;IACnE,OAAO,CAAC,qBAAqB,CAA4C;IAEnE,IAAI,CACR,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC;YASF,KAAK;IAiGnB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAkCxB,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,uBAAuB;YAWjB,iBAAiB;IAU/B,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAUzB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAkBhE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAmB5D,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAkB3D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAkB1D,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;YAmBhB,YAAY;IA4B1B,KAAK,IAAI,IAAI;IAOP,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,cAAc,IAAI,MAAM,GAAG,IAAI;IAK/B,SAAS,IAAI,MAAM,GAAG,IAAI;IAK1B,YAAY,IAAI,MAAM,GAAG,IAAI;IAK7B,KAAK,CAAC,MAAM,GAAE,OAAc,GAAG,IAAI;IAYnC,OAAO,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IAmBzC,WAAW;;;;IASX,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,IAAI;IAU1D,YAAY,CAAC,QAAQ,CAAC,EAAE,eAAe,GAAG,IAAI;IAa9C,WAAW,CAAC,QAAQ,CAAC,EAAE,eAAe,GAAG,IAAI;IAa7C,UAAU,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO;IAQ9C,qBAAqB,IAAI,kBAAkB,GAAG,IAAI;IAQlD,eAAe,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,kBAAkB,KAAK,IAAI,GAAG,MAAM,IAAI;IAShF,OAAO,CAAC,iBAAiB;IAQzB,IAAI,SAAS,IAAI,gBAAgB,CAKhC;IAED,OAAO,IAAI,IAAI;CAmBhB"}
|