error-monitor-web 1.0.0 → 1.0.1

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.mjs","sources":["../../core/dist/index.mjs","../src/blank-screen-detector.ts","../src/index.ts"],"sourcesContent":["function h() {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;\n}\nfunction l() {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;\n}\nclass g {\n constructor(e) {\n this.isInitialized = !1, this.breadcrumbs = [], this.maxBreadcrumbs = 50, this.plugins = [], this.sessionId = h(), this.config = {\n autoCapture: {\n js: !0,\n promise: !0,\n network: !0,\n resource: !0,\n console: !1\n },\n filter: {\n ignoreErrors: [],\n ignoreUrls: [],\n minLevel: \"info\"\n },\n report: {\n delay: 1e3,\n batchSize: 10\n },\n sampleRate: 1,\n errorSampleRate: 1,\n enabled: !0,\n debug: !1,\n ...e\n };\n }\n /**\n * 更新配置\n */\n updateConfig(e) {\n this.config = { ...this.config, ...e }, this.config.debug && console.log(\"[ErrorMonitor] Config updated:\", this.config);\n }\n /**\n * 启用SDK\n */\n enable() {\n this.config.enabled = !0, console.log(\"[ErrorMonitor] SDK enabled\");\n }\n /**\n * 禁用SDK\n */\n disable() {\n this.config.enabled = !1, console.log(\"[ErrorMonitor] SDK disabled\");\n }\n /**\n * 添加错误过滤器\n */\n addFilter(e) {\n this.config.filter || (this.config.filter = {}), this.config.filter.ignoreErrors || (this.config.filter.ignoreErrors = []), this.config.filter.ignoreErrors.push(e);\n }\n /**\n * 移除错误过滤器\n */\n removeFilter(e) {\n var r;\n if (!((r = this.config.filter) != null && r.ignoreErrors)) return;\n const t = this.config.filter.ignoreErrors.indexOf(e);\n t > -1 && this.config.filter.ignoreErrors.splice(t, 1);\n }\n /**\n * 设置采样率\n */\n setSampleRate(e) {\n this.config.sampleRate = Math.max(0, Math.min(1, e));\n }\n /**\n * 设置错误采样率\n */\n setErrorSampleRate(e) {\n this.config.errorSampleRate = Math.max(0, Math.min(1, e));\n }\n /**\n * 初始化监控\n */\n init() {\n if (this.isInitialized) {\n console.warn(\"[ErrorMonitor] Already initialized\");\n return;\n }\n this.isInitialized = !0, this.plugins.forEach((e) => {\n var t;\n (t = e.setup) == null || t.call(e, this);\n }), console.log(\"[ErrorMonitor] Initialized with appId:\", this.config.appId);\n }\n /**\n * 注册插件\n */\n use(e) {\n var t;\n this.plugins.push(e), this.isInitialized && ((t = e.setup) == null || t.call(e, this));\n }\n /**\n * 捕获错误(支持选项)\n */\n capture(e, t) {\n var c, d;\n if (!this.isInitialized) {\n console.warn(\"[ErrorMonitor] Not initialized\");\n return;\n }\n if (this.config.enabled === !1)\n return;\n const r = e instanceof Error ? {\n type: \"custom\",\n message: e.message,\n stack: e.stack,\n context: {}\n } : e, i = {\n level: \"error\",\n tags: {},\n extra: {},\n user: {},\n skipSampling: !1,\n skipFilter: !1,\n ...t\n };\n if (!i.skipFilter && this.shouldFilter(r)) {\n this.config.debug && console.log(\"[ErrorMonitor] Error filtered:\", r.message);\n return;\n }\n if (!i.skipSampling && this.config.errorSampleRate !== void 0 && Math.random() > this.config.errorSampleRate)\n return;\n let s = r;\n for (const n of this.plugins) {\n const a = (c = n.beforeCapture) == null ? void 0 : c.call(n, r);\n if (a === null)\n return;\n a !== void 0 && (s = a);\n }\n const o = {\n appId: this.config.appId,\n timestamp: Date.now(),\n sessionId: this.sessionId,\n eventId: l(),\n type: s.type,\n level: i.level,\n message: s.message,\n stack: s.stack,\n context: {\n userAgent: typeof navigator < \"u\" ? navigator.userAgent : \"\",\n url: typeof location < \"u\" ? location.href : \"\",\n viewport: {\n width: typeof window < \"u\" ? window.innerWidth : 0,\n height: typeof window < \"u\" ? window.innerHeight : 0\n },\n userId: i.user.id || this.config.userId,\n tags: { ...this.config.tags, ...i.tags }\n },\n breadcrumbs: [...this.breadcrumbs],\n extra: { ...s.context, ...i.extra }\n };\n for (const n of this.plugins) {\n const a = (d = n.afterCapture) == null ? void 0 : d.call(n, o);\n a !== void 0 && Object.assign(o, a);\n }\n this.report(o);\n }\n /**\n * 检查是否应该过滤此错误\n */\n shouldFilter(e) {\n var s;\n if (!this.config.filter) return !1;\n const { ignoreErrors: t, ignoreUrls: r, minLevel: i } = this.config.filter;\n if (t && t.length > 0) {\n for (const o of t)\n if (o.test(e.message))\n return !0;\n }\n if (r && r.length > 0 && ((s = e.context) != null && s.url)) {\n for (const o of r)\n if (o.test(e.context.url))\n return !0;\n }\n return !1;\n }\n /**\n * 手动上报错误(简化的API)\n */\n captureError(e, t) {\n this.capture(e, t);\n }\n /**\n * 手动上报消息\n */\n captureMessage(e, t = \"info\", r) {\n this.capture({\n type: \"custom\",\n message: e,\n context: {}\n }, { ...r, level: t });\n }\n /**\n * 上报错误\n */\n report(e) {\n var r;\n let t = e;\n for (const i of this.plugins) {\n const s = (r = i.beforeReport) == null ? void 0 : r.call(i, e);\n s !== void 0 && (t = s);\n }\n this.sendToServer(t);\n }\n /**\n * 添加面包屑\n */\n addBreadcrumb(e) {\n this.breadcrumbs.push({\n timestamp: e.timestamp || Date.now(),\n type: e.type,\n message: e.message,\n data: e.data\n }), this.breadcrumbs.length > this.maxBreadcrumbs && this.breadcrumbs.shift();\n }\n /**\n * 生成ID\n */\n generateId() {\n return l();\n }\n /**\n * 设置用户信息\n */\n setUser(e) {\n this.config.userId = e.id, this.config.tags = { ...this.config.tags, ...e };\n }\n /**\n * 发送到服务端\n */\n sendToServer(e) {\n if (typeof navigator > \"u\") return;\n const t = JSON.stringify(e);\n if (navigator.sendBeacon) {\n const r = new Blob([t], { type: \"application/json\" });\n navigator.sendBeacon(this.config.dsn, r);\n return;\n }\n typeof fetch < \"u\" && fetch(this.config.dsn, {\n method: \"POST\",\n body: t,\n keepalive: !0,\n headers: {\n \"Content-Type\": \"application/json\"\n }\n }).catch((r) => {\n console.error(\"[ErrorMonitor] Failed to send report:\", r);\n });\n }\n /**\n * 销毁实例\n */\n destroy() {\n this.plugins.forEach((e) => {\n var t;\n (t = e.teardown) == null || t.call(e);\n }), this.plugins = [], this.breadcrumbs = [], this.isInitialized = !1, console.log(\"[ErrorMonitor] Destroyed\");\n }\n}\nfunction u(f) {\n return new g(f);\n}\nexport {\n g as ErrorMonitor,\n u as createErrorMonitor\n};\n//# sourceMappingURL=index.mjs.map\n","/**\n * 白屏检测模块\n * 检测页面是否白屏(无内容渲染)\n */\n\nexport interface BlankScreenConfig {\n // 检测阈值:页面加载后多久开始检测(毫秒)\n detectionDelay?: number\n // 最小DOM元素数量阈值\n minElements?: number\n // 检测间隔(毫秒)\n checkInterval?: number\n // 最大检测次数\n maxChecks?: number\n // 是否检测Performance API\n checkPerformance?: boolean\n // 自定义检测函数\n customCheck?: () => boolean\n}\n\nexport interface BlankScreenReport {\n type: 'blank-screen'\n message: string\n context: {\n timestamp: number\n url: string\n domElements: number\n bodyElements: number\n hasContent: boolean\n performanceTiming?: {\n domContentLoaded?: number\n loadComplete?: number\n firstPaint?: number\n firstContentfulPaint?: number\n }\n }\n}\n\n/**\n * 白屏检测器类\n */\nexport class BlankScreenDetector {\n private config: Required<BlankScreenConfig>\n private checkCount: number = 0\n private timerId: number | null = null\n private isBlankScreen: boolean = false\n\n constructor(config: BlankScreenConfig = {}) {\n this.config = {\n detectionDelay: config.detectionDelay || 3000, // 3秒后开始检测\n minElements: config.minElements || 10, // 最少10个元素\n checkInterval: config.checkInterval || 1000, // 每秒检测一次\n maxChecks: config.maxChecks || 5, // 最多检测5次\n checkPerformance: config.checkPerformance !== false,\n customCheck: config.customCheck || (() => false)\n }\n }\n\n /**\n * 开始检测\n */\n start(callback: (report: BlankScreenReport) => void): void {\n console.log('[BlankScreenDetector] Starting blank screen detection...')\n console.log('[BlankScreenDetector] Config:', this.config)\n\n // 延迟开始检测,等待页面加载\n setTimeout(() => {\n console.log('[BlankScreenDetector] Detection delay passed, starting first check...')\n this.performCheck(callback)\n }, this.config.detectionDelay)\n }\n\n /**\n * 执行检测\n */\n private performCheck(callback: (report: BlankScreenReport) => void): void {\n this.checkCount++\n console.log(`[BlankScreenDetector] Check #${this.checkCount}/${this.config.maxChecks}`)\n\n const isBlank = this.checkIfBlank()\n console.log('[BlankScreenDetector] Is blank screen?', isBlank)\n\n if (isBlank && !this.isBlankScreen) {\n // 首次检测到白屏\n console.log('[BlankScreenDetector] Blank screen detected for the first time!')\n this.isBlankScreen = true\n const report = this.generateReport()\n console.log('[BlankScreenDetector] Generated report:', report)\n callback(report)\n }\n\n // 如果还未达到最大检测次数,继续检测\n if (this.checkCount < this.config.maxChecks && !isBlank) {\n this.timerId = window.setTimeout(() => {\n this.performCheck(callback)\n }, this.config.checkInterval)\n console.log(`[BlankScreenDetector] Scheduling next check in ${this.config.checkInterval}ms`)\n } else {\n console.log('[BlankScreenDetector] Stopping checks. Count:', this.checkCount, 'Is blank:', isBlank)\n }\n }\n\n /**\n * 检查是否白屏\n */\n private checkIfBlank(): boolean {\n // 1. 检查自定义检测函数\n if (this.config.customCheck()) {\n console.log('[BlankScreenDetector] Custom check returned true')\n return true\n }\n\n // 2. 检查DOM元素数量\n const domCheck = this.checkDOMElements()\n console.log('[BlankScreenDetector] DOM check result:', domCheck)\n if (domCheck.isBlank) {\n console.log('[BlankScreenDetector] DOM check indicates blank screen')\n return true\n }\n\n // 3. 检查Performance API\n if (this.config.checkPerformance) {\n const perfCheck = this.checkPerformanceTiming()\n console.log('[BlankScreenDetector] Performance check result:', perfCheck)\n if (perfCheck.isBlank) {\n console.log('[BlankScreenDetector] Performance check indicates blank screen')\n return true\n }\n }\n\n console.log('[BlankScreenDetector] All checks passed, not a blank screen')\n return false\n }\n\n /**\n * 检查DOM元素\n */\n private checkDOMElements(): { isBlank: boolean; info: any } {\n const totalElements = document.querySelectorAll('*').length\n const bodyElements = document.body?.children.length || 0\n\n // 检查body是否存在且不为空\n const hasBody = !!document.body\n const hasContent = bodyElements > 0\n\n // 排除测试相关的元素(blank-page, minimal-page, temp-status等)\n const testElements = document.querySelectorAll('#blank-page, #minimal-page, #temp-status').length\n\n // 排除script标签(测试时script标签不算作内容)\n const scriptElements = document.querySelectorAll('script').length\n\n const elementsWithoutTestAndScripts = totalElements - testElements - scriptElements\n\n // 改进的白屏判断:排除测试元素和script后仍然很少,才认为是白屏\n const isBlank = !hasBody || elementsWithoutTestAndScripts < this.config.minElements || !hasContent\n\n const info = {\n totalElements,\n bodyElements,\n hasBody,\n hasContent,\n testElements,\n scriptElements,\n elementsWithoutTestAndScripts,\n minElements: this.config.minElements\n }\n\n console.log('[BlankScreenDetector] 详细DOM信息:', info)\n\n return {\n isBlank,\n info\n }\n }\n\n /**\n * 检查Performance API\n */\n private checkPerformanceTiming(): { isBlank: boolean; timing?: any } {\n if (!window.performance || !window.performance.timing) {\n return { isBlank: false }\n }\n\n const timing = window.performance.timing\n const navigationStart = timing.navigationStart\n\n const domContentLoaded = timing.domContentLoadedEventEnd - navigationStart\n const loadComplete = timing.loadEventEnd - navigationStart\n\n // 获取首次绘制时间\n let firstPaint: number | undefined\n let firstContentfulPaint: number | undefined\n\n const perfEntries = performance.getEntriesByType?.('paint') as PerformanceEntry[]\n if (perfEntries) {\n const fp = perfEntries.find(e => e.name === 'first-paint')\n const fcp = perfEntries.find(e => e.name === 'first-contentful-paint')\n firstPaint = fp?.startTime\n firstContentfulPaint = fcp?.startTime\n }\n\n // 如果页面加载完成但没有任何绘制,可能是白屏\n const isBlank =\n loadComplete > 0 &&\n (firstPaint === undefined || firstContentfulPaint === undefined) &&\n domContentLoaded > 5000 // DOM加载超过5秒但没有绘制\n\n return {\n isBlank,\n timing: {\n domContentLoaded,\n loadComplete,\n firstPaint,\n firstContentfulPaint\n }\n }\n }\n\n /**\n * 生成报告\n */\n private generateReport(): BlankScreenReport {\n const domInfo = this.checkDOMElements()\n const perfInfo = this.config.checkPerformance ? this.checkPerformanceTiming() : {}\n\n return {\n type: 'blank-screen',\n message: '检测到白屏:页面加载后无内容渲染',\n context: {\n timestamp: Date.now(),\n url: window.location.href,\n domElements: document.querySelectorAll('*').length,\n bodyElements: document.body?.children.length || 0,\n hasContent: domInfo.info.hasContent,\n performanceTiming: perfInfo.timing\n }\n }\n }\n\n /**\n * 停止检测\n */\n stop(): void {\n console.log('[BlankScreenDetector] Stopping blank screen detection...')\n if (this.timerId !== null) {\n window.clearTimeout(this.timerId)\n this.timerId = null\n console.log('[BlankScreenDetector] Cleared timeout timer')\n }\n console.log('[BlankScreenDetector] Blank screen detection stopped')\n }\n\n /**\n * 重置检测器\n */\n reset(): void {\n this.stop()\n this.checkCount = 0\n this.isBlankScreen = false\n }\n}\n\n/**\n * 创建白屏检测器实例\n */\nexport function createBlankScreenDetector(config?: BlankScreenConfig): BlankScreenDetector {\n return new BlankScreenDetector(config)\n}\n","/**\n * Error Monitor Web\n * Web端错误监控模块\n */\n\nimport { ErrorMonitor, Config } from 'error-monitor-core'\nimport {\n BlankScreenDetector,\n BlankScreenConfig,\n createBlankScreenDetector\n} from './blank-screen-detector'\n\n// 导出核心\nexport { ErrorMonitor } from 'error-monitor-core'\nexport type { Config, Plugin, Breadcrumb } from 'error-monitor-core'\n\n// 导出白屏检测\nexport { BlankScreenDetector, createBlankScreenDetector }\nexport type { BlankScreenConfig, BlankScreenReport } from './blank-screen-detector'\n\n/**\n * Web端配置\n */\nexport interface WebConfig extends Config {\n // 是否自动捕获全局错误 (已弃用,请使用 autoCapture)\n captureJsErrors?: boolean\n // 是否捕获Promise错误 (已弃用,请使用 autoCapture)\n capturePromiseErrors?: boolean\n // 是否捕获网络错误 (已弃用,请使用 autoCapture)\n captureNetworkErrors?: boolean\n // 是否捕获资源加载错误 (已弃用,请使用 autoCapture)\n captureResourceErrors?: boolean\n // 是否启用白屏检测\n blankScreenDetection?: boolean | BlankScreenConfig\n // 自定义上报函数\n customReporter?: (data: any) => void\n}\n\n/**\n * Web端错误监控类\n */\nexport class ErrorMonitorWeb extends ErrorMonitor {\n protected config: WebConfig\n private originalFetch: typeof fetch | null = null\n private originalXHR: typeof XMLHttpRequest | null = null\n private blankScreenDetector: BlankScreenDetector | null = null\n\n constructor(config: WebConfig) {\n super(config)\n this.config = config\n }\n\n /**\n * 初始化Web端监控\n */\n init(): void {\n super.init()\n\n if (typeof window === 'undefined') {\n console.warn('[ErrorMonitorWeb] Not in browser environment')\n return\n }\n\n // 支持新旧两种配置格式\n // 新格式: autoCapture.js\n // 旧格式: captureJsErrors\n const captureJs = this.config.autoCapture?.js !== false && this.config.captureJsErrors !== false\n const capturePromise = this.config.autoCapture?.promise !== false && this.config.capturePromiseErrors !== false\n const captureNetwork = this.config.autoCapture?.network !== false && this.config.captureNetworkErrors !== false\n const captureResource = this.config.autoCapture?.resource !== false && this.config.captureResourceErrors !== false\n\n // 自动捕获各种错误\n if (captureJs) {\n this.setupJsErrorHandler()\n }\n\n if (capturePromise) {\n this.setupPromiseErrorHandler()\n }\n\n if (captureNetwork) {\n this.setupNetworkErrorHandler()\n }\n\n if (captureResource) {\n this.setupResourceErrorHandler()\n }\n\n // 初始化白屏检测\n if (this.config.blankScreenDetection) {\n this.setupBlankScreenDetection()\n }\n\n console.log('[ErrorMonitorWeb] Web handlers initialized')\n }\n\n /**\n * JavaScript错误处理\n */\n private setupJsErrorHandler(): void {\n window.addEventListener('error', (event) => {\n this.capture({\n type: 'js',\n message: event.message,\n stack: event.error?.stack,\n context: {\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno\n }\n })\n })\n }\n\n /**\n * Promise错误处理\n */\n private setupPromiseErrorHandler(): void {\n window.addEventListener('unhandledrejection', (event) => {\n this.capture({\n type: 'promise',\n message: event.reason?.message || String(event.reason),\n stack: event.reason?.stack,\n context: {\n reason: event.reason\n }\n })\n })\n }\n\n /**\n * 网络请求错误处理\n */\n private setupNetworkErrorHandler(): void {\n // 拦截fetch\n if (typeof window.fetch !== 'undefined') {\n this.originalFetch = window.fetch\n const self = this\n\n window.fetch = function (...args: Parameters<typeof fetch>) {\n return self.originalFetch!\n .apply(this, args as any)\n .catch((error) => {\n const url = typeof args[0] === 'string' ? args[0] : String(args[0])\n const method = args[1]?.method || 'GET'\n\n self.capture({\n type: 'network',\n message: `Network error: ${method} ${url}`,\n context: {\n url,\n method,\n error: error.message\n }\n })\n\n throw error\n })\n }\n }\n\n // 拦截XMLHttpRequest(简化版)\n if (typeof window.XMLHttpRequest !== 'undefined') {\n this.originalXHR = window.XMLHttpRequest\n const self = this\n\n const OriginalXHR = this.originalXHR\n window.XMLHttpRequest = function () {\n const xhr = new OriginalXHR()\n const originalOpen = xhr.open\n const originalSend = xhr.send\n let url = ''\n let method = ''\n\n xhr.open = function (...args: any[]) {\n method = args[0] || 'GET'\n url = String(args[1] || '')\n return originalOpen.apply(this, args as any)\n }\n\n xhr.send = function (...args: any[]) {\n xhr.addEventListener('error', () => {\n self.capture({\n type: 'network',\n message: `XHR error: ${method} ${url}`,\n context: {\n url,\n method,\n status: xhr.status\n }\n })\n })\n\n return originalSend.apply(this, args as any)\n }\n\n return xhr\n } as any\n }\n }\n\n /**\n * 资源加载错误处理\n */\n private setupResourceErrorHandler(): void {\n window.addEventListener('error', (event) => {\n if (event.target !== window) {\n const target = event.target as HTMLElement\n this.capture({\n type: 'resource',\n message: `Resource load error: ${target.tagName}`,\n context: {\n tagName: target.tagName,\n src: (target as any).src || (target as any).href\n }\n })\n }\n }, true)\n }\n\n /**\n * 白屏检测\n */\n private setupBlankScreenDetection(): void {\n console.log('[ErrorMonitorWeb] Setting up blank screen detection...')\n const config =\n typeof this.config.blankScreenDetection === 'boolean'\n ? {}\n : this.config.blankScreenDetection\n\n console.log('[ErrorMonitorWeb] Blank screen config:', config)\n this.blankScreenDetector = createBlankScreenDetector(config)\n\n this.blankScreenDetector.start((report) => {\n console.log('[ErrorMonitorWeb] Blank screen detected!', report)\n this.capture({\n type: report.type,\n message: report.message,\n context: report.context\n })\n })\n\n console.log('[ErrorMonitorWeb] Blank screen detection started')\n }\n\n /**\n * 手动上报错误\n */\n captureError(error: Error, context?: Record<string, any>): void {\n this.capture({\n type: 'custom',\n message: error.message,\n stack: error.stack,\n context\n })\n }\n\n /**\n * 手动上报消息\n */\n captureMessage(message: string, level: string = 'info'): void {\n this.capture({\n type: 'custom',\n message,\n context: { level }\n })\n }\n\n /**\n * 销毁实例\n */\n destroy(): void {\n console.log('[ErrorMonitorWeb] Destroying instance...')\n\n // 停止白屏检测\n if (this.blankScreenDetector) {\n console.log('[ErrorMonitorWeb] Stopping blank screen detector...')\n this.blankScreenDetector.stop()\n this.blankScreenDetector = null\n }\n\n // 恢复原生方法\n if (this.originalFetch && window.fetch !== this.originalFetch) {\n window.fetch = this.originalFetch\n }\n\n if (this.originalXHR && window.XMLHttpRequest !== this.originalXHR) {\n window.XMLHttpRequest = this.originalXHR\n }\n\n super.destroy()\n\n console.log('[ErrorMonitorWeb] Instance destroyed')\n }\n}\n\n/**\n * 创建Web端实例工厂函数\n */\nexport function createErrorMonitorWeb(config: WebConfig): ErrorMonitorWeb {\n return new ErrorMonitorWeb(config)\n}\n\n// 默认导出\nexport default ErrorMonitorWeb\n"],"names":["h","l","g","r","t","c","d","i","n","o","s","BlankScreenDetector","config","callback","isBlank","report","domCheck","perfCheck","_a","totalElements","bodyElements","hasBody","hasContent","testElements","scriptElements","elementsWithoutTestAndScripts","info","timing","navigationStart","domContentLoaded","loadComplete","firstPaint","firstContentfulPaint","perfEntries","fp","e","fcp","domInfo","perfInfo","createBlankScreenDetector","ErrorMonitorWeb","ErrorMonitor","_b","_c","_d","captureJs","capturePromise","captureNetwork","captureResource","event","self","args","error","url","method","OriginalXHR","xhr","originalOpen","originalSend","target","context","message","level","createErrorMonitorWeb"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../core/dist/index.mjs","../src/blank-screen-constants.ts","../src/blank-screen-detector.ts","../src/performance-monitor.ts","../src/index.ts"],"sourcesContent":["class p {\n constructor(e = !0, t = 1) {\n this.level = e ? t : 4;\n }\n /**\n * 设置日志级别\n */\n setLevel(e) {\n this.level = e;\n }\n /**\n * 启用/禁用日志\n */\n setEnabled(e) {\n this.level = e ? 1 : 4;\n }\n /**\n * 获取当前日志级别\n */\n getLevel() {\n return this.level;\n }\n /**\n * 输出DEBUG级别日志\n */\n debug(...e) {\n this.level <= 0 && console.log(\"[ErrorMonitor:DEBUG]\", ...e);\n }\n /**\n * 输出INFO级别日志\n */\n info(...e) {\n this.level <= 1 && console.info(\"[ErrorMonitor:INFO]\", ...e);\n }\n /**\n * 输出WARN级别日志\n */\n warn(...e) {\n this.level <= 2 && console.warn(\"[ErrorMonitor:WARN]\", ...e);\n }\n /**\n * 输出ERROR级别日志\n */\n error(...e) {\n this.level <= 3 && console.error(\"[ErrorMonitor:ERROR]\", ...e);\n }\n}\nconst m = {\n /** 最大面包屑数量 */\n MAX_SIZE: 50\n}, c = {\n /** 默认总体采样率 */\n DEFAULT_RATE: 1,\n /** 最小采样率 */\n MIN_RATE: 0,\n /** 最大采样率 */\n MAX_RATE: 1\n}, l = {\n /** 默认上报延迟(毫秒) */\n DEFAULT_DELAY: 1e3,\n /** 默认批量上报数量 */\n DEFAULT_BATCH_SIZE: 10\n}, u = {\n /** 默认启用状态 */\n ENABLED: !0,\n /** 默认调试模式 */\n DEBUG: !1\n};\nclass y {\n constructor(e, t) {\n this.queue = [], this.timerId = null, this.config = {\n batchSize: e.batchSize || 10,\n delay: e.delay || 1e3,\n enabled: e.enabled !== !1\n }, this.sender = t, typeof window < \"u\" && (window.addEventListener(\"pagehide\", () => this.flush()), window.addEventListener(\"beforeunload\", () => this.flush()));\n }\n /**\n * 添加报告到队列\n */\n add(e) {\n if (!this.config.enabled) {\n this.sender([e]);\n return;\n }\n this.queue.push({\n report: e,\n timestamp: Date.now()\n }), this.queue.length >= this.config.batchSize ? this.flush() : this.scheduleFlush();\n }\n /**\n * 安排延迟上报\n */\n scheduleFlush() {\n this.timerId === null && (this.timerId = window.setTimeout(() => {\n this.flush();\n }, this.config.delay));\n }\n /**\n * 立即上报队列中的所有报告\n */\n flush() {\n if (this.timerId !== null && (window.clearTimeout(this.timerId), this.timerId = null), this.queue.length === 0)\n return;\n const e = this.queue.map((t) => t.report);\n this.sendReports(e), this.queue = [];\n }\n /**\n * 发送报告\n */\n sendReports(e) {\n try {\n const t = this.sender(e);\n t instanceof Promise && t.catch((i) => {\n console.error(\"[BatchQueue] Failed to send reports:\", i);\n });\n } catch (t) {\n console.error(\"[BatchQueue] Error sending reports:\", t);\n }\n }\n /**\n * 获取当前队列大小\n */\n size() {\n return this.queue.length;\n }\n /**\n * 清空队列\n */\n clear() {\n this.queue = [], this.timerId !== null && (window.clearTimeout(this.timerId), this.timerId = null);\n }\n /**\n * 更新配置\n */\n updateConfig(e) {\n this.config = { ...this.config, ...e };\n }\n /**\n * 销毁队列\n */\n destroy() {\n this.flush(), typeof window < \"u\" && (window.removeEventListener(\"pagehide\", () => this.flush()), window.removeEventListener(\"beforeunload\", () => this.flush()));\n }\n}\nclass E {\n constructor(e, t) {\n this.cacheQueue = [], this.config = {\n maxCacheSize: e.maxCacheSize || 100,\n enabled: e.enabled !== !1,\n storageKey: e.storageKey || \"error_monitor_cache\"\n }, this.sender = t, this.isOnline = typeof navigator < \"u\" ? navigator.onLine : !0, this.loadFromStorage(), typeof window < \"u\" && (window.addEventListener(\"online\", () => this.handleOnline()), window.addEventListener(\"offline\", () => this.handleOffline()));\n }\n /**\n * 缓存错误报告\n */\n cache(e) {\n if (!this.config.enabled)\n return;\n const t = {\n report: e,\n timestamp: Date.now(),\n retryCount: 0\n };\n this.cacheQueue.push(t), this.cacheQueue.length > this.config.maxCacheSize && this.cacheQueue.shift(), this.saveToStorage();\n }\n /**\n * 立即发送报告(如果在线)\n */\n send(e) {\n this.isOnline ? this.sender(e) : this.cache(e);\n }\n /**\n * 处理网络恢复\n */\n handleOnline() {\n this.isOnline = !0, console.log(\"[OfflineCache] Network restored, flushing cache...\"), this.flush();\n }\n /**\n * 处理网络断开\n */\n handleOffline() {\n this.isOnline = !1, console.log(\"[OfflineCache] Network disconnected, enabling offline cache\");\n }\n /**\n * 刷新缓存:重试所有缓存的报告\n */\n async flush() {\n if (this.cacheQueue.length === 0)\n return;\n const e = [...this.cacheQueue], t = [];\n for (const i of e)\n try {\n await this.sender(i.report);\n const s = this.cacheQueue.indexOf(i);\n s > -1 && this.cacheQueue.splice(s, 1);\n } catch {\n if (i.retryCount++, i.retryCount > 3) {\n console.error(\"[OfflineCache] Max retry count exceeded, dropping report:\", i.report);\n const r = this.cacheQueue.indexOf(i);\n r > -1 && this.cacheQueue.splice(r, 1);\n } else\n t.push(i);\n }\n this.saveToStorage(), t.length > 0 && console.warn(`[OfflineCache] ${t.length} reports failed to send, will retry later`);\n }\n /**\n * 保存到localStorage\n */\n saveToStorage() {\n if (!(typeof localStorage > \"u\"))\n try {\n localStorage.setItem(this.config.storageKey, JSON.stringify(this.cacheQueue));\n } catch (e) {\n console.error(\"[OfflineCache] Failed to save to localStorage:\", e);\n }\n }\n /**\n * 从localStorage加载\n */\n loadFromStorage() {\n if (!(typeof localStorage > \"u\"))\n try {\n const e = localStorage.getItem(this.config.storageKey);\n e && (this.cacheQueue = JSON.parse(e), console.log(`[OfflineCache] Loaded ${this.cacheQueue.length} cached reports from storage`));\n } catch (e) {\n console.error(\"[OfflineCache] Failed to load from localStorage:\", e), this.cacheQueue = [];\n }\n }\n /**\n * 清空缓存\n */\n clear() {\n this.cacheQueue = [], this.saveToStorage();\n }\n /**\n * 获取缓存大小\n */\n size() {\n return this.cacheQueue.length;\n }\n /**\n * 检查是否在线\n */\n online() {\n return this.isOnline;\n }\n /**\n * 销毁缓存\n */\n destroy() {\n this.saveToStorage(), typeof window < \"u\" && (window.removeEventListener(\"online\", () => this.handleOnline()), window.removeEventListener(\"offline\", () => this.handleOffline()));\n }\n}\nfunction b() {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;\n}\nfunction g() {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;\n}\nclass w {\n constructor(e) {\n this.head = 0, this.tail = 0, this._size = 0, this.capacity = e, this.buffer = new Array(e);\n }\n /**\n * 添加元素到缓冲区(O(1)时间复杂度)\n */\n push(e) {\n this.buffer[this.tail] = e, this.tail = (this.tail + 1) % this.capacity, this._size < this.capacity ? this._size++ : this.head = (this.head + 1) % this.capacity;\n }\n /**\n * 获取所有元素(按插入顺序)\n */\n toArray() {\n const e = [];\n for (let t = 0; t < this._size; t++) {\n const i = (this.head + t) % this.capacity, s = this.buffer[i];\n s !== void 0 && e.push(s);\n }\n return e;\n }\n /**\n * 获取当前大小\n */\n getSize() {\n return this._size;\n }\n /**\n * 清空缓冲区\n */\n clear() {\n this.buffer = new Array(this.capacity), this.head = 0, this.tail = 0, this._size = 0;\n }\n /**\n * 兼容性属性:获取当前大小\n */\n get length() {\n return this._size;\n }\n /**\n * 兼容性:数组索引访问(只读)\n */\n get(e) {\n if (e < 0 || e >= this._size)\n return;\n const t = (this.head + e) % this.capacity;\n return this.buffer[t];\n }\n}\nclass v {\n constructor(e) {\n this.isInitialized = !1, this.maxBreadcrumbs = m.MAX_SIZE, this.plugins = [], this.sessionId = b(), this.batchQueue = null, this.offlineCache = null, this.config = {\n autoCapture: {\n js: !0,\n promise: !0,\n network: !0,\n resource: !0,\n console: !1\n },\n filter: {\n ignoreErrors: [],\n ignoreUrls: [],\n minLevel: \"info\"\n },\n report: {\n delay: l.DEFAULT_DELAY,\n batchSize: l.DEFAULT_BATCH_SIZE\n },\n sampleRate: c.DEFAULT_RATE,\n errorSampleRate: c.DEFAULT_RATE,\n enabled: u.ENABLED,\n debug: u.DEBUG,\n ...e\n }, this.logger = new p(this.config.enabled, this.config.debug ? 0 : 1), this.breadcrumbs = new w(this.maxBreadcrumbs), this.config.report && (this.batchQueue = new y(\n {\n batchSize: this.config.report.batchSize || l.DEFAULT_BATCH_SIZE,\n delay: this.config.report.delay || l.DEFAULT_DELAY,\n enabled: !0\n },\n (t) => this.sendBatchToServer(t)\n )), this.offlineCache = new E(\n {\n maxCacheSize: 100,\n enabled: !0,\n storageKey: `error_monitor_cache_${this.config.appId}`\n },\n (t) => this.sendToServerDirectly(t)\n );\n }\n /**\n * 更新配置\n */\n updateConfig(e) {\n this.config = { ...this.config, ...e }, this.logger.debug(\"Config updated:\", this.config);\n }\n /**\n * 启用SDK\n */\n enable() {\n this.config.enabled = !0, this.logger.setEnabled(!0), this.logger.info(\"SDK enabled\");\n }\n /**\n * 禁用SDK\n */\n disable() {\n this.config.enabled = !1, this.logger.setEnabled(!1), this.logger.info(\"SDK disabled\");\n }\n /**\n * 添加错误过滤器\n */\n addFilter(e) {\n this.config.filter || (this.config.filter = {}), this.config.filter.ignoreErrors || (this.config.filter.ignoreErrors = []), this.config.filter.ignoreErrors.push(e);\n }\n /**\n * 移除错误过滤器\n */\n removeFilter(e) {\n var i;\n if (!((i = this.config.filter) != null && i.ignoreErrors)) return;\n const t = this.config.filter.ignoreErrors.indexOf(e);\n t > -1 && this.config.filter.ignoreErrors.splice(t, 1);\n }\n /**\n * 设置采样率\n */\n setSampleRate(e) {\n this.config.sampleRate = Math.max(c.MIN_RATE, Math.min(c.MAX_RATE, e));\n }\n /**\n * 设置错误采样率\n */\n setErrorSampleRate(e) {\n this.config.errorSampleRate = Math.max(c.MIN_RATE, Math.min(c.MAX_RATE, e));\n }\n /**\n * 初始化监控\n */\n init() {\n if (this.isInitialized) {\n this.logger.warn(\"Already initialized\");\n return;\n }\n this.isInitialized = !0, this.plugins.forEach((e) => {\n var t;\n (t = e.setup) == null || t.call(e, this);\n }), this.logger.info(\"Initialized with appId:\", this.config.appId);\n }\n /**\n * 注册插件\n */\n use(e) {\n var t;\n this.plugins.push(e), this.isInitialized && ((t = e.setup) == null || t.call(e, this));\n }\n /**\n * 捕获错误(支持选项)\n */\n capture(e, t) {\n var f, d;\n if (!this.isInitialized) {\n this.logger.warn(\"Not initialized\");\n return;\n }\n if (this.config.enabled === !1)\n return;\n const i = e instanceof Error ? {\n type: \"custom\",\n message: e.message,\n stack: e.stack,\n context: {}\n } : e, s = {\n level: \"error\",\n tags: {},\n extra: {},\n user: {},\n skipSampling: !1,\n skipFilter: !1,\n ...t\n };\n if (!s.skipFilter && this.shouldFilter(i)) {\n this.logger.debug(\"Error filtered:\", i.message);\n return;\n }\n if (!s.skipSampling && this.config.errorSampleRate !== void 0 && Math.random() > this.config.errorSampleRate)\n return;\n let r = i;\n for (const n of this.plugins) {\n const h = (f = n.beforeCapture) == null ? void 0 : f.call(n, i);\n if (h === null)\n return;\n h !== void 0 && (r = h);\n }\n const o = {\n appId: this.config.appId,\n timestamp: Date.now(),\n sessionId: this.sessionId,\n eventId: g(),\n type: r.type,\n level: s.level,\n message: r.message,\n stack: r.stack,\n context: {\n userAgent: typeof navigator < \"u\" ? navigator.userAgent : \"\",\n url: typeof location < \"u\" ? location.href : \"\",\n viewport: {\n width: typeof window < \"u\" ? window.innerWidth : 0,\n height: typeof window < \"u\" ? window.innerHeight : 0\n },\n userId: s.user.id || this.config.userId,\n tags: { ...this.config.tags, ...s.tags }\n },\n breadcrumbs: this.breadcrumbs.toArray(),\n extra: { ...r.context, ...s.extra }\n };\n for (const n of this.plugins) {\n const h = (d = n.afterCapture) == null ? void 0 : d.call(n, o);\n h !== void 0 && Object.assign(o, h);\n }\n this.report(o);\n }\n /**\n * 检查是否应该过滤此错误\n */\n shouldFilter(e) {\n var r;\n if (!this.config.filter) return !1;\n const { ignoreErrors: t, ignoreUrls: i, minLevel: s } = this.config.filter;\n if (t && t.length > 0) {\n for (const o of t)\n if (o.test(e.message))\n return !0;\n }\n if (i && i.length > 0 && ((r = e.context) != null && r.url)) {\n for (const o of i)\n if (o.test(e.context.url))\n return !0;\n }\n return !1;\n }\n /**\n * 手动上报错误(简化的API)\n */\n captureError(e, t) {\n this.capture(e, t);\n }\n /**\n * 手动上报消息\n */\n captureMessage(e, t = \"info\", i) {\n this.capture({\n type: \"custom\",\n message: e,\n context: {}\n }, { ...i, level: t });\n }\n /**\n * 上报错误\n */\n report(e) {\n var i, s;\n let t = e;\n for (const r of this.plugins) {\n const o = (i = r.beforeReport) == null ? void 0 : i.call(r, e);\n o !== void 0 && (t = o);\n }\n this.batchQueue && ((s = this.config.report) == null ? void 0 : s.batchSize) !== 1 ? this.batchQueue.add(t) : this.sendToServer(t);\n }\n /**\n * 添加面包屑(使用环形缓冲区,O(1)性能)\n */\n addBreadcrumb(e) {\n this.breadcrumbs.push({\n timestamp: e.timestamp || Date.now(),\n type: e.type,\n message: e.message,\n data: e.data\n });\n }\n /**\n * 生成ID\n */\n generateId() {\n return g();\n }\n /**\n * 设置用户信息\n */\n setUser(e) {\n this.config.userId = e.id, this.config.tags = { ...this.config.tags, ...e };\n }\n /**\n * 发送到服务端(通过离线缓存)\n */\n sendToServer(e) {\n this.offlineCache ? this.offlineCache.send(e) : this.sendToServerDirectly(e);\n }\n /**\n * 直接发送到服务端(不经过离线缓存)\n */\n sendToServerDirectly(e) {\n var i;\n if ((i = this.config.report) != null && i.customReporter) {\n this.config.report.customReporter(e);\n return;\n }\n if (typeof navigator > \"u\") return;\n const t = JSON.stringify(e);\n if (navigator.sendBeacon) {\n const s = new Blob([t], { type: \"application/json\" });\n navigator.sendBeacon(this.config.dsn, s);\n return;\n }\n typeof fetch < \"u\" && fetch(this.config.dsn, {\n method: \"POST\",\n body: t,\n keepalive: !0,\n headers: {\n \"Content-Type\": \"application/json\"\n }\n }).catch((s) => {\n this.logger.error(\"Failed to send report:\", s);\n });\n }\n /**\n * 批量发送到服务端\n */\n sendBatchToServer(e) {\n var i;\n if ((i = this.config.report) != null && i.customReporter) {\n const s = { reports: e };\n this.config.report.customReporter(s);\n return;\n }\n if (typeof navigator > \"u\") return;\n const t = JSON.stringify({ reports: e });\n if (navigator.sendBeacon) {\n const s = new Blob([t], { type: \"application/json\" });\n navigator.sendBeacon(this.config.dsn, s);\n return;\n }\n typeof fetch < \"u\" && fetch(this.config.dsn, {\n method: \"POST\",\n body: t,\n keepalive: !0,\n headers: {\n \"Content-Type\": \"application/json\"\n }\n }).catch((s) => {\n this.logger.error(\"Failed to send batch reports:\", s);\n });\n }\n /**\n * 销毁实例\n */\n destroy() {\n this.batchQueue && (this.batchQueue.destroy(), this.batchQueue = null), this.offlineCache && (this.offlineCache.destroy(), this.offlineCache = null), this.plugins.forEach((e) => {\n var t;\n (t = e.teardown) == null || t.call(e);\n }), this.plugins = [], this.breadcrumbs.clear(), this.isInitialized = !1, this.logger.info(\"Destroyed\");\n }\n}\nfunction S(a) {\n return new v(a);\n}\nexport {\n v as ErrorMonitor,\n p as Logger,\n S as createErrorMonitor\n};\n//# sourceMappingURL=index.mjs.map\n","/**\n * 白屏检测配置常量\n * 集中管理所有魔数和默认配置值\n */\n\n/**\n * 检测时间相关常量(毫秒)\n */\nexport const TIMING = {\n /** 默认检测延迟:页面加载后多久开始检测 */\n DEFAULT_DETECTION_DELAY: 3000,\n /** 默认检测间隔 */\n DEFAULT_CHECK_INTERVAL: 1000\n} as const\n\n/**\n * 检测阈值常量\n */\nexport const THRESHOLDS = {\n /** 最小DOM元素数量阈值 */\n DEFAULT_MIN_ELEMENTS: 10,\n /** 默认最大检测次数 */\n DEFAULT_MAX_CHECKS: 5,\n /** TreeWalker最大检查节点数(性能优化) */\n MAX_CHECK_NODES: 100\n} as const\n\n/**\n * DOM元素过滤常量\n */\nexport const DOM_FILTER = {\n /** 需要跳过的非内容标签名 */\n SKIP_TAGS: ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEMPLATE', 'META', 'LINK'] as const,\n /** 需要跳过的测试元素ID */\n SKIP_TEST_IDS: ['blank-page', 'minimal-page', 'temp-status'] as const\n} as const\n\n/**\n * 日志级别常量\n */\nexport const LOG_LEVEL = {\n /** 默认日志级别(2=WARN,减少生产环境日志输出) */\n DEFAULT: 2\n} as const\n","/**\n * 白屏检测模块(优化版)\n * 检测页面是否白屏(无内容渲染)\n */\n\nimport { Logger } from 'error-monitor-core'\nimport { TIMING, THRESHOLDS, DOM_FILTER, LOG_LEVEL } from './blank-screen-constants'\n\nexport interface BlankScreenConfig {\n // 检测阈值:页面加载后多久开始检测(毫秒)\n detectionDelay?: number\n // 最小DOM元素数量阈值\n minElements?: number\n // 检测间隔(毫秒)\n checkInterval?: number\n // 最大检测次数\n maxChecks?: number\n // 是否检测Performance API\n checkPerformance?: boolean\n // 自定义检测函数\n customCheck?: () => boolean\n}\n\nexport interface BlankScreenReport {\n type: 'blank-screen'\n message: string\n context: {\n timestamp: number\n url: string\n domElements: number\n bodyElements: number\n hasContent: boolean\n performanceTiming?: {\n domContentLoaded?: number\n loadComplete?: number\n firstPaint?: number\n firstContentfulPaint?: number\n }\n }\n}\n\n/**\n * 白屏检测器类(优化版)\n */\nexport class BlankScreenDetector {\n private config: Required<BlankScreenConfig>\n private checkCount: number = 0\n private timerId: number | null = null\n private isBlankScreen: boolean = false\n private logger: Logger\n\n constructor(config: BlankScreenConfig = {}) {\n this.config = {\n detectionDelay: config.detectionDelay || TIMING.DEFAULT_DETECTION_DELAY,\n minElements: config.minElements || THRESHOLDS.DEFAULT_MIN_ELEMENTS,\n checkInterval: config.checkInterval || TIMING.DEFAULT_CHECK_INTERVAL,\n maxChecks: config.maxChecks || THRESHOLDS.DEFAULT_MAX_CHECKS,\n checkPerformance: config.checkPerformance !== false,\n customCheck: config.customCheck || (() => false)\n }\n\n // 初始化日志系统(默认只在debug模式输出)\n // @ts-ignore - LogLevel enum\n this.logger = new Logger(true, LOG_LEVEL.DEFAULT) // 2=WARN\n }\n\n /**\n * 设置日志级别\n */\n // @ts-ignore\n setLogLevel(level: number): void {\n this.logger.setLevel(level)\n }\n\n /**\n * 开始检测\n */\n start(callback: (report: BlankScreenReport) => void): void {\n this.logger.debug('Starting blank screen detection...')\n this.logger.debug('Config:', this.config)\n\n // 延迟开始检测,等待页面加载\n this.timerId = window.setTimeout(() => {\n this.logger.debug('Detection delay passed, starting first check...')\n this.performCheck(callback)\n }, this.config.detectionDelay)\n }\n\n /**\n * 执行检测\n */\n private performCheck(callback: (report: BlankScreenReport) => void): void {\n this.checkCount++\n this.logger.debug(`Check #${this.checkCount}/${this.config.maxChecks}`)\n\n const isBlank = this.checkIfBlank()\n\n if (isBlank && !this.isBlankScreen) {\n // 首次检测到白屏\n this.logger.warn('Blank screen detected for the first time!')\n this.isBlankScreen = true\n const report = this.generateReport()\n this.logger.warn('Generated report:', report)\n callback(report)\n }\n\n // 如果还未达到最大检测次数,继续检测\n if (this.checkCount < this.config.maxChecks && !isBlank) {\n this.timerId = window.setTimeout(() => {\n this.performCheck(callback)\n }, this.config.checkInterval)\n this.logger.debug(`Scheduling next check in ${this.config.checkInterval}ms`)\n } else {\n this.logger.debug('Stopping checks. Count:', this.checkCount, 'Is blank:', isBlank)\n }\n }\n\n /**\n * 检查是否白屏\n */\n private checkIfBlank(): boolean {\n // 1. 检查自定义检测函数\n if (this.config.customCheck()) {\n this.logger.debug('Custom check returned true')\n return true\n }\n\n // 2. 检查DOM元素数量(优化版)\n const domCheck = this.checkDOMElementsOptimized()\n if (domCheck.isBlank) {\n this.logger.debug('DOM check indicates blank screen')\n return true\n }\n\n // 3. 检查Performance API\n if (this.config.checkPerformance) {\n const perfCheck = this.checkPerformanceTiming()\n if (perfCheck.isBlank) {\n this.logger.debug('Performance check indicates blank screen')\n return true\n }\n }\n\n this.logger.debug('All checks passed, not a blank screen')\n return false\n }\n\n /**\n * 检查DOM元素(优化版 - 使用TreeWalker)\n * 性能提升:50-100倍(从50ms降至0.5-1ms)\n */\n private checkDOMElementsOptimized(): { isBlank: boolean; info: any } {\n // 1. 先检查body是否存在(最快的检查)\n if (!document.body) {\n return { isBlank: true, info: { reason: 'no-body' } }\n }\n\n // 2. 检查body的直接子元素数量\n const bodyChildren = document.body.children.length\n if (bodyChildren === 0) {\n return { isBlank: true, info: { reason: 'empty-body', bodyChildren: 0 } }\n }\n\n // 3. 使用TreeWalker API(比querySelectorAll快10-100倍)\n let contentNodes = 0\n let totalNodes = 0\n\n try {\n const walker = document.createTreeWalker(\n document.body,\n NodeFilter.SHOW_ELEMENT,\n {\n acceptNode: (node) => {\n // 类型断言\n const element = node as Element\n\n // 跳过非内容节点(使用常量配置)\n if (DOM_FILTER.SKIP_TAGS.includes(element.tagName as any)) {\n return NodeFilter.FILTER_REJECT\n }\n\n // 跳过测试相关的元素(使用常量配置)\n if (DOM_FILTER.SKIP_TEST_IDS.includes(element.id as any)) {\n return NodeFilter.FILTER_REJECT\n }\n\n totalNodes++\n\n // 检查是否有实际内容\n if (element.textContent && element.textContent.trim().length > 0) {\n contentNodes++\n }\n\n return NodeFilter.FILTER_ACCEPT\n }\n }\n )\n\n // 只遍历前N个节点(优化性能,使用常量配置)\n let count = 0\n while (walker.nextNode() && count < THRESHOLDS.MAX_CHECK_NODES) {\n count++\n }\n } catch (error) {\n this.logger.error('Error during DOM traversal:', error)\n // 降级到简单检查\n return {\n isBlank: bodyChildren < this.config.minElements,\n info: { bodyChildren, error: true }\n }\n }\n\n const isBlank = contentNodes < this.config.minElements\n\n return {\n isBlank,\n info: {\n totalNodes,\n contentNodes,\n bodyChildren,\n checkedNodes: Math.min(totalNodes, THRESHOLDS.MAX_CHECK_NODES)\n }\n }\n }\n\n /**\n * 检查Performance API\n */\n private checkPerformanceTiming(): { isBlank: boolean; info: any } {\n if (!window.performance || !window.performance.timing) {\n return { isBlank: false, info: { reason: 'performance-api-unavailable' } }\n }\n\n const timing = window.performance.timing\n const domContentLoaded = timing.domContentLoadedEventEnd - timing.navigationStart\n const loadComplete = timing.loadEventEnd - timing.navigationStart\n\n let firstPaint: number | undefined\n let firstContentfulPaint: number | undefined\n\n try {\n const paintEntries = performance.getEntriesByType('paint')\n if (Array.isArray(paintEntries)) {\n const fpEntry = paintEntries.find((e: any) => e.name === 'first-paint')\n const fcpEntry = paintEntries.find((e: any) => e.name === 'first-contentful-paint')\n\n firstPaint = fpEntry?.startTime\n firstContentfulPaint = fcpEntry?.startTime\n }\n } catch (error) {\n this.logger.debug('Error getting paint entries:', error)\n }\n\n // 如果页面加载完成但没有paint,可能是白屏\n const isBlank = loadComplete > 0 &&\n domContentLoaded > 5000 &&\n (firstPaint === undefined || firstContentfulPaint === undefined)\n\n return {\n isBlank,\n info: {\n domContentLoaded,\n loadComplete,\n firstPaint,\n firstContentfulPaint\n }\n }\n }\n\n /**\n * 生成报告\n */\n private generateReport(): BlankScreenReport {\n const domCheck = this.checkDOMElementsOptimized()\n const perfCheck = this.config.checkPerformance ? this.checkPerformanceTiming() : undefined\n\n return {\n type: 'blank-screen',\n message: '检测到白屏:页面加载后无内容渲染',\n context: {\n timestamp: Date.now(),\n url: window.location.href,\n domElements: domCheck.info.totalNodes || 0,\n bodyElements: domCheck.info.bodyChildren || 0,\n hasContent: !domCheck.isBlank,\n performanceTiming: perfCheck?.info\n }\n }\n }\n\n /**\n * 停止检测\n */\n stop(): void {\n this.logger.debug('Stopping blank screen detection...')\n\n if (this.timerId !== null) {\n window.clearTimeout(this.timerId)\n this.timerId = null\n this.logger.debug('Cleared timeout timer')\n }\n\n this.logger.debug('Blank screen detection stopped')\n }\n\n /**\n * 重置检测器\n */\n reset(): void {\n this.stop()\n this.checkCount = 0\n this.isBlankScreen = false\n }\n}\n\n/**\n * 创建实例工厂函数\n */\nexport function createBlankScreenDetector(config?: BlankScreenConfig): BlankScreenDetector {\n return new BlankScreenDetector(config)\n}\n","/**\n * 性能监控模块\n * 监控SDK初始化时间、错误处理时间、上报时间等关键性能指标\n */\n\nexport interface PerformanceMetrics {\n // SDK初始化指标\n initTime?: {\n startTime: number\n endTime: number\n duration: number\n }\n // 错误处理指标\n errorProcessing?: {\n totalErrors: number\n averageProcessingTime: number\n maxProcessingTime: number\n minProcessingTime: number\n }\n // 上报指标\n upload?: {\n totalUploads: number\n averageUploadTime: number\n maxUploadTime: number\n minUploadTime: number\n failedUploads: number\n }\n // 内存使用(如果可用)\n memory?: {\n usedJSHeapSize: number\n totalJSHeapSize: number\n jsHeapSizeLimit: number\n }\n}\n\nexport interface PerformanceEntry {\n type: 'init' | 'process' | 'upload'\n startTime: number\n endTime: number\n duration: number\n metadata?: Record<string, any>\n}\n\n/**\n * 性能监控器类\n */\nexport class PerformanceMonitor {\n private metrics: PerformanceMetrics = {}\n private entries: PerformanceEntry[] = []\n private errorProcessingTimes: number[] = []\n private uploadTimes: number[] = []\n private failedUploads: number = 0\n private initStartTime: number | null = null\n private initEndTime: number | null = null\n\n /**\n * 开始记录SDK初始化时间\n */\n startInit(): void {\n this.initStartTime = performance.now()\n }\n\n /**\n * 结束记录SDK初始化时间\n */\n endInit(): void {\n if (this.initStartTime === null) {\n console.warn('[PerformanceMonitor] startInit() was not called')\n return\n }\n\n this.initEndTime = performance.now()\n const duration = this.initEndTime - this.initStartTime\n\n this.metrics.initTime = {\n startTime: this.initStartTime,\n endTime: this.initEndTime,\n duration\n }\n\n this.entries.push({\n type: 'init',\n startTime: this.initStartTime,\n endTime: this.initEndTime,\n duration,\n metadata: {}\n })\n\n console.log(`[PerformanceMonitor] SDK initialized in ${duration.toFixed(2)}ms`)\n }\n\n /**\n * 记录错误处理时间\n */\n recordErrorProcessing(startTime: number, metadata?: Record<string, any>): void {\n const endTime = performance.now()\n const duration = endTime - startTime\n\n this.errorProcessingTimes.push(duration)\n\n this.entries.push({\n type: 'process',\n startTime,\n endTime,\n duration,\n metadata\n })\n\n // 更新错误处理指标\n this.updateErrorProcessingMetrics()\n\n if (duration > 100) {\n console.warn(`[PerformanceMonitor] Slow error processing: ${duration.toFixed(2)}ms`, metadata)\n }\n }\n\n /**\n * 记录上报时间\n */\n recordUpload(startTime: number, success: boolean, metadata?: Record<string, any>): void {\n const endTime = performance.now()\n const duration = endTime - startTime\n\n if (success) {\n this.uploadTimes.push(duration)\n } else {\n this.failedUploads++\n }\n\n this.entries.push({\n type: 'upload',\n startTime,\n endTime,\n duration,\n metadata: { ...metadata, success }\n })\n\n // 更新上报指标\n this.updateUploadMetrics()\n\n if (success && duration > 1000) {\n console.warn(`[PerformanceMonitor] Slow upload: ${duration.toFixed(2)}ms`, metadata)\n }\n }\n\n /**\n * 获取当前性能指标\n */\n getMetrics(): PerformanceMetrics {\n // 添加内存使用信息(如果可用)\n // @ts-ignore - memory is a Chrome-specific API\n if (performance.memory) {\n // @ts-ignore\n this.metrics.memory = {\n // @ts-ignore\n usedJSHeapSize: performance.memory.usedJSHeapSize,\n // @ts-ignore\n totalJSHeapSize: performance.memory.totalJSHeapSize,\n // @ts-ignore\n jsHeapSizeLimit: performance.memory.jsHeapSizeLimit\n }\n }\n\n return this.metrics\n }\n\n /**\n * 获取所有性能记录\n */\n getEntries(): PerformanceEntry[] {\n return [...this.entries]\n }\n\n /**\n * 获取最近的N条记录\n */\n getRecentEntries(count: number): PerformanceEntry[] {\n return this.entries.slice(-count)\n }\n\n /**\n * 清空性能记录\n */\n clear(): void {\n this.metrics = {}\n this.entries = []\n this.errorProcessingTimes = []\n this.uploadTimes = []\n this.failedUploads = 0\n this.initStartTime = null\n this.initEndTime = null\n }\n\n /**\n * 生成性能报告摘要\n */\n getSummary(): string {\n const summary: string[] = []\n\n if (this.metrics.initTime) {\n summary.push(`Init: ${this.metrics.initTime.duration.toFixed(2)}ms`)\n }\n\n if (this.metrics.errorProcessing) {\n const { totalErrors, averageProcessingTime, maxProcessingTime } = this.metrics.errorProcessing\n summary.push(\n `Errors: ${totalErrors} total, ` +\n `${averageProcessingTime.toFixed(2)}ms avg, ` +\n `${maxProcessingTime.toFixed(2)}ms max`\n )\n }\n\n if (this.metrics.upload) {\n const { totalUploads, averageUploadTime, failedUploads } = this.metrics.upload\n summary.push(\n `Uploads: ${totalUploads} total, ` +\n `${averageUploadTime.toFixed(2)}ms avg, ` +\n `${failedUploads} failed`\n )\n }\n\n return summary.join(' | ') || 'No performance data'\n }\n\n /**\n * 更新错误处理指标\n */\n private updateErrorProcessingMetrics(): void {\n if (this.errorProcessingTimes.length === 0) return\n\n const sum = this.errorProcessingTimes.reduce((a, b) => a + b, 0)\n const avg = sum / this.errorProcessingTimes.length\n const max = Math.max(...this.errorProcessingTimes)\n const min = Math.min(...this.errorProcessingTimes)\n\n this.metrics.errorProcessing = {\n totalErrors: this.errorProcessingTimes.length,\n averageProcessingTime: avg,\n maxProcessingTime: max,\n minProcessingTime: min\n }\n }\n\n /**\n * 更新上报指标\n */\n private updateUploadMetrics(): void {\n if (this.uploadTimes.length === 0) return\n\n const sum = this.uploadTimes.reduce((a, b) => a + b, 0)\n const avg = sum / this.uploadTimes.length\n const max = Math.max(...this.uploadTimes)\n const min = Math.min(...this.uploadTimes)\n\n this.metrics.upload = {\n totalUploads: this.uploadTimes.length,\n averageUploadTime: avg,\n maxUploadTime: max,\n minUploadTime: min,\n failedUploads: this.failedUploads\n }\n }\n\n /**\n * 检查性能是否健康\n */\n isHealthy(): { healthy: boolean; issues: string[] } {\n const issues: string[] = []\n\n // 检查初始化时间(应该在100ms以内)\n if (this.metrics.initTime && this.metrics.initTime.duration > 100) {\n issues.push(`Slow initialization: ${this.metrics.initTime.duration.toFixed(2)}ms`)\n }\n\n // 检查错误处理时间(平均应该在10ms以内)\n if (this.metrics.errorProcessing && this.metrics.errorProcessing.averageProcessingTime > 10) {\n issues.push(\n `Slow error processing: ${this.metrics.errorProcessing.averageProcessingTime.toFixed(2)}ms average`\n )\n }\n\n // 检查上报时间(平均应该在500ms以内)\n if (this.metrics.upload && this.metrics.upload.averageUploadTime > 500) {\n issues.push(`Slow uploads: ${this.metrics.upload.averageUploadTime.toFixed(2)}ms average`)\n }\n\n // 检查上报失败率(应该在5%以内)\n if (this.metrics.upload) {\n const failureRate = this.metrics.upload.failedUploads / this.metrics.upload.totalUploads\n if (failureRate > 0.05) {\n issues.push(`High upload failure rate: ${(failureRate * 100).toFixed(1)}%`)\n }\n }\n\n return {\n healthy: issues.length === 0,\n issues\n }\n }\n}\n\n/**\n * 创建实例工厂函数\n */\nexport function createPerformanceMonitor(): PerformanceMonitor {\n return new PerformanceMonitor()\n}\n\n/**\n * 单例实例\n */\nlet globalMonitor: PerformanceMonitor | null = null\n\n/**\n * 获取全局性能监控器实例\n */\nexport function getGlobalPerformanceMonitor(): PerformanceMonitor {\n if (!globalMonitor) {\n globalMonitor = createPerformanceMonitor()\n }\n return globalMonitor\n}\n","/**\n * Error Monitor Web\n * Web端错误监控模块\n */\n\nimport { ErrorMonitor, Config, Logger } from 'error-monitor-core'\nimport {\n BlankScreenDetector,\n BlankScreenConfig,\n createBlankScreenDetector\n} from './blank-screen-detector'\nimport {\n PerformanceMonitor,\n createPerformanceMonitor,\n PerformanceMetrics\n} from './performance-monitor'\n\n// 导出核心\nexport { ErrorMonitor } from 'error-monitor-core'\nexport type { Config, Plugin, Breadcrumb } from 'error-monitor-core'\n\n// 导出白屏检测\nexport { BlankScreenDetector, createBlankScreenDetector }\nexport type { BlankScreenConfig, BlankScreenReport } from './blank-screen-detector'\n\n// 导出性能监控\nexport { PerformanceMonitor, createPerformanceMonitor }\nexport type { PerformanceMetrics } from './performance-monitor'\n\n/**\n * Web端配置\n */\nexport interface WebConfig extends Config {\n // 是否自动捕获全局错误 (已弃用,请使用 autoCapture)\n captureJsErrors?: boolean\n // 是否捕获Promise错误 (已弃用,请使用 autoCapture)\n capturePromiseErrors?: boolean\n // 是否捕获网络错误 (已弃用,请使用 autoCapture)\n captureNetworkErrors?: boolean\n // 是否捕获资源加载错误 (已弃用,请使用 autoCapture)\n captureResourceErrors?: boolean\n // 是否启用白屏检测\n blankScreenDetection?: boolean | BlankScreenConfig\n // 自定义上报函数\n customReporter?: (data: any) => void\n}\n\n/**\n * Web端错误监控类\n */\nexport class ErrorMonitorWeb extends ErrorMonitor {\n protected config: WebConfig\n private originalFetch: typeof fetch | null = null\n private originalXHR: typeof XMLHttpRequest | null = null\n private blankScreenDetector: BlankScreenDetector | null = null\n private performanceMonitor: PerformanceMonitor\n private logger: Logger\n // 内存泄漏防护:追踪事件监听器和定时器\n private eventListeners: Array<{\n target: EventTarget\n type: string\n listener: EventListenerOrEventListenerObject\n options?: AddEventListenerOptions | boolean\n }> = []\n private timers: Set<number> = new Set()\n\n constructor(config: WebConfig) {\n super(config)\n this.config = config\n // @ts-ignore - LogLevel enum\n this.logger = new Logger(config.enabled !== false, config.debug ? 0 : 1) // 0=DEBUG, 1=INFO\n // 初始化性能监控器\n this.performanceMonitor = createPerformanceMonitor()\n }\n\n /**\n * 初始化Web端监控\n */\n init(): void {\n // 开始记录初始化时间\n this.performanceMonitor.startInit()\n\n super.init()\n\n if (typeof window === 'undefined') {\n this.logger.warn('Not in browser environment')\n return\n }\n\n // 支持新旧两种配置格式\n // 新格式: autoCapture.js\n // 旧格式: captureJsErrors\n const captureJs = this.config.autoCapture?.js !== false && this.config.captureJsErrors !== false\n const capturePromise = this.config.autoCapture?.promise !== false && this.config.capturePromiseErrors !== false\n const captureNetwork = this.config.autoCapture?.network !== false && this.config.captureNetworkErrors !== false\n const captureResource = this.config.autoCapture?.resource !== false && this.config.captureResourceErrors !== false\n\n // 自动捕获各种错误\n if (captureJs) {\n this.setupJsErrorHandler()\n }\n\n if (capturePromise) {\n this.setupPromiseErrorHandler()\n }\n\n if (captureNetwork) {\n this.setupNetworkErrorHandler()\n }\n\n if (captureResource) {\n this.setupResourceErrorHandler()\n }\n\n // 初始化白屏检测\n if (this.config.blankScreenDetection) {\n this.setupBlankScreenDetection()\n }\n\n // 结束记录初始化时间\n this.performanceMonitor.endInit()\n\n this.logger.info('Web handlers initialized')\n }\n\n /**\n * 内存泄漏防护:追踪事件监听器\n */\n private trackedAddEventListener(\n target: EventTarget,\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: AddEventListenerOptions | boolean\n ): void {\n // 只在有options时传递,避免传递undefined\n if (options !== undefined) {\n target.addEventListener(type, listener, options)\n } else {\n target.addEventListener(type, listener)\n }\n this.eventListeners.push({ target, type, listener, options })\n }\n\n /**\n * 内存泄漏防护:追踪定时器\n */\n private trackedSetTimeout(callback: () => void, delay: number): number {\n const id = window.setTimeout(callback, delay)\n this.timers.add(id)\n return id\n }\n\n /**\n * 内存泄漏防护:清除定时器并移除追踪\n */\n private trackedClearTimeout(id: number | null): void {\n if (id !== null) {\n window.clearTimeout(id)\n this.timers.delete(id)\n }\n }\n\n /**\n * JavaScript错误处理\n */\n private setupJsErrorHandler(): void {\n this.trackedAddEventListener(window, 'error', (event) => {\n this.capture({\n type: 'js',\n message: event.message,\n stack: event.error?.stack,\n context: {\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno\n }\n })\n })\n }\n\n /**\n * Promise错误处理\n */\n private setupPromiseErrorHandler(): void {\n this.trackedAddEventListener(window, 'unhandledrejection', (event) => {\n this.capture({\n type: 'promise',\n message: event.reason?.message || String(event.reason),\n stack: event.reason?.stack,\n context: {\n reason: event.reason\n }\n })\n })\n }\n\n /**\n * 网络请求错误处理\n */\n private setupNetworkErrorHandler(): void {\n // 拦截fetch\n if (typeof window.fetch !== 'undefined') {\n this.originalFetch = window.fetch\n const self = this\n\n window.fetch = function (...args: Parameters<typeof fetch>) {\n return self.originalFetch!\n .apply(this, args as any)\n .catch((error) => {\n const url = typeof args[0] === 'string' ? args[0] : String(args[0])\n const method = args[1]?.method || 'GET'\n\n self.capture({\n type: 'network',\n message: `Network error: ${method} ${url}`,\n context: {\n url,\n method,\n error: error.message\n }\n })\n\n throw error\n })\n }\n }\n\n // 拦截XMLHttpRequest(简化版)\n if (typeof window.XMLHttpRequest !== 'undefined') {\n this.originalXHR = window.XMLHttpRequest\n const self = this\n\n const OriginalXHR = this.originalXHR\n window.XMLHttpRequest = function () {\n const xhr = new OriginalXHR()\n const originalOpen = xhr.open\n const originalSend = xhr.send\n let url = ''\n let method = ''\n\n xhr.open = function (...args: any[]) {\n method = args[0] || 'GET'\n url = String(args[1] || '')\n return originalOpen.apply(this, args as any)\n }\n\n xhr.send = function (...args: any[]) {\n xhr.addEventListener('error', () => {\n self.capture({\n type: 'network',\n message: `XHR error: ${method} ${url}`,\n context: {\n url,\n method,\n status: xhr.status\n }\n })\n })\n\n return originalSend.apply(this, args as any)\n }\n\n return xhr\n } as any\n }\n }\n\n /**\n * 资源加载错误处理\n *\n * 注意:资源加载错误(img, script, link等)不会冒泡到window\n * 需要通过拦截元素创建来监听\n */\n private setupResourceErrorHandler(): void {\n // 方法1: 监听window的error事件(只捕获JavaScript错误)\n this.trackedAddEventListener(window, 'error', (event: Event) => {\n // 这是JS错误,不是资源错误,跳过\n if ((event as ErrorEvent).message) {\n return\n }\n\n // 尝试捕获资源错误(某些浏览器可能支持)\n const target = event.target as HTMLElement\n if (target !== window && target) {\n console.log('[ResourceErrorHandler] Resource error via window event', {\n tagName: target.tagName,\n src: (target as any).src || (target as any).href\n })\n\n this.capture({\n type: 'resource',\n message: `Resource load error: ${target.tagName}`,\n context: {\n tagName: target.tagName,\n src: (target as any).src || (target as any).href\n }\n })\n }\n }, true)\n\n // 方法2: 拦截常见的资源元素创建,自动添加error监听器\n this.interceptResourceElements()\n }\n\n /**\n * 拦截资源元素的创建,自动添加error监听器\n */\n private interceptResourceElements(): void {\n const self = this\n\n // 拦截Image构造函数(仅在浏览器环境且Image存在时)\n if (typeof window === 'undefined' || typeof window.Image === 'undefined') {\n this.logger.debug('Image constructor not available, skipping resource interception')\n return\n }\n\n const OriginalImage = window.Image\n\n // 检查原型是否存在(防止test环境中的undefined问题)\n if (!OriginalImage || !OriginalImage.prototype) {\n this.logger.warn('Image.prototype not available, skipping resource interception')\n return\n }\n\n const TrackedImage = function(this: HTMLImageElement, ...args: any[]) {\n const img = new OriginalImage(...args)\n\n // 添加error监听器\n self.trackedAddEventListener(img, 'error', (event: Event) => {\n const target = event.target as HTMLImageElement\n console.log('[ResourceErrorHandler] Image error captured', {\n src: target.src,\n currentSrc: target.currentSrc\n })\n\n self.capture({\n type: 'resource',\n message: `Image load failed: ${target.src.substring(0, 100)}`,\n context: {\n tagName: 'IMG',\n src: target.src,\n currentSrc: target.currentSrc\n }\n })\n })\n\n return img\n }\n\n // 复制原型和静态属性\n TrackedImage.prototype = OriginalImage.prototype\n TrackedImage.prototype.constructor = TrackedImage\n ;(TrackedImage as any).toString = () => OriginalImage.toString()\n\n // 替换全局Image\n ;(window as any).Image = TrackedImage\n\n // 注意:script和link标签通常在HTML中静态声明,\n // 需要使用MutationObserver监听DOM变化(暂不实现)\n }\n\n /**\n * 白屏检测\n */\n private setupBlankScreenDetection(): void {\n this.logger.debug('Setting up blank screen detection...')\n const config =\n typeof this.config.blankScreenDetection === 'boolean'\n ? {}\n : this.config.blankScreenDetection\n\n this.logger.debug('Blank screen config:', config)\n this.blankScreenDetector = createBlankScreenDetector(config)\n\n this.blankScreenDetector.start((report) => {\n this.logger.warn('Blank screen detected!', report)\n this.capture({\n type: report.type,\n message: report.message,\n context: report.context\n })\n })\n\n this.logger.debug('Blank screen detection started')\n }\n\n /**\n * 手动上报错误\n */\n captureError(error: Error, context?: Record<string, any>): void {\n this.capture({\n type: 'custom',\n message: error.message,\n stack: error.stack,\n context\n })\n }\n\n /**\n * 手动上报消息\n */\n captureMessage(message: string, level: string = 'info'): void {\n this.capture({\n type: 'custom',\n message,\n context: { level }\n })\n }\n\n /**\n * 重写capture方法以记录错误处理时间\n */\n capture(error: any, options?: any): void {\n const startTime = performance.now()\n\n super.capture(error, options)\n\n // 记录错误处理时间\n this.performanceMonitor.recordErrorProcessing(startTime, {\n errorType: error.type,\n message: error.message\n })\n }\n\n /**\n * 重写report方法以记录上报时间\n */\n report(data: any): void {\n const startTime = performance.now()\n\n // 直接调用父类的report()方法\n // 不要重复调用sendToServer,因为父类的report()会处理批量队列\n super.report(data)\n\n // 记录上报时间(注意:由于sendBeacon的特性,成功仅表示调用成功,不代表服务器接收成功)\n this.performanceMonitor.recordUpload(startTime, true, {\n eventType: data.type,\n eventId: data.eventId\n })\n }\n\n /**\n * 获取性能指标\n */\n getPerformanceMetrics(): PerformanceMetrics {\n return this.performanceMonitor.getMetrics()\n }\n\n /**\n * 获取性能摘要\n */\n getPerformanceSummary(): string {\n return this.performanceMonitor.getSummary()\n }\n\n /**\n * 检查性能健康状况\n */\n checkPerformanceHealth(): { healthy: boolean; issues: string[] } {\n return this.performanceMonitor.isHealthy()\n }\n\n /**\n * 销毁实例(包含内存泄漏防护)\n */\n destroy(): void {\n this.logger.debug('Destroying instance...')\n\n // 停止白屏检测\n if (this.blankScreenDetector) {\n this.logger.debug('Stopping blank screen detector...')\n this.blankScreenDetector.stop()\n this.blankScreenDetector = null\n }\n\n // 清空性能监控数据\n this.performanceMonitor.clear()\n\n // 内存泄漏防护:清除所有追踪的定时器\n this.timers.forEach(id => {\n window.clearTimeout(id)\n })\n this.timers.clear()\n this.logger.debug('Cleared all tracked timers')\n\n // 内存泄漏防护:移除所有追踪的事件监听器\n this.eventListeners.forEach(({ target, type, listener, options }) => {\n target.removeEventListener(type, listener, options)\n })\n this.eventListeners = []\n this.logger.debug('Removed all tracked event listeners')\n\n // 恢复原生方法\n if (this.originalFetch && window.fetch !== this.originalFetch) {\n window.fetch = this.originalFetch\n }\n\n if (this.originalXHR && window.XMLHttpRequest !== this.originalXHR) {\n window.XMLHttpRequest = this.originalXHR\n }\n\n super.destroy()\n\n this.logger.info('Instance destroyed')\n }\n}\n\n/**\n * 创建Web端实例工厂函数\n */\nexport function createErrorMonitorWeb(config: WebConfig): ErrorMonitorWeb {\n return new ErrorMonitorWeb(config)\n}\n\n// 默认导出\nexport default ErrorMonitorWeb\n"],"names":["p","m","c","l","u","y","E","s","b","g","w","i","t","f","d","r","n","o","TIMING","THRESHOLDS","DOM_FILTER","LOG_LEVEL","BlankScreenDetector","config","Logger","level","callback","isBlank","report","bodyChildren","contentNodes","totalNodes","walker","node","element","count","error","timing","domContentLoaded","loadComplete","firstPaint","firstContentfulPaint","paintEntries","fpEntry","e","fcpEntry","domCheck","perfCheck","createBlankScreenDetector","PerformanceMonitor","duration","startTime","metadata","endTime","success","summary","totalErrors","averageProcessingTime","maxProcessingTime","totalUploads","averageUploadTime","failedUploads","avg","a","max","min","issues","failureRate","createPerformanceMonitor","ErrorMonitorWeb","ErrorMonitor","_a","_b","_c","_d","captureJs","capturePromise","captureNetwork","captureResource","target","type","listener","options","delay","id","event","self","args","url","method","OriginalXHR","xhr","originalOpen","originalSend","OriginalImage","TrackedImage","img","context","message","data","createErrorMonitorWeb"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=index.umd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.umd.d.ts","sourceRoot":"","sources":["../index.umd.js"],"names":[],"mappings":""}
package/dist/index.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- (function(l,f){typeof exports=="object"&&typeof module<"u"?f(exports):typeof define=="function"&&define.amd?define(["exports"],f):(l=typeof globalThis<"u"?globalThis:l||self,f(l.ErrorMonitorWeb={}))})(this,function(l){"use strict";function f(){return`${Date.now()}-${Math.random().toString(36).substring(2,15)}`}function m(){return`${Date.now()}-${Math.random().toString(36).substring(2,15)}`}class k{constructor(e){this.isInitialized=!1,this.breadcrumbs=[],this.maxBreadcrumbs=50,this.plugins=[],this.sessionId=f(),this.config={autoCapture:{js:!0,promise:!0,network:!0,resource:!0,console:!1},filter:{ignoreErrors:[],ignoreUrls:[],minLevel:"info"},report:{delay:1e3,batchSize:10},sampleRate:1,errorSampleRate:1,enabled:!0,debug:!1,...e}}updateConfig(e){this.config={...this.config,...e},this.config.debug&&console.log("[ErrorMonitor] Config updated:",this.config)}enable(){this.config.enabled=!0,console.log("[ErrorMonitor] SDK enabled")}disable(){this.config.enabled=!1,console.log("[ErrorMonitor] SDK disabled")}addFilter(e){this.config.filter||(this.config.filter={}),this.config.filter.ignoreErrors||(this.config.filter.ignoreErrors=[]),this.config.filter.ignoreErrors.push(e)}removeFilter(e){var t;if(!((t=this.config.filter)!=null&&t.ignoreErrors))return;const n=this.config.filter.ignoreErrors.indexOf(e);n>-1&&this.config.filter.ignoreErrors.splice(n,1)}setSampleRate(e){this.config.sampleRate=Math.max(0,Math.min(1,e))}setErrorSampleRate(e){this.config.errorSampleRate=Math.max(0,Math.min(1,e))}init(){if(this.isInitialized){console.warn("[ErrorMonitor] Already initialized");return}this.isInitialized=!0,this.plugins.forEach(e=>{var t;(t=e.setup)==null||t.call(e,this)}),console.log("[ErrorMonitor] Initialized with appId:",this.config.appId)}use(e){var t;this.plugins.push(e),this.isInitialized&&((t=e.setup)==null||t.call(e,this))}capture(e,t){var n,i;if(!this.isInitialized){console.warn("[ErrorMonitor] Not initialized");return}if(this.config.enabled===!1)return;const o=e instanceof Error?{type:"custom",message:e.message,stack:e.stack,context:{}}:e,r={level:"error",tags:{},extra:{},user:{},skipSampling:!1,skipFilter:!1,...t};if(!r.skipFilter&&this.shouldFilter(o)){this.config.debug&&console.log("[ErrorMonitor] Error filtered:",o.message);return}if(!r.skipSampling&&this.config.errorSampleRate!==void 0&&Math.random()>this.config.errorSampleRate)return;let s=o;for(const h of this.plugins){const a=(n=h.beforeCapture)==null?void 0:n.call(h,o);if(a===null)return;a!==void 0&&(s=a)}const c={appId:this.config.appId,timestamp:Date.now(),sessionId:this.sessionId,eventId:m(),type:s.type,level:r.level,message:s.message,stack:s.stack,context:{userAgent:typeof navigator<"u"?navigator.userAgent:"",url:typeof location<"u"?location.href:"",viewport:{width:typeof window<"u"?window.innerWidth:0,height:typeof window<"u"?window.innerHeight:0},userId:r.user.id||this.config.userId,tags:{...this.config.tags,...r.tags}},breadcrumbs:[...this.breadcrumbs],extra:{...s.context,...r.extra}};for(const h of this.plugins){const a=(i=h.afterCapture)==null?void 0:i.call(h,c);a!==void 0&&Object.assign(c,a)}this.report(c)}shouldFilter(e){var t;if(!this.config.filter)return!1;const{ignoreErrors:n,ignoreUrls:i,minLevel:o}=this.config.filter;if(n&&n.length>0){for(const r of n)if(r.test(e.message))return!0}if(i&&i.length>0&&(t=e.context)!=null&&t.url){for(const r of i)if(r.test(e.context.url))return!0}return!1}captureError(e,t){this.capture(e,t)}captureMessage(e,t="info",n){this.capture({type:"custom",message:e,context:{}},{...n,level:t})}report(e){var t;let n=e;for(const i of this.plugins){const o=(t=i.beforeReport)==null?void 0:t.call(i,e);o!==void 0&&(n=o)}this.sendToServer(n)}addBreadcrumb(e){this.breadcrumbs.push({timestamp:e.timestamp||Date.now(),type:e.type,message:e.message,data:e.data}),this.breadcrumbs.length>this.maxBreadcrumbs&&this.breadcrumbs.shift()}generateId(){return m()}setUser(e){this.config.userId=e.id,this.config.tags={...this.config.tags,...e}}sendToServer(e){if(typeof navigator>"u")return;const t=JSON.stringify(e);if(navigator.sendBeacon){const n=new Blob([t],{type:"application/json"});navigator.sendBeacon(this.config.dsn,n);return}typeof fetch<"u"&&fetch(this.config.dsn,{method:"POST",body:t,keepalive:!0,headers:{"Content-Type":"application/json"}}).catch(n=>{console.error("[ErrorMonitor] Failed to send report:",n)})}destroy(){this.plugins.forEach(e=>{var t;(t=e.teardown)==null||t.call(e)}),this.plugins=[],this.breadcrumbs=[],this.isInitialized=!1,console.log("[ErrorMonitor] Destroyed")}}class b{constructor(e={}){this.checkCount=0,this.timerId=null,this.isBlankScreen=!1,this.config={detectionDelay:e.detectionDelay||3e3,minElements:e.minElements||10,checkInterval:e.checkInterval||1e3,maxChecks:e.maxChecks||5,checkPerformance:e.checkPerformance!==!1,customCheck:e.customCheck||(()=>!1)}}start(e){console.log("[BlankScreenDetector] Starting blank screen detection..."),console.log("[BlankScreenDetector] Config:",this.config),setTimeout(()=>{console.log("[BlankScreenDetector] Detection delay passed, starting first check..."),this.performCheck(e)},this.config.detectionDelay)}performCheck(e){this.checkCount++,console.log(`[BlankScreenDetector] Check #${this.checkCount}/${this.config.maxChecks}`);const t=this.checkIfBlank();if(console.log("[BlankScreenDetector] Is blank screen?",t),t&&!this.isBlankScreen){console.log("[BlankScreenDetector] Blank screen detected for the first time!"),this.isBlankScreen=!0;const n=this.generateReport();console.log("[BlankScreenDetector] Generated report:",n),e(n)}this.checkCount<this.config.maxChecks&&!t?(this.timerId=window.setTimeout(()=>{this.performCheck(e)},this.config.checkInterval),console.log(`[BlankScreenDetector] Scheduling next check in ${this.config.checkInterval}ms`)):console.log("[BlankScreenDetector] Stopping checks. Count:",this.checkCount,"Is blank:",t)}checkIfBlank(){if(this.config.customCheck())return console.log("[BlankScreenDetector] Custom check returned true"),!0;const e=this.checkDOMElements();if(console.log("[BlankScreenDetector] DOM check result:",e),e.isBlank)return console.log("[BlankScreenDetector] DOM check indicates blank screen"),!0;if(this.config.checkPerformance){const t=this.checkPerformanceTiming();if(console.log("[BlankScreenDetector] Performance check result:",t),t.isBlank)return console.log("[BlankScreenDetector] Performance check indicates blank screen"),!0}return console.log("[BlankScreenDetector] All checks passed, not a blank screen"),!1}checkDOMElements(){var a;const e=document.querySelectorAll("*").length,t=((a=document.body)==null?void 0:a.children.length)||0,n=!!document.body,i=t>0,o=document.querySelectorAll("#blank-page, #minimal-page, #temp-status").length,r=document.querySelectorAll("script").length,s=e-o-r,c=!n||s<this.config.minElements||!i,h={totalElements:e,bodyElements:t,hasBody:n,hasContent:i,testElements:o,scriptElements:r,elementsWithoutTestAndScripts:s,minElements:this.config.minElements};return console.log("[BlankScreenDetector] 详细DOM信息:",h),{isBlank:c,info:h}}checkPerformanceTiming(){var h;if(!window.performance||!window.performance.timing)return{isBlank:!1};const e=window.performance.timing,t=e.navigationStart,n=e.domContentLoadedEventEnd-t,i=e.loadEventEnd-t;let o,r;const s=(h=performance.getEntriesByType)==null?void 0:h.call(performance,"paint");if(s){const a=s.find(p=>p.name==="first-paint"),g=s.find(p=>p.name==="first-contentful-paint");o=a==null?void 0:a.startTime,r=g==null?void 0:g.startTime}return{isBlank:i>0&&(o===void 0||r===void 0)&&n>5e3,timing:{domContentLoaded:n,loadComplete:i,firstPaint:o,firstContentfulPaint:r}}}generateReport(){var n;const e=this.checkDOMElements(),t=this.config.checkPerformance?this.checkPerformanceTiming():{};return{type:"blank-screen",message:"检测到白屏:页面加载后无内容渲染",context:{timestamp:Date.now(),url:window.location.href,domElements:document.querySelectorAll("*").length,bodyElements:((n=document.body)==null?void 0:n.children.length)||0,hasContent:e.info.hasContent,performanceTiming:t.timing}}}stop(){console.log("[BlankScreenDetector] Stopping blank screen detection..."),this.timerId!==null&&(window.clearTimeout(this.timerId),this.timerId=null,console.log("[BlankScreenDetector] Cleared timeout timer")),console.log("[BlankScreenDetector] Blank screen detection stopped")}reset(){this.stop(),this.checkCount=0,this.isBlankScreen=!1}}function w(u){return new b(u)}class d extends k{constructor(e){super(e),this.originalFetch=null,this.originalXHR=null,this.blankScreenDetector=null,this.config=e}init(){var o,r,s,c;if(super.init(),typeof window>"u"){console.warn("[ErrorMonitorWeb] Not in browser environment");return}const e=((o=this.config.autoCapture)==null?void 0:o.js)!==!1&&this.config.captureJsErrors!==!1,t=((r=this.config.autoCapture)==null?void 0:r.promise)!==!1&&this.config.capturePromiseErrors!==!1,n=((s=this.config.autoCapture)==null?void 0:s.network)!==!1&&this.config.captureNetworkErrors!==!1,i=((c=this.config.autoCapture)==null?void 0:c.resource)!==!1&&this.config.captureResourceErrors!==!1;e&&this.setupJsErrorHandler(),t&&this.setupPromiseErrorHandler(),n&&this.setupNetworkErrorHandler(),i&&this.setupResourceErrorHandler(),this.config.blankScreenDetection&&this.setupBlankScreenDetection(),console.log("[ErrorMonitorWeb] Web handlers initialized")}setupJsErrorHandler(){window.addEventListener("error",e=>{var t;this.capture({type:"js",message:e.message,stack:(t=e.error)==null?void 0:t.stack,context:{filename:e.filename,lineno:e.lineno,colno:e.colno}})})}setupPromiseErrorHandler(){window.addEventListener("unhandledrejection",e=>{var t,n;this.capture({type:"promise",message:((t=e.reason)==null?void 0:t.message)||String(e.reason),stack:(n=e.reason)==null?void 0:n.stack,context:{reason:e.reason}})})}setupNetworkErrorHandler(){if(typeof window.fetch<"u"){this.originalFetch=window.fetch;const e=this;window.fetch=function(...t){return e.originalFetch.apply(this,t).catch(n=>{var r;const i=typeof t[0]=="string"?t[0]:String(t[0]),o=((r=t[1])==null?void 0:r.method)||"GET";throw e.capture({type:"network",message:`Network error: ${o} ${i}`,context:{url:i,method:o,error:n.message}}),n})}}if(typeof window.XMLHttpRequest<"u"){this.originalXHR=window.XMLHttpRequest;const e=this,t=this.originalXHR;window.XMLHttpRequest=function(){const n=new t,i=n.open,o=n.send;let r="",s="";return n.open=function(...c){return s=c[0]||"GET",r=String(c[1]||""),i.apply(this,c)},n.send=function(...c){return n.addEventListener("error",()=>{e.capture({type:"network",message:`XHR error: ${s} ${r}`,context:{url:r,method:s,status:n.status}})}),o.apply(this,c)},n}}}setupResourceErrorHandler(){window.addEventListener("error",e=>{if(e.target!==window){const t=e.target;this.capture({type:"resource",message:`Resource load error: ${t.tagName}`,context:{tagName:t.tagName,src:t.src||t.href}})}},!0)}setupBlankScreenDetection(){console.log("[ErrorMonitorWeb] Setting up blank screen detection...");const e=typeof this.config.blankScreenDetection=="boolean"?{}:this.config.blankScreenDetection;console.log("[ErrorMonitorWeb] Blank screen config:",e),this.blankScreenDetector=w(e),this.blankScreenDetector.start(t=>{console.log("[ErrorMonitorWeb] Blank screen detected!",t),this.capture({type:t.type,message:t.message,context:t.context})}),console.log("[ErrorMonitorWeb] Blank screen detection started")}captureError(e,t){this.capture({type:"custom",message:e.message,stack:e.stack,context:t})}captureMessage(e,t="info"){this.capture({type:"custom",message:e,context:{level:t}})}destroy(){console.log("[ErrorMonitorWeb] Destroying instance..."),this.blankScreenDetector&&(console.log("[ErrorMonitorWeb] Stopping blank screen detector..."),this.blankScreenDetector.stop(),this.blankScreenDetector=null),this.originalFetch&&window.fetch!==this.originalFetch&&(window.fetch=this.originalFetch),this.originalXHR&&window.XMLHttpRequest!==this.originalXHR&&(window.XMLHttpRequest=this.originalXHR),super.destroy(),console.log("[ErrorMonitorWeb] Instance destroyed")}}function E(u){return new d(u)}l.BlankScreenDetector=b,l.ErrorMonitor=k,l.ErrorMonitorWeb=d,l.createBlankScreenDetector=w,l.createErrorMonitorWeb=E,l.default=d,Object.defineProperties(l,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
1
+ (function(c,d){typeof exports=="object"&&typeof module<"u"?d(exports):typeof define=="function"&&define.amd?define(["exports"],d):(c=typeof globalThis<"u"?globalThis:c||self,d(c.ErrorMonitorWeb={}))})(this,function(c){"use strict";class d{constructor(e=!0,t=1){this.level=e?t:4}setLevel(e){this.level=e}setEnabled(e){this.level=e?1:4}getLevel(){return this.level}debug(...e){this.level<=0&&console.log("[ErrorMonitor:DEBUG]",...e)}info(...e){this.level<=1&&console.info("[ErrorMonitor:INFO]",...e)}warn(...e){this.level<=2&&console.warn("[ErrorMonitor:WARN]",...e)}error(...e){this.level<=3&&console.error("[ErrorMonitor:ERROR]",...e)}}const I={MAX_SIZE:50},g={DEFAULT_RATE:1,MIN_RATE:0,MAX_RATE:1},f={DEFAULT_DELAY:1e3,DEFAULT_BATCH_SIZE:10},E={ENABLED:!0,DEBUG:!1};class M{constructor(e,t){this.queue=[],this.timerId=null,this.config={batchSize:e.batchSize||10,delay:e.delay||1e3,enabled:e.enabled!==!1},this.sender=t,typeof window<"u"&&(window.addEventListener("pagehide",()=>this.flush()),window.addEventListener("beforeunload",()=>this.flush()))}add(e){if(!this.config.enabled){this.sender([e]);return}this.queue.push({report:e,timestamp:Date.now()}),this.queue.length>=this.config.batchSize?this.flush():this.scheduleFlush()}scheduleFlush(){this.timerId===null&&(this.timerId=window.setTimeout(()=>{this.flush()},this.config.delay))}flush(){if(this.timerId!==null&&(window.clearTimeout(this.timerId),this.timerId=null),this.queue.length===0)return;const e=this.queue.map(t=>t.report);this.sendReports(e),this.queue=[]}sendReports(e){try{const t=this.sender(e);t instanceof Promise&&t.catch(i=>{console.error("[BatchQueue] Failed to send reports:",i)})}catch(t){console.error("[BatchQueue] Error sending reports:",t)}}size(){return this.queue.length}clear(){this.queue=[],this.timerId!==null&&(window.clearTimeout(this.timerId),this.timerId=null)}updateConfig(e){this.config={...this.config,...e}}destroy(){this.flush(),typeof window<"u"&&(window.removeEventListener("pagehide",()=>this.flush()),window.removeEventListener("beforeunload",()=>this.flush()))}}class L{constructor(e,t){this.cacheQueue=[],this.config={maxCacheSize:e.maxCacheSize||100,enabled:e.enabled!==!1,storageKey:e.storageKey||"error_monitor_cache"},this.sender=t,this.isOnline=typeof navigator<"u"?navigator.onLine:!0,this.loadFromStorage(),typeof window<"u"&&(window.addEventListener("online",()=>this.handleOnline()),window.addEventListener("offline",()=>this.handleOffline()))}cache(e){if(!this.config.enabled)return;const t={report:e,timestamp:Date.now(),retryCount:0};this.cacheQueue.push(t),this.cacheQueue.length>this.config.maxCacheSize&&this.cacheQueue.shift(),this.saveToStorage()}send(e){this.isOnline?this.sender(e):this.cache(e)}handleOnline(){this.isOnline=!0,console.log("[OfflineCache] Network restored, flushing cache..."),this.flush()}handleOffline(){this.isOnline=!1,console.log("[OfflineCache] Network disconnected, enabling offline cache")}async flush(){if(this.cacheQueue.length===0)return;const e=[...this.cacheQueue],t=[];for(const i of e)try{await this.sender(i.report);const r=this.cacheQueue.indexOf(i);r>-1&&this.cacheQueue.splice(r,1)}catch{if(i.retryCount++,i.retryCount>3){console.error("[OfflineCache] Max retry count exceeded, dropping report:",i.report);const r=this.cacheQueue.indexOf(i);r>-1&&this.cacheQueue.splice(r,1)}else t.push(i)}this.saveToStorage(),t.length>0&&console.warn(`[OfflineCache] ${t.length} reports failed to send, will retry later`)}saveToStorage(){if(!(typeof localStorage>"u"))try{localStorage.setItem(this.config.storageKey,JSON.stringify(this.cacheQueue))}catch(e){console.error("[OfflineCache] Failed to save to localStorage:",e)}}loadFromStorage(){if(!(typeof localStorage>"u"))try{const e=localStorage.getItem(this.config.storageKey);e&&(this.cacheQueue=JSON.parse(e),console.log(`[OfflineCache] Loaded ${this.cacheQueue.length} cached reports from storage`))}catch(e){console.error("[OfflineCache] Failed to load from localStorage:",e),this.cacheQueue=[]}}clear(){this.cacheQueue=[],this.saveToStorage()}size(){return this.cacheQueue.length}online(){return this.isOnline}destroy(){this.saveToStorage(),typeof window<"u"&&(window.removeEventListener("online",()=>this.handleOnline()),window.removeEventListener("offline",()=>this.handleOffline()))}}function D(){return`${Date.now()}-${Math.random().toString(36).substring(2,15)}`}function w(){return`${Date.now()}-${Math.random().toString(36).substring(2,15)}`}class A{constructor(e){this.head=0,this.tail=0,this._size=0,this.capacity=e,this.buffer=new Array(e)}push(e){this.buffer[this.tail]=e,this.tail=(this.tail+1)%this.capacity,this._size<this.capacity?this._size++:this.head=(this.head+1)%this.capacity}toArray(){const e=[];for(let t=0;t<this._size;t++){const i=(this.head+t)%this.capacity,r=this.buffer[i];r!==void 0&&e.push(r)}return e}getSize(){return this._size}clear(){this.buffer=new Array(this.capacity),this.head=0,this.tail=0,this._size=0}get length(){return this._size}get(e){if(e<0||e>=this._size)return;const t=(this.head+e)%this.capacity;return this.buffer[t]}}class T{constructor(e){this.isInitialized=!1,this.maxBreadcrumbs=I.MAX_SIZE,this.plugins=[],this.sessionId=D(),this.batchQueue=null,this.offlineCache=null,this.config={autoCapture:{js:!0,promise:!0,network:!0,resource:!0,console:!1},filter:{ignoreErrors:[],ignoreUrls:[],minLevel:"info"},report:{delay:f.DEFAULT_DELAY,batchSize:f.DEFAULT_BATCH_SIZE},sampleRate:g.DEFAULT_RATE,errorSampleRate:g.DEFAULT_RATE,enabled:E.ENABLED,debug:E.DEBUG,...e},this.logger=new d(this.config.enabled,this.config.debug?0:1),this.breadcrumbs=new A(this.maxBreadcrumbs),this.config.report&&(this.batchQueue=new M({batchSize:this.config.report.batchSize||f.DEFAULT_BATCH_SIZE,delay:this.config.report.delay||f.DEFAULT_DELAY,enabled:!0},t=>this.sendBatchToServer(t))),this.offlineCache=new L({maxCacheSize:100,enabled:!0,storageKey:`error_monitor_cache_${this.config.appId}`},t=>this.sendToServerDirectly(t))}updateConfig(e){this.config={...this.config,...e},this.logger.debug("Config updated:",this.config)}enable(){this.config.enabled=!0,this.logger.setEnabled(!0),this.logger.info("SDK enabled")}disable(){this.config.enabled=!1,this.logger.setEnabled(!1),this.logger.info("SDK disabled")}addFilter(e){this.config.filter||(this.config.filter={}),this.config.filter.ignoreErrors||(this.config.filter.ignoreErrors=[]),this.config.filter.ignoreErrors.push(e)}removeFilter(e){var t;if(!((t=this.config.filter)!=null&&t.ignoreErrors))return;const i=this.config.filter.ignoreErrors.indexOf(e);i>-1&&this.config.filter.ignoreErrors.splice(i,1)}setSampleRate(e){this.config.sampleRate=Math.max(g.MIN_RATE,Math.min(g.MAX_RATE,e))}setErrorSampleRate(e){this.config.errorSampleRate=Math.max(g.MIN_RATE,Math.min(g.MAX_RATE,e))}init(){if(this.isInitialized){this.logger.warn("Already initialized");return}this.isInitialized=!0,this.plugins.forEach(e=>{var t;(t=e.setup)==null||t.call(e,this)}),this.logger.info("Initialized with appId:",this.config.appId)}use(e){var t;this.plugins.push(e),this.isInitialized&&((t=e.setup)==null||t.call(e,this))}capture(e,t){var i,r;if(!this.isInitialized){this.logger.warn("Not initialized");return}if(this.config.enabled===!1)return;const s=e instanceof Error?{type:"custom",message:e.message,stack:e.stack,context:{}}:e,n={level:"error",tags:{},extra:{},user:{},skipSampling:!1,skipFilter:!1,...t};if(!n.skipFilter&&this.shouldFilter(s)){this.logger.debug("Error filtered:",s.message);return}if(!n.skipSampling&&this.config.errorSampleRate!==void 0&&Math.random()>this.config.errorSampleRate)return;let o=s;for(const u of this.plugins){const h=(i=u.beforeCapture)==null?void 0:i.call(u,s);if(h===null)return;h!==void 0&&(o=h)}const a={appId:this.config.appId,timestamp:Date.now(),sessionId:this.sessionId,eventId:w(),type:o.type,level:n.level,message:o.message,stack:o.stack,context:{userAgent:typeof navigator<"u"?navigator.userAgent:"",url:typeof location<"u"?location.href:"",viewport:{width:typeof window<"u"?window.innerWidth:0,height:typeof window<"u"?window.innerHeight:0},userId:n.user.id||this.config.userId,tags:{...this.config.tags,...n.tags}},breadcrumbs:this.breadcrumbs.toArray(),extra:{...o.context,...n.extra}};for(const u of this.plugins){const h=(r=u.afterCapture)==null?void 0:r.call(u,a);h!==void 0&&Object.assign(a,h)}this.report(a)}shouldFilter(e){var t;if(!this.config.filter)return!1;const{ignoreErrors:i,ignoreUrls:r,minLevel:s}=this.config.filter;if(i&&i.length>0){for(const n of i)if(n.test(e.message))return!0}if(r&&r.length>0&&(t=e.context)!=null&&t.url){for(const n of r)if(n.test(e.context.url))return!0}return!1}captureError(e,t){this.capture(e,t)}captureMessage(e,t="info",i){this.capture({type:"custom",message:e,context:{}},{...i,level:t})}report(e){var t,i;let r=e;for(const s of this.plugins){const n=(t=s.beforeReport)==null?void 0:t.call(s,e);n!==void 0&&(r=n)}this.batchQueue&&((i=this.config.report)==null?void 0:i.batchSize)!==1?this.batchQueue.add(r):this.sendToServer(r)}addBreadcrumb(e){this.breadcrumbs.push({timestamp:e.timestamp||Date.now(),type:e.type,message:e.message,data:e.data})}generateId(){return w()}setUser(e){this.config.userId=e.id,this.config.tags={...this.config.tags,...e}}sendToServer(e){this.offlineCache?this.offlineCache.send(e):this.sendToServerDirectly(e)}sendToServerDirectly(e){var t;if((t=this.config.report)!=null&&t.customReporter){this.config.report.customReporter(e);return}if(typeof navigator>"u")return;const i=JSON.stringify(e);if(navigator.sendBeacon){const r=new Blob([i],{type:"application/json"});navigator.sendBeacon(this.config.dsn,r);return}typeof fetch<"u"&&fetch(this.config.dsn,{method:"POST",body:i,keepalive:!0,headers:{"Content-Type":"application/json"}}).catch(r=>{this.logger.error("Failed to send report:",r)})}sendBatchToServer(e){var t;if((t=this.config.report)!=null&&t.customReporter){const r={reports:e};this.config.report.customReporter(r);return}if(typeof navigator>"u")return;const i=JSON.stringify({reports:e});if(navigator.sendBeacon){const r=new Blob([i],{type:"application/json"});navigator.sendBeacon(this.config.dsn,r);return}typeof fetch<"u"&&fetch(this.config.dsn,{method:"POST",body:i,keepalive:!0,headers:{"Content-Type":"application/json"}}).catch(r=>{this.logger.error("Failed to send batch reports:",r)})}destroy(){this.batchQueue&&(this.batchQueue.destroy(),this.batchQueue=null),this.offlineCache&&(this.offlineCache.destroy(),this.offlineCache=null),this.plugins.forEach(e=>{var t;(t=e.teardown)==null||t.call(e)}),this.plugins=[],this.breadcrumbs.clear(),this.isInitialized=!1,this.logger.info("Destroyed")}}const S={DEFAULT_DETECTION_DELAY:3e3,DEFAULT_CHECK_INTERVAL:1e3},m={DEFAULT_MIN_ELEMENTS:10,DEFAULT_MAX_CHECKS:5,MAX_CHECK_NODES:100},y={SKIP_TAGS:["SCRIPT","STYLE","NOSCRIPT","TEMPLATE","META","LINK"],SKIP_TEST_IDS:["blank-page","minimal-page","temp-status"]},_={DEFAULT:2};class b{constructor(e={}){this.checkCount=0,this.timerId=null,this.isBlankScreen=!1,this.config={detectionDelay:e.detectionDelay||S.DEFAULT_DETECTION_DELAY,minElements:e.minElements||m.DEFAULT_MIN_ELEMENTS,checkInterval:e.checkInterval||S.DEFAULT_CHECK_INTERVAL,maxChecks:e.maxChecks||m.DEFAULT_MAX_CHECKS,checkPerformance:e.checkPerformance!==!1,customCheck:e.customCheck||(()=>!1)},this.logger=new d(!0,_.DEFAULT)}setLogLevel(e){this.logger.setLevel(e)}start(e){this.logger.debug("Starting blank screen detection..."),this.logger.debug("Config:",this.config),this.timerId=window.setTimeout(()=>{this.logger.debug("Detection delay passed, starting first check..."),this.performCheck(e)},this.config.detectionDelay)}performCheck(e){this.checkCount++,this.logger.debug(`Check #${this.checkCount}/${this.config.maxChecks}`);const t=this.checkIfBlank();if(t&&!this.isBlankScreen){this.logger.warn("Blank screen detected for the first time!"),this.isBlankScreen=!0;const i=this.generateReport();this.logger.warn("Generated report:",i),e(i)}this.checkCount<this.config.maxChecks&&!t?(this.timerId=window.setTimeout(()=>{this.performCheck(e)},this.config.checkInterval),this.logger.debug(`Scheduling next check in ${this.config.checkInterval}ms`)):this.logger.debug("Stopping checks. Count:",this.checkCount,"Is blank:",t)}checkIfBlank(){return this.config.customCheck()?(this.logger.debug("Custom check returned true"),!0):this.checkDOMElementsOptimized().isBlank?(this.logger.debug("DOM check indicates blank screen"),!0):this.config.checkPerformance&&this.checkPerformanceTiming().isBlank?(this.logger.debug("Performance check indicates blank screen"),!0):(this.logger.debug("All checks passed, not a blank screen"),!1)}checkDOMElementsOptimized(){if(!document.body)return{isBlank:!0,info:{reason:"no-body"}};const e=document.body.children.length;if(e===0)return{isBlank:!0,info:{reason:"empty-body",bodyChildren:0}};let t=0,i=0;try{const s=document.createTreeWalker(document.body,NodeFilter.SHOW_ELEMENT,{acceptNode:o=>{const a=o;return y.SKIP_TAGS.includes(a.tagName)||y.SKIP_TEST_IDS.includes(a.id)?NodeFilter.FILTER_REJECT:(i++,a.textContent&&a.textContent.trim().length>0&&t++,NodeFilter.FILTER_ACCEPT)}});let n=0;for(;s.nextNode()&&n<m.MAX_CHECK_NODES;)n++}catch(s){return this.logger.error("Error during DOM traversal:",s),{isBlank:e<this.config.minElements,info:{bodyChildren:e,error:!0}}}return{isBlank:t<this.config.minElements,info:{totalNodes:i,contentNodes:t,bodyChildren:e,checkedNodes:Math.min(i,m.MAX_CHECK_NODES)}}}checkPerformanceTiming(){if(!window.performance||!window.performance.timing)return{isBlank:!1,info:{reason:"performance-api-unavailable"}};const e=window.performance.timing,t=e.domContentLoadedEventEnd-e.navigationStart,i=e.loadEventEnd-e.navigationStart;let r,s;try{const o=performance.getEntriesByType("paint");if(Array.isArray(o)){const a=o.find(h=>h.name==="first-paint"),u=o.find(h=>h.name==="first-contentful-paint");r=a==null?void 0:a.startTime,s=u==null?void 0:u.startTime}}catch(o){this.logger.debug("Error getting paint entries:",o)}return{isBlank:i>0&&t>5e3&&(r===void 0||s===void 0),info:{domContentLoaded:t,loadComplete:i,firstPaint:r,firstContentfulPaint:s}}}generateReport(){const e=this.checkDOMElementsOptimized(),t=this.config.checkPerformance?this.checkPerformanceTiming():void 0;return{type:"blank-screen",message:"检测到白屏:页面加载后无内容渲染",context:{timestamp:Date.now(),url:window.location.href,domElements:e.info.totalNodes||0,bodyElements:e.info.bodyChildren||0,hasContent:!e.isBlank,performanceTiming:t==null?void 0:t.info}}}stop(){this.logger.debug("Stopping blank screen detection..."),this.timerId!==null&&(window.clearTimeout(this.timerId),this.timerId=null,this.logger.debug("Cleared timeout timer")),this.logger.debug("Blank screen detection stopped")}reset(){this.stop(),this.checkCount=0,this.isBlankScreen=!1}}function k(l){return new b(l)}class v{constructor(){this.metrics={},this.entries=[],this.errorProcessingTimes=[],this.uploadTimes=[],this.failedUploads=0,this.initStartTime=null,this.initEndTime=null}startInit(){this.initStartTime=performance.now()}endInit(){if(this.initStartTime===null){console.warn("[PerformanceMonitor] startInit() was not called");return}this.initEndTime=performance.now();const e=this.initEndTime-this.initStartTime;this.metrics.initTime={startTime:this.initStartTime,endTime:this.initEndTime,duration:e},this.entries.push({type:"init",startTime:this.initStartTime,endTime:this.initEndTime,duration:e,metadata:{}}),console.log(`[PerformanceMonitor] SDK initialized in ${e.toFixed(2)}ms`)}recordErrorProcessing(e,t){const i=performance.now(),r=i-e;this.errorProcessingTimes.push(r),this.entries.push({type:"process",startTime:e,endTime:i,duration:r,metadata:t}),this.updateErrorProcessingMetrics(),r>100&&console.warn(`[PerformanceMonitor] Slow error processing: ${r.toFixed(2)}ms`,t)}recordUpload(e,t,i){const r=performance.now(),s=r-e;t?this.uploadTimes.push(s):this.failedUploads++,this.entries.push({type:"upload",startTime:e,endTime:r,duration:s,metadata:{...i,success:t}}),this.updateUploadMetrics(),t&&s>1e3&&console.warn(`[PerformanceMonitor] Slow upload: ${s.toFixed(2)}ms`,i)}getMetrics(){return performance.memory&&(this.metrics.memory={usedJSHeapSize:performance.memory.usedJSHeapSize,totalJSHeapSize:performance.memory.totalJSHeapSize,jsHeapSizeLimit:performance.memory.jsHeapSizeLimit}),this.metrics}getEntries(){return[...this.entries]}getRecentEntries(e){return this.entries.slice(-e)}clear(){this.metrics={},this.entries=[],this.errorProcessingTimes=[],this.uploadTimes=[],this.failedUploads=0,this.initStartTime=null,this.initEndTime=null}getSummary(){const e=[];if(this.metrics.initTime&&e.push(`Init: ${this.metrics.initTime.duration.toFixed(2)}ms`),this.metrics.errorProcessing){const{totalErrors:t,averageProcessingTime:i,maxProcessingTime:r}=this.metrics.errorProcessing;e.push(`Errors: ${t} total, ${i.toFixed(2)}ms avg, ${r.toFixed(2)}ms max`)}if(this.metrics.upload){const{totalUploads:t,averageUploadTime:i,failedUploads:r}=this.metrics.upload;e.push(`Uploads: ${t} total, ${i.toFixed(2)}ms avg, ${r} failed`)}return e.join(" | ")||"No performance data"}updateErrorProcessingMetrics(){if(this.errorProcessingTimes.length===0)return;const t=this.errorProcessingTimes.reduce((s,n)=>s+n,0)/this.errorProcessingTimes.length,i=Math.max(...this.errorProcessingTimes),r=Math.min(...this.errorProcessingTimes);this.metrics.errorProcessing={totalErrors:this.errorProcessingTimes.length,averageProcessingTime:t,maxProcessingTime:i,minProcessingTime:r}}updateUploadMetrics(){if(this.uploadTimes.length===0)return;const t=this.uploadTimes.reduce((s,n)=>s+n,0)/this.uploadTimes.length,i=Math.max(...this.uploadTimes),r=Math.min(...this.uploadTimes);this.metrics.upload={totalUploads:this.uploadTimes.length,averageUploadTime:t,maxUploadTime:i,minUploadTime:r,failedUploads:this.failedUploads}}isHealthy(){const e=[];if(this.metrics.initTime&&this.metrics.initTime.duration>100&&e.push(`Slow initialization: ${this.metrics.initTime.duration.toFixed(2)}ms`),this.metrics.errorProcessing&&this.metrics.errorProcessing.averageProcessingTime>10&&e.push(`Slow error processing: ${this.metrics.errorProcessing.averageProcessingTime.toFixed(2)}ms average`),this.metrics.upload&&this.metrics.upload.averageUploadTime>500&&e.push(`Slow uploads: ${this.metrics.upload.averageUploadTime.toFixed(2)}ms average`),this.metrics.upload){const t=this.metrics.upload.failedUploads/this.metrics.upload.totalUploads;t>.05&&e.push(`High upload failure rate: ${(t*100).toFixed(1)}%`)}return{healthy:e.length===0,issues:e}}}function C(){return new v}class p extends T{constructor(e){super(e),this.originalFetch=null,this.originalXHR=null,this.blankScreenDetector=null,this.eventListeners=[],this.timers=new Set,this.config=e,this.logger=new d(e.enabled!==!1,e.debug?0:1),this.performanceMonitor=C()}init(){var s,n,o,a;if(this.performanceMonitor.startInit(),super.init(),typeof window>"u"){this.logger.warn("Not in browser environment");return}const e=((s=this.config.autoCapture)==null?void 0:s.js)!==!1&&this.config.captureJsErrors!==!1,t=((n=this.config.autoCapture)==null?void 0:n.promise)!==!1&&this.config.capturePromiseErrors!==!1,i=((o=this.config.autoCapture)==null?void 0:o.network)!==!1&&this.config.captureNetworkErrors!==!1,r=((a=this.config.autoCapture)==null?void 0:a.resource)!==!1&&this.config.captureResourceErrors!==!1;e&&this.setupJsErrorHandler(),t&&this.setupPromiseErrorHandler(),i&&this.setupNetworkErrorHandler(),r&&this.setupResourceErrorHandler(),this.config.blankScreenDetection&&this.setupBlankScreenDetection(),this.performanceMonitor.endInit(),this.logger.info("Web handlers initialized")}trackedAddEventListener(e,t,i,r){r!==void 0?e.addEventListener(t,i,r):e.addEventListener(t,i),this.eventListeners.push({target:e,type:t,listener:i,options:r})}trackedSetTimeout(e,t){const i=window.setTimeout(e,t);return this.timers.add(i),i}trackedClearTimeout(e){e!==null&&(window.clearTimeout(e),this.timers.delete(e))}setupJsErrorHandler(){this.trackedAddEventListener(window,"error",e=>{var t;this.capture({type:"js",message:e.message,stack:(t=e.error)==null?void 0:t.stack,context:{filename:e.filename,lineno:e.lineno,colno:e.colno}})})}setupPromiseErrorHandler(){this.trackedAddEventListener(window,"unhandledrejection",e=>{var t,i;this.capture({type:"promise",message:((t=e.reason)==null?void 0:t.message)||String(e.reason),stack:(i=e.reason)==null?void 0:i.stack,context:{reason:e.reason}})})}setupNetworkErrorHandler(){if(typeof window.fetch<"u"){this.originalFetch=window.fetch;const e=this;window.fetch=function(...t){return e.originalFetch.apply(this,t).catch(i=>{var n;const r=typeof t[0]=="string"?t[0]:String(t[0]),s=((n=t[1])==null?void 0:n.method)||"GET";throw e.capture({type:"network",message:`Network error: ${s} ${r}`,context:{url:r,method:s,error:i.message}}),i})}}if(typeof window.XMLHttpRequest<"u"){this.originalXHR=window.XMLHttpRequest;const e=this,t=this.originalXHR;window.XMLHttpRequest=function(){const i=new t,r=i.open,s=i.send;let n="",o="";return i.open=function(...a){return o=a[0]||"GET",n=String(a[1]||""),r.apply(this,a)},i.send=function(...a){return i.addEventListener("error",()=>{e.capture({type:"network",message:`XHR error: ${o} ${n}`,context:{url:n,method:o,status:i.status}})}),s.apply(this,a)},i}}}setupResourceErrorHandler(){this.trackedAddEventListener(window,"error",e=>{if(e.message)return;const t=e.target;t!==window&&t&&(console.log("[ResourceErrorHandler] Resource error via window event",{tagName:t.tagName,src:t.src||t.href}),this.capture({type:"resource",message:`Resource load error: ${t.tagName}`,context:{tagName:t.tagName,src:t.src||t.href}}))},!0),this.interceptResourceElements()}interceptResourceElements(){const e=this;if(typeof window>"u"||typeof window.Image>"u"){this.logger.debug("Image constructor not available, skipping resource interception");return}const t=window.Image;if(!t||!t.prototype){this.logger.warn("Image.prototype not available, skipping resource interception");return}const i=function(...r){const s=new t(...r);return e.trackedAddEventListener(s,"error",n=>{const o=n.target;console.log("[ResourceErrorHandler] Image error captured",{src:o.src,currentSrc:o.currentSrc}),e.capture({type:"resource",message:`Image load failed: ${o.src.substring(0,100)}`,context:{tagName:"IMG",src:o.src,currentSrc:o.currentSrc}})}),s};i.prototype=t.prototype,i.prototype.constructor=i,i.toString=()=>t.toString(),window.Image=i}setupBlankScreenDetection(){this.logger.debug("Setting up blank screen detection...");const e=typeof this.config.blankScreenDetection=="boolean"?{}:this.config.blankScreenDetection;this.logger.debug("Blank screen config:",e),this.blankScreenDetector=k(e),this.blankScreenDetector.start(t=>{this.logger.warn("Blank screen detected!",t),this.capture({type:t.type,message:t.message,context:t.context})}),this.logger.debug("Blank screen detection started")}captureError(e,t){this.capture({type:"custom",message:e.message,stack:e.stack,context:t})}captureMessage(e,t="info"){this.capture({type:"custom",message:e,context:{level:t}})}capture(e,t){const i=performance.now();super.capture(e,t),this.performanceMonitor.recordErrorProcessing(i,{errorType:e.type,message:e.message})}report(e){const t=performance.now();super.report(e),this.performanceMonitor.recordUpload(t,!0,{eventType:e.type,eventId:e.eventId})}getPerformanceMetrics(){return this.performanceMonitor.getMetrics()}getPerformanceSummary(){return this.performanceMonitor.getSummary()}checkPerformanceHealth(){return this.performanceMonitor.isHealthy()}destroy(){this.logger.debug("Destroying instance..."),this.blankScreenDetector&&(this.logger.debug("Stopping blank screen detector..."),this.blankScreenDetector.stop(),this.blankScreenDetector=null),this.performanceMonitor.clear(),this.timers.forEach(e=>{window.clearTimeout(e)}),this.timers.clear(),this.logger.debug("Cleared all tracked timers"),this.eventListeners.forEach(({target:e,type:t,listener:i,options:r})=>{e.removeEventListener(t,i,r)}),this.eventListeners=[],this.logger.debug("Removed all tracked event listeners"),this.originalFetch&&window.fetch!==this.originalFetch&&(window.fetch=this.originalFetch),this.originalXHR&&window.XMLHttpRequest!==this.originalXHR&&(window.XMLHttpRequest=this.originalXHR),super.destroy(),this.logger.info("Instance destroyed")}}function R(l){return new p(l)}c.BlankScreenDetector=b,c.ErrorMonitor=T,c.ErrorMonitorWeb=p,c.PerformanceMonitor=v,c.createBlankScreenDetector=k,c.createErrorMonitorWeb=R,c.createPerformanceMonitor=C,c.default=p,Object.defineProperties(c,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
2
2
  //# sourceMappingURL=index.umd.js.map