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

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 (48) 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 +10 -2
  11. package/dist/esm/lib/net.d.ts.map +1 -1
  12. package/dist/esm/lib/net.js +31 -0
  13. package/dist/esm/lib/router-monitor.d.ts.map +1 -1
  14. package/dist/esm/lib/router-monitor.js +100 -0
  15. package/dist/esm/lib/upload-worker-manager.d.ts +37 -0
  16. package/dist/esm/lib/upload-worker-manager.d.ts.map +1 -0
  17. package/dist/esm/lib/upload-worker-manager.js +482 -0
  18. package/dist/esm/lib/upload-worker.d.ts +59 -0
  19. package/dist/esm/lib/upload-worker.d.ts.map +1 -0
  20. package/dist/esm/lib/upload-worker.js +26 -0
  21. package/dist/esm/lib/uploader.d.ts +5 -0
  22. package/dist/esm/lib/uploader.d.ts.map +1 -1
  23. package/dist/esm/lib/uploader.js +58 -10
  24. package/dist/lib/lib/api.d.ts +10 -0
  25. package/dist/lib/lib/api.d.ts.map +1 -1
  26. package/dist/lib/lib/api.js +48 -31
  27. package/dist/lib/lib/config.d.ts +1 -0
  28. package/dist/lib/lib/config.d.ts.map +1 -1
  29. package/dist/lib/lib/config.js +2 -0
  30. package/dist/lib/lib/error.d.ts.map +1 -1
  31. package/dist/lib/lib/error.js +65 -138
  32. package/dist/lib/lib/init.d.ts.map +1 -1
  33. package/dist/lib/lib/init.js +10 -2
  34. package/dist/lib/lib/net.d.ts.map +1 -1
  35. package/dist/lib/lib/net.js +31 -0
  36. package/dist/lib/lib/router-monitor.d.ts.map +1 -1
  37. package/dist/lib/lib/router-monitor.js +100 -0
  38. package/dist/lib/lib/upload-worker-manager.d.ts +37 -0
  39. package/dist/lib/lib/upload-worker-manager.d.ts.map +1 -0
  40. package/dist/lib/lib/upload-worker-manager.js +491 -0
  41. package/dist/lib/lib/upload-worker.d.ts +59 -0
  42. package/dist/lib/lib/upload-worker.d.ts.map +1 -0
  43. package/dist/lib/lib/upload-worker.js +32 -0
  44. package/dist/lib/lib/uploader.d.ts +5 -0
  45. package/dist/lib/lib/uploader.d.ts.map +1 -1
  46. package/dist/lib/lib/uploader.js +58 -10
  47. package/dist/rlog-sdk.min.js +1 -1
  48. 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,CAiEN"}
@@ -97,6 +97,7 @@ export function initRLog(serv, appId, cdnConfigUrl) {
97
97
 
98
98
  // 初始化配置管理器
99
99
  initConfigManager(cdnConfigUrl).then(function () {
100
+ var _config$error;
100
101
  // 获取配置
101
102
  var config = getConfig();
102
103
 
@@ -133,8 +134,15 @@ export function initRLog(serv, appId, cdnConfigUrl) {
133
134
  // 初始化路由监控
134
135
  initRouterMonitor(config.routerMonitor);
135
136
 
136
- // 初始化错误处理(全量模式和错误模式都启用)
137
- initErrorHandler();
137
+ // 判断是否启用错误监听上报:
138
+ // 1. 错误采集模式下强制启用(错误捕获模式必须依赖错误监听初始化)
139
+ // 2. 非错误模式下,根据用户 error 配置决定,默认不启用
140
+ var enableError = isErrorMode || ((_config$error = config.error) !== null && _config$error !== void 0 ? _config$error : false);
141
+ if (enableError) {
142
+ initErrorHandler();
143
+ } else {
144
+ logger.log('Error handling is disabled by config');
145
+ }
138
146
  }).catch(function (error) {
139
147
  logger.error('Failed to initialize SDK', error);
140
148
  });
@@ -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;AA2ID,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,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"}
@@ -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
 
@@ -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
  }
@@ -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"}
@@ -170,6 +170,91 @@ export function updateRouterConfig(config) {
170
170
  }
171
171
  }
172
172
 
