@antglobal/rlog-sdk 0.0.1755855517-dev.8 → 0.0.1779194445-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +192 -432
- package/dist/esm/index.d.ts +15 -41
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +101 -76
- package/dist/esm/lib/api.d.ts +10 -0
- package/dist/esm/lib/api.d.ts.map +1 -1
- package/dist/esm/lib/api.js +58 -35
- package/dist/esm/lib/config.d.ts +14 -16
- package/dist/esm/lib/config.d.ts.map +1 -1
- package/dist/esm/lib/config.js +61 -33
- package/dist/esm/lib/constants.d.ts +89 -0
- package/dist/esm/lib/constants.d.ts.map +1 -0
- package/dist/esm/lib/constants.js +145 -0
- package/dist/esm/lib/drive/indexeddb-adapt.d.ts +12 -0
- package/dist/esm/lib/drive/indexeddb-adapt.d.ts.map +1 -1
- package/dist/esm/lib/drive/indexeddb-adapt.js +190 -20
- package/dist/esm/lib/drive/localstorage-adapt.d.ts +12 -0
- package/dist/esm/lib/drive/localstorage-adapt.d.ts.map +1 -1
- package/dist/esm/lib/drive/localstorage-adapt.js +179 -36
- package/dist/esm/lib/drive/memory-adapt.d.ts +10 -2
- package/dist/esm/lib/drive/memory-adapt.d.ts.map +1 -1
- package/dist/esm/lib/drive/memory-adapt.js +118 -26
- package/dist/esm/lib/drive/safe-storage.d.ts +24 -0
- package/dist/esm/lib/drive/safe-storage.d.ts.map +1 -0
- package/dist/esm/lib/drive/safe-storage.js +96 -0
- package/dist/esm/lib/drive/storage-interface.d.ts +20 -0
- package/dist/esm/lib/drive/storage-interface.d.ts.map +1 -1
- package/dist/esm/lib/error-trigger.d.ts +73 -0
- package/dist/esm/lib/error-trigger.d.ts.map +1 -0
- package/dist/esm/lib/error-trigger.js +162 -0
- package/dist/esm/lib/error.d.ts +9 -0
- package/dist/esm/lib/error.d.ts.map +1 -1
- package/dist/esm/lib/error.js +70 -118
- package/dist/esm/lib/init.d.ts +0 -4
- package/dist/esm/lib/init.d.ts.map +1 -1
- package/dist/esm/lib/init.js +148 -47
- package/dist/esm/lib/logger.d.ts +27 -0
- package/dist/esm/lib/logger.d.ts.map +1 -0
- package/dist/esm/lib/logger.js +79 -0
- package/dist/esm/lib/net.d.ts +11 -0
- package/dist/esm/lib/net.d.ts.map +1 -1
- package/dist/esm/lib/net.js +264 -116
- package/dist/esm/lib/request.d.ts.map +1 -1
- package/dist/esm/lib/request.js +2 -2
- package/dist/esm/lib/router-monitor.d.ts.map +1 -1
- package/dist/esm/lib/router-monitor.js +135 -49
- package/dist/esm/lib/rrweb.d.ts.map +1 -1
- package/dist/esm/lib/rrweb.js +31 -24
- package/dist/esm/lib/storage-manager.d.ts +12 -0
- package/dist/esm/lib/storage-manager.d.ts.map +1 -1
- package/dist/esm/lib/storage-manager.js +129 -46
- package/dist/esm/lib/upload-worker-manager.d.ts +47 -0
- package/dist/esm/lib/upload-worker-manager.d.ts.map +1 -0
- package/dist/esm/lib/upload-worker-manager.js +559 -0
- package/dist/esm/lib/upload-worker.d.ts +58 -0
- package/dist/esm/lib/upload-worker.d.ts.map +1 -0
- package/dist/esm/lib/upload-worker.js +28 -0
- package/dist/esm/lib/uploader.d.ts +43 -0
- package/dist/esm/lib/uploader.d.ts.map +1 -1
- package/dist/esm/lib/uploader.js +464 -102
- package/dist/esm/lib/utils.d.ts +75 -0
- package/dist/esm/lib/utils.d.ts.map +1 -1
- package/dist/esm/lib/utils.js +268 -5
- package/dist/lib/index.d.ts +15 -41
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +89 -63
- package/dist/lib/lib/api.d.ts +10 -0
- package/dist/lib/lib/api.d.ts.map +1 -1
- package/dist/lib/lib/api.js +59 -35
- package/dist/lib/lib/config.d.ts +14 -16
- package/dist/lib/lib/config.d.ts.map +1 -1
- package/dist/lib/lib/config.js +63 -33
- package/dist/lib/lib/constants.d.ts +89 -0
- package/dist/lib/lib/constants.d.ts.map +1 -0
- package/dist/lib/lib/constants.js +151 -0
- package/dist/lib/lib/drive/indexeddb-adapt.d.ts +12 -0
- package/dist/lib/lib/drive/indexeddb-adapt.d.ts.map +1 -1
- package/dist/lib/lib/drive/indexeddb-adapt.js +191 -19
- package/dist/lib/lib/drive/localstorage-adapt.d.ts +12 -0
- package/dist/lib/lib/drive/localstorage-adapt.d.ts.map +1 -1
- package/dist/lib/lib/drive/localstorage-adapt.js +179 -36
- package/dist/lib/lib/drive/memory-adapt.d.ts +10 -2
- package/dist/lib/lib/drive/memory-adapt.d.ts.map +1 -1
- package/dist/lib/lib/drive/memory-adapt.js +117 -26
- package/dist/lib/lib/drive/safe-storage.d.ts +24 -0
- package/dist/lib/lib/drive/safe-storage.d.ts.map +1 -0
- package/dist/lib/lib/drive/safe-storage.js +102 -0
- package/dist/lib/lib/drive/storage-interface.d.ts +20 -0
- package/dist/lib/lib/drive/storage-interface.d.ts.map +1 -1
- package/dist/lib/lib/error-trigger.d.ts +73 -0
- package/dist/lib/lib/error-trigger.d.ts.map +1 -0
- package/dist/lib/lib/error-trigger.js +167 -0
- package/dist/lib/lib/error.d.ts +9 -0
- package/dist/lib/lib/error.d.ts.map +1 -1
- package/dist/lib/lib/error.js +73 -118
- package/dist/lib/lib/init.d.ts +0 -4
- package/dist/lib/lib/init.d.ts.map +1 -1
- package/dist/lib/lib/init.js +144 -43
- package/dist/lib/lib/logger.d.ts +27 -0
- package/dist/lib/lib/logger.d.ts.map +1 -0
- package/dist/lib/lib/logger.js +84 -0
- package/dist/lib/lib/net.d.ts +11 -0
- package/dist/lib/lib/net.d.ts.map +1 -1
- package/dist/lib/lib/net.js +268 -117
- package/dist/lib/lib/request.d.ts.map +1 -1
- package/dist/lib/lib/request.js +3 -3
- package/dist/lib/lib/router-monitor.d.ts.map +1 -1
- package/dist/lib/lib/router-monitor.js +136 -49
- package/dist/lib/lib/rrweb.d.ts.map +1 -1
- package/dist/lib/lib/rrweb.js +31 -23
- package/dist/lib/lib/storage-manager.d.ts +12 -0
- package/dist/lib/lib/storage-manager.d.ts.map +1 -1
- package/dist/lib/lib/storage-manager.js +130 -46
- package/dist/lib/lib/upload-worker-manager.d.ts +47 -0
- package/dist/lib/lib/upload-worker-manager.d.ts.map +1 -0
- package/dist/lib/lib/upload-worker-manager.js +570 -0
- package/dist/lib/lib/upload-worker.d.ts +58 -0
- package/dist/lib/lib/upload-worker.d.ts.map +1 -0
- package/dist/lib/lib/upload-worker.js +33 -0
- package/dist/lib/lib/uploader.d.ts +43 -0
- package/dist/lib/lib/uploader.d.ts.map +1 -1
- package/dist/lib/lib/uploader.js +468 -101
- package/dist/lib/lib/utils.d.ts +75 -0
- package/dist/lib/lib/utils.d.ts.map +1 -1
- package/dist/lib/lib/utils.js +276 -6
- package/dist/rlog-sdk.min.js +1 -1
- 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
|
-
|
|
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
|
|
64
|
-
if (!((
|
|
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
|
|
81
|
-
if (!((
|
|
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(
|
|
79
|
+
record.addCustomEvent(EVENT_ROUTE_CHANGE, event);
|
|
99
80
|
} catch (error) {
|
|
100
81
|
// 忽略录制已停止时的异常
|
|
101
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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
|
|
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
|
|
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":"
|
|
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"}
|
package/dist/esm/lib/rrweb.js
CHANGED
|
@@ -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(
|
|
32
|
-
|
|
33
|
+
storage.clear(storageKey).then(function () {
|
|
34
|
+
// cleared
|
|
33
35
|
}).catch(function (error) {
|
|
34
|
-
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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:
|
|
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:
|
|
78
|
-
quality:
|
|
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
|
-
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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;
|
|
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"}
|