{"version":3,"sources":["../src/version.ts","../src/telemetry/client.ts"],"names":["SDK_VERSION","ingestionKeyCache","getSDKVersion","getCacheKey","endpoint","domain","Telementry","options","__publicField","envDisabled","cacheKey","keyEndpoint","res","userAgent","appVersion","vendor","language","platform","cookieEnabled","hardwareConcurrency","deviceMemory","event","properties","ingestionKey","payload"],"mappings":"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","file":"telemetry.cjs","sourcesContent":["// This file is automatically updated during the build process\n// Do not edit manually\n\nexport const SDK_VERSION = \"1.0.1-beta.1\";\nexport const SDK_NAME = \"@prexo/ai-chat-sdk\";\n","import type { TelementryEvents } from \"../types\";\nimport { SDK_VERSION } from \"../version\";\n\nexport type TelementryOptions = {\n  enabled?: boolean;\n  ingestionKey?: string;\n};\n\n// Static cache for ingestion key per endpoint+domain\nconst ingestionKeyCache: Record<string, Promise<string>> = {};\n\n// Auto-detect SDK version\nfunction getSDKVersion(): string {\n  try {\n    // Try to get from process.env (works in Node.js)\n    if (typeof process !== \"undefined\" && process.env?.PREXO_SDK_VERSION) {\n      return process.env.PREXO_SDK_VERSION;\n    }\n\n    // Try to get from window (works in browser with injected globals)\n    if (\n      typeof window !== \"undefined\" &&\n      (window as any).__PREXO_SDK_VERSION__\n    ) {\n      return (window as any).__PREXO_SDK_VERSION__;\n    }\n\n    // Try to get from globalThis (works in modern environments)\n    if (\n      typeof globalThis !== \"undefined\" &&\n      (globalThis as any).__PREXO_SDK_VERSION__\n    ) {\n      return (globalThis as any).__PREXO_SDK_VERSION__;\n    }\n\n    // Use the version from the version file (default fallback)\n    return SDK_VERSION;\n  } catch {\n    return SDK_VERSION;\n  }\n}\n\nfunction getCacheKey(endpoint: string, domain: string) {\n  return `${endpoint}::${domain}`;\n}\n\nexport class Telementry {\n  private enabled: boolean;\n  private endpoint: string;\n  private ingestionKey?: string;\n  private sdkVersion: string;\n  private ingestionKeyPromise?: Promise<string>;\n\n  constructor(options: TelementryOptions) {\n    const envDisabled =\n      typeof process !== \"undefined\" && process.env?.DISABLE_TELEMETRY === \"1\";\n\n    this.enabled = options.enabled ?? !envDisabled;\n    this.endpoint =\n      typeof process !== \"undefined\" &&\n      process.env &&\n      process.env.NODE_ENV === \"development\"\n        ? \"http://localhost:3001/v1/telementry\"\n        : \"https://api.prexoai.xyz/v1/telementry\";\n\n    // Auto-detect SDK version if not provided\n    this.sdkVersion = getSDKVersion();\n\n    if (options.ingestionKey) {\n      this.ingestionKey = options.ingestionKey;\n    }\n    // else: don't fetch here, defer to send() and use cache\n  }\n\n  private async fetchIngestionKeyCached(): Promise<string> {\n    // Determine domain\n    let domain = \"\";\n    if (\n      typeof window !== \"undefined\" &&\n      window.location &&\n      window.location.origin\n    ) {\n      if (\n        typeof process !== \"undefined\" &&\n        process.env &&\n        process.env.NODE_ENV === \"development\"\n      ) {\n        domain = \"devwtf.in\";\n      } else {\n        domain = window.location.origin;\n      }\n    }\n    const cacheKey = getCacheKey(this.endpoint, domain);\n\n    if (!ingestionKeyCache[cacheKey]) {\n      ingestionKeyCache[cacheKey] = this.fetchIngestionKey(domain);\n    }\n    return ingestionKeyCache[cacheKey];\n  }\n\n  private async fetchIngestionKey(domain: string): Promise<string> {\n    const keyEndpoint = this.endpoint\n      ? this.endpoint.replace(/\\/?$/, \"/key\")\n      : \"https://api.prexoai.xyz/v1/telementry/key\";\n    try {\n      const res = await fetch(keyEndpoint, {\n        method: \"POST\",\n        credentials: \"include\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n        },\n        body: JSON.stringify({ domain }),\n      });\n      if (!res.ok) {\n        throw new Error(\"Failed to fetch ingestion key\");\n      }\n      const data = await res.json();\n      // Assume the key is in data.key\n      return data.key || \"prexoai-ingest-key\";\n    } catch {\n      // fallback to default\n      return \"prexoai-ingest-key\";\n    }\n  }\n\n  /**\n   * Returns a string with browser details using the Navigator API.\n   * See: https://developer.mozilla.org/en-US/docs/Web/API/Navigator\n   */\n  private detectBrowser(): string {\n    if (typeof window !== \"undefined\" && typeof navigator !== \"undefined\") {\n      const userAgent = navigator.userAgent || \"unknown\";\n      const appVersion = navigator.appVersion || \"unknown\";\n      const vendor = (navigator as any).vendor || \"unknown\";\n      const language = (navigator as any).language || \"unknown\";\n      const platform = (navigator as any).platform || \"unknown\";\n      const cookieEnabled =\n        (navigator as any).cookieEnabled !== undefined\n          ? String((navigator as any).cookieEnabled)\n          : \"unknown\";\n      const hardwareConcurrency =\n        (navigator as any).hardwareConcurrency !== undefined\n          ? String((navigator as any).hardwareConcurrency)\n          : \"unknown\";\n      const deviceMemory =\n        (navigator as any).deviceMemory !== undefined\n          ? String((navigator as any).deviceMemory)\n          : \"unknown\";\n      return [\n        `UserAgent: ${userAgent}`,\n        `AppVersion: ${appVersion}`,\n        `Vendor: ${vendor}`,\n        `Language: ${language}`,\n        `Platform: ${platform}`,\n        `CookieEnabled: ${cookieEnabled}`,\n        `HardwareConcurrency: ${hardwareConcurrency}`,\n        `DeviceMemory: ${deviceMemory}`,\n      ].join(\"; \");\n    }\n    // Fallback for non-browser environments\n    return \"not-browser\";\n  }\n\n  /**\n   * Returns the platform/OS using the Navigator API if available.\n   * See: https://developer.mozilla.org/en-US/docs/Web/API/Navigator/platform\n   */\n  private detectPlatform(): string {\n    if (\n      typeof navigator !== \"undefined\" &&\n      typeof navigator.platform === \"string\"\n    ) {\n      return navigator.platform || \"unknown\";\n    }\n    if (\n      typeof process !== \"undefined\" &&\n      typeof process.platform === \"string\"\n    ) {\n      return process.platform;\n    }\n    return \"unknown\";\n  }\n\n\n  async send<K extends keyof TelementryEvents>(\n    event: K,\n    properties: TelementryEvents[K],\n  ) {\n    if (!this.enabled) return;\n\n    // Ensure ingestionKey is available\n    let ingestionKey = this.ingestionKey;\n    if (!ingestionKey) {\n      if (!this.ingestionKeyPromise) {\n        // Use the static cache to avoid spamming /key endpoint\n        this.ingestionKeyPromise = this.fetchIngestionKeyCached();\n      }\n      ingestionKey = await this.ingestionKeyPromise;\n      this.ingestionKey = ingestionKey; // cache for future\n    }\n\n    const payload = {\n      event,\n      properties: {\n        ...properties,\n        sdkVersion: this.sdkVersion,\n        browser: this.detectBrowser(),\n        platform: this.detectPlatform(),\n        timestamp: new Date().toISOString(),\n      },\n    };\n\n    try {\n      await fetch(this.endpoint, {\n        method: \"POST\",\n        credentials: \"include\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n          \"x-ingest-key\": ingestionKey,\n        },\n        body: JSON.stringify(payload),\n      });\n    } catch {\n      // never throw\n    }\n  }\n}\n"]}