{"version":3,"sources":["../src/utils.ts","../src/Logger.ts","../src/SecurityUtils.ts","../src/MessageBridge.ts","../src/StandardEventTarget.ts","../src/StandardActionManager.ts","../src/Base.ts","../src/Client.ts","../src/Remote.ts","../src/EventTypes.ts","../src/compatibility-config.ts","../src/compatibility-layer.ts"],"names":["inIframe","e","getShortUUID","array","byte","debounce","func","wait","immediate","timeout","args","later","callNow","throttle","limit","inThrottle","formattedDate","date","pad","num","size","s","year","month","day","hour","minute","second","millisecond","deepClone","obj","item","clonedObj","key","delay","ms","resolve","retry","fn","maxAttempts","delayMs","__async","lastError","attempt","error","LogLevel","LogLevelName","Logger","_Logger","level","prefix","message","payload","requestedLevel","color","formattedMessage","value","SecurityUtils","currentOrigin","currentHostname","currentProtocol","currentPort","targetWindow","targetOrigin","targetHostname","targetProtocol","targetPort","currentWindow","allowedOrigins","current","target","adaptiveOrigins","currentDomain","targetDomain","hostname","parts","origin","strictMode","allowed","domain","baseAllowed","requiredFields","field","messageAge","maxAge","missingFields","typeErrors","now","_a","signature","messageWithoutSignature","__objRest","messageStr","hash","i","char","keyHash","expectedSignature","adaptiveAllowedOrigins","MessageBridge","opts","status","ev","_b","_c","_d","securityConfig","validateOrigin","validationResult","toIds","eventName","eventData","method","data","requestUid","responseData","err","action","uid","reject","disposers","dispose","d","onSuccess","params","onFail","onSuccessHandler","event","onFailHandler","tryTime","requestAnimationFrameId","disposer","onHandshakeSuccess","id","onHandshakeFail","onHandshakeSuccessHandler","onHandshakeFailHandler","handshakeMessage","exponentialDelay","jitter","finalDelay","reconnectConfig","baseReconnectDelay","maxReconnectDelay","jitterRange","finalReconnectDelay","callback","handler","StandardEventTarget","type","listener","options","detail","__spreadValues","signal","StandardActionManager","logger","name","actions","removed","_0","_1","timeoutController","timeoutId","combinedSignal","result","controller","parentSignal","__spreadProps","count","signals","validSignals","Base","_connectionStatus","parentElement","iframe","shakehandRetryTimes","_actionManager","isInIframe","_actionMap","actionName","wrappedCallback","ActionAvailabilityManager","available","Client","_Client","__superGet","unsubscribe","availableActions","stats","DynamicActionRegistry","Remote","names","removedCount","EventCategory","EventNamespace","EventType","EventTypeGroups","EventTypeUtils","eventType","category","namespace","LegacyEventType","getV1CompatibilityConfig","getMixedEnvironmentConfig","isDevelopment","isV1Environment","__REALSEE_VR_SIGNALS_V1__","getAutoCompatibilityConfig","getV2DefaultConfig","signatureKey","isV1Message","hasBasicFields","hasV2Fields","isV2Message","adaptV1ToV2Message","adaptV2ToV1Message","version","checkCompatibility","remoteVersion","clientVersion","remoteMajor","clientMajor","logCompatibilityInfo","warning"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 判断是否在iframe中\n * @returns\n */\nexport const inIframe = () => {\n  try {\n    return window.self !== window.top\n  } catch (e) {\n    return true\n  }\n}\n\n/**\n * 生成简单的UUID字符串\n * @returns 8位随机字符串\n */\nexport const getShortUUID = () => {\n  // 使用浏览器兼容的crypto API\n  if (typeof window !== 'undefined' && window.crypto && window.crypto.getRandomValues) {\n    const array = new Uint8Array(8)\n    window.crypto.getRandomValues(array)\n    return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('').substring(0, 8)\n  }\n  \n  // 降级方案：使用Math.random()生成8位随机字符串\n  return Math.random().toString(36).substring(2, 10)\n}\n\n/**\n * 生成完整的UUID v4\n * @returns 标准UUID字符串\n */\nexport const generateUUID = (): string => {\n  if (typeof window !== 'undefined' && window.crypto && window.crypto.randomUUID) {\n    return window.crypto.randomUUID()\n  }\n  \n  // 降级方案：手动生成UUID v4\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n    const r = Math.random() * 16 | 0\n    const v = c === 'x' ? r : (r & 0x3 | 0x8)\n    return v.toString(16)\n  })\n}\n\n/**\n * 防抖函数\n * @param func 要防抖的函数\n * @param wait 等待时间（毫秒）\n * @param immediate 是否立即执行\n * @returns 防抖后的函数\n */\nexport const debounce = <T extends (...args: any[]) => any>(\n  func: T,\n  wait: number,\n  immediate: boolean = false\n): ((...args: Parameters<T>) => void) => {\n  let timeout: NodeJS.Timeout | null = null\n  \n  return function executedFunction(...args: Parameters<T>) {\n    const later = () => {\n      timeout = null\n      if (!immediate) func(...args)\n    }\n    \n    const callNow = immediate && !timeout\n    \n    if (timeout) clearTimeout(timeout)\n    timeout = setTimeout(later, wait)\n    \n    if (callNow) func(...args)\n  }\n}\n\n/**\n * 节流函数\n * @param func 要节流的函数\n * @param limit 限制时间（毫秒）\n * @returns 节流后的函数\n */\nexport const throttle = <T extends (...args: any[]) => any>(\n  func: T,\n  limit: number\n): ((...args: Parameters<T>) => void) => {\n  let inThrottle: boolean\n  \n  return function executedFunction(...args: Parameters<T>) {\n    if (!inThrottle) {\n      func(...args)\n      inThrottle = true\n      setTimeout(() => inThrottle = false, limit)\n    }\n  }\n}\n\n/**\n * 格式化日期为 YYYY-MM-DD HH:mm:ss.SSS\n * @param date Date 对象\n * @returns\n */\nexport const formattedDate = (date: Date) => {\n  const pad = (num: number, size: number): string => {\n    let s = num.toString()\n    while (s.length < size) s = '0' + s\n    return s\n  }\n\n  const year = date.getFullYear()\n  const month = pad(date.getMonth() + 1, 2) // 月份是从 0 开始的\n  const day = pad(date.getDate(), 2)\n  const hour = pad(date.getHours(), 2)\n  const minute = pad(date.getMinutes(), 2)\n  const second = pad(date.getSeconds(), 2)\n  const millisecond = pad(date.getMilliseconds(), 3)\n\n  return `${year}-${month}-${day} ${hour}:${minute}:${second}.${millisecond}`\n}\n\n/**\n * 深度克隆对象\n * @param obj 要克隆的对象\n * @returns 克隆后的对象\n */\nexport const deepClone = <T>(obj: T): T => {\n  if (obj === null || typeof obj !== 'object') {\n    return obj\n  }\n  \n  if (obj instanceof Date) {\n    return new Date(obj.getTime()) as unknown as T\n  }\n  \n  if (obj instanceof Array) {\n    return obj.map(item => deepClone(item)) as unknown as T\n  }\n  \n  if (typeof obj === 'object') {\n    const clonedObj = {} as T\n    for (const key in obj) {\n      if (obj.hasOwnProperty(key)) {\n        clonedObj[key] = deepClone(obj[key])\n      }\n    }\n    return clonedObj\n  }\n  \n  return obj\n}\n\n/**\n * 检查对象是否为空\n * @param obj 要检查的对象\n * @returns\n */\nexport const isEmpty = (obj: any): boolean => {\n  if (obj == null) return true\n  if (Array.isArray(obj) || typeof obj === 'string') return obj.length === 0\n  if (obj instanceof Map || obj instanceof Set) return obj.size === 0\n  if (typeof obj === 'object') return Object.keys(obj).length === 0\n  return false\n}\n\n/**\n * 安全的JSON解析\n * @param json 要解析的JSON字符串\n * @param defaultValue 解析失败时的默认值\n * @returns\n */\nexport const safeJsonParse = <T>(json: string, defaultValue: T): T => {\n  try {\n    return JSON.parse(json)\n  } catch (error) {\n    return defaultValue\n  }\n}\n\n/**\n * 延迟执行\n * @param ms 延迟时间（毫秒）\n * @returns Promise\n */\nexport const delay = (ms: number): Promise<void> => {\n  return new Promise(resolve => setTimeout(resolve, ms))\n}\n\n/**\n * 重试函数\n * @param fn 要重试的函数\n * @param maxAttempts 最大重试次数\n * @param delayMs 重试间隔（毫秒）\n * @returns Promise\n */\nexport const retry = async <T>(\n  fn: () => Promise<T>,\n  maxAttempts: number = 3,\n  delayMs: number = 1000\n): Promise<T> => {\n  let lastError: Error\n  \n  for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n    try {\n      return await fn()\n    } catch (error) {\n      lastError = error as Error\n      \n      if (attempt === maxAttempts) {\n        throw lastError\n      }\n      \n      await delay(delayMs)\n    }\n  }\n  \n  throw lastError!\n}\n","import { formattedDate } from './utils'\n\n/**\n * 日志级别枚举。\n */\nexport const LogLevel = {\n  // 无。\n  NONE: 0,\n  // 错误。\n  ERROR: 1,\n  // 警告。\n  WARN: 2,\n  // 信息。\n  INFO: 3,\n  // 调试。\n  DEBUG: 4,\n}\n\nexport type LogLevelkey = keyof typeof LogLevel\n\nexport type LogLevelValue = (typeof LogLevel)[LogLevelkey]\n\nconst LogLevelName = {\n  [LogLevel.DEBUG]: 'DEBUG',\n  [LogLevel.INFO]: 'INFO',\n  [LogLevel.WARN]: 'WARN',\n  [LogLevel.ERROR]: 'ERROR',\n  [LogLevel.NONE]: 'NONE',\n}\n\n/**\n * 日志类。\n */\nexport class Logger {\n  /** 日志级别。 */\n  level: LogLevelValue\n\n  /** 日志前缀。 */\n  prefix: string\n\n  /**\n   * 创建一个日志实例。\n   * @param {string} [level=debug] - 日志级别。\n   * @param {string} [prefix=''] - 日志前缀。\n   */\n  constructor(level: LogLevelkey, prefix: string = '') {\n    this.level = LogLevel[level]\n    this.prefix = prefix\n  }\n\n  /**\n   * 输出调试日志。\n   * @param {string} message - 日志消息。\n   * @param {any} [payload] - 日志负载。\n   * @returns {void}\n   */\n  debug(message: string, payload?: any): void {\n    this.logIfEnabled(LogLevel.DEBUG, '#2ecc71', message, payload)\n  }\n\n  /**\n   * 输出信息日志。\n   * @param {string} message - 日志消息。\n   * @param {any} [payload] - 日志负载。\n   * @returns {void}\n   */\n  info(message: string, payload?: any): void {\n    this.logIfEnabled(LogLevel.INFO, '#3498db', message, payload)\n  }\n\n  /**\n   * 输出警告日志。\n   * @param {string} message - 日志消息。\n   * @param {any} [payload] - 日志负载。\n   * @returns {void}\n   */\n  warn(message: string, payload?: any): void {\n    this.logIfEnabled(LogLevel.WARN, '#f39c12', message, payload)\n  }\n\n  /**\n   * 输出错误日志。\n   * @param {string} message - 日志消息。\n   * @param {any} [payload] - 日志负载。\n   * @returns {void}\n   */\n  error(message: string, payload?: any): void {\n    this.logIfEnabled(LogLevel.ERROR, '#e74c3c', message, payload)\n  }\n\n  /**\n   * 格式化日志消息。如果存在负载，将其转换为 JSON 字符串并附加到消息后面。\n   * @param {string} message - 日志消息。\n   * @param {any} [payload] - 日志负载。\n   * @returns {string} 格式化后的消息。\n   */\n  formatMessage(message: string, payload?: any): string {\n    if (payload) {\n      return `${message}\\n${JSON.stringify(payload, Logger.replacer, 2)}`\n    }\n    return message\n  }\n\n  /**\n   * 日志级别是否是指定的级别或更高级别。\n   * @param requestedLevel\n   * @param color\n   * @param message\n   * @param payload\n   */\n  private logIfEnabled(requestedLevel: LogLevelValue, color: string, message: string, payload?: any): void {\n    if (requestedLevel <= this.level) {\n      this.log(requestedLevel, color, message, payload)\n    }\n  }\n\n  /**\n   * 输出日志。\n   * @param level\n   * @param color\n   * @param message\n   * @param payload\n   */\n  private log(level: LogLevelValue, color: string, message: string, payload: any): void {\n    const formattedMessage = this.formatMessage(message, payload)\n    console.log(\n      `%c${this.prefix} [${formattedDate(new Date())}] <${LogLevelName[level]}> ${formattedMessage}`,\n      `color: ${color}; font-weight: bold;`,\n    )\n  }\n\n  /**\n   * 在 JSON.stringify 中处理特殊的值。如果值是数组，将数组转换为 JSON 字符串。如果值是错误对象，返回错误的名称和消息。\n   * @param {string} key - 属性名。\n   * @param {any} value - 属性值。\n   * @returns {any} 处理后的值。\n   */\n  static replacer(key: string, value: any): any {\n    if (Array.isArray(value)) {\n      return value.map((item) => Logger.replacer(key, item))\n    }\n    if (value instanceof Error) {\n      return `${value.name}: ${value.message}`\n    }\n    return value\n  }\n}\n","/**\n * 安全工具类\n */\nexport class SecurityUtils {\n  /**\n   * 获取当前页面的域名信息\n   * @returns 当前域名信息\n   */\n  static getCurrentDomainInfo() {\n    const currentOrigin = window.location.origin\n    const currentHostname = window.location.hostname\n    const currentProtocol = window.location.protocol\n    const currentPort = window.location.port\n    \n    return {\n      origin: currentOrigin,\n      hostname: currentHostname,\n      protocol: currentProtocol,\n      port: currentPort,\n      isLocalhost: currentHostname === 'localhost' || currentHostname === '127.0.0.1',\n      isSecure: currentProtocol === 'https:',\n      accessible: true // 当前窗口总是可访问的\n    }\n  }\n\n  /**\n   * 获取目标窗口的域名信息\n   * @param targetWindow 目标窗口\n   * @returns 目标域名信息\n   */\n  static getTargetDomainInfo(targetWindow: Window) {\n    try {\n      const targetOrigin = targetWindow.location.origin\n      const targetHostname = targetWindow.location.hostname\n      const targetProtocol = targetWindow.location.protocol\n      const targetPort = targetWindow.location.port\n      \n      return {\n        origin: targetOrigin,\n        hostname: targetHostname,\n        protocol: targetProtocol,\n        port: targetPort,\n        isLocalhost: targetHostname === 'localhost' || targetHostname === '127.0.0.1',\n        isSecure: targetProtocol === 'https:',\n        accessible: true\n      }\n    } catch (error) {\n      // 跨域限制，无法获取目标窗口信息\n      return {\n        origin: 'unknown',\n        hostname: 'unknown',\n        protocol: 'unknown',\n        port: 'unknown',\n        isLocalhost: false,\n        isSecure: false,\n        accessible: false\n      }\n    }\n  }\n\n  /**\n   * 生成自适应的允许域名列表\n   * @param currentWindow 当前窗口\n   * @param targetWindow 目标窗口\n   * @param allowedOrigins 配置的允许域名列表\n   * @returns 自适应的允许域名列表\n   */\n  static generateAdaptiveAllowedOrigins(\n    currentWindow: Window,\n    targetWindow: Window,\n    allowedOrigins: string[] = []\n  ): string[] {\n    const current = this.getCurrentDomainInfo()\n    const target = this.getTargetDomainInfo(targetWindow)\n    \n    const adaptiveOrigins: string[] = []\n    \n    // 1. 总是允许同源\n    adaptiveOrigins.push(current.origin)\n    \n    // 2. 如果目标窗口可访问，允许目标域名\n    if (target.accessible) {\n      adaptiveOrigins.push(target.origin)\n    }\n    \n    // 3. 添加配置的允许域名列表\n    if (allowedOrigins.length > 0) {\n      adaptiveOrigins.push(...allowedOrigins)\n    }\n    \n    // 4. 开发环境特殊处理\n    if (current.isLocalhost || target.isLocalhost) {\n      // 本地开发环境：允许 localhost 的不同端口\n      adaptiveOrigins.push('http://localhost:*')\n      adaptiveOrigins.push('https://localhost:*')\n      \n      // 允许 127.0.0.1 的不同端口\n      adaptiveOrigins.push('http://127.0.0.1:*')\n      adaptiveOrigins.push('https://127.0.0.1:*')\n      \n      // 允许 localhost 和 127.0.0.1 之间的通信（开发环境常见）\n      if (current.isLocalhost && target.isLocalhost) {\n        adaptiveOrigins.push('http://localhost:*')\n        adaptiveOrigins.push('https://localhost:*')\n        adaptiveOrigins.push('http://127.0.0.1:*')\n        adaptiveOrigins.push('https://127.0.0.1:*')\n      }\n    }\n    \n    // 5. iframe 环境特殊处理（当无法获取目标窗口信息时）\n    if (!target.accessible && current.isLocalhost) {\n      // 在 localhost 的 iframe 中，允许与父窗口通信\n      adaptiveOrigins.push('http://localhost:*')\n      adaptiveOrigins.push('https://localhost:*')\n      adaptiveOrigins.push('http://127.0.0.1:*')\n      adaptiveOrigins.push('https://127.0.0.1:*')\n    }\n    \n    // 5. 同域名不同协议的情况（开发环境常见）\n    if (current.hostname === target.hostname && current.accessible && target.accessible) {\n      adaptiveOrigins.push(`http://${current.hostname}:*`)\n      adaptiveOrigins.push(`https://${current.hostname}:*`)\n    }\n    \n    // 6. 生产环境跨域支持\n    if (!current.isLocalhost && !target.isLocalhost) {\n      // 同域名不同子域名的情况\n      const currentDomain = this.extractDomain(current.hostname)\n      const targetDomain = this.extractDomain(target.hostname)\n      \n      if (currentDomain === targetDomain) {\n        // 允许同域名下的所有子域名\n        adaptiveOrigins.push(`https://*.${currentDomain}`)\n        adaptiveOrigins.push(`http://*.${currentDomain}`)\n      }\n    }\n    \n    // 7. 去重\n    return [...new Set(adaptiveOrigins)]\n  }\n\n  /**\n   * 提取域名（去掉子域名）\n   * @param hostname 主机名\n   * @returns 域名\n   */\n  private static extractDomain(hostname: string): string {\n    const parts = hostname.split('.')\n    if (parts.length >= 2) {\n      // 返回最后两部分（如 example.com）\n      return parts.slice(-2).join('.')\n    }\n    return hostname\n  }\n\n  /**\n   * 验证消息来源是否安全（自适应策略）\n   * @param origin 消息来源\n   * @param currentWindow 当前窗口\n   * @param targetWindow 目标窗口\n   * @param strictMode 是否启用严格模式\n   * @returns 是否安全\n   */\n  static validateOriginAdaptive(\n    origin: string,\n    currentWindow: Window,\n    targetWindow: Window,\n    strictMode: boolean = false  // 默认改为 false，不启用严格模式\n  ): boolean {\n    // 非严格模式：允许所有来源（兼容 1.x 版本）\n    if (!strictMode) {\n      return true\n    }\n    \n    // 生成自适应的允许域名列表\n    const allowedOrigins = this.generateAdaptiveAllowedOrigins(\n      currentWindow,\n      targetWindow\n    )\n    \n    return this.validateOrigin(origin, allowedOrigins, strictMode)\n  }\n\n  /**\n   * 验证消息来源是否安全\n   * @param origin 消息来源\n   * @param allowedOrigins 允许的域名列表\n   * @param strictMode 是否启用严格模式\n   * @returns 是否安全\n   */\n  static validateOrigin(origin: string, allowedOrigins: string[] = [], strictMode: boolean = false): boolean {\n    // 严格模式：只允许同源或明确允许的域名\n    if (strictMode) {\n      // 检查是否同源\n      if (origin === window.location.origin) {\n        return true\n      }\n      \n      // 检查是否在允许列表中\n      return allowedOrigins.some(allowed => {\n        // 支持通配符域名\n        if (allowed.startsWith('*.')) {\n          const domain = allowed.slice(2)\n          return origin.endsWith(domain) || origin === domain\n        }\n        \n        // 支持端口通配符\n        if (allowed.includes(':*')) {\n          const baseAllowed = allowed.replace(':*', '')\n          const baseOrigin = origin.replace(/:\\d+$/, '')\n          return baseOrigin === baseAllowed\n        }\n        \n        return origin === allowed\n      })\n    }\n    \n    // 非严格模式：允许所有来源（不推荐）\n    return true\n  }\n\n  /**\n   * 验证消息结构是否合法\n   * @param message 消息对象\n   * @returns 是否合法\n   */\n  static validateMessageStructure(message: any): boolean {\n    // 基本结构验证\n    if (!message || typeof message !== 'object') {\n      return false\n    }\n    \n    // 必需字段验证\n    const requiredFields = ['type', 'uid', 'payload', 'fromId', 'toId', 'timestamp']\n    for (const field of requiredFields) {\n      if (!(field in message)) {\n        return false\n      }\n    }\n    \n    // 类型验证\n    if (typeof message.type !== 'string') {\n      return false\n    }\n    \n    if (typeof message.uid !== 'string') {\n      return false\n    }\n    \n    if (typeof message.fromId !== 'string') {\n      return false\n    }\n    \n    if (typeof message.timestamp !== 'number') {\n      return false\n    }\n    \n    // 时间戳验证（防止重放攻击）\n    const now = Date.now()\n    const messageAge = now - message.timestamp\n    const maxAge = 5 * 60 * 1000 // 5分钟\n    \n    if (messageAge > maxAge || messageAge < -60000) { // 允许1分钟的时间偏差\n      return false\n    }\n    \n    return true\n  }\n\n  /**\n   * 检测消息是否来自 devtools\n   * @param message 消息对象\n   * @returns 是否来自 devtools\n   */\n  static isDevToolsMessage(message: any): boolean {\n    if (!message || typeof message !== 'object') {\n      return false\n    }\n    \n    // 检测 React DevTools 消息\n    if (message.source === 'react-devtools-content-script' || \n        message.source === 'react-devtools-bridge' ||\n        message.source === 'react-devtools-backend-manager') {\n      return true\n    }\n    \n    // 检测其他常见的 devtools 消息特征\n    if (message.payload && typeof message.payload === 'object') {\n      const payload = message.payload\n      if (payload.event === 'operations' || \n          payload.event === 'backendInitialized' ||\n          payload.event === 'getBackendVersion' ||\n          payload.event === 'getIfHasUnsupportedRendererVersion' ||\n          payload.event === 'getHookSettings' ||\n          payload.event === 'backendVersion' ||\n          payload.event === 'hookSettings' ||\n          payload.event === 'setTraceUpdatesEnabled' ||\n          payload.event === 'extensionBackendInitialized') {\n        return true\n      }\n    }\n    \n    return false\n  }\n\n  /**\n   * 验证消息结构是否合法，并返回详细的验证结果\n   * @param message 消息对象\n   * @returns 验证结果对象\n   */\n  static validateMessageStructureDetailed(message: any): { valid: boolean; reason?: string; details?: any } {\n    // 首先检测是否是 devtools 消息，如果是则直接忽略\n    if (this.isDevToolsMessage(message)) {\n      return { \n        valid: false, \n        reason: 'DevTools message - silently ignored',\n        details: { \n          source: 'devtools',\n          message: message\n        }\n      }\n    }\n    \n    // 基本结构验证\n    if (!message || typeof message !== 'object') {\n      return { \n        valid: false, \n        reason: 'Message is not an object',\n        details: { received: message, type: typeof message }\n      }\n    }\n    \n    // 必需字段验证\n    const requiredFields = ['type', 'uid', 'payload', 'fromId', 'toId', 'timestamp']\n    const missingFields = requiredFields.filter(field => !(field in message))\n    \n    if (missingFields.length > 0) {\n      return { \n        valid: false, \n        reason: `Missing required fields: ${missingFields.join(', ')}`,\n        details: { \n          missing: missingFields,\n          present: Object.keys(message),\n          message: message\n        }\n      }\n    }\n    \n    // 类型验证\n    const typeErrors = []\n    if (typeof message.type !== 'string') {\n      typeErrors.push(`type should be string, got ${typeof message.type}`)\n    }\n    if (typeof message.uid !== 'string') {\n      typeErrors.push(`uid should be string, got ${typeof message.uid}`)\n    }\n    if (typeof message.fromId !== 'string') {\n      typeErrors.push(`fromId should be string, got ${typeof message.fromId}`)\n    }\n    if (typeof message.timestamp !== 'number') {\n      typeErrors.push(`timestamp should be number, got ${typeof message.timestamp}`)\n    }\n    \n    if (typeErrors.length > 0) {\n      return { \n        valid: false, \n        reason: `Type validation failed: ${typeErrors.join(', ')}`,\n        details: { \n          errors: typeErrors,\n          message: message\n        }\n      }\n    }\n    \n    // 时间戳验证（防止重放攻击）\n    const now = Date.now()\n    const messageAge = now - message.timestamp\n    const maxAge = 5 * 60 * 1000 // 5分钟\n    \n    if (messageAge > maxAge || messageAge < -60000) { // 允许1分钟的时间偏差\n      return { \n        valid: false, \n        reason: `Timestamp validation failed: message age ${messageAge}ms is outside allowed range`,\n        details: { \n          messageAge,\n          maxAge,\n          messageTimestamp: message.timestamp,\n          currentTime: now\n        }\n      }\n    }\n    \n    return { valid: true }\n  }\n\n  /**\n   * 生成消息签名\n   * @param message 消息对象\n   * @param key 签名密钥\n   * @returns 签名\n   */\n  static generateSignature(message: any, key: string): string {\n    const { signature, ...messageWithoutSignature } = message\n    const messageStr = JSON.stringify(messageWithoutSignature)\n    \n    // 简单的哈希签名（生产环境建议使用更安全的算法）\n    let hash = 0\n    for (let i = 0; i < messageStr.length; i++) {\n      const char = messageStr.charCodeAt(i)\n      hash = ((hash << 5) - hash) + char\n      hash = hash & hash // 转换为32位整数\n    }\n    \n    // 使用密钥增强签名\n    let keyHash = 0\n    for (let i = 0; i < key.length; i++) {\n      const char = key.charCodeAt(i)\n      keyHash = ((keyHash << 5) - keyHash) + char\n      keyHash = keyHash & keyHash\n    }\n    \n    return (hash ^ keyHash).toString(36)\n  }\n\n  /**\n   * 验证消息签名\n   * @param message 消息对象\n   * @param key 签名密钥\n   * @returns 是否有效\n   */\n  static validateSignature(message: any, key: string): boolean {\n    if (!message.signature) {\n      return false\n    }\n    \n    const expectedSignature = this.generateSignature(message, key)\n    return message.signature === expectedSignature\n  }\n\n  /**\n   * 清理消息对象，移除敏感信息\n   * @param message 消息对象\n   * @returns 清理后的消息\n   */\n  static sanitizeMessage(message: any): any {\n    const { signature, ...cleanMessage } = message\n    return cleanMessage\n  }\n\n  /**\n   * 获取安全的 targetOrigin（自适应策略）\n   * @param targetWindow 目标窗口\n   * @param strictMode 是否启用严格模式\n   * @param allowedOrigins 配置的允许域名列表\n   * @returns 安全的 targetOrigin\n   */\n  static getSecureTargetOriginAdaptive(\n    targetWindow: Window,\n    strictMode: boolean = false,  // 默认改为 false\n    allowedOrigins: string[] = []\n  ): string {\n    try {\n      // 尝试获取目标窗口的 origin\n      const targetOrigin = targetWindow.location.origin\n      \n      // 生成自适应的允许域名列表\n      const adaptiveAllowedOrigins = this.generateAdaptiveAllowedOrigins(\n        window,\n        targetWindow,\n        allowedOrigins\n      )\n      \n      if (this.validateOrigin(targetOrigin, adaptiveAllowedOrigins, strictMode)) {\n        return targetOrigin\n      }\n      \n      // 如果不安全，返回空字符串（最严格）\n      if (strictMode) {\n        return ''\n      }\n      \n      // 非严格模式返回通配符（不推荐）\n      return '*'\n    } catch (error) {\n      // 无法获取目标 origin（跨域限制）\n      // 在开发环境中，尝试使用通配符\n      const current = this.getCurrentDomainInfo()\n      if (current.isLocalhost) {\n        // 开发环境：允许所有本地地址\n        return '*'\n      }\n      \n      if (strictMode) {\n        return ''\n      }\n      return '*'\n    }\n  }\n\n  /**\n   * 获取安全的 targetOrigin\n   * @param targetWindow 目标窗口\n   * @param allowedOrigins 允许的域名列表\n   * @param strictMode 是否启用严格模式\n   * @returns 安全的 targetOrigin\n   */\n  static getSecureTargetOrigin(targetWindow: Window, allowedOrigins: string[] = [], strictMode: boolean = false): string {\n    try {\n      // 尝试获取目标窗口的 origin\n      const targetOrigin = targetWindow.location.origin\n      \n      if (this.validateOrigin(targetOrigin, allowedOrigins, strictMode)) {\n        return targetOrigin\n      }\n      \n      // 如果不安全，返回空字符串（最严格）\n      if (strictMode) {\n        return ''\n      }\n      \n      // 非严格模式返回通配符（不推荐）\n      return '*'\n    } catch (error) {\n      // 无法获取目标 origin（跨域限制）\n      if (strictMode) {\n        return ''\n      }\n      return '*'\n    }\n  }\n}\n","import { BaseMap, Message, MessageMap, ConnectionStatus } from './types'\nimport { Logger } from './Logger'\nimport { getShortUUID } from './utils'\nimport type { Base } from './Base'\nimport { SecurityUtils } from './SecurityUtils'\nimport { DefaultActionMap, DefaultEventMap } from './default-types'\n\n/**\n * 内置的事件映射表\n */\nexport interface MessageBridgeInnerEventMap extends BaseMap {\n  /**\n   * 请求 action 成功\n   * @param params\n   */\n  'action.request.success'<ActionMethod, ResponseData>(params: {\n    method: ActionMethod\n    uid: string\n    data: ResponseData\n  }): void\n  /**\n   * 请求 action 失败\n   * @param params\n   */\n  'action.request.error'<ActionMethod>(params: { method: ActionMethod; uid: string; error: Error }): void\n  /**\n   * 握手成功\n   * @param id\n   */\n  'handshake.success': (id: string) => void\n  /**\n   * 握手失败\n   * @param err\n   */\n  'handshake.fail': (err: Error) => void\n  /**\n   * 已经建立连接，可以开始通信\n   */\n  ready: () => void\n  /**\n   * 连接状态变化\n   * @param status\n   */\n  'connection.status': (status: ConnectionStatus) => void\n  /**\n   * 发生错误\n   * @param err\n   * @returns\n   */\n  error: (err: Error) => void\n}\n\n/**\n * 消息桥接的配置项\n */\nexport type MessageBridgeOptions<\n  ActionMap extends BaseMap = DefaultActionMap, \n  EventMap extends BaseMap = DefaultEventMap\n> = {\n  /** 自己  */\n  selfWindow: Window\n  /** 目标 */\n  targetWindow: Window\n  /** 日志 */\n  logger?: Logger\n  /** 本身的 uuid */\n  uuid?: string\n  /** 握手次数 */\n  shakehandRetryTimes?: number\n  /** action 映射表 */\n  actionMap?: ActionMap\n  /** client or remote 的引用 */\n  instance: Base<ActionMap, EventMap>\n  /** 是否启用自动重连 */\n  enableAutoReconnect?: boolean\n  /** 重连间隔时间（毫秒） */\n  reconnectInterval?: number\n  /** 最大重连次数 */\n  maxReconnectAttempts?: number\n}\n\n/**\n * 封装了跨域消息通信的类\n * 默认使用已实现的 DefaultActionMap 和 DefaultEventMap 类型\n */\nexport class MessageBridge<\n  ActionMap extends BaseMap = DefaultActionMap, \n  EventMap extends BaseMap = DefaultEventMap\n> {\n  /** 消息发送者 id */\n  protected uuid\n\n  /** 当前窗口对象的引用 */\n  protected selfWindow: Window\n\n  /** 目标窗口对象的引用 */\n  protected targetWindow: Window\n\n  /** 消息接收者 id 集合 */\n  protected toIds: string[] = []\n\n  /** 记录已握过手的 */\n  protected handshakedIds: string[] = []\n\n  /** 日志 */\n  protected logger: Logger\n\n  /** 是否已经 ready */\n  protected ready = false\n\n  /** 连接状态 */\n  protected connectionStatus: ConnectionStatus = ConnectionStatus.DISCONNECTED\n\n  /** 对父实例的引用 */\n  private instance: Base<ActionMap, EventMap>\n\n  /** 处理内置事件的订阅者 */\n  protected eventTarget: EventTarget\n\n  /** 握手重试次数 */\n  private shakehandRetryTimes: number\n\n  /** 是否启用自动重连 */\n  private enableAutoReconnect: boolean\n\n  /** 重连间隔时间 */\n  private reconnectInterval: number\n\n  /** 最大重连次数 */\n  private maxReconnectAttempts: number\n\n  /** 当前重连次数 */\n  private currentReconnectAttempts = 0\n\n  /** 重连定时器 */\n  private reconnectTimer: NodeJS.Timeout | null = null\n\n  /** 握手定时器 */\n  private handshakeTimer: NodeJS.Timeout | null = null\n\n  /** 消息队列（连接断开时缓存消息） */\n  private messageQueue: Message<keyof MessageMap>[] = []\n\n  /** 是否正在握手 */\n  private isHandshaking = false\n\n  /**\n   * 构造函数\n   * @param selfWindow 当前窗口对象的引用\n   * @param targetWindow 目标窗口对象的引用\n   */\n  constructor(opts: MessageBridgeOptions<ActionMap, EventMap>) {\n    this.uuid = opts.uuid || getShortUUID()\n    this.logger = opts.logger || new Logger('INFO', `Realsee MessageBridge`)\n    this.eventTarget = new EventTarget()\n    this.selfWindow = opts.selfWindow\n    this.targetWindow = opts.targetWindow\n    this.instance = opts.instance\n    this.shakehandRetryTimes = opts.shakehandRetryTimes || 10\n    this.enableAutoReconnect = opts.enableAutoReconnect ?? true\n    this.reconnectInterval = opts.reconnectInterval || 5000\n    this.maxReconnectAttempts = opts.maxReconnectAttempts || 5\n\n    this.logger.info(`MessageBridge constructor called with UUID: ${this.uuid}`)\n    this.logger.info(`Handshake retry times: ${this.shakehandRetryTimes}`)\n    this.logger.info(`Auto reconnect enabled: ${this.enableAutoReconnect}`)\n    this.logger.info(`Max reconnect attempts: ${this.maxReconnectAttempts}`)\n\n    this.selfWindow.addEventListener('message', this.onMessage)\n    this.logger.info('Message listener added, starting handshake')\n    this.startHandshake()\n  }\n\n  /**\n   * 更新连接状态\n   * @param status\n   */\n  private updateConnectionStatus = (status: ConnectionStatus) => {\n    if (this.connectionStatus !== status) {\n      this.connectionStatus = status\n      this.eventTarget.dispatchEvent(new CustomEvent('connection.status', { detail: status }))\n      this.logger.info(`Connection status changed to: ${status}`)\n    }\n  }\n\n  /**\n   * 开始握手\n   */\n  private startHandshake = () => {\n    this.logger.info(`startHandshake called, isHandshaking: ${this.isHandshaking}`)\n    if (this.isHandshaking) {\n      this.logger.warn('Already handshaking, skipping')\n      return\n    }\n    \n    this.logger.info('Starting handshake process')\n    this.isHandshaking = true\n    this.updateConnectionStatus(ConnectionStatus.CONNECTING)\n    this.handshake(this.shakehandRetryTimes)\n  }\n\n  /**\n   * 处理消息\n   * @param ev  消息事件\n   * @returns\n   */\n  private onMessage = (ev: MessageEvent<Message<keyof MessageMap>>) => {\n    // 0. 安全验证：验证消息来源（自适应策略）\n    const securityConfig = this.instance.getOptions()?.security || {}\n    const validateOrigin = securityConfig.validateOrigin ?? false  // 默认禁用来源验证\n    const strictMode = securityConfig.strictMode ?? false           // 默认禁用严格模式\n    \n    if (validateOrigin) {\n      if (!SecurityUtils.validateOriginAdaptive(\n        ev.origin,\n        window,\n        this.targetWindow,\n        strictMode\n      )) {\n        this.logger.warn(`Rejected message from untrusted origin: ${ev.origin}`)\n        return false\n      }\n    }\n    \n    // 1. 检测消息是否是有效的结构\n    const validationResult = SecurityUtils.validateMessageStructureDetailed(ev.data)\n    if (!validationResult.valid) {\n      // 对于 devtools 消息，不输出警告日志，静默忽略\n      if (validationResult.reason === 'DevTools message - silently ignored') {\n        return false\n      }\n      \n      // 在严格模式下才拒绝无效消息\n      // 宽松模式下（兼容 1.x），只记录警告但继续处理\n      if (strictMode) {\n        this.logger.warn('Rejected message with invalid structure', {\n          reason: validationResult.reason,\n          details: validationResult.details,\n          origin: ev.origin,\n          source: ev.source?.toString()\n        })\n        return false\n      } else {\n        // 兼容模式：记录调试信息但继续处理\n        this.logger.debug('Message validation warning (compatibility mode):', {\n          reason: validationResult.reason,\n          details: validationResult.details\n        })\n        // 继续处理，不返回 false\n      }\n    }\n\n    this.logger.debug('receive message: ', ev.data)\n\n    if (\n      ev.data.type !== 'event' &&\n      ev.data.type !== 'action.request' &&\n      ev.data.type !== 'action.response' &&\n      ev.data.type !== 'handshake'\n    ) {\n      this.logger.debug(`message type is not valid, ignore`, { type: ev.data.type })\n      return false\n    }\n\n    // 2. 检测消息是否是发送给当前实例的，如果不是，则忽略，如果是，则继续处理，如果是发送给所有实例的，则继续处理\n    const toIds = Array.isArray(ev.data.toId) ? ev.data.toId : [ev.data.toId]\n    if (toIds.indexOf(this.uuid) === -1 && toIds.indexOf('*') === -1) {\n      this.logger.debug(`message is not for me, ignore`, { toIds })\n      return false\n    }\n\n    // 3. 验证消息签名（如果启用）\n    if (securityConfig.validateSignature && securityConfig.signatureKey) {\n      if (!SecurityUtils.validateSignature(ev.data, securityConfig.signatureKey)) {\n        this.logger.warn('Rejected message with invalid signature')\n        return false\n      }\n    }\n\n    // 4. 解析消息类型\n    switch (ev.data.type) {\n      case 'event':\n        return this.onEventMessage(ev.data as Message<'event'>)\n      case 'action.request':\n        return this.onActionRequestMessage(ev.data as Message<'action.request'>)\n      case 'action.response':\n        return this.onActionResponseMessage(ev.data as Message<'action.response'>)\n      case 'handshake':\n        return this.onHandshakeMessage(ev.data as Message<'handshake'>)\n    }\n  }\n\n  /**\n   * 处理握手消息\n   * @param ev\n   */\n  private onHandshakeMessage = (ev: Message<'handshake'>) => {\n    this.logger.info(`receive handshake message from: ${ev.fromId}`, ev)\n    this.logger.info(`Current toIds: ${JSON.stringify(this.toIds)}, handshakedIds: ${JSON.stringify(this.handshakedIds)}`)\n    \n    if (this.toIds.indexOf(ev.fromId) === -1 && this.handshakedIds.indexOf(ev.fromId) === -1) {\n      this.logger.info(`Adding ${ev.fromId} to toIds and handshakedIds`)\n      this.toIds.push(ev.fromId)\n      this.handshakedIds.push(ev.fromId)\n      \n      // 握手成功后，回复握手消息\n      this.logger.info(`Sending handshake response to ${ev.fromId}`)\n      this.sendMessage<'handshake'>({\n        type: 'handshake',\n        uid: getShortUUID(),\n        payload: {},\n        fromId: this.uuid,\n        toId: ev.fromId,\n        timestamp: Date.now(),\n      })\n\n      this.eventTarget.dispatchEvent(new CustomEvent('handshake.success', { detail: ev.fromId }))\n    } else {\n      this.logger.debug(`handshake message from ${ev.fromId} has been received before`)\n    }\n    if (this.toIds.length > 0) {\n      this.logger.info(`Setting ready to true, toIds: ${JSON.stringify(this.toIds)}`)\n      this.ready = true\n      this.isHandshaking = false\n      this.updateConnectionStatus(ConnectionStatus.CONNECTED)\n      \n      this.logger.info('Dispatching ready event')\n      this.eventTarget.dispatchEvent(new Event('ready'))\n      \n      // 发送队列中的消息\n      this.flushMessageQueue()\n    } else {\n      this.logger.warn(`Handshake received but toIds is empty: ${JSON.stringify(this.toIds)}`)\n    }\n  }\n\n  /**\n   * 处理 event 消息\n   * @param ev\n   */\n  private onEventMessage = (ev: Message<'event'>) => {\n    this.logger.info(`receive event message: `, ev)\n    const payload = ev.payload\n    const { eventName, eventData } = payload\n    this.instance.dispatchCustomEvent(String(eventName), eventData)\n  }\n\n  /**\n   * 处理 action 请求消息\n   * @param ev\n   */\n  private onActionRequestMessage = async (ev: Message<'action.request'>) => {\n    this.logger.info(`receive action request message: `, ev)\n    const payload = ev.payload\n    const { method, data } = payload\n    const requestUid = ev.uid\n    try {\n      const responseData = await this.executeRequest(method, data)\n      this.sendMessage<'action.response'>({\n        type: 'action.response',\n        uid: getShortUUID(),\n        payload: {\n          uid: requestUid,\n          method,\n          data: responseData,\n        },\n        fromId: this.uuid,\n        toId: ev.fromId,\n        timestamp: Date.now(),\n      })\n    } catch (error) {\n      const err = error as Error\n      this.sendMessage<'action.response'>({\n        type: 'action.response',\n        uid: getShortUUID(),\n        payload: {\n          method,\n          uid: requestUid,\n          error: {\n            name: err.name,\n            message: err.message,\n            stack: err.stack,\n          },\n        },\n        fromId: this.uuid,\n        toId: ev.fromId,\n        timestamp: Date.now(),\n      })\n    }\n  }\n\n  /**\n   * 执行 action\n   * @param method\n   * @param data\n   * @returns\n   */\n  private executeRequest = async (\n    method: keyof ActionMap,\n    data: Parameters<ActionMap[keyof ActionMap]>[0],\n  ): Promise<ReturnType<ActionMap[keyof ActionMap]>> => {\n    // 使用 Base 类的 handleActionRequest 方法（通过类型断言访问）\n    if (typeof (this.instance as any).handleActionRequest === 'function') {\n      return await (this.instance as any).handleActionRequest(String(method), data)\n    }\n    \n    // 向后兼容：回退到旧的 actionMap 方式\n    const action = this.instance.actionMap?.[method]\n    if (!action) {\n      throw new Error(`action ${String(method)} not found`)\n    }\n    return await action(data)\n  }\n\n  /**\n   * 处理 action 响应消息\n   * @param ev\n   */\n  private onActionResponseMessage = (ev: Message<'action.response'>) => {\n    this.logger.info(`receive action response message: `, ev)\n    const payload = ev.payload\n    const { method, data, error } = payload\n    const uid = payload.uid || ev.uid\n    if (error) {\n      const err = new Error(error.message)\n      err.name = error.name\n      err.stack = error.stack\n      this.eventTarget.dispatchEvent(new CustomEvent('action.request.error', { detail: { method, uid, error: err } }))\n    } else {\n              this.eventTarget.dispatchEvent(new CustomEvent('action.request.success', { detail: { method, uid, data } }))\n    }\n  }\n\n  /**\n   * 进行 action 请求\n   * @param method\n   * @param data\n   * @returns\n   */\n  requestAcion = (\n    method: keyof ActionMap,\n    data: Parameters<ActionMap[keyof ActionMap]>[0],\n  ): Promise<ReturnType<ActionMap[keyof ActionMap]>> => {\n    return new Promise((resolve, reject) => {\n      // 当次请求的唯一 id\n      const uid = getShortUUID()\n\n      const disposers: (() => void)[] = []\n\n      let dispose = () => {\n        disposers.forEach((d) => d())\n      }\n\n      // 请求成功的回调\n      const onSuccess: MessageBridgeInnerEventMap['action.request.success'] = (params): void => {\n        if (params.uid === uid) {\n          resolve(params.data as unknown as ReturnType<ActionMap[keyof ActionMap]>)\n          dispose()\n        }\n      }\n\n      // 请求失败的回调\n      const onFail: MessageBridgeInnerEventMap['action.request.error'] = (params): void => {\n        if (params.uid === uid) {\n          reject(params.error)\n          dispose()\n        }\n      }\n\n      const onSuccessHandler = (event: Event) => {\n        if (event instanceof CustomEvent) {\n          onSuccess(event.detail)\n        }\n      }\n      \n      const onFailHandler = (event: Event) => {\n        if (event instanceof CustomEvent) {\n          onFail(event.detail)\n        }\n      }\n      \n      disposers.push(\n        () => this.eventTarget.removeEventListener('action.request.success', onSuccessHandler),\n        () => this.eventTarget.removeEventListener('action.request.error', onFailHandler)\n      )\n      \n      this.eventTarget.addEventListener('action.request.success', onSuccessHandler)\n      this.eventTarget.addEventListener('action.request.error', onFailHandler)\n\n      this.sendMessage<'action.request'>({\n        type: 'action.request',\n        uid,\n        payload: {\n          method: method as string,\n          uid,\n          data,\n        },\n        fromId: this.uuid,\n        toId: this.toIds,\n        timestamp: Date.now(),\n      })\n    })\n  }\n\n  /**\n   * 握手，尝试 tryTime 次\n   * @param tryTime\n   */\n  private handshake = async (tryTime: number) => {\n    this.logger.info(`Starting handshake with ${tryTime} retry attempts`)\n    this.logger.info(`Using exponential backoff with jitter strategy`)\n\n    let requestAnimationFrameId: number | null = null\n\n    let disposer: (() => void)[] = []\n    const dispose = () => {\n      disposer.forEach((d) => d())\n    }\n\n    const onHandshakeSuccess: MessageBridgeInnerEventMap['handshake.success'] = (id) => {\n      if (requestAnimationFrameId !== null) {\n        cancelAnimationFrame(requestAnimationFrameId)\n      }\n      this.logger.info(`Handshake with ${id} successful!`)\n      this.logger.info(`Current ready status: ${this.ready}`)\n      dispose()\n    }\n\n    const onHandshakeFail: MessageBridgeInnerEventMap['handshake.fail'] = (err) => {\n      if (requestAnimationFrameId !== null) {\n        cancelAnimationFrame(requestAnimationFrameId)\n      }\n      this.logger.error(`Handshake failed:`, err)\n      dispose()\n      this.handleHandshakeFailure()\n    }\n\n          const onHandshakeSuccessHandler = (event: Event) => {\n        if (event instanceof CustomEvent) {\n          onHandshakeSuccess(event.detail)\n        }\n      }\n      \n      const onHandshakeFailHandler = (event: Event) => {\n        if (event instanceof CustomEvent) {\n          onHandshakeFail(event.detail)\n        }\n      }\n      \n      disposer.push(\n        () => this.eventTarget.removeEventListener('handshake.success', onHandshakeSuccessHandler),\n        () => this.eventTarget.removeEventListener('handshake.fail', onHandshakeFailHandler)\n      )\n      \n      this.eventTarget.addEventListener('handshake.success', onHandshakeSuccessHandler)\n      this.eventTarget.addEventListener('handshake.fail', onHandshakeFailHandler)\n\n    for (let i = 0; i < tryTime; i++) {\n      if (this.ready) {\n        this.logger.info(`Handshake completed early at attempt ${i + 1}`)\n        break\n      }\n\n      this.logger.info(`Handshake attempt ${i + 1}/${tryTime}`)\n      \n      requestAnimationFrameId = requestAnimationFrame(() => {\n        const handshakeMessage: Message<'handshake'> = {\n          type: 'handshake',\n          uid: getShortUUID(),\n          payload: {},\n          fromId: this.uuid,\n          toId: '*',\n          timestamp: Date.now(),\n        }\n        this.logger.debug(`Sending handshake message:`, handshakeMessage)\n        this.sendMessage<'handshake'>(handshakeMessage)\n      })\n\n      // 使用指数退避策略，避免频繁重试\n      if (i < tryTime - 1) { // 最后一次尝试不需要等待\n        const baseDelay = 500 // 基础延迟 500ms\n        const maxDelay = 5000 // 最大延迟 5s\n        const exponentialDelay = Math.min(baseDelay * Math.pow(2, i), maxDelay)\n        \n        // 添加抖动，避免多个客户端同时重试\n        const jitter = Math.random() * 0.3 + 0.85 // 0.85-1.15 的随机因子\n        const finalDelay = Math.floor(exponentialDelay * jitter)\n        \n        this.logger.info(`Waiting ${finalDelay}ms before next attempt (exponential backoff + jitter)`)\n        await new Promise((resolve) => setTimeout(resolve, finalDelay))\n      }\n    }\n\n    if (!this.ready) {\n      this.logger.error(`Handshake failed after ${tryTime} attempts`)\n      this.eventTarget.dispatchEvent(new CustomEvent('handshake.fail', { detail: new Error(`handshake fail after ${tryTime} times`) }))\n    }\n  }\n\n  /**\n   * 处理握手失败\n   */\n  private handleHandshakeFailure = () => {\n    this.isHandshaking = false\n    this.updateConnectionStatus(ConnectionStatus.ERROR)\n    \n    if (this.enableAutoReconnect && this.currentReconnectAttempts < this.maxReconnectAttempts) {\n      this.scheduleReconnect()\n    }\n  }\n\n  /**\n   * 安排重连\n   */\n  private scheduleReconnect = () => {\n    this.currentReconnectAttempts++\n    this.updateConnectionStatus(ConnectionStatus.RECONNECTING)\n    \n    // 获取重连策略配置\n    const reconnectConfig = this.instance.getOptions()?.reconnectStrategy || {}\n    const baseReconnectDelay = reconnectConfig.baseDelay || 2000\n    const maxReconnectDelay = reconnectConfig.maxDelay || 30000\n    const jitterRange = reconnectConfig.jitterRange || [0.8, 1.2]\n    \n    // 使用指数退避策略计算重连延迟\n    const exponentialDelay = Math.min(baseReconnectDelay * Math.pow(2, this.currentReconnectAttempts - 1), maxReconnectDelay)\n    \n    // 添加抖动，避免多个客户端同时重连\n    const jitter = Math.random() * (jitterRange[1] - jitterRange[0]) + jitterRange[0]\n    const finalReconnectDelay = Math.floor(exponentialDelay * jitter)\n    \n    this.logger.info(`Scheduling reconnect attempt ${this.currentReconnectAttempts}/${this.maxReconnectAttempts}`)\n    this.logger.info(`Reconnect will happen in ${finalReconnectDelay}ms (exponential backoff + jitter)`)\n    \n    this.reconnectTimer = setTimeout(() => {\n      this.logger.info(`Executing scheduled reconnect attempt ${this.currentReconnectAttempts}/${this.maxReconnectAttempts}`)\n      this.startHandshake()\n    }, finalReconnectDelay)\n  }\n\n  /**\n   * 发送消息\n   * @param message\n   */\n  private sendMessage = <MessageType extends keyof MessageMap>(message: Message<MessageType>) => {\n    this.logger.debug('send message: ', message)\n    \n    // 获取安全配置\n    const securityConfig = this.instance.getOptions()?.security || {}\n    const strictMode = securityConfig.strictMode ?? false  // 默认禁用严格模式\n    const allowedOrigins = securityConfig.allowedOrigins || []\n    \n    // 获取安全的 targetOrigin（自适应策略）\n    const targetOrigin = SecurityUtils.getSecureTargetOriginAdaptive(\n      this.targetWindow, \n      strictMode,\n      allowedOrigins\n    )\n    \n    // 如果无法获取安全的 targetOrigin，记录警告\n    if (!targetOrigin && strictMode) {\n      this.logger.warn('Cannot send message: no secure target origin available')\n      return\n    }\n    \n    // 握手消息可以直接发送，不需要等待连接就绪\n    if (message.type === 'handshake') {\n      try {\n        this.logger.debug('Sending handshake message directly')\n        this.targetWindow.postMessage(message, targetOrigin)\n        this.logger.debug('Handshake message sent successfully')\n      } catch (error) {\n        this.logger.error('Failed to send handshake message:', error)\n        this.updateConnectionStatus(ConnectionStatus.ERROR)\n      }\n      return\n    }\n    \n    // 如果连接断开，将其他消息加入队列\n    if (!this.ready) {\n      this.messageQueue.push(message)\n      this.logger.debug('Message queued, connection not ready')\n      return\n    }\n    \n    try {\n      this.targetWindow.postMessage(message, targetOrigin)\n    } catch (error) {\n      this.logger.error('Failed to send message:', error)\n      this.updateConnectionStatus(ConnectionStatus.ERROR)\n    }\n  }\n\n  /**\n   * 发送队列中的消息\n   */\n  private flushMessageQueue = () => {\n    if (this.messageQueue.length === 0) return\n    \n    this.logger.info(`Flushing ${this.messageQueue.length} queued messages`)\n    \n    // 获取安全配置\n    const securityConfig = this.instance.getOptions()?.security || {}\n    const strictMode = securityConfig.strictMode ?? false  // 默认禁用严格模式\n    const allowedOrigins = securityConfig.allowedOrigins || []\n    \n    // 获取安全的 targetOrigin（自适应策略）\n    const targetOrigin = SecurityUtils.getSecureTargetOriginAdaptive(\n      this.targetWindow, \n      strictMode,\n      allowedOrigins\n    )\n    \n    while (this.messageQueue.length > 0) {\n      const message = this.messageQueue.shift()!\n      try {\n        this.targetWindow.postMessage(message, targetOrigin)\n      } catch (error) {\n        this.logger.error('Failed to send queued message:', error)\n        // 将失败的消息重新放回队列\n        this.messageQueue.unshift(message)\n        break\n      }\n    }\n  }\n\n  /**\n   * 发送事件\n   * @param eventName\n   * @param eventData\n   */\n  public sendEvent = (eventName: keyof EventMap, eventData: Parameters<EventMap[keyof EventMap]>[0]) => {\n    const uid = getShortUUID()\n    this.sendMessage<'event'>({\n      type: 'event',\n      uid,\n      payload: {\n        eventName: eventName as string,\n        eventData,\n        uid,\n      },\n      fromId: this.uuid,\n      toId: this.toIds,\n      timestamp: Date.now(),\n    })\n  }\n\n  /**\n   * 当前实例是否已经 ready\n   * @param callback\n   */\n  public onReady = (callback: () => void) => {\n    this.logger.info(`onReady called, current ready status: ${this.ready}`)\n    if (this.ready) {\n      this.logger.info('Already ready, executing callback immediately')\n      callback()\n    } else {\n      this.logger.info('Not ready yet, adding callback to event listener')\n      this.eventTarget.addEventListener('ready', callback, { once: true })\n    }\n  }\n\n  /**\n   * 获取连接状态\n   */\n  public getConnectionStatus = (): ConnectionStatus => {\n    return this.connectionStatus\n  }\n\n  /**\n   * 监听错误\n   * @param callback \n   * @returns \n   */\n  public onError = (callback: (error: Error) => void) => {\n    const handler = (event: Event) => {\n      if (event instanceof CustomEvent) {\n        callback(event.detail)\n      }\n    }\n    \n    this.eventTarget.addEventListener('error', handler)\n    \n    return () => {\n      this.eventTarget.removeEventListener('error', handler)\n    }\n  }\n\n  /**\n   * 监听连接状态变化\n   * @param callback \n   * @returns \n   */\n  public onConnectionStatusChange = (callback: (status: ConnectionStatus) => void) => {\n    const handler = (event: Event) => {\n      if (event instanceof CustomEvent) {\n        callback(event.detail)\n      }\n    }\n    \n    this.eventTarget.addEventListener('connection.status', handler)\n    \n    return () => {\n      this.eventTarget.removeEventListener('connection.status', handler)\n    }\n  }\n\n  /**\n   * 取消连接状态监听\n   * @param callback \n   * @returns \n   */\n  public offConnectionStatusChange = (callback: (status: ConnectionStatus) => void) => {\n    // 由于我们无法直接获取原始的 handler，这里提供一个占位符实现\n    // 建议使用标准的 addEventListener 和 removeEventListener\n    this.logger.warn('offConnectionStatusChange() method is deprecated, use removeEventListener() instead')\n  }\n\n  /**\n   * 手动重连\n   */\n  public reconnect = () => {\n    this.logger.info('Manual reconnect called')\n    if (this.reconnectTimer) {\n      clearTimeout(this.reconnectTimer)\n      this.reconnectTimer = null\n    }\n    \n    this.logger.info('Resetting connection state for reconnect')\n    this.currentReconnectAttempts = 0\n    this.messageQueue = []\n    this.ready = false\n    this.toIds = []\n    this.handshakedIds = []\n    \n    this.logger.info('Starting handshake after reconnect')\n    this.startHandshake()\n  }\n\n  /**\n   * 销毁实例\n   */\n  public dispose = () => {\n    this.selfWindow.removeEventListener('message', this.onMessage)\n    \n    if (this.reconnectTimer) {\n      clearTimeout(this.reconnectTimer)\n      this.reconnectTimer = null\n    }\n    \n    if (this.handshakeTimer) {\n      clearTimeout(this.handshakeTimer)\n      this.handshakeTimer = null\n    }\n    \n    this.messageQueue = []\n    this.updateConnectionStatus(ConnectionStatus.DISCONNECTED)\n  }\n}\n","/**\n * 标准化的 EventTarget 基类\n * 继承原生 EventTarget，提供标准的事件管理方法\n */\nexport class StandardEventTarget extends EventTarget {\n  /**\n   * 添加事件监听器（标准方法）\n   * @param type 事件类型\n   * @param listener 事件监听器\n   * @param options 选项\n   */\n  addEventListener(\n    type: string,\n    listener: EventListener | EventListenerObject | null,\n    options?: boolean | AddEventListenerOptions\n  ): void {\n    super.addEventListener(type, listener, options)\n  }\n\n  /**\n   * 移除事件监听器（标准方法）\n   * @param type 事件类型\n   * @param listener 事件监听器\n   * @param options 选项\n   */\n  removeEventListener(\n    type: string,\n    listener: EventListener | EventListenerObject | null,\n    options?: boolean | EventListenerOptions\n  ): void {\n    super.removeEventListener(type, listener, options)\n  }\n\n  /**\n   * 分发事件（标准方法）\n   * @param event 事件对象\n   * @returns 是否被取消\n   */\n  dispatchEvent(event: Event): boolean {\n    return super.dispatchEvent(event)\n  }\n\n  /**\n   * 创建并分发自定义事件\n   * @param type 事件类型\n   * @param detail 事件详情\n   * @param options 事件选项\n   * @returns 是否被取消\n   */\n  dispatchCustomEvent<T = any>(\n    type: string,\n    detail?: T,\n    options?: CustomEventInit<T>\n  ): boolean {\n    const event = new CustomEvent(type, {\n      detail,\n      bubbles: true,\n      cancelable: true,\n      ...options\n    })\n    return this.dispatchEvent(event)\n  }\n\n  /**\n   * 创建并分发内置事件\n   * @param type 事件类型\n   * @param options 事件选项\n   * @returns 是否被取消\n   */\n  dispatchBuiltInEvent(type: string, options?: EventInit): boolean {\n    const event = new Event(type, {\n      bubbles: true,\n      cancelable: true,\n      ...options\n    })\n    return this.dispatchEvent(event)\n  }\n\n  /**\n   * 检查是否有指定类型的事件监听器\n   * @param type 事件类型\n   * @returns 是否有监听器\n   */\n  hasEventListener(type: string): boolean {\n    // 由于 EventTarget 的限制，我们无法直接检查是否有监听器\n    // 这里提供一个占位符实现\n    return true\n  }\n\n  /**\n   * 获取事件监听器数量（近似值）\n   * @param type 事件类型\n   * @returns 监听器数量\n   */\n  getListenerCount(type: string): number {\n    // 由于 EventTarget 的限制，我们无法直接获取监听器数量\n    // 这里提供一个占位符实现\n    return 0\n  }\n\n  /**\n   * 移除指定类型的所有事件监听器\n   * @param type 事件类型\n   */\n  removeAllListeners(type: string): void {\n    // 由于 EventTarget 的限制，我们无法直接移除所有监听器\n    // 这里提供一个占位符实现\n    // 建议使用 AbortController 来管理监听器\n  }\n\n  /**\n   * 使用 AbortController 添加事件监听器\n   * @param type 事件类型\n   * @param listener 事件监听器\n   * @param options 选项\n   * @param signal AbortSignal\n   * @returns 清理函数\n   */\n  addEventListenerWithAbort(\n    type: string,\n    listener: EventListener | EventListenerObject | null,\n    options?: AddEventListenerOptions,\n    signal?: AbortSignal\n  ): () => void {\n    if (signal) {\n      signal.addEventListener('abort', () => {\n        this.removeEventListener(type, listener, options)\n      })\n    }\n\n    this.addEventListener(type, listener, options)\n    \n    return () => {\n      this.removeEventListener(type, listener, options)\n    }\n  }\n}\n\n/**\n * 标准的事件监听器类型\n */\nexport type StandardEventListener<T = any> = (event: CustomEvent<T>) => void\n\n/**\n * 标准的事件选项类型\n */\nexport interface StandardEventOptions extends AddEventListenerOptions {\n  once?: boolean\n  passive?: boolean\n  capture?: boolean\n  signal?: AbortSignal\n}\n\n// 事件类型定义已移至 EventTypes.ts\n// 请使用 EventType 枚举替代\n","/**\n * 标准化的 Action 管理器\n * 使用标准的 Promise 和 AbortController\n */\nexport class StandardActionManager<ActionMap extends Record<string, (...args: any[]) => any>> {\n  private actions = new Map<keyof ActionMap, ActionMap[keyof ActionMap]>()\n  private logger: Console\n\n  constructor(logger: Console = console) {\n    this.logger = logger\n  }\n\n  /**\n   * 注册 Action\n   * @param name Action 名称\n   * @param handler Action 处理器\n   */\n  register<K extends keyof ActionMap>(name: K, handler: ActionMap[K]): void {\n    if (this.actions.has(name)) {\n      this.logger.warn(`Action '${String(name)}' is already registered, overwriting...`)\n    }\n    \n    this.actions.set(name, handler)\n    this.logger.info(`Action '${String(name)}' registered successfully`)\n  }\n\n  /**\n   * 批量注册 Actions\n   * @param actions Actions 映射\n   */\n  registerActions(actions: Partial<ActionMap>): void {\n    for (const [name, handler] of Object.entries(actions)) {\n      this.register(name as keyof ActionMap, handler as ActionMap[keyof ActionMap])\n    }\n  }\n\n  /**\n   * 移除 Action\n   * @param name Action 名称\n   * @returns 是否成功移除\n   */\n  unregister<K extends keyof ActionMap>(name: K): boolean {\n    const removed = this.actions.delete(name)\n    if (removed) {\n      this.logger.info(`Action '${String(name)}' unregistered successfully`)\n    } else {\n      this.logger.warn(`Action '${String(name)}' was not registered`)\n    }\n    return removed\n  }\n\n  /**\n   * 检查 Action 是否已注册\n   * @param name Action 名称\n   * @returns 是否已注册\n   */\n  has<K extends keyof ActionMap>(name: K): boolean {\n    return this.actions.has(name)\n  }\n\n  /**\n   * 获取已注册的 Actions 列表\n   * @returns Actions 名称列表\n   */\n  getRegisteredActions(): (keyof ActionMap)[] {\n    return Array.from(this.actions.keys())\n  }\n\n  /**\n   * 执行 Action（标准 Promise 接口）\n   * @param name Action 名称\n   * @param data Action 参数\n   * @param options 执行选项\n   * @returns Promise 结果\n   */\n  async execute<K extends keyof ActionMap>(\n    name: K,\n    data: Parameters<ActionMap[K]>[0],\n    options: ActionExecuteOptions = {}\n  ): Promise<ReturnType<ActionMap[K]>> {\n    const { signal, timeout } = options\n    \n    // 检查 Action 是否已注册\n    if (!this.actions.has(name)) {\n      throw new Error(`Action '${String(name)}' is not registered`)\n    }\n\n    // 创建 AbortController 用于超时控制\n    const timeoutController = new AbortController()\n    const timeoutId = timeout ? setTimeout(() => timeoutController.abort(), timeout) : null\n\n    try {\n      // 合并信号\n      const combinedSignal = this.combineSignals(signal, timeoutController.signal)\n      \n      // 检查是否已取消\n      if (combinedSignal?.aborted) {\n        throw new Error(`Action '${String(name)}' execution was aborted`)\n      }\n\n      // 执行 Action\n      const handler = this.actions.get(name)!\n      const result = await handler(data)\n      \n      this.logger.debug(`Action '${String(name)}' executed successfully`)\n      return result\n    } catch (error) {\n      this.logger.error(`Action '${String(name)}' execution failed`, error)\n      throw error\n    } finally {\n      if (timeoutId) {\n        clearTimeout(timeoutId)\n      }\n    }\n  }\n\n  /**\n   * 执行 Action 并支持取消（返回 Promise 和 AbortController）\n   * @param name Action 名称\n   * @param data Action 参数\n   * @param options 执行选项\n   * @returns 执行结果和控制器\n   */\n  executeWithAbort<K extends keyof ActionMap>(\n    name: K,\n    data: Parameters<ActionMap[K]>[0],\n    options: ActionExecuteOptions = {}\n  ): {\n    promise: Promise<ReturnType<ActionMap[K]>>\n    abort: () => void\n    signal: AbortSignal\n  } {\n    const controller = new AbortController()\n    const { signal: parentSignal } = options\n    \n    // 合并信号\n    const combinedSignal = this.combineSignals(controller.signal, parentSignal)\n    \n    const promise = this.execute(name, data, { ...options, signal: combinedSignal })\n    \n    return {\n      promise,\n      abort: () => controller.abort(),\n      signal: controller.signal\n    }\n  }\n\n  /**\n   * 清空所有 Actions\n   */\n  clear(): void {\n    const count = this.actions.size\n    this.actions.clear()\n    this.logger.info(`Cleared ${count} actions`)\n  }\n\n  /**\n   * 获取 Actions 数量\n   */\n  get size(): number {\n    return this.actions.size\n  }\n\n  /**\n   * 合并多个 AbortSignal\n   * @param signals 要合并的信号\n   * @returns 合并后的信号\n   */\n  private combineSignals(...signals: (AbortSignal | undefined)[]): AbortSignal | undefined {\n    const validSignals = signals.filter(Boolean) as AbortSignal[]\n    \n    if (validSignals.length === 0) {\n      return undefined\n    }\n    \n    if (validSignals.length === 1) {\n      return validSignals[0]\n    }\n    \n    // 创建新的 AbortController 来合并多个信号\n    const controller = new AbortController()\n    \n    for (const signal of validSignals) {\n      if (signal.aborted) {\n        controller.abort()\n        break\n      }\n      \n      signal.addEventListener('abort', () => {\n        controller.abort()\n      })\n    }\n    \n    return controller.signal\n  }\n}\n\n/**\n * Action 执行选项\n */\nexport interface ActionExecuteOptions {\n  /** 取消信号 */\n  signal?: AbortSignal\n  /** 超时时间（毫秒） */\n  timeout?: number\n}\n\n/**\n * Action 执行结果\n */\nexport interface ActionExecuteResult<T = any> {\n  /** 执行结果 */\n  data?: T\n  /** 错误信息 */\n  error?: Error\n  /** 是否成功 */\n  success: boolean\n  /** 执行时间（毫秒） */\n  duration: number\n}\n\n/**\n * Action 统计信息\n */\nexport interface ActionStats {\n  /** 总数 */\n  total: number\n  /** 已注册的 Actions */\n  registered: string[]\n  /** 时间戳 */\n  timestamp: number\n}\n","import { Logger } from './Logger'\nimport { MessageBridge } from './MessageBridge'\nimport { StandardEventTarget } from './StandardEventTarget'\nimport { StandardActionManager } from './StandardActionManager'\nimport { BaseMap, Mode, BaseOptions, ConnectionStatus } from './types'\nimport { getShortUUID, inIframe } from './utils'\nimport { DefaultActionMap, DefaultEventMap } from './default-types'\n\n/**\n * 核心的基类\n * 继承标准化的 EventTarget，提供标准的事件管理\n * 默认使用已实现的 DefaultActionMap 和 DefaultEventMap 类型\n */\nclass Base<\n  ActionMap extends BaseMap = DefaultActionMap, \n  EventMap extends BaseMap = DefaultEventMap\n> extends StandardEventTarget {\n  /**\n   * 运行模式\n   */\n  private mode: Mode\n  /**\n   * 父元素\n   */\n  private parentElement: HTMLElement | HTMLBodyElement = document.body\n  /**\n   * iframe 元素\n   */\n  private iframeElement: HTMLIFrameElement | null = null\n  /**\n   * VR 链接\n   */\n  private vrLink: URL | null = null\n  /**\n   * 当前实例的 uuid\n   */\n  private uuid = getShortUUID()\n\n  /**\n   * 消息桥接实例\n   */\n  protected messageBridge: MessageBridge<ActionMap, EventMap> | null = null\n\n  /**\n   * 支持的方法列表（向后兼容）\n   */\n  private _actionMap?: Partial<ActionMap>\n\n  /**\n   * 获取支持的方法列表（向后兼容）\n   */\n  public get actionMap() {\n    return this._actionMap\n  }\n\n  /**\n   * Action 管理器\n   */\n  private _actionManager: StandardActionManager<ActionMap>\n\n  /**\n   * 获取 Action 管理器\n   */\n  public get actionManager() {\n    return this._actionManager\n  }\n\n  /**\n   * 获取目标窗口\n   */\n  private get targetWindow() {\n    return this.mode === 'control' ? this.iframeElement?.contentWindow : window.parent\n  }\n\n  /**\n   * 日志记录器\n   */\n  protected logger: Logger\n\n  /**\n   * 配置选项\n   */\n  private options: Partial<BaseOptions<ActionMap>>\n\n  /**\n   * 连接状态\n   */\n  private _connectionStatus: ConnectionStatus = ConnectionStatus.DISCONNECTED\n\n  /**\n   * 获取连接状态\n   */\n  public get connectionStatus(): ConnectionStatus {\n    return this._connectionStatus\n  }\n\n  /**\n   * 获取配置选项\n   */\n  public getOptions(): Partial<BaseOptions<ActionMap>> {\n    return this.options\n  }\n\n  /**\n   * 构造函数接受一个可选的 `Options` 对象。\n   * 它首先初始化 logger，然后检测是否在 iframe 中运行。\n   * @param options - 包含 VR 链接、元素和日志级别的选项对象。\n   */\n  constructor(options?: Partial<BaseOptions<ActionMap>>) {\n    super()\n    \n    this.options = options || {}\n    \n    // 0. 初始化 logger\n    this.logger = new Logger(\n      options?.logLevel || 'NONE',\n      `Realsee Signals <ID:${inIframe() ? 'child' : 'parent'}-${this.uuid}>`,\n    )\n\n    this._actionManager = new StandardActionManager<ActionMap>(console)\n\n    // 1. 检测是否在 iframe 中运行\n    const isInIframe = inIframe()\n\n    if (isInIframe) {\n      this.logger.info('I`m in iframe')\n    } else {\n      this.logger.info('I`m in window')\n    }\n\n    // 2. 在 iframe 中运行时，使用被控制模式\n    this.mode = isInIframe ? 'controlled' : 'control'\n\n    // 3. 在 window 中运行时，使用控制模式，需要传入 vrLink 和 element\n    if (this.mode === 'control') {\n      this.validateControlModeOptions(options)\n      this.setupControlMode(options!)\n    }\n\n    // 如果提供了初始 actionMap，则注册它们\n    if (options?.actionMap) {\n      this._actionManager.registerActions(options.actionMap)\n    }\n\n    this.initMessageBridge(options?.shakehandRetryTimes)\n  }\n\n  /**\n   * 验证控制模式下的配置选项\n   * @param options\n   */\n  private validateControlModeOptions = (options?: Partial<BaseOptions<ActionMap>>) => {\n    if (!options?.vrLink) {\n      throw new Error('vrLink is required for control mode')\n    }\n\n    try {\n      this.vrLink = new URL(options.vrLink)\n    } catch (error) {\n      throw new Error(`Invalid vrLink: ${options.vrLink}. Must be a valid URL.`)\n    }\n\n    if (!options?.element) {\n      throw new Error('element is required for control mode')\n    }\n\n    if (!(options.element instanceof HTMLIFrameElement) && !(options.element instanceof HTMLElement)) {\n      throw new Error('element must be a HTMLIFrameElement or HTMLElement')\n    }\n  }\n\n  /**\n   * 设置控制模式\n   * @param options\n   */\n  private setupControlMode = (options: BaseOptions<ActionMap>) => {\n    // 3.1 检测 element 是否合法\n    if (options?.element instanceof HTMLIFrameElement) {\n      this.iframeElement = options.element\n      this.parentElement = this.iframeElement?.parentElement || document.body\n    } else if (options?.element instanceof HTMLElement) {\n      this.parentElement = options.element\n      this.iframeElement = this.createIframe(this.parentElement)\n    }\n\n    // 3.2 这个模式下，需要设置 iframeElement 的 src 属性 以及和 vr 相关的权限声明（全屏，xr-spatial-tracking）\n    if (this.iframeElement && this.vrLink) {\n      this.iframeElement.allow = 'fullscreen; xr-spatial-tracking'\n      this.iframeElement.src = this.vrLink.href\n      \n      // 添加错误处理\n      this.iframeElement.onerror = (error) => {\n        this.logger.error('Iframe load error:', error)\n        this._connectionStatus = ConnectionStatus.ERROR\n      }\n      \n      // 添加加载完成处理\n      this.iframeElement.onload = () => {\n        this.logger.info('Iframe loaded successfully')\n      }\n    }\n  }\n\n  /**\n   * 创建 iframe 元素\n   * @param parentElement\n   * @returns\n   */\n  private createIframe = (parentElement: HTMLElement) => {\n    const iframe = document.createElement('iframe')\n    iframe.style.width = '100%'\n    iframe.style.height = '100%'\n    iframe.style.border = 'none'\n    iframe.style.display = 'block'\n    \n    // 添加错误处理\n    iframe.onerror = (error) => {\n      this.logger.error('Iframe creation error:', error)\n    }\n    \n    parentElement.appendChild(iframe)\n    return iframe\n  }\n\n  /**\n   * 初始化消息桥接\n   */\n  private initMessageBridge = (shakehandRetryTimes: number = 10) => {\n    this.logger.info('Initializing MessageBridge...')\n    this.logger.info(`Handshake retry times: ${shakehandRetryTimes}`)\n    this.logger.info(`Target window: ${!!this.targetWindow}`)\n    this.logger.info(`Mode: ${this.mode}`)\n    \n    if (this.targetWindow) {\n      this.logger.info('Target window available, creating MessageBridge')\n      \n      this.messageBridge = new MessageBridge<ActionMap, EventMap>({\n        selfWindow: window,\n        targetWindow: this.targetWindow,\n        logger: this.logger,\n        uuid: this.uuid,\n        instance: this,\n        shakehandRetryTimes,\n        enableAutoReconnect: this.options.enableAutoReconnect,\n        reconnectInterval: this.options.reconnectInterval,\n        maxReconnectAttempts: this.options.maxReconnectAttempts,\n      })\n\n      this.logger.info('MessageBridge created successfully')\n\n      // 监听连接状态变化\n      this.messageBridge.onConnectionStatusChange((status: ConnectionStatus) => {\n        this._connectionStatus = status\n        this.logger.info(`Connection status changed to: ${status}`)\n        \n        // 调用子类的连接状态变化回调\n        this.onConnectionStatusChanged?.(status)\n      })\n\n      // 监听错误\n      this.messageBridge.onError((error: Error) => {\n        this.logger.error('MessageBridge error:', error)\n        this._connectionStatus = ConnectionStatus.ERROR\n      })\n      \n      this.logger.info('MessageBridge event listeners configured')\n    } else {\n      this.logger.error('Target window not available, cannot initialize MessageBridge')\n      this.logger.error(`Mode: ${this.mode}, iframeElement: ${!!this.iframeElement}, vrLink: ${!!this.vrLink}`)\n    }\n  }\n\n  /**\n   * 当消息桥接准备好时，执行回调\n   * @param callback \n   * @returns \n   */\n  public onReady = (callback: () => void) => {\n    this.logger.info('Base.onReady called')\n    if (this.messageBridge) {\n      this.logger.info('MessageBridge exists, delegating to MessageBridge.onReady')\n      return this.messageBridge.onReady(callback)\n    } else {\n      this.logger.error('MessageBridge is null, cannot register onReady callback')\n    }\n  }\n\n  /**\n   * 监听连接状态变化\n   * @param callback \n   * @returns \n   */\n  public onConnectionStatusChange(callback: (status: ConnectionStatus) => void) {\n    return this.messageBridge?.onConnectionStatusChange(callback)\n  }\n\n  /**\n   * 取消连接状态监听\n   * @param callback \n   */\n  public offConnectionStatusChange(callback: (status: ConnectionStatus) => void) {\n    return this.messageBridge?.offConnectionStatusChange(callback)\n  }\n\n  /**\n   * 手动重连\n   */\n  public reconnect = () => {\n    if (this.messageBridge) {\n      this.messageBridge.reconnect()\n    }\n  }\n\n  /**\n   * 处理 Action 请求（子类可以重写此方法）\n   */\n  protected async handleActionRequest(actionName: string, data: any): Promise<any> {\n    // 使用标准化的 Action 管理器\n    if (this._actionManager.has(actionName as keyof ActionMap)) {\n      return this._actionManager.execute(actionName as keyof ActionMap, data)\n    }\n    \n    // 向后兼容：查找旧的 actionMap\n    if (this._actionMap && actionName in this._actionMap) {\n      const handler = this._actionMap[actionName as keyof ActionMap]\n      if (handler) {\n        return handler(data)\n      }\n    }\n    \n    throw new Error(`Action '${actionName}' is not implemented`)\n  }\n\n  /**\n   * 发送事件\n   */\n  public sendEvent<EventName extends keyof EventMap>(\n    eventName: EventName,\n    eventData: Parameters<EventMap[EventName]>[0],\n  ): void {\n    if (this.connectionStatus !== ConnectionStatus.CONNECTED) {\n      this.logger.warn(`Cannot send event: connection not ready. Current status: ${this.connectionStatus}`)\n      return\n    }\n    \n    // 使用标准的事件分发\n    this.dispatchCustomEvent(String(eventName), eventData)\n    \n    // 同时通过消息桥接发送到远程\n    return this.messageBridge?.sendEvent(eventName, eventData)\n  }\n\n  /**\n   * 发送 Action 请求\n   */\n  public async send<K extends keyof ActionMap>(\n    action: K, \n    data: Parameters<ActionMap[K]>[0]\n  ): Promise<ReturnType<ActionMap[K]>> {\n    if (this.connectionStatus !== ConnectionStatus.CONNECTED) {\n      throw new Error(`Cannot send action: connection not ready. Current status: ${this.connectionStatus}`)\n    }\n    \n    const result = await this.messageBridge?.requestAcion(action, data)\n    // 对于返回 void 的 action，undefined 是正常返回值，不应该认为是执行失败\n    // 如果 messageBridge 不存在，则抛出错误\n    if (result === undefined && this.messageBridge === undefined) {\n      throw new Error(`Action '${String(action)}' execution failed: no message bridge`)\n    }\n    return result as ReturnType<ActionMap[K]>\n  }\n\n  /**\n   * 监听事件（向后兼容，内部使用标准 addEventListener）\n   */\n  public on<EventName extends keyof EventMap>(eventName: EventName, callback: EventMap[EventName]): () => void {\n    const wrappedCallback = (event: Event) => {\n      if (event instanceof CustomEvent) {\n        (callback as any)(event.detail)\n      } else {\n        (callback as any)(event)\n      }\n    }\n    \n    this.addEventListener(String(eventName), wrappedCallback)\n    \n    return () => {\n      this.removeEventListener(String(eventName), wrappedCallback)\n    }\n  }\n\n  /**\n   * 取消监听事件（向后兼容，内部使用标准 removeEventListener）\n   */\n  public off<EventName extends keyof EventMap>(eventName: EventName, callback: EventMap[EventName]): void {\n    // 由于我们无法直接获取原始的 wrappedCallback，这里提供一个占位符实现\n    // 建议使用标准的 addEventListener 和 removeEventListener\n    this.logger.warn('off() method is deprecated, use removeEventListener() instead')\n  }\n\n  /**\n   * 只监听一次事件（向后兼容，内部使用标准 addEventListener）\n   */\n  public once<EventName extends keyof EventMap>(eventName: EventName, callback: EventMap[EventName]): () => void {\n    const wrappedCallback = (event: Event) => {\n      if (event instanceof CustomEvent) {\n        (callback as any)(event.detail)\n      } else {\n        (callback as any)(event)\n      }\n    }\n    \n    this.addEventListener(String(eventName), wrappedCallback, { once: true })\n    \n    return () => {\n      this.removeEventListener(String(eventName), wrappedCallback)\n    }\n  }\n\n  /**\n   * 连接状态变化回调（子类可以重写）\n   */\n  protected onConnectionStatusChanged?(status: ConnectionStatus): void\n\n  /**\n   * 销毁\n   */\n  public dispose = () => {\n    this.logger.info('Disposing Base instance')\n    \n    if (this.messageBridge) {\n      this.messageBridge.dispose()\n    }\n    \n    if (this.iframeElement) {\n      // 移除事件监听器\n      this.iframeElement.onerror = null\n      this.iframeElement.onload = null\n      \n      // 移除元素\n      this.iframeElement.remove()\n    }\n    \n    this._connectionStatus = ConnectionStatus.DISCONNECTED\n    \n    this.logger.info('Base instance disposed')\n  }\n}\n\nexport { Base }\n","import { Base } from './Base'\nimport { BaseMap, ClientOptions, ConnectionStatus } from './types'\nimport { DefaultActionMap, DefaultEventMap } from './default-types'\nimport { Logger } from './Logger'\n\n/**\n * Action 可用性管理器\n */\nclass ActionAvailabilityManager<ActionMap extends BaseMap = DefaultActionMap> extends EventTarget {\n  private availableActions = new Set<keyof ActionMap>()\n  private logger = new Logger('INFO')\n\n  /**\n   * 更新 Action 可用性\n   */\n  updateAvailability(actions: (keyof ActionMap)[], available: boolean): void {\n    // 安全检查：确保 actions 是数组且不为空\n    if (!Array.isArray(actions) || actions.length === 0) {\n      this.logger.warn('updateAvailability: actions parameter must be a non-empty array', { actions, available })\n      return\n    }\n\n    if (available) {\n      actions.forEach(action => this.availableActions.add(action))\n      this.logger.debug(`Actions ${actions.map(String).join(', ')} are now available`)\n    } else {\n      actions.forEach(action => this.availableActions.delete(action))\n      this.logger.debug(`Actions ${actions.map(String).join(', ')} are no longer available`)\n    }\n\n    this.dispatchEvent(new CustomEvent('availability.changed', { \n      detail: { actions, available } \n    }))\n  }\n\n  /**\n   * 检查 Action 是否可用\n   */\n  isAvailable<K extends keyof ActionMap>(action: K): boolean {\n    return this.availableActions.has(action)\n  }\n\n  /**\n   * 获取所有可用的 Actions\n   */\n  getAvailableActions(): (keyof ActionMap)[] {\n    return Array.from(this.availableActions)\n  }\n\n  /**\n   * 监听可用性变化\n   */\n  onAvailabilityChange(callback: (event: { actions: (keyof ActionMap)[]; available: boolean }) => void): () => void {\n    // 使用标准的事件监听\n    const handler = (event: Event) => {\n      if (event instanceof CustomEvent) {\n        callback(event.detail)\n      }\n    }\n    \n    this.addEventListener('availability.changed', handler)\n    \n    return () => {\n      this.removeEventListener('availability.changed', handler)\n    }\n  }\n\n  /**\n   * 监听特定 Action 的可用性变化\n   */\n  onActionAvailabilityChange<K extends keyof ActionMap>(\n    action: K, \n    callback: (available: boolean) => void\n  ): () => void {\n    const handler = (event: Event) => {\n      if (event instanceof CustomEvent) {\n        const eventData = event.detail as { actions: (keyof ActionMap)[]; available: boolean }\n        if (eventData.actions.includes(action)) {\n          callback(eventData.available)\n        }\n      }\n    }\n    \n    this.addEventListener('availability.changed', handler)\n    \n    return () => {\n      this.removeEventListener('availability.changed', handler)\n    }\n  }\n\n  /**\n   * 清空所有可用 Actions\n   */\n  clear(): void {\n    const count = this.availableActions.size\n    this.availableActions.clear()\n    this.logger.info(`Cleared ${count} available actions`)\n  }\n}\n\n/**\n * VR 信号客户端类 - 专注于连接管理和 Action 调用\n * \n * 这个类用于在父窗口中创建客户端实例，负责与 VR 应用建立通信连接，\n * 发送 Action 请求，监听事件，并管理连接状态。\n * \n * @template ActionMap Action 映射类型，默认为 DefaultActionMap\n * @template EventMap Event 映射类型，默认为 DefaultEventMap\n * \n * @example\n * ```typescript\n * import { RealseeVRSignalsClient } from '@realsee/vr-signals'\n * \n * const client = new RealseeVRSignalsClient({\n *   vrLink: 'http://localhost:3000/vr-app',\n *   element: iframeElement,\n *   logLevel: 'INFO'\n * })\n * \n * // 监听事件\n * client.on('cameraUpdate', (data) => {\n *   console.log('相机更新:', data.state)\n * })\n * \n * // 发送 Action\n * await client.send('setState', { mode: 'panorama' })\n * ```\n * \n * @category Core Classes\n */\nclass Client<\n  ActionMap extends BaseMap = DefaultActionMap,\n  EventMap extends BaseMap = DefaultEventMap\n> extends Base<ActionMap, EventMap> {\n  private actionAvailabilityManager: ActionAvailabilityManager<ActionMap>\n  protected logger = new Logger('INFO')\n\n  /**\n   * @deprecated 此属性已废弃，请直接使用 Client 实例的事件监听方法\n   * @see {@link on}\n   * @see {@link once}\n   * \n   * 迁移指南：\n   * ```typescript\n   * // 旧用法\n   * client.subscribe.on('cameraUpdate', handler)\n   * \n   * // 新用法\n   * client.on('cameraUpdate', handler)\n   * ```\n   */\n  public subscribe = this\n\n  /**\n   * 创建 VR 信号客户端实例\n   * \n   * @param options 客户端配置选项\n   * @param options.vrLink VR 应用链接地址\n   * @param options.element iframe 或容器元素\n   * @param options.logLevel 日志级别，默认为 'NONE'\n   * @param options.handshakeRetryStrategy 握手重试策略配置\n   * @param options.reconnectStrategy 重连策略配置\n   * @param options.shakehandRetryTimes 握手重试次数，默认为 10\n   * @param options.enableAutoReconnect 是否启用自动重连，默认为 true\n   * @param options.maxReconnectAttempts 最大重连次数，默认为 5\n   * @param options.security 安全配置选项\n   * \n   * @example\n   * ```typescript\n   * const client = new RealseeVRSignalsClient({\n   *   vrLink: 'http://localhost:3000/vr-app',\n   *   element: iframeElement,\n   *   logLevel: 'INFO',\n   *   handshakeRetryStrategy: {\n   *     baseDelay: 500,\n   *     maxDelay: 5000,\n   *     jitterRange: [0.85, 1.15]\n   *   }\n   * })\n   * ```\n   */\n  constructor(options: ClientOptions<ActionMap>) {\n    super(options)\n    this.logger.info('Client constructor called')\n    \n    this.actionAvailabilityManager = new ActionAvailabilityManager<ActionMap>()\n    \n    // 监听 action 可用性变化事件\n    this.addEventListener('sdk.availability.action.registered', this.handleActionAvailabilityChange.bind(this) as any)\n    this.addEventListener('sdk.availability.action.unregistered', this.handleActionAvailabilityChange.bind(this) as any)\n    this.addEventListener('sdk.availability.action.batch_registered', this.handleActionAvailabilityChange.bind(this) as any)\n    this.addEventListener('sdk.availability.action.batch_unregistered', this.handleActionAvailabilityChange.bind(this) as any)\n    this.addEventListener('sdk.availability.action.cleared', this.handleActionAvailabilityChange.bind(this) as any)\n    \n    this.logger.info('Client initialized with action availability management')\n    this.logger.info(`Client connection status: ${this.connectionStatus}`)\n  }\n\n  /**\n   * 发送 Action 请求（带可用性检查）\n   */\n  async send<K extends keyof ActionMap>(\n    action: K, \n    data: Parameters<ActionMap[K]>[0]\n  ): Promise<ReturnType<ActionMap[K]>> {\n    // 检查 Action 是否可用\n    if (!this.actionAvailabilityManager.isAvailable(action)) {\n      const error = new Error(`Action '${String(action)}' is not available on the remote side`)\n      this.logger.error(`Action request failed: ${error.message}`)\n      throw error\n    }\n\n    // 检查连接状态\n    if (this.connectionStatus !== ConnectionStatus.CONNECTED) {\n      const error = new Error(`Cannot send action: connection not ready. Current status: ${this.connectionStatus}`)\n      this.logger.error(`Action request failed: ${error.message}`)\n      throw error\n    }\n\n    try {\n      // 调用基类的 send 方法\n      const result = await super.send(action, data)\n      this.logger.debug(`Action '${String(action)}' executed successfully`)\n      return result\n    } catch (error) {\n      this.logger.error(`Action '${String(action)}' execution failed`, error)\n      throw error\n    }\n  }\n\n  /**\n   * @deprecated 此方法已废弃，请使用 send() 方法替代\n   * @see {@link send}\n   * \n   * 迁移指南：\n   * ```typescript\n   * // 旧用法\n   * const result = await client.callAction('setState', { mode: 'editing' })\n   * \n   * // 新用法\n   * const result = await client.send('setState', { mode: 'editing' })\n   * ```\n   */\n  async callAction<K extends keyof ActionMap>(\n    action: K, \n    data: Parameters<ActionMap[K]>[0]\n  ): Promise<ReturnType<ActionMap[K]>> {\n    this.logger.warn(`callAction() method is deprecated, use send() instead. Action: ${String(action)}`)\n    return this.send(action, data)\n  }\n\n  /**\n   * 检查 Action 是否可用\n   */\n  isActionAvailable<K extends keyof ActionMap>(action: K): boolean {\n    return this.actionAvailabilityManager.isAvailable(action)\n  }\n\n  /**\n   * 获取所有可用的 Actions\n   */\n  getAvailableActions(): (keyof ActionMap)[] {\n    return this.actionAvailabilityManager.getAvailableActions()\n  }\n\n  /**\n   * 监听 Action 可用性变化\n   */\n  onActionAvailabilityChange<K extends keyof ActionMap>(\n    action: K, \n    callback: (available: boolean) => void\n  ): () => void {\n    return this.actionAvailabilityManager.onActionAvailabilityChange(action, callback)\n  }\n\n  /**\n   * 监听所有 Action 可用性变化\n   */\n  onActionAvailabilityChangeAll(callback: (event: { actions: (keyof ActionMap)[]; available: boolean }) => void): () => void {\n    return this.actionAvailabilityManager.onAvailabilityChange(callback)\n  }\n\n  /**\n   * 等待特定 Action 可用\n   */\n  waitForAction<K extends keyof ActionMap>(action: K, timeout: number = 30000): Promise<void> {\n    return new Promise((resolve, reject) => {\n      if (this.isActionAvailable(action)) {\n        resolve()\n        return\n      }\n\n      const timeoutId = setTimeout(() => {\n        reject(new Error(`Timeout waiting for action '${String(action)}' to become available`))\n      }, timeout)\n\n      const unsubscribe = this.onActionAvailabilityChange(action, (available) => {\n        if (available) {\n          clearTimeout(timeoutId)\n          unsubscribe()\n          resolve()\n        }\n      })\n    })\n  }\n\n  /**\n   * 获取 Action 统计信息\n   */\n  getActionStats(): { available: number; total: number; availableActions: (keyof ActionMap)[] } {\n    const availableActions = this.getAvailableActions()\n    return {\n      available: availableActions.length,\n      total: 8, // 核心 Actions 数量\n      availableActions\n    }\n  }\n\n  /**\n   * 处理来自 Remote 的 Action 可用性变化事件\n   */\n  private handleActionAvailabilityChange(event: any): void {\n    // 确保 event.detail 存在，因为事件是通过 CustomEvent 发送的\n    const eventData = event.detail || event\n    const { actionName, stats } = eventData\n    \n    // 确保 actionName 是数组\n    if (!Array.isArray(actionName)) {\n      this.logger.warn('Invalid action availability event: actionName is not an array', { eventData })\n      return\n    }\n    \n    // 根据事件类型更新可用性\n    if (event.type === 'sdk.availability.action.registered' || \n        event.type === 'sdk.availability.action.batch_registered') {\n      this.actionAvailabilityManager.updateAvailability(actionName, true)\n    } else if (event.type === 'sdk.availability.action.unregistered' || \n               event.type === 'sdk.availability.action.batch_unregistered') {\n      this.actionAvailabilityManager.updateAvailability(actionName, false)\n    } else if (event.type === 'sdk.availability.action.cleared') {\n      this.actionAvailabilityManager.clear()\n    }\n\n    this.logger.info(`Action availability updated: ${event.type}`, { actionName, stats })\n  }\n\n  /**\n   * 重写基类的连接状态变化处理\n   */\n  protected onConnectionStatusChanged(status: ConnectionStatus): void {\n    super.onConnectionStatusChanged?.(status)\n    \n    // 连接断开时清空 Action 可用性\n    if (status === ConnectionStatus.DISCONNECTED || status === ConnectionStatus.ERROR) {\n      this.actionAvailabilityManager.clear()\n      this.logger.info('Connection lost, cleared action availability')\n    }\n  }\n}\n\nexport { Client }\nexport type { ActionAvailabilityManager }\n","import { Base } from './Base'\nimport { BaseMap, RemoteOptions, ConnectionStatus } from './types'\nimport { DefaultActionMap, DefaultEventMap } from './default-types'\nimport { Logger } from './Logger'\n\n/**\n * 动态 Action 注册器\n */\nclass DynamicActionRegistry<ActionMap extends BaseMap = DefaultActionMap> {\n  private actions = new Map<keyof ActionMap, ActionMap[keyof ActionMap]>()\n  private logger = new Logger('INFO')\n\n  /**\n   * 注册一个 action\n   */\n  register<K extends keyof ActionMap>(name: K, handler: ActionMap[K]): void {\n    if (this.actions.has(name)) {\n      this.logger.warn(`Action '${String(name)}' is already registered, overwriting...`)\n    }\n    \n    this.actions.set(name, handler)\n    this.logger.info(`Action '${String(name)}' registered successfully`)\n  }\n\n  /**\n   * 移除一个 action\n   */\n  unregister<K extends keyof ActionMap>(name: K): boolean {\n    const removed = this.actions.delete(name)\n    if (removed) {\n      this.logger.info(`Action '${String(name)}' unregistered successfully`)\n    } else {\n      this.logger.warn(`Action '${String(name)}' was not registered`)\n    }\n    return removed\n  }\n\n  /**\n   * 检查 action 是否已注册\n   */\n  has<K extends keyof ActionMap>(name: K): boolean {\n    return this.actions.has(name)\n  }\n\n  /**\n   * 获取已注册的 action 列表\n   */\n  getRegisteredActions(): (keyof ActionMap)[] {\n    return Array.from(this.actions.keys())\n  }\n\n  /**\n   * 执行 action\n   */\n  async execute<K extends keyof ActionMap>(name: K, data: Parameters<ActionMap[K]>[0]): Promise<ReturnType<ActionMap[K]>> {\n    const handler = this.actions.get(name)\n    if (!handler) {\n      throw new Error(`Action '${String(name)}' is not registered`)\n    }\n\n    try {\n      const result = await handler(data)\n      this.logger.debug(`Action '${String(name)}' executed successfully`)\n      return result\n    } catch (error) {\n      this.logger.error(`Action '${String(name)}' execution failed`, error)\n      throw error\n    }\n  }\n\n  /**\n   * 清空所有 actions\n   */\n  clear(): void {\n    const count = this.actions.size\n    this.actions.clear()\n    this.logger.info(`Cleared ${count} actions`)\n  }\n\n  /**\n   * 获取 actions 数量\n   */\n  get size(): number {\n    return this.actions.size\n  }\n}\n\n/**\n * VR 信号远程控制类 - 专注于 Action 管理和执行\n * \n * 这个类用于在 VR 应用中创建远程控制实例，负责接收来自父窗口的 Action 请求，\n * 执行相应的处理逻辑，并支持动态注册和移除 Actions。\n * \n * @template ActionMap Action 映射类型，默认为 DefaultActionMap\n * @template EventMap Event 映射类型，默认为 DefaultEventMap\n * \n * @example\n * ```typescript\n * import { RealseeVRSignalsRemote } from '@realsee/vr-signals'\n * \n * const remote = new RealseeVRSignalsRemote({\n *   logLevel: 'INFO',\n *   actionMap: {\n *     setState(data) {\n *       console.log('状态更新:', data)\n *       return { success: true }\n *     }\n *   }\n * })\n * \n * // 动态注册 Action\n * remote.registerAction('updateCamera', async (data) => {\n *   console.log('相机更新:', data)\n *   return { success: true }\n * })\n * ```\n * \n * @category Core Classes\n */\nclass Remote<\n  ActionMap extends BaseMap = DefaultActionMap,\n  EventMap extends BaseMap = DefaultEventMap\n> extends Base<ActionMap, EventMap> {\n  private actionRegistry: DynamicActionRegistry<ActionMap>\n  protected logger = new Logger('INFO')\n\n  /**\n   * 创建 VR 信号远程控制实例\n   * \n   * @param options 远程控制配置选项\n   * @param options.logLevel 日志级别，默认为 'NONE'\n   * @param options.actionMap 初始 Action 映射，可选\n   * \n   * @example\n   * ```typescript\n   * const remote = new RealseeVRSignalsRemote({\n   *   logLevel: 'INFO',\n   *   actionMap: {\n   *     setState(data) {\n   *       console.log('状态更新:', data)\n   *       return { success: true }\n   *     },\n   *     updateCamera({ state }) {\n   *       console.log('相机更新:', state)\n   *       return { success: true }\n   *     }\n   *   }\n   * })\n   * ```\n   */\n  constructor(options: RemoteOptions<ActionMap> = {}) {\n    // 1. 在调用 super() 之前，先创建 actionRegistry\n    // 注意：TypeScript 要求在访问 this 之前必须先调用 super()\n    // 所以我们需要在 super() 之后立即初始化，但在 MessageBridge 握手之前\n    \n    // 2. 调用父类构造函数（会初始化 MessageBridge 并开始握手）\n    super(options)\n    \n    // 3. 立即创建 actionRegistry\n    this.actionRegistry = new DynamicActionRegistry<ActionMap>()\n    \n    // 4. 如果提供了初始 actionMap，则立即注册它们\n    // 这样可以确保在握手完成前，所有 actions 都已准备好\n    if (options.actionMap) {\n      this.registerActions(options.actionMap)\n    }\n\n    this.logger.info('Remote initialized with dynamic action support')\n  }\n\n  /**\n   * 注册单个 action\n   */\n  registerAction<K extends keyof ActionMap>(name: K, handler: ActionMap[K]): void {\n    this.actionRegistry.register(name, handler)\n    this.notifyActionChange('registered', name)\n  }\n\n  /**\n   * 批量注册 actions\n   */\n  registerActions(actions: Partial<ActionMap>): void {\n    for (const [name, handler] of Object.entries(actions)) {\n      this.actionRegistry.register(name as keyof ActionMap, handler as ActionMap[keyof ActionMap])\n    }\n    this.notifyActionChange('batch_registered', Object.keys(actions))\n  }\n\n  /**\n   * 移除单个 action\n   */\n  unregisterAction<K extends keyof ActionMap>(name: K): boolean {\n    const removed = this.actionRegistry.unregister(name)\n    if (removed) {\n      this.notifyActionChange('unregistered', name)\n    }\n    return removed\n  }\n\n  /**\n   * 批量移除 actions\n   */\n  unregisterActions(names: (keyof ActionMap)[]): number {\n    let removedCount = 0\n    for (const name of names) {\n      if (this.actionRegistry.unregister(name)) {\n        removedCount++\n      }\n    }\n    \n    if (removedCount > 0) {\n      this.notifyActionChange('batch_unregistered', names)\n    }\n    \n    return removedCount\n  }\n\n  /**\n   * 检查 action 是否已注册\n   */\n  hasAction<K extends keyof ActionMap>(name: K): boolean {\n    return this.actionRegistry.has(name)\n  }\n\n  /**\n   * 获取已注册的 action 列表\n   */\n  getRegisteredActions(): (keyof ActionMap)[] {\n    return this.actionRegistry.getRegisteredActions()\n  }\n\n  /**\n   * 清空所有 actions\n   */\n  clearActions(): void {\n    const count = this.actionRegistry.size\n    this.actionRegistry.clear()\n    this.notifyActionChange('cleared', count)\n  }\n\n  /**\n   * 监听 action 变化事件\n   */\n  onActionChange(callback: (event: ActionChangeEvent<ActionMap>) => void): () => void {\n    const handler = (event: Event) => {\n      if (event instanceof CustomEvent) {\n        callback(event.detail)\n      }\n    }\n    \n    this.addEventListener('action.change', handler)\n    \n    return () => {\n      this.removeEventListener('action.change', handler)\n    }\n  }\n\n  /**\n   * 监听特定 action 的可用性变化\n   */\n  onActionAvailabilityChange<K extends keyof ActionMap>(\n    actionName: K, \n    callback: (available: boolean) => void\n  ): () => void {\n    const handler = (event: Event) => {\n      if (event instanceof CustomEvent) {\n        const eventData = event.detail as ActionChangeEvent<ActionMap>\n        if (eventData.actionName.includes(actionName) || eventData.type === 'batch_registered' || eventData.type === 'batch_unregistered') {\n          callback(this.hasAction(actionName))\n        }\n      }\n    }\n    \n    this.addEventListener('action.change', handler)\n    \n    return () => {\n      this.removeEventListener('action.change', handler)\n    }\n  }\n\n  /**\n   * 获取 action 统计信息\n   */\n  getActionStats(): ActionStats {\n    return {\n      total: this.actionRegistry.size,\n      registered: this.actionRegistry.getRegisteredActions(),\n      timestamp: Date.now()\n    }\n  }\n\n  /**\n   * 通知 action 变化\n   */\n  private notifyActionChange(type: ActionChangeType, actionName: keyof ActionMap | (keyof ActionMap)[] | number): void {\n    const event: ActionChangeEvent<ActionMap> = {\n      type,\n      actionName: Array.isArray(actionName) ? actionName : [actionName as keyof ActionMap],\n      timestamp: Date.now(),\n      stats: this.getActionStats()\n    }\n\n    // 内部事件通知\n    this.dispatchCustomEvent('action.change', event)\n    \n    // 根据类型发送对应的 SDK 事件\n    switch (type) {\n      case 'registered':\n        this.sendEvent('sdk.availability.action.registered', event)\n        break\n      case 'unregistered':\n        this.sendEvent('sdk.availability.action.unregistered', event)\n        break\n      case 'batch_registered':\n        this.sendEvent('sdk.availability.action.batch_registered', event)\n        break\n      case 'batch_unregistered':\n        this.sendEvent('sdk.availability.action.batch_unregistered', event)\n        break\n      case 'cleared':\n        this.sendEvent('sdk.availability.action.cleared', event)\n        break\n    }\n  }\n\n  /**\n   * 重写基类的 action 处理逻辑\n   */\n  protected async handleActionRequest(actionName: string, data: any): Promise<any> {\n    if (!this.actionRegistry.has(actionName as keyof ActionMap)) {\n      const error = new Error(`Action '${actionName}' is not registered`)\n      this.logger.error(`Action request failed: ${error.message}`)\n      throw error\n    }\n\n    return this.actionRegistry.execute(actionName as keyof ActionMap, data)\n  }\n\n  /**\n   * 获取 action 注册器实例（用于高级操作）\n   */\n  getActionRegistry(): DynamicActionRegistry<ActionMap> {\n    return this.actionRegistry\n  }\n}\n\n/**\n * Action 变化事件类型\n */\nexport type ActionChangeType = 'registered' | 'unregistered' | 'batch_registered' | 'batch_unregistered' | 'cleared'\n\n/**\n * Action 变化事件\n */\nexport interface ActionChangeEvent<ActionMap extends BaseMap> {\n  type: ActionChangeType\n  actionName: (keyof ActionMap)[]\n  timestamp: number\n  stats: ActionStats\n}\n\n/**\n * Action 统计信息\n */\nexport interface ActionStats {\n  total: number\n  registered: (string | number | symbol)[]\n  timestamp: number\n}\n\nexport { Remote }\nexport type { DynamicActionRegistry }\n","/**\n * 统一的事件类型定义\n * 明确区分 inner、SDK 和注册的事件类型\n */\n\n/**\n * 事件类型分类\n */\nexport enum EventCategory {\n  /** 内部事件 - SDK 内部使用，开发者通常不需要监听 */\n  INNER = 'inner',\n  /** SDK 事件 - SDK 提供的标准事件，开发者可以监听 */\n  SDK = 'sdk',\n  /** 注册事件 - 开发者注册的自定义事件 */\n  REGISTERED = 'registered'\n}\n\n/**\n * 事件命名空间\n */\nexport enum EventNamespace {\n  /** 连接相关事件 */\n  CONNECTION = 'connection',\n  /** 状态相关事件 */\n  STATE = 'state',\n  /** 消息相关事件 */\n  MESSAGE = 'message',\n  /** 动作相关事件 */\n  ACTION = 'action',\n  /** 标签相关事件 */\n  TAG = 'tag',\n  /** 监控相关事件 */\n  MONITOR = 'monitor',\n  /** 相机相关事件 */\n  CAMERA = 'camera',\n  /** 覆盖层相关事件 */\n  OVERLAY = 'overlay',\n  /** 自定义事件 */\n  CUSTOM = 'custom'\n}\n\n/**\n * 统一的事件类型枚举\n * 使用命名空间前缀明确事件来源和分类\n */\nexport enum EventType {\n  // ==================== INNER 事件（SDK 内部使用）====================\n  \n  // 连接内部事件\n  INNER_CONNECTION_HANDSHAKE = 'inner.connection.handshake',\n  INNER_CONNECTION_HANDSHAKE_SUCCESS = 'inner.connection.handshake.success',\n  INNER_CONNECTION_HANDSHAKE_FAIL = 'inner.connection.handshake.fail',\n  INNER_CONNECTION_RECONNECT = 'inner.connection.reconnect',\n  \n  // 消息内部事件\n  INNER_MESSAGE_QUEUED = 'inner.message.queued',\n  INNER_MESSAGE_SENT = 'inner.message.sent',\n  INNER_MESSAGE_RECEIVED = 'inner.message.received',\n  INNER_MESSAGE_ERROR = 'inner.message.error',\n  \n  // 动作内部事件\n  INNER_ACTION_REQUEST = 'inner.action.request',\n  INNER_ACTION_RESPONSE = 'inner.action.response',\n  INNER_ACTION_TIMEOUT = 'inner.action.timeout',\n  INNER_ACTION_ERROR = 'inner.action.error',\n  \n  // ==================== SDK 事件（开发者可以监听）====================\n  \n  // 连接状态事件\n  SDK_CONNECTION_CONNECT = 'sdk.connection.connect',\n  SDK_CONNECTION_DISCONNECT = 'sdk.connection.disconnect',\n  SDK_CONNECTION_RECONNECT = 'sdk.connection.reconnect',\n  SDK_CONNECTION_ERROR = 'sdk.connection.error',\n  SDK_CONNECTION_STATUS_CHANGE = 'sdk.connection.status.change',\n  \n  // 生命周期事件\n  SDK_LIFECYCLE_READY = 'sdk.lifecycle.ready',\n  SDK_LIFECYCLE_DESTROY = 'sdk.lifecycle.destroy',\n  SDK_LIFECYCLE_STATE_CHANGE = 'sdk.lifecycle.state.change',\n  \n  // 消息事件\n  SDK_MESSAGE_SENT = 'sdk.message.sent',\n  SDK_MESSAGE_RECEIVED = 'sdk.message.received',\n  SDK_MESSAGE_ERROR = 'sdk.message.error',\n  \n  // 动作事件\n  SDK_ACTION_EXECUTED = 'sdk.action.executed',\n  SDK_ACTION_SUCCESS = 'sdk.action.success',\n  SDK_ACTION_FAILED = 'sdk.action.failed',\n  SDK_ACTION_TIMEOUT = 'sdk.action.timeout',\n  SDK_ACTION_ABORTED = 'sdk.action.aborted',\n  \n  // 可用性事件\n  SDK_AVAILABILITY_ACTION_REGISTERED = 'sdk.availability.action.registered',\n  SDK_AVAILABILITY_ACTION_UNREGISTERED = 'sdk.availability.action.unregistered',\n  SDK_AVAILABILITY_ACTION_BATCH_REGISTERED = 'sdk.availability.action.batch.registered',\n  SDK_AVAILABILITY_ACTION_BATCH_UNREGISTERED = 'sdk.availability.action.batch.unregistered',\n  SDK_AVAILABILITY_ACTION_CLEARED = 'sdk.availability.action.cleared',\n  \n  // ==================== 注册事件（开发者注册的自定义事件）====================\n  \n  // 状态同步事件\n  REGISTERED_STATE_SYNCED = 'registered.state.synced',\n  \n  // 相机事件\n  REGISTERED_CAMERA_UPDATE = 'registered.camera.update',\n  \n  // 标签事件\n  REGISTERED_TAG_CLICK = 'registered.tag.click',\n  REGISTERED_TAG_LIST_RETRIEVED = 'registered.tag.list.retrieved',\n  REGISTERED_TAG_LIST_ERROR = 'registered.tag.list.error',\n  \n  // 监控事件\n  REGISTERED_MONITOR_OPEN = 'registered.monitor.open',\n  REGISTERED_MONITOR_CLOSE = 'registered.monitor.close',\n  \n  // 覆盖层事件\n  REGISTERED_OVERLAY_VISIBLE = 'registered.overlay.visible',\n  \n  // 自定义事件（开发者可以扩展）\n  REGISTERED_CUSTOM = 'registered.custom'\n}\n\n/**\n * 事件类型分组\n */\nexport const EventTypeGroups = {\n  /** 内部事件组 */\n  INNER: [\n    EventType.INNER_CONNECTION_HANDSHAKE,\n    EventType.INNER_CONNECTION_HANDSHAKE_SUCCESS,\n    EventType.INNER_CONNECTION_HANDSHAKE_FAIL,\n    EventType.INNER_CONNECTION_RECONNECT,\n    EventType.INNER_MESSAGE_QUEUED,\n    EventType.INNER_MESSAGE_SENT,\n    EventType.INNER_MESSAGE_RECEIVED,\n    EventType.INNER_MESSAGE_ERROR,\n    EventType.INNER_ACTION_REQUEST,\n    EventType.INNER_ACTION_RESPONSE,\n    EventType.INNER_ACTION_TIMEOUT,\n    EventType.INNER_ACTION_ERROR\n  ],\n  \n  /** SDK 事件组 */\n  SDK: [\n    EventType.SDK_CONNECTION_CONNECT,\n    EventType.SDK_CONNECTION_DISCONNECT,\n    EventType.SDK_CONNECTION_RECONNECT,\n    EventType.SDK_CONNECTION_ERROR,\n    EventType.SDK_CONNECTION_STATUS_CHANGE,\n    EventType.SDK_LIFECYCLE_READY,\n    EventType.SDK_LIFECYCLE_DESTROY,\n    EventType.SDK_LIFECYCLE_STATE_CHANGE,\n    EventType.SDK_MESSAGE_SENT,\n    EventType.SDK_MESSAGE_RECEIVED,\n    EventType.SDK_MESSAGE_ERROR,\n    EventType.SDK_ACTION_EXECUTED,\n    EventType.SDK_ACTION_SUCCESS,\n    EventType.SDK_ACTION_FAILED,\n    EventType.SDK_ACTION_TIMEOUT,\n    EventType.SDK_ACTION_ABORTED,\n    EventType.SDK_AVAILABILITY_ACTION_REGISTERED,\n    EventType.SDK_AVAILABILITY_ACTION_UNREGISTERED,\n    EventType.SDK_AVAILABILITY_ACTION_BATCH_REGISTERED,\n    EventType.SDK_AVAILABILITY_ACTION_BATCH_UNREGISTERED,\n    EventType.SDK_AVAILABILITY_ACTION_CLEARED\n  ],\n  \n  /** 注册事件组 */\n  REGISTERED: [\n    EventType.REGISTERED_STATE_SYNCED,\n    EventType.REGISTERED_CAMERA_UPDATE,\n    EventType.REGISTERED_TAG_CLICK,\n    EventType.REGISTERED_TAG_LIST_RETRIEVED,\n    EventType.REGISTERED_TAG_LIST_ERROR,\n    EventType.REGISTERED_MONITOR_OPEN,\n    EventType.REGISTERED_MONITOR_CLOSE,\n    EventType.REGISTERED_OVERLAY_VISIBLE,\n    EventType.REGISTERED_CUSTOM\n  ]\n} as const\n\n/**\n * 事件类型工具函数\n */\nexport class EventTypeUtils {\n  /**\n   * 检查事件类型是否属于指定分类\n   */\n  static isEventOfCategory(eventType: string, category: EventCategory): boolean {\n    return eventType.startsWith(`${category}.`)\n  }\n  \n  /**\n   * 检查事件类型是否属于指定命名空间\n   */\n  static isEventOfNamespace(eventType: string, namespace: EventNamespace): boolean {\n    return eventType.includes(`.${namespace}.`)\n  }\n  \n  /**\n   * 获取事件分类\n   */\n  static getEventCategory(eventType: string): EventCategory | null {\n    if (eventType.startsWith('inner.')) return EventCategory.INNER\n    if (eventType.startsWith('sdk.')) return EventCategory.SDK\n    if (eventType.startsWith('registered.')) return EventCategory.REGISTERED\n    return null\n  }\n  \n  /**\n   * 获取事件命名空间\n   */\n  static getEventNamespace(eventType: string): EventNamespace | null {\n    for (const namespace of Object.values(EventNamespace)) {\n      if (eventType.includes(`.${namespace}.`)) {\n        return namespace\n      }\n    }\n    return null\n  }\n  \n  /**\n   * 检查事件类型是否为内部事件\n   */\n  static isInnerEvent(eventType: string): boolean {\n    return this.isEventOfCategory(eventType, EventCategory.INNER)\n  }\n  \n  /**\n   * 检查事件类型是否为 SDK 事件\n   */\n  static isSDKEvent(eventType: string): boolean {\n    return this.isEventOfCategory(eventType, EventCategory.SDK)\n  }\n  \n  /**\n   * 检查事件类型是否为注册事件\n   */\n  static isRegisteredEvent(eventType: string): boolean {\n    return this.isEventOfCategory(eventType, EventCategory.REGISTERED)\n  }\n  \n    /**\n   * 获取所有内部事件类型\n   */\n  static getInnerEventTypes(): string[] {\n    return [...EventTypeGroups.INNER]\n  }\n\n  /**\n   * 获取所有 SDK 事件类型\n   */\n  static getSDKEventTypes(): string[] {\n    return [...EventTypeGroups.SDK]\n  }\n\n  /**\n   * 获取所有注册事件类型\n   */\n  static getRegisteredEventTypes(): string[] {\n    return [...EventTypeGroups.REGISTERED]\n  }\n\n  /**\n   * 获取指定分类的所有事件类型\n   */\n  static getEventTypesByCategory(category: EventCategory): string[] {\n    switch (category) {\n      case EventCategory.INNER:\n        return [...EventTypeGroups.INNER]\n      case EventCategory.SDK:\n        return [...EventTypeGroups.SDK]\n      case EventCategory.REGISTERED:\n        return [...EventTypeGroups.REGISTERED]\n      default:\n        return []\n    }\n  }\n  \n  /**\n   * 获取指定命名空间的所有事件类型\n   */\n  static getEventTypesByNamespace(namespace: EventNamespace): string[] {\n    return Object.values(EventType).filter(eventType => \n      this.isEventOfNamespace(eventType, namespace)\n    )\n  }\n}\n\n/**\n * 向后兼容的事件类型别名\n * @deprecated 使用 EventType 枚举替代\n */\nexport const LegacyEventType = {\n  // 连接相关事件\n  CONNECT: EventType.SDK_CONNECTION_CONNECT,\n  DISCONNECT: EventType.SDK_CONNECTION_DISCONNECT,\n  RECONNECT: EventType.SDK_CONNECTION_RECONNECT,\n  ERROR: EventType.SDK_CONNECTION_ERROR,\n  \n  // 状态相关事件\n  READY: EventType.SDK_LIFECYCLE_READY,\n  STATE_CHANGE: EventType.SDK_LIFECYCLE_STATE_CHANGE,\n  \n  // 消息相关事件\n  MESSAGE: EventType.SDK_MESSAGE_RECEIVED,\n  ACTION_REQUEST: EventType.INNER_ACTION_REQUEST,\n  ACTION_RESPONSE: EventType.INNER_ACTION_RESPONSE,\n  \n  // 自定义事件\n  CUSTOM: EventType.REGISTERED_CUSTOM\n} as const\n\n/**\n * 事件类型导出\n */\nexport {\n  EventType as StandardEventType,\n  EventTypeGroups as StandardEventTypeGroups,\n  EventTypeUtils as StandardEventTypeUtils\n}\n","/**\n * 1.x 版本兼容性配置\n * 用于与旧版本 SDK 进行通信\n */\n\nimport { BaseOptions } from './types'\nimport { BaseMap } from './types'\n\n/**\n * 获取 1.x 版本兼容的安全配置\n * 禁用严格的安全验证以支持通配符通信\n */\nexport function getV1CompatibilityConfig(): BaseOptions<BaseMap>['security'] {\n  return {\n    strictMode: false,        // 禁用严格模式\n    validateOrigin: false,   // 禁用来源验证\n    validateSignature: false, // 禁用签名验证\n    allowedOrigins: ['*']     // 允许所有域名\n  }\n}\n\n/**\n * 获取混合环境配置\n * 在开发环境中保持宽松，生产环境中保持严格\n */\nexport function getMixedEnvironmentConfig(isDevelopment: boolean = true): BaseOptions<BaseMap>['security'] {\n  if (isDevelopment) {\n    return {\n      strictMode: false,\n      validateOrigin: false,\n      validateSignature: false\n    }\n  } else {\n    return {\n      strictMode: true,\n      validateOrigin: true,\n      validateSignature: false // 生产环境建议启用\n    }\n  }\n}\n\n/**\n * 检测是否为 1.x 版本环境\n * 通过检查 window 对象上的特定属性来判断\n */\nexport function isV1Environment(): boolean {\n  // 检查是否存在 1.x 版本的特征\n  return !!(window as any).RealseeVRSignalsClientV1 || \n         !!(window as any).__REALSEE_VR_SIGNALS_V1__\n}\n\n/**\n * 自动获取兼容性配置\n * 根据环境自动选择合适的配置\n */\nexport function getAutoCompatibilityConfig(): BaseOptions<BaseMap>['security'] {\n  const isV1 = isV1Environment()\n  const isDev = process.env.NODE_ENV === 'development' || \n                window.location.hostname === 'localhost' ||\n                window.location.hostname === '127.0.0.1'\n  \n  if (isV1) {\n    return getV1CompatibilityConfig()\n  } else if (isDev) {\n    return getMixedEnvironmentConfig(true)\n  } else {\n    return getMixedEnvironmentConfig(false)\n  }\n}\n","/**\n * 兼容性层\n * \n * 提供 1.x 和 2.x 版本之间的兼容性支持\n * \n * @fileoverview 兼容性适配器和配置\n * @author Realsee\n * @version 2.0\n * @license MIT\n */\n\nimport type { SecurityConfig } from './types'\n\n/**\n * 获取 1.x 版本的兼容配置\n * \n * 当 Remote 端使用 2.x 版本，需要与 1.x 版本的 Client 通信时使用此配置\n * \n * @returns 兼容 1.x 的安全配置\n * \n * @example\n * ```typescript\n * import { RealseeVRSignalsRemote, getV1CompatibilityConfig } from '@realsee/vr-signals'\n * \n * const remote = new RealseeVRSignalsRemote({\n *   logLevel: 'INFO',\n *   security: getV1CompatibilityConfig(),\n *   actionMap: {\n *     setState(data) {\n *       return { success: true }\n *     }\n *   }\n * })\n * ```\n */\nexport function getV1CompatibilityConfig(): SecurityConfig {\n  return {\n    // 禁用严格模式，允许宽松的验证\n    strictMode: false,\n    \n    // 禁用来源验证，允许任何来源的消息\n    validateOrigin: false,\n    \n    // 禁用签名验证，1.x 版本不支持签名\n    validateSignature: false,\n    \n    // 允许所有来源\n    allowedOrigins: ['*'],\n    \n    // 允许通配符域名\n    allowWildcardDomains: true\n  }\n}\n\n/**\n * 获取自动兼容配置\n * \n * 自动检测并配置兼容性，平衡安全性和兼容性\n * \n * @returns 自动兼容配置\n * \n * @example\n * ```typescript\n * import { RealseeVRSignalsRemote, getAutoCompatibilityConfig } from '@realsee/vr-signals'\n * \n * const remote = new RealseeVRSignalsRemote({\n *   security: getAutoCompatibilityConfig()\n * })\n * ```\n */\nexport function getAutoCompatibilityConfig(): SecurityConfig {\n  // 如果在开发环境，使用完全兼容配置\n  const isDevelopment = process.env.NODE_ENV === 'development' || \n                        typeof window !== 'undefined' && window.location?.hostname === 'localhost'\n  \n  if (isDevelopment) {\n    return getV1CompatibilityConfig()\n  }\n  \n  // 生产环境使用中等安全配置\n  return {\n    strictMode: false,\n    validateOrigin: true, // 启用来源验证\n    validateSignature: false,\n    allowedOrigins: ['*'],\n    allowWildcardDomains: true\n  }\n}\n\n/**\n * 获取 2.x 版本的默认配置\n * \n * 用于 2.x Client 和 2.x Remote 之间的通信\n * 提供更高的安全性\n * \n * @param signatureKey 签名密钥（可选）\n * @returns 2.x 默认安全配置\n * \n * @example\n * ```typescript\n * import { RealseeVRSignalsRemote, getV2DefaultConfig } from '@realsee/vr-signals'\n * \n * const remote = new RealseeVRSignalsRemote({\n *   security: getV2DefaultConfig('my-secret-key')\n * })\n * ```\n */\nexport function getV2DefaultConfig(signatureKey?: string): SecurityConfig {\n  return {\n    strictMode: true,\n    validateOrigin: true,\n    validateSignature: !!signatureKey,\n    signatureKey: signatureKey,\n    allowedOrigins: [], // 空数组表示仅允许父子窗口通信\n    allowWildcardDomains: false\n  }\n}\n\n/**\n * 检测消息是否来自 1.x 版本的 Client\n * \n * @param message 消息对象\n * @returns 是否来自 1.x Client\n */\nexport function isV1Message(message: any): boolean {\n  // 1.x 版本的特征：\n  // 1. 消息结构完整（type, uid, payload, fromId, toId, timestamp）\n  // 2. 没有 version 字段\n  // 3. 没有 signature 字段\n  \n  if (!message || typeof message !== 'object') {\n    return false\n  }\n  \n  const hasBasicFields = \n    'type' in message &&\n    'uid' in message &&\n    'payload' in message &&\n    'fromId' in message &&\n    'toId' in message &&\n    'timestamp' in message\n  \n  const hasV2Fields = 'version' in message || 'signature' in message\n  \n  return hasBasicFields && !hasV2Fields\n}\n\n/**\n * 检测消息是否来自 2.x 版本的 Client\n * \n * @param message 消息对象\n * @returns 是否来自 2.x Client\n */\nexport function isV2Message(message: any): boolean {\n  // 2.x 版本的特征：\n  // 1. 消息结构完整\n  // 2. 有 version 字段且值为 '2.x'\n  \n  if (!message || typeof message !== 'object') {\n    return false\n  }\n  \n  return 'version' in message && \n         (message.version === '2.0' || message.version?.startsWith('2.'))\n}\n\n/**\n * 适配 1.x 消息到 2.x 格式\n * \n * @param message 1.x 消息\n * @returns 2.x 格式的消息\n */\nexport function adaptV1ToV2Message(message: any): any {\n  // 1.x 和 2.x 的消息格式基本兼容\n  // 只需要添加 version 字段\n  return {\n    ...message,\n    version: '1.0' // 标记为来自 1.x\n  }\n}\n\n/**\n * 适配 2.x 消息到 1.x 格式\n * \n * @param message 2.x 消息\n * @returns 1.x 格式的消息\n */\nexport function adaptV2ToV1Message(message: any): any {\n  // 移除 2.x 特有的字段\n  const { version, signature, ...v1Message } = message\n  return v1Message\n}\n\n/**\n * 兼容性检查结果\n */\nexport interface CompatibilityCheckResult {\n  /** 是否兼容 */\n  compatible: boolean\n  /** 检测到的版本 */\n  version: '1.x' | '2.x' | 'unknown'\n  /** 建议的配置 */\n  suggestedConfig: SecurityConfig\n  /** 警告信息 */\n  warnings: string[]\n}\n\n/**\n * 检查兼容性并提供建议\n * \n * @param remoteVersion Remote 端版本\n * @param clientVersion Client 端版本（如果已知）\n * @returns 兼容性检查结果\n * \n * @example\n * ```typescript\n * const result = checkCompatibility('2.0', '1.0')\n * if (result.compatible) {\n *   console.log('兼容，使用配置:', result.suggestedConfig)\n * } else {\n *   console.warn('不兼容，警告:', result.warnings)\n * }\n * ```\n */\nexport function checkCompatibility(\n  remoteVersion: string,\n  clientVersion?: string\n): CompatibilityCheckResult {\n  const result: CompatibilityCheckResult = {\n    compatible: true,\n    version: 'unknown',\n    suggestedConfig: getV1CompatibilityConfig(),\n    warnings: []\n  }\n  \n  // 解析版本号\n  const remoteMajor = parseInt(remoteVersion.split('.')[0])\n  const clientMajor = clientVersion ? parseInt(clientVersion.split('.')[0]) : null\n  \n  // 场景 1: Remote 2.x + Client 1.x\n  if (remoteMajor === 2 && clientMajor === 1) {\n    result.version = '1.x'\n    result.suggestedConfig = getV1CompatibilityConfig()\n    result.warnings.push('Remote 2.x 与 Client 1.x 通信，建议使用 getV1CompatibilityConfig()')\n  }\n  // 场景 2: Remote 1.x + Client 2.x\n  else if (remoteMajor === 1 && clientMajor === 2) {\n    result.version = '1.x'\n    result.compatible = true\n    result.warnings.push('Client 2.x 可以正常与 Remote 1.x 通信，无需特殊配置')\n  }\n  // 场景 3: Remote 2.x + Client 2.x\n  else if (remoteMajor === 2 && clientMajor === 2) {\n    result.version = '2.x'\n    result.suggestedConfig = getV2DefaultConfig()\n    result.warnings.push('Remote 2.x 与 Client 2.x 通信，可以使用更高安全配置')\n  }\n  // 场景 4: Remote 1.x + Client 1.x\n  else if (remoteMajor === 1 && clientMajor === 1) {\n    result.version = '1.x'\n    result.compatible = true\n  }\n  // 场景 5: Remote 2.x + Client 未知\n  else if (remoteMajor === 2 && !clientMajor) {\n    result.version = 'unknown'\n    result.suggestedConfig = getAutoCompatibilityConfig()\n    result.warnings.push('Client 版本未知，使用自动兼容配置')\n  }\n  \n  return result\n}\n\n/**\n * 创建兼容性日志记录器\n * \n * @param remoteVersion Remote 版本\n * @param clientVersion Client 版本\n */\nexport function logCompatibilityInfo(\n  remoteVersion: string,\n  clientVersion?: string\n): void {\n  const result = checkCompatibility(remoteVersion, clientVersion)\n  \n  console.group('🔄 VR Signals 兼容性信息')\n  console.log(`Remote 版本: ${remoteVersion}`)\n  console.log(`Client 版本: ${clientVersion || '未知'}`)\n  console.log(`兼容性: ${result.compatible ? '✅ 兼容' : '❌ 不兼容'}`)\n  console.log(`检测版本: ${result.version}`)\n  \n  if (result.warnings.length > 0) {\n    console.warn('警告:')\n    result.warnings.forEach(warning => console.warn(`  - ${warning}`))\n  }\n  \n  console.log('建议配置:', result.suggestedConfig)\n  console.groupEnd()\n}\n\n"]}