@antglobal/rlog-sdk 0.0.1755855517-dev.8 → 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 +14 -16
  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 -116
  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 +14 -16
  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 -117
  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
@@ -1,7 +1,4 @@
1
1
  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); }
2
- 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; } } }; }
3
- 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); }
4
- 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; }
5
2
  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; }
6
3
  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; }
7
4
  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; }
@@ -14,6 +11,8 @@ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e
14
11
 
15
12
  import { record } from 'rrweb';
16
13
  import { getConfig } from "./config";
14
+ import logger from "./logger";
15
+ import { EVENT_ROUTE_CHANGE, EVENT_PAGE_LIFECYCLE } from "./constants";
17
16
 
18
17
  // 路由变化事件类型
19
18
 
@@ -29,39 +28,18 @@ var originalReplaceState = null;
29
28
  * 获取当前路由
30
29
  */
31
30
  function getCurrentRoute() {
32
- var _routerConfig;
33
31
  if (typeof window === 'undefined') return '';
34
32
 
35
- // 优先使用完整路径
36
- var fullPath = window.location.pathname + window.location.search + window.location.hash;
37
-
38
- // 应用自定义匹配规则
39
- if ((_routerConfig = routerConfig) !== null && _routerConfig !== void 0 && _routerConfig.customMatchers) {
40
- var _iterator = _createForOfIteratorHelper(routerConfig.customMatchers),
41
- _step;
42
- try {
43
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
44
- var matcher = _step.value;
45
- var pattern = typeof matcher.pattern === 'string' ? new RegExp(matcher.pattern) : matcher.pattern;
46
- if (pattern.test(fullPath)) {
47
- return matcher.name || fullPath;
48
- }
49
- }
50
- } catch (err) {
51
- _iterator.e(err);
52
- } finally {
53
- _iterator.f();
54
- }
55
- }
56
- return fullPath;
33
+ // 使用完整路径
34
+ return window.location.pathname + window.location.search + window.location.hash;
57
35
  }
58
36
 
59
37
  /**
60
38
  * 检查路由是否应该被忽略
61
39
  */
