{"version":3,"file":"react.cjs","sources":["../src/telemetry.ts","../src/client.ts","../src/tauri-service.ts","../src/electron-service.ts","../src/react.ts"],"sourcesContent":["import { TelemetryOptions, TelemetryEvent } from './types';\n\nexport class TelemetryManager {\n  private options: Required<TelemetryOptions>;\n  private performanceMarks: Map<string, number> = new Map();\n\n  constructor(options: TelemetryOptions = {}) {\n    this.options = {\n      enabled: options.enabled ?? false,\n      onEvent: options.onEvent ?? (() => {}),\n      trackPerformance: options.trackPerformance ?? true,\n      trackErrors: options.trackErrors ?? true,\n    };\n  }\n\n  public trackEvent(\n    type: TelemetryEvent['type'],\n    data?: Record<string, unknown>\n  ): void {\n    if (!this.options.enabled) return;\n\n    const event: TelemetryEvent = {\n      type,\n      timestamp: Date.now(),\n      data,\n    };\n\n    this.options.onEvent(event);\n  }\n\n  public startPerformanceTracking(label: string): void {\n    if (!this.options.enabled || !this.options.trackPerformance) return;\n    this.performanceMarks.set(label, Date.now());\n  }\n\n  public endPerformanceTracking(\n    label: string,\n    additionalData?: Record<string, unknown>\n  ): number | null {\n    if (!this.options.enabled || !this.options.trackPerformance) return null;\n\n    const startTime = this.performanceMarks.get(label);\n    if (!startTime) return null;\n\n    const duration = Date.now() - startTime;\n    this.performanceMarks.delete(label);\n\n    this.trackEvent('performance', {\n      label,\n      duration,\n      ...additionalData,\n    });\n\n    return duration;\n  }\n\n  public trackError(error: Error | string, context?: string): void {\n    if (!this.options.enabled || !this.options.trackErrors) return;\n\n    this.trackEvent('error', {\n      error: error instanceof Error ? error.message : error,\n      stack: error instanceof Error ? error.stack : undefined,\n      context,\n    });\n  }\n}\n","import { AudioProxyOptions, StreamInfo, Environment } from './types';\nimport { TelemetryManager } from './telemetry';\n\nconst DEFAULT_PROXY_URL = 'http://localhost:3002';\nconst DEFAULT_RETRY_ATTEMPTS = 3;\nconst DEFAULT_RETRY_DELAY_MS = 1000;\nconst PROXY_HEALTH_TIMEOUT_MS = 5000;\nconst AUTO_START_WAIT_MS = 500;\n\ninterface AutoStartedProxyServer {\n  stop: () => Promise<void>;\n}\n\ntype StartProxyServerFn = (\n  config?: Record<string, unknown>\n) => Promise<AutoStartedProxyServer>;\n\nconst WINDOWS_PATH_REGEX = /^[a-zA-Z]:\\\\/;\n\n// Type declarations for window objects\ndeclare global {\n  interface Window {\n    __TAURI__?: {\n      // Tauri v1 API\n      tauri?: {\n        convertFileSrc: (filePath: string) => string;\n        invoke?: (\n          command: string,\n          args?: Record<string, unknown>\n        ) => Promise<unknown>;\n      };\n      // Tauri v2 API\n      core?: {\n        convertFileSrc: (filePath: string) => string;\n        invoke?: (\n          command: string,\n          args?: Record<string, unknown>\n        ) => Promise<unknown>;\n      };\n    };\n    electronAPI?: unknown;\n  }\n}\n\ninterface ProcessVersions {\n  electron?: string;\n  [key: string]: string | undefined;\n}\n\ndeclare const process:\n  | {\n      versions?: ProcessVersions;\n    }\n  | undefined;\n\n/**\n * Main client for processing audio URLs and managing proxy connections.\n * Automatically detects environment (Tauri/Electron/Web) and handles URL conversion.\n *\n * @example\n * ```typescript\n * const client = new AudioProxyClient({\n *   autoStartProxy: true,\n *   fallbackToOriginal: true\n * });\n * const playableUrl = await client.getPlayableUrl('https://example.com/audio.mp3');\n * ```\n */\nexport class AudioProxyClient {\n  private options: Required<AudioProxyOptions>;\n  private environment: Environment;\n  private autoStartedServer: AutoStartedProxyServer | null = null;\n  private telemetry: TelemetryManager;\n\n  /**\n   * Creates a new AudioProxyClient instance.\n   * @param options - Configuration options for the client\n   */\n  constructor(options: AudioProxyOptions = {}) {\n    this.options = {\n      proxyUrl: options.proxyUrl || DEFAULT_PROXY_URL,\n      autoDetect: options.autoDetect ?? true,\n      fallbackToOriginal: options.fallbackToOriginal ?? true,\n      retryAttempts: options.retryAttempts || DEFAULT_RETRY_ATTEMPTS,\n      retryDelay: options.retryDelay || DEFAULT_RETRY_DELAY_MS,\n      autoStartProxy: options.autoStartProxy ?? false,\n      proxyServerConfig: options.proxyServerConfig || {},\n      telemetry: options.telemetry || { enabled: false },\n    };\n\n    this.environment = this.detectEnvironment();\n    this.telemetry = new TelemetryManager(this.options.telemetry);\n  }\n\n  private detectEnvironment(): Environment {\n    if (typeof window === 'undefined') {\n      return 'unknown';\n    }\n\n    // Check for Tauri v2 (window.__TAURI__.core) or Tauri v1 (window.__TAURI__.tauri)\n    if (window.__TAURI__ && (window.__TAURI__.core || window.__TAURI__.tauri)) {\n      return 'tauri';\n    }\n\n    if (\n      window.electronAPI ||\n      (typeof process !== 'undefined' &&\n        process?.versions &&\n        process.versions.electron)\n    ) {\n      return 'electron';\n    }\n\n    return 'web';\n  }\n\n  public getEnvironment(): Environment {\n    return this.environment;\n  }\n\n  public getProxyUrl(): string {\n    return this.options.proxyUrl;\n  }\n\n  private async startProxyServer(): Promise<boolean> {\n    // Only works in Node.js environment\n    if (typeof window !== 'undefined') {\n      console.warn(\n        '[AudioProxyClient] Cannot auto-start proxy server in browser environment'\n      );\n      return false;\n    }\n\n    try {\n      // Use indirect dynamic import so browser-targeted bundles don't pull in\n      // Node-only server dependencies (express/cors/net).\n      const dynamicImport = new Function(\n        'modulePath',\n        'return import(modulePath);'\n      ) as (modulePath: string) => Promise<{\n        startProxyServer?: StartProxyServerFn;\n      }>;\n      const serverModule = await dynamicImport('./server-impl');\n\n      if (typeof serverModule.startProxyServer !== 'function') {\n        throw new Error('startProxyServer export not found in server module');\n      }\n      const startProxyServer = serverModule.startProxyServer;\n\n      const url = new URL(this.options.proxyUrl);\n      const port = Number.parseInt(url.port, 10) || 3002;\n\n      console.log(\n        `[AudioProxyClient] Auto-starting proxy server on port ${port}...`\n      );\n\n      this.autoStartedServer = await startProxyServer({\n        port,\n        ...this.options.proxyServerConfig,\n      });\n\n      // Wait a bit for server to fully start\n      await this.delay(AUTO_START_WAIT_MS);\n\n      const available = await this.isProxyAvailable();\n      if (available) {\n        console.log(\n          '[AudioProxyClient] Proxy server auto-started successfully'\n        );\n        return true;\n      }\n\n      return false;\n    } catch (error) {\n      console.error(\n        '[AudioProxyClient] Failed to auto-start proxy server:',\n        error,\n        '\\nCommon causes: 1) Port already in use 2) Insufficient permissions 3) Not running in Node.js'\n      );\n      return false;\n    }\n  }\n\n  public async isProxyAvailable(): Promise<boolean> {\n    this.telemetry.startPerformanceTracking('proxy_check');\n    const controller = new AbortController();\n    const timeoutId = setTimeout(\n      () => controller.abort(),\n      PROXY_HEALTH_TIMEOUT_MS\n    );\n\n    try {\n      const response = await fetch(`${this.options.proxyUrl}/health`, {\n        signal: controller.signal,\n        method: 'GET',\n        cache: 'no-cache',\n      });\n\n      if (response.ok) {\n        const data = await response.json();\n        console.log('[AudioProxyClient] Proxy server available:', data);\n        this.trackProxyCheck(true);\n        return true;\n      }\n      this.trackProxyCheck(false);\n      return false;\n    } catch (error: unknown) {\n      const errorMessage =\n        error instanceof Error ? error.message : 'Unknown error';\n      console.warn(\n        '[AudioProxyClient] Proxy server unavailable:',\n        errorMessage\n      );\n      this.trackProxyCheck(false, errorMessage);\n      return false;\n    } finally {\n      clearTimeout(timeoutId);\n    }\n  }\n\n  private trackProxyCheck(available: boolean, error?: string): void {\n    this.telemetry.endPerformanceTracking('proxy_check', {\n      available,\n      ...(error ? { error } : {}),\n    });\n    this.telemetry.trackEvent('proxy_check', {\n      available,\n      proxyUrl: this.options.proxyUrl,\n      ...(error ? { error } : {}),\n    });\n  }\n\n  /**\n   * Checks if a URL can be played and gets stream information.\n   * @param url - The audio URL to check\n   * @returns Promise resolving to stream information including playability\n   */\n  public async canPlayUrl(url: string): Promise<StreamInfo> {\n    console.log('[AudioProxyClient] Processing URL:', url);\n\n    // Check if it's a local file\n    if (this.isLocalFile(url)) {\n      console.log('[AudioProxyClient] Using local file handler');\n      return {\n        url,\n        status: 200,\n        headers: {},\n        canPlay: true,\n        requiresProxy: false,\n      };\n    }\n\n    // Check if proxy is available\n    const proxyAvailable = await this.isProxyAvailable();\n\n    if (proxyAvailable) {\n      try {\n        const infoUrl = `${this.options.proxyUrl}/info?url=${encodeURIComponent(url)}`;\n        const response = await fetch(infoUrl);\n\n        if (response.ok) {\n          const data = await response.json();\n          const streamInfo: StreamInfo = {\n            url: data.url,\n            status: data.status,\n            headers: data.headers || {},\n            canPlay: true,\n            requiresProxy: true,\n            contentType: data.contentType,\n            contentLength: data.contentLength,\n            acceptRanges: data.acceptRanges,\n            lastModified: data.lastModified,\n          };\n          console.log('[AudioProxyClient] Stream info:', streamInfo);\n          return streamInfo;\n        }\n      } catch (error) {\n        console.warn(\n          '[AudioProxyClient] Failed to get stream info via proxy:',\n          error\n        );\n      }\n    }\n\n    // Fallback: assume it needs proxy\n    const streamInfo: StreamInfo = {\n      url,\n      status: 0,\n      headers: {},\n      canPlay: false,\n      requiresProxy: true,\n    };\n    console.log('[AudioProxyClient] Stream info:', streamInfo);\n    return streamInfo;\n  }\n\n  /**\n   * Converts any audio URL to a playable URL, using proxy if needed.\n   * This is the main method you'll use to process audio URLs.\n   *\n   * @param url - The original audio URL\n   * @returns Promise resolving to a playable URL (may be proxied or converted)\n   * @throws Error if proxy is unavailable and fallback is disabled\n   *\n   * @example\n   * ```typescript\n   * const playableUrl = await client.getPlayableUrl('https://example.com/audio.mp3');\n   * audioElement.src = playableUrl;\n   * ```\n   */\n  public async getPlayableUrl(url: string): Promise<string> {\n    console.log('[AudioProxyClient] Processing URL:', url);\n    this.telemetry.startPerformanceTracking('url_conversion');\n\n    // Handle local files\n    if (this.isLocalFile(url)) {\n      console.log('[AudioProxyClient] Using local file handler');\n      const result = this.handleLocalFile(url);\n      this.telemetry.endPerformanceTracking('url_conversion', {\n        url,\n        type: 'local_file',\n      });\n      this.telemetry.trackEvent('url_conversion', {\n        url,\n        result,\n        type: 'local_file',\n        success: true,\n      });\n      return result;\n    }\n\n    // Check stream info\n    const streamInfo = await this.canPlayUrl(url);\n\n    if (streamInfo.requiresProxy) {\n      console.log(\n        '[AudioProxyClient] Proxy required, checking availability...'\n      );\n\n      // Try proxy with retries\n      for (let attempt = 1; attempt <= this.options.retryAttempts; attempt++) {\n        let proxyAvailable = await this.isProxyAvailable();\n\n        // If proxy not available and auto-start is enabled, try to start it\n        if (\n          !proxyAvailable &&\n          this.options.autoStartProxy &&\n          !this.autoStartedServer\n        ) {\n          console.log(\n            '[AudioProxyClient] Attempting to auto-start proxy server...'\n          );\n          proxyAvailable = await this.startProxyServer();\n        }\n\n        if (proxyAvailable) {\n          const result = `${this.options.proxyUrl}/proxy?url=${encodeURIComponent(url)}`;\n          console.log('[AudioProxyClient] Generated proxy URL:', result);\n          this.telemetry.endPerformanceTracking('url_conversion', {\n            url,\n            type: 'proxy',\n            attempt,\n          });\n          this.telemetry.trackEvent('url_conversion', {\n            url,\n            result,\n            type: 'proxy',\n            success: true,\n            attempt,\n          });\n          return result;\n        }\n\n        if (attempt < this.options.retryAttempts) {\n          console.log(\n            `[AudioProxyClient] Proxy not available on attempt ${attempt}`\n          );\n          await this.delay(this.options.retryDelay);\n        }\n      }\n\n      // Proxy failed, fallback if enabled\n      if (this.options.fallbackToOriginal) {\n        console.log(\n          '[AudioProxyClient] Falling back to original URL (may have CORS issues)'\n        );\n        this.telemetry.endPerformanceTracking('url_conversion', {\n          url,\n          type: 'fallback',\n        });\n        this.telemetry.trackEvent('url_conversion', {\n          url,\n          result: url,\n          type: 'fallback',\n          success: true,\n        });\n        return url;\n      } else {\n        const error = new Error(\n          `Proxy server unavailable at ${this.options.proxyUrl}. ` +\n            `Tried ${this.options.retryAttempts} times. ` +\n            `Solutions: 1) Start proxy server manually with 'startProxyServer()'. ` +\n            `2) Enable 'autoStartProxy: true' option. ` +\n            `3) Set 'fallbackToOriginal: true' to use direct URLs (may have CORS issues). ` +\n            `4) Check if port ${new URL(this.options.proxyUrl).port} is blocked by firewall.`\n        );\n        this.telemetry.trackError(error, 'url_conversion');\n        throw error;\n      }\n    }\n\n    this.telemetry.endPerformanceTracking('url_conversion', {\n      url,\n      type: 'direct',\n    });\n    this.telemetry.trackEvent('url_conversion', {\n      url,\n      result: url,\n      type: 'direct',\n      success: true,\n    });\n    return url;\n  }\n\n  private isLocalFile(url: string): boolean {\n    return (\n      url.startsWith('/') ||\n      url.startsWith('./') ||\n      url.startsWith('../') ||\n      url.startsWith('file://') ||\n      url.startsWith('blob:') ||\n      url.startsWith('data:') ||\n      WINDOWS_PATH_REGEX.test(url)\n    ); // Windows path\n  }\n\n  private handleLocalFile(url: string): string {\n    // Handle data: and blob: URLs directly - no conversion needed\n    if (url.startsWith('data:') || url.startsWith('blob:')) {\n      return url;\n    }\n\n    // In Tauri, use convertFileSrc for file:// URLs\n    if (this.environment === 'tauri' && window.__TAURI__) {\n      try {\n        // Try Tauri v2 API first (window.__TAURI__.core)\n        let convertFileSrc = window.__TAURI__.core?.convertFileSrc;\n\n        // Fallback to Tauri v1 API (window.__TAURI__.tauri)\n        if (!convertFileSrc && window.__TAURI__.tauri) {\n          convertFileSrc = window.__TAURI__.tauri.convertFileSrc;\n        }\n\n        if (\n          convertFileSrc &&\n          (url.startsWith('file://') ||\n            url.startsWith('/') ||\n            WINDOWS_PATH_REGEX.test(url))\n        ) {\n          return convertFileSrc(url);\n        }\n      } catch (error) {\n        console.warn(\n          '[AudioProxyClient] Failed to convert file source with Tauri:',\n          error\n        );\n        // Fallback to original URL if conversion fails\n      }\n    }\n\n    // For other environments or fallback, return as-is\n    return url;\n  }\n\n  private delay(ms: number): Promise<void> {\n    return new Promise(resolve => setTimeout(resolve, ms));\n  }\n\n  /**\n   * Stops the auto-started proxy server if it was started by this client.\n   * Automatically called on process exit, but can be called manually for cleanup.\n   *\n   * @example\n   * ```typescript\n   * await client.stopProxyServer();\n   * ```\n   */\n  public async stopProxyServer(): Promise<void> {\n    if (this.autoStartedServer) {\n      try {\n        console.log('[AudioProxyClient] Stopping auto-started proxy server...');\n        await this.autoStartedServer.stop();\n        this.autoStartedServer = null;\n        console.log('[AudioProxyClient] Proxy server stopped successfully');\n      } catch (error) {\n        console.error('[AudioProxyClient] Failed to stop proxy server:', error);\n      }\n    }\n  }\n}\n\n/**\n * Factory function to create an AudioProxyClient instance.\n * Convenient alternative to using `new AudioProxyClient()`.\n *\n * @param options - Configuration options for the client\n * @returns A new AudioProxyClient instance\n *\n * @example\n * ```typescript\n * const client = createAudioClient({\n *   autoStartProxy: true,\n *   proxyUrl: 'http://localhost:3002'\n * });\n * ```\n */\nexport function createAudioClient(\n  options?: AudioProxyOptions\n): AudioProxyClient {\n  return new AudioProxyClient(options);\n}\n","import { AudioProxyClient } from './client';\nimport { AudioServiceOptions } from './types';\n\n// Type declarations for Tauri API that extends client.ts declarations\n\nconst CODEC_FORMATS = [\n  { name: 'MP3', mime: 'audio/mpeg', codecs: ['mp3'] },\n  { name: 'OGG', mime: 'audio/ogg', codecs: ['vorbis', 'opus'] },\n  { name: 'WAV', mime: 'audio/wav', codecs: ['pcm'] },\n  { name: 'AAC', mime: 'audio/aac', codecs: ['mp4a.40.2'] },\n  { name: 'FLAC', mime: 'audio/flac', codecs: ['flac'] },\n  { name: 'WEBM', mime: 'audio/webm', codecs: ['vorbis', 'opus'] },\n  { name: 'M4A', mime: 'audio/mp4', codecs: ['mp4a.40.2'] },\n] as const;\n\nfunction isSupportedResult(result: string): boolean {\n  return result === 'probably' || result === 'maybe';\n}\n\nfunction mergeSupportedFormat(\n  format: string,\n  supportedFormats: string[],\n  missingCodecs: string[]\n): void {\n  if (!supportedFormats.includes(format)) {\n    supportedFormats.push(format);\n    const missingIndex = missingCodecs.indexOf(format);\n    if (missingIndex > -1) {\n      missingCodecs.splice(missingIndex, 1);\n    }\n  }\n}\n\nexport class TauriAudioService {\n  private audioClient: AudioProxyClient;\n\n  constructor(options: AudioServiceOptions = {}) {\n    // Use audioOptions if provided, otherwise use the options directly\n    const clientOptions = options.audioOptions || options;\n    this.audioClient = new AudioProxyClient(clientOptions);\n  }\n\n  public async getStreamableUrl(url: string): Promise<string> {\n    return this.audioClient.getPlayableUrl(url);\n  }\n\n  public async canPlayStream(url: string) {\n    return this.audioClient.canPlayUrl(url);\n  }\n\n  public getEnvironment() {\n    return this.audioClient.getEnvironment();\n  }\n\n  public async isProxyAvailable(): Promise<boolean> {\n    return this.audioClient.isProxyAvailable();\n  }\n\n  private getTauriInvoke() {\n    const tauri = window.__TAURI__;\n    if (!tauri) {\n      return null;\n    }\n\n    return tauri.core?.invoke || tauri.tauri?.invoke || null;\n  }\n\n  public async checkSystemCodecs(): Promise<{\n    supportedFormats: string[];\n    missingCodecs: string[];\n    capabilities: Record<string, string>;\n  }> {\n    const audio = new Audio();\n\n    const supportedFormats: string[] = [];\n    const missingCodecs: string[] = [];\n    const capabilities: Record<string, string> = {};\n\n    for (const format of CODEC_FORMATS) {\n      let bestSupport = '';\n      let isSupported = false;\n\n      // Test basic MIME type\n      const basicSupport = audio.canPlayType(format.mime);\n      capabilities[`${format.name}_basic`] = basicSupport;\n\n      if (isSupportedResult(basicSupport)) {\n        bestSupport = basicSupport;\n        isSupported = true;\n      }\n\n      // Test with codecs\n      for (const codec of format.codecs) {\n        const codecSupport = audio.canPlayType(\n          `${format.mime}; codecs=\"${codec}\"`\n        );\n        capabilities[`${format.name}_${codec}`] = codecSupport;\n\n        if (codecSupport === 'probably') {\n          bestSupport = 'probably';\n          isSupported = true;\n        } else if (codecSupport === 'maybe' && bestSupport !== 'probably') {\n          bestSupport = 'maybe';\n          isSupported = true;\n        }\n      }\n\n      capabilities[format.name] = bestSupport;\n\n      if (isSupported) {\n        supportedFormats.push(format.name);\n      } else {\n        missingCodecs.push(format.name);\n      }\n    }\n\n    // Check for additional Tauri-specific audio capabilities if available\n    if (this.getEnvironment() === 'tauri' && window.__TAURI__) {\n      try {\n        // Try Tauri v2 API first, fallback to v1\n        const invoke = this.getTauriInvoke();\n\n        if (!invoke) {\n          throw new Error('Tauri invoke not available');\n        }\n\n        // Try to get system audio info from Tauri backend\n        const systemAudioInfo = await invoke('get_system_audio_info').catch(\n          () => null\n        );\n        if (systemAudioInfo && typeof systemAudioInfo === 'object') {\n          capabilities['tauri_system_info'] = JSON.stringify(systemAudioInfo);\n\n          // Enhanced format support based on system capabilities\n          const audioInfo = systemAudioInfo as { supportedFormats?: string[] };\n          if (audioInfo.supportedFormats) {\n            audioInfo.supportedFormats.forEach((format: string) => {\n              mergeSupportedFormat(format, supportedFormats, missingCodecs);\n            });\n          }\n        }\n      } catch (error) {\n        console.warn(\n          '[TauriAudioService] Could not access Tauri backend for codec detection:',\n          error\n        );\n      }\n    }\n\n    return { supportedFormats, missingCodecs, capabilities };\n  }\n\n  // Tauri-specific method to get audio file metadata\n  public async getAudioMetadata(filePath: string): Promise<{\n    duration?: number;\n    bitrate?: number;\n    sampleRate?: number;\n    channels?: number;\n    format?: string;\n  } | null> {\n    if (this.getEnvironment() !== 'tauri' || !window.__TAURI__) {\n      return null;\n    }\n\n    try {\n      const invoke = this.getTauriInvoke();\n      if (!invoke) {\n        throw new Error('Tauri invoke not available');\n      }\n\n      const result = await invoke('get_audio_metadata', { path: filePath });\n      return result as {\n        duration?: number;\n        bitrate?: number;\n        sampleRate?: number;\n        channels?: number;\n        format?: string;\n      } | null;\n    } catch (error) {\n      console.warn('[TauriAudioService] Failed to get audio metadata:', error);\n      return null;\n    }\n  }\n\n  // Tauri-specific method to enumerate audio devices\n  public async getAudioDevices(): Promise<{\n    inputDevices: Array<{ id: string; name: string }>;\n    outputDevices: Array<{ id: string; name: string }>;\n  } | null> {\n    if (this.getEnvironment() !== 'tauri' || !window.__TAURI__) {\n      return null;\n    }\n\n    try {\n      const invoke = this.getTauriInvoke();\n      if (!invoke) {\n        throw new Error('Tauri invoke not available');\n      }\n\n      const result = await invoke('get_audio_devices');\n      return result as {\n        inputDevices: Array<{ id: string; name: string }>;\n        outputDevices: Array<{ id: string; name: string }>;\n      } | null;\n    } catch (error) {\n      console.warn('[TauriAudioService] Failed to get audio devices:', error);\n      return null;\n    }\n  }\n}\n","import { AudioProxyClient } from './client';\nimport { AudioServiceOptions } from './types';\n\n// Type declarations for Electron API\ninterface ElectronAPI {\n  getSystemAudioInfo?: () => Promise<{\n    supportedFormats?: string[];\n    systemInfo?: string;\n  }>;\n  getAudioMetadata?: (filePath: string) => Promise<{\n    duration?: number;\n    bitrate?: number;\n    sampleRate?: number;\n    channels?: number;\n    format?: string;\n  }>;\n  getAudioDevices?: () => Promise<{\n    inputDevices: Array<{ id: string; name: string }>;\n    outputDevices: Array<{ id: string; name: string }>;\n  }>;\n  getSystemAudioSettings?: () => Promise<{\n    defaultInputDevice?: string;\n    defaultOutputDevice?: string;\n    masterVolume?: number;\n  }>;\n}\n\n// Extend the existing Window interface from client.ts - don't redeclare electronAPI\n\nconst CODEC_FORMATS = [\n  { name: 'MP3', mime: 'audio/mpeg', codecs: ['mp3'] },\n  { name: 'OGG', mime: 'audio/ogg', codecs: ['vorbis', 'opus'] },\n  { name: 'WAV', mime: 'audio/wav', codecs: ['pcm'] },\n  { name: 'AAC', mime: 'audio/aac', codecs: ['mp4a.40.2'] },\n  { name: 'FLAC', mime: 'audio/flac', codecs: ['flac'] },\n  { name: 'WEBM', mime: 'audio/webm', codecs: ['vorbis', 'opus'] },\n  { name: 'M4A', mime: 'audio/mp4', codecs: ['mp4a.40.2'] },\n] as const;\n\nfunction isSupportedResult(result: string): boolean {\n  return result === 'probably' || result === 'maybe';\n}\n\nfunction mergeSupportedFormat(\n  format: string,\n  supportedFormats: string[],\n  missingCodecs: string[]\n): void {\n  if (!supportedFormats.includes(format)) {\n    supportedFormats.push(format);\n    const missingIndex = missingCodecs.indexOf(format);\n    if (missingIndex > -1) {\n      missingCodecs.splice(missingIndex, 1);\n    }\n  }\n}\n\nexport class ElectronAudioService {\n  private audioClient: AudioProxyClient;\n\n  constructor(options: AudioServiceOptions = {}) {\n    // Use audioOptions if provided, otherwise use the options directly\n    const clientOptions = options.audioOptions || options;\n    this.audioClient = new AudioProxyClient(clientOptions);\n  }\n\n  public async getStreamableUrl(url: string): Promise<string> {\n    return this.audioClient.getPlayableUrl(url);\n  }\n\n  public async canPlayStream(url: string) {\n    return this.audioClient.canPlayUrl(url);\n  }\n\n  public getEnvironment() {\n    return this.audioClient.getEnvironment();\n  }\n\n  public async isProxyAvailable(): Promise<boolean> {\n    return this.audioClient.isProxyAvailable();\n  }\n\n  private getElectronAPI(): ElectronAPI | undefined {\n    return window.electronAPI as ElectronAPI | undefined;\n  }\n\n  public async checkSystemCodecs(): Promise<{\n    supportedFormats: string[];\n    missingCodecs: string[];\n    capabilities: Record<string, string>;\n    electronVersion?: string;\n    chromiumVersion?: string;\n  }> {\n    const audio = new Audio();\n\n    const supportedFormats: string[] = [];\n    const missingCodecs: string[] = [];\n    const capabilities: Record<string, string> = {};\n\n    for (const format of CODEC_FORMATS) {\n      let bestSupport = '';\n      let isSupported = false;\n\n      // Test basic MIME type\n      const basicSupport = audio.canPlayType(format.mime);\n      capabilities[`${format.name}_basic`] = basicSupport;\n\n      if (isSupportedResult(basicSupport)) {\n        bestSupport = basicSupport;\n        isSupported = true;\n      }\n\n      // Test with codecs\n      for (const codec of format.codecs) {\n        const codecSupport = audio.canPlayType(\n          `${format.mime}; codecs=\"${codec}\"`\n        );\n        capabilities[`${format.name}_${codec}`] = codecSupport;\n\n        if (codecSupport === 'probably') {\n          bestSupport = 'probably';\n          isSupported = true;\n        } else if (codecSupport === 'maybe' && bestSupport !== 'probably') {\n          bestSupport = 'maybe';\n          isSupported = true;\n        }\n      }\n\n      capabilities[format.name] = bestSupport;\n\n      if (isSupported) {\n        supportedFormats.push(format.name);\n      } else {\n        missingCodecs.push(format.name);\n      }\n    }\n\n    const result: {\n      supportedFormats: string[];\n      missingCodecs: string[];\n      capabilities: Record<string, string>;\n      electronVersion?: string;\n      chromiumVersion?: string;\n    } = { supportedFormats, missingCodecs, capabilities };\n\n    // Add Electron version info if available\n    if (this.getEnvironment() === 'electron') {\n      try {\n        const processVersions = (\n          globalThis as {\n            process?: { versions?: { electron?: string; chrome?: string } };\n          }\n        ).process?.versions;\n\n        if (processVersions) {\n          result.electronVersion = processVersions.electron;\n          result.chromiumVersion = processVersions.chrome;\n        }\n\n        // Integrate with Electron main process for system codec detection\n        const electronAPI = this.getElectronAPI();\n        if (electronAPI?.getSystemAudioInfo) {\n          try {\n            const systemAudioInfo = await electronAPI.getSystemAudioInfo();\n            if (systemAudioInfo) {\n              capabilities['electron_system_info'] =\n                JSON.stringify(systemAudioInfo);\n\n              // Enhanced format support based on system capabilities\n              if (systemAudioInfo.supportedFormats) {\n                systemAudioInfo.supportedFormats.forEach((format: string) => {\n                  mergeSupportedFormat(format, supportedFormats, missingCodecs);\n                });\n              }\n            }\n          } catch (error) {\n            console.warn(\n              '[ElectronAudioService] Failed to get system audio info via IPC:',\n              error\n            );\n          }\n        }\n      } catch (error) {\n        console.warn(\n          '[ElectronAudioService] Could not access Electron version info:',\n          error\n        );\n      }\n    }\n\n    return result;\n  }\n\n  // Electron-specific method to get audio file metadata via main process\n  public async getAudioMetadata(filePath: string): Promise<{\n    duration?: number;\n    bitrate?: number;\n    sampleRate?: number;\n    channels?: number;\n    format?: string;\n  } | null> {\n    const electronAPI = this.getElectronAPI();\n    if (\n      this.getEnvironment() !== 'electron' ||\n      !electronAPI?.getAudioMetadata\n    ) {\n      return null;\n    }\n\n    try {\n      return await electronAPI.getAudioMetadata(filePath);\n    } catch (error) {\n      console.warn(\n        '[ElectronAudioService] Failed to get audio metadata:',\n        error\n      );\n      return null;\n    }\n  }\n\n  // Electron-specific method to enumerate audio devices via main process\n  public async getAudioDevices(): Promise<{\n    inputDevices: Array<{ id: string; name: string }>;\n    outputDevices: Array<{ id: string; name: string }>;\n  } | null> {\n    const electronAPI = this.getElectronAPI();\n    if (this.getEnvironment() !== 'electron' || !electronAPI?.getAudioDevices) {\n      return null;\n    }\n\n    try {\n      return await electronAPI.getAudioDevices();\n    } catch (error) {\n      console.warn(\n        '[ElectronAudioService] Failed to get audio devices:',\n        error\n      );\n      return null;\n    }\n  }\n\n  // Electron-specific method to get system audio settings\n  public async getSystemAudioSettings(): Promise<{\n    defaultInputDevice?: string;\n    defaultOutputDevice?: string;\n    masterVolume?: number;\n  } | null> {\n    const electronAPI = this.getElectronAPI();\n    if (\n      this.getEnvironment() !== 'electron' ||\n      !electronAPI?.getSystemAudioSettings\n    ) {\n      return null;\n    }\n\n    try {\n      return await electronAPI.getSystemAudioSettings();\n    } catch (error) {\n      console.warn(\n        '[ElectronAudioService] Failed to get system audio settings:',\n        error\n      );\n      return null;\n    }\n  }\n}\n","import {\n  createContext,\n  createElement,\n  useCallback,\n  useContext,\n  useEffect,\n  useMemo,\n  useState,\n  type ReactNode,\n} from 'react';\nimport { AudioProxyClient } from './client';\nimport { TauriAudioService } from './tauri-service';\nimport { ElectronAudioService } from './electron-service';\nimport { AudioProxyOptions, StreamInfo, Environment } from './types';\n\ntype DesktopAudioService = TauriAudioService | ElectronAudioService;\n\nconst WEB_AUDIO_MIME_TYPES: Record<string, string> = {\n  MP3: 'audio/mpeg',\n  OGG: 'audio/ogg',\n  WAV: 'audio/wav',\n  AAC: 'audio/aac',\n  FLAC: 'audio/flac',\n  WEBM: 'audio/webm',\n  M4A: 'audio/mp4',\n};\n\nconst WEB_AUDIO_FORMATS = Object.keys(WEB_AUDIO_MIME_TYPES);\n\nfunction getErrorMessage(error: unknown): string {\n  return error instanceof Error ? error.message : 'Unknown error';\n}\n\nfunction createDesktopAudioService(\n  environment: Environment\n): DesktopAudioService | null {\n  if (environment === 'tauri') {\n    return new TauriAudioService();\n  }\n  if (environment === 'electron') {\n    return new ElectronAudioService();\n  }\n  return null;\n}\n\n/**\n * Hook for managing audio proxy client with automatic URL processing\n */\nexport function useAudioProxy(url: string | null, options?: AudioProxyOptions) {\n  const [audioUrl, setAudioUrl] = useState<string | null>(null);\n  const [isLoading, setIsLoading] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n  const [streamInfo, setStreamInfo] = useState<StreamInfo | null>(null);\n\n  // Memoize options with deep comparison to prevent unnecessary client recreations\n  const optionsJson = JSON.stringify(options ?? {});\n  const stableOptions = useMemo(() => {\n    return JSON.parse(optionsJson) as AudioProxyOptions;\n  }, [optionsJson]);\n\n  // Memoize client to prevent unnecessary recreations\n  const client = useMemo(\n    () => new AudioProxyClient(stableOptions),\n    [stableOptions]\n  );\n\n  const processUrl = useCallback(\n    async (inputUrl: string) => {\n      setIsLoading(true);\n      setError(null);\n      setAudioUrl(null);\n      setStreamInfo(null);\n\n      try {\n        // Get stream info first\n        const info = await client.canPlayUrl(inputUrl);\n        setStreamInfo(info);\n\n        // Get playable URL\n        const playableUrl = await client.getPlayableUrl(inputUrl);\n        setAudioUrl(playableUrl);\n      } catch (err) {\n        setError(getErrorMessage(err));\n      } finally {\n        setIsLoading(false);\n      }\n    },\n    [client]\n  );\n\n  useEffect(() => {\n    if (url) {\n      processUrl(url);\n    } else {\n      setAudioUrl(null);\n      setStreamInfo(null);\n      setError(null);\n      setIsLoading(false);\n    }\n  }, [url, processUrl]);\n\n  const retry = useCallback(() => {\n    if (url) {\n      processUrl(url);\n    }\n  }, [url, processUrl]);\n\n  return {\n    audioUrl,\n    isLoading,\n    error,\n    streamInfo,\n    retry,\n    client,\n  };\n}\n\n/**\n * Hook for accessing audio capabilities and system information\n */\nexport function useAudioCapabilities() {\n  const [capabilities, setCapabilities] = useState<{\n    supportedFormats: string[];\n    missingCodecs: string[];\n    capabilities: Record<string, string>;\n    environment: Environment;\n    electronVersion?: string;\n    chromiumVersion?: string;\n  } | null>(null);\n\n  const [devices, setDevices] = useState<{\n    inputDevices: Array<{ id: string; name: string }>;\n    outputDevices: Array<{ id: string; name: string }>;\n  } | null>(null);\n\n  const [systemSettings, setSystemSettings] = useState<{\n    defaultInputDevice?: string;\n    defaultOutputDevice?: string;\n    masterVolume?: number;\n  } | null>(null);\n\n  const [isLoading, setIsLoading] = useState(true);\n  const [error, setError] = useState<string | null>(null);\n\n  const client = useMemo(() => new AudioProxyClient(), []);\n\n  const refreshCapabilities = useCallback(async () => {\n    setIsLoading(true);\n    setError(null);\n\n    try {\n      const environment = client.getEnvironment();\n      const service = createDesktopAudioService(environment);\n\n      if (service) {\n        // Get codec capabilities\n        const codecInfo = await service.checkSystemCodecs();\n        setCapabilities({\n          ...codecInfo,\n          environment,\n        });\n\n        // Get audio devices\n        const deviceInfo = await service.getAudioDevices();\n        if (deviceInfo) {\n          setDevices(deviceInfo);\n        }\n\n        // Get system settings (Electron only)\n        if (environment === 'electron' && 'getSystemAudioSettings' in service) {\n          const settings = await (\n            service as ElectronAudioService\n          ).getSystemAudioSettings();\n          if (settings) {\n            setSystemSettings(settings);\n          }\n        }\n      } else {\n        // Basic web environment capabilities\n        const audio = new Audio();\n        const supportedFormats = WEB_AUDIO_FORMATS.filter(\n          format => audio.canPlayType(WEB_AUDIO_MIME_TYPES[format]) !== ''\n        );\n\n        setCapabilities({\n          supportedFormats,\n          missingCodecs: WEB_AUDIO_FORMATS.filter(\n            format => !supportedFormats.includes(format)\n          ),\n          capabilities: {},\n          environment,\n        });\n      }\n    } catch (err) {\n      setError(getErrorMessage(err));\n    } finally {\n      setIsLoading(false);\n    }\n  }, [client]);\n\n  useEffect(() => {\n    refreshCapabilities();\n  }, [refreshCapabilities]);\n\n  return {\n    capabilities,\n    devices,\n    systemSettings,\n    isLoading,\n    error,\n    refresh: refreshCapabilities,\n  };\n}\n\n/**\n * Hook for checking proxy server availability\n */\nexport function useProxyStatus(options?: AudioProxyOptions) {\n  const [isAvailable, setIsAvailable] = useState<boolean | null>(null);\n  const [isChecking, setIsChecking] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n  const [proxyUrl, setProxyUrl] = useState<string>('');\n\n  const client = useMemo(() => new AudioProxyClient(options), [options]);\n\n  const checkProxy = useCallback(async () => {\n    setIsChecking(true);\n    setError(null);\n\n    try {\n      const available = await client.isProxyAvailable();\n      setIsAvailable(available);\n      setProxyUrl(client.getProxyUrl());\n    } catch (err) {\n      setError(getErrorMessage(err));\n      setIsAvailable(false);\n    } finally {\n      setIsChecking(false);\n    }\n  }, [client]);\n\n  useEffect(() => {\n    checkProxy();\n  }, [checkProxy]);\n\n  return {\n    isAvailable,\n    isChecking,\n    error,\n    proxyUrl,\n    refresh: checkProxy,\n  };\n}\n\n/**\n * Hook for audio metadata extraction (Tauri/Electron only)\n */\nexport function useAudioMetadata(filePath: string | null) {\n  const [metadata, setMetadata] = useState<{\n    duration?: number;\n    bitrate?: number;\n    sampleRate?: number;\n    channels?: number;\n    format?: string;\n  } | null>(null);\n\n  const [isLoading, setIsLoading] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n\n  const client = useMemo(() => new AudioProxyClient(), []);\n\n  useEffect(() => {\n    if (!filePath) {\n      setMetadata(null);\n      setError(null);\n      setIsLoading(false);\n      return;\n    }\n\n    const getMetadata = async () => {\n      setIsLoading(true);\n      setError(null);\n      setMetadata(null);\n\n      try {\n        const environment = client.getEnvironment();\n        const service = createDesktopAudioService(environment);\n\n        if (service) {\n          const result = await service.getAudioMetadata(filePath);\n          setMetadata(result);\n        } else {\n          setError(\n            'Audio metadata extraction is only available in Tauri or Electron environments'\n          );\n        }\n      } catch (err) {\n        setError(getErrorMessage(err));\n      } finally {\n        setIsLoading(false);\n      }\n    };\n\n    getMetadata();\n  }, [filePath, client]);\n\n  return {\n    metadata,\n    isLoading,\n    error,\n  };\n}\n\n/**\n * Context provider for global audio proxy configuration\n */\n\ninterface AudioProxyContextValue {\n  defaultOptions: AudioProxyOptions;\n  client: AudioProxyClient;\n}\n\nconst AudioProxyContext = createContext<AudioProxyContextValue | null>(null);\n\nexport function AudioProxyProvider({\n  children,\n  options = {},\n}: {\n  children: ReactNode;\n  options?: AudioProxyOptions;\n}) {\n  const client = useMemo(() => new AudioProxyClient(options), [options]);\n\n  const value = useMemo(\n    () => ({\n      defaultOptions: options,\n      client,\n    }),\n    [options, client]\n  );\n\n  return createElement(AudioProxyContext.Provider, { value }, children);\n}\n\nexport function useAudioProxyContext() {\n  const context = useContext(AudioProxyContext);\n  if (!context) {\n    throw new Error(\n      'useAudioProxyContext must be used within an AudioProxyProvider'\n    );\n  }\n  return context;\n}\n\n/**\n * Simplified hook that returns a playable URL from an audio file path\n * Wrapper around useAudioProxy with a cleaner API\n */\nexport function useAudioUrl(url: string | null, options?: AudioProxyOptions) {\n  const result = useAudioProxy(url, options);\n\n  return {\n    playableUrl: result.audioUrl,\n    loading: result.isLoading,\n    error: result.error ? new Error(result.error) : null,\n    streamInfo: result.streamInfo,\n    retry: result.retry,\n    client: result.client,\n  };\n}\n"],"names":["CODEC_FORMATS","isSupportedResult","mergeSupportedFormat","useState","useMemo","useCallback","useEffect","createContext","createElement","useContext"],"mappings":"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"}