@antglobal/rlog-sdk 0.0.1755855517-dev.9 → 1.0.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.
Files changed (127) hide show
  1. package/README.md +192 -432
  2. package/dist/esm/index.d.ts +14 -41
  3. package/dist/esm/index.d.ts.map +1 -1
  4. package/dist/esm/index.js +92 -76
  5. package/dist/esm/lib/api.d.ts +10 -0
  6. package/dist/esm/lib/api.d.ts.map +1 -1
  7. package/dist/esm/lib/api.js +58 -35
  8. package/dist/esm/lib/config.d.ts +13 -6
  9. package/dist/esm/lib/config.d.ts.map +1 -1
  10. package/dist/esm/lib/config.js +61 -33
  11. package/dist/esm/lib/constants.d.ts +89 -0
  12. package/dist/esm/lib/constants.d.ts.map +1 -0
  13. package/dist/esm/lib/constants.js +145 -0
  14. package/dist/esm/lib/drive/indexeddb-adapt.d.ts +12 -0
  15. package/dist/esm/lib/drive/indexeddb-adapt.d.ts.map +1 -1
  16. package/dist/esm/lib/drive/indexeddb-adapt.js +190 -20
  17. package/dist/esm/lib/drive/localstorage-adapt.d.ts +12 -0
  18. package/dist/esm/lib/drive/localstorage-adapt.d.ts.map +1 -1
  19. package/dist/esm/lib/drive/localstorage-adapt.js +179 -36
  20. package/dist/esm/lib/drive/memory-adapt.d.ts +10 -2
  21. package/dist/esm/lib/drive/memory-adapt.d.ts.map +1 -1
  22. package/dist/esm/lib/drive/memory-adapt.js +118 -26
  23. package/dist/esm/lib/drive/safe-storage.d.ts +24 -0
  24. package/dist/esm/lib/drive/safe-storage.d.ts.map +1 -0
  25. package/dist/esm/lib/drive/safe-storage.js +96 -0
  26. package/dist/esm/lib/drive/storage-interface.d.ts +20 -0
  27. package/dist/esm/lib/drive/storage-interface.d.ts.map +1 -1
  28. package/dist/esm/lib/error-trigger.d.ts +73 -0
  29. package/dist/esm/lib/error-trigger.d.ts.map +1 -0
  30. package/dist/esm/lib/error-trigger.js +162 -0
  31. package/dist/esm/lib/error.d.ts +9 -0
  32. package/dist/esm/lib/error.d.ts.map +1 -1
  33. package/dist/esm/lib/error.js +70 -118
  34. package/dist/esm/lib/init.d.ts +0 -4
  35. package/dist/esm/lib/init.d.ts.map +1 -1
  36. package/dist/esm/lib/init.js +148 -47
  37. package/dist/esm/lib/logger.d.ts +27 -0
  38. package/dist/esm/lib/logger.d.ts.map +1 -0
  39. package/dist/esm/lib/logger.js +79 -0
  40. package/dist/esm/lib/net.d.ts +11 -0
  41. package/dist/esm/lib/net.d.ts.map +1 -1
  42. package/dist/esm/lib/net.js +264 -119
  43. package/dist/esm/lib/request.d.ts.map +1 -1
  44. package/dist/esm/lib/request.js +2 -2
  45. package/dist/esm/lib/router-monitor.d.ts.map +1 -1
  46. package/dist/esm/lib/router-monitor.js +135 -49
  47. package/dist/esm/lib/rrweb.d.ts.map +1 -1
  48. package/dist/esm/lib/rrweb.js +31 -24
  49. package/dist/esm/lib/storage-manager.d.ts +12 -0
  50. package/dist/esm/lib/storage-manager.d.ts.map +1 -1
  51. package/dist/esm/lib/storage-manager.js +129 -46
  52. package/dist/esm/lib/upload-worker-manager.d.ts +47 -0
  53. package/dist/esm/lib/upload-worker-manager.d.ts.map +1 -0
  54. package/dist/esm/lib/upload-worker-manager.js +559 -0
  55. package/dist/esm/lib/upload-worker.d.ts +58 -0
  56. package/dist/esm/lib/upload-worker.d.ts.map +1 -0
  57. package/dist/esm/lib/upload-worker.js +28 -0
  58. package/dist/esm/lib/uploader.d.ts +43 -0
  59. package/dist/esm/lib/uploader.d.ts.map +1 -1
  60. package/dist/esm/lib/uploader.js +464 -102
  61. package/dist/esm/lib/utils.d.ts +75 -0
  62. package/dist/esm/lib/utils.d.ts.map +1 -1
  63. package/dist/esm/lib/utils.js +268 -5
  64. package/dist/lib/index.d.ts +14 -41
  65. package/dist/lib/index.d.ts.map +1 -1
  66. package/dist/lib/index.js +81 -63
  67. package/dist/lib/lib/api.d.ts +10 -0
  68. package/dist/lib/lib/api.d.ts.map +1 -1
  69. package/dist/lib/lib/api.js +59 -35
  70. package/dist/lib/lib/config.d.ts +13 -6
  71. package/dist/lib/lib/config.d.ts.map +1 -1
  72. package/dist/lib/lib/config.js +63 -33
  73. package/dist/lib/lib/constants.d.ts +89 -0
  74. package/dist/lib/lib/constants.d.ts.map +1 -0
  75. package/dist/lib/lib/constants.js +151 -0
  76. package/dist/lib/lib/drive/indexeddb-adapt.d.ts +12 -0
  77. package/dist/lib/lib/drive/indexeddb-adapt.d.ts.map +1 -1
  78. package/dist/lib/lib/drive/indexeddb-adapt.js +191 -19
  79. package/dist/lib/lib/drive/localstorage-adapt.d.ts +12 -0
  80. package/dist/lib/lib/drive/localstorage-adapt.d.ts.map +1 -1
  81. package/dist/lib/lib/drive/localstorage-adapt.js +179 -36
  82. package/dist/lib/lib/drive/memory-adapt.d.ts +10 -2
  83. package/dist/lib/lib/drive/memory-adapt.d.ts.map +1 -1
  84. package/dist/lib/lib/drive/memory-adapt.js +117 -26
  85. package/dist/lib/lib/drive/safe-storage.d.ts +24 -0
  86. package/dist/lib/lib/drive/safe-storage.d.ts.map +1 -0
  87. package/dist/lib/lib/drive/safe-storage.js +102 -0
  88. package/dist/lib/lib/drive/storage-interface.d.ts +20 -0
  89. package/dist/lib/lib/drive/storage-interface.d.ts.map +1 -1
  90. package/dist/lib/lib/error-trigger.d.ts +73 -0
  91. package/dist/lib/lib/error-trigger.d.ts.map +1 -0
  92. package/dist/lib/lib/error-trigger.js +167 -0
  93. package/dist/lib/lib/error.d.ts +9 -0
  94. package/dist/lib/lib/error.d.ts.map +1 -1
  95. package/dist/lib/lib/error.js +73 -118
  96. package/dist/lib/lib/init.d.ts +0 -4
  97. package/dist/lib/lib/init.d.ts.map +1 -1
  98. package/dist/lib/lib/init.js +144 -43
  99. package/dist/lib/lib/logger.d.ts +27 -0
  100. package/dist/lib/lib/logger.d.ts.map +1 -0
  101. package/dist/lib/lib/logger.js +84 -0
  102. package/dist/lib/lib/net.d.ts +11 -0
  103. package/dist/lib/lib/net.d.ts.map +1 -1
  104. package/dist/lib/lib/net.js +268 -120
  105. package/dist/lib/lib/request.d.ts.map +1 -1
  106. package/dist/lib/lib/request.js +3 -3
  107. package/dist/lib/lib/router-monitor.d.ts.map +1 -1
  108. package/dist/lib/lib/router-monitor.js +136 -49
  109. package/dist/lib/lib/rrweb.d.ts.map +1 -1
  110. package/dist/lib/lib/rrweb.js +31 -23
  111. package/dist/lib/lib/storage-manager.d.ts +12 -0
  112. package/dist/lib/lib/storage-manager.d.ts.map +1 -1
  113. package/dist/lib/lib/storage-manager.js +130 -46
  114. package/dist/lib/lib/upload-worker-manager.d.ts +47 -0
  115. package/dist/lib/lib/upload-worker-manager.d.ts.map +1 -0
  116. package/dist/lib/lib/upload-worker-manager.js +570 -0
  117. package/dist/lib/lib/upload-worker.d.ts +58 -0
  118. package/dist/lib/lib/upload-worker.d.ts.map +1 -0
  119. package/dist/lib/lib/upload-worker.js +33 -0
  120. package/dist/lib/lib/uploader.d.ts +43 -0
  121. package/dist/lib/lib/uploader.d.ts.map +1 -1
  122. package/dist/lib/lib/uploader.js +468 -101
  123. package/dist/lib/lib/utils.d.ts +75 -0
  124. package/dist/lib/lib/utils.d.ts.map +1 -1
  125. package/dist/lib/lib/utils.js +276 -6
  126. package/dist/rlog-sdk.min.js +1 -1
  127. package/package.json +3 -2
