sobey-monitor-sdk 1.1.15 → 1.1.16

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.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/frameworks/vue.ts","../src/frameworks/react.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 enabled: true,\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 recordRequestBreadcrumb: 'error',\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, skipValidation: boolean = false): void {\r\n if (!skipValidation) {\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\r\n this.config = this.mergeConfig(DEFAULT_CONFIG, userConfig) as MonitorConfig;\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 * sessionId 保存在 sessionStorage 中,同一标签页会话期间保持不变\r\n */\r\n private generateSessionId(): string {\r\n const storageKey = '__sobey_monitor_session_id__';\r\n try {\r\n const existing = sessionStorage.getItem(storageKey);\r\n if (existing) {\r\n return existing;\r\n }\r\n } catch {\r\n // sessionStorage 不可用,继续生成新的\r\n }\r\n \r\n const timestamp = Date.now().toString(36);\r\n const randomPart = Math.random().toString(36).substring(2, 10);\r\n const newSessionId = `${timestamp}-${randomPart}`;\r\n \r\n try {\r\n sessionStorage.setItem(storageKey, newSessionId);\r\n } catch {\r\n // 忽略存储错误\r\n }\r\n \r\n return newSessionId;\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// 保存原始 fetch,避免使用被 SDK 拦截过的 fetch\r\nconst originalFetch = window.fetch.bind(window);\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 private lastSendTime = 0;\r\n /** 发送节流间隔(毫秒) */\r\n private sendThrottleMs = 500;\r\n /** 是否有待发送的数据(节流期间累积) */\r\n private pendingSend = false;\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 * 短时间内的多次 flush 请求会被合并为一次发送\r\n */\r\n flush(): void {\r\n if (this.buffer.length === 0) return;\r\n\r\n const now = Date.now();\r\n const elapsed = now - this.lastSendTime;\r\n\r\n // 节流:如果距离上次发送时间太短,延迟发送\r\n if (elapsed < this.sendThrottleMs) {\r\n if (!this.pendingSend) {\r\n this.pendingSend = true;\r\n setTimeout(() => {\r\n this.pendingSend = false;\r\n this.flush();\r\n }, this.sendThrottleMs - elapsed);\r\n }\r\n return;\r\n }\r\n\r\n const data = [...this.buffer];\r\n this.buffer = [];\r\n this.clearTimer();\r\n this.lastSendTime = now;\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 // 检查配置是否已初始化\r\n if (!config.isInitialized()) {\r\n // 配置未初始化,数据放回缓冲区等待下次发送\r\n this.buffer.unshift(...data);\r\n this.scheduleFlush();\r\n return;\r\n }\r\n\r\n const cfg = config.get();\r\n const dsn = cfg.dsn;\r\n\r\n // dsn 未配置,将数据放回缓冲区等待下次发送\r\n if (!dsn) {\r\n if (cfg.debug) {\r\n console.warn('[Monitor] dsn not configured, buffering data for later');\r\n }\r\n this.buffer.unshift(...data);\r\n this.scheduleFlush();\r\n return;\r\n }\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 * sendBeacon 发送的 Content-Type 是 text/plain,需要使用 /beacon 接口\r\n */\r\n private sendByBeacon(url: string, payload: string): boolean {\r\n try {\r\n // sendBeacon 需要使用 /beacon 接口,因为它发送的是 text/plain\r\n const beaconUrl = url.replace(/\\/report$/, '/beacon');\r\n const success = navigator.sendBeacon(beaconUrl, 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,避免触发 SDK 的 HTTP 错误拦截器\r\n originalFetch(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 /** SDK 是否就绪 */\r\n private ready = false;\r\n /** 早期数据缓存队列(SDK 未就绪时缓存) */\r\n private earlyBuffer: Array<{ type: 'error' | 'performance' | 'behavior'; data: any }> = [];\r\n /** 最大缓存数量 */\r\n private maxEarlyBufferSize = 50;\r\n\r\n /**\r\n * 设置 SDK 就绪状态\r\n */\r\n setReady(ready: boolean): void {\r\n this.ready = ready;\r\n \r\n // 就绪后发送缓存的早期数据\r\n if (ready && this.earlyBuffer.length > 0) {\r\n console.log(`[Monitor] Flushing ${this.earlyBuffer.length} early buffered items`);\r\n this.flushEarlyBuffer();\r\n }\r\n }\r\n\r\n /**\r\n * 发送早期缓存的数据(根据最新配置过滤)\r\n * 所有数据会先累积到 sender 的缓冲区,最后统一发送一次\r\n */\r\n private flushEarlyBuffer(): void {\r\n const cfg = config.get();\r\n let skippedCount = 0;\r\n let processedCount = 0;\r\n\r\n // 全局开关检查:如果 enabled 为 false,清空缓存不上报\r\n if (cfg.enabled === false) {\r\n const totalCount = this.earlyBuffer.length;\r\n this.earlyBuffer = [];\r\n if (cfg.debug) {\r\n console.log(`[Monitor] SDK disabled, discarded ${totalCount} early buffered items`);\r\n }\r\n return;\r\n }\r\n\r\n while (this.earlyBuffer.length > 0) {\r\n const item = this.earlyBuffer.shift();\r\n if (!item) continue;\r\n\r\n // 根据最新配置过滤数据\r\n switch (item.type) {\r\n case 'error':\r\n // 检查错误监控是否启用\r\n if (cfg.error?.enabled === false) {\r\n skippedCount++;\r\n continue;\r\n }\r\n // 根据错误类型检查具体开关\r\n const errorType = item.data?.type;\r\n if (errorType === 'js_error' && cfg.error?.jsError === false) {\r\n skippedCount++;\r\n continue;\r\n }\r\n if (errorType === 'promise_error' && cfg.error?.promiseError === false) {\r\n skippedCount++;\r\n continue;\r\n }\r\n if (errorType === 'resource_error' && cfg.error?.resourceError === false) {\r\n skippedCount++;\r\n continue;\r\n }\r\n if (errorType === 'http_error' && cfg.error?.httpError === false) {\r\n skippedCount++;\r\n continue;\r\n }\r\n this.reportError(item.data);\r\n processedCount++;\r\n break;\r\n\r\n case 'performance':\r\n // 检查性能监控是否启用\r\n if (cfg.performance?.enabled === false) {\r\n skippedCount++;\r\n continue;\r\n }\r\n this.reportPerformance(item.data);\r\n processedCount++;\r\n break;\r\n\r\n case 'behavior':\r\n // 检查行为监控是否启用\r\n if (cfg.behavior?.enabled === false) {\r\n skippedCount++;\r\n continue;\r\n }\r\n // 根据行为类型检查具体开关\r\n const action = item.data?.action;\r\n if (action === 'pv' && cfg.behavior?.pv === false) {\r\n skippedCount++;\r\n continue;\r\n }\r\n if (action === 'route' && cfg.behavior?.route === false) {\r\n skippedCount++;\r\n continue;\r\n }\r\n this.reportBehavior(item.data);\r\n processedCount++;\r\n break;\r\n }\r\n }\r\n\r\n // 所有早期数据已添加到 sender 缓冲区,立即统一发送\r\n if (processedCount > 0) {\r\n sender.flush();\r\n if (cfg.debug) {\r\n console.log(`[Monitor] Flushed ${processedCount} early buffered items in single batch`);\r\n }\r\n }\r\n\r\n if (skippedCount > 0 && cfg.debug) {\r\n console.log(`[Monitor] Filtered out ${skippedCount} early buffered items based on config`);\r\n }\r\n }\r\n\r\n /**\r\n * 缓存早期数据\r\n */\r\n private bufferEarly(type: 'error' | 'performance' | 'behavior', data: any): void {\r\n if (this.earlyBuffer.length >= this.maxEarlyBufferSize) {\r\n // 缓存已满,丢弃最早的数据\r\n this.earlyBuffer.shift();\r\n }\r\n this.earlyBuffer.push({ type, data });\r\n }\r\n\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 // SDK 未就绪时缓存数据\r\n if (!this.ready) {\r\n this.bufferEarly('error', data);\r\n return;\r\n }\r\n\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 // SDK 未就绪时缓存数据\r\n if (!this.ready) {\r\n this.bufferEarly('performance', data);\r\n return;\r\n }\r\n\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 // SDK 未就绪时缓存数据\r\n if (!this.ready) {\r\n this.bufferEarly('behavior', data);\r\n return;\r\n }\r\n\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 // 全局开关检查:如果 enabled 为 false,则不上报\r\n if (cfg.enabled === false) {\r\n if (cfg.debug) {\r\n console.log('[Monitor] SDK disabled, skip report:', data.type || 'unknown');\r\n }\r\n return;\r\n }\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 window.addEventListener('error', (event: ErrorEvent) => {\r\n // 过滤资源加载错误(由 resourceError 处理)\r\n if (event.target !== window) {\r\n return;\r\n }\r\n\r\n // 检查配置(在事件触发时检查,而不是安装时)\r\n const cfg = config.isInitialized() ? config.get() : null;\r\n if (cfg?.error?.enabled === false || cfg?.error?.jsError === false) {\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 console.log('[Monitor] JS error handler installed');\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 window.addEventListener('unhandledrejection', (event: PromiseRejectionEvent) => {\r\n // 检查配置(在事件触发时检查,而不是安装时)\r\n const cfg = config.isInitialized() ? config.get() : null;\r\n if (cfg?.error?.enabled === false || cfg?.error?.promiseError === false) {\r\n return;\r\n }\r\n\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 console.log('[Monitor] Promise error handler installed');\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 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 // 检查配置(在事件触发时检查,而不是安装时)\r\n const cfg = config.isInitialized() ? config.get() : null;\r\n if (cfg?.error?.enabled === false || cfg?.error?.resourceError === false) {\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: 'resource',\r\n category: 'resource_error',\r\n data: {\r\n tagName,\r\n url: resourceUrl,\r\n error: `Failed to load ${tagName}`,\r\n },\r\n });\r\n\r\n reporter.reportError(errorData);\r\n }, true); // 使用捕获阶段\r\n\r\n console.log('[Monitor] Resource error handler installed');\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, BusinessErrorRule } 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 interceptXHR();\r\n interceptFetch();\r\n console.log('[Monitor] HTTP error handler installed');\r\n}\r\n\r\n/**\r\n * 检查是否启用 HTTP 错误监控\r\n */\r\nfunction isHttpErrorEnabled(): boolean {\r\n if (!config.isInitialized()) return true; // 未初始化时先捕获\r\n const cfg = config.get();\r\n return cfg.error?.enabled !== false && cfg.error?.httpError !== false;\r\n}\r\n\r\n/**\r\n * 检查是否是 SDK 自身的请求\r\n */\r\nfunction isSdkRequest(url: string): boolean {\r\n // 检查是否匹配常见的 SDK 上报路径\r\n if (url.includes('/monitor/api/report') || \r\n url.includes('/monitor/api/beacon') ||\r\n url.includes('/monitor/api/config')) {\r\n return true;\r\n }\r\n \r\n // 配置已初始化时,检查 dsn\r\n if (config.isInitialized()) {\r\n const cfg = config.get();\r\n if (cfg.dsn && url.includes(cfg.dsn)) {\r\n return true;\r\n }\r\n }\r\n \r\n return false;\r\n}\r\n\r\n/**\r\n * 获取嵌套对象的字段值\r\n * @param obj 对象\r\n * @param path 字段路径,如 \"status\" 或 \"data.code\"\r\n */\r\nfunction getNestedValue(obj: any, path: string): any {\r\n if (!obj || typeof obj !== 'object') return undefined;\r\n \r\n const keys = path.split('.');\r\n let value = obj;\r\n \r\n for (const key of keys) {\r\n if (value === null || value === undefined) return undefined;\r\n value = value[key];\r\n }\r\n \r\n return value;\r\n}\r\n\r\n/**\r\n * 检查单条规则是否匹配\r\n */\r\nfunction matchRule(data: any, rule: BusinessErrorRule): boolean {\r\n const value = getNestedValue(data, rule.field);\r\n \r\n // 辅助函数:比较两个值(支持数字和字符串的混合比较)\r\n const isEqual = (a: any, b: any): boolean => {\r\n if (a === b) return true;\r\n // 处理数字和字符串的混合比较:500 == \"500\"\r\n if (typeof a === 'number' && typeof b === 'string') {\r\n return a === Number(b);\r\n }\r\n if (typeof a === 'string' && typeof b === 'number') {\r\n return Number(a) === b;\r\n }\r\n return false;\r\n };\r\n \r\n switch (rule.operator) {\r\n case 'exists':\r\n return value !== undefined && value !== null;\r\n case 'eq':\r\n return isEqual(value, rule.value);\r\n case 'ne':\r\n return !isEqual(value, rule.value);\r\n case 'gt':\r\n return typeof value === 'number' && typeof rule.value === 'number' && value > rule.value;\r\n case 'gte':\r\n return typeof value === 'number' && typeof rule.value === 'number' && value >= rule.value;\r\n case 'lt':\r\n return typeof value === 'number' && typeof rule.value === 'number' && value < rule.value;\r\n case 'lte':\r\n return typeof value === 'number' && typeof rule.value === 'number' && value <= rule.value;\r\n default:\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * 检测业务错误\r\n * @param responseBody 响应体字符串\r\n * @returns 是否为业务错误\r\n */\r\nfunction detectBusinessError(responseBody: string | undefined): boolean {\r\n if (!responseBody) return false;\r\n if (!config.isInitialized()) return false;\r\n \r\n const cfg = config.get();\r\n const rules = cfg.error?.businessErrorRules;\r\n \r\n if (!rules || rules.length === 0) {\r\n if (cfg.debug) {\r\n console.log('[Monitor] No businessErrorRules configured');\r\n }\r\n return false;\r\n }\r\n \r\n if (cfg.debug) {\r\n console.log('[Monitor] Checking businessErrorRules:', rules, 'responseBody:', responseBody.substring(0, 200));\r\n }\r\n \r\n try {\r\n const data = JSON.parse(responseBody);\r\n \r\n // 任一规则匹配时返回 true\r\n for (const rule of rules) {\r\n if (matchRule(data, rule)) {\r\n if (cfg.debug) {\r\n console.log('[Monitor] Business error detected by rule:', rule, 'data:', data);\r\n }\r\n return true;\r\n }\r\n }\r\n \r\n return false;\r\n } catch {\r\n // JSON 解析失败,不是业务错误\r\n return false;\r\n }\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 const cfg = config.isInitialized() ? config.get() : null;\r\n const recordMode = cfg?.behavior?.recordRequestBreadcrumb || 'error';\r\n // 重定向(3xx)始终记录,不受配置控制\r\n const isRedirect = status >= 300 && status < 400;\r\n // 其他异常情况(0-网络错误、4xx-客户端错误、5xx-服务端错误)根据配置控制\r\n const isError = status === 0 || status < 200 || status >= 400;\r\n const shouldRecord = isRedirect || recordMode === 'all' || (recordMode === 'error' && isError);\r\n \r\n if (shouldRecord) {\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\r\n const responseBody = this.responseText?.substring(0, 1000);\r\n\r\n // HTTP 错误或业务错误\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,\r\n });\r\n } else if (status >= 200 && status < 300 && detectBusinessError(responseBody)) {\r\n // HTTP 200 但检测到业务错误\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,\r\n }, true);\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 const cfg = config.isInitialized() ? config.get() : null;\r\n const recordMode = cfg?.behavior?.recordRequestBreadcrumb || 'error';\r\n // 重定向(3xx)始终记录,不受配置控制\r\n const isRedirect = status >= 300 && status < 400;\r\n // 其他异常情况根据配置控制\r\n const isError = status < 200 || status >= 400;\r\n const shouldRecord = isRedirect || recordMode === 'all' || (recordMode === 'error' && isError);\r\n \r\n if (shouldRecord) {\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 // 检查是否配置了业务错误规则\r\n const hasBusinessRules = cfg?.error?.businessErrorRules && cfg.error.businessErrorRules.length > 0;\r\n\r\n // 只有在请求失败或配置了业务规则时才读取响应体\r\n if (!response.ok || hasBusinessRules) {\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 if (!response.ok) {\r\n // HTTP 错误\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 } else if (hasBusinessRules && detectBusinessError(responseBody)) {\r\n // HTTP 200 但检测到业务错误\r\n reportHttpError({\r\n method,\r\n url,\r\n status,\r\n duration,\r\n requestBody,\r\n responseBody,\r\n }, true);\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 const cfg = config.isInitialized() ? config.get() : null;\r\n const recordMode = cfg?.behavior?.recordRequestBreadcrumb || 'error';\r\n \r\n // 网络错误属于 error,当模式为 'all' 或 'error' 时都记录\r\n if (recordMode !== 'none') {\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\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, isBusinessError: boolean = false): void {\r\n const message = isBusinessError\r\n ? `Business Error ${httpInfo.method} ${httpInfo.url}`\r\n : `HTTP ${httpInfo.status} ${httpInfo.method} ${httpInfo.url}`;\r\n\r\n const errorData: Omit<ErrorData, 'appId' | 'userId' | 'sessionId' | 'pageUrl' | 'timestamp' | 'userAgent' | 'sdkVersion' | 'breadcrumbs'> = {\r\n type: isBusinessError ? 'business_error' : 'http_error',\r\n message,\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 // 在页面加载完成后检测\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 console.log('[Monitor] White screen detector installed');\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 // 页面加载完成后采集\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 console.log('[Monitor] Web Vitals collector installed');\r\n}\r\n\r\n/**\r\n * 采集性能指标\r\n */\r\nfunction collectMetrics(): void {\r\n // 检查配置(在采集时检查,而不是安装时)\r\n const cfg = config.isInitialized() ? config.get() : null;\r\n if (cfg?.performance?.enabled === false || cfg?.performance?.webVitals === false) {\r\n return;\r\n }\r\n\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 // 页面加载时上报(reporter 会缓存直到 SDK 就绪)\r\n reportPV();\r\n console.log('[Monitor] PV tracker installed');\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 document.addEventListener('click', (event: MouseEvent) => {\r\n // 检查配置(在事件触发时检查,而不是安装时)\r\n const cfg = config.isInitialized() ? config.get() : null;\r\n if (cfg?.behavior?.enabled === false || cfg?.behavior?.click === false) {\r\n return;\r\n }\r\n\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 console.log('[Monitor] Click tracker installed');\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 // SVG 元素的 className 是 SVGAnimatedString 对象,需要特殊处理\r\n const classNameStr = typeof element.className === 'string' \r\n ? element.className \r\n : (element.className as SVGAnimatedString)?.baseVal || '';\r\n \r\n return {\r\n tagName,\r\n id: element.id || undefined,\r\n className: classNameStr || 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 // SVG 元素的 className 是 SVGAnimatedString 对象,需要特殊处理\r\n const classNameStr = typeof current.className === 'string' \r\n ? current.className \r\n : (current.className as SVGAnimatedString)?.baseVal || '';\r\n const classes = classNameStr.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 // 拦截 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 console.log('[Monitor] Route tracker installed');\r\n}\r\n\r\n/**\r\n * 处理路由变化\r\n */\r\nfunction handleRouteChange(trigger: string): void {\r\n // 检查配置(在事件触发时检查,而不是安装时)\r\n const cfg = config.isInitialized() ? config.get() : null;\r\n if (cfg?.behavior?.enabled === false || cfg?.behavior?.route === false) {\r\n return;\r\n }\r\n\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 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 // 检查配置(在调用时检查,而不是安装时)\r\n const cfg = config.isInitialized() ? config.get() : null;\r\n if (cfg?.behavior?.enabled === false) {\r\n return;\r\n }\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 originalConsole.log('[Monitor] Console tracker installed');\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 // 监听 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 console.log('[Monitor] Input tracker installed');\r\n}\r\n\r\n/**\r\n * 处理输入变化\r\n */\r\nfunction handleInputChange(event: Event): void {\r\n // 检查配置(在事件触发时检查,而不是安装时)\r\n const cfg = config.isInitialized() ? config.get() : null;\r\n if (cfg?.behavior?.enabled === false) {\r\n return;\r\n }\r\n\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 // 检查配置\r\n const cfg = config.isInitialized() ? config.get() : null;\r\n if (cfg?.behavior?.enabled === false) {\r\n return;\r\n }\r\n\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 // 检查配置\r\n const cfg = config.isInitialized() ? config.get() : null;\r\n if (cfg?.behavior?.enabled === false) {\r\n return;\r\n }\r\n\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 * Vue 3 框架集成\r\n * 捕获 Vue 组件内的渲染错误\r\n */\r\nimport { monitor } from '../index';\r\nimport { reporter } from '../reporter';\r\nimport { context } from '../core/context';\r\nimport type { MonitorConfig } from '../types';\r\n\r\n/**\r\n * Vue 3 错误监控插件\r\n * \r\n * @example\r\n * ```ts\r\n * import { createApp } from 'vue';\r\n * import { VueMonitorPlugin } from 'sobey-monitor-sdk';\r\n * \r\n * const app = createApp(App);\r\n * app.use(VueMonitorPlugin, {\r\n * appId: 'your-app-id',\r\n * dsn: 'http://your-server/api/report',\r\n * });\r\n * app.mount('#app');\r\n * ```\r\n */\r\nexport const VueMonitorPlugin = {\r\n install(app: any, options: MonitorConfig = {}): void {\r\n // 初始化 SDK(支持空配置,后续通过 updateConfig 激活)\r\n try {\r\n monitor.init(options);\r\n } catch (e) {\r\n // SDK 可能已经初始化,忽略错误\r\n }\r\n\r\n // 保存原有的错误处理器\r\n const originalErrorHandler = app.config.errorHandler;\r\n\r\n // 设置 Vue 错误处理器\r\n app.config.errorHandler = (\r\n err: unknown,\r\n instance: any,\r\n info: string\r\n ): void => {\r\n // 提取错误信息\r\n const error = err instanceof Error ? err : new Error(String(err));\r\n \r\n // 获取组件名称\r\n let componentName = 'Unknown';\r\n if (instance) {\r\n componentName = instance.$options?.name || \r\n instance.$.type?.name || \r\n instance.$.type?.__name ||\r\n 'AnonymousComponent';\r\n }\r\n\r\n // 添加面包屑\r\n context.addBreadcrumb({\r\n type: 'framework',\r\n category: 'vue_error',\r\n data: {\r\n componentName,\r\n info,\r\n message: error.message,\r\n },\r\n });\r\n\r\n // 上报错误\r\n reporter.reportError({\r\n type: 'vue_error',\r\n message: error.message,\r\n stack: error.stack,\r\n componentName,\r\n lifecycleHook: info,\r\n });\r\n\r\n // 调用原有的错误处理器\r\n if (typeof originalErrorHandler === 'function') {\r\n originalErrorHandler(err, instance, info);\r\n }\r\n };\r\n\r\n // 设置警告处理器(仅在开发模式下)\r\n if (options.debug) {\r\n const originalWarnHandler = app.config.warnHandler;\r\n \r\n app.config.warnHandler = (\r\n msg: string,\r\n instance: any,\r\n trace: string\r\n ): void => {\r\n // 添加面包屑\r\n context.addBreadcrumb({\r\n type: 'console',\r\n category: 'vue_warning',\r\n data: { message: msg },\r\n });\r\n\r\n // 调用原有的警告处理器\r\n if (typeof originalWarnHandler === 'function') {\r\n originalWarnHandler(msg, instance, trace);\r\n }\r\n };\r\n }\r\n\r\n if (options.debug) {\r\n console.log('[Monitor] Vue plugin installed');\r\n }\r\n },\r\n};\r\n\r\nexport default VueMonitorPlugin;\r\n","/**\r\n * React 框架集成\r\n * 提供 ErrorBoundary 组件捕获渲染错误\r\n */\r\nimport { monitor } from '../index';\r\nimport { reporter } from '../reporter';\r\nimport { context } from '../core/context';\r\nimport type { MonitorConfig } from '../types';\r\n\r\n/**\r\n * React ErrorBoundary 组件 Props\r\n */\r\nexport interface ErrorBoundaryProps {\r\n /** 发生错误时显示的降级 UI */\r\n fallback?: any;\r\n /** 错误回调 */\r\n onError?: (error: Error, errorInfo: any) => void;\r\n /** 子组件 */\r\n children?: any;\r\n}\r\n\r\n/**\r\n * React ErrorBoundary 组件 State\r\n */\r\nexport interface ErrorBoundaryState {\r\n hasError: boolean;\r\n error: Error | null;\r\n}\r\n\r\n/**\r\n * 创建 React 错误边界组件\r\n * \r\n * @param React - React 库引用\r\n * @param config - SDK 配置\r\n * @returns ErrorBoundary 组件类\r\n * \r\n * @example\r\n * ```tsx\r\n * import React from 'react';\r\n * import ReactDOM from 'react-dom';\r\n * import { createReactErrorBoundary } from 'sobey-monitor-sdk';\r\n * \r\n * const ErrorBoundary = createReactErrorBoundary(React, {\r\n * appId: 'your-app-id',\r\n * dsn: 'http://your-server/api/report',\r\n * });\r\n * \r\n * ReactDOM.render(\r\n * <ErrorBoundary fallback={<h1>Something went wrong</h1>}>\r\n * <App />\r\n * </ErrorBoundary>,\r\n * document.getElementById('root')\r\n * );\r\n * ```\r\n */\r\nexport function createReactErrorBoundary(\r\n React: any,\r\n config: MonitorConfig = {}\r\n): any {\r\n // 初始化 SDK(支持空配置,后续通过 updateConfig 激活)\r\n try {\r\n monitor.init(config);\r\n } catch (e) {\r\n // SDK 可能已经初始化,忽略错误\r\n }\r\n\r\n /**\r\n * React 错误边界组件\r\n */\r\n return class ErrorMonitorBoundary extends React.Component<\r\n ErrorBoundaryProps,\r\n ErrorBoundaryState\r\n > {\r\n constructor(props: ErrorBoundaryProps) {\r\n super(props);\r\n this.state = { hasError: false, error: null };\r\n }\r\n\r\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\r\n return { hasError: true, error };\r\n }\r\n\r\n componentDidCatch(error: Error, errorInfo: any): void {\r\n // 获取组件堆栈\r\n const componentStack = errorInfo?.componentStack || '';\r\n\r\n // 添加面包屑\r\n context.addBreadcrumb({\r\n type: 'framework',\r\n category: 'react_error',\r\n data: {\r\n message: error.message,\r\n componentStack: componentStack.substring(0, 500),\r\n },\r\n });\r\n\r\n // 上报错误\r\n reporter.reportError({\r\n type: 'react_error',\r\n message: error.message,\r\n stack: error.stack,\r\n componentStack,\r\n });\r\n\r\n // 调用自定义错误回调\r\n if (typeof this.props.onError === 'function') {\r\n this.props.onError(error, errorInfo);\r\n }\r\n\r\n if (config.debug) {\r\n console.error('[Monitor] React error caught:', error);\r\n console.error('[Monitor] Component stack:', componentStack);\r\n }\r\n }\r\n\r\n render(): any {\r\n if (this.state.hasError) {\r\n // 显示降级 UI\r\n return this.props.fallback || null;\r\n }\r\n return this.props.children;\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * React Hook: 用于手动上报错误\r\n * \r\n * @example\r\n * ```tsx\r\n * import { useMonitorError } from 'sobey-monitor-sdk';\r\n * \r\n * function MyComponent() {\r\n * const reportError = useMonitorError();\r\n * \r\n * const handleClick = async () => {\r\n * try {\r\n * await riskyOperation();\r\n * } catch (error) {\r\n * reportError(error, { action: 'riskyOperation' });\r\n * }\r\n * };\r\n * \r\n * return <button onClick={handleClick}>Click</button>;\r\n * }\r\n * ```\r\n */\r\nexport function createUseMonitorError(React: any) {\r\n return function useMonitorError() {\r\n return React.useCallback((error: Error | string, extra?: Record<string, any>) => {\r\n monitor.captureError(error, extra);\r\n }, []);\r\n };\r\n}\r\n\r\nexport default { createReactErrorBoundary, createUseMonitorError };\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 /** SDK 是否已初始化(基础初始化,可能还没有完整配置) */\r\n private initialized = false;\r\n /** SDK 是否已就绪(配置完整,可以上报数据) */\r\n private ready = false;\r\n /** 是否正在加载远程配置 */\r\n private loading = false;\r\n /** 监控模块是否已安装 */\r\n private monitorsInstalled = false;\r\n\r\n /**\r\n * 初始化 SDK\r\n * 支持空配置初始化,后续通过 updateConfig 传入 configUrl 完成配置\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 // 如果配置了 configUrl,异步获取远程配置\r\n if (userConfig.configUrl) {\r\n this.loading = true;\r\n this.initBasic(userConfig);\r\n \r\n this.fetchRemoteConfig(userConfig.configUrl)\r\n .then((remoteConfig) => {\r\n const finalConfig = this.mergeUserConfig(remoteConfig, userConfig);\r\n \r\n if (userConfig.debug) {\r\n console.log('[Monitor] Remote config loaded:', remoteConfig);\r\n }\r\n \r\n this.activate(finalConfig);\r\n })\r\n .catch((error) => {\r\n this.loading = false;\r\n console.error('[Monitor] Failed to fetch remote config:', error);\r\n });\r\n } else if (userConfig.appId && userConfig.dsn) {\r\n // 有完整配置,直接激活\r\n this.initBasic(userConfig);\r\n this.activate(userConfig);\r\n } else {\r\n // 空配置或不完整配置,只做基础初始化,等待后续 updateConfig\r\n this.initBasic(userConfig);\r\n console.log('[Monitor] SDK initialized in pending mode. Call updateConfig({configUrl}) to activate.');\r\n }\r\n }\r\n\r\n /**\r\n * 基础初始化(安装监控模块,但不开始上报)\r\n */\r\n private initBasic(userConfig: MonitorConfig): void {\r\n // 初始化上下文\r\n const maxBreadcrumbs = userConfig.behavior?.maxBreadcrumbs || 20;\r\n context.init(maxBreadcrumbs);\r\n \r\n // 安装监控模块(早期捕获的数据会被缓存)\r\n if (!this.monitorsInstalled) {\r\n installErrorHandlers();\r\n installPerformanceMonitor();\r\n installBehaviorMonitor();\r\n this.monitorsInstalled = true;\r\n }\r\n \r\n this.initialized = true;\r\n \r\n if (userConfig.debug) {\r\n console.log('[Monitor] SDK basic initialized (monitors installed, waiting for config)');\r\n }\r\n }\r\n\r\n /**\r\n * 激活 SDK(配置完整后调用)\r\n */\r\n private activate(finalConfig: MonitorConfig): void {\r\n // 初始化配置管理器\r\n config.init({\r\n ...finalConfig,\r\n version: finalConfig.version || SDK_VERSION,\r\n }, true);\r\n\r\n this.ready = true;\r\n this.loading = false;\r\n\r\n // 通知 reporter 可以开始上报(会自动发送缓存的早期数据)\r\n reporter.setReady(true);\r\n\r\n if (config.get().debug) {\r\n console.log('[Monitor] SDK activated with config:', config.get());\r\n }\r\n }\r\n\r\n /**\r\n * 动态更新配置\r\n * 如果传入 configUrl,会从远程获取配置并激活 SDK\r\n */\r\n updateConfig(partialConfig: Partial<MonitorConfig>): void {\r\n // 如果传入了 configUrl,从远程获取配置\r\n if (partialConfig.configUrl) {\r\n console.log('[Monitor] Fetching remote config from:', partialConfig.configUrl);\r\n this.loading = true;\r\n \r\n this.fetchRemoteConfig(partialConfig.configUrl)\r\n .then((remoteConfig) => {\r\n const mergedConfig = this.mergeUserConfig(remoteConfig, partialConfig as MonitorConfig);\r\n \r\n // 移除 configUrl\r\n delete (mergedConfig as any).configUrl;\r\n \r\n if (this.ready) {\r\n // 已就绪,更新配置\r\n config.update(mergedConfig);\r\n this.loading = false;\r\n \r\n if (config.get().debug) {\r\n console.log('[Monitor] Config updated from remote:', mergedConfig);\r\n }\r\n } else {\r\n // 未就绪,激活 SDK\r\n this.activate(mergedConfig);\r\n }\r\n })\r\n .catch((error) => {\r\n this.loading = false;\r\n console.error('[Monitor] Failed to fetch remote config:', error);\r\n });\r\n } else {\r\n // 普通配置更新\r\n if (!this.ready) {\r\n console.warn('[Monitor] SDK not ready. Please provide configUrl or (appId + dsn) first.');\r\n return;\r\n }\r\n \r\n config.update(partialConfig);\r\n\r\n if (config.get().debug) {\r\n console.log('[Monitor] Config updated', partialConfig);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 从远程获取配置\r\n */\r\n private async fetchRemoteConfig(configUrl: string): Promise<Partial<MonitorConfig>> {\r\n const response = await fetch(configUrl, {\r\n method: 'GET',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n return response.json();\r\n }\r\n\r\n /**\r\n * 合并配置:远程配置为基础,用户本地配置优先\r\n */\r\n private mergeUserConfig(remote: Partial<MonitorConfig>, local: MonitorConfig): MonitorConfig {\r\n const result = { ...remote } as MonitorConfig;\r\n \r\n for (const key in local) {\r\n if (Object.prototype.hasOwnProperty.call(local, key)) {\r\n const localValue = (local as any)[key];\r\n const remoteValue = (remote as any)[key];\r\n\r\n // 跳过 configUrl\r\n if (key === 'configUrl') continue;\r\n\r\n if (\r\n localValue !== null &&\r\n localValue !== undefined &&\r\n typeof localValue === 'object' &&\r\n !Array.isArray(localValue) &&\r\n remoteValue !== null &&\r\n remoteValue !== undefined &&\r\n typeof remoteValue === 'object' &&\r\n !Array.isArray(remoteValue)\r\n ) {\r\n (result as any)[key] = { ...remoteValue, ...localValue };\r\n } else if (localValue !== undefined) {\r\n (result as any)[key] = localValue;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * 检查 SDK 是否就绪\r\n */\r\n isReady(): boolean {\r\n return this.ready;\r\n }\r\n\r\n /**\r\n * 设置用户信息\r\n */\r\n setUser(user: UserInfo): void {\r\n if (!this.ready) return;\r\n config.setUser(user);\r\n }\r\n\r\n /**\r\n * 获取当前配置\r\n */\r\n getConfig(): MonitorConfig | null {\r\n if (!this.ready) return null;\r\n return config.get();\r\n }\r\n\r\n /**\r\n * 手动上报错误\r\n */\r\n captureError(error: Error | string, extra?: Record<string, any>): void {\r\n if (!this.ready) return;\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 if (!this.ready) return;\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 if (!this.ready) return;\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 if (!this.initialized) return;\r\n context.addBreadcrumb(crumb);\r\n }\r\n\r\n /**\r\n * 立即发送缓冲区数据\r\n */\r\n flush(): void {\r\n if (!this.ready) return;\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\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 { VueMonitorPlugin } from './frameworks/vue';\r\nexport { createReactErrorBoundary, createUseMonitorError } from './frameworks/react';\r\nexport type { ErrorBoundaryProps, ErrorBoundaryState } from './frameworks/react';\r\n\r\n// 默认导出\r\nexport default monitor;\r\n"],"names":["originalFetch","SDK_VERSION"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.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/frameworks/vue.ts","../src/frameworks/react.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 enabled: true,\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 recordRequestBreadcrumb: 'error',\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, skipValidation: boolean = false): void {\r\n if (!skipValidation) {\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\r\n this.config = this.mergeConfig(DEFAULT_CONFIG, userConfig) as MonitorConfig;\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 * sessionId 保存在 sessionStorage 中,同一标签页会话期间保持不变\r\n */\r\n private generateSessionId(): string {\r\n const storageKey = '__sobey_monitor_session_id__';\r\n try {\r\n const existing = sessionStorage.getItem(storageKey);\r\n if (existing) {\r\n return existing;\r\n }\r\n } catch {\r\n // sessionStorage 不可用,继续生成新的\r\n }\r\n \r\n const timestamp = Date.now().toString(36);\r\n const randomPart = Math.random().toString(36).substring(2, 10);\r\n const newSessionId = `${timestamp}-${randomPart}`;\r\n \r\n try {\r\n sessionStorage.setItem(storageKey, newSessionId);\r\n } catch {\r\n // 忽略存储错误\r\n }\r\n \r\n return newSessionId;\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// 保存原始 fetch,避免使用被 SDK 拦截过的 fetch\r\nconst originalFetch = window.fetch.bind(window);\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 private lastSendTime = 0;\r\n /** 发送节流间隔(毫秒) */\r\n private sendThrottleMs = 500;\r\n /** 是否有待发送的数据(节流期间累积) */\r\n private pendingSend = false;\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 * 短时间内的多次 flush 请求会被合并为一次发送\r\n */\r\n flush(): void {\r\n if (this.buffer.length === 0) return;\r\n\r\n const now = Date.now();\r\n const elapsed = now - this.lastSendTime;\r\n\r\n // 节流:如果距离上次发送时间太短,延迟发送\r\n if (elapsed < this.sendThrottleMs) {\r\n if (!this.pendingSend) {\r\n this.pendingSend = true;\r\n setTimeout(() => {\r\n this.pendingSend = false;\r\n this.flush();\r\n }, this.sendThrottleMs - elapsed);\r\n }\r\n return;\r\n }\r\n\r\n const data = [...this.buffer];\r\n this.buffer = [];\r\n this.clearTimer();\r\n this.lastSendTime = now;\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 // 检查配置是否已初始化\r\n if (!config.isInitialized()) {\r\n // 配置未初始化,数据放回缓冲区等待下次发送\r\n this.buffer.unshift(...data);\r\n this.scheduleFlush();\r\n return;\r\n }\r\n\r\n const cfg = config.get();\r\n const dsn = cfg.dsn;\r\n\r\n // dsn 未配置,将数据放回缓冲区等待下次发送\r\n if (!dsn) {\r\n if (cfg.debug) {\r\n console.warn('[Monitor] dsn not configured, buffering data for later');\r\n }\r\n this.buffer.unshift(...data);\r\n this.scheduleFlush();\r\n return;\r\n }\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 * sendBeacon 发送的 Content-Type 是 text/plain,需要使用 /beacon 接口\r\n */\r\n private sendByBeacon(url: string, payload: string): boolean {\r\n try {\r\n // sendBeacon 需要使用 /beacon 接口,因为它发送的是 text/plain\r\n const beaconUrl = url.replace(/\\/report$/, '/beacon');\r\n const success = navigator.sendBeacon(beaconUrl, 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,避免触发 SDK 的 HTTP 错误拦截器\r\n originalFetch(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 /** SDK 是否就绪 */\r\n private ready = false;\r\n /** 早期数据缓存队列(SDK 未就绪时缓存) */\r\n private earlyBuffer: Array<{ type: 'error' | 'performance' | 'behavior'; data: any }> = [];\r\n /** 最大缓存数量 */\r\n private maxEarlyBufferSize = 50;\r\n\r\n /**\r\n * 设置 SDK 就绪状态\r\n */\r\n setReady(ready: boolean): void {\r\n this.ready = ready;\r\n \r\n // 就绪后发送缓存的早期数据\r\n if (ready && this.earlyBuffer.length > 0) {\r\n console.log(`[Monitor] Flushing ${this.earlyBuffer.length} early buffered items`);\r\n this.flushEarlyBuffer();\r\n }\r\n }\r\n\r\n /**\r\n * 发送早期缓存的数据(根据最新配置过滤)\r\n * 所有数据会先累积到 sender 的缓冲区,最后统一发送一次\r\n */\r\n private flushEarlyBuffer(): void {\r\n const cfg = config.get();\r\n let skippedCount = 0;\r\n let processedCount = 0;\r\n\r\n // 全局开关检查:如果 enabled 为 false,清空缓存不上报\r\n if (cfg.enabled === false) {\r\n const totalCount = this.earlyBuffer.length;\r\n this.earlyBuffer = [];\r\n if (cfg.debug) {\r\n console.log(`[Monitor] SDK disabled, discarded ${totalCount} early buffered items`);\r\n }\r\n return;\r\n }\r\n\r\n while (this.earlyBuffer.length > 0) {\r\n const item = this.earlyBuffer.shift();\r\n if (!item) continue;\r\n\r\n // 根据最新配置过滤数据\r\n switch (item.type) {\r\n case 'error':\r\n // 检查错误监控是否启用\r\n if (cfg.error?.enabled === false) {\r\n skippedCount++;\r\n continue;\r\n }\r\n // 根据错误类型检查具体开关\r\n const errorType = item.data?.type;\r\n if (errorType === 'js_error' && cfg.error?.jsError === false) {\r\n skippedCount++;\r\n continue;\r\n }\r\n if (errorType === 'promise_error' && cfg.error?.promiseError === false) {\r\n skippedCount++;\r\n continue;\r\n }\r\n if (errorType === 'resource_error' && cfg.error?.resourceError === false) {\r\n skippedCount++;\r\n continue;\r\n }\r\n if (errorType === 'http_error' && cfg.error?.httpError === false) {\r\n skippedCount++;\r\n continue;\r\n }\r\n this.reportError(item.data);\r\n processedCount++;\r\n break;\r\n\r\n case 'performance':\r\n // 检查性能监控是否启用\r\n if (cfg.performance?.enabled === false) {\r\n skippedCount++;\r\n continue;\r\n }\r\n this.reportPerformance(item.data);\r\n processedCount++;\r\n break;\r\n\r\n case 'behavior':\r\n // 检查行为监控是否启用\r\n if (cfg.behavior?.enabled === false) {\r\n skippedCount++;\r\n continue;\r\n }\r\n // 根据行为类型检查具体开关\r\n const action = item.data?.action;\r\n if (action === 'pv' && cfg.behavior?.pv === false) {\r\n skippedCount++;\r\n continue;\r\n }\r\n if (action === 'route' && cfg.behavior?.route === false) {\r\n skippedCount++;\r\n continue;\r\n }\r\n this.reportBehavior(item.data);\r\n processedCount++;\r\n break;\r\n }\r\n }\r\n\r\n // 所有早期数据已添加到 sender 缓冲区,立即统一发送\r\n if (processedCount > 0) {\r\n sender.flush();\r\n if (cfg.debug) {\r\n console.log(`[Monitor] Flushed ${processedCount} early buffered items in single batch`);\r\n }\r\n }\r\n\r\n if (skippedCount > 0 && cfg.debug) {\r\n console.log(`[Monitor] Filtered out ${skippedCount} early buffered items based on config`);\r\n }\r\n }\r\n\r\n /**\r\n * 缓存早期数据\r\n */\r\n private bufferEarly(type: 'error' | 'performance' | 'behavior', data: any): void {\r\n if (this.earlyBuffer.length >= this.maxEarlyBufferSize) {\r\n // 缓存已满,丢弃最早的数据\r\n this.earlyBuffer.shift();\r\n }\r\n this.earlyBuffer.push({ type, data });\r\n }\r\n\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 // SDK 未就绪时缓存数据\r\n if (!this.ready) {\r\n this.bufferEarly('error', data);\r\n return;\r\n }\r\n\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 // SDK 未就绪时缓存数据\r\n if (!this.ready) {\r\n this.bufferEarly('performance', data);\r\n return;\r\n }\r\n\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 // SDK 未就绪时缓存数据\r\n if (!this.ready) {\r\n this.bufferEarly('behavior', data);\r\n return;\r\n }\r\n\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 // 全局开关检查:如果 enabled 为 false,则不上报\r\n if (cfg.enabled === false) {\r\n if (cfg.debug) {\r\n console.log('[Monitor] SDK disabled, skip report:', data.type || 'unknown');\r\n }\r\n return;\r\n }\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 window.addEventListener('error', (event: ErrorEvent) => {\r\n // 过滤资源加载错误(由 resourceError 处理)\r\n if (event.target !== window) {\r\n return;\r\n }\r\n\r\n // 检查配置(在事件触发时检查,而不是安装时)\r\n const cfg = config.isInitialized() ? config.get() : null;\r\n if (cfg?.error?.enabled === false || cfg?.error?.jsError === false) {\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 console.log('[Monitor] JS error handler installed');\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 window.addEventListener('unhandledrejection', (event: PromiseRejectionEvent) => {\r\n // 检查配置(在事件触发时检查,而不是安装时)\r\n const cfg = config.isInitialized() ? config.get() : null;\r\n if (cfg?.error?.enabled === false || cfg?.error?.promiseError === false) {\r\n return;\r\n }\r\n\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 console.log('[Monitor] Promise error handler installed');\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 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 // 检查配置(在事件触发时检查,而不是安装时)\r\n const cfg = config.isInitialized() ? config.get() : null;\r\n if (cfg?.error?.enabled === false || cfg?.error?.resourceError === false) {\r\n return;\r\n }\r\n\r\n const tagName = target.tagName.toLowerCase();\r\n \r\n // 只监控特定标签的资源(包括 iframe)\r\n if (!['img', 'script', 'link', 'video', 'audio', 'source', 'iframe'].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: 'resource',\r\n category: 'resource_error',\r\n data: {\r\n tagName,\r\n url: resourceUrl,\r\n error: `Failed to load ${tagName}`,\r\n },\r\n });\r\n\r\n reporter.reportError(errorData);\r\n }, true); // 使用捕获阶段\r\n\r\n console.log('[Monitor] Resource error handler installed');\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, BusinessErrorRule } 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 interceptXHR();\r\n interceptFetch();\r\n console.log('[Monitor] HTTP error handler installed');\r\n}\r\n\r\n/**\r\n * 检查是否启用 HTTP 错误监控\r\n */\r\nfunction isHttpErrorEnabled(): boolean {\r\n if (!config.isInitialized()) return true; // 未初始化时先捕获\r\n const cfg = config.get();\r\n return cfg.error?.enabled !== false && cfg.error?.httpError !== false;\r\n}\r\n\r\n/**\r\n * 检查是否是 SDK 自身的请求\r\n */\r\nfunction isSdkRequest(url: string): boolean {\r\n // 检查是否匹配常见的 SDK 上报路径\r\n if (url.includes('/monitor/api/report') || \r\n url.includes('/monitor/api/beacon') ||\r\n url.includes('/monitor/api/config')) {\r\n return true;\r\n }\r\n \r\n // 配置已初始化时,检查 dsn\r\n if (config.isInitialized()) {\r\n const cfg = config.get();\r\n if (cfg.dsn && url.includes(cfg.dsn)) {\r\n return true;\r\n }\r\n }\r\n \r\n return false;\r\n}\r\n\r\n/**\r\n * 获取嵌套对象的字段值\r\n * @param obj 对象\r\n * @param path 字段路径,如 \"status\" 或 \"data.code\"\r\n */\r\nfunction getNestedValue(obj: any, path: string): any {\r\n if (!obj || typeof obj !== 'object') return undefined;\r\n \r\n const keys = path.split('.');\r\n let value = obj;\r\n \r\n for (const key of keys) {\r\n if (value === null || value === undefined) return undefined;\r\n value = value[key];\r\n }\r\n \r\n return value;\r\n}\r\n\r\n/**\r\n * 检查单条规则是否匹配\r\n */\r\nfunction matchRule(data: any, rule: BusinessErrorRule): boolean {\r\n const value = getNestedValue(data, rule.field);\r\n \r\n // 辅助函数:比较两个值(支持数字和字符串的混合比较)\r\n const isEqual = (a: any, b: any): boolean => {\r\n if (a === b) return true;\r\n // 处理数字和字符串的混合比较:500 == \"500\"\r\n if (typeof a === 'number' && typeof b === 'string') {\r\n return a === Number(b);\r\n }\r\n if (typeof a === 'string' && typeof b === 'number') {\r\n return Number(a) === b;\r\n }\r\n return false;\r\n };\r\n \r\n switch (rule.operator) {\r\n case 'exists':\r\n return value !== undefined && value !== null;\r\n case 'eq':\r\n return isEqual(value, rule.value);\r\n case 'ne':\r\n return !isEqual(value, rule.value);\r\n case 'gt':\r\n return typeof value === 'number' && typeof rule.value === 'number' && value > rule.value;\r\n case 'gte':\r\n return typeof value === 'number' && typeof rule.value === 'number' && value >= rule.value;\r\n case 'lt':\r\n return typeof value === 'number' && typeof rule.value === 'number' && value < rule.value;\r\n case 'lte':\r\n return typeof value === 'number' && typeof rule.value === 'number' && value <= rule.value;\r\n default:\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * 检测业务错误\r\n * @param responseBody 响应体字符串\r\n * @returns 是否为业务错误\r\n */\r\nfunction detectBusinessError(responseBody: string | undefined): boolean {\r\n if (!responseBody) return false;\r\n if (!config.isInitialized()) return false;\r\n \r\n const cfg = config.get();\r\n const rules = cfg.error?.businessErrorRules;\r\n \r\n if (!rules || rules.length === 0) {\r\n if (cfg.debug) {\r\n console.log('[Monitor] No businessErrorRules configured');\r\n }\r\n return false;\r\n }\r\n \r\n if (cfg.debug) {\r\n console.log('[Monitor] Checking businessErrorRules:', rules, 'responseBody:', responseBody.substring(0, 200));\r\n }\r\n \r\n try {\r\n const data = JSON.parse(responseBody);\r\n \r\n // 任一规则匹配时返回 true\r\n for (const rule of rules) {\r\n if (matchRule(data, rule)) {\r\n if (cfg.debug) {\r\n console.log('[Monitor] Business error detected by rule:', rule, 'data:', data);\r\n }\r\n return true;\r\n }\r\n }\r\n \r\n return false;\r\n } catch {\r\n // JSON 解析失败,不是业务错误\r\n return false;\r\n }\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 const cfg = config.isInitialized() ? config.get() : null;\r\n const recordMode = cfg?.behavior?.recordRequestBreadcrumb || 'error';\r\n // 重定向(3xx)始终记录,不受配置控制\r\n const isRedirect = status >= 300 && status < 400;\r\n // 其他异常情况(0-网络错误、4xx-客户端错误、5xx-服务端错误)根据配置控制\r\n const isError = status === 0 || status < 200 || status >= 400;\r\n const shouldRecord = isRedirect || recordMode === 'all' || (recordMode === 'error' && isError);\r\n \r\n if (shouldRecord) {\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\r\n const responseBody = this.responseText?.substring(0, 1000);\r\n\r\n // HTTP 错误或业务错误\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,\r\n });\r\n } else if (status >= 200 && status < 300 && detectBusinessError(responseBody)) {\r\n // HTTP 200 但检测到业务错误\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,\r\n }, true);\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 const cfg = config.isInitialized() ? config.get() : null;\r\n const recordMode = cfg?.behavior?.recordRequestBreadcrumb || 'error';\r\n // 重定向(3xx)始终记录,不受配置控制\r\n const isRedirect = status >= 300 && status < 400;\r\n // 其他异常情况根据配置控制\r\n const isError = status < 200 || status >= 400;\r\n const shouldRecord = isRedirect || recordMode === 'all' || (recordMode === 'error' && isError);\r\n \r\n if (shouldRecord) {\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 // 检查是否配置了业务错误规则\r\n const hasBusinessRules = cfg?.error?.businessErrorRules && cfg.error.businessErrorRules.length > 0;\r\n\r\n // 只有在请求失败或配置了业务规则时才读取响应体\r\n if (!response.ok || hasBusinessRules) {\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 if (!response.ok) {\r\n // HTTP 错误\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 } else if (hasBusinessRules && detectBusinessError(responseBody)) {\r\n // HTTP 200 但检测到业务错误\r\n reportHttpError({\r\n method,\r\n url,\r\n status,\r\n duration,\r\n requestBody,\r\n responseBody,\r\n }, true);\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 const cfg = config.isInitialized() ? config.get() : null;\r\n const recordMode = cfg?.behavior?.recordRequestBreadcrumb || 'error';\r\n \r\n // 网络错误属于 error,当模式为 'all' 或 'error' 时都记录\r\n if (recordMode !== 'none') {\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\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, isBusinessError: boolean = false): void {\r\n const message = isBusinessError\r\n ? `Business Error ${httpInfo.method} ${httpInfo.url}`\r\n : `HTTP ${httpInfo.status} ${httpInfo.method} ${httpInfo.url}`;\r\n\r\n const errorData: Omit<ErrorData, 'appId' | 'userId' | 'sessionId' | 'pageUrl' | 'timestamp' | 'userAgent' | 'sdkVersion' | 'breadcrumbs'> = {\r\n type: isBusinessError ? 'business_error' : 'http_error',\r\n message,\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 // 在页面加载完成后检测\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 console.log('[Monitor] White screen detector installed');\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 // 页面加载完成后采集\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 console.log('[Monitor] Web Vitals collector installed');\r\n}\r\n\r\n/**\r\n * 采集性能指标\r\n */\r\nfunction collectMetrics(): void {\r\n // 检查配置(在采集时检查,而不是安装时)\r\n const cfg = config.isInitialized() ? config.get() : null;\r\n if (cfg?.performance?.enabled === false || cfg?.performance?.webVitals === false) {\r\n return;\r\n }\r\n\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 // 页面加载时上报(reporter 会缓存直到 SDK 就绪)\r\n reportPV();\r\n console.log('[Monitor] PV tracker installed');\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 document.addEventListener('click', (event: MouseEvent) => {\r\n // 检查配置(在事件触发时检查,而不是安装时)\r\n const cfg = config.isInitialized() ? config.get() : null;\r\n if (cfg?.behavior?.enabled === false || cfg?.behavior?.click === false) {\r\n return;\r\n }\r\n\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 console.log('[Monitor] Click tracker installed');\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 // SVG 元素的 className 是 SVGAnimatedString 对象,需要特殊处理\r\n const classNameStr = typeof element.className === 'string' \r\n ? element.className \r\n : (element.className as SVGAnimatedString)?.baseVal || '';\r\n \r\n return {\r\n tagName,\r\n id: element.id || undefined,\r\n className: classNameStr || 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 // SVG 元素的 className 是 SVGAnimatedString 对象,需要特殊处理\r\n const classNameStr = typeof current.className === 'string' \r\n ? current.className \r\n : (current.className as SVGAnimatedString)?.baseVal || '';\r\n const classes = classNameStr.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 // 拦截 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 console.log('[Monitor] Route tracker installed');\r\n}\r\n\r\n/**\r\n * 处理路由变化\r\n */\r\nfunction handleRouteChange(trigger: string): void {\r\n // 检查配置(在事件触发时检查,而不是安装时)\r\n const cfg = config.isInitialized() ? config.get() : null;\r\n if (cfg?.behavior?.enabled === false || cfg?.behavior?.route === false) {\r\n return;\r\n }\r\n\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 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 // 检查配置(在调用时检查,而不是安装时)\r\n const cfg = config.isInitialized() ? config.get() : null;\r\n if (cfg?.behavior?.enabled === false) {\r\n return;\r\n }\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 originalConsole.log('[Monitor] Console tracker installed');\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 // 监听 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 console.log('[Monitor] Input tracker installed');\r\n}\r\n\r\n/**\r\n * 处理输入变化\r\n */\r\nfunction handleInputChange(event: Event): void {\r\n // 检查配置(在事件触发时检查,而不是安装时)\r\n const cfg = config.isInitialized() ? config.get() : null;\r\n if (cfg?.behavior?.enabled === false) {\r\n return;\r\n }\r\n\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 // 检查配置\r\n const cfg = config.isInitialized() ? config.get() : null;\r\n if (cfg?.behavior?.enabled === false) {\r\n return;\r\n }\r\n\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 // 检查配置\r\n const cfg = config.isInitialized() ? config.get() : null;\r\n if (cfg?.behavior?.enabled === false) {\r\n return;\r\n }\r\n\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 * Vue 3 框架集成\r\n * 捕获 Vue 组件内的渲染错误\r\n */\r\nimport { monitor } from '../index';\r\nimport { reporter } from '../reporter';\r\nimport { context } from '../core/context';\r\nimport type { MonitorConfig } from '../types';\r\n\r\n/**\r\n * Vue 3 错误监控插件\r\n * \r\n * @example\r\n * ```ts\r\n * import { createApp } from 'vue';\r\n * import { VueMonitorPlugin } from 'sobey-monitor-sdk';\r\n * \r\n * const app = createApp(App);\r\n * app.use(VueMonitorPlugin, {\r\n * appId: 'your-app-id',\r\n * dsn: 'http://your-server/api/report',\r\n * });\r\n * app.mount('#app');\r\n * ```\r\n */\r\nexport const VueMonitorPlugin = {\r\n install(app: any, options: MonitorConfig = {}): void {\r\n // 初始化 SDK(支持空配置,后续通过 updateConfig 激活)\r\n try {\r\n monitor.init(options);\r\n } catch (e) {\r\n // SDK 可能已经初始化,忽略错误\r\n }\r\n\r\n // 保存原有的错误处理器\r\n const originalErrorHandler = app.config.errorHandler;\r\n\r\n // 设置 Vue 错误处理器\r\n app.config.errorHandler = (\r\n err: unknown,\r\n instance: any,\r\n info: string\r\n ): void => {\r\n // 提取错误信息\r\n const error = err instanceof Error ? err : new Error(String(err));\r\n \r\n // 获取组件名称\r\n let componentName = 'Unknown';\r\n if (instance) {\r\n componentName = instance.$options?.name || \r\n instance.$.type?.name || \r\n instance.$.type?.__name ||\r\n 'AnonymousComponent';\r\n }\r\n\r\n // 添加面包屑\r\n context.addBreadcrumb({\r\n type: 'framework',\r\n category: 'vue_error',\r\n data: {\r\n componentName,\r\n info,\r\n message: error.message,\r\n },\r\n });\r\n\r\n // 上报错误\r\n reporter.reportError({\r\n type: 'vue_error',\r\n message: error.message,\r\n stack: error.stack,\r\n componentName,\r\n lifecycleHook: info,\r\n });\r\n\r\n // 调用原有的错误处理器\r\n if (typeof originalErrorHandler === 'function') {\r\n originalErrorHandler(err, instance, info);\r\n }\r\n };\r\n\r\n // 设置警告处理器(仅在开发模式下)\r\n if (options.debug) {\r\n const originalWarnHandler = app.config.warnHandler;\r\n \r\n app.config.warnHandler = (\r\n msg: string,\r\n instance: any,\r\n trace: string\r\n ): void => {\r\n // 添加面包屑\r\n context.addBreadcrumb({\r\n type: 'console',\r\n category: 'vue_warning',\r\n data: { message: msg },\r\n });\r\n\r\n // 调用原有的警告处理器\r\n if (typeof originalWarnHandler === 'function') {\r\n originalWarnHandler(msg, instance, trace);\r\n }\r\n };\r\n }\r\n\r\n if (options.debug) {\r\n console.log('[Monitor] Vue plugin installed');\r\n }\r\n },\r\n};\r\n\r\nexport default VueMonitorPlugin;\r\n","/**\r\n * React 框架集成\r\n * 提供 ErrorBoundary 组件捕获渲染错误\r\n */\r\nimport { monitor } from '../index';\r\nimport { reporter } from '../reporter';\r\nimport { context } from '../core/context';\r\nimport type { MonitorConfig } from '../types';\r\n\r\n/**\r\n * React ErrorBoundary 组件 Props\r\n */\r\nexport interface ErrorBoundaryProps {\r\n /** 发生错误时显示的降级 UI */\r\n fallback?: any;\r\n /** 错误回调 */\r\n onError?: (error: Error, errorInfo: any) => void;\r\n /** 子组件 */\r\n children?: any;\r\n}\r\n\r\n/**\r\n * React ErrorBoundary 组件 State\r\n */\r\nexport interface ErrorBoundaryState {\r\n hasError: boolean;\r\n error: Error | null;\r\n}\r\n\r\n/**\r\n * 创建 React 错误边界组件\r\n * \r\n * @param React - React 库引用\r\n * @param config - SDK 配置\r\n * @returns ErrorBoundary 组件类\r\n * \r\n * @example\r\n * ```tsx\r\n * import React from 'react';\r\n * import ReactDOM from 'react-dom';\r\n * import { createReactErrorBoundary } from 'sobey-monitor-sdk';\r\n * \r\n * const ErrorBoundary = createReactErrorBoundary(React, {\r\n * appId: 'your-app-id',\r\n * dsn: 'http://your-server/api/report',\r\n * });\r\n * \r\n * ReactDOM.render(\r\n * <ErrorBoundary fallback={<h1>Something went wrong</h1>}>\r\n * <App />\r\n * </ErrorBoundary>,\r\n * document.getElementById('root')\r\n * );\r\n * ```\r\n */\r\nexport function createReactErrorBoundary(\r\n React: any,\r\n config: MonitorConfig = {}\r\n): any {\r\n // 初始化 SDK(支持空配置,后续通过 updateConfig 激活)\r\n try {\r\n monitor.init(config);\r\n } catch (e) {\r\n // SDK 可能已经初始化,忽略错误\r\n }\r\n\r\n /**\r\n * React 错误边界组件\r\n */\r\n return class ErrorMonitorBoundary extends React.Component<\r\n ErrorBoundaryProps,\r\n ErrorBoundaryState\r\n > {\r\n constructor(props: ErrorBoundaryProps) {\r\n super(props);\r\n this.state = { hasError: false, error: null };\r\n }\r\n\r\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\r\n return { hasError: true, error };\r\n }\r\n\r\n componentDidCatch(error: Error, errorInfo: any): void {\r\n // 获取组件堆栈\r\n const componentStack = errorInfo?.componentStack || '';\r\n\r\n // 添加面包屑\r\n context.addBreadcrumb({\r\n type: 'framework',\r\n category: 'react_error',\r\n data: {\r\n message: error.message,\r\n componentStack: componentStack.substring(0, 500),\r\n },\r\n });\r\n\r\n // 上报错误\r\n reporter.reportError({\r\n type: 'react_error',\r\n message: error.message,\r\n stack: error.stack,\r\n componentStack,\r\n });\r\n\r\n // 调用自定义错误回调\r\n if (typeof this.props.onError === 'function') {\r\n this.props.onError(error, errorInfo);\r\n }\r\n\r\n if (config.debug) {\r\n console.error('[Monitor] React error caught:', error);\r\n console.error('[Monitor] Component stack:', componentStack);\r\n }\r\n }\r\n\r\n render(): any {\r\n if (this.state.hasError) {\r\n // 显示降级 UI\r\n return this.props.fallback || null;\r\n }\r\n return this.props.children;\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * React Hook: 用于手动上报错误\r\n * \r\n * @example\r\n * ```tsx\r\n * import { useMonitorError } from 'sobey-monitor-sdk';\r\n * \r\n * function MyComponent() {\r\n * const reportError = useMonitorError();\r\n * \r\n * const handleClick = async () => {\r\n * try {\r\n * await riskyOperation();\r\n * } catch (error) {\r\n * reportError(error, { action: 'riskyOperation' });\r\n * }\r\n * };\r\n * \r\n * return <button onClick={handleClick}>Click</button>;\r\n * }\r\n * ```\r\n */\r\nexport function createUseMonitorError(React: any) {\r\n return function useMonitorError() {\r\n return React.useCallback((error: Error | string, extra?: Record<string, any>) => {\r\n monitor.captureError(error, extra);\r\n }, []);\r\n };\r\n}\r\n\r\nexport default { createReactErrorBoundary, createUseMonitorError };\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 /** SDK 是否已初始化(基础初始化,可能还没有完整配置) */\r\n private initialized = false;\r\n /** SDK 是否已就绪(配置完整,可以上报数据) */\r\n private ready = false;\r\n /** 是否正在加载远程配置 */\r\n private loading = false;\r\n /** 监控模块是否已安装 */\r\n private monitorsInstalled = false;\r\n\r\n /**\r\n * 初始化 SDK\r\n * 支持空配置初始化,后续通过 updateConfig 传入 configUrl 完成配置\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 // 如果配置了 configUrl,异步获取远程配置\r\n if (userConfig.configUrl) {\r\n this.loading = true;\r\n this.initBasic(userConfig);\r\n \r\n this.fetchRemoteConfig(userConfig.configUrl)\r\n .then((remoteConfig) => {\r\n const finalConfig = this.mergeUserConfig(remoteConfig, userConfig);\r\n \r\n if (userConfig.debug) {\r\n console.log('[Monitor] Remote config loaded:', remoteConfig);\r\n }\r\n \r\n this.activate(finalConfig);\r\n })\r\n .catch((error) => {\r\n this.loading = false;\r\n console.error('[Monitor] Failed to fetch remote config:', error);\r\n });\r\n } else if (userConfig.appId && userConfig.dsn) {\r\n // 有完整配置,直接激活\r\n this.initBasic(userConfig);\r\n this.activate(userConfig);\r\n } else {\r\n // 空配置或不完整配置,只做基础初始化,等待后续 updateConfig\r\n this.initBasic(userConfig);\r\n console.log('[Monitor] SDK initialized in pending mode. Call updateConfig({configUrl}) to activate.');\r\n }\r\n }\r\n\r\n /**\r\n * 基础初始化(安装监控模块,但不开始上报)\r\n */\r\n private initBasic(userConfig: MonitorConfig): void {\r\n // 初始化上下文\r\n const maxBreadcrumbs = userConfig.behavior?.maxBreadcrumbs || 20;\r\n context.init(maxBreadcrumbs);\r\n \r\n // 安装监控模块(早期捕获的数据会被缓存)\r\n if (!this.monitorsInstalled) {\r\n installErrorHandlers();\r\n installPerformanceMonitor();\r\n installBehaviorMonitor();\r\n this.monitorsInstalled = true;\r\n }\r\n \r\n this.initialized = true;\r\n \r\n if (userConfig.debug) {\r\n console.log('[Monitor] SDK basic initialized (monitors installed, waiting for config)');\r\n }\r\n }\r\n\r\n /**\r\n * 激活 SDK(配置完整后调用)\r\n */\r\n private activate(finalConfig: MonitorConfig): void {\r\n // 初始化配置管理器\r\n config.init({\r\n ...finalConfig,\r\n version: finalConfig.version || SDK_VERSION,\r\n }, true);\r\n\r\n this.ready = true;\r\n this.loading = false;\r\n\r\n // 通知 reporter 可以开始上报(会自动发送缓存的早期数据)\r\n reporter.setReady(true);\r\n\r\n if (config.get().debug) {\r\n console.log('[Monitor] SDK activated with config:', config.get());\r\n }\r\n }\r\n\r\n /**\r\n * 动态更新配置\r\n * 如果传入 configUrl,会从远程获取配置并激活 SDK\r\n */\r\n updateConfig(partialConfig: Partial<MonitorConfig>): void {\r\n // 如果传入了 configUrl,从远程获取配置\r\n if (partialConfig.configUrl) {\r\n console.log('[Monitor] Fetching remote config from:', partialConfig.configUrl);\r\n this.loading = true;\r\n \r\n this.fetchRemoteConfig(partialConfig.configUrl)\r\n .then((remoteConfig) => {\r\n const mergedConfig = this.mergeUserConfig(remoteConfig, partialConfig as MonitorConfig);\r\n \r\n // 移除 configUrl\r\n delete (mergedConfig as any).configUrl;\r\n \r\n if (this.ready) {\r\n // 已就绪,更新配置\r\n config.update(mergedConfig);\r\n this.loading = false;\r\n \r\n if (config.get().debug) {\r\n console.log('[Monitor] Config updated from remote:', mergedConfig);\r\n }\r\n } else {\r\n // 未就绪,激活 SDK\r\n this.activate(mergedConfig);\r\n }\r\n })\r\n .catch((error) => {\r\n this.loading = false;\r\n console.error('[Monitor] Failed to fetch remote config:', error);\r\n });\r\n } else {\r\n // 普通配置更新\r\n if (!this.ready) {\r\n console.warn('[Monitor] SDK not ready. Please provide configUrl or (appId + dsn) first.');\r\n return;\r\n }\r\n \r\n config.update(partialConfig);\r\n\r\n if (config.get().debug) {\r\n console.log('[Monitor] Config updated', partialConfig);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 从远程获取配置\r\n */\r\n private async fetchRemoteConfig(configUrl: string): Promise<Partial<MonitorConfig>> {\r\n const response = await fetch(configUrl, {\r\n method: 'GET',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n return response.json();\r\n }\r\n\r\n /**\r\n * 合并配置:远程配置为基础,用户本地配置优先\r\n */\r\n private mergeUserConfig(remote: Partial<MonitorConfig>, local: MonitorConfig): MonitorConfig {\r\n const result = { ...remote } as MonitorConfig;\r\n \r\n for (const key in local) {\r\n if (Object.prototype.hasOwnProperty.call(local, key)) {\r\n const localValue = (local as any)[key];\r\n const remoteValue = (remote as any)[key];\r\n\r\n // 跳过 configUrl\r\n if (key === 'configUrl') continue;\r\n\r\n if (\r\n localValue !== null &&\r\n localValue !== undefined &&\r\n typeof localValue === 'object' &&\r\n !Array.isArray(localValue) &&\r\n remoteValue !== null &&\r\n remoteValue !== undefined &&\r\n typeof remoteValue === 'object' &&\r\n !Array.isArray(remoteValue)\r\n ) {\r\n (result as any)[key] = { ...remoteValue, ...localValue };\r\n } else if (localValue !== undefined) {\r\n (result as any)[key] = localValue;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * 检查 SDK 是否就绪\r\n */\r\n isReady(): boolean {\r\n return this.ready;\r\n }\r\n\r\n /**\r\n * 设置用户信息\r\n */\r\n setUser(user: UserInfo): void {\r\n if (!this.ready) return;\r\n config.setUser(user);\r\n }\r\n\r\n /**\r\n * 获取当前配置\r\n */\r\n getConfig(): MonitorConfig | null {\r\n if (!this.ready) return null;\r\n return config.get();\r\n }\r\n\r\n /**\r\n * 手动上报错误\r\n */\r\n captureError(error: Error | string, extra?: Record<string, any>): void {\r\n if (!this.ready) return;\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 if (!this.ready) return;\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 if (!this.ready) return;\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 if (!this.initialized) return;\r\n context.addBreadcrumb(crumb);\r\n }\r\n\r\n /**\r\n * 立即发送缓冲区数据\r\n */\r\n flush(): void {\r\n if (!this.ready) return;\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\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 { VueMonitorPlugin } from './frameworks/vue';\r\nexport { createReactErrorBoundary, createUseMonitorError } from './frameworks/react';\r\nexport type { ErrorBoundaryProps, ErrorBoundaryState } from './frameworks/react';\r\n\r\n// 默认导出\r\nexport default monitor;\r\n"],"names":["originalFetch","SDK_VERSION"],"mappings":"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"}