@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.
- package/README.md +192 -432
- package/dist/esm/index.d.ts +14 -41
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +92 -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 +14 -41
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +81 -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
|
@@ -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
|
-
|
|
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
|
|
71
|
-
if (!((
|
|
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
|
|
88
|
-
if (!((
|
|
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(
|
|
87
|
+
_rrweb.record.addCustomEvent(_constants.EVENT_ROUTE_CHANGE, event);
|
|
106
88
|
} catch (error) {
|
|
107
89
|
// 忽略录制已停止时的异常
|
|
108
|
-
|
|
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
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
|
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
|
|
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":"
|
|
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/lib/lib/rrweb.js
CHANGED
|
@@ -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(
|
|
40
|
-
|
|
42
|
+
_storageManager.storage.clear(storageKey).then(function () {
|
|
43
|
+
// cleared
|
|
41
44
|
}).catch(function (error) {
|
|
42
|
-
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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:
|
|
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:
|
|
86
|
-
quality:
|
|
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
|
-
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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;
|
|
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"}
|