{"version":3,"sources":["../src/enrichers.ts"],"names":[],"mappings":"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","file":"enrichers.cjs","sourcesContent":["type Headers = Record<string, string | string[] | undefined>;\n\nfunction get(headers: Headers, key: string): string | undefined {\n  const lower = key.toLowerCase();\n  for (const [k, v] of Object.entries(headers)) {\n    if (k.toLowerCase() === lower) {\n      return Array.isArray(v) ? v[0] : v;\n    }\n  }\n  return undefined;\n}\n\n// --- User Agent ---\n\nexport interface UserAgentAttributes {\n  'user_agent.raw': string;\n  'user_agent.browser'?: string;\n  'user_agent.os'?: string;\n  'user_agent.device'?: string;\n}\n\nconst BROWSER_RE = /(Firefox|OPR|Edg|Chrome|Safari|MSIE|Trident)[\\s/]?([\\d.]*)/;\nconst OS_RE =\n  /(Windows NT|Mac OS X|Linux|Android|iPhone OS|iPad|CrOS)[\\s]?([\\d._]*)/;\n\nfunction parseBrowser(ua: string): string | undefined {\n  const m = BROWSER_RE.exec(ua);\n  if (!m) return undefined;\n  const name =\n    m[1] === 'OPR'\n      ? 'Opera'\n      : m[1] === 'Edg'\n        ? 'Edge'\n        : m[1] === 'Trident'\n          ? 'IE'\n          : m[1];\n  return m[2] ? `${name} ${m[2]}` : name;\n}\n\nfunction parseOS(ua: string): string | undefined {\n  const m = OS_RE.exec(ua);\n  if (!m) return undefined;\n  const name =\n    m[1] === 'iPhone OS'\n      ? 'iOS'\n      : m[1] === 'Windows NT'\n        ? 'Windows'\n        : m[1] === 'Mac OS X'\n          ? 'macOS'\n          : m[1];\n  const ver = m[2]?.replaceAll('_', '.') || undefined;\n  return ver ? `${name} ${ver}` : name;\n}\n\nfunction parseDevice(ua: string): string | undefined {\n  if (/Mobi|Android.*Mobile|iPhone/.test(ua)) return 'mobile';\n  if (/iPad|Android(?!.*Mobile)|Tablet/.test(ua)) return 'tablet';\n  if (/Bot|Crawler|Spider|Lighthouse/i.test(ua)) return 'bot';\n  return 'desktop';\n}\n\nexport function userAgent(headers: Headers): UserAgentAttributes | undefined {\n  const raw = get(headers, 'user-agent');\n  if (!raw) return undefined;\n\n  const attrs: UserAgentAttributes = { 'user_agent.raw': raw };\n  const browser = parseBrowser(raw);\n  if (browser) attrs['user_agent.browser'] = browser;\n  const os = parseOS(raw);\n  if (os) attrs['user_agent.os'] = os;\n  const device = parseDevice(raw);\n  if (device) attrs['user_agent.device'] = device;\n\n  return attrs;\n}\n\n// --- Geo ---\n\nexport interface GeoAttributes {\n  'geo.country'?: string;\n  'geo.region'?: string;\n  'geo.city'?: string;\n  'geo.latitude'?: string;\n  'geo.longitude'?: string;\n}\n\nexport function geo(headers: Headers): GeoAttributes | undefined {\n  const country =\n    get(headers, 'x-vercel-ip-country') ?? get(headers, 'cf-ipcountry');\n  const region = get(headers, 'x-vercel-ip-country-region');\n  const city = get(headers, 'x-vercel-ip-city');\n  const latitude = get(headers, 'x-vercel-ip-latitude');\n  const longitude = get(headers, 'x-vercel-ip-longitude');\n\n  if (!country && !region && !city && !latitude && !longitude) return undefined;\n\n  const attrs: GeoAttributes = {};\n  if (country) attrs['geo.country'] = country;\n  if (region) attrs['geo.region'] = region;\n  if (city) {\n    try {\n      attrs['geo.city'] = decodeURIComponent(city);\n    } catch {\n      attrs['geo.city'] = city;\n    }\n  }\n  if (latitude) attrs['geo.latitude'] = latitude;\n  if (longitude) attrs['geo.longitude'] = longitude;\n\n  return attrs;\n}\n\n// --- Request Size ---\n\nexport interface RequestSizeAttributes {\n  'http.request.body.size'?: number;\n  'http.response.body.size'?: number;\n}\n\nconst DIGITS_RE = /^\\d+$/;\n\nfunction parseContentLength(value: string | undefined): number | undefined {\n  if (!value || !DIGITS_RE.test(value)) return undefined;\n  return Number(value);\n}\n\nexport function requestSize(\n  requestHeaders: Headers,\n  responseHeaders?: Headers,\n): RequestSizeAttributes | undefined {\n  const reqLen = get(requestHeaders, 'content-length');\n  const resLen = responseHeaders\n    ? get(responseHeaders, 'content-length')\n    : undefined;\n\n  if (!reqLen && !resLen) return undefined;\n\n  const attrs: RequestSizeAttributes = {};\n  const reqBytes = parseContentLength(reqLen);\n  if (reqBytes !== undefined) attrs['http.request.body.size'] = reqBytes;\n  const resBytes = parseContentLength(resLen);\n  if (resBytes !== undefined) attrs['http.response.body.size'] = resBytes;\n\n  return Object.keys(attrs).length > 0 ? attrs : undefined;\n}\n"]}