@qhr123/sa2kit 0.3.1 → 0.4.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.
@@ -1,5 +1,6 @@
1
1
  'use strict';
2
2
 
3
+ require('../chunk-DGUM43GV.js');
3
4
  var react = require('react');
4
5
 
5
6
  // src/analytics/types.ts
@@ -1158,19 +1159,715 @@ function useAutoTracking(analytics, options = {}) {
1158
1159
  }, [analytics, trackErrors]);
1159
1160
  }
1160
1161
 
1162
+ // src/analytics/adapters/web.ts
1163
+ var WebStorageAdapter = class {
1164
+ constructor() {
1165
+ this.EVENTS_KEY = "analytics:events";
1166
+ this.DEVICE_INFO_KEY = "analytics:device_info";
1167
+ this.SESSION_ID_KEY = "analytics:session_id";
1168
+ }
1169
+ async saveEvents(events) {
1170
+ try {
1171
+ if (typeof window !== "undefined") {
1172
+ localStorage.setItem(this.EVENTS_KEY, JSON.stringify(events));
1173
+ }
1174
+ } catch (error) {
1175
+ console.error("Failed to save events:", error);
1176
+ }
1177
+ }
1178
+ async getEvents() {
1179
+ try {
1180
+ if (typeof window !== "undefined") {
1181
+ const data = localStorage.getItem(this.EVENTS_KEY);
1182
+ return data ? JSON.parse(data) : [];
1183
+ }
1184
+ return [];
1185
+ } catch (error) {
1186
+ console.error("Failed to get events:", error);
1187
+ return [];
1188
+ }
1189
+ }
1190
+ async clearEvents() {
1191
+ try {
1192
+ if (typeof window !== "undefined") {
1193
+ localStorage.removeItem(this.EVENTS_KEY);
1194
+ }
1195
+ } catch (error) {
1196
+ console.error("Failed to clear events:", error);
1197
+ }
1198
+ }
1199
+ async saveDeviceInfo(info) {
1200
+ try {
1201
+ if (typeof window !== "undefined") {
1202
+ localStorage.setItem(this.DEVICE_INFO_KEY, JSON.stringify(info));
1203
+ }
1204
+ } catch (error) {
1205
+ console.error("Failed to save device info:", error);
1206
+ }
1207
+ }
1208
+ async getDeviceInfo() {
1209
+ try {
1210
+ if (typeof window !== "undefined") {
1211
+ const data = localStorage.getItem(this.DEVICE_INFO_KEY);
1212
+ return data ? JSON.parse(data) : null;
1213
+ }
1214
+ return null;
1215
+ } catch (error) {
1216
+ console.error("Failed to get device info:", error);
1217
+ return null;
1218
+ }
1219
+ }
1220
+ async saveSessionId(sessionId) {
1221
+ try {
1222
+ if (typeof window !== "undefined") {
1223
+ sessionStorage.setItem(this.SESSION_ID_KEY, sessionId);
1224
+ }
1225
+ } catch (error) {
1226
+ console.error("Failed to save session ID:", error);
1227
+ }
1228
+ }
1229
+ async getSessionId() {
1230
+ try {
1231
+ if (typeof window !== "undefined") {
1232
+ return sessionStorage.getItem(this.SESSION_ID_KEY);
1233
+ }
1234
+ return null;
1235
+ } catch (error) {
1236
+ console.error("Failed to get session ID:", error);
1237
+ return null;
1238
+ }
1239
+ }
1240
+ };
1241
+ var WebNetworkAdapter = class {
1242
+ async upload(url, events) {
1243
+ try {
1244
+ const response = await fetch(url, {
1245
+ method: "POST",
1246
+ headers: {
1247
+ "Content-Type": "application/json"
1248
+ },
1249
+ body: JSON.stringify({
1250
+ events,
1251
+ timestamp: Date.now()
1252
+ }),
1253
+ // 使用 keepalive 确保页面关闭时也能发送
1254
+ keepalive: true
1255
+ });
1256
+ if (response.ok) {
1257
+ const data = await response.json();
1258
+ return {
1259
+ success: true,
1260
+ message: data.message,
1261
+ code: response.status
1262
+ };
1263
+ } else {
1264
+ return {
1265
+ success: false,
1266
+ message: `HTTP ${response.status}`,
1267
+ code: response.status
1268
+ };
1269
+ }
1270
+ } catch (error) {
1271
+ return {
1272
+ success: false,
1273
+ message: error instanceof Error ? error.message : "Network error",
1274
+ code: 0
1275
+ };
1276
+ }
1277
+ }
1278
+ async isOnline() {
1279
+ if (typeof navigator !== "undefined" && "onLine" in navigator) {
1280
+ return navigator.onLine;
1281
+ }
1282
+ return true;
1283
+ }
1284
+ };
1285
+ var WebDeviceAdapter = class {
1286
+ async getDeviceInfo() {
1287
+ return {
1288
+ device_id: await this.generateDeviceId(),
1289
+ os_name: this.getOSName(),
1290
+ os_version: this.getOSVersion(),
1291
+ screen_width: typeof window !== "undefined" ? window.screen.width : 0,
1292
+ screen_height: typeof window !== "undefined" ? window.screen.height : 0,
1293
+ language: typeof navigator !== "undefined" ? navigator.language : "en",
1294
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
1295
+ device_model: this.getBrowserName(),
1296
+ device_brand: this.getBrowserVersion()
1297
+ };
1298
+ }
1299
+ async generateDeviceId() {
1300
+ if (typeof window !== "undefined") {
1301
+ let deviceId = localStorage.getItem("analytics:device_id");
1302
+ if (!deviceId) {
1303
+ deviceId = `web_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;
1304
+ localStorage.setItem("analytics:device_id", deviceId);
1305
+ }
1306
+ return deviceId;
1307
+ }
1308
+ return `web_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;
1309
+ }
1310
+ getOSName() {
1311
+ if (typeof navigator === "undefined") return "unknown";
1312
+ const userAgent = navigator.userAgent;
1313
+ if (userAgent.indexOf("Win") !== -1) return "Windows";
1314
+ if (userAgent.indexOf("Mac") !== -1) return "MacOS";
1315
+ if (userAgent.indexOf("Linux") !== -1) return "Linux";
1316
+ if (userAgent.indexOf("Android") !== -1) return "Android";
1317
+ if (userAgent.indexOf("iOS") !== -1) return "iOS";
1318
+ return "unknown";
1319
+ }
1320
+ getOSVersion() {
1321
+ if (typeof navigator === "undefined") return "unknown";
1322
+ const userAgent = navigator.userAgent;
1323
+ const match = userAgent.match(/\(([^)]+)\)/);
1324
+ return match && match[1] ? match[1] : "unknown";
1325
+ }
1326
+ getBrowserName() {
1327
+ if (typeof navigator === "undefined") return "unknown";
1328
+ const userAgent = navigator.userAgent;
1329
+ if (userAgent.indexOf("Chrome") !== -1) return "Chrome";
1330
+ if (userAgent.indexOf("Safari") !== -1) return "Safari";
1331
+ if (userAgent.indexOf("Firefox") !== -1) return "Firefox";
1332
+ if (userAgent.indexOf("Edge") !== -1) return "Edge";
1333
+ return "unknown";
1334
+ }
1335
+ getBrowserVersion() {
1336
+ if (typeof navigator === "undefined") return "unknown";
1337
+ const userAgent = navigator.userAgent;
1338
+ const match = userAgent.match(/(Chrome|Safari|Firefox|Edge)\/(\d+)/);
1339
+ return match && match[2] ? match[2] : "unknown";
1340
+ }
1341
+ };
1342
+ var webAdapter = {
1343
+ storage: new WebStorageAdapter(),
1344
+ network: new WebNetworkAdapter(),
1345
+ device: new WebDeviceAdapter()
1346
+ };
1347
+
1348
+ // src/analytics/adapters/mobile.ts
1349
+ var MobileStorageAdapter = class {
1350
+ // 需要注入具体的存储实现
1351
+ constructor(storage) {
1352
+ this.storage = storage;
1353
+ this.EVENTS_KEY = "@analytics:events";
1354
+ this.DEVICE_INFO_KEY = "@analytics:device_info";
1355
+ this.SESSION_ID_KEY = "@analytics:session_id";
1356
+ }
1357
+ async saveEvents(events) {
1358
+ try {
1359
+ await this.storage.setItem(this.EVENTS_KEY, JSON.stringify(events));
1360
+ } catch (error) {
1361
+ console.error("Failed to save events:", error);
1362
+ }
1363
+ }
1364
+ async getEvents() {
1365
+ try {
1366
+ const data = await this.storage.getItem(this.EVENTS_KEY);
1367
+ return data ? JSON.parse(data) : [];
1368
+ } catch (error) {
1369
+ console.error("Failed to get events:", error);
1370
+ return [];
1371
+ }
1372
+ }
1373
+ async clearEvents() {
1374
+ try {
1375
+ await this.storage.removeItem(this.EVENTS_KEY);
1376
+ } catch (error) {
1377
+ console.error("Failed to clear events:", error);
1378
+ }
1379
+ }
1380
+ async saveDeviceInfo(info) {
1381
+ try {
1382
+ await this.storage.setItem(this.DEVICE_INFO_KEY, JSON.stringify(info));
1383
+ } catch (error) {
1384
+ console.error("Failed to save device info:", error);
1385
+ }
1386
+ }
1387
+ async getDeviceInfo() {
1388
+ try {
1389
+ const data = await this.storage.getItem(this.DEVICE_INFO_KEY);
1390
+ return data ? JSON.parse(data) : null;
1391
+ } catch (error) {
1392
+ console.error("Failed to get device info:", error);
1393
+ return null;
1394
+ }
1395
+ }
1396
+ async saveSessionId(sessionId) {
1397
+ try {
1398
+ await this.storage.setItem(this.SESSION_ID_KEY, sessionId);
1399
+ } catch (error) {
1400
+ console.error("Failed to save session ID:", error);
1401
+ }
1402
+ }
1403
+ async getSessionId() {
1404
+ try {
1405
+ return await this.storage.getItem(this.SESSION_ID_KEY);
1406
+ } catch (error) {
1407
+ console.error("Failed to get session ID:", error);
1408
+ return null;
1409
+ }
1410
+ }
1411
+ };
1412
+ var MobileNetworkAdapter = class {
1413
+ // 需要注入网络检查函数
1414
+ constructor(netInfo) {
1415
+ this.netInfo = netInfo;
1416
+ }
1417
+ async upload(url, events) {
1418
+ try {
1419
+ const response = await fetch(url, {
1420
+ method: "POST",
1421
+ headers: {
1422
+ "Content-Type": "application/json"
1423
+ },
1424
+ body: JSON.stringify({
1425
+ events,
1426
+ timestamp: Date.now()
1427
+ })
1428
+ });
1429
+ if (response.ok) {
1430
+ const data = await response.json();
1431
+ return {
1432
+ success: true,
1433
+ message: data.message,
1434
+ code: response.status
1435
+ };
1436
+ } else {
1437
+ return {
1438
+ success: false,
1439
+ message: `HTTP ${response.status}`,
1440
+ code: response.status
1441
+ };
1442
+ }
1443
+ } catch (error) {
1444
+ return {
1445
+ success: false,
1446
+ message: error instanceof Error ? error.message : "Network error",
1447
+ code: 0
1448
+ };
1449
+ }
1450
+ }
1451
+ async isOnline() {
1452
+ try {
1453
+ if (this.netInfo) {
1454
+ const state = await this.netInfo.fetch();
1455
+ return state.isConnected ?? false;
1456
+ }
1457
+ return true;
1458
+ } catch (error) {
1459
+ return true;
1460
+ }
1461
+ }
1462
+ };
1463
+ var MobileDeviceAdapter = class {
1464
+ // 需要注入设备信息获取函数
1465
+ constructor(deviceInfoModule) {
1466
+ this.deviceInfoModule = deviceInfoModule;
1467
+ }
1468
+ async getDeviceInfo() {
1469
+ try {
1470
+ const info = this.deviceInfoModule;
1471
+ return {
1472
+ device_id: info ? await info.getUniqueId() : await this.generateDeviceId(),
1473
+ device_model: info ? await info.getModel() : "unknown",
1474
+ device_brand: info ? await info.getBrand() : "unknown",
1475
+ os_name: info ? await info.getSystemName() : "unknown",
1476
+ os_version: info ? await info.getSystemVersion() : "unknown",
1477
+ screen_width: typeof window !== "undefined" ? window.screen.width : 0,
1478
+ screen_height: typeof window !== "undefined" ? window.screen.height : 0,
1479
+ language: typeof navigator !== "undefined" ? navigator.language : "en",
1480
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
1481
+ };
1482
+ } catch (error) {
1483
+ console.error("Failed to get device info:", error);
1484
+ return this.getDefaultDeviceInfo();
1485
+ }
1486
+ }
1487
+ async generateDeviceId() {
1488
+ const timestamp = Date.now();
1489
+ const random = Math.random().toString(36).substring(2, 15);
1490
+ return `mobile_${timestamp}_${random}`;
1491
+ }
1492
+ getDefaultDeviceInfo() {
1493
+ return {
1494
+ device_id: `mobile_${Date.now()}`,
1495
+ os_name: "unknown",
1496
+ os_version: "unknown",
1497
+ screen_width: 0,
1498
+ screen_height: 0,
1499
+ language: "en",
1500
+ timezone: "UTC"
1501
+ };
1502
+ }
1503
+ };
1504
+
1505
+ // src/analytics/adapters/miniapp.ts
1506
+ var MiniappStorageAdapter = class {
1507
+ // 需要注入 Taro 的存储 API
1508
+ constructor(storage) {
1509
+ this.storage = storage;
1510
+ this.EVENTS_KEY = "analytics_events";
1511
+ this.DEVICE_INFO_KEY = "analytics_device_info";
1512
+ this.SESSION_ID_KEY = "analytics_session_id";
1513
+ }
1514
+ async saveEvents(events) {
1515
+ try {
1516
+ if (this.storage) {
1517
+ this.storage.setStorageSync(this.EVENTS_KEY, events);
1518
+ }
1519
+ } catch (error) {
1520
+ console.error("Failed to save events:", error);
1521
+ }
1522
+ }
1523
+ async getEvents() {
1524
+ try {
1525
+ if (this.storage) {
1526
+ const data = this.storage.getStorageSync(this.EVENTS_KEY);
1527
+ return data || [];
1528
+ }
1529
+ return [];
1530
+ } catch (error) {
1531
+ console.error("Failed to get events:", error);
1532
+ return [];
1533
+ }
1534
+ }
1535
+ async clearEvents() {
1536
+ try {
1537
+ if (this.storage) {
1538
+ this.storage.removeStorageSync(this.EVENTS_KEY);
1539
+ }
1540
+ } catch (error) {
1541
+ console.error("Failed to clear events:", error);
1542
+ }
1543
+ }
1544
+ async saveDeviceInfo(info) {
1545
+ try {
1546
+ if (this.storage) {
1547
+ this.storage.setStorageSync(this.DEVICE_INFO_KEY, info);
1548
+ }
1549
+ } catch (error) {
1550
+ console.error("Failed to save device info:", error);
1551
+ }
1552
+ }
1553
+ async getDeviceInfo() {
1554
+ try {
1555
+ if (this.storage) {
1556
+ return this.storage.getStorageSync(this.DEVICE_INFO_KEY) || null;
1557
+ }
1558
+ return null;
1559
+ } catch (error) {
1560
+ console.error("Failed to get device info:", error);
1561
+ return null;
1562
+ }
1563
+ }
1564
+ async saveSessionId(sessionId) {
1565
+ try {
1566
+ if (this.storage) {
1567
+ this.storage.setStorageSync(this.SESSION_ID_KEY, sessionId);
1568
+ }
1569
+ } catch (error) {
1570
+ console.error("Failed to save session ID:", error);
1571
+ }
1572
+ }
1573
+ async getSessionId() {
1574
+ try {
1575
+ if (this.storage) {
1576
+ return this.storage.getStorageSync(this.SESSION_ID_KEY) || null;
1577
+ }
1578
+ return null;
1579
+ } catch (error) {
1580
+ console.error("Failed to get session ID:", error);
1581
+ return null;
1582
+ }
1583
+ }
1584
+ };
1585
+ var MiniappNetworkAdapter = class {
1586
+ // 需要注入 Taro 的网络 API
1587
+ constructor(request, netInfo) {
1588
+ this.request = request;
1589
+ this.netInfo = netInfo;
1590
+ }
1591
+ async upload(url, events) {
1592
+ try {
1593
+ if (!this.request) {
1594
+ throw new Error("Request module not provided");
1595
+ }
1596
+ const response = await this.request.request({
1597
+ url,
1598
+ method: "POST",
1599
+ data: {
1600
+ events,
1601
+ timestamp: Date.now()
1602
+ },
1603
+ header: {
1604
+ "Content-Type": "application/json"
1605
+ }
1606
+ });
1607
+ if (response.statusCode === 200) {
1608
+ return {
1609
+ success: true,
1610
+ message: response.data.message,
1611
+ code: response.statusCode
1612
+ };
1613
+ } else {
1614
+ return {
1615
+ success: false,
1616
+ message: `HTTP ${response.statusCode}`,
1617
+ code: response.statusCode
1618
+ };
1619
+ }
1620
+ } catch (error) {
1621
+ return {
1622
+ success: false,
1623
+ message: error instanceof Error ? error.message : "Network error",
1624
+ code: 0
1625
+ };
1626
+ }
1627
+ }
1628
+ async isOnline() {
1629
+ try {
1630
+ if (this.netInfo) {
1631
+ const { networkType } = await this.netInfo.getNetworkType();
1632
+ return networkType !== "none";
1633
+ }
1634
+ return true;
1635
+ } catch (error) {
1636
+ return true;
1637
+ }
1638
+ }
1639
+ };
1640
+ var MiniappDeviceAdapter = class {
1641
+ // 需要注入 Taro 的系统信息 API
1642
+ constructor(systemInfo) {
1643
+ this.systemInfo = systemInfo;
1644
+ }
1645
+ async getDeviceInfo() {
1646
+ try {
1647
+ if (this.systemInfo) {
1648
+ const info = this.systemInfo.getSystemInfoSync();
1649
+ return {
1650
+ device_id: await this.generateDeviceId(),
1651
+ device_model: info.model || "unknown",
1652
+ device_brand: info.brand || "unknown",
1653
+ os_name: info.platform || "unknown",
1654
+ os_version: info.system || "unknown",
1655
+ screen_width: info.screenWidth || 0,
1656
+ screen_height: info.screenHeight || 0,
1657
+ language: info.language || "zh_CN",
1658
+ timezone: "Asia/Shanghai",
1659
+ network_type: info.networkType
1660
+ };
1661
+ }
1662
+ return this.getDefaultDeviceInfo();
1663
+ } catch (error) {
1664
+ console.error("Failed to get device info:", error);
1665
+ return this.getDefaultDeviceInfo();
1666
+ }
1667
+ }
1668
+ async generateDeviceId() {
1669
+ const timestamp = Date.now();
1670
+ const random = Math.random().toString(36).substring(2, 15);
1671
+ return `miniapp_${timestamp}_${random}`;
1672
+ }
1673
+ getDefaultDeviceInfo() {
1674
+ return {
1675
+ device_id: `miniapp_${Date.now()}`,
1676
+ os_name: "wechat",
1677
+ os_version: "unknown",
1678
+ screen_width: 0,
1679
+ screen_height: 0,
1680
+ language: "zh_CN",
1681
+ timezone: "Asia/Shanghai"
1682
+ };
1683
+ }
1684
+ };
1685
+
1686
+ // src/analytics/adapters/desktop.ts
1687
+ var DesktopStorageAdapter = class {
1688
+ constructor() {
1689
+ this.EVENTS_KEY = "analytics:events";
1690
+ this.DEVICE_INFO_KEY = "analytics:device_info";
1691
+ this.SESSION_ID_KEY = "analytics:session_id";
1692
+ }
1693
+ async saveEvents(events) {
1694
+ try {
1695
+ if (typeof window !== "undefined") {
1696
+ localStorage.setItem(this.EVENTS_KEY, JSON.stringify(events));
1697
+ }
1698
+ } catch (error) {
1699
+ console.error("Failed to save events:", error);
1700
+ }
1701
+ }
1702
+ async getEvents() {
1703
+ try {
1704
+ if (typeof window !== "undefined") {
1705
+ const data = localStorage.getItem(this.EVENTS_KEY);
1706
+ return data ? JSON.parse(data) : [];
1707
+ }
1708
+ return [];
1709
+ } catch (error) {
1710
+ console.error("Failed to get events:", error);
1711
+ return [];
1712
+ }
1713
+ }
1714
+ async clearEvents() {
1715
+ try {
1716
+ if (typeof window !== "undefined") {
1717
+ localStorage.removeItem(this.EVENTS_KEY);
1718
+ }
1719
+ } catch (error) {
1720
+ console.error("Failed to clear events:", error);
1721
+ }
1722
+ }
1723
+ async saveDeviceInfo(info) {
1724
+ try {
1725
+ if (typeof window !== "undefined") {
1726
+ localStorage.setItem(this.DEVICE_INFO_KEY, JSON.stringify(info));
1727
+ }
1728
+ } catch (error) {
1729
+ console.error("Failed to save device info:", error);
1730
+ }
1731
+ }
1732
+ async getDeviceInfo() {
1733
+ try {
1734
+ if (typeof window !== "undefined") {
1735
+ const data = localStorage.getItem(this.DEVICE_INFO_KEY);
1736
+ return data ? JSON.parse(data) : null;
1737
+ }
1738
+ return null;
1739
+ } catch (error) {
1740
+ console.error("Failed to get device info:", error);
1741
+ return null;
1742
+ }
1743
+ }
1744
+ async saveSessionId(sessionId) {
1745
+ try {
1746
+ if (typeof window !== "undefined") {
1747
+ localStorage.setItem(this.SESSION_ID_KEY, sessionId);
1748
+ }
1749
+ } catch (error) {
1750
+ console.error("Failed to save session ID:", error);
1751
+ }
1752
+ }
1753
+ async getSessionId() {
1754
+ try {
1755
+ if (typeof window !== "undefined") {
1756
+ return localStorage.getItem(this.SESSION_ID_KEY);
1757
+ }
1758
+ return null;
1759
+ } catch (error) {
1760
+ console.error("Failed to get session ID:", error);
1761
+ return null;
1762
+ }
1763
+ }
1764
+ };
1765
+ var DesktopNetworkAdapter = class {
1766
+ async upload(url, events) {
1767
+ try {
1768
+ const response = await fetch(url, {
1769
+ method: "POST",
1770
+ headers: {
1771
+ "Content-Type": "application/json"
1772
+ },
1773
+ body: JSON.stringify({
1774
+ events,
1775
+ timestamp: Date.now()
1776
+ })
1777
+ });
1778
+ if (response.ok) {
1779
+ const data = await response.json();
1780
+ return {
1781
+ success: true,
1782
+ message: data.message,
1783
+ code: response.status
1784
+ };
1785
+ } else {
1786
+ return {
1787
+ success: false,
1788
+ message: `HTTP ${response.status}`,
1789
+ code: response.status
1790
+ };
1791
+ }
1792
+ } catch (error) {
1793
+ return {
1794
+ success: false,
1795
+ message: error instanceof Error ? error.message : "Network error",
1796
+ code: 0
1797
+ };
1798
+ }
1799
+ }
1800
+ async isOnline() {
1801
+ if (typeof navigator !== "undefined" && "onLine" in navigator) {
1802
+ return navigator.onLine;
1803
+ }
1804
+ return true;
1805
+ }
1806
+ };
1807
+ var DesktopDeviceAdapter = class {
1808
+ async getDeviceInfo() {
1809
+ return {
1810
+ device_id: await this.generateDeviceId(),
1811
+ os_name: this.getOSName(),
1812
+ os_version: this.getOSVersion(),
1813
+ screen_width: typeof window !== "undefined" ? window.screen.width : 0,
1814
+ screen_height: typeof window !== "undefined" ? window.screen.height : 0,
1815
+ language: typeof navigator !== "undefined" ? navigator.language : "en",
1816
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
1817
+ device_model: "Desktop",
1818
+ device_brand: "Electron"
1819
+ };
1820
+ }
1821
+ async generateDeviceId() {
1822
+ if (typeof window !== "undefined") {
1823
+ let deviceId = localStorage.getItem("analytics:device_id");
1824
+ if (!deviceId) {
1825
+ deviceId = `desktop_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;
1826
+ localStorage.setItem("analytics:device_id", deviceId);
1827
+ }
1828
+ return deviceId;
1829
+ }
1830
+ return `desktop_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;
1831
+ }
1832
+ getOSName() {
1833
+ if (typeof navigator === "undefined") return "unknown";
1834
+ const platform = navigator.platform.toLowerCase();
1835
+ if (platform.indexOf("win") !== -1) return "Windows";
1836
+ if (platform.indexOf("mac") !== -1) return "MacOS";
1837
+ if (platform.indexOf("linux") !== -1) return "Linux";
1838
+ return "unknown";
1839
+ }
1840
+ getOSVersion() {
1841
+ if (typeof navigator === "undefined") return "unknown";
1842
+ return navigator.userAgent;
1843
+ }
1844
+ };
1845
+
1161
1846
  // src/analytics/index.ts
1162
1847
  var ANALYTICS_VERSION = "1.0.0";
1163
1848
 
1164
1849
  exports.ANALYTICS_VERSION = ANALYTICS_VERSION;
1165
1850
  exports.Analytics = Analytics;
1166
1851
  exports.CatchError = CatchError;
1852
+ exports.DesktopDeviceAdapter = DesktopDeviceAdapter;
1853
+ exports.DesktopNetworkAdapter = DesktopNetworkAdapter;
1854
+ exports.DesktopStorageAdapter = DesktopStorageAdapter;
1167
1855
  exports.EventPriority = EventPriority;
1168
1856
  exports.EventQueue = EventQueue;
1169
1857
  exports.EventType = EventType;
1858
+ exports.MiniappDeviceAdapter = MiniappDeviceAdapter;
1859
+ exports.MiniappNetworkAdapter = MiniappNetworkAdapter;
1860
+ exports.MiniappStorageAdapter = MiniappStorageAdapter;
1861
+ exports.MobileDeviceAdapter = MobileDeviceAdapter;
1862
+ exports.MobileNetworkAdapter = MobileNetworkAdapter;
1863
+ exports.MobileStorageAdapter = MobileStorageAdapter;
1170
1864
  exports.Track = Track;
1171
1865
  exports.TrackClick = TrackClick;
1172
1866
  exports.TrackPerformance = TrackPerformance;
1173
1867
  exports.Uploader = Uploader;
1868
+ exports.WebDeviceAdapter = WebDeviceAdapter;
1869
+ exports.WebNetworkAdapter = WebNetworkAdapter;
1870
+ exports.WebStorageAdapter = WebStorageAdapter;
1174
1871
  exports.createAnalytics = createAnalytics;
1175
1872
  exports.createDesktopConfig = createDesktopConfig;
1176
1873
  exports.createMiniappConfig = createMiniappConfig;
@@ -1211,5 +1908,6 @@ exports.useTrackClick = useTrackClick;
1211
1908
  exports.useTrackEvent = useTrackEvent;
1212
1909
  exports.validateEvent = validateEvent;
1213
1910
  exports.validateEvents = validateEvents;
1911
+ exports.webAdapter = webAdapter;
1214
1912
  //# sourceMappingURL=index.js.map
1215
1913
  //# sourceMappingURL=index.js.map