sobey-monitor-sdk 1.0.1 → 1.0.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/dist/index.cjs.js +39 -15
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +39 -15
- package/dist/index.esm.js.map +1 -1
- package/dist/index.umd.js +39 -15
- package/dist/index.umd.js.map +1 -1
- package/dist/reporter/sender.d.ts +2 -0
- package/package.json +1 -1
package/dist/index.cjs.js
CHANGED
|
@@ -231,12 +231,6 @@ function getPageTitle() {
|
|
|
231
231
|
function supportsSendBeacon() {
|
|
232
232
|
return typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function';
|
|
233
233
|
}
|
|
234
|
-
/**
|
|
235
|
-
* 判断页面是否即将卸载
|
|
236
|
-
*/
|
|
237
|
-
function isPageHidden() {
|
|
238
|
-
return document.visibilityState === 'hidden';
|
|
239
|
-
}
|
|
240
234
|
|
|
241
235
|
/**
|
|
242
236
|
* 数据发送器
|
|
@@ -277,32 +271,39 @@ class Sender {
|
|
|
277
271
|
}
|
|
278
272
|
/**
|
|
279
273
|
* 执行发送
|
|
274
|
+
* 策略:优先使用 sendBeacon(更可靠),不支持或失败时降级为 fetch
|
|
280
275
|
*/
|
|
281
276
|
doSend(data) {
|
|
282
277
|
const cfg = config.get();
|
|
283
278
|
const dsn = cfg.dsn;
|
|
284
279
|
const payload = JSON.stringify(data);
|
|
285
|
-
//
|
|
286
|
-
if (
|
|
287
|
-
this.sendByBeacon(dsn, payload);
|
|
288
|
-
|
|
280
|
+
// 优先使用 sendBeacon(更可靠、异步、不阻塞页面)
|
|
281
|
+
if (supportsSendBeacon()) {
|
|
282
|
+
const success = this.sendByBeacon(dsn, payload);
|
|
283
|
+
if (success) {
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
// sendBeacon 失败,降级到 fetch
|
|
289
287
|
}
|
|
290
|
-
//
|
|
288
|
+
// 不支持 sendBeacon 或 sendBeacon 失败时,使用 fetch
|
|
291
289
|
this.sendByFetch(dsn, payload);
|
|
292
290
|
}
|
|
293
291
|
/**
|
|
294
292
|
* 使用 sendBeacon 发送
|
|
293
|
+
* 返回 true 表示成功加入队列,false 表示失败需要降级
|
|
295
294
|
*/
|
|
296
295
|
sendByBeacon(url, payload) {
|
|
297
296
|
try {
|
|
298
|
-
|
|
297
|
+
const success = navigator.sendBeacon(url, payload);
|
|
298
|
+
if (!success && config.get().debug) {
|
|
299
|
+
console.warn('[Monitor] sendBeacon returned false, falling back to fetch');
|
|
300
|
+
}
|
|
301
|
+
return success;
|
|
299
302
|
}
|
|
300
303
|
catch (e) {
|
|
301
304
|
if (config.get().debug) {
|
|
302
305
|
console.error('[Monitor] sendBeacon failed:', e);
|
|
303
306
|
}
|
|
304
|
-
// 降级到 fetch
|
|
305
|
-
this.sendByFetch(url, payload);
|
|
306
307
|
return false;
|
|
307
308
|
}
|
|
308
309
|
}
|
|
@@ -618,17 +619,36 @@ function installHttpErrorHandler() {
|
|
|
618
619
|
/**
|
|
619
620
|
* 拦截 XMLHttpRequest
|
|
620
621
|
*/
|
|
622
|
+
/**
|
|
623
|
+
* 检查是否是 SDK 自身的请求
|
|
624
|
+
*/
|
|
625
|
+
function isSdkRequest(url) {
|
|
626
|
+
const cfg = config.get();
|
|
627
|
+
if (!cfg.dsn)
|
|
628
|
+
return false;
|
|
629
|
+
return url.includes(cfg.dsn);
|
|
630
|
+
}
|
|
621
631
|
function interceptXHR() {
|
|
622
632
|
XMLHttpRequest.prototype.open = function (method, url, async = true, username, password) {
|
|
633
|
+
const urlStr = url.toString();
|
|
634
|
+
// 排除 SDK 自身的上报请求
|
|
635
|
+
if (isSdkRequest(urlStr)) {
|
|
636
|
+
this._monitorSkip = true;
|
|
637
|
+
return originalXHROpen.call(this, method, url, async, username, password);
|
|
638
|
+
}
|
|
623
639
|
// 存储请求信息
|
|
624
640
|
this._monitorData = {
|
|
625
641
|
method,
|
|
626
|
-
url:
|
|
642
|
+
url: urlStr,
|
|
627
643
|
startTime: 0,
|
|
628
644
|
};
|
|
629
645
|
return originalXHROpen.call(this, method, url, async, username, password);
|
|
630
646
|
};
|
|
631
647
|
XMLHttpRequest.prototype.send = function (body) {
|
|
648
|
+
// 跳过 SDK 自身的请求
|
|
649
|
+
if (this._monitorSkip) {
|
|
650
|
+
return originalXHRSend.call(this, body);
|
|
651
|
+
}
|
|
632
652
|
const monitorData = this._monitorData;
|
|
633
653
|
if (monitorData) {
|
|
634
654
|
monitorData.startTime = Date.now();
|
|
@@ -671,6 +691,10 @@ function interceptXHR() {
|
|
|
671
691
|
function interceptFetch() {
|
|
672
692
|
window.fetch = async function (input, init) {
|
|
673
693
|
const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
|
|
694
|
+
// 排除 SDK 自身的上报请求
|
|
695
|
+
if (isSdkRequest(url)) {
|
|
696
|
+
return originalFetch.call(window, input, init);
|
|
697
|
+
}
|
|
674
698
|
const method = init?.method || 'GET';
|
|
675
699
|
const startTime = Date.now();
|
|
676
700
|
const requestBody = typeof init?.body === 'string' ? init.body : undefined;
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/core/config.ts","../src/core/context.ts","../src/utils/browser.ts","../src/reporter/sender.ts","../src/reporter/index.ts","../src/plugins/error/jsError.ts","../src/plugins/error/promiseError.ts","../src/plugins/error/resourceError.ts","../src/plugins/error/httpError.ts","../src/plugins/error/whiteScreen.ts","../src/plugins/error/index.ts","../src/plugins/performance/webVitals.ts","../src/plugins/performance/index.ts","../src/plugins/behavior/pv.ts","../src/plugins/behavior/click.ts","../src/plugins/behavior/route.ts","../src/plugins/behavior/console.ts","../src/plugins/behavior/input.ts","../src/plugins/behavior/index.ts","../src/index.ts"],"sourcesContent":["/**\r\n * SDK 配置管理\r\n */\r\nimport type { MonitorConfig, SamplingConfig, ReportConfig } from '../types';\r\n\r\n/**\r\n * 默认配置\r\n */\r\nconst DEFAULT_CONFIG: Partial<MonitorConfig> = {\r\n debug: false,\r\n sampling: {\r\n error: 1,\r\n performance: 1,\r\n behavior: 1,\r\n },\r\n report: {\r\n maxBufferSize: 10,\r\n flushInterval: 5000,\r\n timeout: 10000,\r\n },\r\n error: {\r\n enabled: true,\r\n jsError: true,\r\n promiseError: true,\r\n resourceError: true,\r\n httpError: true,\r\n },\r\n performance: {\r\n enabled: true,\r\n webVitals: true,\r\n resource: true,\r\n api: true,\r\n },\r\n behavior: {\r\n enabled: true,\r\n pv: true,\r\n click: true,\r\n route: true,\r\n maxBreadcrumbs: 20,\r\n },\r\n};\r\n\r\n/**\r\n * 配置管理类\r\n */\r\nclass ConfigManager {\r\n private config: MonitorConfig | null = null;\r\n\r\n /**\r\n * 初始化配置\r\n */\r\n init(userConfig: MonitorConfig): void {\r\n if (!userConfig.appId) {\r\n throw new Error('[Monitor] appId is required');\r\n }\r\n if (!userConfig.dsn) {\r\n throw new Error('[Monitor] dsn is required');\r\n }\r\n\r\n this.config = this.mergeConfig(DEFAULT_CONFIG, userConfig);\r\n }\r\n\r\n /**\r\n * 获取配置\r\n */\r\n get(): MonitorConfig {\r\n if (!this.config) {\r\n throw new Error('[Monitor] SDK not initialized. Please call init() first.');\r\n }\r\n return this.config;\r\n }\r\n\r\n /**\r\n * 更新配置\r\n */\r\n update(partialConfig: Partial<MonitorConfig>): void {\r\n if (!this.config) {\r\n throw new Error('[Monitor] SDK not initialized. Please call init() first.');\r\n }\r\n this.config = this.mergeConfig(this.config, partialConfig);\r\n }\r\n\r\n /**\r\n * 设置用户信息\r\n */\r\n setUser(user: MonitorConfig['user']): void {\r\n if (this.config) {\r\n this.config.user = { ...this.config.user, ...user };\r\n }\r\n }\r\n\r\n /**\r\n * 是否已初始化\r\n */\r\n isInitialized(): boolean {\r\n return this.config !== null;\r\n }\r\n\r\n /**\r\n * 合并配置\r\n */\r\n private mergeConfig<T extends object>(defaultConfig: T, userConfig: Partial<T>): T {\r\n const result = { ...defaultConfig } as T;\r\n \r\n for (const key in userConfig) {\r\n if (Object.prototype.hasOwnProperty.call(userConfig, key)) {\r\n const userValue = userConfig[key];\r\n const defaultValue = (defaultConfig as any)[key];\r\n\r\n if (\r\n userValue !== null &&\r\n typeof userValue === 'object' &&\r\n !Array.isArray(userValue) &&\r\n defaultValue !== null &&\r\n typeof defaultValue === 'object' &&\r\n !Array.isArray(defaultValue)\r\n ) {\r\n (result as any)[key] = this.mergeConfig(defaultValue, userValue);\r\n } else {\r\n (result as any)[key] = userValue;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport const config = new ConfigManager();\r\n","/**\r\n * SDK 上下文管理\r\n * 管理会话 ID、设备信息等全局状态\r\n */\r\nimport type { DeviceInfo, BreadCrumb } from '../types';\r\n\r\n/**\r\n * 上下文管理类\r\n */\r\nclass ContextManager {\r\n private sessionId: string = '';\r\n private deviceInfo: DeviceInfo | null = null;\r\n private breadcrumbs: BreadCrumb[] = [];\r\n private maxBreadcrumbs: number = 20;\r\n\r\n /**\r\n * 初始化上下文\r\n */\r\n init(maxBreadcrumbs: number = 20): void {\r\n this.sessionId = this.generateSessionId();\r\n this.deviceInfo = this.collectDeviceInfo();\r\n this.maxBreadcrumbs = maxBreadcrumbs;\r\n this.breadcrumbs = [];\r\n }\r\n\r\n /**\r\n * 获取会话 ID\r\n */\r\n getSessionId(): string {\r\n return this.sessionId;\r\n }\r\n\r\n /**\r\n * 获取设备信息\r\n */\r\n getDeviceInfo(): DeviceInfo | null {\r\n return this.deviceInfo;\r\n }\r\n\r\n /**\r\n * 添加面包屑\r\n */\r\n addBreadcrumb(crumb: Omit<BreadCrumb, 'timestamp'>): void {\r\n const breadcrumb: BreadCrumb = {\r\n ...crumb,\r\n timestamp: Date.now(),\r\n };\r\n\r\n this.breadcrumbs.push(breadcrumb);\r\n\r\n // 限制数量\r\n if (this.breadcrumbs.length > this.maxBreadcrumbs) {\r\n this.breadcrumbs.shift();\r\n }\r\n }\r\n\r\n /**\r\n * 获取所有面包屑\r\n */\r\n getBreadcrumbs(): BreadCrumb[] {\r\n return [...this.breadcrumbs];\r\n }\r\n\r\n /**\r\n * 清空面包屑\r\n */\r\n clearBreadcrumbs(): void {\r\n this.breadcrumbs = [];\r\n }\r\n\r\n /**\r\n * 生成会话 ID\r\n */\r\n private generateSessionId(): string {\r\n const timestamp = Date.now().toString(36);\r\n const randomPart = Math.random().toString(36).substring(2, 10);\r\n return `${timestamp}-${randomPart}`;\r\n }\r\n\r\n /**\r\n * 收集设备信息\r\n */\r\n private collectDeviceInfo(): DeviceInfo {\r\n return {\r\n screenWidth: window.screen.width,\r\n screenHeight: window.screen.height,\r\n viewportWidth: window.innerWidth,\r\n viewportHeight: window.innerHeight,\r\n devicePixelRatio: window.devicePixelRatio || 1,\r\n language: navigator.language,\r\n platform: navigator.platform,\r\n };\r\n }\r\n}\r\n\r\nexport const context = new ContextManager();\r\n","/**\r\n * 浏览器信息工具\r\n */\r\n\r\n/**\r\n * 获取浏览器 User-Agent\r\n */\r\nexport function getUserAgent(): string {\r\n return navigator.userAgent;\r\n}\r\n\r\n/**\r\n * 获取当前页面 URL\r\n */\r\nexport function getPageUrl(): string {\r\n return window.location.href;\r\n}\r\n\r\n/**\r\n * 获取页面来源\r\n */\r\nexport function getReferrer(): string {\r\n return document.referrer;\r\n}\r\n\r\n/**\r\n * 获取页面标题\r\n */\r\nexport function getPageTitle(): string {\r\n return document.title;\r\n}\r\n\r\n/**\r\n * 检查是否为同源\r\n */\r\nexport function isSameOrigin(url: string): boolean {\r\n try {\r\n const urlObj = new URL(url, window.location.origin);\r\n return urlObj.origin === window.location.origin;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * 判断是否支持 sendBeacon\r\n */\r\nexport function supportsSendBeacon(): boolean {\r\n return typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function';\r\n}\r\n\r\n/**\r\n * 判断页面是否即将卸载\r\n */\r\nexport function isPageHidden(): boolean {\r\n return document.visibilityState === 'hidden';\r\n}\r\n","/**\r\n * 数据发送器\r\n */\r\nimport { config } from '../core/config';\r\nimport { supportsSendBeacon, isPageHidden } from '../utils/browser';\r\nimport type { ReportData } from '../types';\r\n\r\n/**\r\n * 发送器类\r\n */\r\nclass Sender {\r\n private buffer: ReportData[] = [];\r\n private timer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n /**\r\n * 发送单条数据\r\n */\r\n send(data: ReportData): void {\r\n const cfg = config.get();\r\n \r\n // 添加到缓冲区\r\n this.buffer.push(data);\r\n\r\n // 达到缓冲上限,立即发送\r\n if (this.buffer.length >= (cfg.report?.maxBufferSize || 10)) {\r\n this.flush();\r\n return;\r\n }\r\n\r\n // 启动定时器\r\n this.scheduleFlush();\r\n }\r\n\r\n /**\r\n * 立即发送所有缓冲数据\r\n */\r\n flush(): void {\r\n if (this.buffer.length === 0) return;\r\n\r\n const data = [...this.buffer];\r\n this.buffer = [];\r\n this.clearTimer();\r\n\r\n this.doSend(data);\r\n }\r\n\r\n /**\r\n * 执行发送\r\n */\r\n private doSend(data: ReportData[]): void {\r\n const cfg = config.get();\r\n const dsn = cfg.dsn;\r\n\r\n const payload = JSON.stringify(data);\r\n\r\n // 页面卸载时优先使用 sendBeacon\r\n if (isPageHidden() && supportsSendBeacon()) {\r\n this.sendByBeacon(dsn, payload);\r\n return;\r\n }\r\n\r\n // 正常情况使用 fetch\r\n this.sendByFetch(dsn, payload);\r\n }\r\n\r\n /**\r\n * 使用 sendBeacon 发送\r\n */\r\n private sendByBeacon(url: string, payload: string): boolean {\r\n try {\r\n return navigator.sendBeacon(url, payload);\r\n } catch (e) {\r\n if (config.get().debug) {\r\n console.error('[Monitor] sendBeacon failed:', e);\r\n }\r\n // 降级到 fetch\r\n this.sendByFetch(url, payload);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * 使用 fetch 发送\r\n */\r\n private sendByFetch(url: string, payload: string): void {\r\n const cfg = config.get();\r\n\r\n fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: payload,\r\n keepalive: true,\r\n }).catch((e) => {\r\n if (cfg.debug) {\r\n console.error('[Monitor] fetch failed:', e);\r\n }\r\n // 发送失败,将数据放回缓冲区(可选)\r\n // this.buffer.unshift(...JSON.parse(payload));\r\n });\r\n }\r\n\r\n /**\r\n * 调度延迟发送\r\n */\r\n private scheduleFlush(): void {\r\n if (this.timer) return;\r\n\r\n const cfg = config.get();\r\n const interval = cfg.report?.flushInterval || 5000;\r\n\r\n this.timer = setTimeout(() => {\r\n this.flush();\r\n }, interval);\r\n }\r\n\r\n /**\r\n * 清除定时器\r\n */\r\n private clearTimer(): void {\r\n if (this.timer) {\r\n clearTimeout(this.timer);\r\n this.timer = null;\r\n }\r\n }\r\n}\r\n\r\nexport const sender = new Sender();\r\n\r\n// 页面卸载时发送剩余数据\r\nif (typeof window !== 'undefined') {\r\n window.addEventListener('beforeunload', () => {\r\n sender.flush();\r\n });\r\n\r\n window.addEventListener('visibilitychange', () => {\r\n if (document.visibilityState === 'hidden') {\r\n sender.flush();\r\n }\r\n });\r\n}\r\n","/**\r\n * 数据上报管理\r\n */\r\nimport { config } from '../core/config';\r\nimport { context } from '../core/context';\r\nimport { sender } from './sender';\r\nimport { getPageUrl, getUserAgent } from '../utils/browser';\r\nimport type { BaseData, ErrorData, PerformanceData, BehaviorData, ReportData } from '../types';\r\n\r\n// SDK 版本\r\nconst SDK_VERSION = '1.0.0';\r\n\r\n/**\r\n * 上报器类\r\n */\r\nclass Reporter {\r\n /**\r\n * 构建基础数据\r\n */\r\n private buildBaseData(): BaseData {\r\n const cfg = config.get();\r\n \r\n return {\r\n appId: cfg.appId,\r\n userId: cfg.user?.userId,\r\n sessionId: context.getSessionId(),\r\n pageUrl: getPageUrl(),\r\n timestamp: Date.now(),\r\n userAgent: getUserAgent(),\r\n sdkVersion: cfg.version || SDK_VERSION,\r\n };\r\n }\r\n\r\n /**\r\n * 采样判断\r\n */\r\n private shouldSample(type: 'error' | 'performance' | 'behavior'): boolean {\r\n const cfg = config.get();\r\n const rate = cfg.sampling?.[type] ?? 1;\r\n return Math.random() < rate;\r\n }\r\n\r\n /**\r\n * 上报错误\r\n */\r\n reportError(data: Omit<ErrorData, keyof BaseData>): void {\r\n if (!this.shouldSample('error')) return;\r\n\r\n const cfg = config.get();\r\n \r\n // 过滤\r\n if (cfg.error?.filter) {\r\n const fullData = { ...this.buildBaseData(), ...data } as ErrorData;\r\n if (!cfg.error.filter(fullData)) return;\r\n }\r\n\r\n const reportData: ErrorData = {\r\n ...this.buildBaseData(),\r\n ...data,\r\n breadcrumbs: context.getBreadcrumbs(),\r\n deviceInfo: context.getDeviceInfo() || undefined,\r\n };\r\n\r\n this.send(reportData);\r\n }\r\n\r\n /**\r\n * 上报性能\r\n */\r\n reportPerformance(data: Omit<PerformanceData, keyof BaseData>): void {\r\n if (!this.shouldSample('performance')) return;\r\n\r\n const reportData: PerformanceData = {\r\n ...this.buildBaseData(),\r\n ...data,\r\n };\r\n\r\n this.send(reportData);\r\n }\r\n\r\n /**\r\n * 上报行为\r\n */\r\n reportBehavior(data: Omit<BehaviorData, keyof BaseData>): void {\r\n if (!this.shouldSample('behavior')) return;\r\n\r\n const reportData: BehaviorData = {\r\n ...this.buildBaseData(),\r\n ...data,\r\n };\r\n\r\n this.send(reportData);\r\n }\r\n\r\n /**\r\n * 通用发送\r\n */\r\n private send(data: ReportData): void {\r\n const cfg = config.get();\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] Report:', data);\r\n }\r\n\r\n sender.send(data);\r\n }\r\n\r\n /**\r\n * 立即发送缓冲区数据\r\n */\r\n flush(): void {\r\n sender.flush();\r\n }\r\n}\r\n\r\nexport const reporter = new Reporter();\r\n","/**\r\n * JS 运行时错误捕获插件\r\n */\r\nimport { config } from '../../core/config';\r\nimport { context } from '../../core/context';\r\nimport { reporter } from '../../reporter';\r\nimport type { ErrorData } from '../../types';\r\n\r\n/**\r\n * 安装 JS 错误监听\r\n */\r\nexport function installJsErrorHandler(): void {\r\n const cfg = config.get();\r\n \r\n if (!cfg.error?.enabled || !cfg.error?.jsError) {\r\n return;\r\n }\r\n\r\n window.addEventListener('error', (event: ErrorEvent) => {\r\n // 过滤资源加载错误(由 resourceError 处理)\r\n if (event.target !== window) {\r\n return;\r\n }\r\n\r\n const errorData: Omit<ErrorData, 'appId' | 'userId' | 'sessionId' | 'pageUrl' | 'timestamp' | 'userAgent' | 'sdkVersion' | 'breadcrumbs'> = {\r\n type: 'js_error',\r\n message: event.message || 'Unknown error',\r\n stack: event.error?.stack,\r\n filename: event.filename,\r\n lineno: event.lineno,\r\n colno: event.colno,\r\n };\r\n\r\n // 添加到面包屑\r\n context.addBreadcrumb({\r\n type: 'console',\r\n category: 'error',\r\n data: {\r\n message: errorData.message,\r\n filename: errorData.filename,\r\n lineno: errorData.lineno,\r\n },\r\n });\r\n\r\n reporter.reportError(errorData);\r\n }, true);\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] JS error handler installed');\r\n }\r\n}\r\n","/**\r\n * Promise 未捕获错误插件\r\n */\r\nimport { config } from '../../core/config';\r\nimport { context } from '../../core/context';\r\nimport { reporter } from '../../reporter';\r\nimport type { ErrorData } from '../../types';\r\n\r\n/**\r\n * 安装 Promise 错误监听\r\n */\r\nexport function installPromiseErrorHandler(): void {\r\n const cfg = config.get();\r\n \r\n if (!cfg.error?.enabled || !cfg.error?.promiseError) {\r\n return;\r\n }\r\n\r\n window.addEventListener('unhandledrejection', (event: PromiseRejectionEvent) => {\r\n let message = 'Unhandled Promise rejection';\r\n let stack: string | undefined;\r\n\r\n const reason = event.reason;\r\n\r\n if (reason instanceof Error) {\r\n message = reason.message;\r\n stack = reason.stack;\r\n } else if (typeof reason === 'string') {\r\n message = reason;\r\n } else if (reason && typeof reason === 'object') {\r\n message = JSON.stringify(reason);\r\n }\r\n\r\n const errorData: Omit<ErrorData, 'appId' | 'userId' | 'sessionId' | 'pageUrl' | 'timestamp' | 'userAgent' | 'sdkVersion' | 'breadcrumbs'> = {\r\n type: 'promise_error',\r\n message,\r\n stack,\r\n };\r\n\r\n // 添加到面包屑\r\n context.addBreadcrumb({\r\n type: 'console',\r\n category: 'promise_error',\r\n data: {\r\n message: errorData.message,\r\n },\r\n });\r\n\r\n reporter.reportError(errorData);\r\n });\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] Promise error handler installed');\r\n }\r\n}\r\n","/**\r\n * 资源加载错误捕获插件\r\n */\r\nimport { config } from '../../core/config';\r\nimport { context } from '../../core/context';\r\nimport { reporter } from '../../reporter';\r\nimport type { ErrorData } from '../../types';\r\n\r\n/**\r\n * 安装资源错误监听\r\n */\r\nexport function installResourceErrorHandler(): void {\r\n const cfg = config.get();\r\n \r\n if (!cfg.error?.enabled || !cfg.error?.resourceError) {\r\n return;\r\n }\r\n\r\n window.addEventListener('error', (event: Event) => {\r\n const target = event.target;\r\n \r\n // 只处理资源加载错误(target 不是 window)\r\n if (!target || target === window || !(target instanceof HTMLElement)) {\r\n return;\r\n }\r\n\r\n const tagName = target.tagName.toLowerCase();\r\n \r\n // 只监控特定标签的资源\r\n if (!['img', 'script', 'link', 'video', 'audio', 'source'].includes(tagName)) {\r\n return;\r\n }\r\n\r\n // 获取资源 URL\r\n const resourceUrl = (target as HTMLImageElement | HTMLScriptElement).src \r\n || (target as HTMLLinkElement).href \r\n || '';\r\n\r\n if (!resourceUrl) {\r\n return;\r\n }\r\n\r\n const errorData: Omit<ErrorData, 'appId' | 'userId' | 'sessionId' | 'pageUrl' | 'timestamp' | 'userAgent' | 'sdkVersion' | 'breadcrumbs'> = {\r\n type: 'resource_error',\r\n message: `Failed to load ${tagName}: ${resourceUrl}`,\r\n resourceUrl,\r\n };\r\n\r\n // 添加到面包屑\r\n context.addBreadcrumb({\r\n type: 'request',\r\n category: 'resource_error',\r\n data: {\r\n tagName,\r\n resourceUrl,\r\n },\r\n });\r\n\r\n reporter.reportError(errorData);\r\n }, true); // 使用捕获阶段\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] Resource error handler installed');\r\n }\r\n}\r\n","/**\r\n * HTTP 请求错误拦截插件\r\n * 拦截 XMLHttpRequest 和 Fetch 请求\r\n */\r\nimport { config } from '../../core/config';\r\nimport { context } from '../../core/context';\r\nimport { reporter } from '../../reporter';\r\nimport type { ErrorData, HttpInfo } from '../../types';\r\n\r\n// 保存原始方法\r\nconst originalXHROpen = XMLHttpRequest.prototype.open;\r\nconst originalXHRSend = XMLHttpRequest.prototype.send;\r\nconst originalFetch = window.fetch;\r\n\r\n/**\r\n * 安装 HTTP 错误拦截\r\n */\r\nexport function installHttpErrorHandler(): void {\r\n const cfg = config.get();\r\n \r\n if (!cfg.error?.enabled || !cfg.error?.httpError) {\r\n return;\r\n }\r\n\r\n interceptXHR();\r\n interceptFetch();\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] HTTP error handler installed');\r\n }\r\n}\r\n\r\n/**\r\n * 拦截 XMLHttpRequest\r\n */\r\nfunction interceptXHR(): void {\r\n XMLHttpRequest.prototype.open = function (\r\n method: string,\r\n url: string | URL,\r\n async: boolean = true,\r\n username?: string | null,\r\n password?: string | null\r\n ): void {\r\n // 存储请求信息\r\n (this as any)._monitorData = {\r\n method,\r\n url: url.toString(),\r\n startTime: 0,\r\n };\r\n\r\n return originalXHROpen.call(this, method, url, async, username, password);\r\n };\r\n\r\n XMLHttpRequest.prototype.send = function (body?: Document | XMLHttpRequestBodyInit | null): void {\r\n const monitorData = (this as any)._monitorData;\r\n if (monitorData) {\r\n monitorData.startTime = Date.now();\r\n monitorData.requestBody = typeof body === 'string' ? body : undefined;\r\n }\r\n\r\n this.addEventListener('loadend', function () {\r\n if (!monitorData) return;\r\n\r\n const duration = Date.now() - monitorData.startTime;\r\n const status = this.status;\r\n\r\n // 添加到面包屑\r\n context.addBreadcrumb({\r\n type: 'request',\r\n category: 'xhr',\r\n data: {\r\n method: monitorData.method,\r\n url: monitorData.url,\r\n status,\r\n duration,\r\n },\r\n });\r\n\r\n // 只上报错误请求 (4xx, 5xx 或 0)\r\n if (status === 0 || status >= 400) {\r\n reportHttpError({\r\n method: monitorData.method,\r\n url: monitorData.url,\r\n status,\r\n duration,\r\n requestBody: monitorData.requestBody,\r\n responseBody: this.responseText?.substring(0, 1000), // 限制长度\r\n });\r\n }\r\n });\r\n\r\n return originalXHRSend.call(this, body);\r\n };\r\n}\r\n\r\n/**\r\n * 拦截 Fetch\r\n */\r\nfunction interceptFetch(): void {\r\n window.fetch = async function (\r\n input: RequestInfo | URL,\r\n init?: RequestInit\r\n ): Promise<Response> {\r\n const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;\r\n const method = init?.method || 'GET';\r\n const startTime = Date.now();\r\n const requestBody = typeof init?.body === 'string' ? init.body : undefined;\r\n\r\n try {\r\n const response = await originalFetch.call(window, input, init);\r\n const duration = Date.now() - startTime;\r\n const status = response.status;\r\n\r\n // 添加到面包屑\r\n context.addBreadcrumb({\r\n type: 'request',\r\n category: 'fetch',\r\n data: {\r\n method,\r\n url,\r\n status,\r\n duration,\r\n },\r\n });\r\n\r\n // 只上报错误请求\r\n if (!response.ok) {\r\n // 克隆响应以读取 body\r\n const cloned = response.clone();\r\n let responseBody: string | undefined;\r\n try {\r\n responseBody = await cloned.text();\r\n responseBody = responseBody.substring(0, 1000);\r\n } catch {}\r\n\r\n reportHttpError({\r\n method,\r\n url,\r\n status,\r\n duration,\r\n requestBody,\r\n responseBody,\r\n });\r\n }\r\n\r\n return response;\r\n } catch (error) {\r\n const duration = Date.now() - startTime;\r\n\r\n // 网络错误\r\n context.addBreadcrumb({\r\n type: 'request',\r\n category: 'fetch',\r\n data: {\r\n method,\r\n url,\r\n status: 0,\r\n duration,\r\n error: (error as Error).message,\r\n },\r\n });\r\n\r\n reportHttpError({\r\n method,\r\n url,\r\n status: 0,\r\n duration,\r\n requestBody,\r\n });\r\n\r\n throw error;\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * 上报 HTTP 错误\r\n */\r\nfunction reportHttpError(httpInfo: HttpInfo): void {\r\n const errorData: Omit<ErrorData, 'appId' | 'userId' | 'sessionId' | 'pageUrl' | 'timestamp' | 'userAgent' | 'sdkVersion' | 'breadcrumbs'> = {\r\n type: 'http_error',\r\n message: `HTTP ${httpInfo.status} ${httpInfo.method} ${httpInfo.url}`,\r\n httpInfo,\r\n };\r\n\r\n reporter.reportError(errorData);\r\n}\r\n","/**\r\n * 白屏检测插件\r\n * 使用 DOM 采样检测页面是否白屏\r\n */\r\nimport { config } from '../../core/config';\r\nimport { reporter } from '../../reporter';\r\nimport type { ErrorData } from '../../types';\r\n\r\n// 采样点 - 页面关键区域\r\nconst SAMPLE_POINTS = [\r\n { x: 0.5, y: 0.1 }, // 顶部中间\r\n { x: 0.25, y: 0.5 }, // 左中\r\n { x: 0.5, y: 0.5 }, // 中心\r\n { x: 0.75, y: 0.5 }, // 右中\r\n { x: 0.5, y: 0.9 }, // 底部中间\r\n];\r\n\r\n// 无效元素\r\nconst INVALID_ELEMENTS = ['html', 'body', 'head', 'meta', 'link', 'style', 'script'];\r\n\r\n/**\r\n * 安装白屏检测\r\n */\r\nexport function installWhiteScreenDetector(): void {\r\n const cfg = config.get();\r\n \r\n if (!cfg.error?.enabled) {\r\n return;\r\n }\r\n\r\n // 在页面加载完成后检测\r\n if (document.readyState === 'complete') {\r\n scheduleDetection();\r\n } else {\r\n window.addEventListener('load', () => {\r\n scheduleDetection();\r\n });\r\n }\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] White screen detector installed');\r\n }\r\n}\r\n\r\n/**\r\n * 调度检测(延迟执行,给页面渲染时间)\r\n */\r\nfunction scheduleDetection(): void {\r\n // 延迟 1 秒检测\r\n setTimeout(() => {\r\n const isWhiteScreen = detectWhiteScreen();\r\n \r\n if (isWhiteScreen) {\r\n reportWhiteScreen();\r\n }\r\n }, 1000);\r\n}\r\n\r\n/**\r\n * 检测是否白屏\r\n */\r\nfunction detectWhiteScreen(): boolean {\r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n \r\n let emptyPoints = 0;\r\n\r\n for (const point of SAMPLE_POINTS) {\r\n const x = viewportWidth * point.x;\r\n const y = viewportHeight * point.y;\r\n \r\n const element = document.elementFromPoint(x, y);\r\n \r\n if (!element || isInvalidElement(element)) {\r\n emptyPoints++;\r\n }\r\n }\r\n\r\n // 如果超过 80% 的采样点是空的,认为是白屏\r\n return emptyPoints / SAMPLE_POINTS.length > 0.8;\r\n}\r\n\r\n/**\r\n * 判断是否为无效元素\r\n */\r\nfunction isInvalidElement(element: Element): boolean {\r\n const tagName = element.tagName.toLowerCase();\r\n return INVALID_ELEMENTS.includes(tagName);\r\n}\r\n\r\n/**\r\n * 上报白屏错误\r\n */\r\nfunction reportWhiteScreen(): void {\r\n const errorData: Omit<ErrorData, 'appId' | 'userId' | 'sessionId' | 'pageUrl' | 'timestamp' | 'userAgent' | 'sdkVersion' | 'breadcrumbs'> = {\r\n type: 'white_screen',\r\n message: 'White screen detected',\r\n };\r\n\r\n reporter.reportError(errorData);\r\n}\r\n","/**\r\n * 错误监控插件入口\r\n */\r\nimport { installJsErrorHandler } from './jsError';\r\nimport { installPromiseErrorHandler } from './promiseError';\r\nimport { installResourceErrorHandler } from './resourceError';\r\nimport { installHttpErrorHandler } from './httpError';\r\nimport { installWhiteScreenDetector } from './whiteScreen';\r\n\r\n/**\r\n * 安装所有错误监控\r\n */\r\nexport function installErrorHandlers(): void {\r\n installJsErrorHandler();\r\n installPromiseErrorHandler();\r\n installResourceErrorHandler();\r\n installHttpErrorHandler();\r\n installWhiteScreenDetector();\r\n}\r\n\r\nexport {\r\n installJsErrorHandler,\r\n installPromiseErrorHandler,\r\n installResourceErrorHandler,\r\n installHttpErrorHandler,\r\n installWhiteScreenDetector,\r\n};\r\n","/**\r\n * Web Vitals 性能指标采集插件\r\n * 采集 FP, FCP, LCP, FID, CLS, TTFB 等核心指标\r\n */\r\nimport { config } from '../../core/config';\r\nimport { reporter } from '../../reporter';\r\nimport type { PerformanceMetrics } from '../../types';\r\n\r\n/**\r\n * 安装 Web Vitals 采集\r\n */\r\nexport function installWebVitals(): void {\r\n const cfg = config.get();\r\n \r\n if (!cfg.performance?.enabled || !cfg.performance?.webVitals) {\r\n return;\r\n }\r\n\r\n // 页面加载完成后采集\r\n if (document.readyState === 'complete') {\r\n collectMetrics();\r\n } else {\r\n window.addEventListener('load', () => {\r\n // 延迟采集,确保 LCP 等指标稳定\r\n setTimeout(collectMetrics, 3000);\r\n });\r\n }\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] Web Vitals collector installed');\r\n }\r\n}\r\n\r\n/**\r\n * 采集性能指标\r\n */\r\nfunction collectMetrics(): void {\r\n const metrics: PerformanceMetrics = {};\r\n\r\n // 使用 Performance API\r\n if (!window.performance) {\r\n return;\r\n }\r\n\r\n // 获取导航计时\r\n const navigation = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming;\r\n if (navigation) {\r\n metrics.ttfb = navigation.responseStart - navigation.requestStart;\r\n metrics.domReady = navigation.domContentLoadedEventEnd - navigation.startTime;\r\n metrics.loadComplete = navigation.loadEventEnd - navigation.startTime;\r\n }\r\n\r\n // 获取 FP 和 FCP\r\n const paintEntries = performance.getEntriesByType('paint');\r\n for (const entry of paintEntries) {\r\n if (entry.name === 'first-paint') {\r\n metrics.fp = entry.startTime;\r\n }\r\n if (entry.name === 'first-contentful-paint') {\r\n metrics.fcp = entry.startTime;\r\n }\r\n }\r\n\r\n // 获取 LCP\r\n collectLCP(metrics);\r\n \r\n // 获取 FID\r\n collectFID(metrics);\r\n \r\n // 获取 CLS\r\n collectCLS(metrics);\r\n\r\n // 上报性能数据\r\n reporter.reportPerformance({\r\n type: 'performance',\r\n metrics,\r\n });\r\n}\r\n\r\n/**\r\n * 采集 LCP (Largest Contentful Paint)\r\n */\r\nfunction collectLCP(metrics: PerformanceMetrics): void {\r\n if (!('PerformanceObserver' in window)) return;\r\n\r\n try {\r\n const observer = new PerformanceObserver((list) => {\r\n const entries = list.getEntries();\r\n const lastEntry = entries[entries.length - 1] as PerformanceEntry;\r\n if (lastEntry) {\r\n metrics.lcp = lastEntry.startTime;\r\n }\r\n });\r\n\r\n observer.observe({ type: 'largest-contentful-paint', buffered: true });\r\n } catch (e) {\r\n // 浏览器不支持\r\n }\r\n}\r\n\r\n/**\r\n * 采集 FID (First Input Delay)\r\n */\r\nfunction collectFID(metrics: PerformanceMetrics): void {\r\n if (!('PerformanceObserver' in window)) return;\r\n\r\n try {\r\n const observer = new PerformanceObserver((list) => {\r\n const entries = list.getEntries() as PerformanceEventTiming[];\r\n const firstEntry = entries[0];\r\n if (firstEntry) {\r\n metrics.fid = firstEntry.processingStart - firstEntry.startTime;\r\n }\r\n });\r\n\r\n observer.observe({ type: 'first-input', buffered: true });\r\n } catch (e) {\r\n // 浏览器不支持\r\n }\r\n}\r\n\r\n/**\r\n * 采集 CLS (Cumulative Layout Shift)\r\n */\r\nfunction collectCLS(metrics: PerformanceMetrics): void {\r\n if (!('PerformanceObserver' in window)) return;\r\n\r\n let clsValue = 0;\r\n\r\n try {\r\n const observer = new PerformanceObserver((list) => {\r\n const entries = list.getEntries() as any[];\r\n for (const entry of entries) {\r\n if (!entry.hadRecentInput) {\r\n clsValue += entry.value;\r\n }\r\n }\r\n metrics.cls = clsValue;\r\n });\r\n\r\n observer.observe({ type: 'layout-shift', buffered: true });\r\n } catch (e) {\r\n // 浏览器不支持\r\n }\r\n}\r\n","/**\r\n * 性能监控插件入口\r\n */\r\nimport { installWebVitals } from './webVitals';\r\n\r\n/**\r\n * 安装性能监控\r\n */\r\nexport function installPerformanceMonitor(): void {\r\n installWebVitals();\r\n}\r\n\r\nexport {\r\n installWebVitals,\r\n};\r\n","/**\r\n * PV (Page View) 统计插件\r\n */\r\nimport { config } from '../../core/config';\r\nimport { reporter } from '../../reporter';\r\nimport { getPageTitle, getReferrer } from '../../utils/browser';\r\n\r\n/**\r\n * 安装 PV 统计\r\n */\r\nexport function installPVTracker(): void {\r\n const cfg = config.get();\r\n \r\n if (!cfg.behavior?.enabled || !cfg.behavior?.pv) {\r\n return;\r\n }\r\n\r\n // 页面加载时上报\r\n reportPV();\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] PV tracker installed');\r\n }\r\n}\r\n\r\n/**\r\n * 上报 PV\r\n */\r\nfunction reportPV(): void {\r\n reporter.reportBehavior({\r\n type: 'behavior',\r\n action: 'pv',\r\n data: {\r\n title: getPageTitle(),\r\n referrer: getReferrer(),\r\n },\r\n });\r\n}\r\n","/**\r\n * 点击事件追踪插件\r\n */\r\nimport { config } from '../../core/config';\r\nimport { context } from '../../core/context';\r\nimport { reporter } from '../../reporter';\r\n\r\n/**\r\n * 安装点击追踪\r\n */\r\nexport function installClickTracker(): void {\r\n const cfg = config.get();\r\n \r\n if (!cfg.behavior?.enabled || !cfg.behavior?.click) {\r\n return;\r\n }\r\n\r\n document.addEventListener('click', (event: MouseEvent) => {\r\n const target = event.target as HTMLElement;\r\n if (!target) return;\r\n\r\n const clickData = extractClickData(target, event);\r\n\r\n // 添加到面包屑\r\n context.addBreadcrumb({\r\n type: 'click',\r\n category: 'ui.click',\r\n data: clickData,\r\n });\r\n\r\n // 可选:上报点击事件(一般只记录面包屑,不单独上报)\r\n // reporter.reportBehavior({\r\n // type: 'behavior',\r\n // action: 'click',\r\n // data: clickData,\r\n // });\r\n }, true);\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] Click tracker installed');\r\n }\r\n}\r\n\r\n/**\r\n * 提取点击数据\r\n */\r\nfunction extractClickData(element: HTMLElement, event: MouseEvent): Record<string, any> {\r\n const tagName = element.tagName.toLowerCase();\r\n const rect = element.getBoundingClientRect();\r\n \r\n return {\r\n tagName,\r\n id: element.id || undefined,\r\n className: element.className || undefined,\r\n text: getElementText(element),\r\n path: getElementPath(element),\r\n // 鼠标坐标\r\n x: event.clientX,\r\n y: event.clientY,\r\n // 元素位置和尺寸\r\n rect: {\r\n top: Math.round(rect.top),\r\n left: Math.round(rect.left),\r\n width: Math.round(rect.width),\r\n height: Math.round(rect.height),\r\n },\r\n // 额外属性\r\n href: (element as HTMLAnchorElement).href || undefined,\r\n name: (element as HTMLInputElement).name || undefined,\r\n type: (element as HTMLInputElement).type || undefined,\r\n };\r\n}\r\n\r\n\r\n/**\r\n * 获取元素文本(限制长度)\r\n */\r\nfunction getElementText(element: HTMLElement): string {\r\n const text = element.innerText || element.textContent || '';\r\n return text.trim().substring(0, 50);\r\n}\r\n\r\n/**\r\n * 获取元素路径\r\n */\r\nfunction getElementPath(element: HTMLElement): string {\r\n const path: string[] = [];\r\n let current: HTMLElement | null = element;\r\n \r\n while (current && path.length < 5) {\r\n let selector = current.tagName.toLowerCase();\r\n \r\n if (current.id) {\r\n selector += `#${current.id}`;\r\n } else if (current.className) {\r\n const classes = current.className.split(' ').filter(Boolean).slice(0, 2);\r\n if (classes.length) {\r\n selector += `.${classes.join('.')}`;\r\n }\r\n }\r\n \r\n path.unshift(selector);\r\n current = current.parentElement;\r\n }\r\n \r\n return path.join(' > ');\r\n}\r\n","/**\r\n * 路由变化监控插件\r\n * 支持 History API 和 Hash 路由\r\n */\r\nimport { config } from '../../core/config';\r\nimport { context } from '../../core/context';\r\nimport { reporter } from '../../reporter';\r\nimport { getPageUrl, getPageTitle } from '../../utils/browser';\r\n\r\n// 保存原始方法\r\nconst originalPushState = history.pushState;\r\nconst originalReplaceState = history.replaceState;\r\n\r\n/**\r\n * 安装路由监控\r\n */\r\nexport function installRouteTracker(): void {\r\n const cfg = config.get();\r\n \r\n if (!cfg.behavior?.enabled || !cfg.behavior?.route) {\r\n return;\r\n }\r\n\r\n // 拦截 pushState\r\n history.pushState = function (...args) {\r\n const result = originalPushState.apply(this, args);\r\n handleRouteChange('pushState');\r\n return result;\r\n };\r\n\r\n // 拦截 replaceState\r\n history.replaceState = function (...args) {\r\n const result = originalReplaceState.apply(this, args);\r\n handleRouteChange('replaceState');\r\n return result;\r\n };\r\n\r\n // 监听 popstate(浏览器前进后退)\r\n window.addEventListener('popstate', () => {\r\n handleRouteChange('popstate');\r\n });\r\n\r\n // 监听 hashchange\r\n window.addEventListener('hashchange', () => {\r\n handleRouteChange('hashchange');\r\n });\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] Route tracker installed');\r\n }\r\n}\r\n\r\n/**\r\n * 处理路由变化\r\n */\r\nfunction handleRouteChange(trigger: string): void {\r\n const routeData = {\r\n url: getPageUrl(),\r\n title: getPageTitle(),\r\n trigger,\r\n };\r\n\r\n // 添加到面包屑\r\n context.addBreadcrumb({\r\n type: 'route',\r\n category: 'navigation',\r\n data: routeData,\r\n });\r\n\r\n // 上报路由变化\r\n reporter.reportBehavior({\r\n type: 'behavior',\r\n action: 'route',\r\n data: routeData,\r\n });\r\n}\r\n","/**\r\n * 控制台日志追踪插件\r\n * 追踪 console.log/warn/error/info 调用\r\n */\r\nimport { config } from '../../core/config';\r\nimport { context } from '../../core/context';\r\n\r\ntype ConsoleLevel = 'log' | 'info' | 'warn' | 'error';\r\n\r\n// 保存原始方法\r\nconst originalConsole = {\r\n log: console.log,\r\n info: console.info,\r\n warn: console.warn,\r\n error: console.error,\r\n};\r\n\r\n/**\r\n * 安装控制台追踪\r\n */\r\nexport function installConsoleTracker(): void {\r\n const cfg = config.get();\r\n \r\n // 默认启用控制台追踪(跟随 behavior.enabled)\r\n if (!cfg.behavior?.enabled) {\r\n return;\r\n }\r\n\r\n const levels: ConsoleLevel[] = ['log', 'info', 'warn', 'error'];\r\n \r\n levels.forEach((level) => {\r\n console[level] = function (...args: any[]) {\r\n // 调用原始方法\r\n originalConsole[level].apply(console, args);\r\n \r\n // 添加到面包屑(只记录 warn 和 error)\r\n if (level === 'warn' || level === 'error') {\r\n const message = formatConsoleArgs(args);\r\n \r\n context.addBreadcrumb({\r\n type: 'console',\r\n category: `console.${level}`,\r\n data: {\r\n level,\r\n message: message.substring(0, 200), // 限制长度\r\n },\r\n });\r\n }\r\n };\r\n });\r\n\r\n if (cfg.debug) {\r\n originalConsole.log('[Monitor] Console tracker installed');\r\n }\r\n}\r\n\r\n/**\r\n * 格式化控制台参数\r\n */\r\nfunction formatConsoleArgs(args: any[]): string {\r\n return args\r\n .map((arg) => {\r\n if (typeof arg === 'string') {\r\n return arg;\r\n }\r\n if (arg instanceof Error) {\r\n return arg.message;\r\n }\r\n try {\r\n return JSON.stringify(arg);\r\n } catch {\r\n return String(arg);\r\n }\r\n })\r\n .join(' ');\r\n}\r\n","/**\r\n * 输入事件追踪插件\r\n * 追踪表单输入、焦点变化等\r\n */\r\nimport { config } from '../../core/config';\r\nimport { context } from '../../core/context';\r\n\r\n/**\r\n * 安装输入追踪\r\n */\r\nexport function installInputTracker(): void {\r\n const cfg = config.get();\r\n \r\n // 默认启用输入追踪(跟随 behavior.enabled)\r\n if (!cfg.behavior?.enabled) {\r\n return;\r\n }\r\n\r\n // 监听 input 事件(使用 change 事件减少数据量)\r\n document.addEventListener('change', handleInputChange, true);\r\n \r\n // 监听焦点事件\r\n document.addEventListener('focus', handleFocus, true);\r\n document.addEventListener('blur', handleBlur, true);\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] Input tracker installed');\r\n }\r\n}\r\n\r\n/**\r\n * 处理输入变化\r\n */\r\nfunction handleInputChange(event: Event): void {\r\n const target = event.target as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\r\n if (!target || !isFormElement(target)) return;\r\n\r\n const inputData = extractInputData(target, 'change');\r\n \r\n context.addBreadcrumb({\r\n type: 'input',\r\n category: 'ui.input',\r\n data: inputData,\r\n });\r\n}\r\n\r\n/**\r\n * 处理焦点获取\r\n */\r\nfunction handleFocus(event: FocusEvent): void {\r\n const target = event.target as HTMLElement;\r\n if (!target || !isFormElement(target)) return;\r\n\r\n context.addBreadcrumb({\r\n type: 'input',\r\n category: 'ui.focus',\r\n data: extractInputData(target as HTMLInputElement, 'focus'),\r\n });\r\n}\r\n\r\n/**\r\n * 处理焦点失去\r\n */\r\nfunction handleBlur(event: FocusEvent): void {\r\n const target = event.target as HTMLElement;\r\n if (!target || !isFormElement(target)) return;\r\n\r\n context.addBreadcrumb({\r\n type: 'input',\r\n category: 'ui.blur',\r\n data: extractInputData(target as HTMLInputElement, 'blur'),\r\n });\r\n}\r\n\r\n/**\r\n * 判断是否是表单元素\r\n */\r\nfunction isFormElement(element: HTMLElement): boolean {\r\n const tagName = element.tagName.toLowerCase();\r\n return ['input', 'textarea', 'select'].includes(tagName);\r\n}\r\n\r\n/**\r\n * 提取输入数据(脱敏处理)\r\n */\r\nfunction extractInputData(\r\n element: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement,\r\n action: string\r\n): Record<string, any> {\r\n const tagName = element.tagName.toLowerCase();\r\n const inputType = (element as HTMLInputElement).type || 'text';\r\n \r\n // 敏感类型不记录值\r\n const sensitiveTypes = ['password', 'credit-card', 'cvv'];\r\n const isSensitive = sensitiveTypes.includes(inputType) || \r\n element.name?.toLowerCase().includes('password') ||\r\n element.name?.toLowerCase().includes('secret');\r\n\r\n return {\r\n action,\r\n tagName,\r\n name: element.name || undefined,\r\n id: element.id || undefined,\r\n type: inputType,\r\n // 脱敏:敏感字段不记录值,其他字段只记录长度\r\n valueLength: element.value?.length || 0,\r\n hasValue: !!element.value,\r\n placeholder: (element as HTMLInputElement).placeholder || undefined,\r\n };\r\n}\r\n","/**\r\n * 行为监控插件入口\r\n */\r\nimport { installPVTracker } from './pv';\r\nimport { installClickTracker } from './click';\r\nimport { installRouteTracker } from './route';\r\nimport { installConsoleTracker } from './console';\r\nimport { installInputTracker } from './input';\r\n\r\n/**\r\n * 安装行为监控\r\n */\r\nexport function installBehaviorMonitor(): void {\r\n installPVTracker();\r\n installClickTracker();\r\n installRouteTracker();\r\n installConsoleTracker();\r\n installInputTracker();\r\n}\r\n\r\nexport {\r\n installPVTracker,\r\n installClickTracker,\r\n installRouteTracker,\r\n installConsoleTracker,\r\n installInputTracker,\r\n};\r\n","/**\r\n * 前端监控 SDK\r\n * @description 错误监控、性能监控、行为监控\r\n */\r\nimport { config } from './core/config';\r\nimport { context } from './core/context';\r\nimport { reporter } from './reporter';\r\nimport { installErrorHandlers } from './plugins/error';\r\nimport { installPerformanceMonitor } from './plugins/performance';\r\nimport { installBehaviorMonitor } from './plugins/behavior';\r\nimport type { MonitorConfig, UserInfo, BreadCrumb, ErrorData, PerformanceData, BehaviorData } from './types';\r\n\r\n// SDK 版本\r\nconst SDK_VERSION = '1.0.0';\r\n\r\n/**\r\n * 监控 SDK 主类\r\n */\r\nclass MonitorSDK {\r\n private initialized = false;\r\n\r\n /**\r\n * 初始化 SDK\r\n */\r\n init(userConfig: MonitorConfig): void {\r\n if (this.initialized) {\r\n console.warn('[Monitor] SDK already initialized');\r\n return;\r\n }\r\n\r\n // 初始化配置\r\n config.init({\r\n ...userConfig,\r\n version: userConfig.version || SDK_VERSION,\r\n });\r\n\r\n // 初始化上下文\r\n const maxBreadcrumbs = config.get().behavior?.maxBreadcrumbs || 20;\r\n context.init(maxBreadcrumbs);\r\n\r\n this.initialized = true;\r\n\r\n if (config.get().debug) {\r\n console.log('[Monitor] SDK initialized', config.get());\r\n }\r\n\r\n // 安装监控模块\r\n installErrorHandlers();\r\n installPerformanceMonitor();\r\n installBehaviorMonitor();\r\n }\r\n\r\n /**\r\n * 设置用户信息\r\n */\r\n setUser(user: UserInfo): void {\r\n this.checkInit();\r\n config.setUser(user);\r\n }\r\n\r\n /**\r\n * 手动上报错误\r\n */\r\n captureError(error: Error | string, extra?: Record<string, any>): void {\r\n this.checkInit();\r\n\r\n const errorData: Omit<ErrorData, 'appId' | 'userId' | 'sessionId' | 'pageUrl' | 'timestamp' | 'userAgent' | 'sdkVersion'> = {\r\n type: 'js_error',\r\n message: typeof error === 'string' ? error : error.message,\r\n stack: typeof error === 'string' ? undefined : error.stack,\r\n ...extra,\r\n };\r\n\r\n reporter.reportError(errorData);\r\n }\r\n\r\n /**\r\n * 手动上报性能数据\r\n */\r\n capturePerformance(metrics: PerformanceData['metrics']): void {\r\n this.checkInit();\r\n\r\n reporter.reportPerformance({\r\n type: 'performance',\r\n metrics,\r\n });\r\n }\r\n\r\n /**\r\n * 手动上报行为数据\r\n */\r\n captureBehavior(action: BehaviorData['action'], data: Record<string, any>): void {\r\n this.checkInit();\r\n\r\n reporter.reportBehavior({\r\n type: 'behavior',\r\n action,\r\n data,\r\n });\r\n }\r\n\r\n /**\r\n * 添加面包屑\r\n */\r\n addBreadcrumb(crumb: Omit<BreadCrumb, 'timestamp'>): void {\r\n this.checkInit();\r\n context.addBreadcrumb(crumb);\r\n }\r\n\r\n /**\r\n * 立即发送缓冲区数据\r\n */\r\n flush(): void {\r\n this.checkInit();\r\n reporter.flush();\r\n }\r\n\r\n /**\r\n * 获取 SDK 版本\r\n */\r\n getVersion(): string {\r\n return SDK_VERSION;\r\n }\r\n\r\n /**\r\n * 检查是否已初始化\r\n */\r\n private checkInit(): void {\r\n if (!this.initialized) {\r\n throw new Error('[Monitor] SDK not initialized. Please call init() first.');\r\n }\r\n }\r\n}\r\n\r\n// 导出单例\r\nexport const monitor = new MonitorSDK();\r\n\r\n// 导出类型\r\nexport type {\r\n MonitorConfig,\r\n UserInfo,\r\n BreadCrumb,\r\n ErrorData,\r\n PerformanceData,\r\n BehaviorData,\r\n} from './types';\r\n\r\n// 默认导出\r\nexport default monitor;\r\n"],"names":["SDK_VERSION"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/core/config.ts","../src/core/context.ts","../src/utils/browser.ts","../src/reporter/sender.ts","../src/reporter/index.ts","../src/plugins/error/jsError.ts","../src/plugins/error/promiseError.ts","../src/plugins/error/resourceError.ts","../src/plugins/error/httpError.ts","../src/plugins/error/whiteScreen.ts","../src/plugins/error/index.ts","../src/plugins/performance/webVitals.ts","../src/plugins/performance/index.ts","../src/plugins/behavior/pv.ts","../src/plugins/behavior/click.ts","../src/plugins/behavior/route.ts","../src/plugins/behavior/console.ts","../src/plugins/behavior/input.ts","../src/plugins/behavior/index.ts","../src/index.ts"],"sourcesContent":["/**\r\n * SDK 配置管理\r\n */\r\nimport type { MonitorConfig, SamplingConfig, ReportConfig } from '../types';\r\n\r\n/**\r\n * 默认配置\r\n */\r\nconst DEFAULT_CONFIG: Partial<MonitorConfig> = {\r\n debug: false,\r\n sampling: {\r\n error: 1,\r\n performance: 1,\r\n behavior: 1,\r\n },\r\n report: {\r\n maxBufferSize: 10,\r\n flushInterval: 5000,\r\n timeout: 10000,\r\n },\r\n error: {\r\n enabled: true,\r\n jsError: true,\r\n promiseError: true,\r\n resourceError: true,\r\n httpError: true,\r\n },\r\n performance: {\r\n enabled: true,\r\n webVitals: true,\r\n resource: true,\r\n api: true,\r\n },\r\n behavior: {\r\n enabled: true,\r\n pv: true,\r\n click: true,\r\n route: true,\r\n maxBreadcrumbs: 20,\r\n },\r\n};\r\n\r\n/**\r\n * 配置管理类\r\n */\r\nclass ConfigManager {\r\n private config: MonitorConfig | null = null;\r\n\r\n /**\r\n * 初始化配置\r\n */\r\n init(userConfig: MonitorConfig): void {\r\n if (!userConfig.appId) {\r\n throw new Error('[Monitor] appId is required');\r\n }\r\n if (!userConfig.dsn) {\r\n throw new Error('[Monitor] dsn is required');\r\n }\r\n\r\n this.config = this.mergeConfig(DEFAULT_CONFIG, userConfig);\r\n }\r\n\r\n /**\r\n * 获取配置\r\n */\r\n get(): MonitorConfig {\r\n if (!this.config) {\r\n throw new Error('[Monitor] SDK not initialized. Please call init() first.');\r\n }\r\n return this.config;\r\n }\r\n\r\n /**\r\n * 更新配置\r\n */\r\n update(partialConfig: Partial<MonitorConfig>): void {\r\n if (!this.config) {\r\n throw new Error('[Monitor] SDK not initialized. Please call init() first.');\r\n }\r\n this.config = this.mergeConfig(this.config, partialConfig);\r\n }\r\n\r\n /**\r\n * 设置用户信息\r\n */\r\n setUser(user: MonitorConfig['user']): void {\r\n if (this.config) {\r\n this.config.user = { ...this.config.user, ...user };\r\n }\r\n }\r\n\r\n /**\r\n * 是否已初始化\r\n */\r\n isInitialized(): boolean {\r\n return this.config !== null;\r\n }\r\n\r\n /**\r\n * 合并配置\r\n */\r\n private mergeConfig<T extends object>(defaultConfig: T, userConfig: Partial<T>): T {\r\n const result = { ...defaultConfig } as T;\r\n \r\n for (const key in userConfig) {\r\n if (Object.prototype.hasOwnProperty.call(userConfig, key)) {\r\n const userValue = userConfig[key];\r\n const defaultValue = (defaultConfig as any)[key];\r\n\r\n if (\r\n userValue !== null &&\r\n typeof userValue === 'object' &&\r\n !Array.isArray(userValue) &&\r\n defaultValue !== null &&\r\n typeof defaultValue === 'object' &&\r\n !Array.isArray(defaultValue)\r\n ) {\r\n (result as any)[key] = this.mergeConfig(defaultValue, userValue);\r\n } else {\r\n (result as any)[key] = userValue;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport const config = new ConfigManager();\r\n","/**\r\n * SDK 上下文管理\r\n * 管理会话 ID、设备信息等全局状态\r\n */\r\nimport type { DeviceInfo, BreadCrumb } from '../types';\r\n\r\n/**\r\n * 上下文管理类\r\n */\r\nclass ContextManager {\r\n private sessionId: string = '';\r\n private deviceInfo: DeviceInfo | null = null;\r\n private breadcrumbs: BreadCrumb[] = [];\r\n private maxBreadcrumbs: number = 20;\r\n\r\n /**\r\n * 初始化上下文\r\n */\r\n init(maxBreadcrumbs: number = 20): void {\r\n this.sessionId = this.generateSessionId();\r\n this.deviceInfo = this.collectDeviceInfo();\r\n this.maxBreadcrumbs = maxBreadcrumbs;\r\n this.breadcrumbs = [];\r\n }\r\n\r\n /**\r\n * 获取会话 ID\r\n */\r\n getSessionId(): string {\r\n return this.sessionId;\r\n }\r\n\r\n /**\r\n * 获取设备信息\r\n */\r\n getDeviceInfo(): DeviceInfo | null {\r\n return this.deviceInfo;\r\n }\r\n\r\n /**\r\n * 添加面包屑\r\n */\r\n addBreadcrumb(crumb: Omit<BreadCrumb, 'timestamp'>): void {\r\n const breadcrumb: BreadCrumb = {\r\n ...crumb,\r\n timestamp: Date.now(),\r\n };\r\n\r\n this.breadcrumbs.push(breadcrumb);\r\n\r\n // 限制数量\r\n if (this.breadcrumbs.length > this.maxBreadcrumbs) {\r\n this.breadcrumbs.shift();\r\n }\r\n }\r\n\r\n /**\r\n * 获取所有面包屑\r\n */\r\n getBreadcrumbs(): BreadCrumb[] {\r\n return [...this.breadcrumbs];\r\n }\r\n\r\n /**\r\n * 清空面包屑\r\n */\r\n clearBreadcrumbs(): void {\r\n this.breadcrumbs = [];\r\n }\r\n\r\n /**\r\n * 生成会话 ID\r\n */\r\n private generateSessionId(): string {\r\n const timestamp = Date.now().toString(36);\r\n const randomPart = Math.random().toString(36).substring(2, 10);\r\n return `${timestamp}-${randomPart}`;\r\n }\r\n\r\n /**\r\n * 收集设备信息\r\n */\r\n private collectDeviceInfo(): DeviceInfo {\r\n return {\r\n screenWidth: window.screen.width,\r\n screenHeight: window.screen.height,\r\n viewportWidth: window.innerWidth,\r\n viewportHeight: window.innerHeight,\r\n devicePixelRatio: window.devicePixelRatio || 1,\r\n language: navigator.language,\r\n platform: navigator.platform,\r\n };\r\n }\r\n}\r\n\r\nexport const context = new ContextManager();\r\n","/**\r\n * 浏览器信息工具\r\n */\r\n\r\n/**\r\n * 获取浏览器 User-Agent\r\n */\r\nexport function getUserAgent(): string {\r\n return navigator.userAgent;\r\n}\r\n\r\n/**\r\n * 获取当前页面 URL\r\n */\r\nexport function getPageUrl(): string {\r\n return window.location.href;\r\n}\r\n\r\n/**\r\n * 获取页面来源\r\n */\r\nexport function getReferrer(): string {\r\n return document.referrer;\r\n}\r\n\r\n/**\r\n * 获取页面标题\r\n */\r\nexport function getPageTitle(): string {\r\n return document.title;\r\n}\r\n\r\n/**\r\n * 检查是否为同源\r\n */\r\nexport function isSameOrigin(url: string): boolean {\r\n try {\r\n const urlObj = new URL(url, window.location.origin);\r\n return urlObj.origin === window.location.origin;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * 判断是否支持 sendBeacon\r\n */\r\nexport function supportsSendBeacon(): boolean {\r\n return typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function';\r\n}\r\n\r\n/**\r\n * 判断页面是否即将卸载\r\n */\r\nexport function isPageHidden(): boolean {\r\n return document.visibilityState === 'hidden';\r\n}\r\n","/**\r\n * 数据发送器\r\n */\r\nimport { config } from '../core/config';\r\nimport { supportsSendBeacon, isPageHidden } from '../utils/browser';\r\nimport type { ReportData } from '../types';\r\n\r\n/**\r\n * 发送器类\r\n */\r\nclass Sender {\r\n private buffer: ReportData[] = [];\r\n private timer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n /**\r\n * 发送单条数据\r\n */\r\n send(data: ReportData): void {\r\n const cfg = config.get();\r\n \r\n // 添加到缓冲区\r\n this.buffer.push(data);\r\n\r\n // 达到缓冲上限,立即发送\r\n if (this.buffer.length >= (cfg.report?.maxBufferSize || 10)) {\r\n this.flush();\r\n return;\r\n }\r\n\r\n // 启动定时器\r\n this.scheduleFlush();\r\n }\r\n\r\n /**\r\n * 立即发送所有缓冲数据\r\n */\r\n flush(): void {\r\n if (this.buffer.length === 0) return;\r\n\r\n const data = [...this.buffer];\r\n this.buffer = [];\r\n this.clearTimer();\r\n\r\n this.doSend(data);\r\n }\r\n\r\n /**\r\n * 执行发送\r\n * 策略:优先使用 sendBeacon(更可靠),不支持或失败时降级为 fetch\r\n */\r\n private doSend(data: ReportData[]): void {\r\n const cfg = config.get();\r\n const dsn = cfg.dsn;\r\n\r\n const payload = JSON.stringify(data);\r\n\r\n // 优先使用 sendBeacon(更可靠、异步、不阻塞页面)\r\n if (supportsSendBeacon()) {\r\n const success = this.sendByBeacon(dsn, payload);\r\n if (success) {\r\n return;\r\n }\r\n // sendBeacon 失败,降级到 fetch\r\n }\r\n\r\n // 不支持 sendBeacon 或 sendBeacon 失败时,使用 fetch\r\n this.sendByFetch(dsn, payload);\r\n }\r\n\r\n /**\r\n * 使用 sendBeacon 发送\r\n * 返回 true 表示成功加入队列,false 表示失败需要降级\r\n */\r\n private sendByBeacon(url: string, payload: string): boolean {\r\n try {\r\n const success = navigator.sendBeacon(url, payload);\r\n if (!success && config.get().debug) {\r\n console.warn('[Monitor] sendBeacon returned false, falling back to fetch');\r\n }\r\n return success;\r\n } catch (e) {\r\n if (config.get().debug) {\r\n console.error('[Monitor] sendBeacon failed:', e);\r\n }\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * 使用 fetch 发送\r\n */\r\n private sendByFetch(url: string, payload: string): void {\r\n const cfg = config.get();\r\n\r\n fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: payload,\r\n keepalive: true,\r\n }).catch((e) => {\r\n if (cfg.debug) {\r\n console.error('[Monitor] fetch failed:', e);\r\n }\r\n // 发送失败,将数据放回缓冲区(可选)\r\n // this.buffer.unshift(...JSON.parse(payload));\r\n });\r\n }\r\n\r\n /**\r\n * 调度延迟发送\r\n */\r\n private scheduleFlush(): void {\r\n if (this.timer) return;\r\n\r\n const cfg = config.get();\r\n const interval = cfg.report?.flushInterval || 5000;\r\n\r\n this.timer = setTimeout(() => {\r\n this.flush();\r\n }, interval);\r\n }\r\n\r\n /**\r\n * 清除定时器\r\n */\r\n private clearTimer(): void {\r\n if (this.timer) {\r\n clearTimeout(this.timer);\r\n this.timer = null;\r\n }\r\n }\r\n}\r\n\r\nexport const sender = new Sender();\r\n\r\n// 页面卸载时发送剩余数据\r\nif (typeof window !== 'undefined') {\r\n window.addEventListener('beforeunload', () => {\r\n sender.flush();\r\n });\r\n\r\n window.addEventListener('visibilitychange', () => {\r\n if (document.visibilityState === 'hidden') {\r\n sender.flush();\r\n }\r\n });\r\n}\r\n","/**\r\n * 数据上报管理\r\n */\r\nimport { config } from '../core/config';\r\nimport { context } from '../core/context';\r\nimport { sender } from './sender';\r\nimport { getPageUrl, getUserAgent } from '../utils/browser';\r\nimport type { BaseData, ErrorData, PerformanceData, BehaviorData, ReportData } from '../types';\r\n\r\n// SDK 版本\r\nconst SDK_VERSION = '1.0.0';\r\n\r\n/**\r\n * 上报器类\r\n */\r\nclass Reporter {\r\n /**\r\n * 构建基础数据\r\n */\r\n private buildBaseData(): BaseData {\r\n const cfg = config.get();\r\n \r\n return {\r\n appId: cfg.appId,\r\n userId: cfg.user?.userId,\r\n sessionId: context.getSessionId(),\r\n pageUrl: getPageUrl(),\r\n timestamp: Date.now(),\r\n userAgent: getUserAgent(),\r\n sdkVersion: cfg.version || SDK_VERSION,\r\n };\r\n }\r\n\r\n /**\r\n * 采样判断\r\n */\r\n private shouldSample(type: 'error' | 'performance' | 'behavior'): boolean {\r\n const cfg = config.get();\r\n const rate = cfg.sampling?.[type] ?? 1;\r\n return Math.random() < rate;\r\n }\r\n\r\n /**\r\n * 上报错误\r\n */\r\n reportError(data: Omit<ErrorData, keyof BaseData>): void {\r\n if (!this.shouldSample('error')) return;\r\n\r\n const cfg = config.get();\r\n \r\n // 过滤\r\n if (cfg.error?.filter) {\r\n const fullData = { ...this.buildBaseData(), ...data } as ErrorData;\r\n if (!cfg.error.filter(fullData)) return;\r\n }\r\n\r\n const reportData: ErrorData = {\r\n ...this.buildBaseData(),\r\n ...data,\r\n breadcrumbs: context.getBreadcrumbs(),\r\n deviceInfo: context.getDeviceInfo() || undefined,\r\n };\r\n\r\n this.send(reportData);\r\n }\r\n\r\n /**\r\n * 上报性能\r\n */\r\n reportPerformance(data: Omit<PerformanceData, keyof BaseData>): void {\r\n if (!this.shouldSample('performance')) return;\r\n\r\n const reportData: PerformanceData = {\r\n ...this.buildBaseData(),\r\n ...data,\r\n };\r\n\r\n this.send(reportData);\r\n }\r\n\r\n /**\r\n * 上报行为\r\n */\r\n reportBehavior(data: Omit<BehaviorData, keyof BaseData>): void {\r\n if (!this.shouldSample('behavior')) return;\r\n\r\n const reportData: BehaviorData = {\r\n ...this.buildBaseData(),\r\n ...data,\r\n };\r\n\r\n this.send(reportData);\r\n }\r\n\r\n /**\r\n * 通用发送\r\n */\r\n private send(data: ReportData): void {\r\n const cfg = config.get();\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] Report:', data);\r\n }\r\n\r\n sender.send(data);\r\n }\r\n\r\n /**\r\n * 立即发送缓冲区数据\r\n */\r\n flush(): void {\r\n sender.flush();\r\n }\r\n}\r\n\r\nexport const reporter = new Reporter();\r\n","/**\r\n * JS 运行时错误捕获插件\r\n */\r\nimport { config } from '../../core/config';\r\nimport { context } from '../../core/context';\r\nimport { reporter } from '../../reporter';\r\nimport type { ErrorData } from '../../types';\r\n\r\n/**\r\n * 安装 JS 错误监听\r\n */\r\nexport function installJsErrorHandler(): void {\r\n const cfg = config.get();\r\n \r\n if (!cfg.error?.enabled || !cfg.error?.jsError) {\r\n return;\r\n }\r\n\r\n window.addEventListener('error', (event: ErrorEvent) => {\r\n // 过滤资源加载错误(由 resourceError 处理)\r\n if (event.target !== window) {\r\n return;\r\n }\r\n\r\n const errorData: Omit<ErrorData, 'appId' | 'userId' | 'sessionId' | 'pageUrl' | 'timestamp' | 'userAgent' | 'sdkVersion' | 'breadcrumbs'> = {\r\n type: 'js_error',\r\n message: event.message || 'Unknown error',\r\n stack: event.error?.stack,\r\n filename: event.filename,\r\n lineno: event.lineno,\r\n colno: event.colno,\r\n };\r\n\r\n // 添加到面包屑\r\n context.addBreadcrumb({\r\n type: 'console',\r\n category: 'error',\r\n data: {\r\n message: errorData.message,\r\n filename: errorData.filename,\r\n lineno: errorData.lineno,\r\n },\r\n });\r\n\r\n reporter.reportError(errorData);\r\n }, true);\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] JS error handler installed');\r\n }\r\n}\r\n","/**\r\n * Promise 未捕获错误插件\r\n */\r\nimport { config } from '../../core/config';\r\nimport { context } from '../../core/context';\r\nimport { reporter } from '../../reporter';\r\nimport type { ErrorData } from '../../types';\r\n\r\n/**\r\n * 安装 Promise 错误监听\r\n */\r\nexport function installPromiseErrorHandler(): void {\r\n const cfg = config.get();\r\n \r\n if (!cfg.error?.enabled || !cfg.error?.promiseError) {\r\n return;\r\n }\r\n\r\n window.addEventListener('unhandledrejection', (event: PromiseRejectionEvent) => {\r\n let message = 'Unhandled Promise rejection';\r\n let stack: string | undefined;\r\n\r\n const reason = event.reason;\r\n\r\n if (reason instanceof Error) {\r\n message = reason.message;\r\n stack = reason.stack;\r\n } else if (typeof reason === 'string') {\r\n message = reason;\r\n } else if (reason && typeof reason === 'object') {\r\n message = JSON.stringify(reason);\r\n }\r\n\r\n const errorData: Omit<ErrorData, 'appId' | 'userId' | 'sessionId' | 'pageUrl' | 'timestamp' | 'userAgent' | 'sdkVersion' | 'breadcrumbs'> = {\r\n type: 'promise_error',\r\n message,\r\n stack,\r\n };\r\n\r\n // 添加到面包屑\r\n context.addBreadcrumb({\r\n type: 'console',\r\n category: 'promise_error',\r\n data: {\r\n message: errorData.message,\r\n },\r\n });\r\n\r\n reporter.reportError(errorData);\r\n });\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] Promise error handler installed');\r\n }\r\n}\r\n","/**\r\n * 资源加载错误捕获插件\r\n */\r\nimport { config } from '../../core/config';\r\nimport { context } from '../../core/context';\r\nimport { reporter } from '../../reporter';\r\nimport type { ErrorData } from '../../types';\r\n\r\n/**\r\n * 安装资源错误监听\r\n */\r\nexport function installResourceErrorHandler(): void {\r\n const cfg = config.get();\r\n \r\n if (!cfg.error?.enabled || !cfg.error?.resourceError) {\r\n return;\r\n }\r\n\r\n window.addEventListener('error', (event: Event) => {\r\n const target = event.target;\r\n \r\n // 只处理资源加载错误(target 不是 window)\r\n if (!target || target === window || !(target instanceof HTMLElement)) {\r\n return;\r\n }\r\n\r\n const tagName = target.tagName.toLowerCase();\r\n \r\n // 只监控特定标签的资源\r\n if (!['img', 'script', 'link', 'video', 'audio', 'source'].includes(tagName)) {\r\n return;\r\n }\r\n\r\n // 获取资源 URL\r\n const resourceUrl = (target as HTMLImageElement | HTMLScriptElement).src \r\n || (target as HTMLLinkElement).href \r\n || '';\r\n\r\n if (!resourceUrl) {\r\n return;\r\n }\r\n\r\n const errorData: Omit<ErrorData, 'appId' | 'userId' | 'sessionId' | 'pageUrl' | 'timestamp' | 'userAgent' | 'sdkVersion' | 'breadcrumbs'> = {\r\n type: 'resource_error',\r\n message: `Failed to load ${tagName}: ${resourceUrl}`,\r\n resourceUrl,\r\n };\r\n\r\n // 添加到面包屑\r\n context.addBreadcrumb({\r\n type: 'request',\r\n category: 'resource_error',\r\n data: {\r\n tagName,\r\n resourceUrl,\r\n },\r\n });\r\n\r\n reporter.reportError(errorData);\r\n }, true); // 使用捕获阶段\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] Resource error handler installed');\r\n }\r\n}\r\n","/**\r\n * HTTP 请求错误拦截插件\r\n * 拦截 XMLHttpRequest 和 Fetch 请求\r\n */\r\nimport { config } from '../../core/config';\r\nimport { context } from '../../core/context';\r\nimport { reporter } from '../../reporter';\r\nimport type { ErrorData, HttpInfo } from '../../types';\r\n\r\n// 保存原始方法\r\nconst originalXHROpen = XMLHttpRequest.prototype.open;\r\nconst originalXHRSend = XMLHttpRequest.prototype.send;\r\nconst originalFetch = window.fetch;\r\n\r\n/**\r\n * 安装 HTTP 错误拦截\r\n */\r\nexport function installHttpErrorHandler(): void {\r\n const cfg = config.get();\r\n \r\n if (!cfg.error?.enabled || !cfg.error?.httpError) {\r\n return;\r\n }\r\n\r\n interceptXHR();\r\n interceptFetch();\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] HTTP error handler installed');\r\n }\r\n}\r\n\r\n/**\r\n * 拦截 XMLHttpRequest\r\n */\r\n/**\r\n * 检查是否是 SDK 自身的请求\r\n */\r\nfunction isSdkRequest(url: string): boolean {\r\n const cfg = config.get();\r\n if (!cfg.dsn) return false;\r\n return url.includes(cfg.dsn);\r\n}\r\n\r\nfunction interceptXHR(): void {\r\n XMLHttpRequest.prototype.open = function (\r\n method: string,\r\n url: string | URL,\r\n async: boolean = true,\r\n username?: string | null,\r\n password?: string | null\r\n ): void {\r\n const urlStr = url.toString();\r\n \r\n // 排除 SDK 自身的上报请求\r\n if (isSdkRequest(urlStr)) {\r\n (this as any)._monitorSkip = true;\r\n return originalXHROpen.call(this, method, url, async, username, password);\r\n }\r\n \r\n // 存储请求信息\r\n (this as any)._monitorData = {\r\n method,\r\n url: urlStr,\r\n startTime: 0,\r\n };\r\n\r\n return originalXHROpen.call(this, method, url, async, username, password);\r\n };\r\n\r\n XMLHttpRequest.prototype.send = function (body?: Document | XMLHttpRequestBodyInit | null): void {\r\n // 跳过 SDK 自身的请求\r\n if ((this as any)._monitorSkip) {\r\n return originalXHRSend.call(this, body);\r\n }\r\n \r\n const monitorData = (this as any)._monitorData;\r\n if (monitorData) {\r\n monitorData.startTime = Date.now();\r\n monitorData.requestBody = typeof body === 'string' ? body : undefined;\r\n }\r\n\r\n this.addEventListener('loadend', function () {\r\n if (!monitorData) return;\r\n\r\n const duration = Date.now() - monitorData.startTime;\r\n const status = this.status;\r\n\r\n // 添加到面包屑\r\n context.addBreadcrumb({\r\n type: 'request',\r\n category: 'xhr',\r\n data: {\r\n method: monitorData.method,\r\n url: monitorData.url,\r\n status,\r\n duration,\r\n },\r\n });\r\n\r\n // 只上报错误请求 (4xx, 5xx 或 0)\r\n if (status === 0 || status >= 400) {\r\n reportHttpError({\r\n method: monitorData.method,\r\n url: monitorData.url,\r\n status,\r\n duration,\r\n requestBody: monitorData.requestBody,\r\n responseBody: this.responseText?.substring(0, 1000), // 限制长度\r\n });\r\n }\r\n });\r\n\r\n return originalXHRSend.call(this, body);\r\n };\r\n}\r\n\r\n/**\r\n * 拦截 Fetch\r\n */\r\nfunction interceptFetch(): void {\r\n window.fetch = async function (\r\n input: RequestInfo | URL,\r\n init?: RequestInit\r\n ): Promise<Response> {\r\n const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;\r\n \r\n // 排除 SDK 自身的上报请求\r\n if (isSdkRequest(url)) {\r\n return originalFetch.call(window, input, init);\r\n }\r\n \r\n const method = init?.method || 'GET';\r\n const startTime = Date.now();\r\n const requestBody = typeof init?.body === 'string' ? init.body : undefined;\r\n\r\n try {\r\n const response = await originalFetch.call(window, input, init);\r\n const duration = Date.now() - startTime;\r\n const status = response.status;\r\n\r\n // 添加到面包屑\r\n context.addBreadcrumb({\r\n type: 'request',\r\n category: 'fetch',\r\n data: {\r\n method,\r\n url,\r\n status,\r\n duration,\r\n },\r\n });\r\n\r\n // 只上报错误请求\r\n if (!response.ok) {\r\n // 克隆响应以读取 body\r\n const cloned = response.clone();\r\n let responseBody: string | undefined;\r\n try {\r\n responseBody = await cloned.text();\r\n responseBody = responseBody.substring(0, 1000);\r\n } catch {}\r\n\r\n reportHttpError({\r\n method,\r\n url,\r\n status,\r\n duration,\r\n requestBody,\r\n responseBody,\r\n });\r\n }\r\n\r\n return response;\r\n } catch (error) {\r\n const duration = Date.now() - startTime;\r\n\r\n // 网络错误\r\n context.addBreadcrumb({\r\n type: 'request',\r\n category: 'fetch',\r\n data: {\r\n method,\r\n url,\r\n status: 0,\r\n duration,\r\n error: (error as Error).message,\r\n },\r\n });\r\n\r\n reportHttpError({\r\n method,\r\n url,\r\n status: 0,\r\n duration,\r\n requestBody,\r\n });\r\n\r\n throw error;\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * 上报 HTTP 错误\r\n */\r\nfunction reportHttpError(httpInfo: HttpInfo): void {\r\n const errorData: Omit<ErrorData, 'appId' | 'userId' | 'sessionId' | 'pageUrl' | 'timestamp' | 'userAgent' | 'sdkVersion' | 'breadcrumbs'> = {\r\n type: 'http_error',\r\n message: `HTTP ${httpInfo.status} ${httpInfo.method} ${httpInfo.url}`,\r\n httpInfo,\r\n };\r\n\r\n reporter.reportError(errorData);\r\n}\r\n","/**\r\n * 白屏检测插件\r\n * 使用 DOM 采样检测页面是否白屏\r\n */\r\nimport { config } from '../../core/config';\r\nimport { reporter } from '../../reporter';\r\nimport type { ErrorData } from '../../types';\r\n\r\n// 采样点 - 页面关键区域\r\nconst SAMPLE_POINTS = [\r\n { x: 0.5, y: 0.1 }, // 顶部中间\r\n { x: 0.25, y: 0.5 }, // 左中\r\n { x: 0.5, y: 0.5 }, // 中心\r\n { x: 0.75, y: 0.5 }, // 右中\r\n { x: 0.5, y: 0.9 }, // 底部中间\r\n];\r\n\r\n// 无效元素\r\nconst INVALID_ELEMENTS = ['html', 'body', 'head', 'meta', 'link', 'style', 'script'];\r\n\r\n/**\r\n * 安装白屏检测\r\n */\r\nexport function installWhiteScreenDetector(): void {\r\n const cfg = config.get();\r\n \r\n if (!cfg.error?.enabled) {\r\n return;\r\n }\r\n\r\n // 在页面加载完成后检测\r\n if (document.readyState === 'complete') {\r\n scheduleDetection();\r\n } else {\r\n window.addEventListener('load', () => {\r\n scheduleDetection();\r\n });\r\n }\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] White screen detector installed');\r\n }\r\n}\r\n\r\n/**\r\n * 调度检测(延迟执行,给页面渲染时间)\r\n */\r\nfunction scheduleDetection(): void {\r\n // 延迟 1 秒检测\r\n setTimeout(() => {\r\n const isWhiteScreen = detectWhiteScreen();\r\n \r\n if (isWhiteScreen) {\r\n reportWhiteScreen();\r\n }\r\n }, 1000);\r\n}\r\n\r\n/**\r\n * 检测是否白屏\r\n */\r\nfunction detectWhiteScreen(): boolean {\r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n \r\n let emptyPoints = 0;\r\n\r\n for (const point of SAMPLE_POINTS) {\r\n const x = viewportWidth * point.x;\r\n const y = viewportHeight * point.y;\r\n \r\n const element = document.elementFromPoint(x, y);\r\n \r\n if (!element || isInvalidElement(element)) {\r\n emptyPoints++;\r\n }\r\n }\r\n\r\n // 如果超过 80% 的采样点是空的,认为是白屏\r\n return emptyPoints / SAMPLE_POINTS.length > 0.8;\r\n}\r\n\r\n/**\r\n * 判断是否为无效元素\r\n */\r\nfunction isInvalidElement(element: Element): boolean {\r\n const tagName = element.tagName.toLowerCase();\r\n return INVALID_ELEMENTS.includes(tagName);\r\n}\r\n\r\n/**\r\n * 上报白屏错误\r\n */\r\nfunction reportWhiteScreen(): void {\r\n const errorData: Omit<ErrorData, 'appId' | 'userId' | 'sessionId' | 'pageUrl' | 'timestamp' | 'userAgent' | 'sdkVersion' | 'breadcrumbs'> = {\r\n type: 'white_screen',\r\n message: 'White screen detected',\r\n };\r\n\r\n reporter.reportError(errorData);\r\n}\r\n","/**\r\n * 错误监控插件入口\r\n */\r\nimport { installJsErrorHandler } from './jsError';\r\nimport { installPromiseErrorHandler } from './promiseError';\r\nimport { installResourceErrorHandler } from './resourceError';\r\nimport { installHttpErrorHandler } from './httpError';\r\nimport { installWhiteScreenDetector } from './whiteScreen';\r\n\r\n/**\r\n * 安装所有错误监控\r\n */\r\nexport function installErrorHandlers(): void {\r\n installJsErrorHandler();\r\n installPromiseErrorHandler();\r\n installResourceErrorHandler();\r\n installHttpErrorHandler();\r\n installWhiteScreenDetector();\r\n}\r\n\r\nexport {\r\n installJsErrorHandler,\r\n installPromiseErrorHandler,\r\n installResourceErrorHandler,\r\n installHttpErrorHandler,\r\n installWhiteScreenDetector,\r\n};\r\n","/**\r\n * Web Vitals 性能指标采集插件\r\n * 采集 FP, FCP, LCP, FID, CLS, TTFB 等核心指标\r\n */\r\nimport { config } from '../../core/config';\r\nimport { reporter } from '../../reporter';\r\nimport type { PerformanceMetrics } from '../../types';\r\n\r\n/**\r\n * 安装 Web Vitals 采集\r\n */\r\nexport function installWebVitals(): void {\r\n const cfg = config.get();\r\n \r\n if (!cfg.performance?.enabled || !cfg.performance?.webVitals) {\r\n return;\r\n }\r\n\r\n // 页面加载完成后采集\r\n if (document.readyState === 'complete') {\r\n collectMetrics();\r\n } else {\r\n window.addEventListener('load', () => {\r\n // 延迟采集,确保 LCP 等指标稳定\r\n setTimeout(collectMetrics, 3000);\r\n });\r\n }\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] Web Vitals collector installed');\r\n }\r\n}\r\n\r\n/**\r\n * 采集性能指标\r\n */\r\nfunction collectMetrics(): void {\r\n const metrics: PerformanceMetrics = {};\r\n\r\n // 使用 Performance API\r\n if (!window.performance) {\r\n return;\r\n }\r\n\r\n // 获取导航计时\r\n const navigation = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming;\r\n if (navigation) {\r\n metrics.ttfb = navigation.responseStart - navigation.requestStart;\r\n metrics.domReady = navigation.domContentLoadedEventEnd - navigation.startTime;\r\n metrics.loadComplete = navigation.loadEventEnd - navigation.startTime;\r\n }\r\n\r\n // 获取 FP 和 FCP\r\n const paintEntries = performance.getEntriesByType('paint');\r\n for (const entry of paintEntries) {\r\n if (entry.name === 'first-paint') {\r\n metrics.fp = entry.startTime;\r\n }\r\n if (entry.name === 'first-contentful-paint') {\r\n metrics.fcp = entry.startTime;\r\n }\r\n }\r\n\r\n // 获取 LCP\r\n collectLCP(metrics);\r\n \r\n // 获取 FID\r\n collectFID(metrics);\r\n \r\n // 获取 CLS\r\n collectCLS(metrics);\r\n\r\n // 上报性能数据\r\n reporter.reportPerformance({\r\n type: 'performance',\r\n metrics,\r\n });\r\n}\r\n\r\n/**\r\n * 采集 LCP (Largest Contentful Paint)\r\n */\r\nfunction collectLCP(metrics: PerformanceMetrics): void {\r\n if (!('PerformanceObserver' in window)) return;\r\n\r\n try {\r\n const observer = new PerformanceObserver((list) => {\r\n const entries = list.getEntries();\r\n const lastEntry = entries[entries.length - 1] as PerformanceEntry;\r\n if (lastEntry) {\r\n metrics.lcp = lastEntry.startTime;\r\n }\r\n });\r\n\r\n observer.observe({ type: 'largest-contentful-paint', buffered: true });\r\n } catch (e) {\r\n // 浏览器不支持\r\n }\r\n}\r\n\r\n/**\r\n * 采集 FID (First Input Delay)\r\n */\r\nfunction collectFID(metrics: PerformanceMetrics): void {\r\n if (!('PerformanceObserver' in window)) return;\r\n\r\n try {\r\n const observer = new PerformanceObserver((list) => {\r\n const entries = list.getEntries() as PerformanceEventTiming[];\r\n const firstEntry = entries[0];\r\n if (firstEntry) {\r\n metrics.fid = firstEntry.processingStart - firstEntry.startTime;\r\n }\r\n });\r\n\r\n observer.observe({ type: 'first-input', buffered: true });\r\n } catch (e) {\r\n // 浏览器不支持\r\n }\r\n}\r\n\r\n/**\r\n * 采集 CLS (Cumulative Layout Shift)\r\n */\r\nfunction collectCLS(metrics: PerformanceMetrics): void {\r\n if (!('PerformanceObserver' in window)) return;\r\n\r\n let clsValue = 0;\r\n\r\n try {\r\n const observer = new PerformanceObserver((list) => {\r\n const entries = list.getEntries() as any[];\r\n for (const entry of entries) {\r\n if (!entry.hadRecentInput) {\r\n clsValue += entry.value;\r\n }\r\n }\r\n metrics.cls = clsValue;\r\n });\r\n\r\n observer.observe({ type: 'layout-shift', buffered: true });\r\n } catch (e) {\r\n // 浏览器不支持\r\n }\r\n}\r\n","/**\r\n * 性能监控插件入口\r\n */\r\nimport { installWebVitals } from './webVitals';\r\n\r\n/**\r\n * 安装性能监控\r\n */\r\nexport function installPerformanceMonitor(): void {\r\n installWebVitals();\r\n}\r\n\r\nexport {\r\n installWebVitals,\r\n};\r\n","/**\r\n * PV (Page View) 统计插件\r\n */\r\nimport { config } from '../../core/config';\r\nimport { reporter } from '../../reporter';\r\nimport { getPageTitle, getReferrer } from '../../utils/browser';\r\n\r\n/**\r\n * 安装 PV 统计\r\n */\r\nexport function installPVTracker(): void {\r\n const cfg = config.get();\r\n \r\n if (!cfg.behavior?.enabled || !cfg.behavior?.pv) {\r\n return;\r\n }\r\n\r\n // 页面加载时上报\r\n reportPV();\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] PV tracker installed');\r\n }\r\n}\r\n\r\n/**\r\n * 上报 PV\r\n */\r\nfunction reportPV(): void {\r\n reporter.reportBehavior({\r\n type: 'behavior',\r\n action: 'pv',\r\n data: {\r\n title: getPageTitle(),\r\n referrer: getReferrer(),\r\n },\r\n });\r\n}\r\n","/**\r\n * 点击事件追踪插件\r\n */\r\nimport { config } from '../../core/config';\r\nimport { context } from '../../core/context';\r\nimport { reporter } from '../../reporter';\r\n\r\n/**\r\n * 安装点击追踪\r\n */\r\nexport function installClickTracker(): void {\r\n const cfg = config.get();\r\n \r\n if (!cfg.behavior?.enabled || !cfg.behavior?.click) {\r\n return;\r\n }\r\n\r\n document.addEventListener('click', (event: MouseEvent) => {\r\n const target = event.target as HTMLElement;\r\n if (!target) return;\r\n\r\n const clickData = extractClickData(target, event);\r\n\r\n // 添加到面包屑\r\n context.addBreadcrumb({\r\n type: 'click',\r\n category: 'ui.click',\r\n data: clickData,\r\n });\r\n\r\n // 可选:上报点击事件(一般只记录面包屑,不单独上报)\r\n // reporter.reportBehavior({\r\n // type: 'behavior',\r\n // action: 'click',\r\n // data: clickData,\r\n // });\r\n }, true);\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] Click tracker installed');\r\n }\r\n}\r\n\r\n/**\r\n * 提取点击数据\r\n */\r\nfunction extractClickData(element: HTMLElement, event: MouseEvent): Record<string, any> {\r\n const tagName = element.tagName.toLowerCase();\r\n const rect = element.getBoundingClientRect();\r\n \r\n return {\r\n tagName,\r\n id: element.id || undefined,\r\n className: element.className || undefined,\r\n text: getElementText(element),\r\n path: getElementPath(element),\r\n // 鼠标坐标\r\n x: event.clientX,\r\n y: event.clientY,\r\n // 元素位置和尺寸\r\n rect: {\r\n top: Math.round(rect.top),\r\n left: Math.round(rect.left),\r\n width: Math.round(rect.width),\r\n height: Math.round(rect.height),\r\n },\r\n // 额外属性\r\n href: (element as HTMLAnchorElement).href || undefined,\r\n name: (element as HTMLInputElement).name || undefined,\r\n type: (element as HTMLInputElement).type || undefined,\r\n };\r\n}\r\n\r\n\r\n/**\r\n * 获取元素文本(限制长度)\r\n */\r\nfunction getElementText(element: HTMLElement): string {\r\n const text = element.innerText || element.textContent || '';\r\n return text.trim().substring(0, 50);\r\n}\r\n\r\n/**\r\n * 获取元素路径\r\n */\r\nfunction getElementPath(element: HTMLElement): string {\r\n const path: string[] = [];\r\n let current: HTMLElement | null = element;\r\n \r\n while (current && path.length < 5) {\r\n let selector = current.tagName.toLowerCase();\r\n \r\n if (current.id) {\r\n selector += `#${current.id}`;\r\n } else if (current.className) {\r\n const classes = current.className.split(' ').filter(Boolean).slice(0, 2);\r\n if (classes.length) {\r\n selector += `.${classes.join('.')}`;\r\n }\r\n }\r\n \r\n path.unshift(selector);\r\n current = current.parentElement;\r\n }\r\n \r\n return path.join(' > ');\r\n}\r\n","/**\r\n * 路由变化监控插件\r\n * 支持 History API 和 Hash 路由\r\n */\r\nimport { config } from '../../core/config';\r\nimport { context } from '../../core/context';\r\nimport { reporter } from '../../reporter';\r\nimport { getPageUrl, getPageTitle } from '../../utils/browser';\r\n\r\n// 保存原始方法\r\nconst originalPushState = history.pushState;\r\nconst originalReplaceState = history.replaceState;\r\n\r\n/**\r\n * 安装路由监控\r\n */\r\nexport function installRouteTracker(): void {\r\n const cfg = config.get();\r\n \r\n if (!cfg.behavior?.enabled || !cfg.behavior?.route) {\r\n return;\r\n }\r\n\r\n // 拦截 pushState\r\n history.pushState = function (...args) {\r\n const result = originalPushState.apply(this, args);\r\n handleRouteChange('pushState');\r\n return result;\r\n };\r\n\r\n // 拦截 replaceState\r\n history.replaceState = function (...args) {\r\n const result = originalReplaceState.apply(this, args);\r\n handleRouteChange('replaceState');\r\n return result;\r\n };\r\n\r\n // 监听 popstate(浏览器前进后退)\r\n window.addEventListener('popstate', () => {\r\n handleRouteChange('popstate');\r\n });\r\n\r\n // 监听 hashchange\r\n window.addEventListener('hashchange', () => {\r\n handleRouteChange('hashchange');\r\n });\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] Route tracker installed');\r\n }\r\n}\r\n\r\n/**\r\n * 处理路由变化\r\n */\r\nfunction handleRouteChange(trigger: string): void {\r\n const routeData = {\r\n url: getPageUrl(),\r\n title: getPageTitle(),\r\n trigger,\r\n };\r\n\r\n // 添加到面包屑\r\n context.addBreadcrumb({\r\n type: 'route',\r\n category: 'navigation',\r\n data: routeData,\r\n });\r\n\r\n // 上报路由变化\r\n reporter.reportBehavior({\r\n type: 'behavior',\r\n action: 'route',\r\n data: routeData,\r\n });\r\n}\r\n","/**\r\n * 控制台日志追踪插件\r\n * 追踪 console.log/warn/error/info 调用\r\n */\r\nimport { config } from '../../core/config';\r\nimport { context } from '../../core/context';\r\n\r\ntype ConsoleLevel = 'log' | 'info' | 'warn' | 'error';\r\n\r\n// 保存原始方法\r\nconst originalConsole = {\r\n log: console.log,\r\n info: console.info,\r\n warn: console.warn,\r\n error: console.error,\r\n};\r\n\r\n/**\r\n * 安装控制台追踪\r\n */\r\nexport function installConsoleTracker(): void {\r\n const cfg = config.get();\r\n \r\n // 默认启用控制台追踪(跟随 behavior.enabled)\r\n if (!cfg.behavior?.enabled) {\r\n return;\r\n }\r\n\r\n const levels: ConsoleLevel[] = ['log', 'info', 'warn', 'error'];\r\n \r\n levels.forEach((level) => {\r\n console[level] = function (...args: any[]) {\r\n // 调用原始方法\r\n originalConsole[level].apply(console, args);\r\n \r\n // 添加到面包屑(只记录 warn 和 error)\r\n if (level === 'warn' || level === 'error') {\r\n const message = formatConsoleArgs(args);\r\n \r\n context.addBreadcrumb({\r\n type: 'console',\r\n category: `console.${level}`,\r\n data: {\r\n level,\r\n message: message.substring(0, 200), // 限制长度\r\n },\r\n });\r\n }\r\n };\r\n });\r\n\r\n if (cfg.debug) {\r\n originalConsole.log('[Monitor] Console tracker installed');\r\n }\r\n}\r\n\r\n/**\r\n * 格式化控制台参数\r\n */\r\nfunction formatConsoleArgs(args: any[]): string {\r\n return args\r\n .map((arg) => {\r\n if (typeof arg === 'string') {\r\n return arg;\r\n }\r\n if (arg instanceof Error) {\r\n return arg.message;\r\n }\r\n try {\r\n return JSON.stringify(arg);\r\n } catch {\r\n return String(arg);\r\n }\r\n })\r\n .join(' ');\r\n}\r\n","/**\r\n * 输入事件追踪插件\r\n * 追踪表单输入、焦点变化等\r\n */\r\nimport { config } from '../../core/config';\r\nimport { context } from '../../core/context';\r\n\r\n/**\r\n * 安装输入追踪\r\n */\r\nexport function installInputTracker(): void {\r\n const cfg = config.get();\r\n \r\n // 默认启用输入追踪(跟随 behavior.enabled)\r\n if (!cfg.behavior?.enabled) {\r\n return;\r\n }\r\n\r\n // 监听 input 事件(使用 change 事件减少数据量)\r\n document.addEventListener('change', handleInputChange, true);\r\n \r\n // 监听焦点事件\r\n document.addEventListener('focus', handleFocus, true);\r\n document.addEventListener('blur', handleBlur, true);\r\n\r\n if (cfg.debug) {\r\n console.log('[Monitor] Input tracker installed');\r\n }\r\n}\r\n\r\n/**\r\n * 处理输入变化\r\n */\r\nfunction handleInputChange(event: Event): void {\r\n const target = event.target as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\r\n if (!target || !isFormElement(target)) return;\r\n\r\n const inputData = extractInputData(target, 'change');\r\n \r\n context.addBreadcrumb({\r\n type: 'input',\r\n category: 'ui.input',\r\n data: inputData,\r\n });\r\n}\r\n\r\n/**\r\n * 处理焦点获取\r\n */\r\nfunction handleFocus(event: FocusEvent): void {\r\n const target = event.target as HTMLElement;\r\n if (!target || !isFormElement(target)) return;\r\n\r\n context.addBreadcrumb({\r\n type: 'input',\r\n category: 'ui.focus',\r\n data: extractInputData(target as HTMLInputElement, 'focus'),\r\n });\r\n}\r\n\r\n/**\r\n * 处理焦点失去\r\n */\r\nfunction handleBlur(event: FocusEvent): void {\r\n const target = event.target as HTMLElement;\r\n if (!target || !isFormElement(target)) return;\r\n\r\n context.addBreadcrumb({\r\n type: 'input',\r\n category: 'ui.blur',\r\n data: extractInputData(target as HTMLInputElement, 'blur'),\r\n });\r\n}\r\n\r\n/**\r\n * 判断是否是表单元素\r\n */\r\nfunction isFormElement(element: HTMLElement): boolean {\r\n const tagName = element.tagName.toLowerCase();\r\n return ['input', 'textarea', 'select'].includes(tagName);\r\n}\r\n\r\n/**\r\n * 提取输入数据(脱敏处理)\r\n */\r\nfunction extractInputData(\r\n element: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement,\r\n action: string\r\n): Record<string, any> {\r\n const tagName = element.tagName.toLowerCase();\r\n const inputType = (element as HTMLInputElement).type || 'text';\r\n \r\n // 敏感类型不记录值\r\n const sensitiveTypes = ['password', 'credit-card', 'cvv'];\r\n const isSensitive = sensitiveTypes.includes(inputType) || \r\n element.name?.toLowerCase().includes('password') ||\r\n element.name?.toLowerCase().includes('secret');\r\n\r\n return {\r\n action,\r\n tagName,\r\n name: element.name || undefined,\r\n id: element.id || undefined,\r\n type: inputType,\r\n // 脱敏:敏感字段不记录值,其他字段只记录长度\r\n valueLength: element.value?.length || 0,\r\n hasValue: !!element.value,\r\n placeholder: (element as HTMLInputElement).placeholder || undefined,\r\n };\r\n}\r\n","/**\r\n * 行为监控插件入口\r\n */\r\nimport { installPVTracker } from './pv';\r\nimport { installClickTracker } from './click';\r\nimport { installRouteTracker } from './route';\r\nimport { installConsoleTracker } from './console';\r\nimport { installInputTracker } from './input';\r\n\r\n/**\r\n * 安装行为监控\r\n */\r\nexport function installBehaviorMonitor(): void {\r\n installPVTracker();\r\n installClickTracker();\r\n installRouteTracker();\r\n installConsoleTracker();\r\n installInputTracker();\r\n}\r\n\r\nexport {\r\n installPVTracker,\r\n installClickTracker,\r\n installRouteTracker,\r\n installConsoleTracker,\r\n installInputTracker,\r\n};\r\n","/**\r\n * 前端监控 SDK\r\n * @description 错误监控、性能监控、行为监控\r\n */\r\nimport { config } from './core/config';\r\nimport { context } from './core/context';\r\nimport { reporter } from './reporter';\r\nimport { installErrorHandlers } from './plugins/error';\r\nimport { installPerformanceMonitor } from './plugins/performance';\r\nimport { installBehaviorMonitor } from './plugins/behavior';\r\nimport type { MonitorConfig, UserInfo, BreadCrumb, ErrorData, PerformanceData, BehaviorData } from './types';\r\n\r\n// SDK 版本\r\nconst SDK_VERSION = '1.0.0';\r\n\r\n/**\r\n * 监控 SDK 主类\r\n */\r\nclass MonitorSDK {\r\n private initialized = false;\r\n\r\n /**\r\n * 初始化 SDK\r\n */\r\n init(userConfig: MonitorConfig): void {\r\n if (this.initialized) {\r\n console.warn('[Monitor] SDK already initialized');\r\n return;\r\n }\r\n\r\n // 初始化配置\r\n config.init({\r\n ...userConfig,\r\n version: userConfig.version || SDK_VERSION,\r\n });\r\n\r\n // 初始化上下文\r\n const maxBreadcrumbs = config.get().behavior?.maxBreadcrumbs || 20;\r\n context.init(maxBreadcrumbs);\r\n\r\n this.initialized = true;\r\n\r\n if (config.get().debug) {\r\n console.log('[Monitor] SDK initialized', config.get());\r\n }\r\n\r\n // 安装监控模块\r\n installErrorHandlers();\r\n installPerformanceMonitor();\r\n installBehaviorMonitor();\r\n }\r\n\r\n /**\r\n * 设置用户信息\r\n */\r\n setUser(user: UserInfo): void {\r\n this.checkInit();\r\n config.setUser(user);\r\n }\r\n\r\n /**\r\n * 手动上报错误\r\n */\r\n captureError(error: Error | string, extra?: Record<string, any>): void {\r\n this.checkInit();\r\n\r\n const errorData: Omit<ErrorData, 'appId' | 'userId' | 'sessionId' | 'pageUrl' | 'timestamp' | 'userAgent' | 'sdkVersion'> = {\r\n type: 'js_error',\r\n message: typeof error === 'string' ? error : error.message,\r\n stack: typeof error === 'string' ? undefined : error.stack,\r\n ...extra,\r\n };\r\n\r\n reporter.reportError(errorData);\r\n }\r\n\r\n /**\r\n * 手动上报性能数据\r\n */\r\n capturePerformance(metrics: PerformanceData['metrics']): void {\r\n this.checkInit();\r\n\r\n reporter.reportPerformance({\r\n type: 'performance',\r\n metrics,\r\n });\r\n }\r\n\r\n /**\r\n * 手动上报行为数据\r\n */\r\n captureBehavior(action: BehaviorData['action'], data: Record<string, any>): void {\r\n this.checkInit();\r\n\r\n reporter.reportBehavior({\r\n type: 'behavior',\r\n action,\r\n data,\r\n });\r\n }\r\n\r\n /**\r\n * 添加面包屑\r\n */\r\n addBreadcrumb(crumb: Omit<BreadCrumb, 'timestamp'>): void {\r\n this.checkInit();\r\n context.addBreadcrumb(crumb);\r\n }\r\n\r\n /**\r\n * 立即发送缓冲区数据\r\n */\r\n flush(): void {\r\n this.checkInit();\r\n reporter.flush();\r\n }\r\n\r\n /**\r\n * 获取 SDK 版本\r\n */\r\n getVersion(): string {\r\n return SDK_VERSION;\r\n }\r\n\r\n /**\r\n * 检查是否已初始化\r\n */\r\n private checkInit(): void {\r\n if (!this.initialized) {\r\n throw new Error('[Monitor] SDK not initialized. Please call init() first.');\r\n }\r\n }\r\n}\r\n\r\n// 导出单例\r\nexport const monitor = new MonitorSDK();\r\n\r\n// 导出类型\r\nexport type {\r\n MonitorConfig,\r\n UserInfo,\r\n BreadCrumb,\r\n ErrorData,\r\n PerformanceData,\r\n BehaviorData,\r\n} from './types';\r\n\r\n// 默认导出\r\nexport default monitor;\r\n"],"names":["SDK_VERSION"],"mappings":"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"}
|
package/dist/index.esm.js
CHANGED
|
@@ -227,12 +227,6 @@ function getPageTitle() {
|
|
|
227
227
|
function supportsSendBeacon() {
|
|
228
228
|
return typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function';
|
|
229
229
|
}
|
|
230
|
-
/**
|
|
231
|
-
* 判断页面是否即将卸载
|
|
232
|
-
*/
|
|
233
|
-
function isPageHidden() {
|
|
234
|
-
return document.visibilityState === 'hidden';
|
|
235
|
-
}
|
|
236
230
|
|
|
237
231
|
/**
|
|
238
232
|
* 数据发送器
|
|
@@ -273,32 +267,39 @@ class Sender {
|
|
|
273
267
|
}
|
|
274
268
|
/**
|
|
275
269
|
* 执行发送
|
|
270
|
+
* 策略:优先使用 sendBeacon(更可靠),不支持或失败时降级为 fetch
|
|
276
271
|
*/
|
|
277
272
|
doSend(data) {
|
|
278
273
|
const cfg = config.get();
|
|
279
274
|
const dsn = cfg.dsn;
|
|
280
275
|
const payload = JSON.stringify(data);
|
|
281
|
-
//
|
|
282
|
-
if (
|
|
283
|
-
this.sendByBeacon(dsn, payload);
|
|
284
|
-
|
|
276
|
+
// 优先使用 sendBeacon(更可靠、异步、不阻塞页面)
|
|
277
|
+
if (supportsSendBeacon()) {
|
|
278
|
+
const success = this.sendByBeacon(dsn, payload);
|
|
279
|
+
if (success) {
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
// sendBeacon 失败,降级到 fetch
|
|
285
283
|
}
|
|
286
|
-
//
|
|
284
|
+
// 不支持 sendBeacon 或 sendBeacon 失败时,使用 fetch
|
|
287
285
|
this.sendByFetch(dsn, payload);
|
|
288
286
|
}
|
|
289
287
|
/**
|
|
290
288
|
* 使用 sendBeacon 发送
|
|
289
|
+
* 返回 true 表示成功加入队列,false 表示失败需要降级
|
|
291
290
|
*/
|
|
292
291
|
sendByBeacon(url, payload) {
|
|
293
292
|
try {
|
|
294
|
-
|
|
293
|
+
const success = navigator.sendBeacon(url, payload);
|
|
294
|
+
if (!success && config.get().debug) {
|
|
295
|
+
console.warn('[Monitor] sendBeacon returned false, falling back to fetch');
|
|
296
|
+
}
|
|
297
|
+
return success;
|
|
295
298
|
}
|
|
296
299
|
catch (e) {
|
|
297
300
|
if (config.get().debug) {
|
|
298
301
|
console.error('[Monitor] sendBeacon failed:', e);
|
|
299
302
|
}
|
|
300
|
-
// 降级到 fetch
|
|
301
|
-
this.sendByFetch(url, payload);
|
|
302
303
|
return false;
|
|
303
304
|
}
|
|
304
305
|
}
|
|
@@ -614,17 +615,36 @@ function installHttpErrorHandler() {
|
|
|
614
615
|
/**
|
|
615
616
|
* 拦截 XMLHttpRequest
|
|
616
617
|
*/
|
|
618
|
+
/**
|
|
619
|
+
* 检查是否是 SDK 自身的请求
|
|
620
|
+
*/
|
|
621
|
+
function isSdkRequest(url) {
|
|
622
|
+
const cfg = config.get();
|
|
623
|
+
if (!cfg.dsn)
|
|
624
|
+
return false;
|
|
625
|
+
return url.includes(cfg.dsn);
|
|
626
|
+
}
|
|
617
627
|
function interceptXHR() {
|
|
618
628
|
XMLHttpRequest.prototype.open = function (method, url, async = true, username, password) {
|
|
629
|
+
const urlStr = url.toString();
|
|
630
|
+
// 排除 SDK 自身的上报请求
|
|
631
|
+
if (isSdkRequest(urlStr)) {
|
|
632
|
+
this._monitorSkip = true;
|
|
633
|
+
return originalXHROpen.call(this, method, url, async, username, password);
|
|
634
|
+
}
|
|
619
635
|
// 存储请求信息
|
|
620
636
|
this._monitorData = {
|
|
621
637
|
method,
|
|
622
|
-
url:
|
|
638
|
+
url: urlStr,
|
|
623
639
|
startTime: 0,
|
|
624
640
|
};
|
|
625
641
|
return originalXHROpen.call(this, method, url, async, username, password);
|
|
626
642
|
};
|
|
627
643
|
XMLHttpRequest.prototype.send = function (body) {
|
|
644
|
+
// 跳过 SDK 自身的请求
|
|
645
|
+
if (this._monitorSkip) {
|
|
646
|
+
return originalXHRSend.call(this, body);
|
|
647
|
+
}
|
|
628
648
|
const monitorData = this._monitorData;
|
|
629
649
|
if (monitorData) {
|
|
630
650
|
monitorData.startTime = Date.now();
|
|
@@ -667,6 +687,10 @@ function interceptXHR() {
|
|
|
667
687
|
function interceptFetch() {
|
|
668
688
|
window.fetch = async function (input, init) {
|
|
669
689
|
const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
|
|
690
|
+
// 排除 SDK 自身的上报请求
|
|
691
|
+
if (isSdkRequest(url)) {
|
|
692
|
+
return originalFetch.call(window, input, init);
|
|
693
|
+
}
|
|
670
694
|
const method = init?.method || 'GET';
|
|
671
695
|
const startTime = Date.now();
|
|
672
696
|
const requestBody = typeof init?.body === 'string' ? init.body : undefined;
|