@antglobal/rlog-sdk 0.0.1755855517-dev.9 → 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 +13 -6
- 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 -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 +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 +13 -6
- 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 -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 +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
package/dist/esm/lib/net.js
CHANGED
|
@@ -13,9 +13,22 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
|
|
|
13
13
|
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; }
|
|
14
14
|
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
15
15
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
import { record } from 'rrweb';
|
|
17
|
+
import { getConfig } from "./config";
|
|
18
|
+
import logger from "./logger";
|
|
19
|
+
import { BLACK_HOST_NAME, BLACK_PATH_NAME, HEADERS_TO_EXTRACT, EVENT_NETWORK_STATUS, EVENT_HTTP_SUCCESS, EVENT_HTTP_ERROR } from "./constants";
|
|
20
|
+
|
|
21
|
+
// 错误触发器引用(错误采集模式下由 init.ts 注入)
|
|
22
|
+
var errorTriggerInstance = null;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* 设置网络模块的错误触发器实例
|
|
26
|
+
*/
|
|
27
|
+
export function setNetErrorTrigger(trigger) {
|
|
28
|
+
errorTriggerInstance = trigger;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// 根据业务需求配置的黑名单和需要提取的响应头字段,已从 constants.ts 导入
|
|
19
32
|
|
|
20
33
|
// 定义白名单URL列表和自定义请求头
|
|
21
34
|
// 默认白名单为空,不抓取任何请求,需要用户手动配置
|
|
@@ -30,11 +43,8 @@ var blackListUrls = [
|
|
|
30
43
|
// SDK日志上报接口地址
|
|
31
44
|
var sdkLogEndpoint = null;
|
|
32
45
|
|
|
33
|
-
// 需要提取的响应头字段
|
|
34
|
-
var HEADERS_TO_EXTRACT = ['sky_trace_id', 'antbank-traceid'];
|
|
35
|
-
|
|
36
46
|
// 辅助函数:规范化URL路径
|
|
37
|
-
function normalizeUrl(url) {
|
|
47
|
+
export function normalizeUrl(url) {
|
|
38
48
|
try {
|
|
39
49
|
// 如果是完整URL,直接返回
|
|
40
50
|
if (url.startsWith('http://') || url.startsWith('https://')) {
|
|
@@ -126,7 +136,7 @@ function isUrlInBlacklist(url, blacklist) {
|
|
|
126
136
|
export function shouldRecordUrl(url) {
|
|
127
137
|
// 如果URL在黑名单中,直接返回false
|
|
128
138
|
if (isUrlInBlacklist(url, blackListUrls)) {
|
|
129
|
-
//
|
|
139
|
+
// logger.log(`[Blacklist] ${url} - Skipped (in blacklist)`);
|
|
130
140
|
|
|
131
141
|
return false;
|
|
132
142
|
}
|
|
@@ -140,6 +150,28 @@ export function shouldRecordUrl(url) {
|
|
|
140
150
|
return isUrlInWhitelist(url, whiteListUrls);
|
|
141
151
|
}
|
|
142
152
|
|
|
153
|
+
// 网络状态变化事件处理
|
|
154
|
+
function handleOnline() {
|
|
155
|
+
try {
|
|
156
|
+
record.addCustomEvent(EVENT_NETWORK_STATUS, {
|
|
157
|
+
type: 'NETWORK_ONLINE',
|
|
158
|
+
timestamp: Date.now()
|
|
159
|
+
});
|
|
160
|
+
} catch (error) {
|
|
161
|
+
logger.warn('Failed to add NETWORK_ONLINE event (recording may have stopped)', error);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function handleOffline() {
|
|
165
|
+
try {
|
|
166
|
+
record.addCustomEvent(EVENT_NETWORK_STATUS, {
|
|
167
|
+
type: 'NETWORK_OFFLINE',
|
|
168
|
+
timestamp: Date.now()
|
|
169
|
+
});
|
|
170
|
+
} catch (error) {
|
|
171
|
+
logger.warn('Failed to add NETWORK_OFFLINE event (recording may have stopped)', error);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
143
175
|
// 存储原始方法
|
|
144
176
|
var origOpen = XMLHttpRequest.prototype.open;
|
|
145
177
|
var origSend = XMLHttpRequest.prototype.send;
|
|
@@ -149,167 +181,269 @@ var origFetch = window.fetch;
|
|
|
149
181
|
var isHooked = false;
|
|
150
182
|
export function watchXhr(r) {
|
|
151
183
|
if (isHooked) {
|
|
152
|
-
|
|
184
|
+
logger.warn('Network monitoring is already active');
|
|
153
185
|
return;
|
|
154
186
|
}
|
|
155
|
-
console.log('RLog Network monitoring is active');
|
|
156
187
|
isHooked = true;
|
|
157
188
|
// 拦截XMLHttpRequest
|
|
158
189
|
XMLHttpRequest.prototype.open = function (method, url) {
|
|
159
190
|
var async = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
|
160
191
|
var username = arguments.length > 3 ? arguments[3] : undefined;
|
|
161
192
|
var password = arguments.length > 4 ? arguments[4] : undefined;
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
193
|
+
try {
|
|
194
|
+
// 保存请求信息
|
|
195
|
+
this._rlogRequest = {
|
|
196
|
+
method: method,
|
|
197
|
+
url: url.toString(),
|
|
198
|
+
startTime: 0,
|
|
199
|
+
endTime: 0
|
|
200
|
+
};
|
|
201
|
+
} catch (error) {
|
|
202
|
+
logger.warn('Failed to save XHR request info:', error);
|
|
203
|
+
}
|
|
169
204
|
|
|
170
|
-
// 调用原始open
|
|
205
|
+
// 调用原始open方法(不能被 SDK 异常影响)
|
|
171
206
|
return origOpen.apply(this, [method, url, async, username, password]);
|
|
172
207
|
};
|
|
173
208
|
XMLHttpRequest.prototype.send = function (body) {
|
|
174
209
|
var _this = this;
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
// 仅对白名单中的URL添加自定义请求头,避免跨域请求因非标准头触发CORS preflight失败
|
|
180
|
-
if (shouldRecordUrl(requestInfo.url)) {
|
|
181
|
-
Object.entries(customHeaders).forEach(function (_ref) {
|
|
182
|
-
var _ref2 = _slicedToArray(_ref, 2),
|
|
183
|
-
key = _ref2[0],
|
|
184
|
-
value = _ref2[1];
|
|
185
|
-
_this.setRequestHeader(key, value);
|
|
186
|
-
});
|
|
187
|
-
}
|
|
210
|
+
try {
|
|
211
|
+
var requestInfo = this._rlogRequest;
|
|
212
|
+
if (requestInfo) {
|
|
213
|
+
requestInfo.startTime = Date.now();
|
|
188
214
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
var _this2 = this;
|
|
192
|
-
requestInfo.endTime = Date.now();
|
|
193
|
-
// 检查是否应该记录该URL
|
|
194
|
-
if (shouldRecordUrl(requestInfo.url)) {
|
|
195
|
-
// 提取指定响应头字段
|
|
196
|
-
var responseHeaders = {};
|
|
197
|
-
HEADERS_TO_EXTRACT.forEach(function (headerName) {
|
|
215
|
+
// 仅对白名单中的URL添加自定义请求头,避免跨域请求因非标准头触发CORS preflight失败
|
|
216
|
+
if (shouldRecordUrl(requestInfo.url)) {
|
|
198
217
|
try {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
218
|
+
Object.entries(customHeaders).forEach(function (_ref) {
|
|
219
|
+
var _ref2 = _slicedToArray(_ref, 2),
|
|
220
|
+
key = _ref2[0],
|
|
221
|
+
value = _ref2[1];
|
|
222
|
+
_this.setRequestHeader(key, value);
|
|
223
|
+
});
|
|
224
|
+
} catch (error) {
|
|
225
|
+
logger.warn('Failed to set custom headers on XHR:', error);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// 监听请求完成
|
|
230
|
+
this.addEventListener('load', function () {
|
|
231
|
+
var _this2 = this;
|
|
232
|
+
try {
|
|
233
|
+
requestInfo.endTime = Date.now();
|
|
234
|
+
// 检查是否应该记录该URL
|
|
235
|
+
if (shouldRecordUrl(requestInfo.url)) {
|
|
236
|
+
// 提取指定响应头字段
|
|
237
|
+
var responseHeaders = {};
|
|
238
|
+
HEADERS_TO_EXTRACT.forEach(function (headerName) {
|
|
239
|
+
try {
|
|
240
|
+
var value = _this2.getResponseHeader(headerName);
|
|
241
|
+
if (value) {
|
|
242
|
+
responseHeaders[headerName] = value;
|
|
243
|
+
}
|
|
244
|
+
} catch (error) {
|
|
245
|
+
// 忽略无法访问的响应头(如CORS限制)
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
try {
|
|
249
|
+
r.addCustomEvent(EVENT_HTTP_SUCCESS, _objectSpread(_objectSpread({}, requestInfo), {}, {
|
|
250
|
+
dur: requestInfo.endTime - requestInfo.startTime,
|
|
251
|
+
responseHeaders: responseHeaders,
|
|
252
|
+
pagePath: window.location.href
|
|
253
|
+
}));
|
|
254
|
+
} catch (error) {
|
|
255
|
+
// 忽略录制已停止时的异常
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// 错误采集模式下:检查 HTTP 状态码是否为错误
|
|
260
|
+
if (errorTriggerInstance) {
|
|
261
|
+
var _config$errorCapture$, _config$errorCapture;
|
|
262
|
+
var config = getConfig();
|
|
263
|
+
var httpErrorThreshold = (_config$errorCapture$ = (_config$errorCapture = config.errorCapture) === null || _config$errorCapture === void 0 ? void 0 : _config$errorCapture.httpErrorThreshold) !== null && _config$errorCapture$ !== void 0 ? _config$errorCapture$ : 400;
|
|
264
|
+
if (this.status >= httpErrorThreshold) {
|
|
265
|
+
errorTriggerInstance.onError({
|
|
266
|
+
type: 'http',
|
|
267
|
+
message: "XHR ".concat(requestInfo.method, " ").concat(requestInfo.url, " responded with status ").concat(this.status),
|
|
268
|
+
timestamp: Date.now(),
|
|
269
|
+
detail: {
|
|
270
|
+
url: requestInfo.url,
|
|
271
|
+
method: requestInfo.method,
|
|
272
|
+
status: this.status
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
}
|
|
202
276
|
}
|
|
203
277
|
} catch (error) {
|
|
204
|
-
|
|
205
|
-
console.warn("\u65E0\u6CD5\u83B7\u53D6\u54CD\u5E94\u5934 ".concat(headerName, ":"), error);
|
|
278
|
+
logger.warn('Error in XHR load handler:', error);
|
|
206
279
|
}
|
|
207
280
|
});
|
|
208
|
-
try {
|
|
209
|
-
r.addCustomEvent('http-success', _objectSpread(_objectSpread({}, requestInfo), {}, {
|
|
210
|
-
dur: requestInfo.endTime - requestInfo.startTime,
|
|
211
|
-
responseHeaders: responseHeaders,
|
|
212
|
-
pagePath: window.location.href
|
|
213
|
-
}));
|
|
214
|
-
} catch (error) {
|
|
215
|
-
// 忽略录制已停止时的异常
|
|
216
|
-
console.warn('Failed to add custom event (recording may have stopped):', error);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
});
|
|
220
281
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
282
|
+
// 监听请求错误
|
|
283
|
+
this.addEventListener('error', function () {
|
|
284
|
+
try {
|
|
285
|
+
r.addCustomEvent(EVENT_HTTP_ERROR, _objectSpread(_objectSpread({}, requestInfo), {}, {
|
|
286
|
+
dur: requestInfo.endTime - requestInfo.startTime,
|
|
287
|
+
pagePath: window.location.href
|
|
288
|
+
}));
|
|
289
|
+
} catch (error) {
|
|
290
|
+
// 忽略录制已停止时的异常
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// 错误采集模式下:XHR 网络错误触发
|
|
294
|
+
try {
|
|
295
|
+
if (errorTriggerInstance) {
|
|
296
|
+
errorTriggerInstance.onError({
|
|
297
|
+
type: 'http',
|
|
298
|
+
message: "XHR ".concat(requestInfo.method, " ").concat(requestInfo.url, " network error"),
|
|
299
|
+
timestamp: Date.now(),
|
|
300
|
+
detail: {
|
|
301
|
+
url: requestInfo.url,
|
|
302
|
+
method: requestInfo.method
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
} catch (error) {
|
|
307
|
+
logger.warn('Error in XHR error trigger:', error);
|
|
308
|
+
}
|
|
309
|
+
});
|
|
231
310
|
}
|
|
232
|
-
})
|
|
311
|
+
} catch (error) {
|
|
312
|
+
logger.warn('Error in XHR send hook:', error);
|
|
313
|
+
}
|
|
233
314
|
|
|
234
|
-
// 调用原始send
|
|
315
|
+
// 调用原始send方法(不能被 SDK 异常影响)
|
|
235
316
|
return origSend.apply(this, [body]);
|
|
236
317
|
};
|
|
237
318
|
|
|
238
319
|
// 拦截fetch API
|
|
239
320
|
window.fetch = /*#__PURE__*/function () {
|
|
240
321
|
var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(input, init) {
|
|
241
|
-
var url, method, startTime,
|
|
322
|
+
var url, method, startTime, actualInit, response, endTime, responseHeaders, _config$errorCapture$2, _config$errorCapture2, config, httpErrorThreshold;
|
|
242
323
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
243
324
|
while (1) switch (_context.prev = _context.next) {
|
|
244
325
|
case 0:
|
|
326
|
+
_context.prev = 0;
|
|
245
327
|
url = input instanceof Request ? input.url : input.toString();
|
|
246
|
-
method = (init === null || init === void 0 ? void 0 : init.method) || (input instanceof Request ? input.method : 'GET').toUpperCase();
|
|
247
|
-
startTime = Date.now();
|
|
248
|
-
_context.prev = 3;
|
|
249
|
-
newInit = _objectSpread({}, init); // 仅对白名单中的URL添加自定义请求头,避免跨域请求因非标准头触发CORS preflight失败
|
|
250
|
-
if (shouldRecordUrl(url) && Object.keys(customHeaders).length > 0) {
|
|
251
|
-
newInit.headers = _objectSpread(_objectSpread({}, (init === null || init === void 0 ? void 0 : init.headers) || {}), customHeaders);
|
|
252
|
-
}
|
|
328
|
+
method = (init === null || init === void 0 ? void 0 : init.method) || (input instanceof Request ? input.method : 'GET').toUpperCase();
|
|
253
329
|
_context.next = 8;
|
|
254
|
-
|
|
330
|
+
break;
|
|
331
|
+
case 5:
|
|
332
|
+
_context.prev = 5;
|
|
333
|
+
_context.t0 = _context["catch"](0);
|
|
334
|
+
return _context.abrupt("return", origFetch(input, init));
|
|
255
335
|
case 8:
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
responseHeaders = {};
|
|
263
|
-
HEADERS_TO_EXTRACT.forEach(function (headerName) {
|
|
264
|
-
try {
|
|
265
|
-
var value = response.headers.get(headerName);
|
|
266
|
-
if (value) {
|
|
267
|
-
responseHeaders[headerName] = value;
|
|
268
|
-
}
|
|
269
|
-
} catch (error) {
|
|
270
|
-
// 忽略无法访问的响应头(如CORS限制)
|
|
271
|
-
console.warn("\u65E0\u6CD5\u83B7\u53D6\u54CD\u5E94\u5934 ".concat(headerName, ":"), error);
|
|
272
|
-
}
|
|
273
|
-
});
|
|
274
|
-
try {
|
|
275
|
-
r.addCustomEvent('http-success', {
|
|
276
|
-
url: url,
|
|
277
|
-
method: method,
|
|
278
|
-
dur: endTime - startTime,
|
|
279
|
-
responseHeaders: responseHeaders,
|
|
280
|
-
pagePath: window.location.href
|
|
336
|
+
startTime = Date.now(); // 构建请求参数,仅对白名单 URL 添加自定义头
|
|
337
|
+
actualInit = init;
|
|
338
|
+
try {
|
|
339
|
+
if (shouldRecordUrl(url) && Object.keys(customHeaders).length > 0) {
|
|
340
|
+
actualInit = _objectSpread(_objectSpread({}, init), {}, {
|
|
341
|
+
headers: _objectSpread(_objectSpread({}, (init === null || init === void 0 ? void 0 : init.headers) || {}), customHeaders)
|
|
281
342
|
});
|
|
282
|
-
} catch (error) {
|
|
283
|
-
// 忽略录制已停止时的异常
|
|
284
|
-
console.warn('Failed to add custom event (recording may have stopped):', error);
|
|
285
343
|
}
|
|
344
|
+
} catch (error) {
|
|
345
|
+
logger.warn('Failed to add custom headers on Fetch:', error);
|
|
346
|
+
actualInit = init;
|
|
286
347
|
}
|
|
287
|
-
|
|
348
|
+
_context.prev = 11;
|
|
349
|
+
_context.next = 14;
|
|
350
|
+
return origFetch(input, actualInit);
|
|
288
351
|
case 14:
|
|
289
|
-
|
|
290
|
-
_context.
|
|
291
|
-
|
|
352
|
+
response = _context.sent;
|
|
353
|
+
_context.next = 22;
|
|
354
|
+
break;
|
|
355
|
+
case 17:
|
|
356
|
+
_context.prev = 17;
|
|
357
|
+
_context.t1 = _context["catch"](11);
|
|
358
|
+
// Fetch 网络错误:先做 SDK 记录,再原样抛出给业务
|
|
292
359
|
try {
|
|
293
|
-
r.addCustomEvent(
|
|
360
|
+
r.addCustomEvent(EVENT_HTTP_ERROR, {
|
|
294
361
|
url: url,
|
|
295
362
|
method: method,
|
|
296
363
|
pagePath: window.location.href
|
|
297
364
|
});
|
|
298
|
-
} catch (
|
|
299
|
-
//
|
|
300
|
-
|
|
365
|
+
} catch (_) {
|
|
366
|
+
// 忽略录制异常
|
|
367
|
+
}
|
|
368
|
+
try {
|
|
369
|
+
if (errorTriggerInstance) {
|
|
370
|
+
errorTriggerInstance.onError({
|
|
371
|
+
type: 'http',
|
|
372
|
+
message: "Fetch ".concat(method, " ").concat(url, " network error"),
|
|
373
|
+
timestamp: Date.now(),
|
|
374
|
+
detail: {
|
|
375
|
+
url: url,
|
|
376
|
+
method: method,
|
|
377
|
+
error: String(_context.t1)
|
|
378
|
+
}
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
} catch (_) {
|
|
382
|
+
// 忽略错误触发器异常
|
|
383
|
+
}
|
|
384
|
+
throw _context.t1;
|
|
385
|
+
case 22:
|
|
386
|
+
// 请求成功后的 SDK 记录逻辑,全部 try/catch 保护
|
|
387
|
+
try {
|
|
388
|
+
endTime = Date.now();
|
|
389
|
+
if (shouldRecordUrl(url)) {
|
|
390
|
+
responseHeaders = {};
|
|
391
|
+
HEADERS_TO_EXTRACT.forEach(function (headerName) {
|
|
392
|
+
try {
|
|
393
|
+
var value = response.headers.get(headerName);
|
|
394
|
+
if (value) {
|
|
395
|
+
responseHeaders[headerName] = value;
|
|
396
|
+
}
|
|
397
|
+
} catch (_) {
|
|
398
|
+
// 忽略无法访问的响应头
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
try {
|
|
402
|
+
r.addCustomEvent(EVENT_HTTP_SUCCESS, {
|
|
403
|
+
url: url,
|
|
404
|
+
method: method,
|
|
405
|
+
dur: endTime - startTime,
|
|
406
|
+
responseHeaders: responseHeaders,
|
|
407
|
+
pagePath: window.location.href
|
|
408
|
+
});
|
|
409
|
+
} catch (_) {
|
|
410
|
+
// 忽略录制异常
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
if (errorTriggerInstance) {
|
|
414
|
+
config = getConfig();
|
|
415
|
+
httpErrorThreshold = (_config$errorCapture$2 = (_config$errorCapture2 = config.errorCapture) === null || _config$errorCapture2 === void 0 ? void 0 : _config$errorCapture2.httpErrorThreshold) !== null && _config$errorCapture$2 !== void 0 ? _config$errorCapture$2 : 400;
|
|
416
|
+
if (response.status >= httpErrorThreshold) {
|
|
417
|
+
errorTriggerInstance.onError({
|
|
418
|
+
type: 'http',
|
|
419
|
+
message: "Fetch ".concat(method, " ").concat(url, " responded with status ").concat(response.status),
|
|
420
|
+
timestamp: Date.now(),
|
|
421
|
+
detail: {
|
|
422
|
+
url: url,
|
|
423
|
+
method: method,
|
|
424
|
+
status: response.status
|
|
425
|
+
}
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
} catch (error) {
|
|
430
|
+
logger.warn('Error in Fetch success handler:', error);
|
|
301
431
|
}
|
|
302
|
-
|
|
303
|
-
case
|
|
432
|
+
return _context.abrupt("return", response);
|
|
433
|
+
case 24:
|
|
304
434
|
case "end":
|
|
305
435
|
return _context.stop();
|
|
306
436
|
}
|
|
307
|
-
}, _callee, null, [[
|
|
437
|
+
}, _callee, null, [[0, 5], [11, 17]]);
|
|
308
438
|
}));
|
|
309
439
|
return function (_x, _x2) {
|
|
310
440
|
return _ref3.apply(this, arguments);
|
|
311
441
|
};
|
|
312
442
|
}();
|
|
443
|
+
|
|
444
|
+
// 监听网络连接状态变化
|
|
445
|
+
window.addEventListener('online', handleOnline);
|
|
446
|
+
window.addEventListener('offline', handleOffline);
|
|
313
447
|
}
|
|
314
448
|
|
|
315
449
|
// 恢复原始方法
|
|
@@ -323,8 +457,11 @@ export function restoreXhr() {
|
|
|
323
457
|
if (origFetch) {
|
|
324
458
|
window.fetch = origFetch;
|
|
325
459
|
}
|
|
460
|
+
|
|
461
|
+
// 移除网络状态监听器
|
|
462
|
+
window.removeEventListener('online', handleOnline);
|
|
463
|
+
window.removeEventListener('offline', handleOffline);
|
|
326
464
|
isHooked = false;
|
|
327
|
-
console.log('RLog network monitoring restored');
|
|
328
465
|
}
|
|
329
466
|
|
|
330
467
|
// 导出配置方法
|
|
@@ -371,7 +508,7 @@ export function setSdkLogEndpoint(endpoint) {
|
|
|
371
508
|
sdkLogEndpoint = endpoint;
|
|
372
509
|
|
|
373
510
|
// 规范化endpoint路径,确保相对路径也能正确匹配
|
|
374
|
-
var normalizedEndpoint = endpoint
|
|
511
|
+
var normalizedEndpoint = normalizeUrl(endpoint);
|
|
375
512
|
|
|
376
513
|
// 自动将SDK日志上报接口加入黑名单,避免循环上报
|
|
377
514
|
// 同时添加原始路径和规范化路径,确保兼容性
|
|
@@ -401,4 +538,12 @@ export function getSdkLogEndpoint() {
|
|
|
401
538
|
*/
|
|
402
539
|
export function setCustomHeaders(headers) {
|
|
403
540
|
Object.assign(customHeaders, headers);
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
/**
|
|
544
|
+
* 获取当前设置的自定义请求头
|
|
545
|
+
* @returns 当前自定义请求头的副本
|
|
546
|
+
*/
|
|
547
|
+
export function getCustomHeaders() {
|
|
548
|
+
return _objectSpread({}, customHeaders);
|
|
404
549
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../src/lib/request.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../src/lib/request.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,GAAG,CAAC;IACV,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IACrB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAwE1F;AAED;;;;;GAKG;AACH,wBAAsB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,CAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAE/G;AAED;;;;;;GAMG;AACH,wBAAsB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAEnH"}
|
package/dist/esm/lib/request.js
CHANGED
|
@@ -8,7 +8,7 @@ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" ==
|
|
|
8
8
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
9
9
|
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
10
10
|
// 简单的 XMLHttpRequest 封装,提供更好的兼容性
|
|
11
|
-
|
|
11
|
+
import { REQUEST_TIMEOUT } from "./constants";
|
|
12
12
|
/**
|
|
13
13
|
* 发送 HTTP 请求
|
|
14
14
|
* @param url 请求地址
|
|
@@ -40,7 +40,7 @@ function _request() {
|
|
|
40
40
|
headers = _options$headers === void 0 ? {} : _options$headers,
|
|
41
41
|
body = options.body,
|
|
42
42
|
_options$timeout = options.timeout,
|
|
43
|
-
timeout = _options$timeout === void 0 ?
|
|
43
|
+
timeout = _options$timeout === void 0 ? REQUEST_TIMEOUT : _options$timeout;
|
|
44
44
|
var xhr = new XMLHttpRequest();
|
|
45
45
|
|
|
46
46
|
// 设置超时
|
|
@@ -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;
|
|
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;AAKrD,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;AAoJD;;;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,QA0CpE;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,SA4BhC"}
|