@@ -10,10 +10,10 @@ exports.stopRouterMonitor = stopRouterMonitor;
10
10
  exports.updateRouterConfig = updateRouterConfig;
11
11
  var _rrweb = require("rrweb");
12
12
  var _config = require("./config");
13
+ var _logger = _interopRequireDefault(require("./logger"));
14
+ var _constants = require("./constants");
15
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
16
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
14
- function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
15
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
16
- 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; }
17
17
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
18
18
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
19
19
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
@@ -36,39 +36,18 @@ var originalReplaceState = null;
36
36
  * 获取当前路由
37
37
  */
38
38
  function getCurrentRoute() {
39
- var _routerConfig;
40
39
  if (typeof window === 'undefined') return '';
41
40
 
42
- // 优先使用完整路径
43
- var fullPath = window.location.pathname + window.location.search + window.location.hash;
44
-
45
- // 应用自定义匹配规则
46
- if ((_routerConfig = routerConfig) !== null && _routerConfig !== void 0 && _routerConfig.customMatchers) {
47
- var _iterator = _createForOfIteratorHelper(routerConfig.customMatchers),
48
- _step;
49
- try {
50
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
51
- var matcher = _step.value;
52
- var pattern = typeof matcher.pattern === 'string' ? new RegExp(matcher.pattern) : matcher.pattern;
53
- if (pattern.test(fullPath)) {
54
- return matcher.name || fullPath;
55
- }
56
- }
57
- } catch (err) {
58
- _iterator.e(err);
59
- } finally {
60
- _iterator.f();
61
- }
62
- }
63
- return fullPath;
41
+ // 使用完整路径
42
+ return window.location.pathname + window.location.search + window.location.hash;
64
43
  }
