@antglobal/rlog-sdk 0.0.1755855517-dev.11 → 0.0.1755855517-dev.13

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.
Files changed (50) hide show
  1. package/dist/esm/lib/api.d.ts +10 -0
  2. package/dist/esm/lib/api.d.ts.map +1 -1
  3. package/dist/esm/lib/api.js +47 -31
  4. package/dist/esm/lib/config.d.ts +1 -0
  5. package/dist/esm/lib/config.d.ts.map +1 -1
  6. package/dist/esm/lib/config.js +2 -0
  7. package/dist/esm/lib/error.d.ts.map +1 -1
  8. package/dist/esm/lib/error.js +65 -138
  9. package/dist/esm/lib/init.d.ts.map +1 -1
  10. package/dist/esm/lib/init.js +14 -7
  11. package/dist/esm/lib/net.d.ts +1 -0
  12. package/dist/esm/lib/net.d.ts.map +1 -1
  13. package/dist/esm/lib/net.js +33 -2
  14. package/dist/esm/lib/router-monitor.d.ts.map +1 -1
  15. package/dist/esm/lib/router-monitor.js +100 -0
  16. package/dist/esm/lib/upload-worker-manager.d.ts +37 -0
  17. package/dist/esm/lib/upload-worker-manager.d.ts.map +1 -0
  18. package/dist/esm/lib/upload-worker-manager.js +482 -0
  19. package/dist/esm/lib/upload-worker.d.ts +59 -0
  20. package/dist/esm/lib/upload-worker.d.ts.map +1 -0
  21. package/dist/esm/lib/upload-worker.js +26 -0
  22. package/dist/esm/lib/uploader.d.ts +5 -0
  23. package/dist/esm/lib/uploader.d.ts.map +1 -1
  24. package/dist/esm/lib/uploader.js +58 -10
  25. package/dist/lib/lib/api.d.ts +10 -0
  26. package/dist/lib/lib/api.d.ts.map +1 -1
  27. package/dist/lib/lib/api.js +48 -31
  28. package/dist/lib/lib/config.d.ts +1 -0
  29. package/dist/lib/lib/config.d.ts.map +1 -1
  30. package/dist/lib/lib/config.js +2 -0
  31. package/dist/lib/lib/error.d.ts.map +1 -1
  32. package/dist/lib/lib/error.js +65 -138
  33. package/dist/lib/lib/init.d.ts.map +1 -1
  34. package/dist/lib/lib/init.js +13 -6
  35. package/dist/lib/lib/net.d.ts +1 -0
  36. package/dist/lib/lib/net.d.ts.map +1 -1
  37. package/dist/lib/lib/net.js +33 -1
  38. package/dist/lib/lib/router-monitor.d.ts.map +1 -1
  39. package/dist/lib/lib/router-monitor.js +100 -0
  40. package/dist/lib/lib/upload-worker-manager.d.ts +37 -0
  41. package/dist/lib/lib/upload-worker-manager.d.ts.map +1 -0
  42. package/dist/lib/lib/upload-worker-manager.js +491 -0
  43. package/dist/lib/lib/upload-worker.d.ts +59 -0
  44. package/dist/lib/lib/upload-worker.d.ts.map +1 -0
  45. package/dist/lib/lib/upload-worker.js +32 -0
  46. package/dist/lib/lib/uploader.d.ts +5 -0
  47. package/dist/lib/lib/uploader.d.ts.map +1 -1
  48. package/dist/lib/lib/uploader.js +58 -10
  49. package/dist/rlog-sdk.min.js +1 -1
  50. package/package.json +3 -2
@@ -4,6 +4,16 @@ type UploadOptions = {
4
4
  deviceId: string;
5
5
  appId: string;
6
6
  };
7
+ /**
8
+ * 构建上传查询参数(纯函数,供 Worker 管理器复用)
9
+ * @param opts 包含 appId、deviceId、data 的选项
10
+ * @returns 查询参数键值对
11
+ */
12
+ export declare function buildQueryParams(opts: {
13
+ appId: string;
14
+ deviceId: string;
15
+ data: any[];
16
+ }): Record<string, string>;
7
17
  export declare const upload: (opt: UploadOptions) => Promise<void>;
