@antglobal/rlog-sdk 0.0.1755855517-dev.11 → 0.0.1755855517-dev.13
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/dist/esm/lib/api.d.ts +10 -0
- package/dist/esm/lib/api.d.ts.map +1 -1
- package/dist/esm/lib/api.js +47 -31
- package/dist/esm/lib/config.d.ts +1 -0
- package/dist/esm/lib/config.d.ts.map +1 -1
- package/dist/esm/lib/config.js +2 -0
- package/dist/esm/lib/error.d.ts.map +1 -1
- package/dist/esm/lib/error.js +65 -138
- package/dist/esm/lib/init.d.ts.map +1 -1
- package/dist/esm/lib/init.js +14 -7
- package/dist/esm/lib/net.d.ts +1 -0
- package/dist/esm/lib/net.d.ts.map +1 -1
- package/dist/esm/lib/net.js +33 -2
- package/dist/esm/lib/router-monitor.d.ts.map +1 -1
- package/dist/esm/lib/router-monitor.js +100 -0
- package/dist/esm/lib/upload-worker-manager.d.ts +37 -0
- package/dist/esm/lib/upload-worker-manager.d.ts.map +1 -0
- package/dist/esm/lib/upload-worker-manager.js +482 -0
- package/dist/esm/lib/upload-worker.d.ts +59 -0
- package/dist/esm/lib/upload-worker.d.ts.map +1 -0
- package/dist/esm/lib/upload-worker.js +26 -0
- package/dist/esm/lib/uploader.d.ts +5 -0
- package/dist/esm/lib/uploader.d.ts.map +1 -1
- package/dist/esm/lib/uploader.js +58 -10
- 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 +48 -31
- package/dist/lib/lib/config.d.ts +1 -0
- package/dist/lib/lib/config.d.ts.map +1 -1
- package/dist/lib/lib/config.js +2 -0
- package/dist/lib/lib/error.d.ts.map +1 -1
- package/dist/lib/lib/error.js +65 -138
- package/dist/lib/lib/init.d.ts.map +1 -1
- package/dist/lib/lib/init.js +13 -6
- package/dist/lib/lib/net.d.ts +1 -0
- package/dist/lib/lib/net.d.ts.map +1 -1
- package/dist/lib/lib/net.js +33 -1
- package/dist/lib/lib/router-monitor.d.ts.map +1 -1
- package/dist/lib/lib/router-monitor.js +100 -0
- package/dist/lib/lib/upload-worker-manager.d.ts +37 -0
- package/dist/lib/lib/upload-worker-manager.d.ts.map +1 -0
- package/dist/lib/lib/upload-worker-manager.js +491 -0
- package/dist/lib/lib/upload-worker.d.ts +59 -0
- package/dist/lib/lib/upload-worker.d.ts.map +1 -0
- package/dist/lib/lib/upload-worker.js +32 -0
- package/dist/lib/lib/uploader.d.ts +5 -0
- package/dist/lib/lib/uploader.d.ts.map +1 -1
- package/dist/lib/lib/uploader.js +58 -10
- package/dist/rlog-sdk.min.js +1 -1
- package/package.json +3 -2
package/dist/lib/lib/error.js
CHANGED
|
@@ -13,12 +13,12 @@ var _rrweb = require("rrweb");
|
|
|
13
13
|
var _logger = _interopRequireDefault(require("./logger"));
|
|
14
14
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
15
|
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
|
-
var eventListeners = [];
|
|
18
|
-
|
|
19
16
|
// 错误触发器引用(错误采集模式下由 init.ts 注入)
|
|
20
17
|
var errorTriggerInstance = null;
|
|
21
18
|
|
|
19
|
+
// 标记是否已初始化
|
|
20
|
+
var isInitialized = false;
|
|
21
|
+
|
|
22
22
|
/**
|
|
23
23
|
* 设置错误触发器实例(错误采集模式下由 init.ts 调用)
|
|
24
24
|
*/
|
|
@@ -55,156 +55,83 @@ var sendErrorToAnalytics = exports.sendErrorToAnalytics = function sendErrorToAn
|
|
|
55
55
|
}
|
|
56
56
|
};
|
|
57
57
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
url: event.target.src || event.target.href || event.target.src,
|
|
72
|
-
message: errorEvent.message,
|
|
73
|
-
userAgent: navigator.userAgent,
|
|
74
|
-
timestamp: Date.now(),
|
|
75
|
-
location: window.location.href
|
|
76
|
-
};
|
|
77
|
-
sendErrorToAnalytics(_errorData);
|
|
78
|
-
return false;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// JavaScript 运行时错误
|
|
82
|
-
var message = errorEvent.message,
|
|
83
|
-
filename = errorEvent.filename,
|
|
84
|
-
lineno = errorEvent.lineno,
|
|
85
|
-
colno = errorEvent.colno,
|
|
86
|
-
error = errorEvent.error;
|
|
87
|
-
var errorData = {
|
|
88
|
-
type: 'JS_ERROR',
|
|
89
|
-
message: message,
|
|
90
|
-
file: filename,
|
|
91
|
-
line: lineno,
|
|
92
|
-
column: colno,
|
|
93
|
-
stack: error === null || error === void 0 ? void 0 : error.stack,
|
|
58
|
+
/**
|
|
59
|
+
* JavaScript 运行时错误 & 资源加载错误处理
|
|
60
|
+
*/
|
|
61
|
+
function handleError(event) {
|
|
62
|
+
var errorEvent = event;
|
|
63
|
+
|
|
64
|
+
// 检查是否是资源加载错误
|
|
65
|
+
if (event.target !== window) {
|
|
66
|
+
var _errorData = {
|
|
67
|
+
type: 'RESOURCE_ERROR',
|
|
68
|
+
resourceType: event.target.tagName,
|
|
69
|
+
url: event.target.src || event.target.href || event.target.src,
|
|
70
|
+
message: errorEvent.message,
|
|
94
71
|
userAgent: navigator.userAgent,
|
|
95
72
|
timestamp: Date.now(),
|
|
96
73
|
location: window.location.href
|
|
97
74
|
};
|
|
98
|
-
sendErrorToAnalytics(
|
|
99
|
-
|
|
100
|
-
// 控制台保留原始错误显示
|
|
75
|
+
sendErrorToAnalytics(_errorData);
|
|
101
76
|
return false;
|
|
102
|
-
}
|
|
103
|
-
window.addEventListener('error', errorHandler, true);
|
|
104
|
-
eventListeners.push({
|
|
105
|
-
target: window,
|
|
106
|
-
type: 'error',
|
|
107
|
-
listener: errorHandler,
|
|
108
|
-
options: true
|
|
109
|
-
});
|
|
77
|
+
}
|
|
110
78
|
|
|
111
|
-
//
|
|
112
|
-
var
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
79
|
+
// JavaScript 运行时错误
|
|
80
|
+
var message = errorEvent.message,
|
|
81
|
+
filename = errorEvent.filename,
|
|
82
|
+
lineno = errorEvent.lineno,
|
|
83
|
+
colno = errorEvent.colno,
|
|
84
|
+
error = errorEvent.error;
|
|
85
|
+
var errorData = {
|
|
86
|
+
type: 'JS_ERROR',
|
|
87
|
+
message: message,
|
|
88
|
+
file: filename,
|
|
89
|
+
line: lineno,
|
|
90
|
+
column: colno,
|
|
91
|
+
stack: error === null || error === void 0 ? void 0 : error.stack,
|
|
92
|
+
userAgent: navigator.userAgent,
|
|
93
|
+
timestamp: Date.now(),
|
|
94
|
+
location: window.location.href
|
|
125
95
|
};
|
|
126
|
-
|
|
127
|
-
eventListeners.push({
|
|
128
|
-
target: window,
|
|
129
|
-
type: 'unhandledrejection',
|
|
130
|
-
listener: unhandledRejectionHandler
|
|
131
|
-
});
|
|
96
|
+
sendErrorToAnalytics(errorData);
|
|
132
97
|
|
|
133
|
-
//
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
type: 'PAGE_LOAD',
|
|
137
|
-
url: window.location.href,
|
|
138
|
-
timestamp: Date.now()
|
|
139
|
-
});
|
|
140
|
-
};
|
|
141
|
-
window.addEventListener('load', loadHandler);
|
|
142
|
-
eventListeners.push({
|
|
143
|
-
target: window,
|
|
144
|
-
type: 'load',
|
|
145
|
-
listener: loadHandler
|
|
146
|
-
});
|
|
98
|
+
// 控制台保留原始错误显示
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
147
101
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
102
|
+
/**
|
|
103
|
+
* 未处理的 Promise 错误处理
|
|
104
|
+
*/
|
|
105
|
+
function handleUnhandledRejection(event) {
|
|
106
|
+
var rejectionEvent = event;
|
|
107
|
+
var reason = rejectionEvent.reason || 'Unknown rejection';
|
|
108
|
+
var errorData = {
|
|
109
|
+
type: 'PROMISE_REJECTION',
|
|
110
|
+
message: typeof reason === 'string' ? reason : reason.message,
|
|
111
|
+
stack: _typeof(reason) === 'object' ? reason.stack : null,
|
|
112
|
+
timestamp: Date.now(),
|
|
113
|
+
location: window.location.href
|
|
155
114
|
};
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
listener: beforeUnloadHandler
|
|
161
|
-
});
|
|
115
|
+
sendErrorToAnalytics(errorData);
|
|
116
|
+
// 阻止默认控制台报错
|
|
117
|
+
event.preventDefault();
|
|
118
|
+
}
|
|
162
119
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
window.addEventListener('online', onlineHandler);
|
|
171
|
-
eventListeners.push({
|
|
172
|
-
target: window,
|
|
173
|
-
type: 'online',
|
|
174
|
-
listener: onlineHandler
|
|
175
|
-
});
|
|
176
|
-
var offlineHandler = function offlineHandler() {
|
|
177
|
-
sendErrorToAnalytics({
|
|
178
|
-
type: 'NETWORK_OFFLINE',
|
|
179
|
-
timestamp: Date.now()
|
|
180
|
-
});
|
|
181
|
-
};
|
|
182
|
-
window.addEventListener('offline', offlineHandler);
|
|
183
|
-
eventListeners.push({
|
|
184
|
-
target: window,
|
|
185
|
-
type: 'offline',
|
|
186
|
-
listener: offlineHandler
|
|
187
|
-
});
|
|
120
|
+
// 初始化错误处理
|
|
121
|
+
function initErrorHandler() {
|
|
122
|
+
if (isInitialized) return;
|
|
123
|
+
_logger.default.log('Error handling is enabled');
|
|
124
|
+
window.addEventListener('error', handleError, true);
|
|
125
|
+
window.addEventListener('unhandledrejection', handleUnhandledRejection);
|
|
126
|
+
isInitialized = true;
|
|
188
127
|
}
|
|
189
128
|
|
|
190
129
|
// 清理错误监听器
|
|
191
130
|
function cleanupErrorHandler() {
|
|
131
|
+
if (!isInitialized) return;
|
|
192
132
|
_logger.default.log('Cleaning up error handlers');
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
var target = _ref.target,
|
|
197
|
-
type = _ref.type,
|
|
198
|
-
listener = _ref.listener,
|
|
199
|
-
options = _ref.options;
|
|
200
|
-
try {
|
|
201
|
-
target.removeEventListener(type, listener, options);
|
|
202
|
-
} catch (error) {
|
|
203
|
-
_logger.default.warn("Failed to remove event listener for ".concat(type), error);
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
// 清空监听器数组
|
|
208
|
-
eventListeners.length = 0;
|
|
133
|
+
window.removeEventListener('error', handleError, true);
|
|
134
|
+
window.removeEventListener('unhandledrejection', handleUnhandledRejection);
|
|
135
|
+
isInitialized = false;
|
|
209
136
|
_logger.default.log('Error handlers cleaned up successfully');
|
|
210
137
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/lib/init.ts"],"names":[],"mappings":"AAqBA;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,EACrC,OAAO,GAAE,MAAuB,GAC/B,IAAI,CAiDN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,IAAI,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/lib/init.ts"],"names":[],"mappings":"AAqBA;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,EACrC,OAAO,GAAE,MAAuB,GAC/B,IAAI,CAiDN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,IAAI,CAgEN"}
|
package/dist/lib/lib/init.js
CHANGED
|
@@ -99,12 +99,12 @@ function initRLog(serv, appId, cdnConfigUrl) {
|
|
|
99
99
|
(0, _uploader.resetUploadLoop)();
|
|
100
100
|
|
|
101
101
|
// 设置SDK日志上报接口地址,并自动加入黑名单避免循环上报
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
102
|
+
var normalizedServUrl = (0, _net.normalizeUrl)(serv);
|
|
103
|
+
(0, _net.setSdkLogEndpoint)(normalizedServUrl);
|
|
105
104
|
|
|
106
105
|
// 初始化配置管理器
|
|
107
106
|
(0, _config.initConfigManager)(cdnConfigUrl).then(function () {
|
|
107
|
+
var _config$error;
|
|
108
108
|
// 获取配置
|
|
109
109
|
var config = (0, _config.getConfig)();
|
|
110
110
|
|
|
@@ -136,13 +136,20 @@ function initRLog(serv, appId, cdnConfigUrl) {
|
|
|
136
136
|
// 启动统一上传循环
|
|
137
137
|
// 错误模式下:idle 时跳过上传,uploading 时上传,状态由 ErrorTrigger 控制
|
|
138
138
|
// 全量模式下:持续轮询上传
|
|
139
|
-
(0, _uploader.startUploadLoop)(
|
|
139
|
+
(0, _uploader.startUploadLoop)(normalizedServUrl, appId);
|
|
140
140
|
|
|
141
141
|
// 初始化路由监控
|
|
142
142
|
(0, _routerMonitor.initRouterMonitor)(config.routerMonitor);
|
|
143
143
|
|
|
144
|
-
//
|
|
145
|
-
|
|
144
|
+
// 判断是否启用错误监听上报:
|
|
145
|
+
// 1. 错误采集模式下强制启用(错误捕获模式必须依赖错误监听初始化)
|
|
146
|
+
// 2. 非错误模式下,根据用户 error 配置决定,默认不启用
|
|
147
|
+
var enableError = isErrorMode || ((_config$error = config.error) !== null && _config$error !== void 0 ? _config$error : false);
|
|
148
|
+
if (enableError) {
|
|
149
|
+
(0, _error.initErrorHandler)();
|
|
150
|
+
} else {
|
|
151
|
+
_logger.default.log('Error handling is disabled by config');
|
|
152
|
+
}
|
|
146
153
|
}).catch(function (error) {
|
|
147
154
|
_logger.default.error('Failed to initialize SDK', error);
|
|
148
155
|
});
|
package/dist/lib/lib/net.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { ErrorTrigger } from './error-trigger';
|
|
|
4
4
|
* 设置网络模块的错误触发器实例
|
|
5
5
|
*/
|
|
6
6
|
export declare function setNetErrorTrigger(trigger: ErrorTrigger | null): void;
|
|
7
|
+
export declare function normalizeUrl(url: string): string;
|
|
7
8
|
export declare function shouldRecordUrl(url: string): boolean;
|
|
8
9
|
export declare function watchXhr(r: typeof record): void;
|
|
9
10
|
export declare function restoreXhr(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"net.d.ts","sourceRoot":"","sources":["../../../src/lib/net.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAM/C;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAErE;
|
|
1
|
+
{"version":3,"file":"net.d.ts","sourceRoot":"","sources":["../../../src/lib/net.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAM/C;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAErE;AAgDD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAmBhD;AAwED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAgBpD;AAiCD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,MAAM,QAsPxC;AAGD,wBAAgB,UAAU,IAAI,IAAI,CAiBjC;AAGD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAQrD;AAED,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAOrD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAoBxD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAEjD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAEtE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEzD"}
|
package/dist/lib/lib/net.js
CHANGED
|
@@ -8,6 +8,7 @@ exports.getBlackListUrls = getBlackListUrls;
|
|
|
8
8
|
exports.getCustomHeaders = getCustomHeaders;
|
|
9
9
|
exports.getSdkLogEndpoint = getSdkLogEndpoint;
|
|
10
10
|
exports.getWhiteListUrls = getWhiteListUrls;
|
|
11
|
+
exports.normalizeUrl = normalizeUrl;
|
|
11
12
|
exports.restoreXhr = restoreXhr;
|
|
12
13
|
exports.setBlackListUrls = setBlackListUrls;
|
|
13
14
|
exports.setCustomHeaders = setCustomHeaders;
|
|
@@ -16,6 +17,7 @@ exports.setSdkLogEndpoint = setSdkLogEndpoint;
|
|
|
16
17
|
exports.setWhiteListUrls = setWhiteListUrls;
|
|
17
18
|
exports.shouldRecordUrl = shouldRecordUrl;
|
|
18
19
|
exports.watchXhr = watchXhr;
|
|
20
|
+
var _rrweb = require("rrweb");
|
|
19
21
|
var _config = require("./config");
|
|
20
22
|
var _logger = _interopRequireDefault(require("./logger"));
|
|
21
23
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
@@ -170,6 +172,28 @@ function shouldRecordUrl(url) {
|
|
|
170
172
|
return isUrlInWhitelist(url, whiteListUrls);
|
|
171
173
|
}
|
|
172
174
|
|
|
175
|
+
// 网络状态变化事件处理
|
|
176
|
+
function handleOnline() {
|
|
177
|
+
try {
|
|
178
|
+
_rrweb.record.addCustomEvent('network-status', {
|
|
179
|
+
type: 'NETWORK_ONLINE',
|
|
180
|
+
timestamp: Date.now()
|
|
181
|
+
});
|
|
182
|
+
} catch (error) {
|
|
183
|
+
_logger.default.warn('Failed to add NETWORK_ONLINE event (recording may have stopped)', error);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
function handleOffline() {
|
|
187
|
+
try {
|
|
188
|
+
_rrweb.record.addCustomEvent('network-status', {
|
|
189
|
+
type: 'NETWORK_OFFLINE',
|
|
190
|
+
timestamp: Date.now()
|
|
191
|
+
});
|
|
192
|
+
} catch (error) {
|
|
193
|
+
_logger.default.warn('Failed to add NETWORK_OFFLINE event (recording may have stopped)', error);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
173
197
|
// 存储原始方法
|
|
174
198
|
var origOpen = XMLHttpRequest.prototype.open;
|
|
175
199
|
var origSend = XMLHttpRequest.prototype.send;
|
|
@@ -404,6 +428,10 @@ function watchXhr(r) {
|
|
|
404
428
|
return _ref3.apply(this, arguments);
|
|
405
429
|
};
|
|
406
430
|
}();
|
|
431
|
+
|
|
432
|
+
// 监听网络连接状态变化
|
|
433
|
+
window.addEventListener('online', handleOnline);
|
|
434
|
+
window.addEventListener('offline', handleOffline);
|
|
407
435
|
}
|
|
408
436
|
|
|
409
437
|
// 恢复原始方法
|
|
@@ -417,6 +445,10 @@ function restoreXhr() {
|
|
|
417
445
|
if (origFetch) {
|
|
418
446
|
window.fetch = origFetch;
|
|
419
447
|
}
|
|
448
|
+
|
|
449
|
+
// 移除网络状态监听器
|
|
450
|
+
window.removeEventListener('online', handleOnline);
|
|
451
|
+
window.removeEventListener('offline', handleOffline);
|
|
420
452
|
isHooked = false;
|
|
421
453
|
_logger.default.log('Network monitoring restored');
|
|
422
454
|
}
|
|
@@ -465,7 +497,7 @@ function setSdkLogEndpoint(endpoint) {
|
|
|
465
497
|
sdkLogEndpoint = endpoint;
|
|
466
498
|
|
|
467
499
|
// 规范化endpoint路径,确保相对路径也能正确匹配
|
|
468
|
-
var normalizedEndpoint = endpoint
|
|
500
|
+
var normalizedEndpoint = normalizeUrl(endpoint);
|
|
469
501
|
|
|
470
502
|
// 自动将SDK日志上报接口加入黑名单,避免循环上报
|
|
471
503
|
// 同时添加原始路径和规范化路径,确保兼容性
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router-monitor.d.ts","sourceRoot":"","sources":["../../../src/lib/router-monitor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,UAAU,CAAC;AAIrD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,UAAU,GAAG,YAAY,CAAC;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA2ID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,eAAe,CAAC,GAAG,IAAI,CAuB3E;
|
|
1
|
+
{"version":3,"file":"router-monitor.d.ts","sourceRoot":"","sources":["../../../src/lib/router-monitor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,UAAU,CAAC;AAIrD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,UAAU,GAAG,YAAY,CAAC;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA2ID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,eAAe,CAAC,GAAG,IAAI,CAuB3E;AAuFD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,eAAe,CAAC,QA4CpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB;;;;EAMlC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,QAG1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,SA8BhC"}
|
|
@@ -178,6 +178,91 @@ function updateRouterConfig(config) {
|
|
|
178
178
|
}
|
|
179
179
|
}
|
|
180
180
|
|
|
181
|
+
/**
|
|
182
|
+
* 处理页面加载事件
|
|
183
|
+
*/
|
|
184
|
+
function handlePageLoad() {
|
|
185
|
+
try {
|
|
186
|
+
_rrweb.record.addCustomEvent('page-lifecycle', {
|
|
187
|
+
type: 'PAGE_LOAD',
|
|
188
|
+
url: window.location.href,
|
|
189
|
+
timestamp: Date.now()
|
|
190
|
+
});
|
|
191
|
+
} catch (error) {
|
|
192
|
+
_logger.default.warn('Failed to add PAGE_LOAD event (recording may have stopped)', error);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* 处理页面卸载事件
|
|
198
|
+
*/
|
|
199
|
+
function handlePageUnload() {
|
|
200
|
+
try {
|
|
201
|
+
_rrweb.record.addCustomEvent('page-lifecycle', {
|
|
202
|
+
type: 'PAGE_UNLOAD',
|
|
203
|
+
url: window.location.href,
|
|
204
|
+
timestamp: Date.now()
|
|
205
|
+
});
|
|
206
|
+
} catch (error) {
|
|
207
|
+
_logger.default.warn('Failed to add PAGE_UNLOAD event (recording may have stopped)', error);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* 处理页面隐藏事件(移动端友好,替代 beforeunload)
|
|
213
|
+
* pagehide 在移动端浏览器中比 beforeunload 更可靠
|
|
214
|
+
*/
|
|
215
|
+
function handlePageHide(event) {
|
|
216
|
+
try {
|
|
217
|
+
_rrweb.record.addCustomEvent('page-lifecycle', {
|
|
218
|
+
type: 'PAGE_HIDE',
|
|
219
|
+
url: window.location.href,
|
|
220
|
+
timestamp: Date.now(),
|
|
221
|
+
persisted: event.persisted // 页面是否进入 bfcache
|
|
222
|
+
});
|
|
223
|
+
} catch (error) {
|
|
224
|
+
_logger.default.warn('Failed to add PAGE_HIDE event (recording may have stopped)', error);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* 处理页面显示事件(移动端友好,支持 bfcache 恢复检测)
|
|
230
|
+
* pageshow 在页面从 bfcache 恢复时也会触发
|
|
231
|
+
*/
|
|
232
|
+
function handlePageShow(event) {
|
|
233
|
+
try {
|
|
234
|
+
_rrweb.record.addCustomEvent('page-lifecycle', {
|
|
235
|
+
type: 'PAGE_SHOW',
|
|
236
|
+
url: window.location.href,
|
|
237
|
+
timestamp: Date.now(),
|
|
238
|
+
persisted: event.persisted // 是否从 bfcache 恢复
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
// 如果是从 bfcache 恢复,重置路由计时器
|
|
242
|
+
if (event.persisted) {
|
|
243
|
+
routeStartTime = Date.now();
|
|
244
|
+
}
|
|
245
|
+
} catch (error) {
|
|
246
|
+
_logger.default.warn('Failed to add PAGE_SHOW event (recording may have stopped)', error);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* 处理页面可见性变化事件(移动端切换应用/标签页)
|
|
252
|
+
*/
|
|
253
|
+
function handleVisibilityChange() {
|
|
254
|
+
try {
|
|
255
|
+
var isHidden = document.visibilityState === 'hidden';
|
|
256
|
+
_rrweb.record.addCustomEvent('page-lifecycle', {
|
|
257
|
+
type: isHidden ? 'PAGE_VISIBILITY_HIDDEN' : 'PAGE_VISIBILITY_VISIBLE',
|
|
258
|
+
url: window.location.href,
|
|
259
|
+
timestamp: Date.now()
|
|
260
|
+
});
|
|
261
|
+
} catch (error) {
|
|
262
|
+
_logger.default.warn('Failed to add visibility change event (recording may have stopped)', error);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
181
266
|
/**
|
|
182
267
|
* 初始化路由监控
|
|
183
268
|
*/
|
|
@@ -213,6 +298,16 @@ function initRouterMonitor(config) {
|
|
|
213
298
|
if (routerConfig.trackHashChange) {
|
|
214
299
|
window.addEventListener('hashchange', handleHashChange);
|
|
215
300
|
}
|
|
301
|
+
|
|
302
|
+
// 监听页面生命周期事件
|
|
303
|
+
window.addEventListener('load', handlePageLoad);
|
|
304
|
+
window.addEventListener('beforeunload', handlePageUnload);
|
|
305
|
+
|
|
306
|
+
// 监听移动端页面生命周期事件
|
|
307
|
+
// pagehide/pageshow 在移动端比 beforeunload 更可靠
|
|
308
|
+
window.addEventListener('pagehide', handlePageHide);
|
|
309
|
+
window.addEventListener('pageshow', handlePageShow);
|
|
310
|
+
document.addEventListener('visibilitychange', handleVisibilityChange);
|
|
216
311
|
isInitialized = true;
|
|
217
312
|
}
|
|
218
313
|
|
|
@@ -251,6 +346,11 @@ function stopRouterMonitor() {
|
|
|
251
346
|
if (typeof window !== 'undefined') {
|
|
252
347
|
window.removeEventListener('popstate', handlePopState);
|
|
253
348
|
window.removeEventListener('hashchange', handleHashChange);
|
|
349
|
+
window.removeEventListener('load', handlePageLoad);
|
|
350
|
+
window.removeEventListener('beforeunload', handlePageUnload);
|
|
351
|
+
window.removeEventListener('pagehide', handlePageHide);
|
|
352
|
+
window.removeEventListener('pageshow', handlePageShow);
|
|
353
|
+
document.removeEventListener('visibilitychange', handleVisibilityChange);
|
|
254
354
|
}
|
|
255
355
|
|
|
256
356
|
// 重置状态
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upload Worker 管理器
|
|
3
|
+
*
|
|
4
|
+
* 职责:
|
|
5
|
+
* - Worker 生命周期管理(创建、销毁、降级)
|
|
6
|
+
* - 将 Worker 脚本以 inline Blob 方式加载
|
|
7
|
+
* - 封装 postMessage/onmessage 通信
|
|
8
|
+
* - 处理 Worker 回传的消息,调用对应的主线程逻辑
|
|
9
|
+
* - 提供与现有 uploader.ts 相同的对外 API
|
|
10
|
+
*/
|
|
11
|
+
import type { WorkerConfig } from './upload-worker';
|
|
12
|
+
/**
|
|
13
|
+
* 尝试初始化 Worker 模式
|
|
14
|
+
* @returns 是否成功启用 Worker 模式
|
|
15
|
+
*/
|
|
16
|
+
export declare function initWorkerUpload(serv: string, appId: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* 销毁 Worker
|
|
19
|
+
*/
|
|
20
|
+
export declare function destroyWorker(): void;
|
|
21
|
+
/**
|
|
22
|
+
* 是否正在使用 Worker 模式
|
|
23
|
+
*/
|
|
24
|
+
export declare function isUsingWorkerMode(): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* 设置错误模式上传状态(Worker 模式)
|
|
27
|
+
*/
|
|
28
|
+
export declare function setWorkerErrorModeUploading(uploading: boolean): void;
|
|
29
|
+
/**
|
|
30
|
+
* 设置错误模式上传时间窗口起点(Worker 模式)
|
|
31
|
+
*/
|
|
32
|
+
export declare function setWorkerErrorModeWindowStart(startTime: number): void;
|
|
33
|
+
/**
|
|
34
|
+
* 更新 Worker 配置
|
|
35
|
+
*/
|
|
36
|
+
export declare function updateWorkerConfig(config: Partial<WorkerConfig>): void;
|
|
37
|
+
//# sourceMappingURL=upload-worker-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-worker-manager.d.ts","sourceRoot":"","sources":["../../../src/lib/upload-worker-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAgC,MAAM,iBAAiB,CAAC;AAkTlF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CA8BrE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAkBpC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAQpE;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAErE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAKtE"}
|