@antglobal/rlog-sdk 0.0.1755855517-dev.9 → 0.0.1781493462-dev.2
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 +60 -26
- package/dist/esm/lib/config.d.ts +14 -7
- package/dist/esm/lib/config.d.ts.map +1 -1
- package/dist/esm/lib/config.js +63 -35
- package/dist/esm/lib/constants.d.ts +97 -0
- package/dist/esm/lib/constants.d.ts.map +1 -0
- package/dist/esm/lib/constants.js +159 -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 -119
- 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 +41 -30
- package/dist/esm/lib/sign.d.ts +36 -0
- package/dist/esm/lib/sign.d.ts.map +1 -0
- package/dist/esm/lib/sign.js +393 -0
- 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 +570 -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 +80 -0
- package/dist/esm/lib/utils.d.ts.map +1 -1
- package/dist/esm/lib/utils.js +276 -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 +61 -26
- package/dist/lib/lib/config.d.ts +14 -7
- package/dist/lib/lib/config.d.ts.map +1 -1
- package/dist/lib/lib/config.js +65 -35
- package/dist/lib/lib/constants.d.ts +97 -0
- package/dist/lib/lib/constants.d.ts.map +1 -0
- package/dist/lib/lib/constants.js +165 -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 -120
- 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 +41 -31
- package/dist/lib/lib/sign.d.ts +36 -0
- package/dist/lib/lib/sign.d.ts.map +1 -0
- package/dist/lib/lib/sign.js +398 -0
- 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 +581 -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 +80 -0
- package/dist/lib/lib/utils.d.ts.map +1 -1
- package/dist/lib/lib/utils.js +284 -6
- package/dist/rlog-sdk.min.js +1 -1
- package/package.json +5 -4
|
@@ -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":"AAkBA,eAAO,MAAM,UAAU,YAKtB,CAAC;AAEF,eAAO,MAAM,WAAW,YA+FvB,CAAC"}
|
package/dist/lib/lib/rrweb.js
CHANGED
|
@@ -4,14 +4,15 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.stopRecord = exports.startRecord = void 0;
|
|
7
|
-
var
|
|
7
|
+
var _rrweb = require("rrweb");
|
|
8
8
|
var _rrwebPluginConsoleRecord = require("@rrweb/rrweb-plugin-console-record");
|
|
9
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
|
-
|
|
14
|
-
|
|
13
|
+
var _logger = _interopRequireDefault(require("./logger"));
|
|
14
|
+
var _constants = require("./constants");
|
|
15
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
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); }
|
|
16
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; }
|
|
17
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; }
|
|
@@ -26,20 +27,21 @@ var stopRecord = exports.stopRecord = function stopRecord() {
|
|
|
26
27
|
}
|
|
27
28
|
};
|
|
28
29
|
var startRecord = exports.startRecord = function startRecord() {
|
|
30
|
+
var _config$ignoreCSSAttr;
|
|
29
31
|
// 检查采集总开关
|
|
30
32
|
var config = (0, _config.getConfig)();
|
|
31
33
|
if (!config.enable) {
|
|
32
|
-
console.log('RLog recording is disabled by config');
|
|
33
34
|
return;
|
|
34
35
|
}
|
|
35
36
|
var deviceId = (0, _utils.getDeviceId)();
|
|
37
|
+
var storageKey = (0, _utils.getStorageKey)();
|
|
36
38
|
|
|
37
39
|
// 根据配置决定是否清空存储数据
|
|
38
40
|
if (config.clearStorageBeforeRecord) {
|
|
39
|
-
_storageManager.storage.clear(
|
|
40
|
-
|
|
41
|
+
_storageManager.storage.clear(storageKey).then(function () {
|
|
42
|
+
// cleared
|
|
41
43
|
}).catch(function (error) {
|
|
42
|
-
|
|
44
|
+
_logger.default.warn('Failed to clear storage before recording', error);
|
|
43
45
|
});
|
|
44
46
|
}
|
|
45
47
|
var plugins = [];
|
|
@@ -59,49 +61,57 @@ var startRecord = exports.startRecord = function startRecord() {
|
|
|
59
61
|
})
|
|
60
62
|
});
|
|
61
63
|
plugins.push((0, _rrwebPluginConsoleRecord.getRecordConsolePlugin)(consoleConfig));
|
|
62
|
-
} else {
|
|
63
|
-
console.log('RLog console recording is disabled by config');
|
|
64
64
|
}
|
|
65
|
-
|
|
65
|
+
|
|
66
|
+
// 构建 ignoreCSSAttributes 集合
|
|
67
|
+
var ignoreCSSAttributes = (_config$ignoreCSSAttr = config.ignoreCSSAttributes) !== null && _config$ignoreCSSAttr !== void 0 && _config$ignoreCSSAttr.length ? new Set(config.ignoreCSSAttributes) : new Set();
|
|
68
|
+
stopRecordFn = (0, _rrweb.record)({
|
|
66
69
|
emit: function emit(event) {
|
|
67
70
|
// you should use console.log in this way to avoid errors.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
71
|
+
// const defaultLog = (console.log as any)['__rrweb_original__']
|
|
72
|
+
// ? (console.log as any)['__rrweb_original__']
|
|
73
|
+
// : console.log;
|
|
74
|
+
// if (event.type !== rrweb.EventType.IncrementalSnapshot) {
|
|
75
|
+
// // 过滤不打印出增量更新的日志
|
|
76
|
+
// defaultLog('event', event);
|
|
77
|
+
// }
|
|
78
|
+
|
|
79
|
+
// 统一写入 Storage(full 和 error 模式共用)
|
|
80
|
+
try {
|
|
81
|
+
_storageManager.storage.push(storageKey, event);
|
|
82
|
+
} catch (error) {
|
|
83
|
+
// 存储失败不应影响 rrweb 录制
|
|
84
|
+
_logger.default.warn('Failed to storage push event:', error);
|
|
72
85
|
}
|
|
73
|
-
_storageManager.storage.push(deviceId, event);
|
|
74
86
|
},
|
|
75
87
|
recordCanvas: true,
|
|
76
|
-
sampling:
|
|
77
|
-
canvas: config.samplingRate
|
|
78
|
-
}, config.sampling || {}),
|
|
88
|
+
sampling: config.sampling,
|
|
79
89
|
checkoutEveryNms: config.checkoutEveryNms,
|
|
80
90
|
ignoreClass: config.ignoreClass,
|
|
81
91
|
blockClass: config.blockClass,
|
|
82
92
|
maskTextClass: config.maskTextClass,
|
|
83
|
-
//
|
|
93
|
+
// 忽略高频 CSS 属性变更,避免动画 CSS 变量产生冗余增量快照
|
|
94
|
+
ignoreCSSAttributes: ignoreCSSAttributes,
|
|
95
|
+
// 图像的格式:iOS Safari 不支持 canvas 导出 webp(会静默回退为 png 无损,体积大),降级为 jpeg
|
|
84
96
|
dataURLOptions: {
|
|
85
|
-
type:
|
|
86
|
-
quality:
|
|
97
|
+
type: (0, _utils.isIOS)() ? _constants.CANVAS_EXPORT_TYPE_JPEG : _constants.CANVAS_EXPORT_TYPE_WEBP,
|
|
98
|
+
quality: _constants.CANVAS_EXPORT_QUALITY
|
|
87
99
|
},
|
|
88
100
|
collectFonts: true,
|
|
89
101
|
recordCrossOriginIframes: true,
|
|
90
|
-
plugins: [].concat(plugins)
|
|
91
|
-
// 是否使用rrweb的packFn压缩事件数据,默认false
|
|
92
|
-
packFn: config.packEvents ? rrweb.pack : undefined
|
|
102
|
+
plugins: [].concat(plugins)
|
|
93
103
|
});
|
|
94
104
|
|
|
95
105
|
// 设置网络监控
|
|
96
|
-
(0, _net.setCustomHeaders)({
|
|
97
|
-
|
|
98
|
-
});
|
|
99
|
-
(0, _net.setWhiteListUrls)(['http://alipay-rmsdeploy-image.cn-hangzhou.alipay.aliyun-inc.com']);
|
|
106
|
+
(0, _net.setCustomHeaders)(_defineProperty({}, _constants.STORAGE_KEY_DEVICE_ID, deviceId));
|
|
107
|
+
(0, _net.setWhiteListUrls)(_constants.DEFAULT_WHITE_LIST_URLS);
|
|
100
108
|
|
|
101
109
|
// 根据配置决定是否开启接口请求抓取
|
|
102
110
|
if (config.http) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
111
|
+
try {
|
|
112
|
+
(0, _net.watchXhr)(_rrweb.record);
|
|
113
|
+
} catch (error) {
|
|
114
|
+
_logger.default.warn('Failed to initialize HTTP monitoring:', error);
|
|
115
|
+
}
|
|
106
116
|
}
|
|
107
117
|
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 上报接口加签模块
|
|
3
|
+
*
|
|
4
|
+
* 签名算法:
|
|
5
|
+
* 1. md5 = MD5(rrweb 录制的 JSON 数据)
|
|
6
|
+
* 2. ts = Date.now()
|
|
7
|
+
* 3. secret = MD5(md5 + ts) — 一次性签名密钥
|
|
8
|
+
* 4. sign = HMAC-SHA256(encodeURIComponent(sortedParams) + md5 + ts, secret)
|
|
9
|
+
*
|
|
10
|
+
* 请求头:
|
|
11
|
+
* x-bk-sign = sign
|
|
12
|
+
* x-bk-ts = ts
|
|
13
|
+
* x-bk-dm = md5
|
|
14
|
+
*/
|
|
15
|
+
export declare function md5(str: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* 将查询参数按 key 字母序排列并拼接为字符串,过滤空值
|
|
18
|
+
* @param params 查询参数键值对
|
|
19
|
+
* @returns 排序后的参数字符串,如 "appId=xxx&deviceId=yyy&startTime=zzz"
|
|
20
|
+
*/
|
|
21
|
+
export declare function sortAndConcatParams(params: Record<string, string>): string;
|
|
22
|
+
/**
|
|
23
|
+
* 计算上报接口的签名请求头
|
|
24
|
+
*
|
|
25
|
+
* 签名流程:
|
|
26
|
+
* 1. md5 = MD5(上报数据的 JSON 字符串)
|
|
27
|
+
* 2. ts = 当前时间戳(毫秒)
|
|
28
|
+
* 3. secret = MD5(md5 + ts) — 一次性签名密钥
|
|
29
|
+
* 4. sign = HMAC-SHA256(encodeURIComponent(sortedParams) + md5 + ts, secret)
|
|
30
|
+
*
|
|
31
|
+
* @param queryParams 查询参数键值对
|
|
32
|
+
* @param jsonData 上报数据的 JSON 字符串
|
|
33
|
+
* @returns 签名请求头 { x-bk-sign, x-bk-ts, x-bk-dm }
|
|
34
|
+
*/
|
|
35
|
+
export declare function computeSignHeaders(queryParams: Record<string, string>, jsonData: string): Promise<Record<string, string>>;
|
|
36
|
+
//# sourceMappingURL=sign.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign.d.ts","sourceRoot":"","sources":["../../../src/lib/sign.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAqKH,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvC;AAoMD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAW1E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAajC"}
|