62
40
  function shouldIgnoreRoute(route) {
63
- var _routerConfig2;
64
- if (!((_routerConfig2 = routerConfig) !== null && _routerConfig2 !== void 0 && _routerConfig2.ignoreRoutes)) return false;
41
+ var _routerConfig;
42
+ if (!((_routerConfig = routerConfig) !== null && _routerConfig !== void 0 && _routerConfig.ignoreRoutes)) return false;
65
43
  return routerConfig.ignoreRoutes.some(function (pattern) {
66
44
  if (typeof pattern === 'string') {
67
45
  return route.includes(pattern);
@@ -77,8 +55,8 @@ function shouldIgnoreRoute(route) {
77
55
  * 上报路由变化事件
78
56
  */
79
57
  function reportRouteChange(from, to, method) {
80
- var _routerConfig3;
81
- if (!((_routerConfig3 = routerConfig) !== null && _routerConfig3 !== void 0 && _routerConfig3.enable) || shouldIgnoreRoute(to)) {
58
+ var _routerConfig2;
59
+ if (!((_routerConfig2 = routerConfig) !== null && _routerConfig2 !== void 0 && _routerConfig2.enable) || shouldIgnoreRoute(to)) {
82
60
  return;
83
61
  }
84
62
  var event = {
@@ -89,16 +67,19 @@ function reportRouteChange(from, to, method) {
89
67
  timestamp: Date.now()
90
68
  };
91
69
 
70
+ // 更新当前路由
71
+ currentRoute = to;
72
+
92
73
  // 计算页面停留时间
93
74
  if (routerConfig.trackPageStayTime && from) {
94
75
  event.duration = Date.now() - routeStartTime;
95
76
  }
96
77
  try {
97
78
  // 使用 rrweb 的自定义事件功能上报
98
- record.addCustomEvent('route-change', event);
79
+ record.addCustomEvent(EVENT_ROUTE_CHANGE, event);
99
80
  } catch (error) {
100
81
  // 忽略录制已停止时的异常
101
- console.warn('Failed to add custom event (recording may have stopped):', error);
82
+ logger.warn('Failed to add custom event (recording may have stopped)', error);
102
83
  }
103
84
  // 重置计时器
104
85
  routeStartTime = Date.now();
@@ -114,28 +95,38 @@ function listenToHistoryChanges() {
114
95
 
115
96
  // 重写 pushState
116
97
  window.history.pushState = function () {
117
- var from = getCurrentRoute();
118
98
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
119
99
  args[_key] = arguments[_key];
120
100
  }
101
+ // 先调用原始方法,确保业务路由跳转不受影响
121
102
  var result = originalPushState.apply(this, args);
122
- var to = getCurrentRoute();
123
- if (from !== to) {
124
- reportRouteChange(from, to, 'pushState');
103
+ try {
104
+ var to = getCurrentRoute();
105
+ var from = currentRoute;
106
+ if (from !== to) {
107
+ reportRouteChange(from, to, 'pushState');
108
+ }
109
+ } catch (error) {
110
+ logger.warn('Error in pushState hook:', error);
125
111
  }
126
112
  return result;
127
113
  };
128
114
 
129
115
  // 重写 replaceState
130
116
  window.history.replaceState = function () {
131
- var from = getCurrentRoute();
132
117
  for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
133
118
  args[_key2] = arguments[_key2];
134
119
  }
120
+ // 先调用原始方法,确保业务路由跳转不受影响
135
121
  var result = originalReplaceState.apply(this, args);
136
- var to = getCurrentRoute();
137
- if (from !== to) {
138
- reportRouteChange(from, to, 'replaceState');
122
+ try {
123
+ var to = getCurrentRoute();
124
+ var from = currentRoute;
125
+ if (from !== to) {
126
+ reportRouteChange(from, to, 'replaceState');
127
+ }
128
+ } catch (error) {
129
+ logger.warn('Error in replaceState hook:', error);
139
130
  }
140
131
  return result;
141
132
  };
@@ -171,15 +162,14 @@ function handleHashChange() {
171
162
  * @param config 新的配置对象
172
163
  */
173
164
  export function updateRouterConfig(config) {
174
- var _defaultConfig$enable, _defaultConfig$trackH, _defaultConfig$trackH2, _defaultConfig$trackP, _defaultConfig$ignore, _defaultConfig$custom;
165
+ var _defaultConfig$enable, _defaultConfig$trackH, _defaultConfig$trackH2, _defaultConfig$trackP, _defaultConfig$ignore;
175
166
  var defaultConfig = getConfig().routerMonitor || {};
176
167
  var newConfig = _objectSpread({
177
168
  enable: (_defaultConfig$enable = defaultConfig.enable) !== null && _defaultConfig$enable !== void 0 ? _defaultConfig$enable : false,
178
169
  trackHashChange: (_defaultConfig$trackH = defaultConfig.trackHashChange) !== null && _defaultConfig$trackH !== void 0 ? _defaultConfig$trackH : true,
179
170
  trackHistoryChange: (_defaultConfig$trackH2 = defaultConfig.trackHistoryChange) !== null && _defaultConfig$trackH2 !== void 0 ? _defaultConfig$trackH2 : true,
180
171
  trackPageStayTime: (_defaultConfig$trackP = defaultConfig.trackPageStayTime) !== null && _defaultConfig$trackP !== void 0 ? _defaultConfig$trackP : true,
181
- ignoreRoutes: (_defaultConfig$ignore = defaultConfig.ignoreRoutes) !== null && _defaultConfig$ignore !== void 0 ? _defaultConfig$ignore : [],
182
- customMatchers: (_defaultConfig$custom = defaultConfig.customMatchers) !== null && _defaultConfig$custom !== void 0 ? _defaultConfig$custom : []
172
+ ignoreRoutes: (_defaultConfig$ignore = defaultConfig.ignoreRoutes) !== null && _defaultConfig$ignore !== void 0 ? _defaultConfig$ignore : []
183
173
  }, config || {});
184
174
 
185
175
  // 如果配置发生变化,重新初始化
@@ -194,11 +184,96 @@ export function updateRouterConfig(config) {
194
184
  }
195
185
  }
196
186
 
187
+ /**
188
+ * 处理页面加载事件
189
+ */
190
+ function handlePageLoad() {
191
+ try {
192
+ record.addCustomEvent(EVENT_PAGE_LIFECYCLE, {
193
+ type: 'PAGE_LOAD',
194
+ url: window.location.href,
195
+ timestamp: Date.now()
196
+ });
197
+ } catch (error) {
198
+ logger.warn('Failed to add PAGE_LOAD event (recording may have stopped)', error);
199
+ }
200
+ }
201
+
202
+ /**
203
+ * 处理页面卸载事件
204
+ */
205
+ function handlePageUnload() {
206
+ try {
207
+ record.addCustomEvent(EVENT_PAGE_LIFECYCLE, {
208
+ type: 'PAGE_UNLOAD',
209
+ url: window.location.href,
210
+ timestamp: Date.now()
211
+ });
212
+ } catch (error) {
213
+ logger.warn('Failed to add PAGE_UNLOAD event (recording may have stopped)', error);
214
+ }
215
+ }
216
+
217
+ /**
218
+ * 处理页面隐藏事件(移动端友好,替代 beforeunload)
219
+ * pagehide 在移动端浏览器中比 beforeunload 更可靠
220
+ */
221
+ function handlePageHide(event) {
222
+ try {
223
+ record.addCustomEvent(EVENT_PAGE_LIFECYCLE, {
224
+ type: 'PAGE_HIDE',
225
+ url: window.location.href,
226
+ timestamp: Date.now(),
227
+ persisted: event.persisted // 页面是否进入 bfcache
228
+ });
229
+ } catch (error) {
230
+ logger.warn('Failed to add PAGE_HIDE event (recording may have stopped)', error);
231
+ }
232
+ }
233
+
234
+ /**
235
+ * 处理页面显示事件(移动端友好,支持 bfcache 恢复检测)
236
+ * pageshow 在页面从 bfcache 恢复时也会触发
237
+ */
238
+ function handlePageShow(event) {
239
+ try {
240
+ record.addCustomEvent(EVENT_PAGE_LIFECYCLE, {
241
+ type: 'PAGE_SHOW',
242
+ url: window.location.href,
243
+ timestamp: Date.now(),
244
+ persisted: event.persisted // 是否从 bfcache 恢复
245
+ });
246
+
247
+ // 如果是从 bfcache 恢复,重置路由计时器
248
+ if (event.persisted) {
249
+ routeStartTime = Date.now();
250
+ }
251
+ } catch (error) {
252
+ logger.warn('Failed to add PAGE_SHOW event (recording may have stopped)', error);
253
+ }
254
+ }
255
+
256
+ /**
257
+ * 处理页面可见性变化事件(移动端切换应用/标签页)
258
+ */
259
+ function handleVisibilityChange() {
260
+ try {
261
+ var isHidden = document.visibilityState === 'hidden';
262
+ record.addCustomEvent(EVENT_PAGE_LIFECYCLE, {
263
+ type: isHidden ? 'PAGE_VISIBILITY_HIDDEN' : 'PAGE_VISIBILITY_VISIBLE',
264
+ url: window.location.href,
265
+ timestamp: Date.now()
266
+ });
267
+ } catch (error) {
268
+ logger.warn('Failed to add visibility change event (recording may have stopped)', error);
269
+ }
270
+ }
271
+
197
272
  /**
198
273
  * 初始化路由监控
199
274
  */
200
275
  export function initRouterMonitor(config) {
201
- var _defaultConfig$enable2, _defaultConfig$trackH3, _defaultConfig$trackH4, _defaultConfig$trackP2, _defaultConfig$ignore2, _defaultConfig$custom2;
276
+ var _defaultConfig$enable2, _defaultConfig$trackH3, _defaultConfig$trackH4, _defaultConfig$trackP2, _defaultConfig$ignore2;
202
277
  if (isInitialized || typeof window === 'undefined') return;
203
278
 
204
279
  // 合并配置
@@ -208,16 +283,13 @@ export function initRouterMonitor(config) {
208
283
  trackHashChange: (_defaultConfig$trackH3 = defaultConfig.trackHashChange) !== null && _defaultConfig$trackH3 !== void 0 ? _defaultConfig$trackH3 : true,
209
284
  trackHistoryChange: (_defaultConfig$trackH4 = defaultConfig.trackHistoryChange) !== null && _defaultConfig$trackH4 !== void 0 ? _defaultConfig$trackH4 : true,
210
285
  trackPageStayTime: (_defaultConfig$trackP2 = defaultConfig.trackPageStayTime) !== null && _defaultConfig$trackP2 !== void 0 ? _defaultConfig$trackP2 : true,
211
- ignoreRoutes: (_defaultConfig$ignore2 = defaultConfig.ignoreRoutes) !== null && _defaultConfig$ignore2 !== void 0 ? _defaultConfig$ignore2 : [],
212
- customMatchers: (_defaultConfig$custom2 = defaultConfig.customMatchers) !== null && _defaultConfig$custom2 !== void 0 ? _defaultConfig$custom2 : []
286
+ ignoreRoutes: (_defaultConfig$ignore2 = defaultConfig.ignoreRoutes) !== null && _defaultConfig$ignore2 !== void 0 ? _defaultConfig$ignore2 : []
213
287
  }, config || {});
214
288
 
215
289
  // 如果未启用,直接返回
216
290
  if (!routerConfig.enable) {
217
- console.log('RLog route monitor is disabled by config');
218
291
  return;
219
292
  }
220
- console.log('RLog route monitor initialized with config:', routerConfig);
221
293
 
222
294
  // 设置初始路由
223
295
  currentRoute = getCurrentRoute();
@@ -230,6 +302,16 @@ export function initRouterMonitor(config) {
230
302
  if (routerConfig.trackHashChange) {
231
303
  window.addEventListener('hashchange', handleHashChange);
232
304
  }
305
+
306
+ // 监听页面生命周期事件
307
+ window.addEventListener('load', handlePageLoad);
308
+ window.addEventListener('beforeunload', handlePageUnload);
309
+
310
+ // 监听移动端页面生命周期事件
311
+ // pagehide/pageshow 在移动端比 beforeunload 更可靠
312
+ window.addEventListener('pagehide', handlePageHide);
313
+ window.addEventListener('pageshow', handlePageShow);
314
+ document.addEventListener('visibilitychange', handleVisibilityChange);
233
315
  isInitialized = true;
234
316
  }
235
317
 
@@ -268,11 +350,15 @@ export function stopRouterMonitor() {
268
350
  if (typeof window !== 'undefined') {
269
351
  window.removeEventListener('popstate', handlePopState);
270
352
  window.removeEventListener('hashchange', handleHashChange);
353
+ window.removeEventListener('load', handlePageLoad);
354
+ window.removeEventListener('beforeunload', handlePageUnload);
355
+ window.removeEventListener('pagehide', handlePageHide);
356
+ window.removeEventListener('pageshow', handlePageShow);
357
+ document.removeEventListener('visibilitychange', handleVisibilityChange);
271
358
  }
272
359
 
273
360
  // 重置状态
274
361
  isInitialized = false;
275
362
  originalPushState = null;
276
363
  originalReplaceState = null;
277
- console.log('RLog router monitor stopped');
278
364
  }
@@ -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"}
@@ -6,10 +6,12 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
6
6
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
7
  import * as rrweb from 'rrweb';
8
8
  import { getRecordConsolePlugin } from '@rrweb/rrweb-plugin-console-record';
9
- import { getDeviceId } from "./utils";
9
+ import { getDeviceId, getStorageKey } from "./utils";
10
10
  import { storage } from "./storage-manager";
11
11
  import { setCustomHeaders, setWhiteListUrls, watchXhr } from "./net";
12
12
  import { getConfig } from "./config";
13
+ import logger from "./logger";
14
+ import { STORAGE_KEY_DEVICE_ID, DEFAULT_WHITE_LIST_URLS, CANVAS_EXPORT_TYPE, CANVAS_EXPORT_QUALITY } from "./constants";
13
15
  var stopRecordFn = null;
14
16
  export var stopRecord = function stopRecord() {
15
17
  if (stopRecordFn) {
@@ -21,17 +23,17 @@ export var startRecord = function startRecord() {
21
23
  // 检查采集总开关
22
24
  var config = getConfig();
23
25
  if (!config.enable) {
24
- console.log('RLog recording is disabled by config');
25
26
  return;
26
27
  }
27
28
  var deviceId = getDeviceId();
29
+ var storageKey = getStorageKey();
28
30
 
29
31
  // 根据配置决定是否清空存储数据
30
32
  if (config.clearStorageBeforeRecord) {
31
- storage.clear(deviceId).then(function () {
32
- console.log('Storage cleared before recording');
33
+ storage.clear(storageKey).then(function () {
34
+ // cleared
33
35
  }).catch(function (error) {
34
- console.warn('Failed to clear storage before recording:', error);
36
+ logger.warn('Failed to clear storage before recording', error);
35
37
  });
36
38
  }
37
39
  var plugins = [];
@@ -51,31 +53,36 @@ export var startRecord = function startRecord() {
51
53
  })
52
54
  });
53
55
  plugins.push(getRecordConsolePlugin(consoleConfig));
54
- } else {
55
- console.log('RLog console recording is disabled by config');
56
56
  }
57
57
  stopRecordFn = rrweb.record({
58
58
  emit: function emit(event) {
59
59
  // you should use console.log in this way to avoid errors.
60
- var defaultLog = console.log['__rrweb_original__'] ? console.log['__rrweb_original__'] : console.log;
61
- if (event.type !== rrweb.EventType.IncrementalSnapshot) {
62
- // 过滤不打印出增量更新的日志
63
- defaultLog('event', event);
60
+ // const defaultLog = (console.log as any)['__rrweb_original__']
61
+ // ? (console.log as any)['__rrweb_original__']
62
+ // : console.log;
63
+ // if (event.type !== rrweb.EventType.IncrementalSnapshot) {
64
+ // // 过滤不打印出增量更新的日志
65
+ // defaultLog('event', event);
66
+ // }
67
+
68
+ // 统一写入 Storage(full 和 error 模式共用)
69
+ try {
70
+ storage.push(storageKey, event);
71
+ } catch (error) {
72
+ // 存储失败不应影响 rrweb 录制
73
+ logger.warn('Failed to storage push event:', error);
64
74
  }
65
- storage.push(deviceId, event);
66
75
  },
67
76
  recordCanvas: true,
68
- sampling: _objectSpread({
69
- canvas: config.samplingRate
70
- }, config.sampling || {}),
77
+ sampling: config.sampling,
71
78
  checkoutEveryNms: config.checkoutEveryNms,
72
79
  ignoreClass: config.ignoreClass,
73
80
  blockClass: config.blockClass,
74
81
  maskTextClass: config.maskTextClass,
75
82
  // 图像的格式
76
83
  dataURLOptions: {
77
- type: 'image/webp',
78
- quality: 0.6
84
+ type: CANVAS_EXPORT_TYPE,
85
+ quality: CANVAS_EXPORT_QUALITY
79
86
  },
80
87
  collectFonts: true,
81
88
  recordCrossOriginIframes: true,
@@ -85,15 +92,15 @@ export var startRecord = function startRecord() {
85
92
  });
86
93
 
87
94
  // 设置网络监控
88
- setCustomHeaders({
89
- 'rlog-deviceId': deviceId
90
- });
91
- setWhiteListUrls(['http://alipay-rmsdeploy-image.cn-hangzhou.alipay.aliyun-inc.com']);
95
+ setCustomHeaders(_defineProperty({}, STORAGE_KEY_DEVICE_ID, deviceId));
96
+ setWhiteListUrls(DEFAULT_WHITE_LIST_URLS);
92
97
 
93
98
  // 根据配置决定是否开启接口请求抓取
94
99
  if (config.http) {
95
- watchXhr(rrweb.record);
96
- } else {
97
- console.log('RLog HTTP recording is disabled by config');
100
+ try {
101
+ watchXhr(rrweb.record);
102
+ } catch (error) {
103
+ logger.warn('Failed to initialize HTTP monitoring:', error);
104
+ }
98
105
  }
99
106
  };
@@ -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"}