173
+ /**
174
+ * 处理页面加载事件
175
+ */
176
+ function handlePageLoad() {
177
+ try {
178
+ record.addCustomEvent('page-lifecycle', {
179
+ type: 'PAGE_LOAD',
180
+ url: window.location.href,
181
+ timestamp: Date.now()
182
+ });
183
+ } catch (error) {
184
+ logger.warn('Failed to add PAGE_LOAD event (recording may have stopped)', error);
185
+ }
186
+ }
187
+
188
+ /**
189
+ * 处理页面卸载事件
190
+ */
191
+ function handlePageUnload() {
192
+ try {
193
+ record.addCustomEvent('page-lifecycle', {
194
+ type: 'PAGE_UNLOAD',
195
+ url: window.location.href,
196
+ timestamp: Date.now()
197
+ });
198
+ } catch (error) {
199
+ logger.warn('Failed to add PAGE_UNLOAD event (recording may have stopped)', error);
200
+ }
201
+ }
202
+
203
+ /**
204
+ * 处理页面隐藏事件(移动端友好,替代 beforeunload)
205
+ * pagehide 在移动端浏览器中比 beforeunload 更可靠
206
+ */
207
+ function handlePageHide(event) {
208
+ try {
209
+ record.addCustomEvent('page-lifecycle', {
210
+ type: 'PAGE_HIDE',
211
+ url: window.location.href,
212
+ timestamp: Date.now(),
213
+ persisted: event.persisted // 页面是否进入 bfcache
214
+ });
215
+ } catch (error) {
216
+ logger.warn('Failed to add PAGE_HIDE event (recording may have stopped)', error);
217
+ }
218
+ }
219
+
220
+ /**
221
+ * 处理页面显示事件(移动端友好,支持 bfcache 恢复检测)
222
+ * pageshow 在页面从 bfcache 恢复时也会触发
223
+ */
224
+ function handlePageShow(event) {
225
+ try {
226
+ record.addCustomEvent('page-lifecycle', {
227
+ type: 'PAGE_SHOW',
228
+ url: window.location.href,
229
+ timestamp: Date.now(),
230
+ persisted: event.persisted // 是否从 bfcache 恢复
231
+ });
232
+
233
+ // 如果是从 bfcache 恢复,重置路由计时器
234
+ if (event.persisted) {
235
+ routeStartTime = Date.now();
236
+ }
237
+ } catch (error) {
238
+ logger.warn('Failed to add PAGE_SHOW event (recording may have stopped)', error);
239
+ }
240
+ }
241
+
242
+ /**
243
+ * 处理页面可见性变化事件(移动端切换应用/标签页)
244
+ */
245
+ function handleVisibilityChange() {
246
+ try {
247
+ var isHidden = document.visibilityState === 'hidden';
248
+ record.addCustomEvent('page-lifecycle', {
249
+ type: isHidden ? 'PAGE_VISIBILITY_HIDDEN' : 'PAGE_VISIBILITY_VISIBLE',
250
+ url: window.location.href,
251
+ timestamp: Date.now()
252
+ });
253
+ } catch (error) {
254
+ logger.warn('Failed to add visibility change event (recording may have stopped)', error);
255
+ }
256
+ }
257
+
173
258
  /**
174
259
  * 初始化路由监控
175
260
  */
@@ -205,6 +290,16 @@ export function initRouterMonitor(config) {
205
290
  if (routerConfig.trackHashChange) {
206
291
  window.addEventListener('hashchange', handleHashChange);
207
292
  }
293
+
294
+ // 监听页面生命周期事件
295
+ window.addEventListener('load', handlePageLoad);
296
+ window.addEventListener('beforeunload', handlePageUnload);
297
+
298
+ // 监听移动端页面生命周期事件
299
+ // pagehide/pageshow 在移动端比 beforeunload 更可靠
300
+ window.addEventListener('pagehide', handlePageHide);
301
+ window.addEventListener('pageshow', handlePageShow);
302
+ document.addEventListener('visibilitychange', handleVisibilityChange);
208
303
  isInitialized = true;
209
304
  }
210
305
 
@@ -243,6 +338,11 @@ export function stopRouterMonitor() {
243
338
  if (typeof window !== 'undefined') {
244
339
  window.removeEventListener('popstate', handlePopState);
245
340
  window.removeEventListener('hashchange', handleHashChange);
341
+ window.removeEventListener('load', handlePageLoad);
342
+ window.removeEventListener('beforeunload', handlePageUnload);
343
+ window.removeEventListener('pagehide', handlePageHide);
344
+ window.removeEventListener('pageshow', handlePageShow);
345
+ document.removeEventListener('visibilitychange', handleVisibilityChange);
246
346
  }
247
347
 
248
348
  // 重置状态