@qhr123/sa2kit 0.6.2 → 0.7.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,"sources":["../../src/analytics/types.ts","../../src/analytics/core/EventQueue.ts","../../src/analytics/core/Uploader.ts","../../src/analytics/core/Analytics.ts","../../src/analytics/client/presets.ts","../../src/analytics/client/singleton.ts","../../src/analytics/utils/helpers.ts","../../src/analytics/utils/decorators.ts","../../src/analytics/utils/hooks.ts","../../src/analytics/adapters/web.ts","../../src/analytics/adapters/mobile.ts","../../src/analytics/adapters/miniapp.ts","../../src/analytics/adapters/desktop.ts","../../src/analytics/index.ts"],"names":["EventType","EventPriority","getAnalyticsInstance","useEffect","useCallback","useRef"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 埋点系统类型定义\n * Analytics System Type Definitions\n */\n\n/**\n * 事件类型枚举\n */\nexport enum EventType {\n // 页面事件\n PAGE_VIEW = 'page_view',\n PAGE_LEAVE = 'page_leave',\n\n // 用户行为事件\n CLICK = 'click',\n SCROLL = 'scroll',\n INPUT = 'input',\n SUBMIT = 'submit',\n\n // 业务事件\n LOGIN = 'login',\n LOGOUT = 'logout',\n REGISTER = 'register',\n SEARCH = 'search',\n SHARE = 'share',\n\n // 性能事件\n PERFORMANCE = 'performance',\n ERROR = 'error',\n API_CALL = 'api_call',\n\n // 自定义事件\n CUSTOM = 'custom',\n}\n\n/**\n * 事件优先级\n */\nexport enum EventPriority {\n LOW = 0, // 低优先级,可延迟上报\n NORMAL = 1, // 普通优先级,批量上报\n HIGH = 2, // 高优先级,实时上报\n CRITICAL = 3, // 关键事件,立即上报\n}\n\n/**\n * 基础事件数据接口\n */\nexport interface BaseEvent {\n // 基本信息\n event_id: string; // 事件唯一ID\n event_type: EventType; // 事件类型\n event_name: string; // 事件名称\n timestamp: number; // 事件时间戳\n priority: EventPriority; // 事件优先级\n\n // 用户信息\n user_id?: string; // 用户ID\n session_id: string; // 会话ID\n device_id: string; // 设备ID\n\n // 页面信息\n page_url?: string; // 页面URL\n page_title?: string; // 页面标题\n referrer?: string; // 来源页面\n\n // 自定义属性\n properties?: Record<string, any>;\n\n // 系统信息\n platform: string; // 平台:web/mobile/desktop/miniapp\n app_version: string; // 应用版本\n sdk_version: string; // SDK版本\n}\n\n/**\n * 页面浏览事件\n */\nexport interface PageViewEvent extends BaseEvent {\n event_type: EventType.PAGE_VIEW;\n page_url: string;\n page_title: string;\n duration?: number; // 页面停留时长(ms)\n}\n\n/**\n * 点击事件\n */\nexport interface ClickEvent extends BaseEvent {\n event_type: EventType.CLICK;\n element_id?: string; // 元素ID\n element_class?: string; // 元素类名\n element_text?: string; // 元素文本\n element_type?: string; // 元素类型\n position?: {\n // 点击位置\n x: number;\n y: number;\n };\n}\n\n/**\n * 错误事件\n */\nexport interface ErrorEvent extends BaseEvent {\n event_type: EventType.ERROR;\n error_message: string; // 错误信息\n error_stack?: string; // 错误堆栈\n error_type?: string; // 错误类型\n error_level?: 'warning' | 'error' | 'fatal';\n}\n\n/**\n * 性能事件\n */\nexport interface PerformanceEvent extends BaseEvent {\n event_type: EventType.PERFORMANCE;\n metric_name: string; // 指标名称\n metric_value: number; // 指标值\n metric_unit?: string; // 单位\n}\n\n/**\n * API调用事件\n */\nexport interface ApiCallEvent extends BaseEvent {\n event_type: EventType.API_CALL;\n api_url: string; // API地址\n api_method: string; // 请求方法\n api_status?: number; // 响应状态码\n duration?: number; // 请求耗时(ms)\n success: boolean; // 是否成功\n}\n\n/**\n * 所有事件类型联合\n */\nexport type AnalyticsEvent =\n | BaseEvent\n | PageViewEvent\n | ClickEvent\n | ErrorEvent\n | PerformanceEvent\n | ApiCallEvent;\n\n/**\n * 事件上报配置\n */\nexport interface AnalyticsConfig {\n // 基础配置\n appId: string; // 应用ID\n appVersion: string; // 应用版本\n endpoint: string; // 上报接口地址\n platform?: string; // 平台标识(web/mobile/miniapp/desktop)\n debug?: boolean; // 是否开启调试模式\n\n // 上报策略\n batchSize?: number; // 批量上报数量(默认10)\n batchInterval?: number; // 批量上报间隔(ms,默认5000)\n maxQueueSize?: number; // 最大队列长度(默认100)\n retryTimes?: number; // 失败重试次数(默认3)\n retryInterval?: number; // 重试间隔(ms,默认1000)\n\n // 功能开关\n enableAutoPageView?: boolean; // 自动采集页面浏览(默认true)\n enableAutoClick?: boolean; // 自动采集点击事件(默认false)\n enableAutoError?: boolean; // 自动采集错误(默认true)\n enableAutoPerformance?: boolean; // 自动采集性能(默认true)\n\n // 数据过滤\n ignoreUrls?: string[]; // 忽略的URL列表\n ignoreErrors?: string[]; // 忽略的错误列表\n beforeSend?: (event: AnalyticsEvent) => AnalyticsEvent | null; // 发送前钩子\n\n // 用户信息\n userId?: string; // 用户ID\n customProperties?: Record<string, any>; // 自定义全局属性\n}\n\n/**\n * 设备信息接口\n */\nexport interface DeviceInfo {\n device_id: string; // 设备唯一ID\n device_model?: string; // 设备型号\n device_brand?: string; // 设备品牌\n os_name: string; // 操作系统名称\n os_version: string; // 操作系统版本\n screen_width: number; // 屏幕宽度\n screen_height: number; // 屏幕高度\n language: string; // 系统语言\n timezone: string; // 时区\n network_type?: string; // 网络类型\n carrier?: string; // 运营商\n}\n\n/**\n * 上报响应接口\n */\nexport interface UploadResponse {\n success: boolean;\n message?: string;\n code?: number;\n}\n\n/**\n * 存储适配器接口\n */\nexport interface AnalyticsStorageAdapter {\n /**\n * 保存事件到本地存储\n */\n saveEvents(events: AnalyticsEvent[]): Promise<void>;\n\n /**\n * 获取本地存储的事件\n */\n getEvents(): Promise<AnalyticsEvent[]>;\n\n /**\n * 清除本地存储的事件\n */\n clearEvents(): Promise<void>;\n\n /**\n * 保存设备信息\n */\n saveDeviceInfo(info: DeviceInfo): Promise<void>;\n\n /**\n * 获取设备信息\n */\n getDeviceInfo(): Promise<DeviceInfo | null>;\n\n /**\n * 保存会话ID\n */\n saveSessionId(sessionId: string): Promise<void>;\n\n /**\n * 获取会话ID\n */\n getSessionId(): Promise<string | null>;\n}\n\n/**\n * 网络适配器接口\n */\nexport interface AnalyticsNetworkAdapter {\n /**\n * 上传事件数据\n */\n upload(url: string, events: AnalyticsEvent[]): Promise<UploadResponse>;\n\n /**\n * 检查网络连接状态\n */\n isOnline(): Promise<boolean>;\n}\n\n/**\n * 设备信息适配器接口\n */\nexport interface AnalyticsDeviceAdapter {\n /**\n * 获取设备信息\n */\n getDeviceInfo(): Promise<DeviceInfo>;\n\n /**\n * 生成设备唯一ID\n */\n generateDeviceId(): Promise<string>;\n}\n","/**\n * 事件队列管理器\n * Event Queue Manager\n */\n\nimport type { AnalyticsEvent } from '../types';\n\nexport class EventQueue {\n private queue: AnalyticsEvent[] = [];\n private maxSize: number;\n\n constructor(maxSize: number = 100) {\n this.maxSize = maxSize;\n }\n\n /**\n * 添加事件到队列\n */\n enqueue(event: AnalyticsEvent): void {\n // 如果队列已满,移除最老的低优先级事件\n if (this.queue.length >= this.maxSize) {\n this.removeLowestPriorityEvent();\n }\n\n this.queue.push(event);\n\n // 按优先级排序(高优先级在前)\n this.queue.sort((a, b) => b.priority - a.priority);\n }\n\n /**\n * 批量添加事件\n */\n enqueueBatch(events: AnalyticsEvent[]): void {\n events.forEach((event) => this.enqueue(event));\n }\n\n /**\n * 获取指定数量的事件\n */\n dequeue(count: number): AnalyticsEvent[] {\n return this.queue.splice(0, count);\n }\n\n /**\n * 获取所有事件\n */\n dequeueAll(): AnalyticsEvent[] {\n const events = [...this.queue];\n this.queue = [];\n return events;\n }\n\n /**\n * 获取高优先级事件\n */\n getHighPriorityEvents(): AnalyticsEvent[] {\n const highPriorityEvents = this.queue.filter(\n (event) => event.priority >= 2 // HIGH 和 CRITICAL\n );\n\n // 从队列中移除这些事件\n this.queue = this.queue.filter((event) => event.priority < 2);\n\n return highPriorityEvents;\n }\n\n /**\n * 查看队列长度\n */\n size(): number {\n return this.queue.length;\n }\n\n /**\n * 队列是否为空\n */\n isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n /**\n * 队列是否已满\n */\n isFull(): boolean {\n return this.queue.length >= this.maxSize;\n }\n\n /**\n * 清空队列\n */\n clear(): void {\n this.queue = [];\n }\n\n /**\n * 移除最低优先级的事件\n */\n private removeLowestPriorityEvent(): void {\n if (this.queue.length === 0) return;\n\n // 找到优先级最低的事件\n let lowestPriorityIndex = 0;\n let lowestPriority = this.queue[0]?.priority ?? 0;\n\n for (let i = 1; i < this.queue.length; i++) {\n const currentPriority = this.queue[i]?.priority ?? 0;\n if (currentPriority < lowestPriority) {\n lowestPriority = currentPriority;\n lowestPriorityIndex = i;\n }\n }\n\n this.queue.splice(lowestPriorityIndex, 1);\n }\n\n /**\n * 获取队列快照(不移除事件)\n */\n snapshot(): AnalyticsEvent[] {\n return [...this.queue];\n }\n}\n","/**\n * 事件上传器\n * Event Uploader\n */\n\nimport type {\n AnalyticsEvent,\n AnalyticsNetworkAdapter,\n AnalyticsStorageAdapter,\n} from '../types';\n\nexport interface UploaderConfig {\n endpoint: string;\n batchSize: number;\n retryTimes: number;\n retryInterval: number;\n networkAdapter: AnalyticsNetworkAdapter;\n storageAdapter: AnalyticsStorageAdapter;\n onSuccess?: (events: AnalyticsEvent[]) => void;\n onError?: (error: Error, events: AnalyticsEvent[]) => void;\n}\n\nexport class Uploader {\n private config: UploaderConfig;\n private uploading = false;\n private retryQueue: Map<string, { events: AnalyticsEvent[]; retryCount: number }> = new Map();\n\n constructor(config: UploaderConfig) {\n this.config = config;\n }\n\n /**\n * 上传事件\n */\n async upload(events: AnalyticsEvent[]): Promise<boolean> {\n if (events.length === 0) return true;\n\n // 检查网络状态\n const isOnline = await this.config.networkAdapter.isOnline();\n if (!isOnline) {\n // 离线时保存到本地\n await this.saveToLocal(events);\n return false;\n }\n\n try {\n this.uploading = true;\n\n const response = await this.config.networkAdapter.upload(this.config.endpoint, events);\n\n if (response.success) {\n this.config.onSuccess?.(events);\n return true;\n } else {\n throw new Error(response.message || 'Upload failed');\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.config.onError?.(err, events);\n\n // 添加到重试队列\n await this.addToRetryQueue(events);\n return false;\n } finally {\n this.uploading = false;\n }\n }\n\n /**\n * 批量上传\n */\n async uploadBatch(events: AnalyticsEvent[]): Promise<boolean> {\n const batches = this.splitIntoBatches(events, this.config.batchSize);\n const results = await Promise.all(batches.map((batch) => this.upload(batch)));\n\n return results.every((result) => result);\n }\n\n /**\n * 重试失败的上传\n */\n async retryFailedUploads(): Promise<void> {\n if (this.uploading || this.retryQueue.size === 0) return;\n\n const isOnline = await this.config.networkAdapter.isOnline();\n if (!isOnline) return;\n\n const entries = Array.from(this.retryQueue.entries());\n\n for (const [key, item] of entries) {\n if (item.retryCount >= this.config.retryTimes) {\n // 达到最大重试次数,保存到本地\n await this.saveToLocal(item.events);\n this.retryQueue.delete(key);\n continue;\n }\n\n // 延迟重试\n await this.delay(this.config.retryInterval * (item.retryCount + 1));\n\n const success = await this.upload(item.events);\n\n if (success) {\n this.retryQueue.delete(key);\n } else {\n // 增加重试次数\n item.retryCount++;\n }\n }\n }\n\n /**\n * 上传本地缓存的事件\n */\n async uploadCachedEvents(): Promise<void> {\n try {\n const cachedEvents = await this.config.storageAdapter.getEvents();\n\n if (cachedEvents.length > 0) {\n const success = await this.uploadBatch(cachedEvents);\n\n if (success) {\n await this.config.storageAdapter.clearEvents();\n }\n }\n } catch (error) {\n console.error('Failed to upload cached events:', error);\n }\n }\n\n /**\n * 保存事件到本地存储\n */\n private async saveToLocal(events: AnalyticsEvent[]): Promise<void> {\n try {\n const existingEvents = await this.config.storageAdapter.getEvents();\n const allEvents = [...existingEvents, ...events];\n await this.config.storageAdapter.saveEvents(allEvents);\n } catch (error) {\n console.error('Failed to save events to local storage:', error);\n }\n }\n\n /**\n * 添加到重试队列\n */\n private async addToRetryQueue(events: AnalyticsEvent[]): Promise<void> {\n const key = `${Date.now()}_${Math.random()}`;\n this.retryQueue.set(key, {\n events,\n retryCount: 0,\n });\n }\n\n /**\n * 分割成批次\n */\n private splitIntoBatches(events: AnalyticsEvent[], batchSize: number): AnalyticsEvent[][] {\n const batches: AnalyticsEvent[][] = [];\n\n for (let i = 0; i < events.length; i += batchSize) {\n batches.push(events.slice(i, i + batchSize));\n }\n\n return batches;\n }\n\n /**\n * 延迟函数\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * 是否正在上传\n */\n isUploading(): boolean {\n return this.uploading;\n }\n\n /**\n * 获取重试队列大小\n */\n getRetryQueueSize(): number {\n return this.retryQueue.size;\n }\n\n /**\n * 清空重试队列\n */\n clearRetryQueue(): void {\n this.retryQueue.clear();\n }\n}\n","/**\n * 埋点系统核心类\n * Analytics Core SDK\n */\n\nimport {\n EventType,\n EventPriority,\n type AnalyticsConfig,\n type AnalyticsEvent,\n type BaseEvent,\n type AnalyticsStorageAdapter,\n type AnalyticsNetworkAdapter,\n type AnalyticsDeviceAdapter,\n type DeviceInfo,\n} from '../types';\nimport { EventQueue } from './EventQueue';\nimport { Uploader } from './Uploader';\n\nconst SDK_VERSION = '1.0.0';\n\nexport class Analytics {\n private config: Required<AnalyticsConfig>;\n private eventQueue: EventQueue;\n private uploader: Uploader;\n private storageAdapter: AnalyticsStorageAdapter;\n private networkAdapter: AnalyticsNetworkAdapter;\n private deviceAdapter: AnalyticsDeviceAdapter;\n\n private sessionId: string = '';\n private deviceId: string = '';\n private deviceInfo: DeviceInfo | null = null;\n private initialized = false;\n private batchTimer: any = null;\n\n constructor(\n config: Omit<AnalyticsConfig, 'endpoint'> & {\n adapter?: {\n storage: AnalyticsStorageAdapter;\n network: AnalyticsNetworkAdapter;\n device: AnalyticsDeviceAdapter;\n };\n platform?: string;\n serverUrl?: string;\n endpoint?: string;\n },\n storageAdapter?: AnalyticsStorageAdapter,\n networkAdapter?: AnalyticsNetworkAdapter,\n deviceAdapter?: AnalyticsDeviceAdapter\n ) {\n // 支持两种初始化方式:\n // 1. 新方式:传入包含 adapter 的 config 对象\n // 2. 旧方式:分别传入四个参数\n if (config.adapter) {\n this.storageAdapter = config.adapter.storage;\n this.networkAdapter = config.adapter.network;\n this.deviceAdapter = config.adapter.device;\n } else if (storageAdapter && networkAdapter && deviceAdapter) {\n this.storageAdapter = storageAdapter;\n this.networkAdapter = networkAdapter;\n this.deviceAdapter = deviceAdapter;\n } else {\n throw new Error('Analytics initialization failed: adapter is required');\n }\n\n // 合并默认配置\n const serverUrl = (config as any).serverUrl || config.endpoint || '/api/analytics/events';\n const platform = (config as any).platform || 'web';\n\n this.config = {\n ...config,\n appId: config.appId,\n appVersion: config.appVersion || '1.0.0',\n platform: platform,\n endpoint: serverUrl,\n batchSize: config.batchSize ?? 10,\n batchInterval: config.batchInterval ?? 5000,\n maxQueueSize: config.maxQueueSize ?? 100,\n retryTimes: config.retryTimes ?? 3,\n retryInterval: config.retryInterval ?? 1000,\n enableAutoPageView: config.enableAutoPageView ?? true,\n enableAutoClick: config.enableAutoClick ?? false,\n enableAutoError: config.enableAutoError ?? true,\n enableAutoPerformance: config.enableAutoPerformance ?? true,\n debug: config.debug ?? false,\n ignoreUrls: config.ignoreUrls ?? [],\n ignoreErrors: config.ignoreErrors ?? [],\n beforeSend: config.beforeSend,\n } as Required<AnalyticsConfig>;\n\n this.eventQueue = new EventQueue(this.config.maxQueueSize);\n this.uploader = new Uploader({\n endpoint: this.config.endpoint,\n batchSize: this.config.batchSize,\n retryTimes: this.config.retryTimes,\n retryInterval: this.config.retryInterval,\n networkAdapter: this.networkAdapter,\n storageAdapter: this.storageAdapter,\n onSuccess: (events) => this.onUploadSuccess(events),\n onError: (error, events) => this.onUploadError(error, events),\n });\n\n // 自动初始化\n this.init().catch((error) => {\n console.error('Failed to initialize Analytics:', error);\n });\n }\n\n /**\n * 初始化\n */\n async init(): Promise<void> {\n if (this.initialized) {\n this.log('Analytics already initialized');\n return;\n }\n\n try {\n // 初始化设备信息\n await this.initDeviceInfo();\n\n // 初始化会话\n await this.initSession();\n\n // 上传缓存的事件\n await this.uploader.uploadCachedEvents();\n\n // 启动批量上传定时器\n this.startBatchTimer();\n\n // 监听调试配置变化\n if (typeof window !== 'undefined') {\n window.addEventListener('analytics-debug-changed', ((e: CustomEvent) => {\n this.log(`Debug mode changed: ${e.detail.enabled ? 'enabled' : 'disabled'}`);\n }) as EventListener);\n }\n\n this.initialized = true;\n this.log('Analytics initialized successfully');\n } catch (error) {\n console.error('Failed to initialize analytics:', error);\n throw error;\n }\n }\n\n /**\n * 追踪事件(简化版本,支持两种调用方式)\n */\n track(\n eventNameOrType: string | EventType,\n propertiesOrName?: Record<string, any> | string,\n maybeProperties?: Record<string, any>,\n priority: EventPriority = EventPriority.NORMAL\n ): void {\n if (!this.initialized) {\n console.warn('Analytics not initialized yet, queuing event...');\n // 可以选择在初始化后重试\n setTimeout(\n () => this.track(eventNameOrType, propertiesOrName, maybeProperties, priority),\n 100\n );\n return;\n }\n\n let eventType: EventType;\n let eventName: string;\n let properties: Record<string, any> | undefined;\n\n // 支持两种调用方式:\n // 1. track(eventName, properties) - 简化版\n // 2. track(eventType, eventName, properties, priority) - 完整版\n if (typeof propertiesOrName === 'string') {\n // 完整版调用\n eventType = eventNameOrType as EventType;\n eventName = propertiesOrName;\n properties = maybeProperties;\n } else {\n // 简化版调用\n eventType = EventType.CUSTOM;\n eventName = eventNameOrType as string;\n properties = propertiesOrName;\n }\n\n const event = this.createEvent(eventType, eventName, properties, priority);\n\n // beforeSend 钩子\n const processedEvent = this.config.beforeSend?.(event) ?? event;\n if (!processedEvent) {\n this.log('Event filtered by beforeSend hook', event);\n return;\n }\n\n // 添加到队列\n this.eventQueue.enqueue(processedEvent);\n this.log('Event tracked', processedEvent);\n\n // 高优先级事件立即上传\n if (priority >= EventPriority.HIGH) {\n this.flushHighPriority();\n }\n\n // 队列满了自动上传\n if (this.eventQueue.isFull()) {\n this.flush();\n }\n }\n\n /**\n * 追踪页面浏览\n */\n trackPageView(pageUrl: string, pageTitle: string, properties?: Record<string, any>): void {\n this.track(\n EventType.PAGE_VIEW,\n 'page_view',\n {\n page_url: pageUrl,\n page_title: pageTitle,\n ...properties,\n },\n EventPriority.NORMAL\n );\n }\n\n /**\n * 追踪点击事件\n */\n trackClick(\n elementInfo: {\n elementId?: string;\n elementClass?: string;\n elementText?: string;\n elementType?: string;\n position?: { x: number; y: number };\n },\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.CLICK,\n 'click',\n {\n ...elementInfo,\n ...properties,\n },\n EventPriority.LOW\n );\n }\n\n /**\n * 追踪错误\n */\n trackError(\n errorMessage: string,\n errorStack?: string,\n errorType?: string,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.ERROR,\n 'error',\n {\n error_message: errorMessage,\n error_stack: errorStack,\n error_type: errorType,\n ...properties,\n },\n EventPriority.HIGH\n );\n }\n\n /**\n * 追踪性能指标\n */\n trackPerformance(\n metricName: string,\n metricValue: number,\n metricUnit?: string,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.PERFORMANCE,\n 'performance',\n {\n metric_name: metricName,\n metric_value: metricValue,\n metric_unit: metricUnit,\n ...properties,\n },\n EventPriority.LOW\n );\n }\n\n /**\n * 追踪 API 调用\n */\n trackApiCall(\n apiUrl: string,\n apiMethod: string,\n apiStatus: number,\n duration: number,\n success: boolean,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.API_CALL,\n 'api_call',\n {\n api_url: apiUrl,\n api_method: apiMethod,\n api_status: apiStatus,\n duration,\n success,\n ...properties,\n },\n EventPriority.NORMAL\n );\n }\n\n /**\n * 设置用户ID\n */\n setUserId(userId: string): void {\n this.config.userId = userId;\n this.log('User ID set', userId);\n }\n\n /**\n * 设置用户信息(包括用户ID和其他属性)\n */\n setUser(userInfo: { userId: string; [key: string]: any }): void {\n const { userId, ...otherProps } = userInfo;\n this.config.userId = userId;\n this.config.customProperties = {\n ...this.config.customProperties,\n ...otherProps,\n };\n this.log('User info set', userInfo);\n }\n\n /**\n * 设置自定义属性\n */\n setCustomProperties(properties: Record<string, any>): void {\n this.config.customProperties = {\n ...this.config.customProperties,\n ...properties,\n };\n this.log('Custom properties set', properties);\n }\n\n /**\n * 立即上传所有事件\n */\n async flush(): Promise<void> {\n if (this.eventQueue.isEmpty()) {\n return;\n }\n\n const events = this.eventQueue.dequeueAll();\n await this.uploader.upload(events);\n }\n\n /**\n * 立即上传高优先级事件\n */\n private async flushHighPriority(): Promise<void> {\n const highPriorityEvents = this.eventQueue.getHighPriorityEvents();\n\n if (highPriorityEvents.length > 0) {\n await this.uploader.upload(highPriorityEvents);\n }\n }\n\n /**\n * 销毁实例\n */\n async destroy(): Promise<void> {\n // 停止定时器\n if (this.batchTimer) {\n clearInterval(this.batchTimer);\n this.batchTimer = null;\n }\n\n // 上传剩余事件\n await this.flush();\n\n this.initialized = false;\n this.log('Analytics destroyed');\n }\n\n /**\n * 创建事件对象\n */\n private createEvent(\n eventType: EventType,\n eventName: string,\n properties?: Record<string, any>,\n priority: EventPriority = EventPriority.NORMAL\n ): BaseEvent {\n // 获取当前页面信息(仅在浏览器环境)\n let pageUrl: string | undefined;\n let pageTitle: string | undefined;\n let referrer: string | undefined;\n\n if (typeof window !== 'undefined') {\n pageUrl = window.location.href;\n pageTitle = document.title;\n referrer = document.referrer || undefined;\n }\n\n return {\n event_id: this.generateEventId(),\n event_type: eventType,\n event_name: eventName,\n timestamp: Date.now(),\n priority,\n user_id: this.config.userId,\n session_id: this.sessionId,\n device_id: this.deviceId,\n page_url: pageUrl,\n page_title: pageTitle,\n referrer: referrer,\n properties: {\n ...this.config.customProperties,\n ...properties,\n },\n platform: this.getPlatform(),\n app_version: this.config.appVersion,\n sdk_version: SDK_VERSION,\n };\n }\n\n /**\n * 初始化设备信息\n */\n private async initDeviceInfo(): Promise<void> {\n try {\n // 尝试从缓存获取\n let cachedDeviceInfo = await this.storageAdapter.getDeviceInfo();\n\n if (!cachedDeviceInfo) {\n // 生成新的设备信息\n this.deviceInfo = await this.deviceAdapter.getDeviceInfo();\n this.deviceId = await this.deviceAdapter.generateDeviceId();\n\n // 保存到缓存\n await this.storageAdapter.saveDeviceInfo(this.deviceInfo);\n } else {\n this.deviceInfo = cachedDeviceInfo;\n this.deviceId = cachedDeviceInfo.device_id;\n }\n } catch (error) {\n console.error('Failed to init device info:', error);\n // 使用临时ID\n this.deviceId = `temp_${Date.now()}_${Math.random()}`;\n }\n }\n\n /**\n * 初始化会话\n */\n private async initSession(): Promise<void> {\n try {\n // 尝试从缓存获取\n const cachedSessionId = await this.storageAdapter.getSessionId();\n\n if (cachedSessionId) {\n this.sessionId = cachedSessionId;\n } else {\n // 生成新会话\n this.sessionId = this.generateSessionId();\n await this.storageAdapter.saveSessionId(this.sessionId);\n }\n } catch (error) {\n console.error('Failed to init session:', error);\n this.sessionId = this.generateSessionId();\n }\n }\n\n /**\n * 启动批量上传定时器\n */\n private startBatchTimer(): void {\n this.batchTimer = setInterval(() => {\n if (!this.eventQueue.isEmpty()) {\n this.flush();\n }\n\n // 重试失败的上传\n this.uploader.retryFailedUploads();\n }, this.config.batchInterval);\n }\n\n /**\n * 上传成功回调\n */\n private onUploadSuccess(events: AnalyticsEvent[]): void {\n this.log('Events uploaded successfully', events);\n }\n\n /**\n * 上传失败回调\n */\n private onUploadError(error: Error, events: AnalyticsEvent[]): void {\n this.log('Failed to upload events', { error, events });\n }\n\n /**\n * 生成事件ID\n */\n private generateEventId(): string {\n return `${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }\n\n /**\n * 生成会话ID\n */\n private generateSessionId(): string {\n return `session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }\n\n /**\n * 获取平台标识\n */\n private getPlatform(): string {\n return this.config.platform || 'unknown';\n }\n\n /**\n * 日志输出\n */\n private log(message: string, data?: any): void {\n // 检查动态调试配置(优先级高于初始化时的 debug 配置)\n const dynamicDebug =\n typeof window !== 'undefined' ? localStorage.getItem('analytics-debug') === 'true' : false;\n\n if (this.config.debug || dynamicDebug) {\n console.log(`[Analytics] ${message}`, data ?? '');\n }\n }\n\n /**\n * 获取队列状态\n */\n getQueueStatus(): {\n size: number;\n isFull: boolean;\n isEmpty: boolean;\n } {\n return {\n size: this.eventQueue.size(),\n isFull: this.eventQueue.isFull(),\n isEmpty: this.eventQueue.isEmpty(),\n };\n }\n\n /**\n * 获取初始化状态\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n}\n","/**\n * Analytics 预设配置\n * Analytics Preset Configurations\n *\n * 提供常见场景的配置模板(不包含平台适配器)\n * 使用时需要提供具体的 adapter 实现\n */\n\nimport type { AnalyticsConfig } from '../types';\n\n/**\n * Web 应用基础配置模板\n */\nexport function createWebConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n enableAutoPageView?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'web',\n enableAutoPageView: options.enableAutoPageView ?? true,\n debug:\n options.debug ??\n (typeof process !== 'undefined' && process.env?.NODE_ENV === 'development'),\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 移动应用基础配置模板\n */\nexport function createMobileConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'mobile',\n enableAutoPageView: false,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 小程序基础配置模板\n */\nexport function createMiniappConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'miniapp',\n enableAutoPageView: true,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 桌面应用基础配置模板\n */\nexport function createDesktopConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'desktop',\n enableAutoPageView: false,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 使用示例:\n *\n * ```typescript\n * import { createWebConfig, createAnalytics } from '@qhr123/sa2kit/analytics';\n * import { webAdapter } from './adapters/web'; // 你的适配器实现\n *\n * const config = createWebConfig('my-app', {\n * endpoint: 'https://api.example.com/analytics',\n * debug: true,\n * });\n *\n * const analytics = createAnalytics('my-instance', {\n * ...config,\n * adapter: webAdapter, // 提供具体的适配器\n * });\n * ```\n */\n","/**\n * Analytics 单例管理器\n * Analytics Singleton Manager\n *\n * 提供统一的单例创建和管理功能,支持多个独立实例\n */\n\nimport { Analytics } from '../core/Analytics';\nimport type { AnalyticsConfig } from '../types';\n\n// 存储多个实例的 Map\nconst instances = new Map<string, Analytics>();\n\n/**\n * 创建或获取 Analytics 实例\n * @param instanceKey 实例唯一标识\n * @param config Analytics 配置\n * @returns Analytics 实例\n */\nexport function createAnalytics(instanceKey: string, config: AnalyticsConfig): Analytics {\n if (!instances.has(instanceKey)) {\n instances.set(instanceKey, new Analytics(config));\n }\n return instances.get(instanceKey)!;\n}\n\n/**\n * 获取已存在的 Analytics 实例\n * @param instanceKey 实例唯一标识\n * @returns Analytics 实例或 null\n */\nexport function getAnalyticsInstance(instanceKey: string): Analytics | null {\n return instances.get(instanceKey) || null;\n}\n\n/**\n * 重置指定实例\n * @param instanceKey 实例唯一标识\n */\nexport function resetAnalytics(instanceKey: string): void {\n instances.delete(instanceKey);\n}\n\n/**\n * 重置所有实例\n */\nexport function resetAllAnalytics(): void {\n instances.clear();\n}\n\n/**\n * 检查实例是否已初始化\n * @param instanceKey 实例唯一标识\n */\nexport function isAnalyticsInitialized(instanceKey: string): boolean {\n return instances.has(instanceKey);\n}\n\n/**\n * 获取所有已创建的实例键名\n */\nexport function getAllInstanceKeys(): string[] {\n return Array.from(instances.keys());\n}\n","/**\n * 埋点工具函数\n * Analytics Helper Functions\n */\n\nimport type { AnalyticsEvent } from '../types';\n\n/**\n * 节流函数\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: any = null;\n let previous = 0;\n\n return function (this: any, ...args: Parameters<T>) {\n const now = Date.now();\n const remaining = wait - (now - previous);\n\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n func.apply(this, args);\n } else if (!timeout) {\n timeout = setTimeout(() => {\n previous = Date.now();\n timeout = null;\n func.apply(this, args);\n }, remaining);\n }\n };\n}\n\n/**\n * 防抖函数\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: any = null;\n\n return function (this: any, ...args: Parameters<T>) {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(() => {\n func.apply(this, args);\n }, wait);\n };\n}\n\n/**\n * 格式化事件数据\n */\nexport function formatEvent(event: AnalyticsEvent): string {\n return JSON.stringify(event, null, 2);\n}\n\n/**\n * 验证事件数据\n */\nexport function validateEvent(event: AnalyticsEvent): boolean {\n if (!event.event_id || !event.event_type || !event.event_name) {\n return false;\n }\n if (!event.timestamp || event.timestamp <= 0) {\n return false;\n }\n if (!event.session_id || !event.device_id) {\n return false;\n }\n return true;\n}\n\n/**\n * 批量验证事件\n */\nexport function validateEvents(events: AnalyticsEvent[]): {\n valid: AnalyticsEvent[];\n invalid: AnalyticsEvent[];\n} {\n const valid: AnalyticsEvent[] = [];\n const invalid: AnalyticsEvent[] = [];\n\n events.forEach((event) => {\n if (validateEvent(event)) {\n valid.push(event);\n } else {\n invalid.push(event);\n }\n });\n\n return { valid, invalid };\n}\n\n/**\n * 计算事件大小(字节)\n */\nexport function getEventSize(event: AnalyticsEvent): number {\n return new Blob([JSON.stringify(event)]).size;\n}\n\n/**\n * 计算批量事件大小\n */\nexport function getBatchSize(events: AnalyticsEvent[]): number {\n return events.reduce((total, event) => total + getEventSize(event), 0);\n}\n\n/**\n * 过滤敏感信息\n */\nexport function sanitizeEvent(\n event: AnalyticsEvent,\n sensitiveKeys: string[] = ['password', 'token', 'secret', 'key']\n): AnalyticsEvent {\n const sanitized = { ...event };\n\n if (sanitized.properties) {\n const cleanProperties = { ...sanitized.properties };\n\n sensitiveKeys.forEach((key) => {\n if (key in cleanProperties) {\n cleanProperties[key] = '***';\n }\n });\n\n sanitized.properties = cleanProperties;\n }\n\n return sanitized;\n}\n\n/**\n * 合并事件属性\n */\nexport function mergeEventProperties(\n baseProperties: Record<string, any>,\n ...additionalProperties: Record<string, any>[]\n): Record<string, any> {\n return Object.assign({}, baseProperties, ...additionalProperties);\n}\n\n/**\n * 生成唯一ID\n */\nexport function generateUniqueId(prefix: string = ''): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 15);\n return prefix ? `${prefix}_${timestamp}_${random}` : `${timestamp}_${random}`;\n}\n\n/**\n * 判断是否为移动设备\n */\nexport function isMobile(): boolean {\n if (typeof navigator === 'undefined') return false;\n\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n}\n\n/**\n * 判断是否为开发环境\n */\nexport function isDevelopment(): boolean {\n return process.env.NODE_ENV === 'development';\n}\n\n/**\n * 格式化时间戳\n */\nexport function formatTimestamp(\n timestamp: number,\n format: 'date' | 'datetime' | 'time' = 'datetime'\n): string {\n const date = new Date(timestamp);\n\n switch (format) {\n case 'date':\n return date.toLocaleDateString();\n case 'time':\n return date.toLocaleTimeString();\n case 'datetime':\n default:\n return date.toLocaleString();\n }\n}\n\n/**\n * 深拷贝对象\n */\nexport function deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * 安全的 JSON.stringify\n */\nexport function safeStringify(obj: any, fallback: string = '{}'): string {\n try {\n return JSON.stringify(obj);\n } catch (error) {\n console.error('Failed to stringify object:', error);\n return fallback;\n }\n}\n\n/**\n * 安全的 JSON.parse\n */\nexport function safeParse<T>(json: string, fallback: T): T {\n try {\n return JSON.parse(json);\n } catch (error) {\n console.error('Failed to parse JSON:', error);\n return fallback;\n }\n}\n\n/**\n * 获取页面停留时长\n */\nexport function getPageDuration(startTime: number): number {\n return Date.now() - startTime;\n}\n\n/**\n * 获取当前页面 URL\n */\nexport function getCurrentPageUrl(): string {\n if (typeof window !== 'undefined') {\n return window.location.href;\n }\n return '';\n}\n\n/**\n * 获取当前页面标题\n */\nexport function getCurrentPageTitle(): string {\n if (typeof document !== 'undefined') {\n return document.title;\n }\n return '';\n}\n\n/**\n * 获取来源页面\n */\nexport function getReferrer(): string {\n if (typeof document !== 'undefined') {\n return document.referrer;\n }\n return '';\n}\n","/**\n * 埋点装饰器\n * Analytics Decorators\n */\n\nimport type { Analytics } from '../core/Analytics';\nimport { EventType, EventPriority } from '../types';\n\n/**\n * 追踪方法执行\n * @param eventName 事件名称\n * @param priority 事件优先级\n */\nexport function Track(eventName?: string, priority: EventPriority = EventPriority.NORMAL) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalEventName = eventName || propertyKey;\n\n // 执行前记录\n const startTime = Date.now();\n\n try {\n const result = await originalMethod.apply(this, args);\n\n // 执行成功\n analytics?.track(\n EventType.CUSTOM,\n finalEventName,\n {\n success: true,\n duration: Date.now() - startTime,\n args: JSON.stringify(args),\n },\n priority\n );\n\n return result;\n } catch (error) {\n // 执行失败\n analytics?.track(\n EventType.ERROR,\n `${finalEventName}_error`,\n {\n success: false,\n duration: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n },\n EventPriority.HIGH\n );\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 追踪点击事件\n */\nexport function TrackClick(eventName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalEventName = eventName || propertyKey;\n\n analytics?.track(\n EventType.CLICK,\n finalEventName,\n {\n args: JSON.stringify(args),\n },\n EventPriority.LOW\n );\n\n return originalMethod.apply(this, args);\n };\n\n return descriptor;\n };\n}\n\n/**\n * 追踪性能\n */\nexport function TrackPerformance(metricName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalMetricName = metricName || propertyKey;\n const startTime = performance.now();\n\n try {\n const result = await originalMethod.apply(this, args);\n const duration = performance.now() - startTime;\n\n analytics?.trackPerformance(finalMetricName, duration, 'ms', {\n success: true,\n });\n\n return result;\n } catch (error) {\n const duration = performance.now() - startTime;\n\n analytics?.trackPerformance(finalMetricName, duration, 'ms', {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 自动捕获错误\n */\nexport function CatchError(_eventName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n try {\n return await originalMethod.apply(this, args);\n } catch (error) {\n const analytics = getAnalyticsInstance(this);\n\n analytics?.trackError(\n error instanceof Error ? error.message : String(error),\n error instanceof Error ? error.stack : undefined,\n error instanceof Error ? error.name : 'Error',\n {\n method: propertyKey,\n args: JSON.stringify(args),\n }\n );\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 从实例中获取 Analytics 实例\n */\nfunction getAnalyticsInstance(instance: any): Analytics | null {\n // 尝试多种方式获取\n if (instance.analytics) {\n return instance.analytics;\n }\n if (instance._analytics) {\n return instance._analytics;\n }\n if ((globalThis as any).__analytics__) {\n return (globalThis as any).__analytics__;\n }\n return null;\n}\n\n/**\n * 设置全局 Analytics 实例\n */\nexport function setGlobalAnalytics(analytics: Analytics): void {\n (globalThis as any).__analytics__ = analytics;\n}\n\n/**\n * 获取全局 Analytics 实例\n */\nexport function getGlobalAnalytics(): Analytics | null {\n return (globalThis as any).__analytics__ || null;\n}\n","'use client';\n\n/**\n * React Hooks for Analytics\n * 埋点 React Hooks\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport type { Analytics } from '../core/Analytics';\nimport { EventType, EventPriority } from '../types';\n\n/**\n * 使用埋点实例\n */\nexport function useAnalytics(analytics: Analytics | null) {\n return analytics;\n}\n\n/**\n * 追踪页面浏览\n */\nexport function usePageView(analytics: Analytics | null, pageUrl?: string, pageTitle?: string) {\n useEffect(() => {\n if (!analytics) return;\n\n const url = pageUrl || (typeof window !== 'undefined' ? window.location.href : '');\n const title = pageTitle || (typeof document !== 'undefined' ? document.title : '');\n\n analytics.trackPageView(url, title);\n }, [analytics, pageUrl, pageTitle]);\n}\n\n/**\n * 追踪事件(返回追踪函数)\n */\nexport function useTrackEvent(analytics: Analytics | null) {\n return useCallback(\n (\n eventType: EventType,\n eventName: string,\n properties?: Record<string, any>,\n priority?: EventPriority\n ) => {\n if (analytics) {\n analytics.track(eventType, eventName, properties, priority);\n }\n },\n [analytics]\n );\n}\n\n/**\n * 追踪点击事件\n */\nexport function useTrackClick(analytics: Analytics | null) {\n return useCallback(\n (elementInfo: {\n elementId?: string;\n elementClass?: string;\n elementText?: string;\n elementType?: string;\n }) => {\n if (analytics) {\n analytics.trackClick(elementInfo);\n }\n },\n [analytics]\n );\n}\n\n/**\n * 追踪页面停留时长\n */\nexport function usePageDuration(analytics: Analytics | null) {\n const startTimeRef = useRef<number>(Date.now());\n\n useEffect(() => {\n startTimeRef.current = Date.now();\n\n return () => {\n if (analytics) {\n const duration = Date.now() - startTimeRef.current;\n analytics.track(\n EventType.PAGE_LEAVE,\n 'page_leave',\n {\n duration,\n page_url: typeof window !== 'undefined' ? window.location.href : '',\n },\n EventPriority.NORMAL\n );\n }\n };\n }, [analytics]);\n}\n\n/**\n * 追踪性能指标\n */\nexport function usePerformanceTracking(analytics: Analytics | null) {\n useEffect(() => {\n if (!analytics || typeof window === 'undefined') return;\n\n // 监听页面加载性能\n if ('performance' in window && 'timing' in window.performance) {\n const timing = window.performance.timing as any;\n const loadTime = timing.loadEventEnd - timing.navigationStart;\n const domReadyTime = timing.domContentLoadedEventEnd - timing.navigationStart;\n const firstPaintTime = timing.responseStart - timing.navigationStart;\n\n analytics.trackPerformance('page_load_time', loadTime, 'ms');\n analytics.trackPerformance('dom_ready_time', domReadyTime, 'ms');\n analytics.trackPerformance('first_paint_time', firstPaintTime, 'ms');\n }\n\n // 监听资源加载性能\n if ('PerformanceObserver' in window) {\n const observer = new PerformanceObserver((list) => {\n list.getEntries().forEach((entry) => {\n if (entry.entryType === 'resource') {\n analytics.trackPerformance('resource_load_time', entry.duration, 'ms', {\n resource_name: entry.name,\n });\n }\n });\n });\n\n observer.observe({ entryTypes: ['resource'] });\n\n return () => observer.disconnect();\n }\n\n return undefined;\n }, [analytics]);\n}\n\n/**\n * 追踪错误\n */\nexport function useErrorTracking(analytics: Analytics | null) {\n useEffect(() => {\n if (!analytics || typeof window === 'undefined') return;\n\n const handleError = (event: ErrorEvent) => {\n analytics.trackError(event.message, event.error?.stack, event.error?.name, {\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n });\n };\n\n const handleUnhandledRejection = (event: PromiseRejectionEvent) => {\n analytics.trackError('Unhandled Promise Rejection', undefined, 'PromiseRejection', {\n reason: String(event.reason),\n });\n };\n\n window.addEventListener('error', handleError);\n window.addEventListener('unhandledrejection', handleUnhandledRejection);\n\n return () => {\n window.removeEventListener('error', handleError);\n window.removeEventListener('unhandledrejection', handleUnhandledRejection);\n };\n }, [analytics]);\n}\n\n/**\n * 自动追踪用户行为(综合 Hook)\n */\nexport function useAutoTracking(\n analytics: Analytics | null,\n options: {\n trackPageView?: boolean;\n trackPageDuration?: boolean;\n trackPerformance?: boolean;\n trackErrors?: boolean;\n } = {}\n) {\n const {\n trackPageView = true,\n trackPageDuration = true,\n trackPerformance = true,\n trackErrors = true,\n } = options;\n\n // 页面浏览\n useEffect(() => {\n if (trackPageView && analytics) {\n const url = typeof window !== 'undefined' ? window.location.href : '';\n const title = typeof document !== 'undefined' ? document.title : '';\n analytics.trackPageView(url, title);\n }\n }, [analytics, trackPageView]);\n\n // 页面停留时长\n const startTimeRef = useRef<number>(Date.now());\n useEffect(() => {\n if (!trackPageDuration || !analytics) return;\n\n startTimeRef.current = Date.now();\n\n return () => {\n const duration = Date.now() - startTimeRef.current;\n analytics.track(\n EventType.PAGE_LEAVE,\n 'page_leave',\n {\n duration,\n page_url: typeof window !== 'undefined' ? window.location.href : '',\n },\n EventPriority.NORMAL\n );\n };\n }, [analytics, trackPageDuration]);\n\n // 性能追踪\n useEffect(() => {\n if (!trackPerformance || !analytics || typeof window === 'undefined') return;\n\n const handleLoad = () => {\n if ('performance' in window && 'timing' in window.performance) {\n const timing = window.performance.timing as any;\n const loadTime = timing.loadEventEnd - timing.navigationStart;\n analytics.trackPerformance('page_load_time', loadTime, 'ms');\n }\n };\n\n window.addEventListener('load', handleLoad);\n return () => window.removeEventListener('load', handleLoad);\n }, [analytics, trackPerformance]);\n\n // 错误追踪\n useEffect(() => {\n if (!trackErrors || !analytics || typeof window === 'undefined') return;\n\n const handleError = (event: ErrorEvent) => {\n analytics.trackError(event.message, event.error?.stack, event.error?.name);\n };\n\n window.addEventListener('error', handleError);\n return () => window.removeEventListener('error', handleError);\n }, [analytics, trackErrors]);\n}\n","/**\n * Web 平台适配器\n * Browser/Next.js Platform Adapters\n */\n\nimport type {\n AnalyticsStorageAdapter,\n AnalyticsNetworkAdapter,\n AnalyticsDeviceAdapter,\n DeviceInfo,\n AnalyticsEvent,\n UploadResponse,\n} from '../types';\n\n/**\n * Web 存储适配器(使用 localStorage)\n */\nexport class WebStorageAdapter implements AnalyticsStorageAdapter {\n private EVENTS_KEY = 'analytics:events';\n private DEVICE_INFO_KEY = 'analytics:device_info';\n private SESSION_ID_KEY = 'analytics:session_id';\n\n async saveEvents(events: AnalyticsEvent[]): Promise<void> {\n try {\n if (typeof window !== 'undefined') {\n localStorage.setItem(this.EVENTS_KEY, JSON.stringify(events));\n }\n } catch (error) {\n console.error('Failed to save events:', error);\n }\n }\n\n async getEvents(): Promise<AnalyticsEvent[]> {\n try {\n if (typeof window !== 'undefined') {\n const data = localStorage.getItem(this.EVENTS_KEY);\n return data ? JSON.parse(data) : [];\n }\n return [];\n } catch (error) {\n console.error('Failed to get events:', error);\n return [];\n }\n }\n\n async clearEvents(): Promise<void> {\n try {\n if (typeof window !== 'undefined') {\n localStorage.removeItem(this.EVENTS_KEY);\n }\n } catch (error) {\n console.error('Failed to clear events:', error);\n }\n }\n\n async saveDeviceInfo(info: DeviceInfo): Promise<void> {\n try {\n if (typeof window !== 'undefined') {\n localStorage.setItem(this.DEVICE_INFO_KEY, JSON.stringify(info));\n }\n } catch (error) {\n console.error('Failed to save device info:', error);\n }\n }\n\n async getDeviceInfo(): Promise<DeviceInfo | null> {\n try {\n if (typeof window !== 'undefined') {\n const data = localStorage.getItem(this.DEVICE_INFO_KEY);\n return data ? JSON.parse(data) : null;\n }\n return null;\n } catch (error) {\n console.error('Failed to get device info:', error);\n return null;\n }\n }\n\n async saveSessionId(sessionId: string): Promise<void> {\n try {\n if (typeof window !== 'undefined') {\n sessionStorage.setItem(this.SESSION_ID_KEY, sessionId);\n }\n } catch (error) {\n console.error('Failed to save session ID:', error);\n }\n }\n\n async getSessionId(): Promise<string | null> {\n try {\n if (typeof window !== 'undefined') {\n return sessionStorage.getItem(this.SESSION_ID_KEY);\n }\n return null;\n } catch (error) {\n console.error('Failed to get session ID:', error);\n return null;\n }\n }\n}\n\n/**\n * Web 网络适配器\n */\nexport class WebNetworkAdapter implements AnalyticsNetworkAdapter {\n async upload(url: string, events: AnalyticsEvent[]): Promise<UploadResponse> {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n events,\n timestamp: Date.now(),\n }),\n // 使用 keepalive 确保页面关闭时也能发送\n keepalive: true,\n });\n\n if (response.ok) {\n const data = await response.json();\n return {\n success: true,\n message: data.message,\n code: response.status,\n };\n } else {\n return {\n success: false,\n message: `HTTP ${response.status}`,\n code: response.status,\n };\n }\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Network error',\n code: 0,\n };\n }\n }\n\n async isOnline(): Promise<boolean> {\n if (typeof navigator !== 'undefined' && 'onLine' in navigator) {\n return navigator.onLine;\n }\n return true;\n }\n}\n\n/**\n * Web 设备信息适配器\n */\nexport class WebDeviceAdapter implements AnalyticsDeviceAdapter {\n async getDeviceInfo(): Promise<DeviceInfo> {\n return {\n device_id: await this.generateDeviceId(),\n os_name: this.getOSName(),\n os_version: this.getOSVersion(),\n screen_width: typeof window !== 'undefined' ? window.screen.width : 0,\n screen_height: typeof window !== 'undefined' ? window.screen.height : 0,\n language: typeof navigator !== 'undefined' ? navigator.language : 'en',\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n device_model: this.getBrowserName(),\n device_brand: this.getBrowserVersion(),\n };\n }\n\n async generateDeviceId(): Promise<string> {\n // 尝试从 localStorage 获取已存在的 ID\n if (typeof window !== 'undefined') {\n let deviceId = localStorage.getItem('analytics:device_id');\n\n if (!deviceId) {\n deviceId = `web_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n localStorage.setItem('analytics:device_id', deviceId);\n }\n\n return deviceId;\n }\n\n return `web_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }\n\n private getOSName(): string {\n if (typeof navigator === 'undefined') return 'unknown';\n\n const userAgent = navigator.userAgent;\n\n if (userAgent.indexOf('Win') !== -1) return 'Windows';\n if (userAgent.indexOf('Mac') !== -1) return 'MacOS';\n if (userAgent.indexOf('Linux') !== -1) return 'Linux';\n if (userAgent.indexOf('Android') !== -1) return 'Android';\n if (userAgent.indexOf('iOS') !== -1) return 'iOS';\n\n return 'unknown';\n }\n\n private getOSVersion(): string {\n if (typeof navigator === 'undefined') return 'unknown';\n\n const userAgent = navigator.userAgent;\n const match = userAgent.match(/\\(([^)]+)\\)/);\n\n return match && match[1] ? match[1] : 'unknown';\n }\n\n private getBrowserName(): string {\n if (typeof navigator === 'undefined') return 'unknown';\n\n const userAgent = navigator.userAgent;\n\n if (userAgent.indexOf('Chrome') !== -1) return 'Chrome';\n if (userAgent.indexOf('Safari') !== -1) return 'Safari';\n if (userAgent.indexOf('Firefox') !== -1) return 'Firefox';\n if (userAgent.indexOf('Edge') !== -1) return 'Edge';\n\n return 'unknown';\n }\n\n private getBrowserVersion(): string {\n if (typeof navigator === 'undefined') return 'unknown';\n\n const userAgent = navigator.userAgent;\n const match = userAgent.match(/(Chrome|Safari|Firefox|Edge)\\/(\\d+)/);\n\n return match && match[2] ? match[2] : 'unknown';\n }\n}\n\n/**\n * 统一的 Web 适配器对象\n */\nexport const webAdapter = {\n storage: new WebStorageAdapter(),\n network: new WebNetworkAdapter(),\n device: new WebDeviceAdapter(),\n};\n\n","/**\n * Mobile 平台适配器\n * React Native Platform Adapters\n */\n\nimport type {\n AnalyticsStorageAdapter,\n AnalyticsNetworkAdapter,\n AnalyticsDeviceAdapter,\n DeviceInfo,\n AnalyticsEvent,\n UploadResponse,\n} from '../types';\n\n/**\n * Mobile 存储适配器\n * 需要在 mobile 项目中实现具体的 AsyncStorage 逻辑\n */\nexport class MobileStorageAdapter implements AnalyticsStorageAdapter {\n private EVENTS_KEY = '@analytics:events';\n private DEVICE_INFO_KEY = '@analytics:device_info';\n private SESSION_ID_KEY = '@analytics:session_id';\n\n // 需要注入具体的存储实现\n constructor(\n private storage: {\n getItem: (key: string) => Promise<string | null>;\n setItem: (key: string, value: string) => Promise<void>;\n removeItem: (key: string) => Promise<void>;\n }\n ) {}\n\n async saveEvents(events: AnalyticsEvent[]): Promise<void> {\n try {\n await this.storage.setItem(this.EVENTS_KEY, JSON.stringify(events));\n } catch (error) {\n console.error('Failed to save events:', error);\n }\n }\n\n async getEvents(): Promise<AnalyticsEvent[]> {\n try {\n const data = await this.storage.getItem(this.EVENTS_KEY);\n return data ? JSON.parse(data) : [];\n } catch (error) {\n console.error('Failed to get events:', error);\n return [];\n }\n }\n\n async clearEvents(): Promise<void> {\n try {\n await this.storage.removeItem(this.EVENTS_KEY);\n } catch (error) {\n console.error('Failed to clear events:', error);\n }\n }\n\n async saveDeviceInfo(info: DeviceInfo): Promise<void> {\n try {\n await this.storage.setItem(this.DEVICE_INFO_KEY, JSON.stringify(info));\n } catch (error) {\n console.error('Failed to save device info:', error);\n }\n }\n\n async getDeviceInfo(): Promise<DeviceInfo | null> {\n try {\n const data = await this.storage.getItem(this.DEVICE_INFO_KEY);\n return data ? JSON.parse(data) : null;\n } catch (error) {\n console.error('Failed to get device info:', error);\n return null;\n }\n }\n\n async saveSessionId(sessionId: string): Promise<void> {\n try {\n await this.storage.setItem(this.SESSION_ID_KEY, sessionId);\n } catch (error) {\n console.error('Failed to save session ID:', error);\n }\n }\n\n async getSessionId(): Promise<string | null> {\n try {\n return await this.storage.getItem(this.SESSION_ID_KEY);\n } catch (error) {\n console.error('Failed to get session ID:', error);\n return null;\n }\n }\n}\n\n/**\n * Mobile 网络适配器\n */\nexport class MobileNetworkAdapter implements AnalyticsNetworkAdapter {\n // 需要注入网络检查函数\n constructor(\n private netInfo?: {\n fetch: () => Promise<{ isConnected: boolean | null }>;\n }\n ) {}\n\n async upload(url: string, events: AnalyticsEvent[]): Promise<UploadResponse> {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n events,\n timestamp: Date.now(),\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n return {\n success: true,\n message: data.message,\n code: response.status,\n };\n } else {\n return {\n success: false,\n message: `HTTP ${response.status}`,\n code: response.status,\n };\n }\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Network error',\n code: 0,\n };\n }\n }\n\n async isOnline(): Promise<boolean> {\n try {\n if (this.netInfo) {\n const state = await this.netInfo.fetch();\n return state.isConnected ?? false;\n }\n // 如果没有 NetInfo,假设在线\n return true;\n } catch (error) {\n return true;\n }\n }\n}\n\n/**\n * Mobile 设备信息适配器\n */\nexport class MobileDeviceAdapter implements AnalyticsDeviceAdapter {\n // 需要注入设备信息获取函数\n constructor(\n private deviceInfoModule?: {\n getSystemName: () => Promise<string>;\n getSystemVersion: () => Promise<string>;\n getModel: () => Promise<string>;\n getBrand: () => Promise<string>;\n getUniqueId: () => Promise<string>;\n }\n ) {}\n\n async getDeviceInfo(): Promise<DeviceInfo> {\n try {\n const info = this.deviceInfoModule;\n\n return {\n device_id: info ? await info.getUniqueId() : await this.generateDeviceId(),\n device_model: info ? await info.getModel() : 'unknown',\n device_brand: info ? await info.getBrand() : 'unknown',\n os_name: info ? await info.getSystemName() : 'unknown',\n os_version: info ? await info.getSystemVersion() : 'unknown',\n screen_width: typeof window !== 'undefined' ? window.screen.width : 0,\n screen_height: typeof window !== 'undefined' ? window.screen.height : 0,\n language: typeof navigator !== 'undefined' ? navigator.language : 'en',\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n };\n } catch (error) {\n console.error('Failed to get device info:', error);\n return this.getDefaultDeviceInfo();\n }\n }\n\n async generateDeviceId(): Promise<string> {\n // 生成一个唯一的设备ID\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 15);\n return `mobile_${timestamp}_${random}`;\n }\n\n private getDefaultDeviceInfo(): DeviceInfo {\n return {\n device_id: `mobile_${Date.now()}`,\n os_name: 'unknown',\n os_version: 'unknown',\n screen_width: 0,\n screen_height: 0,\n language: 'en',\n timezone: 'UTC',\n };\n }\n}\n","/**\n * 小程序平台适配器\n * WeChat MiniProgram Platform Adapters\n */\n\nimport type {\n AnalyticsStorageAdapter,\n AnalyticsNetworkAdapter,\n AnalyticsDeviceAdapter,\n DeviceInfo,\n AnalyticsEvent,\n UploadResponse,\n} from '../types';\n\n/**\n * 小程序存储适配器\n */\nexport class MiniappStorageAdapter implements AnalyticsStorageAdapter {\n private EVENTS_KEY = 'analytics_events';\n private DEVICE_INFO_KEY = 'analytics_device_info';\n private SESSION_ID_KEY = 'analytics_session_id';\n\n // 需要注入 Taro 的存储 API\n constructor(\n private storage?: {\n getStorageSync: (key: string) => any;\n setStorageSync: (key: string, data: any) => void;\n removeStorageSync: (key: string) => void;\n }\n ) {}\n\n async saveEvents(events: AnalyticsEvent[]): Promise<void> {\n try {\n if (this.storage) {\n this.storage.setStorageSync(this.EVENTS_KEY, events);\n }\n } catch (error) {\n console.error('Failed to save events:', error);\n }\n }\n\n async getEvents(): Promise<AnalyticsEvent[]> {\n try {\n if (this.storage) {\n const data = this.storage.getStorageSync(this.EVENTS_KEY);\n return data || [];\n }\n return [];\n } catch (error) {\n console.error('Failed to get events:', error);\n return [];\n }\n }\n\n async clearEvents(): Promise<void> {\n try {\n if (this.storage) {\n this.storage.removeStorageSync(this.EVENTS_KEY);\n }\n } catch (error) {\n console.error('Failed to clear events:', error);\n }\n }\n\n async saveDeviceInfo(info: DeviceInfo): Promise<void> {\n try {\n if (this.storage) {\n this.storage.setStorageSync(this.DEVICE_INFO_KEY, info);\n }\n } catch (error) {\n console.error('Failed to save device info:', error);\n }\n }\n\n async getDeviceInfo(): Promise<DeviceInfo | null> {\n try {\n if (this.storage) {\n return this.storage.getStorageSync(this.DEVICE_INFO_KEY) || null;\n }\n return null;\n } catch (error) {\n console.error('Failed to get device info:', error);\n return null;\n }\n }\n\n async saveSessionId(sessionId: string): Promise<void> {\n try {\n if (this.storage) {\n this.storage.setStorageSync(this.SESSION_ID_KEY, sessionId);\n }\n } catch (error) {\n console.error('Failed to save session ID:', error);\n }\n }\n\n async getSessionId(): Promise<string | null> {\n try {\n if (this.storage) {\n return this.storage.getStorageSync(this.SESSION_ID_KEY) || null;\n }\n return null;\n } catch (error) {\n console.error('Failed to get session ID:', error);\n return null;\n }\n }\n}\n\n/**\n * 小程序网络适配器\n */\nexport class MiniappNetworkAdapter implements AnalyticsNetworkAdapter {\n // 需要注入 Taro 的网络 API\n constructor(\n private request?: {\n request: (options: any) => Promise<any>;\n },\n private netInfo?: {\n getNetworkType: () => Promise<{ networkType: string }>;\n }\n ) {}\n\n async upload(url: string, events: AnalyticsEvent[]): Promise<UploadResponse> {\n try {\n if (!this.request) {\n throw new Error('Request module not provided');\n }\n\n const response = await this.request.request({\n url,\n method: 'POST',\n data: {\n events,\n timestamp: Date.now(),\n },\n header: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (response.statusCode === 200) {\n return {\n success: true,\n message: response.data.message,\n code: response.statusCode,\n };\n } else {\n return {\n success: false,\n message: `HTTP ${response.statusCode}`,\n code: response.statusCode,\n };\n }\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Network error',\n code: 0,\n };\n }\n }\n\n async isOnline(): Promise<boolean> {\n try {\n if (this.netInfo) {\n const { networkType } = await this.netInfo.getNetworkType();\n return networkType !== 'none';\n }\n return true;\n } catch (error) {\n return true;\n }\n }\n}\n\n/**\n * 小程序设备信息适配器\n */\nexport class MiniappDeviceAdapter implements AnalyticsDeviceAdapter {\n // 需要注入 Taro 的系统信息 API\n constructor(\n private systemInfo?: {\n getSystemInfoSync: () => any;\n }\n ) {}\n\n async getDeviceInfo(): Promise<DeviceInfo> {\n try {\n if (this.systemInfo) {\n const info = this.systemInfo.getSystemInfoSync();\n\n return {\n device_id: await this.generateDeviceId(),\n device_model: info.model || 'unknown',\n device_brand: info.brand || 'unknown',\n os_name: info.platform || 'unknown',\n os_version: info.system || 'unknown',\n screen_width: info.screenWidth || 0,\n screen_height: info.screenHeight || 0,\n language: info.language || 'zh_CN',\n timezone: 'Asia/Shanghai',\n network_type: info.networkType,\n };\n }\n\n return this.getDefaultDeviceInfo();\n } catch (error) {\n console.error('Failed to get device info:', error);\n return this.getDefaultDeviceInfo();\n }\n }\n\n async generateDeviceId(): Promise<string> {\n // 小程序中使用唯一标识\n // 可以结合 openid 或其他标识\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 15);\n return `miniapp_${timestamp}_${random}`;\n }\n\n private getDefaultDeviceInfo(): DeviceInfo {\n return {\n device_id: `miniapp_${Date.now()}`,\n os_name: 'wechat',\n os_version: 'unknown',\n screen_width: 0,\n screen_height: 0,\n language: 'zh_CN',\n timezone: 'Asia/Shanghai',\n };\n }\n}\n","/**\n * Desktop 平台适配器\n * Electron Platform Adapters\n */\n\nimport type {\n AnalyticsStorageAdapter,\n AnalyticsNetworkAdapter,\n AnalyticsDeviceAdapter,\n DeviceInfo,\n AnalyticsEvent,\n UploadResponse,\n} from '../types';\n\n/**\n * Desktop 存储适配器(使用 localStorage)\n */\nexport class DesktopStorageAdapter implements AnalyticsStorageAdapter {\n private EVENTS_KEY = 'analytics:events';\n private DEVICE_INFO_KEY = 'analytics:device_info';\n private SESSION_ID_KEY = 'analytics:session_id';\n\n async saveEvents(events: AnalyticsEvent[]): Promise<void> {\n try {\n if (typeof window !== 'undefined') {\n localStorage.setItem(this.EVENTS_KEY, JSON.stringify(events));\n }\n } catch (error) {\n console.error('Failed to save events:', error);\n }\n }\n\n async getEvents(): Promise<AnalyticsEvent[]> {\n try {\n if (typeof window !== 'undefined') {\n const data = localStorage.getItem(this.EVENTS_KEY);\n return data ? JSON.parse(data) : [];\n }\n return [];\n } catch (error) {\n console.error('Failed to get events:', error);\n return [];\n }\n }\n\n async clearEvents(): Promise<void> {\n try {\n if (typeof window !== 'undefined') {\n localStorage.removeItem(this.EVENTS_KEY);\n }\n } catch (error) {\n console.error('Failed to clear events:', error);\n }\n }\n\n async saveDeviceInfo(info: DeviceInfo): Promise<void> {\n try {\n if (typeof window !== 'undefined') {\n localStorage.setItem(this.DEVICE_INFO_KEY, JSON.stringify(info));\n }\n } catch (error) {\n console.error('Failed to save device info:', error);\n }\n }\n\n async getDeviceInfo(): Promise<DeviceInfo | null> {\n try {\n if (typeof window !== 'undefined') {\n const data = localStorage.getItem(this.DEVICE_INFO_KEY);\n return data ? JSON.parse(data) : null;\n }\n return null;\n } catch (error) {\n console.error('Failed to get device info:', error);\n return null;\n }\n }\n\n async saveSessionId(sessionId: string): Promise<void> {\n try {\n if (typeof window !== 'undefined') {\n localStorage.setItem(this.SESSION_ID_KEY, sessionId);\n }\n } catch (error) {\n console.error('Failed to save session ID:', error);\n }\n }\n\n async getSessionId(): Promise<string | null> {\n try {\n if (typeof window !== 'undefined') {\n return localStorage.getItem(this.SESSION_ID_KEY);\n }\n return null;\n } catch (error) {\n console.error('Failed to get session ID:', error);\n return null;\n }\n }\n}\n\n/**\n * Desktop 网络适配器\n */\nexport class DesktopNetworkAdapter implements AnalyticsNetworkAdapter {\n async upload(url: string, events: AnalyticsEvent[]): Promise<UploadResponse> {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n events,\n timestamp: Date.now(),\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n return {\n success: true,\n message: data.message,\n code: response.status,\n };\n } else {\n return {\n success: false,\n message: `HTTP ${response.status}`,\n code: response.status,\n };\n }\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Network error',\n code: 0,\n };\n }\n }\n\n async isOnline(): Promise<boolean> {\n if (typeof navigator !== 'undefined' && 'onLine' in navigator) {\n return navigator.onLine;\n }\n return true;\n }\n}\n\n/**\n * Desktop 设备信息适配器\n */\nexport class DesktopDeviceAdapter implements AnalyticsDeviceAdapter {\n async getDeviceInfo(): Promise<DeviceInfo> {\n return {\n device_id: await this.generateDeviceId(),\n os_name: this.getOSName(),\n os_version: this.getOSVersion(),\n screen_width: typeof window !== 'undefined' ? window.screen.width : 0,\n screen_height: typeof window !== 'undefined' ? window.screen.height : 0,\n language: typeof navigator !== 'undefined' ? navigator.language : 'en',\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n device_model: 'Desktop',\n device_brand: 'Electron',\n };\n }\n\n async generateDeviceId(): Promise<string> {\n // 尝试从 localStorage 获取已存在的 ID\n if (typeof window !== 'undefined') {\n let deviceId = localStorage.getItem('analytics:device_id');\n\n if (!deviceId) {\n // Electron 中可以使用机器的唯一标识\n // 这里简化处理,实际可以通过 IPC 获取\n deviceId = `desktop_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n localStorage.setItem('analytics:device_id', deviceId);\n }\n\n return deviceId;\n }\n\n return `desktop_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }\n\n private getOSName(): string {\n if (typeof navigator === 'undefined') return 'unknown';\n\n const platform = navigator.platform.toLowerCase();\n\n if (platform.indexOf('win') !== -1) return 'Windows';\n if (platform.indexOf('mac') !== -1) return 'MacOS';\n if (platform.indexOf('linux') !== -1) return 'Linux';\n\n return 'unknown';\n }\n\n private getOSVersion(): string {\n if (typeof navigator === 'undefined') return 'unknown';\n\n // Electron 中可以通过 process.getSystemVersion() 获取\n // 这里简化处理\n return navigator.userAgent;\n }\n}\n","/**\n * Analytics 埋点分析模块\n *\n * 提供完整的事件追踪、用户行为分析、数据上报等功能\n * 包含多平台适配器(web/mobile/desktop/miniapp)\n */\n\n// 核心类\nexport { Analytics } from './core/Analytics';\nexport { EventQueue } from './core/EventQueue';\nexport { Uploader } from './core/Uploader';\n\n// 类型定义\nexport * from './types';\n\n// 客户端工具(单例管理器 + 预设配置)\nexport * from './client';\n\n// 工具函数\nexport * from './utils/helpers';\nexport * from './utils/decorators';\nexport * from './utils/hooks';\n\n// 平台适配器\nexport * from './adapters';\n\n// 版本信息\nexport const ANALYTICS_VERSION = '1.0.0';\n\n"]}
1
+ {"version":3,"sources":["../../src/analytics/types.ts","../../src/analytics/core/EventQueue.ts","../../src/analytics/core/Uploader.ts","../../src/analytics/core/Analytics.ts","../../src/analytics/client/presets.ts","../../src/analytics/client/singleton.ts","../../src/analytics/utils/helpers.ts","../../src/analytics/utils/decorators.ts","../../src/analytics/utils/hooks.ts","../../src/analytics/adapters/web.ts","../../src/analytics/adapters/mobile.ts","../../src/analytics/adapters/miniapp.ts","../../src/analytics/adapters/desktop.ts","../../src/analytics/index.ts"],"names":["EventType","EventPriority","getAnalyticsInstance","useEffect","useCallback","useRef"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 埋点系统类型定义\n * Analytics System Type Definitions\n */\n\n/**\n * 事件类型枚举\n */\nexport enum EventType {\n // 页面事件\n PAGE_VIEW = 'page_view',\n PAGE_LEAVE = 'page_leave',\n\n // 用户行为事件\n CLICK = 'click',\n SCROLL = 'scroll',\n INPUT = 'input',\n SUBMIT = 'submit',\n\n // 业务事件\n LOGIN = 'login',\n LOGOUT = 'logout',\n REGISTER = 'register',\n SEARCH = 'search',\n SHARE = 'share',\n\n // 性能事件\n PERFORMANCE = 'performance',\n ERROR = 'error',\n API_CALL = 'api_call',\n\n // 自定义事件\n CUSTOM = 'custom',\n}\n\n/**\n * 事件优先级\n */\nexport enum EventPriority {\n LOW = 0, // 低优先级,可延迟上报\n NORMAL = 1, // 普通优先级,批量上报\n HIGH = 2, // 高优先级,实时上报\n CRITICAL = 3, // 关键事件,立即上报\n}\n\n/**\n * 基础事件数据接口\n */\nexport interface BaseEvent {\n // 基本信息\n event_id: string; // 事件唯一ID\n event_type: EventType; // 事件类型\n event_name: string; // 事件名称\n timestamp: number; // 事件时间戳\n priority: EventPriority; // 事件优先级\n\n // 用户信息\n user_id?: string; // 用户ID\n session_id: string; // 会话ID\n device_id: string; // 设备ID\n\n // 页面信息\n page_url?: string; // 页面URL\n page_title?: string; // 页面标题\n referrer?: string; // 来源页面\n\n // 自定义属性\n properties?: Record<string, any>;\n\n // 系统信息\n platform: string; // 平台:web/mobile/desktop/miniapp\n app_version: string; // 应用版本\n sdk_version: string; // SDK版本\n}\n\n/**\n * 页面浏览事件\n */\nexport interface PageViewEvent extends BaseEvent {\n event_type: EventType.PAGE_VIEW;\n page_url: string;\n page_title: string;\n duration?: number; // 页面停留时长(ms)\n}\n\n/**\n * 点击事件\n */\nexport interface ClickEvent extends BaseEvent {\n event_type: EventType.CLICK;\n element_id?: string; // 元素ID\n element_class?: string; // 元素类名\n element_text?: string; // 元素文本\n element_type?: string; // 元素类型\n position?: {\n // 点击位置\n x: number;\n y: number;\n };\n}\n\n/**\n * 错误事件\n */\nexport interface ErrorEvent extends BaseEvent {\n event_type: EventType.ERROR;\n error_message: string; // 错误信息\n error_stack?: string; // 错误堆栈\n error_type?: string; // 错误类型\n error_level?: 'warning' | 'error' | 'fatal';\n}\n\n/**\n * 性能事件\n */\nexport interface PerformanceEvent extends BaseEvent {\n event_type: EventType.PERFORMANCE;\n metric_name: string; // 指标名称\n metric_value: number; // 指标值\n metric_unit?: string; // 单位\n}\n\n/**\n * API调用事件\n */\nexport interface ApiCallEvent extends BaseEvent {\n event_type: EventType.API_CALL;\n api_url: string; // API地址\n api_method: string; // 请求方法\n api_status?: number; // 响应状态码\n duration?: number; // 请求耗时(ms)\n success: boolean; // 是否成功\n}\n\n/**\n * 所有事件类型联合\n */\nexport type AnalyticsEvent =\n | BaseEvent\n | PageViewEvent\n | ClickEvent\n | ErrorEvent\n | PerformanceEvent\n | ApiCallEvent;\n\n/**\n * 事件上报配置\n */\nexport interface AnalyticsConfig {\n // 基础配置\n appId: string; // 应用ID\n appVersion: string; // 应用版本\n endpoint: string; // 上报接口地址\n platform?: string; // 平台标识(web/mobile/miniapp/desktop)\n debug?: boolean; // 是否开启调试模式\n\n // 上报策略\n batchSize?: number; // 批量上报数量(默认10)\n batchInterval?: number; // 批量上报间隔(ms,默认5000)\n maxQueueSize?: number; // 最大队列长度(默认100)\n retryTimes?: number; // 失败重试次数(默认3)\n retryInterval?: number; // 重试间隔(ms,默认1000)\n\n // 功能开关\n enableAutoPageView?: boolean; // 自动采集页面浏览(默认true)\n enableAutoClick?: boolean; // 自动采集点击事件(默认false)\n enableAutoError?: boolean; // 自动采集错误(默认true)\n enableAutoPerformance?: boolean; // 自动采集性能(默认true)\n\n // 数据过滤\n ignoreUrls?: string[]; // 忽略的URL列表\n ignoreErrors?: string[]; // 忽略的错误列表\n beforeSend?: (event: AnalyticsEvent) => AnalyticsEvent | null; // 发送前钩子\n\n // 用户信息\n userId?: string; // 用户ID\n customProperties?: Record<string, any>; // 自定义全局属性\n}\n\n/**\n * 设备信息接口\n */\nexport interface DeviceInfo {\n device_id: string; // 设备唯一ID\n device_model?: string; // 设备型号\n device_brand?: string; // 设备品牌\n os_name: string; // 操作系统名称\n os_version: string; // 操作系统版本\n screen_width: number; // 屏幕宽度\n screen_height: number; // 屏幕高度\n language: string; // 系统语言\n timezone: string; // 时区\n network_type?: string; // 网络类型\n carrier?: string; // 运营商\n}\n\n/**\n * 上报响应接口\n */\nexport interface UploadResponse {\n success: boolean;\n message?: string;\n code?: number;\n}\n\n/**\n * 存储适配器接口\n */\nexport interface AnalyticsStorageAdapter {\n /**\n * 保存事件到本地存储\n */\n saveEvents(events: AnalyticsEvent[]): Promise<void>;\n\n /**\n * 获取本地存储的事件\n */\n getEvents(): Promise<AnalyticsEvent[]>;\n\n /**\n * 清除本地存储的事件\n */\n clearEvents(): Promise<void>;\n\n /**\n * 保存设备信息\n */\n saveDeviceInfo(info: DeviceInfo): Promise<void>;\n\n /**\n * 获取设备信息\n */\n getDeviceInfo(): Promise<DeviceInfo | null>;\n\n /**\n * 保存会话ID\n */\n saveSessionId(sessionId: string): Promise<void>;\n\n /**\n * 获取会话ID\n */\n getSessionId(): Promise<string | null>;\n}\n\n/**\n * 网络适配器接口\n */\nexport interface AnalyticsNetworkAdapter {\n /**\n * 上传事件数据\n */\n upload(url: string, events: AnalyticsEvent[]): Promise<UploadResponse>;\n\n /**\n * 检查网络连接状态\n */\n isOnline(): Promise<boolean>;\n}\n\n/**\n * 设备信息适配器接口\n */\nexport interface AnalyticsDeviceAdapter {\n /**\n * 获取设备信息\n */\n getDeviceInfo(): Promise<DeviceInfo>;\n\n /**\n * 生成设备唯一ID\n */\n generateDeviceId(): Promise<string>;\n}\n","/**\n * 事件队列管理器\n * Event Queue Manager\n */\n\nimport type { AnalyticsEvent } from '../types';\n\nexport class EventQueue {\n private queue: AnalyticsEvent[] = [];\n private maxSize: number;\n\n constructor(maxSize: number = 100) {\n this.maxSize = maxSize;\n }\n\n /**\n * 添加事件到队列\n */\n enqueue(event: AnalyticsEvent): void {\n // 如果队列已满,移除最老的低优先级事件\n if (this.queue.length >= this.maxSize) {\n this.removeLowestPriorityEvent();\n }\n\n this.queue.push(event);\n\n // 按优先级排序(高优先级在前)\n this.queue.sort((a, b) => b.priority - a.priority);\n }\n\n /**\n * 批量添加事件\n */\n enqueueBatch(events: AnalyticsEvent[]): void {\n events.forEach((event) => this.enqueue(event));\n }\n\n /**\n * 获取指定数量的事件\n */\n dequeue(count: number): AnalyticsEvent[] {\n return this.queue.splice(0, count);\n }\n\n /**\n * 获取所有事件\n */\n dequeueAll(): AnalyticsEvent[] {\n const events = [...this.queue];\n this.queue = [];\n return events;\n }\n\n /**\n * 获取高优先级事件\n */\n getHighPriorityEvents(): AnalyticsEvent[] {\n const highPriorityEvents = this.queue.filter(\n (event) => event.priority >= 2 // HIGH 和 CRITICAL\n );\n\n // 从队列中移除这些事件\n this.queue = this.queue.filter((event) => event.priority < 2);\n\n return highPriorityEvents;\n }\n\n /**\n * 查看队列长度\n */\n size(): number {\n return this.queue.length;\n }\n\n /**\n * 队列是否为空\n */\n isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n /**\n * 队列是否已满\n */\n isFull(): boolean {\n return this.queue.length >= this.maxSize;\n }\n\n /**\n * 清空队列\n */\n clear(): void {\n this.queue = [];\n }\n\n /**\n * 移除最低优先级的事件\n */\n private removeLowestPriorityEvent(): void {\n if (this.queue.length === 0) return;\n\n // 找到优先级最低的事件\n let lowestPriorityIndex = 0;\n let lowestPriority = this.queue[0]?.priority ?? 0;\n\n for (let i = 1; i < this.queue.length; i++) {\n const currentPriority = this.queue[i]?.priority ?? 0;\n if (currentPriority < lowestPriority) {\n lowestPriority = currentPriority;\n lowestPriorityIndex = i;\n }\n }\n\n this.queue.splice(lowestPriorityIndex, 1);\n }\n\n /**\n * 获取队列快照(不移除事件)\n */\n snapshot(): AnalyticsEvent[] {\n return [...this.queue];\n }\n}\n","/**\n * 事件上传器\n * Event Uploader\n */\n\nimport type {\n AnalyticsEvent,\n AnalyticsNetworkAdapter,\n AnalyticsStorageAdapter,\n} from '../types';\n\nexport interface UploaderConfig {\n endpoint: string;\n batchSize: number;\n retryTimes: number;\n retryInterval: number;\n networkAdapter: AnalyticsNetworkAdapter;\n storageAdapter: AnalyticsStorageAdapter;\n onSuccess?: (events: AnalyticsEvent[]) => void;\n onError?: (error: Error, events: AnalyticsEvent[]) => void;\n}\n\nexport class Uploader {\n private config: UploaderConfig;\n private uploading = false;\n private retryQueue: Map<string, { events: AnalyticsEvent[]; retryCount: number }> = new Map();\n\n constructor(config: UploaderConfig) {\n this.config = config;\n }\n\n /**\n * 上传事件\n */\n async upload(events: AnalyticsEvent[]): Promise<boolean> {\n if (events.length === 0) return true;\n\n // 检查网络状态\n const isOnline = await this.config.networkAdapter.isOnline();\n if (!isOnline) {\n // 离线时保存到本地\n await this.saveToLocal(events);\n return false;\n }\n\n try {\n this.uploading = true;\n\n const response = await this.config.networkAdapter.upload(this.config.endpoint, events);\n\n if (response.success) {\n this.config.onSuccess?.(events);\n return true;\n } else {\n throw new Error(response.message || 'Upload failed');\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.config.onError?.(err, events);\n\n // 添加到重试队列\n await this.addToRetryQueue(events);\n return false;\n } finally {\n this.uploading = false;\n }\n }\n\n /**\n * 批量上传\n */\n async uploadBatch(events: AnalyticsEvent[]): Promise<boolean> {\n const batches = this.splitIntoBatches(events, this.config.batchSize);\n const results = await Promise.all(batches.map((batch) => this.upload(batch)));\n\n return results.every((result) => result);\n }\n\n /**\n * 重试失败的上传\n */\n async retryFailedUploads(): Promise<void> {\n if (this.uploading || this.retryQueue.size === 0) return;\n\n const isOnline = await this.config.networkAdapter.isOnline();\n if (!isOnline) return;\n\n const entries = Array.from(this.retryQueue.entries());\n\n for (const [key, item] of entries) {\n if (item.retryCount >= this.config.retryTimes) {\n // 达到最大重试次数,保存到本地\n await this.saveToLocal(item.events);\n this.retryQueue.delete(key);\n continue;\n }\n\n // 延迟重试\n await this.delay(this.config.retryInterval * (item.retryCount + 1));\n\n const success = await this.upload(item.events);\n\n if (success) {\n this.retryQueue.delete(key);\n } else {\n // 增加重试次数\n item.retryCount++;\n }\n }\n }\n\n /**\n * 上传本地缓存的事件\n */\n async uploadCachedEvents(): Promise<void> {\n try {\n const cachedEvents = await this.config.storageAdapter.getEvents();\n\n if (cachedEvents.length > 0) {\n const success = await this.uploadBatch(cachedEvents);\n\n if (success) {\n await this.config.storageAdapter.clearEvents();\n }\n }\n } catch (error) {\n console.error('Failed to upload cached events:', error);\n }\n }\n\n /**\n * 保存事件到本地存储\n */\n private async saveToLocal(events: AnalyticsEvent[]): Promise<void> {\n try {\n const existingEvents = await this.config.storageAdapter.getEvents();\n const allEvents = [...existingEvents, ...events];\n await this.config.storageAdapter.saveEvents(allEvents);\n } catch (error) {\n console.error('Failed to save events to local storage:', error);\n }\n }\n\n /**\n * 添加到重试队列\n */\n private async addToRetryQueue(events: AnalyticsEvent[]): Promise<void> {\n const key = `${Date.now()}_${Math.random()}`;\n this.retryQueue.set(key, {\n events,\n retryCount: 0,\n });\n }\n\n /**\n * 分割成批次\n */\n private splitIntoBatches(events: AnalyticsEvent[], batchSize: number): AnalyticsEvent[][] {\n const batches: AnalyticsEvent[][] = [];\n\n for (let i = 0; i < events.length; i += batchSize) {\n batches.push(events.slice(i, i + batchSize));\n }\n\n return batches;\n }\n\n /**\n * 延迟函数\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * 是否正在上传\n */\n isUploading(): boolean {\n return this.uploading;\n }\n\n /**\n * 获取重试队列大小\n */\n getRetryQueueSize(): number {\n return this.retryQueue.size;\n }\n\n /**\n * 清空重试队列\n */\n clearRetryQueue(): void {\n this.retryQueue.clear();\n }\n}\n","/**\n * 埋点系统核心类\n * Analytics Core SDK\n */\n\nimport {\n EventType,\n EventPriority,\n type AnalyticsConfig,\n type AnalyticsEvent,\n type BaseEvent,\n type AnalyticsStorageAdapter,\n type AnalyticsNetworkAdapter,\n type AnalyticsDeviceAdapter,\n type DeviceInfo,\n} from '../types';\nimport { EventQueue } from './EventQueue';\nimport { Uploader } from './Uploader';\n\nconst SDK_VERSION = '1.0.0';\n\nexport class Analytics {\n private config: Required<AnalyticsConfig>;\n private eventQueue: EventQueue;\n private uploader: Uploader;\n private storageAdapter: AnalyticsStorageAdapter;\n private networkAdapter: AnalyticsNetworkAdapter;\n private deviceAdapter: AnalyticsDeviceAdapter;\n\n private sessionId: string = '';\n private deviceId: string = '';\n private deviceInfo: DeviceInfo | null = null;\n private initialized = false;\n private batchTimer: any = null;\n\n constructor(\n config: Omit<AnalyticsConfig, 'endpoint'> & {\n adapter?: {\n storage: AnalyticsStorageAdapter;\n network: AnalyticsNetworkAdapter;\n device: AnalyticsDeviceAdapter;\n };\n platform?: string;\n serverUrl?: string;\n endpoint?: string;\n },\n storageAdapter?: AnalyticsStorageAdapter,\n networkAdapter?: AnalyticsNetworkAdapter,\n deviceAdapter?: AnalyticsDeviceAdapter\n ) {\n // 支持两种初始化方式:\n // 1. 新方式:传入包含 adapter 的 config 对象\n // 2. 旧方式:分别传入四个参数\n if (config.adapter) {\n this.storageAdapter = config.adapter.storage;\n this.networkAdapter = config.adapter.network;\n this.deviceAdapter = config.adapter.device;\n } else if (storageAdapter && networkAdapter && deviceAdapter) {\n this.storageAdapter = storageAdapter;\n this.networkAdapter = networkAdapter;\n this.deviceAdapter = deviceAdapter;\n } else {\n throw new Error('Analytics initialization failed: adapter is required');\n }\n\n // 合并默认配置\n const serverUrl = (config as any).serverUrl || config.endpoint || '/api/analytics/events';\n const platform = (config as any).platform || 'web';\n\n this.config = {\n ...config,\n appId: config.appId,\n appVersion: config.appVersion || '1.0.0',\n platform: platform,\n endpoint: serverUrl,\n batchSize: config.batchSize ?? 10,\n batchInterval: config.batchInterval ?? 5000,\n maxQueueSize: config.maxQueueSize ?? 100,\n retryTimes: config.retryTimes ?? 3,\n retryInterval: config.retryInterval ?? 1000,\n enableAutoPageView: config.enableAutoPageView ?? true,\n enableAutoClick: config.enableAutoClick ?? false,\n enableAutoError: config.enableAutoError ?? true,\n enableAutoPerformance: config.enableAutoPerformance ?? true,\n debug: config.debug ?? false,\n ignoreUrls: config.ignoreUrls ?? [],\n ignoreErrors: config.ignoreErrors ?? [],\n beforeSend: config.beforeSend,\n } as Required<AnalyticsConfig>;\n\n this.eventQueue = new EventQueue(this.config.maxQueueSize);\n this.uploader = new Uploader({\n endpoint: this.config.endpoint,\n batchSize: this.config.batchSize,\n retryTimes: this.config.retryTimes,\n retryInterval: this.config.retryInterval,\n networkAdapter: this.networkAdapter,\n storageAdapter: this.storageAdapter,\n onSuccess: (events) => this.onUploadSuccess(events),\n onError: (error, events) => this.onUploadError(error, events),\n });\n\n // 自动初始化\n this.init().catch((error) => {\n console.error('Failed to initialize Analytics:', error);\n });\n }\n\n /**\n * 初始化\n */\n async init(): Promise<void> {\n if (this.initialized) {\n this.log('Analytics already initialized');\n return;\n }\n\n try {\n // 初始化设备信息\n await this.initDeviceInfo();\n\n // 初始化会话\n await this.initSession();\n\n // 上传缓存的事件\n await this.uploader.uploadCachedEvents();\n\n // 启动批量上传定时器\n this.startBatchTimer();\n\n // 监听调试配置变化\n if (typeof window !== 'undefined') {\n window.addEventListener('analytics-debug-changed', ((e: CustomEvent) => {\n this.log(`Debug mode changed: ${e.detail.enabled ? 'enabled' : 'disabled'}`);\n }) as EventListener);\n }\n\n this.initialized = true;\n this.log('Analytics initialized successfully');\n } catch (error) {\n console.error('Failed to initialize analytics:', error);\n throw error;\n }\n }\n\n /**\n * 追踪事件(简化版本,支持两种调用方式)\n */\n track(\n eventNameOrType: string | EventType,\n propertiesOrName?: Record<string, any> | string,\n maybeProperties?: Record<string, any>,\n priority: EventPriority = EventPriority.NORMAL\n ): void {\n if (!this.initialized) {\n console.warn('Analytics not initialized yet, queuing event...');\n // 可以选择在初始化后重试\n setTimeout(\n () => this.track(eventNameOrType, propertiesOrName, maybeProperties, priority),\n 100\n );\n return;\n }\n\n let eventType: EventType;\n let eventName: string;\n let properties: Record<string, any> | undefined;\n\n // 支持两种调用方式:\n // 1. track(eventName, properties) - 简化版\n // 2. track(eventType, eventName, properties, priority) - 完整版\n if (typeof propertiesOrName === 'string') {\n // 完整版调用\n eventType = eventNameOrType as EventType;\n eventName = propertiesOrName;\n properties = maybeProperties;\n } else {\n // 简化版调用\n eventType = EventType.CUSTOM;\n eventName = eventNameOrType as string;\n properties = propertiesOrName;\n }\n\n const event = this.createEvent(eventType, eventName, properties, priority);\n\n // beforeSend 钩子\n const processedEvent = this.config.beforeSend?.(event) ?? event;\n if (!processedEvent) {\n this.log('Event filtered by beforeSend hook', event);\n return;\n }\n\n // 添加到队列\n this.eventQueue.enqueue(processedEvent);\n this.log('Event tracked', processedEvent);\n\n // 高优先级事件立即上传\n if (priority >= EventPriority.HIGH) {\n this.flushHighPriority();\n }\n\n // 队列满了自动上传\n if (this.eventQueue.isFull()) {\n this.flush();\n }\n }\n\n /**\n * 追踪页面浏览\n */\n trackPageView(pageUrl: string, pageTitle: string, properties?: Record<string, any>): void {\n this.track(\n EventType.PAGE_VIEW,\n 'page_view',\n {\n page_url: pageUrl,\n page_title: pageTitle,\n ...properties,\n },\n EventPriority.NORMAL\n );\n }\n\n /**\n * 追踪点击事件\n */\n trackClick(\n elementInfo: {\n elementId?: string;\n elementClass?: string;\n elementText?: string;\n elementType?: string;\n position?: { x: number; y: number };\n },\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.CLICK,\n 'click',\n {\n ...elementInfo,\n ...properties,\n },\n EventPriority.LOW\n );\n }\n\n /**\n * 追踪错误\n */\n trackError(\n errorMessage: string,\n errorStack?: string,\n errorType?: string,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.ERROR,\n 'error',\n {\n error_message: errorMessage,\n error_stack: errorStack,\n error_type: errorType,\n ...properties,\n },\n EventPriority.HIGH\n );\n }\n\n /**\n * 追踪性能指标\n */\n trackPerformance(\n metricName: string,\n metricValue: number,\n metricUnit?: string,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.PERFORMANCE,\n 'performance',\n {\n metric_name: metricName,\n metric_value: metricValue,\n metric_unit: metricUnit,\n ...properties,\n },\n EventPriority.LOW\n );\n }\n\n /**\n * 追踪 API 调用\n */\n trackApiCall(\n apiUrl: string,\n apiMethod: string,\n apiStatus: number,\n duration: number,\n success: boolean,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.API_CALL,\n 'api_call',\n {\n api_url: apiUrl,\n api_method: apiMethod,\n api_status: apiStatus,\n duration,\n success,\n ...properties,\n },\n EventPriority.NORMAL\n );\n }\n\n /**\n * 设置用户ID\n */\n setUserId(userId: string): void {\n this.config.userId = userId;\n this.log('User ID set', userId);\n }\n\n /**\n * 设置用户信息(包括用户ID和其他属性)\n */\n setUser(userInfo: { userId: string; [key: string]: any }): void {\n const { userId, ...otherProps } = userInfo;\n this.config.userId = userId;\n this.config.customProperties = {\n ...this.config.customProperties,\n ...otherProps,\n };\n this.log('User info set', userInfo);\n }\n\n /**\n * 设置自定义属性\n */\n setCustomProperties(properties: Record<string, any>): void {\n this.config.customProperties = {\n ...this.config.customProperties,\n ...properties,\n };\n this.log('Custom properties set', properties);\n }\n\n /**\n * 立即上传所有事件\n */\n async flush(): Promise<void> {\n if (this.eventQueue.isEmpty()) {\n return;\n }\n\n const events = this.eventQueue.dequeueAll();\n await this.uploader.upload(events);\n }\n\n /**\n * 立即上传高优先级事件\n */\n private async flushHighPriority(): Promise<void> {\n const highPriorityEvents = this.eventQueue.getHighPriorityEvents();\n\n if (highPriorityEvents.length > 0) {\n await this.uploader.upload(highPriorityEvents);\n }\n }\n\n /**\n * 销毁实例\n */\n async destroy(): Promise<void> {\n // 停止定时器\n if (this.batchTimer) {\n clearInterval(this.batchTimer);\n this.batchTimer = null;\n }\n\n // 上传剩余事件\n await this.flush();\n\n this.initialized = false;\n this.log('Analytics destroyed');\n }\n\n /**\n * 创建事件对象\n */\n private createEvent(\n eventType: EventType,\n eventName: string,\n properties?: Record<string, any>,\n priority: EventPriority = EventPriority.NORMAL\n ): BaseEvent {\n // 获取当前页面信息(仅在浏览器环境)\n let pageUrl: string | undefined;\n let pageTitle: string | undefined;\n let referrer: string | undefined;\n\n if (typeof window !== 'undefined') {\n pageUrl = window.location.href;\n pageTitle = document.title;\n referrer = document.referrer || undefined;\n }\n\n return {\n event_id: this.generateEventId(),\n event_type: eventType,\n event_name: eventName,\n timestamp: Date.now(),\n priority,\n user_id: this.config.userId,\n session_id: this.sessionId,\n device_id: this.deviceId,\n page_url: pageUrl,\n page_title: pageTitle,\n referrer: referrer,\n properties: {\n ...this.config.customProperties,\n ...properties,\n },\n platform: this.getPlatform(),\n app_version: this.config.appVersion,\n sdk_version: SDK_VERSION,\n };\n }\n\n /**\n * 初始化设备信息\n */\n private async initDeviceInfo(): Promise<void> {\n try {\n // 尝试从缓存获取\n let cachedDeviceInfo = await this.storageAdapter.getDeviceInfo();\n\n if (!cachedDeviceInfo) {\n // 生成新的设备信息\n this.deviceInfo = await this.deviceAdapter.getDeviceInfo();\n this.deviceId = await this.deviceAdapter.generateDeviceId();\n\n // 保存到缓存\n await this.storageAdapter.saveDeviceInfo(this.deviceInfo);\n } else {\n this.deviceInfo = cachedDeviceInfo;\n this.deviceId = cachedDeviceInfo.device_id;\n }\n } catch (error) {\n console.error('Failed to init device info:', error);\n // 使用临时ID\n this.deviceId = `temp_${Date.now()}_${Math.random()}`;\n }\n }\n\n /**\n * 初始化会话\n */\n private async initSession(): Promise<void> {\n try {\n // 尝试从缓存获取\n const cachedSessionId = await this.storageAdapter.getSessionId();\n\n if (cachedSessionId) {\n this.sessionId = cachedSessionId;\n } else {\n // 生成新会话\n this.sessionId = this.generateSessionId();\n await this.storageAdapter.saveSessionId(this.sessionId);\n }\n } catch (error) {\n console.error('Failed to init session:', error);\n this.sessionId = this.generateSessionId();\n }\n }\n\n /**\n * 启动批量上传定时器\n */\n private startBatchTimer(): void {\n this.batchTimer = setInterval(() => {\n if (!this.eventQueue.isEmpty()) {\n this.flush();\n }\n\n // 重试失败的上传\n this.uploader.retryFailedUploads();\n }, this.config.batchInterval);\n }\n\n /**\n * 上传成功回调\n */\n private onUploadSuccess(events: AnalyticsEvent[]): void {\n this.log('Events uploaded successfully', events);\n }\n\n /**\n * 上传失败回调\n */\n private onUploadError(error: Error, events: AnalyticsEvent[]): void {\n this.log('Failed to upload events', { error, events });\n }\n\n /**\n * 生成事件ID\n */\n private generateEventId(): string {\n return `${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }\n\n /**\n * 生成会话ID\n */\n private generateSessionId(): string {\n return `session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }\n\n /**\n * 获取平台标识\n */\n private getPlatform(): string {\n return this.config.platform || 'unknown';\n }\n\n /**\n * 日志输出\n */\n private log(message: string, data?: any): void {\n // 检查动态调试配置(优先级高于初始化时的 debug 配置)\n const dynamicDebug =\n typeof window !== 'undefined' ? localStorage.getItem('analytics-debug') === 'true' : false;\n\n if (this.config.debug || dynamicDebug) {\n console.log(`[Analytics] ${message}`, data ?? '');\n }\n }\n\n /**\n * 获取队列状态\n */\n getQueueStatus(): {\n size: number;\n isFull: boolean;\n isEmpty: boolean;\n } {\n return {\n size: this.eventQueue.size(),\n isFull: this.eventQueue.isFull(),\n isEmpty: this.eventQueue.isEmpty(),\n };\n }\n\n /**\n * 获取初始化状态\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n}\n","/**\n * Analytics 预设配置\n * Analytics Preset Configurations\n *\n * 提供常见场景的配置模板(不包含平台适配器)\n * 使用时需要提供具体的 adapter 实现\n */\n\nimport type { AnalyticsConfig } from '../types';\n\n/**\n * Web 应用基础配置模板\n */\nexport function createWebConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n enableAutoPageView?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'web',\n enableAutoPageView: options.enableAutoPageView ?? true,\n debug:\n options.debug ??\n (typeof process !== 'undefined' && process.env?.NODE_ENV === 'development'),\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 移动应用基础配置模板\n */\nexport function createMobileConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'mobile',\n enableAutoPageView: false,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 小程序基础配置模板\n */\nexport function createMiniappConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'miniapp',\n enableAutoPageView: true,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 桌面应用基础配置模板\n */\nexport function createDesktopConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'desktop',\n enableAutoPageView: false,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 使用示例:\n *\n * ```typescript\n * import { createWebConfig, createAnalytics } from '@qhr123/sa2kit/analytics';\n * import { webAdapter } from './adapters/web'; // 你的适配器实现\n *\n * const config = createWebConfig('my-app', {\n * endpoint: 'https://api.example.com/analytics',\n * debug: true,\n * });\n *\n * const analytics = createAnalytics('my-instance', {\n * ...config,\n * adapter: webAdapter, // 提供具体的适配器\n * });\n * ```\n */\n","/**\n * Analytics 单例管理器\n * Analytics Singleton Manager\n *\n * 提供统一的单例创建和管理功能,支持多个独立实例\n */\n\nimport { Analytics } from '../core/Analytics';\nimport type { AnalyticsConfig } from '../types';\n\n// 存储多个实例的 Map\nconst instances = new Map<string, Analytics>();\n\n/**\n * 创建或获取 Analytics 实例\n * @param instanceKey 实例唯一标识\n * @param config Analytics 配置\n * @returns Analytics 实例\n */\nexport function createAnalytics(instanceKey: string, config: AnalyticsConfig): Analytics {\n if (!instances.has(instanceKey)) {\n instances.set(instanceKey, new Analytics(config));\n }\n return instances.get(instanceKey)!;\n}\n\n/**\n * 获取已存在的 Analytics 实例\n * @param instanceKey 实例唯一标识\n * @returns Analytics 实例或 null\n */\nexport function getAnalyticsInstance(instanceKey: string): Analytics | null {\n return instances.get(instanceKey) || null;\n}\n\n/**\n * 重置指定实例\n * @param instanceKey 实例唯一标识\n */\nexport function resetAnalytics(instanceKey: string): void {\n instances.delete(instanceKey);\n}\n\n/**\n * 重置所有实例\n */\nexport function resetAllAnalytics(): void {\n instances.clear();\n}\n\n/**\n * 检查实例是否已初始化\n * @param instanceKey 实例唯一标识\n */\nexport function isAnalyticsInitialized(instanceKey: string): boolean {\n return instances.has(instanceKey);\n}\n\n/**\n * 获取所有已创建的实例键名\n */\nexport function getAllInstanceKeys(): string[] {\n return Array.from(instances.keys());\n}\n","/**\n * 埋点工具函数\n * Analytics Helper Functions\n */\n\nimport type { AnalyticsEvent } from '../types';\n\n/**\n * 节流函数\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: any = null;\n let previous = 0;\n\n return function (this: any, ...args: Parameters<T>) {\n const now = Date.now();\n const remaining = wait - (now - previous);\n\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n func.apply(this, args);\n } else if (!timeout) {\n timeout = setTimeout(() => {\n previous = Date.now();\n timeout = null;\n func.apply(this, args);\n }, remaining);\n }\n };\n}\n\n/**\n * 防抖函数\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: any = null;\n\n return function (this: any, ...args: Parameters<T>) {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(() => {\n func.apply(this, args);\n }, wait);\n };\n}\n\n/**\n * 格式化事件数据\n */\nexport function formatEvent(event: AnalyticsEvent): string {\n return JSON.stringify(event, null, 2);\n}\n\n/**\n * 验证事件数据\n */\nexport function validateEvent(event: AnalyticsEvent): boolean {\n if (!event.event_id || !event.event_type || !event.event_name) {\n return false;\n }\n if (!event.timestamp || event.timestamp <= 0) {\n return false;\n }\n if (!event.session_id || !event.device_id) {\n return false;\n }\n return true;\n}\n\n/**\n * 批量验证事件\n */\nexport function validateEvents(events: AnalyticsEvent[]): {\n valid: AnalyticsEvent[];\n invalid: AnalyticsEvent[];\n} {\n const valid: AnalyticsEvent[] = [];\n const invalid: AnalyticsEvent[] = [];\n\n events.forEach((event) => {\n if (validateEvent(event)) {\n valid.push(event);\n } else {\n invalid.push(event);\n }\n });\n\n return { valid, invalid };\n}\n\n/**\n * 计算事件大小(字节)\n */\nexport function getEventSize(event: AnalyticsEvent): number {\n return new Blob([JSON.stringify(event)]).size;\n}\n\n/**\n * 计算批量事件大小\n */\nexport function getBatchSize(events: AnalyticsEvent[]): number {\n return events.reduce((total, event) => total + getEventSize(event), 0);\n}\n\n/**\n * 过滤敏感信息\n */\nexport function sanitizeEvent(\n event: AnalyticsEvent,\n sensitiveKeys: string[] = ['password', 'token', 'secret', 'key']\n): AnalyticsEvent {\n const sanitized = { ...event };\n\n if (sanitized.properties) {\n const cleanProperties = { ...sanitized.properties };\n\n sensitiveKeys.forEach((key) => {\n if (key in cleanProperties) {\n cleanProperties[key] = '***';\n }\n });\n\n sanitized.properties = cleanProperties;\n }\n\n return sanitized;\n}\n\n/**\n * 合并事件属性\n */\nexport function mergeEventProperties(\n baseProperties: Record<string, any>,\n ...additionalProperties: Record<string, any>[]\n): Record<string, any> {\n return Object.assign({}, baseProperties, ...additionalProperties);\n}\n\n/**\n * 生成唯一ID\n */\nexport function generateUniqueId(prefix: string = ''): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 15);\n return prefix ? `${prefix}_${timestamp}_${random}` : `${timestamp}_${random}`;\n}\n\n/**\n * 判断是否为移动设备\n */\nexport function isMobile(): boolean {\n if (typeof navigator === 'undefined') return false;\n\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n}\n\n/**\n * 判断是否为开发环境\n */\nexport function isDevelopment(): boolean {\n return process.env.NODE_ENV === 'development';\n}\n\n/**\n * 格式化时间戳\n */\nexport function formatTimestamp(\n timestamp: number,\n format: 'date' | 'datetime' | 'time' = 'datetime'\n): string {\n const date = new Date(timestamp);\n\n switch (format) {\n case 'date':\n return date.toLocaleDateString();\n case 'time':\n return date.toLocaleTimeString();\n case 'datetime':\n default:\n return date.toLocaleString();\n }\n}\n\n/**\n * 深拷贝对象\n */\nexport function deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * 安全的 JSON.stringify\n */\nexport function safeStringify(obj: any, fallback: string = '{}'): string {\n try {\n return JSON.stringify(obj);\n } catch (error) {\n console.error('Failed to stringify object:', error);\n return fallback;\n }\n}\n\n/**\n * 安全的 JSON.parse\n */\nexport function safeParse<T>(json: string, fallback: T): T {\n try {\n return JSON.parse(json);\n } catch (error) {\n console.error('Failed to parse JSON:', error);\n return fallback;\n }\n}\n\n/**\n * 获取页面停留时长\n */\nexport function getPageDuration(startTime: number): number {\n return Date.now() - startTime;\n}\n\n/**\n * 获取当前页面 URL\n */\nexport function getCurrentPageUrl(): string {\n if (typeof window !== 'undefined') {\n return window.location.href;\n }\n return '';\n}\n\n/**\n * 获取当前页面标题\n */\nexport function getCurrentPageTitle(): string {\n if (typeof document !== 'undefined') {\n return document.title;\n }\n return '';\n}\n\n/**\n * 获取来源页面\n */\nexport function getReferrer(): string {\n if (typeof document !== 'undefined') {\n return document.referrer;\n }\n return '';\n}\n","/**\n * 埋点装饰器\n * Analytics Decorators\n */\n\nimport type { Analytics } from '../core/Analytics';\nimport { EventType, EventPriority } from '../types';\n\n/**\n * 追踪方法执行\n * @param eventName 事件名称\n * @param priority 事件优先级\n */\nexport function Track(eventName?: string, priority: EventPriority = EventPriority.NORMAL) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalEventName = eventName || propertyKey;\n\n // 执行前记录\n const startTime = Date.now();\n\n try {\n const result = await originalMethod.apply(this, args);\n\n // 执行成功\n analytics?.track(\n EventType.CUSTOM,\n finalEventName,\n {\n success: true,\n duration: Date.now() - startTime,\n args: JSON.stringify(args),\n },\n priority\n );\n\n return result;\n } catch (error) {\n // 执行失败\n analytics?.track(\n EventType.ERROR,\n `${finalEventName}_error`,\n {\n success: false,\n duration: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n },\n EventPriority.HIGH\n );\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 追踪点击事件\n */\nexport function TrackClick(eventName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalEventName = eventName || propertyKey;\n\n analytics?.track(\n EventType.CLICK,\n finalEventName,\n {\n args: JSON.stringify(args),\n },\n EventPriority.LOW\n );\n\n return originalMethod.apply(this, args);\n };\n\n return descriptor;\n };\n}\n\n/**\n * 追踪性能\n */\nexport function TrackPerformance(metricName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalMetricName = metricName || propertyKey;\n const startTime = performance.now();\n\n try {\n const result = await originalMethod.apply(this, args);\n const duration = performance.now() - startTime;\n\n analytics?.trackPerformance(finalMetricName, duration, 'ms', {\n success: true,\n });\n\n return result;\n } catch (error) {\n const duration = performance.now() - startTime;\n\n analytics?.trackPerformance(finalMetricName, duration, 'ms', {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 自动捕获错误\n */\nexport function CatchError(_eventName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n try {\n return await originalMethod.apply(this, args);\n } catch (error) {\n const analytics = getAnalyticsInstance(this);\n\n analytics?.trackError(\n error instanceof Error ? error.message : String(error),\n error instanceof Error ? error.stack : undefined,\n error instanceof Error ? error.name : 'Error',\n {\n method: propertyKey,\n args: JSON.stringify(args),\n }\n );\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 从实例中获取 Analytics 实例\n */\nfunction getAnalyticsInstance(instance: any): Analytics | null {\n // 尝试多种方式获取\n if (instance.analytics) {\n return instance.analytics;\n }\n if (instance._analytics) {\n return instance._analytics;\n }\n if ((globalThis as any).__analytics__) {\n return (globalThis as any).__analytics__;\n }\n return null;\n}\n\n/**\n * 设置全局 Analytics 实例\n */\nexport function setGlobalAnalytics(analytics: Analytics): void {\n (globalThis as any).__analytics__ = analytics;\n}\n\n/**\n * 获取全局 Analytics 实例\n */\nexport function getGlobalAnalytics(): Analytics | null {\n return (globalThis as any).__analytics__ || null;\n}\n","'use client';\n\n/**\n * React Hooks for Analytics\n * 埋点 React Hooks\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport type { Analytics } from '../core/Analytics';\nimport { EventType, EventPriority } from '../types';\n\n/**\n * 使用埋点实例\n */\nexport function useAnalytics(analytics: Analytics | null) {\n return analytics;\n}\n\n/**\n * 追踪页面浏览\n */\nexport function usePageView(analytics: Analytics | null, pageUrl?: string, pageTitle?: string) {\n useEffect(() => {\n if (!analytics) return;\n\n const url = pageUrl || (typeof window !== 'undefined' ? window.location.href : '');\n const title = pageTitle || (typeof document !== 'undefined' ? document.title : '');\n\n analytics.trackPageView(url, title);\n }, [analytics, pageUrl, pageTitle]);\n}\n\n/**\n * 追踪事件(返回追踪函数)\n */\nexport function useTrackEvent(analytics: Analytics | null) {\n return useCallback(\n (\n eventType: EventType,\n eventName: string,\n properties?: Record<string, any>,\n priority?: EventPriority\n ) => {\n if (analytics) {\n analytics.track(eventType, eventName, properties, priority);\n }\n },\n [analytics]\n );\n}\n\n/**\n * 追踪点击事件\n */\nexport function useTrackClick(analytics: Analytics | null) {\n return useCallback(\n (elementInfo: {\n elementId?: string;\n elementClass?: string;\n elementText?: string;\n elementType?: string;\n }) => {\n if (analytics) {\n analytics.trackClick(elementInfo);\n }\n },\n [analytics]\n );\n}\n\n/**\n * 追踪页面停留时长\n */\nexport function usePageDuration(analytics: Analytics | null) {\n const startTimeRef = useRef<number>(Date.now());\n\n useEffect(() => {\n startTimeRef.current = Date.now();\n\n return () => {\n if (analytics) {\n const duration = Date.now() - startTimeRef.current;\n analytics.track(\n EventType.PAGE_LEAVE,\n 'page_leave',\n {\n duration,\n page_url: typeof window !== 'undefined' ? window.location.href : '',\n },\n EventPriority.NORMAL\n );\n }\n };\n }, [analytics]);\n}\n\n/**\n * 追踪性能指标\n */\nexport function usePerformanceTracking(analytics: Analytics | null) {\n useEffect(() => {\n if (!analytics || typeof window === 'undefined') return;\n\n // 监听页面加载性能\n if ('performance' in window && 'timing' in window.performance) {\n const timing = window.performance.timing as any;\n const loadTime = timing.loadEventEnd - timing.navigationStart;\n const domReadyTime = timing.domContentLoadedEventEnd - timing.navigationStart;\n const firstPaintTime = timing.responseStart - timing.navigationStart;\n\n analytics.trackPerformance('page_load_time', loadTime, 'ms');\n analytics.trackPerformance('dom_ready_time', domReadyTime, 'ms');\n analytics.trackPerformance('first_paint_time', firstPaintTime, 'ms');\n }\n\n // 监听资源加载性能\n if ('PerformanceObserver' in window) {\n const observer = new PerformanceObserver((list) => {\n list.getEntries().forEach((entry) => {\n if (entry.entryType === 'resource') {\n analytics.trackPerformance('resource_load_time', entry.duration, 'ms', {\n resource_name: entry.name,\n });\n }\n });\n });\n\n observer.observe({ entryTypes: ['resource'] });\n\n return () => observer.disconnect();\n }\n\n return undefined;\n }, [analytics]);\n}\n\n/**\n * 追踪错误\n */\nexport function useErrorTracking(analytics: Analytics | null) {\n useEffect(() => {\n if (!analytics || typeof window === 'undefined') return;\n\n const handleError = (event: ErrorEvent) => {\n analytics.trackError(event.message, event.error?.stack, event.error?.name, {\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n });\n };\n\n const handleUnhandledRejection = (event: PromiseRejectionEvent) => {\n analytics.trackError('Unhandled Promise Rejection', undefined, 'PromiseRejection', {\n reason: String(event.reason),\n });\n };\n\n window.addEventListener('error', handleError);\n window.addEventListener('unhandledrejection', handleUnhandledRejection);\n\n return () => {\n window.removeEventListener('error', handleError);\n window.removeEventListener('unhandledrejection', handleUnhandledRejection);\n };\n }, [analytics]);\n}\n\n/**\n * 自动追踪用户行为(综合 Hook)\n */\nexport function useAutoTracking(\n analytics: Analytics | null,\n options: {\n trackPageView?: boolean;\n trackPageDuration?: boolean;\n trackPerformance?: boolean;\n trackErrors?: boolean;\n } = {}\n) {\n const {\n trackPageView = true,\n trackPageDuration = true,\n trackPerformance = true,\n trackErrors = true,\n } = options;\n\n // 页面浏览\n useEffect(() => {\n if (trackPageView && analytics) {\n const url = typeof window !== 'undefined' ? window.location.href : '';\n const title = typeof document !== 'undefined' ? document.title : '';\n analytics.trackPageView(url, title);\n }\n }, [analytics, trackPageView]);\n\n // 页面停留时长\n const startTimeRef = useRef<number>(Date.now());\n useEffect(() => {\n if (!trackPageDuration || !analytics) return;\n\n startTimeRef.current = Date.now();\n\n return () => {\n const duration = Date.now() - startTimeRef.current;\n analytics.track(\n EventType.PAGE_LEAVE,\n 'page_leave',\n {\n duration,\n page_url: typeof window !== 'undefined' ? window.location.href : '',\n },\n EventPriority.NORMAL\n );\n };\n }, [analytics, trackPageDuration]);\n\n // 性能追踪\n useEffect(() => {\n if (!trackPerformance || !analytics || typeof window === 'undefined') return;\n\n const handleLoad = () => {\n if ('performance' in window && 'timing' in window.performance) {\n const timing = window.performance.timing as any;\n const loadTime = timing.loadEventEnd - timing.navigationStart;\n analytics.trackPerformance('page_load_time', loadTime, 'ms');\n }\n };\n\n window.addEventListener('load', handleLoad);\n return () => window.removeEventListener('load', handleLoad);\n }, [analytics, trackPerformance]);\n\n // 错误追踪\n useEffect(() => {\n if (!trackErrors || !analytics || typeof window === 'undefined') return;\n\n const handleError = (event: ErrorEvent) => {\n analytics.trackError(event.message, event.error?.stack, event.error?.name);\n };\n\n window.addEventListener('error', handleError);\n return () => window.removeEventListener('error', handleError);\n }, [analytics, trackErrors]);\n}\n","/**\n * Web 平台适配器\n * Browser/Next.js Platform Adapters\n */\n\nimport type {\n AnalyticsStorageAdapter,\n AnalyticsNetworkAdapter,\n AnalyticsDeviceAdapter,\n DeviceInfo,\n AnalyticsEvent,\n UploadResponse,\n} from '../types';\n\n/**\n * Web 存储适配器(使用 localStorage)\n */\nexport class WebStorageAdapter implements AnalyticsStorageAdapter {\n private EVENTS_KEY = 'analytics:events';\n private DEVICE_INFO_KEY = 'analytics:device_info';\n private SESSION_ID_KEY = 'analytics:session_id';\n\n async saveEvents(events: AnalyticsEvent[]): Promise<void> {\n try {\n if (typeof window !== 'undefined') {\n localStorage.setItem(this.EVENTS_KEY, JSON.stringify(events));\n }\n } catch (error) {\n console.error('Failed to save events:', error);\n }\n }\n\n async getEvents(): Promise<AnalyticsEvent[]> {\n try {\n if (typeof window !== 'undefined') {\n const data = localStorage.getItem(this.EVENTS_KEY);\n return data ? JSON.parse(data) : [];\n }\n return [];\n } catch (error) {\n console.error('Failed to get events:', error);\n return [];\n }\n }\n\n async clearEvents(): Promise<void> {\n try {\n if (typeof window !== 'undefined') {\n localStorage.removeItem(this.EVENTS_KEY);\n }\n } catch (error) {\n console.error('Failed to clear events:', error);\n }\n }\n\n async saveDeviceInfo(info: DeviceInfo): Promise<void> {\n try {\n if (typeof window !== 'undefined') {\n localStorage.setItem(this.DEVICE_INFO_KEY, JSON.stringify(info));\n }\n } catch (error) {\n console.error('Failed to save device info:', error);\n }\n }\n\n async getDeviceInfo(): Promise<DeviceInfo | null> {\n try {\n if (typeof window !== 'undefined') {\n const data = localStorage.getItem(this.DEVICE_INFO_KEY);\n return data ? JSON.parse(data) : null;\n }\n return null;\n } catch (error) {\n console.error('Failed to get device info:', error);\n return null;\n }\n }\n\n async saveSessionId(sessionId: string): Promise<void> {\n try {\n if (typeof window !== 'undefined') {\n sessionStorage.setItem(this.SESSION_ID_KEY, sessionId);\n }\n } catch (error) {\n console.error('Failed to save session ID:', error);\n }\n }\n\n async getSessionId(): Promise<string | null> {\n try {\n if (typeof window !== 'undefined') {\n return sessionStorage.getItem(this.SESSION_ID_KEY);\n }\n return null;\n } catch (error) {\n console.error('Failed to get session ID:', error);\n return null;\n }\n }\n}\n\n/**\n * Web 网络适配器\n */\nexport class WebNetworkAdapter implements AnalyticsNetworkAdapter {\n async upload(url: string, events: AnalyticsEvent[]): Promise<UploadResponse> {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n events,\n timestamp: Date.now(),\n }),\n // 使用 keepalive 确保页面关闭时也能发送\n keepalive: true,\n });\n\n if (response.ok) {\n const data = await response.json();\n return {\n success: true,\n message: data.message,\n code: response.status,\n };\n } else {\n return {\n success: false,\n message: `HTTP ${response.status}`,\n code: response.status,\n };\n }\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Network error',\n code: 0,\n };\n }\n }\n\n async isOnline(): Promise<boolean> {\n if (typeof navigator !== 'undefined' && 'onLine' in navigator) {\n return navigator.onLine;\n }\n return true;\n }\n}\n\n/**\n * Web 设备信息适配器\n */\nexport class WebDeviceAdapter implements AnalyticsDeviceAdapter {\n async getDeviceInfo(): Promise<DeviceInfo> {\n return {\n device_id: await this.generateDeviceId(),\n os_name: this.getOSName(),\n os_version: this.getOSVersion(),\n screen_width: typeof window !== 'undefined' ? window.screen.width : 0,\n screen_height: typeof window !== 'undefined' ? window.screen.height : 0,\n language: typeof navigator !== 'undefined' ? navigator.language : 'en',\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n device_model: this.getBrowserName(),\n device_brand: this.getBrowserVersion(),\n };\n }\n\n async generateDeviceId(): Promise<string> {\n // 尝试从 localStorage 获取已存在的 ID\n if (typeof window !== 'undefined') {\n let deviceId = localStorage.getItem('analytics:device_id');\n\n if (!deviceId) {\n deviceId = `web_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n localStorage.setItem('analytics:device_id', deviceId);\n }\n\n return deviceId;\n }\n\n return `web_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }\n\n private getOSName(): string {\n if (typeof navigator === 'undefined') return 'unknown';\n\n const userAgent = navigator.userAgent;\n\n if (userAgent.indexOf('Win') !== -1) return 'Windows';\n if (userAgent.indexOf('Mac') !== -1) return 'MacOS';\n if (userAgent.indexOf('Linux') !== -1) return 'Linux';\n if (userAgent.indexOf('Android') !== -1) return 'Android';\n if (userAgent.indexOf('iOS') !== -1) return 'iOS';\n\n return 'unknown';\n }\n\n private getOSVersion(): string {\n if (typeof navigator === 'undefined') return 'unknown';\n\n const userAgent = navigator.userAgent;\n const match = userAgent.match(/\\(([^)]+)\\)/);\n\n return match && match[1] ? match[1] : 'unknown';\n }\n\n private getBrowserName(): string {\n if (typeof navigator === 'undefined') return 'unknown';\n\n const userAgent = navigator.userAgent;\n\n if (userAgent.indexOf('Chrome') !== -1) return 'Chrome';\n if (userAgent.indexOf('Safari') !== -1) return 'Safari';\n if (userAgent.indexOf('Firefox') !== -1) return 'Firefox';\n if (userAgent.indexOf('Edge') !== -1) return 'Edge';\n\n return 'unknown';\n }\n\n private getBrowserVersion(): string {\n if (typeof navigator === 'undefined') return 'unknown';\n\n const userAgent = navigator.userAgent;\n const match = userAgent.match(/(Chrome|Safari|Firefox|Edge)\\/(\\d+)/);\n\n return match && match[2] ? match[2] : 'unknown';\n }\n}\n\n/**\n * 统一的 Web 适配器对象\n */\nexport const webAdapter = {\n storage: new WebStorageAdapter(),\n network: new WebNetworkAdapter(),\n device: new WebDeviceAdapter(),\n};\n\n","/**\n * Mobile 平台适配器\n * React Native Platform Adapters\n */\n\nimport type {\n AnalyticsStorageAdapter,\n AnalyticsNetworkAdapter,\n AnalyticsDeviceAdapter,\n DeviceInfo,\n AnalyticsEvent,\n UploadResponse,\n} from '../types';\n\n/**\n * Mobile 存储适配器\n * 需要在 mobile 项目中实现具体的 AsyncStorage 逻辑\n */\nexport class MobileStorageAdapter implements AnalyticsStorageAdapter {\n private EVENTS_KEY = '@analytics:events';\n private DEVICE_INFO_KEY = '@analytics:device_info';\n private SESSION_ID_KEY = '@analytics:session_id';\n\n // 需要注入具体的存储实现\n constructor(\n private storage: {\n getItem: (key: string) => Promise<string | null>;\n setItem: (key: string, value: string) => Promise<void>;\n removeItem: (key: string) => Promise<void>;\n }\n ) {}\n\n async saveEvents(events: AnalyticsEvent[]): Promise<void> {\n try {\n await this.storage.setItem(this.EVENTS_KEY, JSON.stringify(events));\n } catch (error) {\n console.error('Failed to save events:', error);\n }\n }\n\n async getEvents(): Promise<AnalyticsEvent[]> {\n try {\n const data = await this.storage.getItem(this.EVENTS_KEY);\n return data ? JSON.parse(data) : [];\n } catch (error) {\n console.error('Failed to get events:', error);\n return [];\n }\n }\n\n async clearEvents(): Promise<void> {\n try {\n await this.storage.removeItem(this.EVENTS_KEY);\n } catch (error) {\n console.error('Failed to clear events:', error);\n }\n }\n\n async saveDeviceInfo(info: DeviceInfo): Promise<void> {\n try {\n await this.storage.setItem(this.DEVICE_INFO_KEY, JSON.stringify(info));\n } catch (error) {\n console.error('Failed to save device info:', error);\n }\n }\n\n async getDeviceInfo(): Promise<DeviceInfo | null> {\n try {\n const data = await this.storage.getItem(this.DEVICE_INFO_KEY);\n return data ? JSON.parse(data) : null;\n } catch (error) {\n console.error('Failed to get device info:', error);\n return null;\n }\n }\n\n async saveSessionId(sessionId: string): Promise<void> {\n try {\n await this.storage.setItem(this.SESSION_ID_KEY, sessionId);\n } catch (error) {\n console.error('Failed to save session ID:', error);\n }\n }\n\n async getSessionId(): Promise<string | null> {\n try {\n return await this.storage.getItem(this.SESSION_ID_KEY);\n } catch (error) {\n console.error('Failed to get session ID:', error);\n return null;\n }\n }\n}\n\n/**\n * Mobile 网络适配器\n */\nexport class MobileNetworkAdapter implements AnalyticsNetworkAdapter {\n // 需要注入网络检查函数\n constructor(\n private netInfo?: {\n fetch: () => Promise<{ isConnected: boolean | null }>;\n }\n ) {}\n\n async upload(url: string, events: AnalyticsEvent[]): Promise<UploadResponse> {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n events,\n timestamp: Date.now(),\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n return {\n success: true,\n message: data.message,\n code: response.status,\n };\n } else {\n return {\n success: false,\n message: `HTTP ${response.status}`,\n code: response.status,\n };\n }\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Network error',\n code: 0,\n };\n }\n }\n\n async isOnline(): Promise<boolean> {\n try {\n if (this.netInfo) {\n const state = await this.netInfo.fetch();\n return state.isConnected ?? false;\n }\n // 如果没有 NetInfo,假设在线\n return true;\n } catch (error) {\n return true;\n }\n }\n}\n\n/**\n * Mobile 设备信息适配器\n */\nexport class MobileDeviceAdapter implements AnalyticsDeviceAdapter {\n // 需要注入设备信息获取函数\n constructor(\n private deviceInfoModule?: {\n getSystemName: () => Promise<string>;\n getSystemVersion: () => Promise<string>;\n getModel: () => Promise<string>;\n getBrand: () => Promise<string>;\n getUniqueId: () => Promise<string>;\n }\n ) {}\n\n async getDeviceInfo(): Promise<DeviceInfo> {\n try {\n const info = this.deviceInfoModule;\n\n return {\n device_id: info ? await info.getUniqueId() : await this.generateDeviceId(),\n device_model: info ? await info.getModel() : 'unknown',\n device_brand: info ? await info.getBrand() : 'unknown',\n os_name: info ? await info.getSystemName() : 'unknown',\n os_version: info ? await info.getSystemVersion() : 'unknown',\n screen_width: typeof window !== 'undefined' ? window.screen.width : 0,\n screen_height: typeof window !== 'undefined' ? window.screen.height : 0,\n language: typeof navigator !== 'undefined' ? navigator.language : 'en',\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n };\n } catch (error) {\n console.error('Failed to get device info:', error);\n return this.getDefaultDeviceInfo();\n }\n }\n\n async generateDeviceId(): Promise<string> {\n // 生成一个唯一的设备ID\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 15);\n return `mobile_${timestamp}_${random}`;\n }\n\n private getDefaultDeviceInfo(): DeviceInfo {\n return {\n device_id: `mobile_${Date.now()}`,\n os_name: 'unknown',\n os_version: 'unknown',\n screen_width: 0,\n screen_height: 0,\n language: 'en',\n timezone: 'UTC',\n };\n }\n}\n","/**\n * 小程序平台适配器\n * WeChat MiniProgram Platform Adapters\n */\n\nimport type {\n AnalyticsStorageAdapter,\n AnalyticsNetworkAdapter,\n AnalyticsDeviceAdapter,\n DeviceInfo,\n AnalyticsEvent,\n UploadResponse,\n} from '../types';\n\n/**\n * 小程序存储适配器\n */\nexport class MiniappStorageAdapter implements AnalyticsStorageAdapter {\n private EVENTS_KEY = 'analytics_events';\n private DEVICE_INFO_KEY = 'analytics_device_info';\n private SESSION_ID_KEY = 'analytics_session_id';\n\n // 需要注入 Taro 的存储 API\n constructor(\n private storage?: {\n getStorageSync: (key: string) => any;\n setStorageSync: (key: string, data: any) => void;\n removeStorageSync: (key: string) => void;\n }\n ) {}\n\n async saveEvents(events: AnalyticsEvent[]): Promise<void> {\n try {\n if (this.storage) {\n this.storage.setStorageSync(this.EVENTS_KEY, events);\n }\n } catch (error) {\n console.error('Failed to save events:', error);\n }\n }\n\n async getEvents(): Promise<AnalyticsEvent[]> {\n try {\n if (this.storage) {\n const data = this.storage.getStorageSync(this.EVENTS_KEY);\n return data || [];\n }\n return [];\n } catch (error) {\n console.error('Failed to get events:', error);\n return [];\n }\n }\n\n async clearEvents(): Promise<void> {\n try {\n if (this.storage) {\n this.storage.removeStorageSync(this.EVENTS_KEY);\n }\n } catch (error) {\n console.error('Failed to clear events:', error);\n }\n }\n\n async saveDeviceInfo(info: DeviceInfo): Promise<void> {\n try {\n if (this.storage) {\n this.storage.setStorageSync(this.DEVICE_INFO_KEY, info);\n }\n } catch (error) {\n console.error('Failed to save device info:', error);\n }\n }\n\n async getDeviceInfo(): Promise<DeviceInfo | null> {\n try {\n if (this.storage) {\n return this.storage.getStorageSync(this.DEVICE_INFO_KEY) || null;\n }\n return null;\n } catch (error) {\n console.error('Failed to get device info:', error);\n return null;\n }\n }\n\n async saveSessionId(sessionId: string): Promise<void> {\n try {\n if (this.storage) {\n this.storage.setStorageSync(this.SESSION_ID_KEY, sessionId);\n }\n } catch (error) {\n console.error('Failed to save session ID:', error);\n }\n }\n\n async getSessionId(): Promise<string | null> {\n try {\n if (this.storage) {\n return this.storage.getStorageSync(this.SESSION_ID_KEY) || null;\n }\n return null;\n } catch (error) {\n console.error('Failed to get session ID:', error);\n return null;\n }\n }\n}\n\n/**\n * 小程序网络适配器\n */\nexport class MiniappNetworkAdapter implements AnalyticsNetworkAdapter {\n // 需要注入 Taro 的网络 API\n constructor(\n private request?: {\n request: (options: any) => Promise<any>;\n },\n private netInfo?: {\n getNetworkType: () => Promise<{ networkType: string }>;\n }\n ) {}\n\n async upload(url: string, events: AnalyticsEvent[]): Promise<UploadResponse> {\n try {\n if (!this.request) {\n throw new Error('Request module not provided');\n }\n\n const response = await this.request.request({\n url,\n method: 'POST',\n data: {\n events,\n timestamp: Date.now(),\n },\n header: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (response.statusCode === 200) {\n return {\n success: true,\n message: response.data.message,\n code: response.statusCode,\n };\n } else {\n return {\n success: false,\n message: `HTTP ${response.statusCode}`,\n code: response.statusCode,\n };\n }\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Network error',\n code: 0,\n };\n }\n }\n\n async isOnline(): Promise<boolean> {\n try {\n if (this.netInfo) {\n const { networkType } = await this.netInfo.getNetworkType();\n return networkType !== 'none';\n }\n return true;\n } catch (error) {\n return true;\n }\n }\n}\n\n/**\n * 小程序设备信息适配器\n */\nexport class MiniappDeviceAdapter implements AnalyticsDeviceAdapter {\n // 需要注入 Taro 的系统信息 API\n constructor(\n private systemInfo?: {\n getSystemInfoSync: () => any;\n }\n ) {}\n\n async getDeviceInfo(): Promise<DeviceInfo> {\n try {\n if (this.systemInfo) {\n const info = this.systemInfo.getSystemInfoSync();\n\n return {\n device_id: await this.generateDeviceId(),\n device_model: info.model || 'unknown',\n device_brand: info.brand || 'unknown',\n os_name: info.platform || 'unknown',\n os_version: info.system || 'unknown',\n screen_width: info.screenWidth || 0,\n screen_height: info.screenHeight || 0,\n language: info.language || 'zh_CN',\n timezone: 'Asia/Shanghai',\n network_type: info.networkType,\n };\n }\n\n return this.getDefaultDeviceInfo();\n } catch (error) {\n console.error('Failed to get device info:', error);\n return this.getDefaultDeviceInfo();\n }\n }\n\n async generateDeviceId(): Promise<string> {\n // 小程序中使用唯一标识\n // 可以结合 openid 或其他标识\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 15);\n return `miniapp_${timestamp}_${random}`;\n }\n\n private getDefaultDeviceInfo(): DeviceInfo {\n return {\n device_id: `miniapp_${Date.now()}`,\n os_name: 'wechat',\n os_version: 'unknown',\n screen_width: 0,\n screen_height: 0,\n language: 'zh_CN',\n timezone: 'Asia/Shanghai',\n };\n }\n}\n","/**\n * Desktop 平台适配器\n * Electron Platform Adapters\n */\n\nimport type {\n AnalyticsStorageAdapter,\n AnalyticsNetworkAdapter,\n AnalyticsDeviceAdapter,\n DeviceInfo,\n AnalyticsEvent,\n UploadResponse,\n} from '../types';\n\n/**\n * Desktop 存储适配器(使用 localStorage)\n */\nexport class DesktopStorageAdapter implements AnalyticsStorageAdapter {\n private EVENTS_KEY = 'analytics:events';\n private DEVICE_INFO_KEY = 'analytics:device_info';\n private SESSION_ID_KEY = 'analytics:session_id';\n\n async saveEvents(events: AnalyticsEvent[]): Promise<void> {\n try {\n if (typeof window !== 'undefined') {\n localStorage.setItem(this.EVENTS_KEY, JSON.stringify(events));\n }\n } catch (error) {\n console.error('Failed to save events:', error);\n }\n }\n\n async getEvents(): Promise<AnalyticsEvent[]> {\n try {\n if (typeof window !== 'undefined') {\n const data = localStorage.getItem(this.EVENTS_KEY);\n return data ? JSON.parse(data) : [];\n }\n return [];\n } catch (error) {\n console.error('Failed to get events:', error);\n return [];\n }\n }\n\n async clearEvents(): Promise<void> {\n try {\n if (typeof window !== 'undefined') {\n localStorage.removeItem(this.EVENTS_KEY);\n }\n } catch (error) {\n console.error('Failed to clear events:', error);\n }\n }\n\n async saveDeviceInfo(info: DeviceInfo): Promise<void> {\n try {\n if (typeof window !== 'undefined') {\n localStorage.setItem(this.DEVICE_INFO_KEY, JSON.stringify(info));\n }\n } catch (error) {\n console.error('Failed to save device info:', error);\n }\n }\n\n async getDeviceInfo(): Promise<DeviceInfo | null> {\n try {\n if (typeof window !== 'undefined') {\n const data = localStorage.getItem(this.DEVICE_INFO_KEY);\n return data ? JSON.parse(data) : null;\n }\n return null;\n } catch (error) {\n console.error('Failed to get device info:', error);\n return null;\n }\n }\n\n async saveSessionId(sessionId: string): Promise<void> {\n try {\n if (typeof window !== 'undefined') {\n localStorage.setItem(this.SESSION_ID_KEY, sessionId);\n }\n } catch (error) {\n console.error('Failed to save session ID:', error);\n }\n }\n\n async getSessionId(): Promise<string | null> {\n try {\n if (typeof window !== 'undefined') {\n return localStorage.getItem(this.SESSION_ID_KEY);\n }\n return null;\n } catch (error) {\n console.error('Failed to get session ID:', error);\n return null;\n }\n }\n}\n\n/**\n * Desktop 网络适配器\n */\nexport class DesktopNetworkAdapter implements AnalyticsNetworkAdapter {\n async upload(url: string, events: AnalyticsEvent[]): Promise<UploadResponse> {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n events,\n timestamp: Date.now(),\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n return {\n success: true,\n message: data.message,\n code: response.status,\n };\n } else {\n return {\n success: false,\n message: `HTTP ${response.status}`,\n code: response.status,\n };\n }\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Network error',\n code: 0,\n };\n }\n }\n\n async isOnline(): Promise<boolean> {\n if (typeof navigator !== 'undefined' && 'onLine' in navigator) {\n return navigator.onLine;\n }\n return true;\n }\n}\n\n/**\n * Desktop 设备信息适配器\n */\nexport class DesktopDeviceAdapter implements AnalyticsDeviceAdapter {\n async getDeviceInfo(): Promise<DeviceInfo> {\n return {\n device_id: await this.generateDeviceId(),\n os_name: this.getOSName(),\n os_version: this.getOSVersion(),\n screen_width: typeof window !== 'undefined' ? window.screen.width : 0,\n screen_height: typeof window !== 'undefined' ? window.screen.height : 0,\n language: typeof navigator !== 'undefined' ? navigator.language : 'en',\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n device_model: 'Desktop',\n device_brand: 'Electron',\n };\n }\n\n async generateDeviceId(): Promise<string> {\n // 尝试从 localStorage 获取已存在的 ID\n if (typeof window !== 'undefined') {\n let deviceId = localStorage.getItem('analytics:device_id');\n\n if (!deviceId) {\n // Electron 中可以使用机器的唯一标识\n // 这里简化处理,实际可以通过 IPC 获取\n deviceId = `desktop_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n localStorage.setItem('analytics:device_id', deviceId);\n }\n\n return deviceId;\n }\n\n return `desktop_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }\n\n private getOSName(): string {\n if (typeof navigator === 'undefined') return 'unknown';\n\n const platform = navigator.platform.toLowerCase();\n\n if (platform.indexOf('win') !== -1) return 'Windows';\n if (platform.indexOf('mac') !== -1) return 'MacOS';\n if (platform.indexOf('linux') !== -1) return 'Linux';\n\n return 'unknown';\n }\n\n private getOSVersion(): string {\n if (typeof navigator === 'undefined') return 'unknown';\n\n // Electron 中可以通过 process.getSystemVersion() 获取\n // 这里简化处理\n return navigator.userAgent;\n }\n}\n","/**\n * Analytics 埋点分析模块\n *\n * 提供完整的事件追踪、用户行为分析、数据上报等功能\n * 包含多平台适配器(web/mobile/desktop/miniapp)\n */\n\n// 核心类\nexport { Analytics } from './core/Analytics';\nexport { EventQueue } from './core/EventQueue';\nexport { Uploader } from './core/Uploader';\n\n// 类型定义\nexport * from './types';\n\n// 客户端工具(单例管理器 + 预设配置)\nexport * from './client';\n\n// 工具函数\nexport * from './utils/helpers';\nexport * from './utils/decorators';\nexport * from './utils/hooks';\n\n// 平台适配器\nexport * from './adapters';\n\n// UI 组件\n// 注意:组件中的 AnalyticsEvent 类型与 types.ts 中的冲突\n// 建议直接使用 import { AnalyticsDashboard } from '@qhr123/sa2kit/analytics'\n\n// 版本信息\nexport const ANALYTICS_VERSION = '1.0.0';\n\n"]}