{"version":3,"file":"logs.cjs","sources":["../../../node_modules/.pnpm/loglevel@1.9.2/node_modules/loglevel/lib/loglevel.js","../../common/serializeLogContent.js","../../common/utils.js","../../core/logs.js"],"sourcesContent":["/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n    \"use strict\";\n    if (typeof define === 'function' && define.amd) {\n        define(definition);\n    } else if (typeof module === 'object' && module.exports) {\n        module.exports = definition();\n    } else {\n        root.log = definition();\n    }\n}(this, function () {\n    \"use strict\";\n\n    // Slightly dubious tricks to cut down minimized file size\n    var noop = function() {};\n    var undefinedType = \"undefined\";\n    var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n        /Trident\\/|MSIE /.test(window.navigator.userAgent)\n    );\n\n    var logMethods = [\n        \"trace\",\n        \"debug\",\n        \"info\",\n        \"warn\",\n        \"error\"\n    ];\n\n    var _loggersByName = {};\n    var defaultLogger = null;\n\n    // Cross-browser bind equivalent that works at least back to IE6\n    function bindMethod(obj, methodName) {\n        var method = obj[methodName];\n        if (typeof method.bind === 'function') {\n            return method.bind(obj);\n        } else {\n            try {\n                return Function.prototype.bind.call(method, obj);\n            } catch (e) {\n                // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n                return function() {\n                    return Function.prototype.apply.apply(method, [obj, arguments]);\n                };\n            }\n        }\n    }\n\n    // Trace() doesn't print the message in IE, so for that case we need to wrap it\n    function traceForIE() {\n        if (console.log) {\n            if (console.log.apply) {\n                console.log.apply(console, arguments);\n            } else {\n                // In old IE, native console methods themselves don't have apply().\n                Function.prototype.apply.apply(console.log, [console, arguments]);\n            }\n        }\n        if (console.trace) console.trace();\n    }\n\n    // Build the best logging method possible for this env\n    // Wherever possible we want to bind, not wrap, to preserve stack traces\n    function realMethod(methodName) {\n        if (methodName === 'debug') {\n            methodName = 'log';\n        }\n\n        if (typeof console === undefinedType) {\n            return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n        } else if (methodName === 'trace' && isIE) {\n            return traceForIE;\n        } else if (console[methodName] !== undefined) {\n            return bindMethod(console, methodName);\n        } else if (console.log !== undefined) {\n            return bindMethod(console, 'log');\n        } else {\n            return noop;\n        }\n    }\n\n    // These private functions always need `this` to be set properly\n\n    function replaceLoggingMethods() {\n        /*jshint validthis:true */\n        var level = this.getLevel();\n\n        // Replace the actual methods.\n        for (var i = 0; i < logMethods.length; i++) {\n            var methodName = logMethods[i];\n            this[methodName] = (i < level) ?\n                noop :\n                this.methodFactory(methodName, level, this.name);\n        }\n\n        // Define log.log as an alias for log.debug\n        this.log = this.debug;\n\n        // Return any important warnings.\n        if (typeof console === undefinedType && level < this.levels.SILENT) {\n            return \"No console available for logging\";\n        }\n    }\n\n    // In old IE versions, the console isn't present until you first open it.\n    // We build realMethod() replacements here that regenerate logging methods\n    function enableLoggingWhenConsoleArrives(methodName) {\n        return function () {\n            if (typeof console !== undefinedType) {\n                replaceLoggingMethods.call(this);\n                this[methodName].apply(this, arguments);\n            }\n        };\n    }\n\n    // By default, we use closely bound real methods wherever possible, and\n    // otherwise we wait for a console to appear, and then try again.\n    function defaultMethodFactory(methodName, _level, _loggerName) {\n        /*jshint validthis:true */\n        return realMethod(methodName) ||\n               enableLoggingWhenConsoleArrives.apply(this, arguments);\n    }\n\n    function Logger(name, factory) {\n      // Private instance variables.\n      var self = this;\n      /**\n       * The level inherited from a parent logger (or a global default). We\n       * cache this here rather than delegating to the parent so that it stays\n       * in sync with the actual logging methods that we have installed (the\n       * parent could change levels but we might not have rebuilt the loggers\n       * in this child yet).\n       * @type {number}\n       */\n      var inheritedLevel;\n      /**\n       * The default level for this logger, if any. If set, this overrides\n       * `inheritedLevel`.\n       * @type {number|null}\n       */\n      var defaultLevel;\n      /**\n       * A user-specific level for this logger. If set, this overrides\n       * `defaultLevel`.\n       * @type {number|null}\n       */\n      var userLevel;\n\n      var storageKey = \"loglevel\";\n      if (typeof name === \"string\") {\n        storageKey += \":\" + name;\n      } else if (typeof name === \"symbol\") {\n        storageKey = undefined;\n      }\n\n      function persistLevelIfPossible(levelNum) {\n          var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n          if (typeof window === undefinedType || !storageKey) return;\n\n          // Use localStorage if available\n          try {\n              window.localStorage[storageKey] = levelName;\n              return;\n          } catch (ignore) {}\n\n          // Use session cookie as fallback\n          try {\n              window.document.cookie =\n                encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n          } catch (ignore) {}\n      }\n\n      function getPersistedLevel() {\n          var storedLevel;\n\n          if (typeof window === undefinedType || !storageKey) return;\n\n          try {\n              storedLevel = window.localStorage[storageKey];\n          } catch (ignore) {}\n\n          // Fallback to cookies if local storage gives us nothing\n          if (typeof storedLevel === undefinedType) {\n              try {\n                  var cookie = window.document.cookie;\n                  var cookieName = encodeURIComponent(storageKey);\n                  var location = cookie.indexOf(cookieName + \"=\");\n                  if (location !== -1) {\n                      storedLevel = /^([^;]+)/.exec(\n                          cookie.slice(location + cookieName.length + 1)\n                      )[1];\n                  }\n              } catch (ignore) {}\n          }\n\n          // If the stored level is not valid, treat it as if nothing was stored.\n          if (self.levels[storedLevel] === undefined) {\n              storedLevel = undefined;\n          }\n\n          return storedLevel;\n      }\n\n      function clearPersistedLevel() {\n          if (typeof window === undefinedType || !storageKey) return;\n\n          // Use localStorage if available\n          try {\n              window.localStorage.removeItem(storageKey);\n          } catch (ignore) {}\n\n          // Use session cookie as fallback\n          try {\n              window.document.cookie =\n                encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n          } catch (ignore) {}\n      }\n\n      function normalizeLevel(input) {\n          var level = input;\n          if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n              level = self.levels[level.toUpperCase()];\n          }\n          if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n              return level;\n          } else {\n              throw new TypeError(\"log.setLevel() called with invalid level: \" + input);\n          }\n      }\n\n      /*\n       *\n       * Public logger API - see https://github.com/pimterry/loglevel for details\n       *\n       */\n\n      self.name = name;\n\n      self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n          \"ERROR\": 4, \"SILENT\": 5};\n\n      self.methodFactory = factory || defaultMethodFactory;\n\n      self.getLevel = function () {\n          if (userLevel != null) {\n            return userLevel;\n          } else if (defaultLevel != null) {\n            return defaultLevel;\n          } else {\n            return inheritedLevel;\n          }\n      };\n\n      self.setLevel = function (level, persist) {\n          userLevel = normalizeLevel(level);\n          if (persist !== false) {  // defaults to true\n              persistLevelIfPossible(userLevel);\n          }\n\n          // NOTE: in v2, this should call rebuild(), which updates children.\n          return replaceLoggingMethods.call(self);\n      };\n\n      self.setDefaultLevel = function (level) {\n          defaultLevel = normalizeLevel(level);\n          if (!getPersistedLevel()) {\n              self.setLevel(level, false);\n          }\n      };\n\n      self.resetLevel = function () {\n          userLevel = null;\n          clearPersistedLevel();\n          replaceLoggingMethods.call(self);\n      };\n\n      self.enableAll = function(persist) {\n          self.setLevel(self.levels.TRACE, persist);\n      };\n\n      self.disableAll = function(persist) {\n          self.setLevel(self.levels.SILENT, persist);\n      };\n\n      self.rebuild = function () {\n          if (defaultLogger !== self) {\n              inheritedLevel = normalizeLevel(defaultLogger.getLevel());\n          }\n          replaceLoggingMethods.call(self);\n\n          if (defaultLogger === self) {\n              for (var childName in _loggersByName) {\n                _loggersByName[childName].rebuild();\n              }\n          }\n      };\n\n      // Initialize all the internal levels.\n      inheritedLevel = normalizeLevel(\n          defaultLogger ? defaultLogger.getLevel() : \"WARN\"\n      );\n      var initialLevel = getPersistedLevel();\n      if (initialLevel != null) {\n          userLevel = normalizeLevel(initialLevel);\n      }\n      replaceLoggingMethods.call(self);\n    }\n\n    /*\n     *\n     * Top-level API\n     *\n     */\n\n    defaultLogger = new Logger();\n\n    defaultLogger.getLogger = function getLogger(name) {\n        if ((typeof name !== \"symbol\" && typeof name !== \"string\") || name === \"\") {\n            throw new TypeError(\"You must supply a name when creating a logger.\");\n        }\n\n        var logger = _loggersByName[name];\n        if (!logger) {\n            logger = _loggersByName[name] = new Logger(\n                name,\n                defaultLogger.methodFactory\n            );\n        }\n        return logger;\n    };\n\n    // Grab the current global log variable in case of overwrite\n    var _log = (typeof window !== undefinedType) ? window.log : undefined;\n    defaultLogger.noConflict = function() {\n        if (typeof window !== undefinedType &&\n               window.log === defaultLogger) {\n            window.log = _log;\n        }\n\n        return defaultLogger;\n    };\n\n    defaultLogger.getLoggers = function getLoggers() {\n        return _loggersByName;\n    };\n\n    // ES6 default export, for compatibility\n    defaultLogger['default'] = defaultLogger;\n\n    return defaultLogger;\n}));\n","// 默认的数组采样规则\nconst ARRAY_SAMPLING_CONFIG = {\n  primitive: {\n    threshold: 20, // 对简单数组保持宽松的阈值\n    head: 10,      // 保留足够的上下文\n    tail: 4,\n    middle: 3\n  },\n  complex: {\n    threshold: 10, // 对复杂数组使用严格的阈值\n    head: 5,       // 采用更保守的采样数\n    tail: 3,\n    middle: 2\n  },\n};\n\n// 序列化后日志字符串的最大长度\nconst MAX_LOG_LENGTH = 100000;\n\n// 策略模式：为浏览器环境中的特定对象类型定义专门的处理器\nconst browserTypeHandlers = new Map();\nif (typeof window !== 'undefined') {\n  // ErrorEvent 处理器\n  browserTypeHandlers.set(window.ErrorEvent, (value, options, currentDepth, seen) => ({\n    _t: 'ErrorEvent',\n    message: value.message,\n    filename: value.filename,\n    lineno: value.lineno,\n    colno: value.colno,\n    error: serializeSingleValue(value.error, options, currentDepth + 1, seen),\n  }));\n\n  // PromiseRejectionEvent 处理器\n  browserTypeHandlers.set(window.PromiseRejectionEvent, (value, options, currentDepth, seen) => ({\n    _t: 'PromiseRejectionEvent',\n    reason: serializeSingleValue(value.reason, options, currentDepth + 1, seen),\n  }));\n\n  // MessageEvent 处理器\n  browserTypeHandlers.set(window.MessageEvent, (value, options, currentDepth, seen) => ({\n    _t: 'MessageEvent',\n    data: serializeSingleValue(value.data, options, currentDepth + 1, seen),\n    origin: value.origin,\n    lastEventId: value.lastEventId,\n    source: '[WindowProxy]', // source 是一个 window proxy, 不能直接序列化\n  }));\n\n  // CloseEvent 处理器\n  browserTypeHandlers.set(window.CloseEvent, (value, options, currentDepth, seen) => ({\n    _t: 'CloseEvent',\n    code: value.code,\n    reason: value.reason,\n    wasClean: value.wasClean,\n  }));\n\n  // CustomEvent 处理器\n  browserTypeHandlers.set(window.CustomEvent, (value, options, currentDepth, seen) => ({\n    _t: 'CustomEvent',\n    type: value.type,\n    detail: serializeSingleValue(value.detail, options, currentDepth + 1, seen),\n    bubbles: value.bubbles,\n    cancelable: value.cancelable,\n    composed: value.composed,\n  }));\n\n  // KeyboardEvent 处理器\n  browserTypeHandlers.set(window.KeyboardEvent, (value, options, currentDepth, seen) => ({\n    _t: 'KeyboardEvent',\n    type: value.type,\n    key: value.key,\n    code: value.code,\n    ctrlKey: value.ctrlKey,\n    shiftKey: value.shiftKey,\n    altKey: value.altKey,\n    metaKey: value.metaKey,\n    repeat: value.repeat,\n    bubbles: value.bubbles,\n    cancelable: value.cancelable,\n  }));\n\n  // InputEvent 处理器\n  browserTypeHandlers.set(window.InputEvent, (value, options, currentDepth, seen) => ({\n    _t: 'InputEvent',\n    type: value.type,\n    inputType: value.inputType,\n    data: value.data,\n    isComposing: value.isComposing,\n    bubbles: value.bubbles,\n    cancelable: value.cancelable,\n  }));\n\n  // StorageEvent 处理器\n  browserTypeHandlers.set(window.StorageEvent, (value, options, currentDepth, seen) => ({\n    _t: 'StorageEvent',\n    type: value.type,\n    key: value.key,\n    newValue: value.newValue,\n    oldValue: value.oldValue,\n    url: value.url,\n    storageArea: '[Storage]', // storageArea 是 Storage 对象，不能直接序列化\n    bubbles: value.bubbles,\n    cancelable: value.cancelable,\n  }));\n}\n\n/**\n * 将任何 JavaScript 内容序列化为截断后的 JSON 字符串。\n * @param {any} content - 需要序列化的内容。\n * @returns {string} 序列化后的 JSON 字符串。\n */\nfunction serializeLogContent(content) {\n  const serializableObject = serializeSingleValue(content);\n\n  try {\n    const result = JSON.stringify(serializableObject);\n\n    // 截断过长的结果\n    return result.length > MAX_LOG_LENGTH ? result.slice(0, MAX_LOG_LENGTH) + '...' : result;\n  } catch (e) {\n    // Fallback for any unexpected stringify errors\n    return `[序列化失败: ${e.message}]`;\n  }\n}\n\n/**\n * 递归地将值转换为可 JSON 序列化的格式。\n * @param {any} value - 需要序列化的值。\n * @param {object} [options={maxDepth: 10, sensitiveKeys: [...]}] - 序列化选项。\n * @param {number} [options.maxDepth=10] - 最大序列化深度。\n * @param {string[]} [options.sensitiveKeys=['password', 'token', 'secret', 'auth']] - 敏感信息的键名。\n * @param {number} [currentDepth=0] - 当前序列化深度，用于递归。\n * @param {WeakSet} [seen=new WeakSet()] - 用于检测循环引用的集合，用于递归。\n * @returns {any} 可序列化的值。\n */\nfunction serializeSingleValue(\n  value,\n  options = {\n    maxDepth: 10,\n    sensitiveKeys: ['password', 'token', 'secret', 'auth'],\n  },\n  currentDepth = 0,\n  seen = new WeakSet(),\n) {\n  const { maxDepth, sensitiveKeys } = options;\n  const type = typeof value;\n\n  // 处理原始类型和 null\n  if (value === null || ['string', 'number', 'boolean', 'undefined'].includes(type)) {\n    return value;\n  }\n\n  // 处理 BigInt\n  if (type === 'bigint') {\n    return `${value.toString()}n`;\n  }\n\n  // 处理 Symbol\n  if (type === 'symbol') {\n    return value.toString();\n  }\n  \n  // 处理函数\n  if (type === 'function') {\n    return `[Function: ${value.name || 'anonymous'}]`;\n  }\n\n  // --- 对象类型处理开始 ---\n\n  // 检查循环引用\n  if (typeof value === 'object') {\n    if (seen.has(value)) {\n      return '[循环引用]';\n    }\n    seen.add(value);\n  }\n\n  // 检查最大深度\n  if (currentDepth >= maxDepth) {\n    return `[达到最大深度: ${Object.prototype.toString.call(value)}]`;\n  }\n\n  // 处理特殊对象类型\n  // 检查是否有专门的类型处理器（策略模式）\n  for (const [typeConstructor, handler] of browserTypeHandlers.entries()) {\n    if (value instanceof typeConstructor) {\n      return handler(value, options, currentDepth, seen);\n    }\n  }\n\n  if (value instanceof Error) {\n    return `${value.name}: ${value.message}\\nStack: ${value.stack || ''}`;\n  }\n  if (value instanceof Date) {\n    return value.toISOString();\n  }\n  if (value instanceof RegExp) {\n    return value.toString();\n  }\n  if (typeof Map !== 'undefined' && value instanceof Map) {\n    const obj = {};\n    for (const [k, v] of value.entries()) {\n      const keyStr = typeof k === 'object' && k !== null ? '[object]' : String(k);\n      obj[keyStr] = serializeSingleValue(v, options, currentDepth + 1, seen);\n    }\n    return obj;\n  }\n  if (typeof Set !== 'undefined' && value instanceof Set) {\n    const arr = [];\n    for (const v of value.values()) {\n      arr.push(serializeSingleValue(v, options, currentDepth + 1, seen));\n    }\n    return arr;\n  }\n\n  // 处理数组 (包括采样逻辑)\n  if (Array.isArray(value)) {\n    const isComplex = value.length > 0 && typeof value[0] === 'object' && value[0] !== null;\n    const rules = isComplex ? ARRAY_SAMPLING_CONFIG.complex : ARRAY_SAMPLING_CONFIG.primitive;\n\n    // 卫语句：如果未达到采样阈值，则正常处理并提前返回\n    if (value.length <= rules.threshold) {\n      return value.map(item => serializeSingleValue(item, options, currentDepth + 1, seen));\n    }\n\n    // --- 采样逻辑开始 ---\n    const sampledResult = { _t: 'arr', _l: value.length, _e: {} };\n    const indices = new Set();\n\n    // Head\n    for (let i = 0; i < rules.head && i < value.length; i++) {\n      indices.add(i);\n    }\n    // Tail\n    for (let i = 0; i < rules.tail && value.length - 1 - i >= 0; i++) {\n      indices.add(value.length - 1 - i);\n    }\n    // Middle\n    const midStart = Math.floor(value.length / 2 - rules.middle / 2);\n    for (let i = 0; i < rules.middle && midStart + i < value.length; i++) {\n      indices.add(midStart + i);\n    }\n\n    const sortedIndices = Array.from(indices).sort((a, b) => a - b);\n    for (const index of sortedIndices) {\n      sampledResult._e[index] = serializeSingleValue(value[index], options, currentDepth + 1, seen);\n    }\n\n    return sampledResult;\n  }\n  \n  // 处理 DOM 元素 (浏览器环境)\n  if (typeof window !== 'undefined' && value instanceof window.Element) {\n    return `<${value.tagName.toLowerCase()} class=\"${value.className}\" id=\"${value.id}\">`;\n  }\n\n  // 处理普通对象\n  if (typeof value === 'object' && value !== null) {\n     // 检查是否有自定义的 toJSON 方法\n    if (typeof value.toJSON === 'function') {\n      return serializeSingleValue(value.toJSON(), options, currentDepth + 1, seen);\n    }\n\n    const result = {};\n    for (const key of Object.keys(value)) {\n      if (sensitiveKeys.includes(key.toLowerCase())) {\n        result[key] = '[敏感信息已过滤]';\n      } else {\n        result[key] = serializeSingleValue(value[key], options, currentDepth + 1, seen);\n      }\n    }\n    return result;\n  }\n\n  // 兜底处理\n  return String(value);\n}\n\nexport {\n  serializeLogContent,\n  serializeSingleValue\n};","import { serializeLogContent, serializeSingleValue } from \"./serializeLogContent.js\";\n\n/**\n * 判断两个时间戳是否为同一天\n * @param {number} ts1 毫秒级时间戳\n * @param {number} ts2 毫秒级时间戳\n * @returns {boolean}\n */\nexport function isSameDay(ts1, ts2) {\n  const d1 = new Date(Number(ts1));\n  const d2 = new Date(Number(ts2));\n  return d1.getFullYear() === d2.getFullYear() && d1.getMonth() === d2.getMonth() && d1.getDate() === d2.getDate();\n}\n\n/**\n * 请求公网IP和地区（使用 geojs）\n * @returns {Promise<{ip?: string, region?: string}>}\n */\nexport async function fetchPublicIPAndRegion() {\n  try {\n    const res = await fetch('https://get.geojs.io/v1/ip/geo.json');\n    if (!res.ok) return {};\n    const data = await res.json();\n    const ip = data.ip;\n    const region = data.country;\n    return { ip, region };\n  } catch (e) {\n    return {};\n  }\n}\n\n/**\n * 生成随机前缀字符串（16位大写十六进制）\n * @returns {string}\n */\nexport function generateRandomPrefix() {\n  let uuid;\n  if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n    uuid = crypto.randomUUID();\n  } else {\n    // 生成 16 字节的随机十六进制字符串\n    const hexChars = '0123456789ABCDEF';\n    uuid = '';\n    for (let i = 0; i < 32; i++) {\n      uuid += hexChars[Math.floor(Math.random() * 16)];\n    }\n  }\n  return uuid.replace(/-/g, '').toUpperCase().substring(0, 16);\n}\n\n/**\n * 生成符合标准UUID v4格式的UUID（fallback方案）\n * @returns {string} 标准UUID v4格式字符串，如：xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\n */\nfunction generateUUIDv4() {\n  // UUID v4格式：xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\n  // 其中第13个字符必须是'4'（版本号），第17个字符必须是'8','9','a'或'b'（变体）\n  const hexChars = '0123456789abcdef';\n  let uuid = '';\n  \n  // 生成32个十六进制字符\n  for (let i = 0; i < 32; i++) {\n    if (i === 12) {\n      // 第13个字符（索引12）必须是'4'（版本号）\n      uuid += '4';\n    } else if (i === 16) {\n      // 第17个字符（索引16）必须是'8','9','a'或'b'（变体）\n      uuid += hexChars[8 + Math.floor(Math.random() * 4)]; // 8, 9, a, b\n    } else {\n      // 其他位置生成随机十六进制字符\n      uuid += hexChars[Math.floor(Math.random() * 16)];\n    }\n  }\n  \n  // 按照标准格式添加连字符：8-4-4-4-12\n  return [\n    uuid.substring(0, 8),\n    uuid.substring(8, 12),\n    uuid.substring(12, 16),\n    uuid.substring(16, 20),\n    uuid.substring(20, 32)\n  ].join('-');\n}\n\n/**\n * 浏览器端获取/生成uuid 如果 window 不存在则返回空字符串\n * @returns {string}\n */\nfunction getOrCreateUUID() {\n  if (typeof window === \"undefined\") return \"\";\n  const key = \"_client_uuid\";\n  let uuid = window.localStorage.getItem(key);\n  if (!uuid) {\n    if (window.crypto && window.crypto.randomUUID) {\n      uuid = window.crypto.randomUUID();\n      window.localStorage.setItem(key, uuid);\n    } else {\n      // fallback生成标准UUID v4格式\n      uuid = generateUUIDv4();\n      window.localStorage.setItem(key, uuid);\n    }\n  }\n  return uuid;\n}\n\n/**\n * 浏览器端获取/生成sessionId 如果 window 不存在则返回空字符串\n * @returns {string}\n */\nfunction getOrCreateSessionId() {\n  if (typeof window === \"undefined\") return \"\";\n  const key = \"_session_id\";\n  let sessionId = window.sessionStorage.getItem(key);\n  if (!sessionId) {\n    sessionId = generateRandomPrefix();\n    window.sessionStorage.setItem(key, sessionId);\n  }\n  return sessionId;\n}\n\n/**\n * 获取日志的附加信息\n * @typedef {Object} LogExtraInfo\n * @property {number} time - 日志生成的时间戳（毫秒级）\n * @property {string} clientUuid - 客户端唯一标识\n * @property {string} userAgent - 用户代理字符串\n * @property {Object} screen - 屏幕信息\n * @property {number} screen.width - 屏幕宽度\n * @property {number} screen.height - 屏幕高度\n * @property {Object} window - 窗口信息\n * @property {number} window.width - 窗口宽度\n * @property {number} window.height - 窗口高度\n * @property {string} url - 当前页面URL\n */\n\n/**\n * @returns {LogExtraInfo|Object} 如果 window 不存在则返回空对象，否则返回日志附加信息\n * @description 获取浏览器环境下的日志附加信息，如果非浏览器环境则返回空对象\n */\nexport function getLogExtraInfo() {\n  if (typeof window === \"undefined\" || typeof window.document === \"undefined\") {\n    return {};\n  }\n  // 过滤扩展属性，只保留有效的字符串值\n  const extendedAttributes = {};\n  if (window.LOGS_CONTEXT && typeof window.LOGS_CONTEXT === 'object') {\n    for (const [key, value] of Object.entries(window.LOGS_CONTEXT)) {\n      if (typeof value === 'string' && value.trim().length > 0) {\n        extendedAttributes[key] = value;\n      }\n    }\n  }\n\n  const base = {\n    time: Date.now(),\n    clientUuid: getOrCreateUUID(),\n    userAgent: window.navigator.userAgent,\n    screen: JSON.stringify(serializeSingleValue({ width: window.screen.width, height: window.screen.height })),\n    window: JSON.stringify(serializeSingleValue({ width: window.innerWidth, height: window.innerHeight })),\n    url: window.location.href,\n    referrer: document.referrer,\n    sessionId: getOrCreateSessionId(),\n    extendedAttributes,\n  };\n  return base;\n}\n\n/**\n * 获取指定作用域的 Service Worker\n * @param {string} scope - Service Worker 的作用域\n * @returns {Promise<ServiceWorker|null>} 激活的 Service Worker 或 null\n */\nexport async function getServiceWorker(scope = '/beacon/') {\n  if (!navigator.serviceWorker) return null;\n  \n  try {\n    const registrations = await navigator.serviceWorker.getRegistrations();\n    // 查找匹配作用域的注册\n    const swRegistration = registrations.find(reg => \n      reg.scope.includes(scope)\n    );\n    if (!swRegistration) return null;\n    \n    // Service Worker 已经激活，直接返回\n    if (swRegistration.active) return swRegistration.active;\n    \n    // 如果同时存在 installing 和 waiting，返回 null\n    if (swRegistration.installing && swRegistration.waiting) return null;\n    \n    // Service Worker is installing or waiting for activation\n    const worker = swRegistration.installing || swRegistration.waiting;\n    if (!worker) return null;\n    \n    // Create a Promise to wait for Service Worker activation\n    const waitForActivation = new Promise((resolve, reject) => {\n      // Listen for state changes\n      worker.addEventListener('statechange', function() {\n        if (this.state === 'activated') {\n          resolve(swRegistration.active);\n        } else if (this.state === 'redundant') {\n          // Service Worker 变为冗余状态（安装失败）\n          reject(new Error('Service Worker installation failed'));\n        }\n      });\n    });\n    \n    // 等待激活，最多等待 60 秒\n    const timeout = new Promise((_, reject) => {\n      setTimeout(() => reject(new Error('Service Worker activation timeout')), 60 * 1000);\n    });\n    \n    return await Promise.race([waitForActivation, timeout]);\n  } catch (e) {\n    console.error('Failed to get Service Worker:', e);\n    return null;\n  }\n}\n\nexport async function sendEvent(msg) {\n  try {\n    // 获取指定作用域的 Service Worker\n    const serviceWorker = await getServiceWorker('/beacon/');\n    if (!serviceWorker) {\n      const event = new CustomEvent('sendLog', {\n        detail: msg\n      });\n      window.dispatchEvent(event)\n    } else {\n      serviceWorker.postMessage(msg);\n    }\n  } catch (e) {\n    console.error('Failed to send logs to Service Worker:', e);\n  }\n}\n\n/**\n * 发送日志到service worker\n * @param {\"trace\"|\"debug\"|\"info\"|\"warn\"|\"error\"} level - 日志等级\n * @param {any[]} logs - 需要发送的日志数组\n */\nexport async function sendLog(level, logs) {\n  if (typeof window === \"undefined\") return;\n  \n  const extraInfo = getLogExtraInfo();\n  const base = {\n    level,\n    content: serializeLogContent(logs),\n    ...extraInfo\n  };\n  \n  // 发送到 service worker，消息结构带 type\n  const msg = {\n    type: 'log',\n    payload: base\n  };\n\n  sendEvent(msg);  \n}\n\n// 扩展loglevel，添加关键词过滤功能\nexport const extendLoglevel = {\n  setKeyWords(keyWords) {\n    if (typeof window === \"undefined\") return;\n    if (typeof keyWords !== \"string\") return;\n    window.localStorage.setItem(\"_logFilterKeyWords\", keyWords);\n  },\n  getKeyWords() {\n    if (typeof window === \"undefined\") return \"\";\n    return window.localStorage.getItem(\"_logFilterKeyWords\");\n  },\n  getOrCreateUUID,\n}\n\n","import loglevel from \"loglevel\";\nimport { sendLog, extendLoglevel } from \"../common/utils.js\";\n\nconst LOG_METHODS = [\"trace\", \"debug\", \"info\", \"warn\", \"error\"];\n\n// 定义一个方法，这个方法返回使用一个proxy，proxy拦截函数执行\nconst proxyLoglevelFn = (fn, fnName) => {\n  return new Proxy(fn, {\n    apply: (target, thisArg, argumentsList) => {\n      if (!LOG_METHODS.includes(fnName)) {\n        return target.apply(thisArg, argumentsList);\n      }\n      if (typeof window !== \"undefined\") {\n        sendLog(fnName, argumentsList);\n      }\n      if (typeof argumentsList[0] !== \"string\") {\n        return target.apply(thisArg, argumentsList);\n      }\n      const keyWords = extendLoglevel.getKeyWords();\n      if (!keyWords) {\n        return target.apply(thisArg, argumentsList);\n      }\n      if (!argumentsList[0].startsWith(keyWords)) {\n        return;\n      }\n      return target.apply(thisArg, argumentsList);\n    }\n  })\n}\n\nconst log = new Proxy(loglevel, {\n  get(target, prop) {\n    const orig = target[prop];\n    if (typeof orig === 'function') {\n      return proxyLoglevelFn(orig, prop);\n    }\n    if (Object.keys(extendLoglevel).includes(prop)) {\n      return extendLoglevel[prop];\n    }\n    return orig;\n  }\n});\n\n\n\n\nif (typeof window === 'undefined') {\n  let logLevel = typeof process !== 'undefined' && process.env && process.env.LOGS_LEVEL;\n  logLevel = logLevel || loglevel.levels.TRACE;\n  loglevel.setLevel(logLevel);\n}\n\nexport default log;\n"],"names":["root","definition","this","noop","isIE","window","navigator","test","userAgent","logMethods","_loggersByName","defaultLogger","bindMethod","obj","methodName","method","bind","Function","prototype","call","e","apply","arguments","traceForIE","console","log","trace","replaceLoggingMethods","level","getLevel","i","length","methodFactory","name","debug","levels","SILENT","enableLoggingWhenConsoleArrives","defaultMethodFactory","_level","_loggerName","undefined","realMethod","Logger","factory","inheritedLevel","defaultLevel","userLevel","self","storageKey","getPersistedLevel","storedLevel","localStorage","ignore","cookie","document","cookieName","encodeURIComponent","location","indexOf","exec","slice","normalizeLevel","input","toUpperCase","TypeError","TRACE","DEBUG","INFO","WARN","ERROR","setLevel","persist","levelNum","levelName","persistLevelIfPossible","setDefaultLevel","resetLevel","removeItem","clearPersistedLevel","enableAll","disableAll","rebuild","childName","initialLevel","getLogger","logger","_log","noConflict","getLoggers","module","exports","ARRAY_SAMPLING_CONFIG","primitive","threshold","head","tail","middle","complex","browserTypeHandlers","Map","serializeLogContent","content","serializableObject","serializeSingleValue","result","JSON","stringify","message","value","options","maxDepth","sensitiveKeys","currentDepth","seen","WeakSet","type","includes","toString","has","add","Object","typeConstructor","handler","entries","Error","stack","Date","toISOString","RegExp","k","v","String","Set","arr","values","push","Array","isArray","rules","map","item","sampledResult","_t","_l","_e","indices","midStart","Math","floor","sortedIndices","from","sort","a","b","index","Element","tagName","toLowerCase","className","id","toJSON","key","keys","getOrCreateUUID","uuid","getItem","crypto","randomUUID","setItem","random","substring","join","generateUUIDv4","getOrCreateSessionId","sessionId","sessionStorage","hexChars","replace","generateRandomPrefix","async","sendEvent","msg","serviceWorker","scope","swRegistration","getRegistrations","find","reg","active","installing","waiting","worker","waitForActivation","Promise","resolve","reject","addEventListener","state","timeout","_","setTimeout","race","getServiceWorker","postMessage","event","CustomEvent","detail","dispatchEvent","sendLog","logs","extraInfo","extendedAttributes","LOGS_CONTEXT","trim","time","now","clientUuid","screen","width","height","innerWidth","innerHeight","url","href","referrer","getLogExtraInfo","payload","set","ErrorEvent","filename","lineno","colno","error","PromiseRejectionEvent","reason","MessageEvent","data","origin","lastEventId","source","CloseEvent","code","wasClean","bubbles","cancelable","composed","KeyboardEvent","ctrlKey","shiftKey","altKey","metaKey","repeat","InputEvent","inputType","isComposing","StorageEvent","newValue","oldValue","storageArea","extendLoglevel","setKeyWords","keyWords","getKeyWords","LOG_METHODS","Proxy","loglevel","get","target","prop","orig","fnName","thisArg","argumentsList","startsWith","logLevel","process","env","LOGS_LEVEL"],"mappings":"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","x_google_ignoreList":[0]}