@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.
- package/dist/analytics/index.d.mts +198 -4
- package/dist/analytics/index.d.ts +198 -4
- package/dist/analytics/index.js +698 -0
- package/dist/analytics/index.js.map +1 -1
- package/dist/analytics/index.mjs +686 -1
- package/dist/analytics/index.mjs.map +1 -1
- package/dist/chunk-BJTO5JO5.mjs +10 -0
- package/dist/chunk-BJTO5JO5.mjs.map +1 -0
- package/dist/chunk-DGUM43GV.js +12 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/index.mjs +1 -0
- package/dist/i18n/index.d.mts +75 -1
- package/dist/i18n/index.d.ts +75 -1
- package/dist/i18n/index.js +179 -0
- package/dist/i18n/index.js.map +1 -1
- package/dist/i18n/index.mjs +176 -1
- package/dist/i18n/index.mjs.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.mjs +1 -0
- package/dist/logger/index.js +1 -0
- package/dist/logger/index.mjs +1 -0
- package/dist/storage/index.js +1 -0
- package/dist/storage/index.mjs +1 -0
- package/dist/universalExport/index.js +2 -0
- package/dist/universalExport/index.js.map +1 -1
- package/dist/universalExport/index.mjs +2 -0
- package/dist/universalExport/index.mjs.map +1 -1
- package/dist/universalFile/index.js +2 -0
- package/dist/universalFile/index.js.map +1 -1
- package/dist/universalFile/index.mjs +2 -0
- package/dist/universalFile/index.mjs.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.mjs +1 -0
- package/package.json +8 -3
package/dist/analytics/index.js
CHANGED
|
@@ -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
|