@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.
Files changed (50) hide show
  1. package/dist/esm/lib/api.d.ts +10 -0
  2. package/dist/esm/lib/api.d.ts.map +1 -1
  3. package/dist/esm/lib/api.js +47 -31
  4. package/dist/esm/lib/config.d.ts +1 -0
  5. package/dist/esm/lib/config.d.ts.map +1 -1
  6. package/dist/esm/lib/config.js +2 -0
  7. package/dist/esm/lib/error.d.ts.map +1 -1
  8. package/dist/esm/lib/error.js +65 -138
  9. package/dist/esm/lib/init.d.ts.map +1 -1
  10. package/dist/esm/lib/init.js +14 -7
  11. package/dist/esm/lib/net.d.ts +1 -0
  12. package/dist/esm/lib/net.d.ts.map +1 -1
  13. package/dist/esm/lib/net.js +33 -2
  14. package/dist/esm/lib/router-monitor.d.ts.map +1 -1
  15. package/dist/esm/lib/router-monitor.js +100 -0
  16. package/dist/esm/lib/upload-worker-manager.d.ts +37 -0
  17. package/dist/esm/lib/upload-worker-manager.d.ts.map +1 -0
  18. package/dist/esm/lib/upload-worker-manager.js +482 -0
  19. package/dist/esm/lib/upload-worker.d.ts +59 -0
  20. package/dist/esm/lib/upload-worker.d.ts.map +1 -0
  21. package/dist/esm/lib/upload-worker.js +26 -0
  22. package/dist/esm/lib/uploader.d.ts +5 -0
  23. package/dist/esm/lib/uploader.d.ts.map +1 -1
  24. package/dist/esm/lib/uploader.js +58 -10
  25. package/dist/lib/lib/api.d.ts +10 -0
  26. package/dist/lib/lib/api.d.ts.map +1 -1
  27. package/dist/lib/lib/api.js +48 -31
  28. package/dist/lib/lib/config.d.ts +1 -0
  29. package/dist/lib/lib/config.d.ts.map +1 -1
  30. package/dist/lib/lib/config.js +2 -0
  31. package/dist/lib/lib/error.d.ts.map +1 -1
  32. package/dist/lib/lib/error.js +65 -138
  33. package/dist/lib/lib/init.d.ts.map +1 -1
  34. package/dist/lib/lib/init.js +13 -6
  35. package/dist/lib/lib/net.d.ts +1 -0
  36. package/dist/lib/lib/net.d.ts.map +1 -1
  37. package/dist/lib/lib/net.js +33 -1
  38. package/dist/lib/lib/router-monitor.d.ts.map +1 -1
  39. package/dist/lib/lib/router-monitor.js +100 -0
  40. package/dist/lib/lib/upload-worker-manager.d.ts +37 -0
  41. package/dist/lib/lib/upload-worker-manager.d.ts.map +1 -0
  42. package/dist/lib/lib/upload-worker-manager.js +491 -0
  43. package/dist/lib/lib/upload-worker.d.ts +59 -0
  44. package/dist/lib/lib/upload-worker.d.ts.map +1 -0
  45. package/dist/lib/lib/upload-worker.js +32 -0
  46. package/dist/lib/lib/uploader.d.ts +5 -0
  47. package/dist/lib/lib/uploader.d.ts.map +1 -1
  48. package/dist/lib/lib/uploader.js +58 -10
  49. package/dist/rlog-sdk.min.js +1 -1
  50. package/package.json +3 -2
@@ -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
- function initErrorHandler() {
60
- _logger.default.log('Error handling is enabled');
61
-
62
- // JavaScript 运行时错误处理
63
- var errorHandler = function errorHandler(event) {
64
- var errorEvent = event;
65
- // 检查是否是资源加载错误
66
- if (event.target !== window) {
67
- // 资源加载错误
68
- var _errorData = {
69
- type: 'RESOURCE_ERROR',
70
- resourceType: event.target.tagName,
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(errorData);
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
- // 拦截未处理的 Promise 错误
112
- var unhandledRejectionHandler = function unhandledRejectionHandler(event) {
113
- var rejectionEvent = event;
114
- var reason = rejectionEvent.reason || 'Unknown rejection';
115
- var errorData = {
116
- type: 'PROMISE_REJECTION',
117
- message: typeof reason === 'string' ? reason : reason.message,
118
- stack: _typeof(reason) === 'object' ? reason.stack : null,
119
- timestamp: Date.now(),
120
- location: window.location.href
121
- };
122
- sendErrorToAnalytics(errorData);
123
- // 阻止默认控制台报错
124
- event.preventDefault();
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
- window.addEventListener('unhandledrejection', unhandledRejectionHandler);
127
- eventListeners.push({
128
- target: window,
129
- type: 'unhandledrejection',
130
- listener: unhandledRejectionHandler
131
- });
96
+ sendErrorToAnalytics(errorData);
132
97
 
133
- // 监控页面性能相关事件
134
- var loadHandler = function loadHandler() {
135
- sendErrorToAnalytics({
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
- var beforeUnloadHandler = function beforeUnloadHandler() {
150
- sendErrorToAnalytics({
151
- type: 'PAGE_UNLOAD',
152
- url: window.location.href,
153
- timestamp: Date.now()
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
- window.addEventListener('beforeunload', beforeUnloadHandler);
157
- eventListeners.push({
158
- target: window,
159
- type: 'beforeunload',
160
- listener: beforeUnloadHandler
161
- });
115
+ sendErrorToAnalytics(errorData);
116
+ // 阻止默认控制台报错
117
+ event.preventDefault();
118
+ }
162
119
 
163
- // 监控网络连接状态变化
164
- var onlineHandler = function onlineHandler() {
165
- sendErrorToAnalytics({
166
- type: 'NETWORK_ONLINE',
167
- timestamp: Date.now()
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
- eventListeners.forEach(function (_ref) {
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,CA0DN"}
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"}
@@ -99,12 +99,12 @@ function initRLog(serv, appId, cdnConfigUrl) {
99
99
  (0, _uploader.resetUploadLoop)();
100
100
 
101
101
  // 设置SDK日志上报接口地址,并自动加入黑名单避免循环上报
102
- if (serv) {
103
- (0, _net.setSdkLogEndpoint)(serv);
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)(serv, appId);
139
+ (0, _uploader.startUploadLoop)(normalizedServUrl, appId);
140
140
 
141
141
  // 初始化路由监控
142
142
  (0, _routerMonitor.initRouterMonitor)(config.routerMonitor);
143
143
 
144
- // 初始化错误处理(全量模式和错误模式都启用)
145
- (0, _error.initErrorHandler)();
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
  });
@@ -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;AA2ID,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAgBpD;AAUD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,MAAM,QAkPxC;AAGD,wBAAgB,UAAU,IAAI,IAAI,CAYjC;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,CAsBxD;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"}
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"}
@@ -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.startsWith('/') ? endpoint : '/' + 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;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,eAAe,CAAC,QAkCpE;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,SAyBhC"}
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"}