8
18
  export {};
9
19
  //# sourceMappingURL=api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/lib/api.ts"],"names":[],"mappings":"AAKA,KAAK,aAAa,GAAG;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAqBF,eAAO,MAAM,MAAM,QAAe,aAAa,kBAuD9C,CAAC"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/lib/api.ts"],"names":[],"mappings":"AAKA,KAAK,aAAa,GAAG;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAqBF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,GAAG,EAAE,CAAC;CACb,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAyBzB;AAED,eAAO,MAAM,MAAM,QAAe,aAAa,kBAsC9C,CAAC"}
@@ -23,32 +23,48 @@ var cacheUrlParams = function cacheUrlParams() {
23
23
  var getCachedParam = function getCachedParam(paramName) {
24
24
  return sessionStorage.getItem("rlog-".concat(paramName));
25
25
  };
26
+
27
+ /**
28
+ * 构建上传查询参数(纯函数,供 Worker 管理器复用)
29
+ * @param opts 包含 appId、deviceId、data 的选项
30
+ * @returns 查询参数键值对
31
+ */
32
+ export function buildQueryParams(opts) {
33
+ var _opts$data, _opts$data2;
34
+ // 缓存URL中的参数
35
+ cacheUrlParams();
36
+ var lastIndex = opts.data && opts.data.length > 0 ? opts.data.length - 1 : -1;
37
+ var queryParams = {
38
+ deviceId: opts.deviceId,
39
+ appId: opts.appId,
40
+ startTime: (_opts$data = opts.data) === null || _opts$data === void 0 || (_opts$data = _opts$data[0]) === null || _opts$data === void 0 ? void 0 : _opts$data.timestamp,
41
+ endTime: (_opts$data2 = opts.data) === null || _opts$data2 === void 0 || (_opts$data2 = _opts$data2[lastIndex]) === null || _opts$data2 === void 0 ? void 0 : _opts$data2.timestamp
42
+ };
43
+
44
+ // 从配置中获取需要上报的参数名称列表
45
+ var config = getConfig();
46
+ var paramsToReport = config.urlParamsToCache || ['taskId']; // 默认上报taskId
47
+
48
+ // 添加缓存的参数到查询字符串中
49
+ paramsToReport.forEach(function (paramName) {
50
+ var paramValue = getCachedParam(paramName);
51
+ if (paramValue) {
52
+ queryParams[paramName] = paramValue;
53
+ }
54
+ });
55
+ return queryParams;
56
+ }
26
57
  export var upload = /*#__PURE__*/function () {
27
58
  var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(opt) {
28
- var _opt$data, _opt$data2;
29
- var lastIndex, queryParams, config, paramsToReport, queryString, api, formData, customHeaders, response, responseData, error;
59
+ var queryParams, queryString, api, formData, customHeaders, response, responseData, error;
30
60
  return _regeneratorRuntime().wrap(function _callee$(_context) {
31
61
  while (1) switch (_context.prev = _context.next) {
32
62
  case 0:
33
- // 缓存URL中的参数
34
- cacheUrlParams();
35
-
36
- // 构建查询字符串
37
- lastIndex = opt.data && opt.data.length > 0 ? opt.data.length - 1 : -1;
38
- queryParams = {
39
- deviceId: opt.deviceId,
63
+ // 构建查询参数
64
+ queryParams = buildQueryParams({
40
65
  appId: opt.appId,
41
- startTime: (_opt$data = opt.data) === null || _opt$data === void 0 || (_opt$data = _opt$data[0]) === null || _opt$data === void 0 ? void 0 : _opt$data.timestamp,
42
- endTime: (_opt$data2 = opt.data) === null || _opt$data2 === void 0 || (_opt$data2 = _opt$data2[lastIndex]) === null || _opt$data2 === void 0 ? void 0 : _opt$data2.timestamp
43
- }; // 从配置中获取需要上报的参数名称列表
44
- config = getConfig();
45
- paramsToReport = config.urlParamsToCache || ['taskId']; // 默认上报taskId
46
- // 添加缓存的参数到查询字符串中
47
- paramsToReport.forEach(function (paramName) {
48
- var paramValue = getCachedParam(paramName);
49
- if (paramValue) {
50
- queryParams[paramName] = paramValue;
51
- }
66
+ deviceId: opt.deviceId,
67
+ data: opt.data
52
68
  });
53
69
  queryString = new URLSearchParams(queryParams);
54
70
  api = "".concat(opt.url).concat(queryString ? "?".concat(queryString) : '');
@@ -57,33 +73,33 @@ export var upload = /*#__PURE__*/function () {
57
73
 
58
74
  // 获取自定义请求头
59
75
  customHeaders = getCustomHeaders();
60
- _context.next = 13;
76
+ _context.next = 8;
61
77
  return post(api, formData, {
62
78
  headers: customHeaders
63
79
  });
64
- case 13:
80
+ case 8:
65
81
  response = _context.sent;
66
- _context.prev = 14;
82
+ _context.prev = 9;
67
83
  responseData = typeof response.data === 'string' ? JSON.parse(response.data) : response.data;
68
- _context.next = 21;
84
+ _context.next = 16;
69
85
  break;
70
- case 18:
71
- _context.prev = 18;
72
- _context.t0 = _context["catch"](14);
86
+ case 13:
87
+ _context.prev = 13;
88
+ _context.t0 = _context["catch"](9);
73
89
  return _context.abrupt("return");
74
- case 21:
90
+ case 16:
75
91
  if (!(responseData && _typeof(responseData) === 'object' && responseData.success === false)) {
76
- _context.next = 25;
92
+ _context.next = 20;
77
93
  break;
78
94
  }
79
95
  error = new Error(responseData.errorMessage || 'Upload failed with success=false'); // 将完整的响应数据附加到错误对象上
80
96
  error.responseData = responseData;
81
97
  throw error;
82
- case 25:
98
+ case 20:
83
99
  case "end":
84
100
  return _context.stop();
85
101
  }
86
- }, _callee, null, [[14, 18]]);
102
+ }, _callee, null, [[9, 13]]);
87
103
  }));
88
104
  return function upload(_x) {
89
105
  return _ref.apply(this, arguments);
@@ -41,6 +41,7 @@ export interface CdnConfig {
41
41
  ignoreRoutes?: string[];
42
42
  };
43
43
  packEvents?: boolean;
44
+ error?: boolean;
44
45
  captureMode?: 'full' | 'error';
45
46
  errorCapture?: ErrorCaptureConfig;
46
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAElC,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,KAAK,CAAC,EAAE,CACJ,QAAQ,GACR,OAAO,GACP,OAAO,GACP,YAAY,GACZ,OAAO,GACP,KAAK,GACL,QAAQ,GACR,OAAO,GACP,OAAO,GACP,gBAAgB,GAChB,UAAU,GACV,MAAM,GACN,KAAK,GACL,OAAO,GACP,MAAM,GACN,SAAS,GACT,SAAS,GACT,OAAO,GACP,MAAM,CACT,EAAE,CAAC;IAEJ,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,gBAAgB,CAAC,EAAE;QAEjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAE3B,cAAc,CAAC,EAAE,MAAM,CAAC;QAExB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAGD,MAAM,WAAW,kBAAkB;IAEjC,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAGD,MAAM,WAAW,SAAS;IAExB,MAAM,EAAE,OAAO,CAAC;IAEhB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,EAAE;QAET,MAAM,CAAC,EAAE,MAAM,CAAC;QAEhB,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAE7B,MAAM,CAAC,EAAE,MAAM,CAAC;QAEhB,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;KACxB,CAAC;IAGF,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,cAAc,EAAE,MAAM,CAAC;IAEvB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAG5B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAGnC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAG9B,IAAI,CAAC,EAAE,OAAO,CAAC;IAGf,aAAa,CAAC,EAAE;QACd,MAAM,CAAC,EAAE,OAAO,CAAC;QAEjB,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IAGF,UAAU,CAAC,EAAE,OAAO,CAAC;IAGrB,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAG/B,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AA8CD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAuC3E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAEhE;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAErC;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBtE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAElC,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,KAAK,CAAC,EAAE,CACJ,QAAQ,GACR,OAAO,GACP,OAAO,GACP,YAAY,GACZ,OAAO,GACP,KAAK,GACL,QAAQ,GACR,OAAO,GACP,OAAO,GACP,gBAAgB,GAChB,UAAU,GACV,MAAM,GACN,KAAK,GACL,OAAO,GACP,MAAM,GACN,SAAS,GACT,SAAS,GACT,OAAO,GACP,MAAM,CACT,EAAE,CAAC;IAEJ,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,gBAAgB,CAAC,EAAE;QAEjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAE3B,cAAc,CAAC,EAAE,MAAM,CAAC;QAExB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAGD,MAAM,WAAW,kBAAkB;IAEjC,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAGD,MAAM,WAAW,SAAS;IAExB,MAAM,EAAE,OAAO,CAAC;IAEhB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,EAAE;QAET,MAAM,CAAC,EAAE,MAAM,CAAC;QAEhB,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAE7B,MAAM,CAAC,EAAE,MAAM,CAAC;QAEhB,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;KACxB,CAAC;IAGF,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,cAAc,EAAE,MAAM,CAAC;IAEvB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAG5B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAGnC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAG9B,IAAI,CAAC,EAAE,OAAO,CAAC;IAGf,aAAa,CAAC,EAAE;QACd,MAAM,CAAC,EAAE,OAAO,CAAC;QAEjB,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IAGF,UAAU,CAAC,EAAE,OAAO,CAAC;IAGrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAGhB,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAG/B,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AA+CD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAuC3E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAEhE;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAErC;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBtE"}
@@ -53,6 +53,8 @@ var DEFAULT_CONFIG = {
53
53
  // 默认不使用rrweb的packFn压缩事件数据
54
54
  clearStorageBeforeRecord: true,
55
55
  // 默认在开始录制前清空存储数据
56
+ error: false,
57
+ // 默认不启用错误监听上报,错误采集模式下默认true
56
58
  captureMode: 'full',
57
59
  // 默认全量采集模式
58
60
  errorCapture: {
@@ -1 +1 @@
1
- {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../src/lib/error.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAc/C;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAElE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,GAAG,IAAI,CAErD;AAGD,eAAO,MAAM,oBAAoB,SAAU,GAAG,SAmB7C,CAAC;AAGF,wBAAgB,gBAAgB,SA4I/B;AAGD,wBAAgB,mBAAmB,SAgBlC"}
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../src/lib/error.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAS/C;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAElE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,GAAG,IAAI,CAErD;AAGD,eAAO,MAAM,oBAAoB,SAAU,GAAG,SAmB7C,CAAC;AAqEF,wBAAgB,gBAAgB,SAS/B;AAGD,wBAAgB,mBAAmB,SAWlC"}
@@ -3,12 +3,12 @@ import { getConfig } from "./config";
3
3
  import { record } from 'rrweb';
4
4
  import logger from "./logger";
5
5
 
6
- // 存储事件监听器的引用,用于清理
7
- var eventListeners = [];
8
-
9
6
  // 错误触发器引用(错误采集模式下由 init.ts 注入)
10
7
  var errorTriggerInstance = null;
11
8
 
9
+ // 标记是否已初始化
10
+ var isInitialized = false;
11
+
12
12
  /**
13
13
  * 设置错误触发器实例(错误采集模式下由 init.ts 调用)
14
14
  */
@@ -45,156 +45,83 @@ export var sendErrorToAnalytics = function sendErrorToAnalytics(data) {
45
45
  }
46
46
  };
47
47
 
48
- // 初始化错误处理
49
- export function initErrorHandler() {
50
- logger.log('Error handling is enabled');
51
-
52
- // JavaScript 运行时错误处理
53
- var errorHandler = function errorHandler(event) {
54
- var errorEvent = event;
55
- // 检查是否是资源加载错误
56
- if (event.target !== window) {
57
- // 资源加载错误
58
- var _errorData = {
59
- type: 'RESOURCE_ERROR',
60
- resourceType: event.target.tagName,
61
- url: event.target.src || event.target.href || event.target.src,
62
- message: errorEvent.message,
63
- userAgent: navigator.userAgent,
64
- timestamp: Date.now(),
65
- location: window.location.href
66
- };
67
- sendErrorToAnalytics(_errorData);
68
- return false;
69
- }
70
-
71
- // JavaScript 运行时错误
72
- var message = errorEvent.message,
73
- filename = errorEvent.filename,
74
- lineno = errorEvent.lineno,
75
- colno = errorEvent.colno,
76
- error = errorEvent.error;
77
- var errorData = {
78
- type: 'JS_ERROR',
79
- message: message,
80
- file: filename,
81
- line: lineno,
82
- column: colno,
83
- stack: error === null || error === void 0 ? void 0 : error.stack,
48
+ /**
49
+ * JavaScript 运行时错误 & 资源加载错误处理
50
+ */
51
+ function handleError(event) {
52
+ var errorEvent = event;
53
+
54
+ // 检查是否是资源加载错误
55
+ if (event.target !== window) {
56
+ var _errorData = {
57
+ type: 'RESOURCE_ERROR',
58
+ resourceType: event.target.tagName,
59
+ url: event.target.src || event.target.href || event.target.src,
60
+ message: errorEvent.message,
84
61
  userAgent: navigator.userAgent,
85
62
  timestamp: Date.now(),
86
63
  location: window.location.href
87
64
  };
88
- sendErrorToAnalytics(errorData);
89
-
90
- // 控制台保留原始错误显示
65
+ sendErrorToAnalytics(_errorData);
91
66
  return false;
92
- };
93
- window.addEventListener('error', errorHandler, true);
94
- eventListeners.push({
95
- target: window,
96
- type: 'error',
97
- listener: errorHandler,
98
- options: true
99
- });
67
+ }
100
68
 
101
- // 拦截未处理的 Promise 错误
102
- var unhandledRejectionHandler = function unhandledRejectionHandler(event) {
103
- var rejectionEvent = event;
104
- var reason = rejectionEvent.reason || 'Unknown rejection';
105
- var errorData = {
106
- type: 'PROMISE_REJECTION',
107
- message: typeof reason === 'string' ? reason : reason.message,
108
- stack: _typeof(reason) === 'object' ? reason.stack : null,
109
- timestamp: Date.now(),
110
- location: window.location.href
111
- };
112
- sendErrorToAnalytics(errorData);
113
- // 阻止默认控制台报错
114
- event.preventDefault();
69
+ // JavaScript 运行时错误
70
+ var message = errorEvent.message,
71
+ filename = errorEvent.filename,
72
+ lineno = errorEvent.lineno,
73
+ colno = errorEvent.colno,
74
+ error = errorEvent.error;
75
+ var errorData = {
76
+ type: 'JS_ERROR',
77
+ message: message,
78
+ file: filename,
79
+ line: lineno,
80
+ column: colno,
81
+ stack: error === null || error === void 0 ? void 0 : error.stack,
82
+ userAgent: navigator.userAgent,
83
+ timestamp: Date.now(),
84
+ location: window.location.href
115
85
  };
116
- window.addEventListener('unhandledrejection', unhandledRejectionHandler);
117
- eventListeners.push({
118
- target: window,
119
- type: 'unhandledrejection',
120
- listener: unhandledRejectionHandler
121
- });
86
+ sendErrorToAnalytics(errorData);
122
87
 
123
- // 监控页面性能相关事件
124
- var loadHandler = function loadHandler() {
125
- sendErrorToAnalytics({
126
- type: 'PAGE_LOAD',
127
- url: window.location.href,
128
- timestamp: Date.now()
129
- });
130
- };
131
- window.addEventListener('load', loadHandler);
132
- eventListeners.push({
133
- target: window,
134
- type: 'load',
135
- listener: loadHandler
136
- });
88
+ // 控制台保留原始错误显示
89
+ return false;
90
+ }
137
91
 
138
- // 监控页面卸载事件
139
- var beforeUnloadHandler = function beforeUnloadHandler() {
140
- sendErrorToAnalytics({
141
- type: 'PAGE_UNLOAD',
142
- url: window.location.href,
143
- timestamp: Date.now()
144
- });
92
+ /**
93
+ * 未处理的 Promise 错误处理
94
+ */
95
+ function handleUnhandledRejection(event) {
96
+ var rejectionEvent = event;
97
+ var reason = rejectionEvent.reason || 'Unknown rejection';
98
+ var errorData = {
99
+ type: 'PROMISE_REJECTION',
100
+ message: typeof reason === 'string' ? reason : reason.message,
101
+ stack: _typeof(reason) === 'object' ? reason.stack : null,
102
+ timestamp: Date.now(),
103
+ location: window.location.href
145
104
  };
146
- window.addEventListener('beforeunload', beforeUnloadHandler);
147
- eventListeners.push({
148
- target: window,
149
- type: 'beforeunload',
150
- listener: beforeUnloadHandler
151
- });
105
+ sendErrorToAnalytics(errorData);
106
+ // 阻止默认控制台报错
107
+ event.preventDefault();
108
+ }
152
109
 
153
- // 监控网络连接状态变化
154
- var onlineHandler = function onlineHandler() {
155
- sendErrorToAnalytics({
156
- type: 'NETWORK_ONLINE',
157
- timestamp: Date.now()
158
- });
159
- };
160
- window.addEventListener('online', onlineHandler);
161
- eventListeners.push({
162
- target: window,
163
- type: 'online',
164
- listener: onlineHandler
165
- });
166
- var offlineHandler = function offlineHandler() {
167
- sendErrorToAnalytics({
168
- type: 'NETWORK_OFFLINE',
169
- timestamp: Date.now()
170
- });
171
- };
172
- window.addEventListener('offline', offlineHandler);
173
- eventListeners.push({
174
- target: window,
175
- type: 'offline',
176
- listener: offlineHandler
177
- });
110
+ // 初始化错误处理
111
+ export function initErrorHandler() {
112
+ if (isInitialized) return;
113
+ logger.log('Error handling is enabled');
114
+ window.addEventListener('error', handleError, true);
115
+ window.addEventListener('unhandledrejection', handleUnhandledRejection);
116
+ isInitialized = true;
178
117
  }
179
118
 
180
119
  // 清理错误监听器
181
120
  export function cleanupErrorHandler() {
121
+ if (!isInitialized) return;
182
122
  logger.log('Cleaning up error handlers');
183
-
184
- // 移除所有注册的事件监听器
185
- eventListeners.forEach(function (_ref) {
186
- var target = _ref.target,
187
- type = _ref.type,
188
- listener = _ref.listener,
189
- options = _ref.options;
190
- try {
191
- target.removeEventListener(type, listener, options);
192
- } catch (error) {
193
- logger.warn("Failed to remove event listener for ".concat(type), error);
194
- }
195
- });
196
-
197
- // 清空监听器数组
198
- eventListeners.length = 0;
123
+ window.removeEventListener('error', handleError, true);
124
+ window.removeEventListener('unhandledrejection', handleUnhandledRejection);
125
+ isInitialized = false;
199
126
  logger.log('Error handlers cleaned up successfully');
200
127
  }
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/lib/init.ts"],"names":[],"mappings":"AAqBA;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,EACrC,OAAO,GAAE,MAAuB,GAC/B,IAAI,CAiDN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,IAAI,CA0DN"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/lib/init.ts"],"names":[],"mappings":"AAqBA;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,EACrC,OAAO,GAAE,MAAuB,GAC/B,IAAI,CAiDN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,IAAI,CAgEN"}
@@ -3,7 +3,7 @@ import { initConfigManager, getConfig } from "./config";
3
3
  import { startUploadLoop, resetUploadLoop, cancelUploadLoop } from "./uploader";
4
4
  import { initRouterMonitor, stopRouterMonitor } from "./router-monitor";
5
5
  import { initErrorHandler, cleanupErrorHandler, setErrorTrigger } from "./error";
6
- import { setSdkLogEndpoint, restoreXhr, setNetErrorTrigger } from "./net";
6
+ import { setSdkLogEndpoint, restoreXhr, setNetErrorTrigger, normalizeUrl } from "./net";
7
7
  import { storage } from "./storage-manager";
8
8
  import { getDeviceId } from "./utils";
9
9
  import { ErrorTrigger } from "./error-trigger";
@@ -91,12 +91,12 @@ export function initRLog(serv, appId, cdnConfigUrl) {
91
91
  resetUploadLoop();
92
92
 
93
93
  // 设置SDK日志上报接口地址,并自动加入黑名单避免循环上报
94
- if (serv) {
95
- setSdkLogEndpoint(serv);
96
- }
94
+ var normalizedServUrl = normalizeUrl(serv);
95
+ setSdkLogEndpoint(normalizedServUrl);
97
96
 
98
97
  // 初始化配置管理器
99
98
  initConfigManager(cdnConfigUrl).then(function () {
99
+ var _config$error;
100
100
  // 获取配置
101
101
  var config = getConfig();
102
102
 
@@ -128,13 +128,20 @@ export function initRLog(serv, appId, cdnConfigUrl) {
128
128
  // 启动统一上传循环
129
129
  // 错误模式下:idle 时跳过上传,uploading 时上传,状态由 ErrorTrigger 控制
130
130
  // 全量模式下:持续轮询上传
131
- startUploadLoop(serv, appId);
131
+ startUploadLoop(normalizedServUrl, appId);
132
132
 
133
133
  // 初始化路由监控
134
134
  initRouterMonitor(config.routerMonitor);
135
135
 
136
- // 初始化错误处理(全量模式和错误模式都启用)
137
- initErrorHandler();
136
+ // 判断是否启用错误监听上报:
137
+ // 1. 错误采集模式下强制启用(错误捕获模式必须依赖错误监听初始化)
138
+ // 2. 非错误模式下,根据用户 error 配置决定,默认不启用
139
+ var enableError = isErrorMode || ((_config$error = config.error) !== null && _config$error !== void 0 ? _config$error : false);
140
+ if (enableError) {
141
+ initErrorHandler();
142
+ } else {
143
+ logger.log('Error handling is disabled by config');
144
+ }
138
145
  }).catch(function (error) {
139
146
  logger.error('Failed to initialize SDK', error);
140
147
  });
@@ -4,6 +4,7 @@ import { ErrorTrigger } from './error-trigger';
4
4
  * 设置网络模块的错误触发器实例
5
5
  */
6
6
  export declare function setNetErrorTrigger(trigger: ErrorTrigger | null): void;
7
+ export declare function normalizeUrl(url: string): string;
7
8
  export declare function shouldRecordUrl(url: string): boolean;
8
9
  export declare function watchXhr(r: typeof record): void;
9
10
  export declare function restoreXhr(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"net.d.ts","sourceRoot":"","sources":["../../../src/lib/net.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAM/C;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAErE;AA2ID,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAgBpD;AAUD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,MAAM,QAkPxC;AAGD,wBAAgB,UAAU,IAAI,IAAI,CAYjC;AAGD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAQrD;AAED,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAOrD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAsBxD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAEjD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAEtE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEzD"}
1
+ {"version":3,"file":"net.d.ts","sourceRoot":"","sources":["../../../src/lib/net.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAM/C;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAErE;AAgDD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAmBhD;AAwED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAgBpD;AAiCD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,MAAM,QAsPxC;AAGD,wBAAgB,UAAU,IAAI,IAAI,CAiBjC;AAGD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAQrD;AAED,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAOrD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAoBxD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAEjD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAEtE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEzD"}
@@ -13,6 +13,7 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
13
13
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
14
14
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
15
15
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
16
+ import { record } from 'rrweb';
16
17
  import { getConfig } from "./config";
17
18
  import logger from "./logger";
18
19
 
@@ -47,7 +48,7 @@ var sdkLogEndpoint = null;
47
48
  var HEADERS_TO_EXTRACT = ['sky_trace_id', 'antbank-traceid'];
48
49
 
49
50
  // 辅助函数:规范化URL路径
50
- function normalizeUrl(url) {
51
+ export function normalizeUrl(url) {
51
52
  try {
52
53
  // 如果是完整URL,直接返回
53
54
  if (url.startsWith('http://') || url.startsWith('https://')) {
@@ -153,6 +154,28 @@ export function shouldRecordUrl(url) {
153
154
  return isUrlInWhitelist(url, whiteListUrls);
154
155
  }
155
156
 
157
+ // 网络状态变化事件处理
158
+ function handleOnline() {
159
+ try {
160
+ record.addCustomEvent('network-status', {
161
+ type: 'NETWORK_ONLINE',
162
+ timestamp: Date.now()
163
+ });
164
+ } catch (error) {
165
+ logger.warn('Failed to add NETWORK_ONLINE event (recording may have stopped)', error);
166
+ }
167
+ }
168
+ function handleOffline() {
169
+ try {
170
+ record.addCustomEvent('network-status', {
171
+ type: 'NETWORK_OFFLINE',
172
+ timestamp: Date.now()
173
+ });
174
+ } catch (error) {
175
+ logger.warn('Failed to add NETWORK_OFFLINE event (recording may have stopped)', error);
176
+ }
177
+ }
178
+
156
179
  // 存储原始方法
157
180
  var origOpen = XMLHttpRequest.prototype.open;
158
181
  var origSend = XMLHttpRequest.prototype.send;
@@ -387,6 +410,10 @@ export function watchXhr(r) {
387
410
  return _ref3.apply(this, arguments);
388
411
  };
389
412
  }();
413
+
414
+ // 监听网络连接状态变化
415
+ window.addEventListener('online', handleOnline);
416
+ window.addEventListener('offline', handleOffline);
390
417
  }
391
418
 
392
419
  // 恢复原始方法
@@ -400,6 +427,10 @@ export function restoreXhr() {
400
427
  if (origFetch) {
401
428
  window.fetch = origFetch;
402
429
  }
430
+
431
+ // 移除网络状态监听器
432
+ window.removeEventListener('online', handleOnline);
433
+ window.removeEventListener('offline', handleOffline);
403
434
  isHooked = false;
404
435
  logger.log('Network monitoring restored');
405
436
  }
@@ -448,7 +479,7 @@ export function setSdkLogEndpoint(endpoint) {
448
479
  sdkLogEndpoint = endpoint;
449
480
 
450
481
  // 规范化endpoint路径,确保相对路径也能正确匹配
451
- var normalizedEndpoint = endpoint.startsWith('/') ? endpoint : '/' + endpoint;
482
+ var normalizedEndpoint = normalizeUrl(endpoint);
452
483
 
453
484
  // 自动将SDK日志上报接口加入黑名单,避免循环上报
454
485
  // 同时添加原始路径和规范化路径,确保兼容性
@@ -1 +1 @@
1
- {"version":3,"file":"router-monitor.d.ts","sourceRoot":"","sources":["../../../src/lib/router-monitor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,UAAU,CAAC;AAIrD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,UAAU,GAAG,YAAY,CAAC;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA2ID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,eAAe,CAAC,GAAG,IAAI,CAuB3E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,eAAe,CAAC,QAkCpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB;;;;EAMlC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,QAG1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,SAyBhC"}
1
+ {"version":3,"file":"router-monitor.d.ts","sourceRoot":"","sources":["../../../src/lib/router-monitor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,UAAU,CAAC;AAIrD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,UAAU,GAAG,YAAY,CAAC;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA2ID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,eAAe,CAAC,GAAG,IAAI,CAuB3E;AAuFD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,eAAe,CAAC,QA4CpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB;;;;EAMlC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,QAG1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,SA8BhC"}