65
44
 
66
45
  /**
67
46
  * 检查路由是否应该被忽略
68
47
  */
69
48
  function shouldIgnoreRoute(route) {
70
- var _routerConfig2;
71
- if (!((_routerConfig2 = routerConfig) !== null && _routerConfig2 !== void 0 && _routerConfig2.ignoreRoutes)) return false;
49
+ var _routerConfig;
50
+ if (!((_routerConfig = routerConfig) !== null && _routerConfig !== void 0 && _routerConfig.ignoreRoutes)) return false;
72
51
  return routerConfig.ignoreRoutes.some(function (pattern) {
73
52
  if (typeof pattern === 'string') {
74
53
  return route.includes(pattern);
@@ -84,8 +63,8 @@ function shouldIgnoreRoute(route) {
84
63
  * 上报路由变化事件
85
64
  */
86
65
  function reportRouteChange(from, to, method) {
87
- var _routerConfig3;
88
- if (!((_routerConfig3 = routerConfig) !== null && _routerConfig3 !== void 0 && _routerConfig3.enable) || shouldIgnoreRoute(to)) {
66
+ var _routerConfig2;
67
+ if (!((_routerConfig2 = routerConfig) !== null && _routerConfig2 !== void 0 && _routerConfig2.enable) || shouldIgnoreRoute(to)) {
89
68
  return;
90
69
  }
91
70
  var event = {
@@ -96,16 +75,19 @@ function reportRouteChange(from, to, method) {
96
75
  timestamp: Date.now()
97
76
  };
98
77
 
78
+ // 更新当前路由
79
+ currentRoute = to;
80
+
99
81
  // 计算页面停留时间
100
82
  if (routerConfig.trackPageStayTime && from) {
101
83
  event.duration = Date.now() - routeStartTime;
102
84
  }
103
85
  try {
104
86
  // 使用 rrweb 的自定义事件功能上报
105
- _rrweb.record.addCustomEvent('route-change', event);
87
+ _rrweb.record.addCustomEvent(_constants.EVENT_ROUTE_CHANGE, event);
106
88
  } catch (error) {
107
89
  // 忽略录制已停止时的异常
108
- console.warn('Failed to add custom event (recording may have stopped):', error);
90
+ _logger.default.warn('Failed to add custom event (recording may have stopped)', error);
109
91
  }
110
92
  // 重置计时器
111
93
  routeStartTime = Date.now();
@@ -121,28 +103,38 @@ function listenToHistoryChanges() {
121
103
 
122
104
  // 重写 pushState
123
105
  window.history.pushState = function () {
124
- var from = getCurrentRoute();
125
106
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
126
107
  args[_key] = arguments[_key];
127
108
  }
109
+ // 先调用原始方法,确保业务路由跳转不受影响
128
110
  var result = originalPushState.apply(this, args);
129
- var to = getCurrentRoute();
130
- if (from !== to) {
131
- reportRouteChange(from, to, 'pushState');
111
+ try {
112
+ var to = getCurrentRoute();
113
+ var from = currentRoute;
114
+ if (from !== to) {
115
+ reportRouteChange(from, to, 'pushState');
116
+ }
117
+ } catch (error) {
118
+ _logger.default.warn('Error in pushState hook:', error);
132
119
  }
133
120
  return result;
134
121
  };
135
122
 
136
123
  // 重写 replaceState
137
124
  window.history.replaceState = function () {
138
- var from = getCurrentRoute();
139
125
  for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
140
126
  args[_key2] = arguments[_key2];
141
127
  }
128
+ // 先调用原始方法,确保业务路由跳转不受影响
142
129
  var result = originalReplaceState.apply(this, args);
143
- var to = getCurrentRoute();
144
- if (from !== to) {
145
- reportRouteChange(from, to, 'replaceState');
130
+ try {
131
+ var to = getCurrentRoute();
132
+ var from = currentRoute;
133
+ if (from !== to) {
134
+ reportRouteChange(from, to, 'replaceState');
135
+ }
136
+ } catch (error) {
137
+ _logger.default.warn('Error in replaceState hook:', error);
146
138
  }
147
139
  return result;
148
140
  };
@@ -178,15 +170,14 @@ function handleHashChange() {
178
170
  * @param config 新的配置对象
179
171
  */
180
172
  function updateRouterConfig(config) {
181
- var _defaultConfig$enable, _defaultConfig$trackH, _defaultConfig$trackH2, _defaultConfig$trackP, _defaultConfig$ignore, _defaultConfig$custom;
173
+ var _defaultConfig$enable, _defaultConfig$trackH, _defaultConfig$trackH2, _defaultConfig$trackP, _defaultConfig$ignore;
182
174
  var defaultConfig = (0, _config.getConfig)().routerMonitor || {};
183
175
  var newConfig = _objectSpread({
184
176
  enable: (_defaultConfig$enable = defaultConfig.enable) !== null && _defaultConfig$enable !== void 0 ? _defaultConfig$enable : false,
185
177
  trackHashChange: (_defaultConfig$trackH = defaultConfig.trackHashChange) !== null && _defaultConfig$trackH !== void 0 ? _defaultConfig$trackH : true,
186
178
  trackHistoryChange: (_defaultConfig$trackH2 = defaultConfig.trackHistoryChange) !== null && _defaultConfig$trackH2 !== void 0 ? _defaultConfig$trackH2 : true,
187
179
  trackPageStayTime: (_defaultConfig$trackP = defaultConfig.trackPageStayTime) !== null && _defaultConfig$trackP !== void 0 ? _defaultConfig$trackP : true,
188
- ignoreRoutes: (_defaultConfig$ignore = defaultConfig.ignoreRoutes) !== null && _defaultConfig$ignore !== void 0 ? _defaultConfig$ignore : [],
189
- customMatchers: (_defaultConfig$custom = defaultConfig.customMatchers) !== null && _defaultConfig$custom !== void 0 ? _defaultConfig$custom : []
180
+ ignoreRoutes: (_defaultConfig$ignore = defaultConfig.ignoreRoutes) !== null && _defaultConfig$ignore !== void 0 ? _defaultConfig$ignore : []
190
181
  }, config || {});
191
182
 
192
183
  // 如果配置发生变化,重新初始化
@@ -201,11 +192,96 @@ function updateRouterConfig(config) {
201
192
  }
202
193
  }
203
194
 
195
+ /**
196
+ * 处理页面加载事件
197
+ */
198
+ function handlePageLoad() {
199
+ try {
200
+ _rrweb.record.addCustomEvent(_constants.EVENT_PAGE_LIFECYCLE, {
201
+ type: 'PAGE_LOAD',
202
+ url: window.location.href,
203
+ timestamp: Date.now()
204
+ });
205
+ } catch (error) {
206
+ _logger.default.warn('Failed to add PAGE_LOAD event (recording may have stopped)', error);
207
+ }
208
+ }
209
+
210
+ /**
211
+ * 处理页面卸载事件
212
+ */
213
+ function handlePageUnload() {
214
+ try {
215
+ _rrweb.record.addCustomEvent(_constants.EVENT_PAGE_LIFECYCLE, {
216
+ type: 'PAGE_UNLOAD',
217
+ url: window.location.href,
218
+ timestamp: Date.now()
219
+ });
220
+ } catch (error) {
221
+ _logger.default.warn('Failed to add PAGE_UNLOAD event (recording may have stopped)', error);
222
+ }
223
+ }
224
+
225
+ /**
226
+ * 处理页面隐藏事件(移动端友好,替代 beforeunload)
227
+ * pagehide 在移动端浏览器中比 beforeunload 更可靠
228
+ */
229
+ function handlePageHide(event) {
230
+ try {
231
+ _rrweb.record.addCustomEvent(_constants.EVENT_PAGE_LIFECYCLE, {
232
+ type: 'PAGE_HIDE',
233
+ url: window.location.href,
234
+ timestamp: Date.now(),
235
+ persisted: event.persisted // 页面是否进入 bfcache
236
+ });
237
+ } catch (error) {
238
+ _logger.default.warn('Failed to add PAGE_HIDE event (recording may have stopped)', error);
239
+ }
240
+ }
241
+
242
+ /**
243
+ * 处理页面显示事件(移动端友好,支持 bfcache 恢复检测)
244
+ * pageshow 在页面从 bfcache 恢复时也会触发
245
+ */
246
+ function handlePageShow(event) {
247
+ try {
248
+ _rrweb.record.addCustomEvent(_constants.EVENT_PAGE_LIFECYCLE, {
249
+ type: 'PAGE_SHOW',
250
+ url: window.location.href,
251
+ timestamp: Date.now(),
252
+ persisted: event.persisted // 是否从 bfcache 恢复
253
+ });
254
+
255
+ // 如果是从 bfcache 恢复,重置路由计时器
256
+ if (event.persisted) {
257
+ routeStartTime = Date.now();
258
+ }
259
+ } catch (error) {
260
+ _logger.default.warn('Failed to add PAGE_SHOW event (recording may have stopped)', error);
261
+ }
262
+ }
263
+
264
+ /**
265
+ * 处理页面可见性变化事件(移动端切换应用/标签页)
266
+ */
267
+ function handleVisibilityChange() {
268
+ try {
269
+ var isHidden = document.visibilityState === 'hidden';
270
+ _rrweb.record.addCustomEvent(_constants.EVENT_PAGE_LIFECYCLE, {
271
+ type: isHidden ? 'PAGE_VISIBILITY_HIDDEN' : 'PAGE_VISIBILITY_VISIBLE',
272
+ url: window.location.href,
273
+ timestamp: Date.now()
274
+ });
275
+ } catch (error) {
276
+ _logger.default.warn('Failed to add visibility change event (recording may have stopped)', error);
277
+ }
278
+ }
279
+
204
280
  /**
205
281
  * 初始化路由监控
206
282
  */
207
283
  function initRouterMonitor(config) {
208
- var _defaultConfig$enable2, _defaultConfig$trackH3, _defaultConfig$trackH4, _defaultConfig$trackP2, _defaultConfig$ignore2, _defaultConfig$custom2;
284
+ var _defaultConfig$enable2, _defaultConfig$trackH3, _defaultConfig$trackH4, _defaultConfig$trackP2, _defaultConfig$ignore2;
209
285
  if (isInitialized || typeof window === 'undefined') return;
210
286
 
211
287
  // 合并配置
@@ -215,16 +291,13 @@ function initRouterMonitor(config) {
215
291
  trackHashChange: (_defaultConfig$trackH3 = defaultConfig.trackHashChange) !== null && _defaultConfig$trackH3 !== void 0 ? _defaultConfig$trackH3 : true,
216
292
  trackHistoryChange: (_defaultConfig$trackH4 = defaultConfig.trackHistoryChange) !== null && _defaultConfig$trackH4 !== void 0 ? _defaultConfig$trackH4 : true,
217
293
  trackPageStayTime: (_defaultConfig$trackP2 = defaultConfig.trackPageStayTime) !== null && _defaultConfig$trackP2 !== void 0 ? _defaultConfig$trackP2 : true,
218
- ignoreRoutes: (_defaultConfig$ignore2 = defaultConfig.ignoreRoutes) !== null && _defaultConfig$ignore2 !== void 0 ? _defaultConfig$ignore2 : [],
219
- customMatchers: (_defaultConfig$custom2 = defaultConfig.customMatchers) !== null && _defaultConfig$custom2 !== void 0 ? _defaultConfig$custom2 : []
294
+ ignoreRoutes: (_defaultConfig$ignore2 = defaultConfig.ignoreRoutes) !== null && _defaultConfig$ignore2 !== void 0 ? _defaultConfig$ignore2 : []
220
295
  }, config || {});
221
296
 
222
297
  // 如果未启用,直接返回
223
298
  if (!routerConfig.enable) {
224
- console.log('RLog route monitor is disabled by config');
225
299
  return;
226
300
  }
227
- console.log('RLog route monitor initialized with config:', routerConfig);
228
301
 
229
302
  // 设置初始路由
230
303
  currentRoute = getCurrentRoute();
@@ -237,6 +310,16 @@ function initRouterMonitor(config) {
237
310
  if (routerConfig.trackHashChange) {
238
311
  window.addEventListener('hashchange', handleHashChange);
239
312
  }
313
+
314
+ // 监听页面生命周期事件
315
+ window.addEventListener('load', handlePageLoad);
316
+ window.addEventListener('beforeunload', handlePageUnload);
317
+
318
+ // 监听移动端页面生命周期事件
319
+ // pagehide/pageshow 在移动端比 beforeunload 更可靠
320
+ window.addEventListener('pagehide', handlePageHide);
321
+ window.addEventListener('pageshow', handlePageShow);
322
+ document.addEventListener('visibilitychange', handleVisibilityChange);
240
323
  isInitialized = true;
241
324
  }
242
325
 
@@ -275,11 +358,15 @@ function stopRouterMonitor() {
275
358
  if (typeof window !== 'undefined') {
276
359
  window.removeEventListener('popstate', handlePopState);
277
360
  window.removeEventListener('hashchange', handleHashChange);
361
+ window.removeEventListener('load', handlePageLoad);
362
+ window.removeEventListener('beforeunload', handlePageUnload);
363
+ window.removeEventListener('pagehide', handlePageHide);
364
+ window.removeEventListener('pageshow', handlePageShow);
365
+ document.removeEventListener('visibilitychange', handleVisibilityChange);
278
366
  }
279
367
 
280
368
  // 重置状态
281
369
  isInitialized = false;
282
370
  originalPushState = null;
283
371
  originalReplaceState = null;
284
- console.log('RLog router monitor stopped');
285
372
  }
@@ -1 +1 @@
1
- {"version":3,"file":"rrweb.d.ts","sourceRoot":"","sources":["../../../src/lib/rrweb.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,UAAU,YAKtB,CAAC;AAEF,eAAO,MAAM,WAAW,YAwFvB,CAAC"}
1
+ {"version":3,"file":"rrweb.d.ts","sourceRoot":"","sources":["../../../src/lib/rrweb.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,UAAU,YAKtB,CAAC;AAEF,eAAO,MAAM,WAAW,YA0FvB,CAAC"}
@@ -10,6 +10,9 @@ var _utils = require("./utils");
10
10
  var _storageManager = require("./storage-manager");
11
11
  var _net = require("./net");
12
12
  var _config = require("./config");
13
+ var _logger = _interopRequireDefault(require("./logger"));
14
+ var _constants = require("./constants");
15
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
16
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
14
17
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
15
18
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
@@ -29,17 +32,17 @@ var startRecord = exports.startRecord = function startRecord() {
29
32
  // 检查采集总开关
30
33
  var config = (0, _config.getConfig)();
31
34
  if (!config.enable) {
32
- console.log('RLog recording is disabled by config');
33
35
  return;
34
36
  }
35
37
  var deviceId = (0, _utils.getDeviceId)();
38
+ var storageKey = (0, _utils.getStorageKey)();
36
39
 
37
40
  // 根据配置决定是否清空存储数据
38
41
  if (config.clearStorageBeforeRecord) {
39
- _storageManager.storage.clear(deviceId).then(function () {
40
- console.log('Storage cleared before recording');
42
+ _storageManager.storage.clear(storageKey).then(function () {
43
+ // cleared
41
44
  }).catch(function (error) {
42
- console.warn('Failed to clear storage before recording:', error);
45
+ _logger.default.warn('Failed to clear storage before recording', error);
43
46
  });
44
47
  }
45
48
  var plugins = [];
@@ -59,31 +62,36 @@ var startRecord = exports.startRecord = function startRecord() {
59
62
  })
60
63
  });
61
64
  plugins.push((0, _rrwebPluginConsoleRecord.getRecordConsolePlugin)(consoleConfig));
62
- } else {
63
- console.log('RLog console recording is disabled by config');
64
65
  }
65
66
  stopRecordFn = rrweb.record({
66
67
  emit: function emit(event) {
67
68
  // you should use console.log in this way to avoid errors.
68
- var defaultLog = console.log['__rrweb_original__'] ? console.log['__rrweb_original__'] : console.log;
69
- if (event.type !== rrweb.EventType.IncrementalSnapshot) {
70
- // 过滤不打印出增量更新的日志
71
- defaultLog('event', event);
69
+ // const defaultLog = (console.log as any)['__rrweb_original__']
70
+ // ? (console.log as any)['__rrweb_original__']
71
+ // : console.log;
72
+ // if (event.type !== rrweb.EventType.IncrementalSnapshot) {
73
+ // // 过滤不打印出增量更新的日志
74
+ // defaultLog('event', event);
75
+ // }
76
+
77
+ // 统一写入 Storage(full 和 error 模式共用)
78
+ try {
79
+ _storageManager.storage.push(storageKey, event);
80
+ } catch (error) {
81
+ // 存储失败不应影响 rrweb 录制
82
+ _logger.default.warn('Failed to storage push event:', error);
72
83
  }
73
- _storageManager.storage.push(deviceId, event);
74
84
  },
75
85
  recordCanvas: true,
76
- sampling: _objectSpread({
77
- canvas: config.samplingRate
78
- }, config.sampling || {}),
86
+ sampling: config.sampling,
79
87
  checkoutEveryNms: config.checkoutEveryNms,
80
88
  ignoreClass: config.ignoreClass,
81
89
  blockClass: config.blockClass,
82
90
  maskTextClass: config.maskTextClass,
83
91
  // 图像的格式
84
92
  dataURLOptions: {
85
- type: 'image/webp',
86
- quality: 0.6
93
+ type: _constants.CANVAS_EXPORT_TYPE,
94
+ quality: _constants.CANVAS_EXPORT_QUALITY
87
95
  },
88
96
  collectFonts: true,
89
97
  recordCrossOriginIframes: true,
@@ -93,15 +101,15 @@ var startRecord = exports.startRecord = function startRecord() {
93
101
  });
94
102
 
95
103
  // 设置网络监控
96
- (0, _net.setCustomHeaders)({
97
- 'rlog-deviceId': deviceId
98
- });
99
- (0, _net.setWhiteListUrls)(['http://alipay-rmsdeploy-image.cn-hangzhou.alipay.aliyun-inc.com']);
104
+ (0, _net.setCustomHeaders)(_defineProperty({}, _constants.STORAGE_KEY_DEVICE_ID, deviceId));
105
+ (0, _net.setWhiteListUrls)(_constants.DEFAULT_WHITE_LIST_URLS);
100
106
 
101
107
  // 根据配置决定是否开启接口请求抓取
102
108
  if (config.http) {
103
- (0, _net.watchXhr)(rrweb.record);
104
- } else {
105
- console.log('RLog HTTP recording is disabled by config');
109
+ try {
110
+ (0, _net.watchXhr)(rrweb.record);
111
+ } catch (error) {
112
+ _logger.default.warn('Failed to initialize HTTP monitoring:', error);
113
+ }
106
114
  }
107
115
  };
@@ -16,10 +16,22 @@ declare class StorageManager implements StorageAdapter {
16
16
  unshiftBatch(deviceId: string, data: any[]): Promise<void>;
17
17
  pull(deviceId: string, length: number): Promise<any[]>;
18
18
  clear(deviceId: string): Promise<void>;
19
+ /**
20
+ * 按时间范围提取事件(用于 error 模式)
21
+ */
22
+ pullByTimeRange(deviceId: string, startTime: number, endTime: number): Promise<any[]>;
23
+ /**
24
+ * 按时间范围移除事件(用于 error 模式)
25
+ */
26
+ removeByTimeRange(deviceId: string, sinceTime: number): Promise<void>;
19
27
  /**
20
28
  * 获取当前存储适配器类型
21
29
  */
22
30
  getAdapterType(): string;
31
+ /**
32
+ * 获取存储的事件数量(非破坏性只读操作)
33
+ */
34
+ count(deviceId: string): Promise<number>;
23
35
  /**
24
36
  * 获取存储状态(调试用)
25
37
  */
@@ -1 +1 @@
1
- {"version":3,"file":"storage-manager.d.ts","sourceRoot":"","sources":["../../../src/lib/storage-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAK3D;;GAEG;AACH,cAAM,cAAe,YAAW,cAAc;IAC5C,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,cAAc,CAAwC;;IAM9D,OAAO,CAAC,aAAa;IAkCrB;;OAEG;YACW,SAAS;IA6BjB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1D,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAItD,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5C;;OAEG;IACH,cAAc,IAAI,MAAM;IAWxB;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAC/C,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CAqBH;AAGD,eAAO,MAAM,OAAO,gBAAuB,CAAC"}
1
+ {"version":3,"file":"storage-manager.d.ts","sourceRoot":"","sources":["../../../src/lib/storage-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAO3D;;GAEG;AACH,cAAM,cAAe,YAAW,cAAc;IAC5C,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,cAAc,CAAwC;;IAM9D,OAAO,CAAC,aAAa;IAkCrB;;OAEG;YACW,SAAS;IA6BjB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1D,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAItD,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5C;;OAEG;IACG,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,GAAG,EAAE,CAAC;IAUjB;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3E;;OAEG;IACH,cAAc,IAAI,MAAM;IAWxB;;OAEG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAU9C;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAC/C,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CAaH;AAGD,eAAO,MAAM,OAAO,gBAAuB,CAAC"}