{"version":3,"file":"index.cjs","sources":["../src/telemetry.ts","../src/client.ts","../src/tauri-service.ts","../src/electron-service.ts","../src/debugger.ts","../src/server-impl.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","/**\n * Comprehensive Debugger for Desktop Audio Proxy\n * Makes it easy to see what's happening under the hood\n */\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\nexport type LogCategory =\n  | 'client'\n  | 'server'\n  | 'proxy'\n  | 'environment'\n  | 'performance'\n  | 'network'\n  | 'tauri'\n  | 'electron';\n\nexport interface DebugOptions {\n  enabled?: boolean;\n  level?: LogLevel;\n  categories?: LogCategory[];\n  timestamp?: boolean;\n  stackTrace?: boolean;\n  onLog?: (_entry: DebugLogEntry) => void;\n}\n\nexport interface DebugLogEntry {\n  timestamp: number;\n  level: LogLevel;\n  category: LogCategory;\n  message: string;\n  data?: unknown;\n  stack?: string;\n}\n\nclass AudioProxyDebugger {\n  private options: Required<DebugOptions>;\n  private logs: DebugLogEntry[] = [];\n  private maxLogs = 1000; // Keep last 1000 logs\n\n  constructor(options: DebugOptions = {}) {\n    this.options = {\n      enabled: options.enabled ?? false,\n      level: options.level ?? 'info',\n      categories: options.categories ?? [],\n      timestamp: options.timestamp ?? true,\n      stackTrace: options.stackTrace ?? false,\n      onLog: options.onLog ?? (() => {}),\n    };\n  }\n\n  public setEnabled(enabled: boolean): void {\n    this.options.enabled = enabled;\n  }\n\n  public setLevel(level: LogLevel): void {\n    this.options.level = level;\n  }\n\n  public setCategories(categories: LogCategory[]): void {\n    this.options.categories = categories;\n  }\n\n  private shouldLog(level: LogLevel, category: LogCategory): boolean {\n    if (!this.options.enabled) return false;\n\n    // Check category filter\n    if (\n      this.options.categories.length > 0 &&\n      !this.options.categories.includes(category)\n    ) {\n      return false;\n    }\n\n    // Check log level\n    const levels: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n    const currentLevelIndex = levels.indexOf(this.options.level);\n    const messageLevelIndex = levels.indexOf(level);\n\n    return messageLevelIndex >= currentLevelIndex;\n  }\n\n  public debug(category: LogCategory, message: string, data?: unknown): void {\n    this.log('debug', category, message, data);\n  }\n\n  public info(category: LogCategory, message: string, data?: unknown): void {\n    this.log('info', category, message, data);\n  }\n\n  public warn(category: LogCategory, message: string, data?: unknown): void {\n    this.log('warn', category, message, data);\n  }\n\n  public error(category: LogCategory, message: string, data?: unknown): void {\n    this.log('error', category, message, data);\n  }\n\n  private log(\n    level: LogLevel,\n    category: LogCategory,\n    message: string,\n    data?: unknown\n  ): void {\n    if (!this.shouldLog(level, category)) return;\n\n    const entry: DebugLogEntry = {\n      timestamp: Date.now(),\n      level,\n      category,\n      message,\n      data,\n      stack: this.options.stackTrace ? new Error().stack : undefined,\n    };\n\n    // Store in memory\n    this.logs.push(entry);\n    if (this.logs.length > this.maxLogs) {\n      this.logs.shift();\n    }\n\n    // Call custom handler\n    this.options.onLog(entry);\n\n    // Console output\n    this.logToConsole(entry);\n  }\n\n  private logToConsole(entry: DebugLogEntry): void {\n    const timestamp = this.options.timestamp\n      ? `[${new Date(entry.timestamp).toISOString()}]`\n      : '';\n    const prefix = `${timestamp} [${entry.category.toUpperCase()}]`;\n    const message = `${prefix} ${entry.message}`;\n\n    const consoleMethod =\n      entry.level === 'error'\n        ? 'error'\n        : entry.level === 'warn'\n          ? 'warn'\n          : entry.level === 'debug'\n            ? 'debug'\n            : 'log';\n\n    if (entry.data !== undefined) {\n      console[consoleMethod](message, entry.data);\n    } else {\n      console[consoleMethod](message);\n    }\n\n    if (entry.stack && entry.level === 'error') {\n      console.error('Stack trace:', entry.stack);\n    }\n  }\n\n  public getLogs(filter?: {\n    level?: LogLevel;\n    category?: LogCategory;\n    since?: number;\n  }): DebugLogEntry[] {\n    let filtered = this.logs;\n\n    if (filter?.level) {\n      filtered = filtered.filter(log => log.level === filter.level);\n    }\n\n    if (filter?.category) {\n      filtered = filtered.filter(log => log.category === filter.category);\n    }\n\n    if (filter?.since !== undefined) {\n      filtered = filtered.filter(log => log.timestamp >= filter.since!);\n    }\n\n    return filtered;\n  }\n\n  public clearLogs(): void {\n    this.logs = [];\n  }\n\n  public exportLogs(): string {\n    return JSON.stringify(this.logs, null, 2);\n  }\n\n  public getStats(): {\n    total: number;\n    byLevel: Record<LogLevel, number>;\n    byCategory: Record<LogCategory, number>;\n  } {\n    const byLevel: Record<LogLevel, number> = {\n      debug: 0,\n      info: 0,\n      warn: 0,\n      error: 0,\n    };\n\n    const byCategory: Record<LogCategory, number> = {\n      client: 0,\n      server: 0,\n      proxy: 0,\n      environment: 0,\n      performance: 0,\n      network: 0,\n      tauri: 0,\n      electron: 0,\n    };\n\n    this.logs.forEach(log => {\n      byLevel[log.level]++;\n      byCategory[log.category]++;\n    });\n\n    return {\n      total: this.logs.length,\n      byLevel,\n      byCategory,\n    };\n  }\n\n  public printStats(): void {\n    const stats = this.getStats();\n    console.log('=== Desktop Audio Proxy Debug Stats ===');\n    console.log(`Total Logs: ${stats.total}`);\n    console.log('\\nBy Level:');\n    Object.entries(stats.byLevel).forEach(([level, count]) => {\n      if (count > 0) {\n        console.log(`  ${level}: ${count}`);\n      }\n    });\n    console.log('\\nBy Category:');\n    Object.entries(stats.byCategory).forEach(([category, count]) => {\n      if (count > 0) {\n        console.log(`  ${category}: ${count}`);\n      }\n    });\n  }\n}\n\n// Global singleton instance\nlet globalDebugger: AudioProxyDebugger | null = null;\n\nexport function getDebugger(options?: DebugOptions): AudioProxyDebugger {\n  if (!globalDebugger) {\n    globalDebugger = new AudioProxyDebugger(options);\n  } else if (options) {\n    // Update options if provided\n    if (options.enabled !== undefined)\n      globalDebugger.setEnabled(options.enabled);\n    if (options.level) globalDebugger.setLevel(options.level);\n    if (options.categories) globalDebugger.setCategories(options.categories);\n  }\n  return globalDebugger;\n}\n\nexport function enableDebug(\n  level: LogLevel = 'debug',\n  categories?: LogCategory[]\n): AudioProxyDebugger {\n  const debug = getDebugger({\n    enabled: true,\n    level,\n    categories,\n    timestamp: true,\n  });\n  console.log('[DebugMode] Desktop Audio Proxy debugging enabled');\n  console.log(`[DebugMode] Log level: ${level}`);\n  if (categories) {\n    console.log(`[DebugMode] Categories: ${categories.join(', ')}`);\n  } else {\n    console.log('[DebugMode] Categories: all');\n  }\n  return debug;\n}\n\nexport function disableDebug(): void {\n  const debug = getDebugger();\n  debug.setEnabled(false);\n  console.log('[DebugMode] Desktop Audio Proxy debugging disabled');\n}\n\n// Export the class for advanced users\nexport { AudioProxyDebugger };\n","import express, { Request, Response, NextFunction } from 'express';\nimport cors from 'cors';\nimport axios, { AxiosResponse } from 'axios';\nimport { Readable } from 'stream';\nimport { createServer, isIP } from 'net';\nimport { Server as HttpServer } from 'http';\nimport { ProxyConfig } from './types';\n\nconst DEFAULT_PORT = 3002;\nconst DEFAULT_HOST = 'localhost';\nconst DEFAULT_TIMEOUT = 60000;\nconst DEFAULT_MAX_REDIRECTS = 10;\nconst DEFAULT_USER_AGENT = 'AudioProxy/1.0';\nconst DEFAULT_ALLOWED_PROTOCOLS: Array<'http' | 'https'> = ['http', 'https'];\nconst DEFAULT_CACHE_TTL = 3600;\nconst DEFAULT_ACCEPT_HEADER = 'audio/*,*/*;q=0.1';\nconst DEFAULT_ACCEPT_LANGUAGE_HEADER = 'en-US,en;q=0.9';\n\nconst CORS_EXPOSED_HEADERS = [\n  'Content-Length',\n  'Content-Range',\n  'Accept-Ranges',\n];\nconst CORS_ALLOWED_METHODS = ['GET', 'OPTIONS', 'HEAD'];\nconst CORS_ALLOWED_HEADERS = ['Content-Type', 'Range', 'Accept-Encoding'];\n\nconst PROXIED_RESPONSE_HEADERS = [\n  'content-type',\n  'content-length',\n  'content-range',\n  'accept-ranges',\n  'cache-control',\n  'expires',\n  'last-modified',\n  'etag',\n];\n\ntype ErrorContext = 'info' | 'proxy';\n\ninterface NormalizedError {\n  status: number;\n  body: {\n    error: string;\n    message?: string;\n    url: string;\n  };\n}\n\ninterface InfoResponsePayload {\n  url: string;\n  status: number;\n  headers: Record<string, unknown>;\n  contentType?: string;\n  contentLength?: string;\n  acceptRanges?: string;\n  lastModified?: string;\n}\n\ninterface CachedInfoEntry {\n  expiresAt: number;\n  payload: InfoResponsePayload;\n}\n\ninterface RequestUrlValidationResult {\n  valid: boolean;\n  status: number;\n  url?: string;\n  error?: string;\n  message?: string;\n}\n\nfunction getErrorMessage(error: unknown): string {\n  return error instanceof Error ? error.message : 'Unknown error';\n}\n\nfunction getProcessUptime(): number {\n  const runtime = globalThis as unknown as {\n    process?: { uptime?: () => number };\n  };\n\n  return runtime.process?.uptime ? runtime.process.uptime() : 0;\n}\n\nfunction getErrorCode(error: unknown): string | undefined {\n  if (!error || typeof error !== 'object') {\n    return undefined;\n  }\n\n  const maybeCode = (error as { code?: unknown }).code;\n  return typeof maybeCode === 'string' ? maybeCode : undefined;\n}\n\n// Utility function to check if a port is available\nasync function isPortAvailable(\n  port: number,\n  host: string = 'localhost'\n): Promise<boolean> {\n  return new Promise(resolve => {\n    const server = createServer();\n\n    server.listen(port, host, () => {\n      server.close(() => {\n        resolve(true);\n      });\n    });\n\n    server.on('error', () => {\n      resolve(false);\n    });\n  });\n}\n\n// Find the next available port starting from the given port\nasync function findAvailablePort(\n  startPort: number,\n  host: string = 'localhost',\n  maxAttempts: number = 10\n): Promise<number> {\n  for (let i = 0; i < maxAttempts; i++) {\n    const port = startPort + i;\n    const available = await isPortAvailable(port, host);\n    if (available) {\n      return port;\n    }\n  }\n  throw new Error(\n    `No available port found in range ${startPort}-${startPort + maxAttempts - 1}`\n  );\n}\n\nexport class AudioProxyServer {\n  private app: express.Application;\n  private server: HttpServer | null = null;\n  private config: Required<ProxyConfig>;\n  private actualPort: number = 0;\n  private infoCache: Map<string, CachedInfoEntry> = new Map();\n\n  constructor(config: ProxyConfig = {}) {\n    const allowedProtocols =\n      config.allowedProtocols && config.allowedProtocols.length > 0\n        ? config.allowedProtocols\n        : DEFAULT_ALLOWED_PROTOCOLS;\n\n    this.config = {\n      port: config.port || DEFAULT_PORT,\n      host: config.host || DEFAULT_HOST,\n      corsOrigins: config.corsOrigins || '*',\n      timeout: config.timeout || DEFAULT_TIMEOUT,\n      maxRedirects: config.maxRedirects || DEFAULT_MAX_REDIRECTS,\n      userAgent: config.userAgent || DEFAULT_USER_AGENT,\n      allowedProtocols,\n      allowPrivateAddresses: config.allowPrivateAddresses ?? false,\n      enableLogging: config.enableLogging ?? true,\n      enableTranscoding: config.enableTranscoding ?? false,\n      cacheEnabled: config.cacheEnabled ?? true,\n      cacheTTL: config.cacheTTL || DEFAULT_CACHE_TTL,\n    };\n\n    this.app = express();\n    this.setupMiddleware();\n    this.setupRoutes();\n  }\n\n  private setupMiddleware(): void {\n    // CORS middleware\n    this.app.use(\n      cors({\n        origin: this.config.corsOrigins,\n        credentials: true,\n        exposedHeaders: CORS_EXPOSED_HEADERS,\n        methods: CORS_ALLOWED_METHODS,\n        allowedHeaders: CORS_ALLOWED_HEADERS,\n      })\n    );\n\n    // Logging middleware\n    if (this.config.enableLogging) {\n      this.app.use((req: Request, _res: Response, next: NextFunction) => {\n        console.log(`[AudioProxy] ${req.method} ${req.path}`);\n        next();\n      });\n    }\n  }\n\n  private setupRoutes(): void {\n    // Handle CORS preflight for all routes\n    this.app.options('*', (_req: Request, res: Response) => {\n      res.set({\n        'Access-Control-Allow-Origin': this.config.corsOrigins,\n        'Access-Control-Allow-Methods': 'GET, HEAD, OPTIONS',\n        'Access-Control-Allow-Headers':\n          'Content-Type, Range, Accept-Encoding, User-Agent',\n        'Access-Control-Allow-Credentials': 'true',\n        'Access-Control-Max-Age': '86400', // 24 hours\n      });\n      res.status(204).end();\n    });\n\n    // Health check endpoint\n    this.app.get('/health', (_req: Request, res: Response) => {\n      res.json({\n        status: 'ok',\n        version: '1.1.7',\n        uptime: getProcessUptime(),\n        config: {\n          port: this.actualPort || this.config.port,\n          configuredPort: this.config.port,\n          allowedProtocols: this.config.allowedProtocols,\n          allowPrivateAddresses: this.config.allowPrivateAddresses,\n          enableTranscoding: this.config.enableTranscoding,\n          cacheEnabled: this.config.cacheEnabled,\n        },\n      });\n    });\n\n    // Info endpoint\n    this.app.get('/info', async (req: Request, res: Response) => {\n      const validationResult = this.getRequestUrl(req);\n      if (!validationResult.valid || !validationResult.url) {\n        return res.status(validationResult.status).json({\n          error: validationResult.error || 'Invalid URL parameter',\n          ...(validationResult.message\n            ? { message: validationResult.message }\n            : {}),\n        });\n      }\n      const url = validationResult.url;\n\n      const cachedInfo = this.getCachedInfo(url);\n      if (cachedInfo) {\n        return res.json(cachedInfo);\n      }\n\n      try {\n        // Get stream info without downloading\n        const response = await axios({\n          method: 'HEAD',\n          url: url,\n          headers: {\n            'User-Agent': this.config.userAgent,\n            Accept: DEFAULT_ACCEPT_HEADER,\n          },\n          timeout: this.config.timeout,\n          maxRedirects: this.config.maxRedirects,\n          validateStatus: (status: number) => status < 400,\n        });\n\n        const payload: InfoResponsePayload = {\n          url,\n          status: response.status,\n          headers: response.headers,\n          contentType: response.headers['content-type'],\n          contentLength: response.headers['content-length'],\n          acceptRanges: response.headers['accept-ranges'],\n          lastModified: response.headers['last-modified'],\n        };\n\n        this.setCachedInfo(url, payload);\n\n        return res.json(payload);\n      } catch (error: unknown) {\n        console.error('[AudioProxy] Info error:', error);\n        const normalizedError = this.normalizeRequestError(error, url, 'info');\n        return res.status(normalizedError.status).json(normalizedError.body);\n      }\n    });\n\n    // Proxy endpoint\n    this.app.get('/proxy', async (req: Request, res: Response) => {\n      const validationResult = this.getRequestUrl(req);\n      if (!validationResult.valid || !validationResult.url) {\n        return res.status(validationResult.status).json({\n          error: validationResult.error || 'Invalid URL parameter',\n          ...(validationResult.message\n            ? { message: validationResult.message }\n            : {}),\n        });\n      }\n      const url = validationResult.url;\n\n      try {\n        // Set CORS headers immediately\n        res.set({\n          'Access-Control-Allow-Origin': this.config.corsOrigins,\n          'Access-Control-Allow-Credentials': 'true',\n          'Access-Control-Expose-Headers':\n            'Content-Length, Content-Range, Accept-Ranges',\n          'Access-Control-Allow-Methods': 'GET, OPTIONS, HEAD',\n          'Access-Control-Allow-Headers':\n            'Content-Type, Range, Accept-Encoding',\n        });\n\n        // Prepare request headers\n        const requestHeaders: Record<string, string> = {\n          'User-Agent': this.config.userAgent,\n          Accept: req.headers.accept || DEFAULT_ACCEPT_HEADER,\n          'Accept-Language':\n            req.headers['accept-language'] || DEFAULT_ACCEPT_LANGUAGE_HEADER,\n          'Cache-Control': 'no-cache',\n          Pragma: 'no-cache',\n        };\n\n        const requestAbortController = new AbortController();\n\n        // Handle range requests for seeking support\n        if (req.headers.range) {\n          requestHeaders['Range'] = req.headers.range;\n        }\n\n        // Handle encoding\n        if (req.headers['accept-encoding']) {\n          requestHeaders['Accept-Encoding'] = req.headers['accept-encoding'];\n        }\n\n        // Use axios for better stream handling\n        const response: AxiosResponse = await axios({\n          method: 'GET',\n          url: url,\n          headers: requestHeaders,\n          responseType: 'stream',\n          timeout: this.config.timeout,\n          maxRedirects: this.config.maxRedirects,\n          validateStatus: (status: number) => status < 400, // Accept redirects and success codes\n          signal: requestAbortController.signal,\n        });\n\n        // Set response status\n        res.status(response.status);\n\n        // Copy relevant headers from the original response\n        PROXIED_RESPONSE_HEADERS.forEach(header => {\n          const value = response.headers[header];\n          if (value) {\n            res.set(header, value);\n          }\n        });\n\n        const stream = response.data as Readable;\n        let cleanedUp = false;\n\n        const cleanup = (destroyStream: boolean): void => {\n          if (cleanedUp) {\n            return;\n          }\n\n          cleanedUp = true;\n          requestAbortController.abort();\n\n          req.removeListener('aborted', handleRequestAborted);\n          res.removeListener('close', handleResponseClose);\n          res.removeListener('error', handleResponseError);\n          res.removeListener('finish', handleResponseFinish);\n          stream.removeListener('error', handleStreamError);\n\n          if (destroyStream && !stream.destroyed) {\n            stream.destroy();\n          }\n        };\n\n        const handleRequestAborted = () => {\n          cleanup(true);\n        };\n\n        const handleResponseClose = () => {\n          cleanup(true);\n        };\n\n        const handleResponseFinish = () => {\n          cleanup(false);\n        };\n\n        const handleResponseError = (error: Error) => {\n          console.error('[AudioProxy] Response error:', error);\n          cleanup(true);\n        };\n\n        const handleStreamError = (error: Error) => {\n          console.error('[AudioProxy] Stream error:', error);\n          if (this.canSendJsonResponse(res)) {\n            res.status(500).json({\n              error: 'Stream error',\n              message: error.message,\n            });\n          } else if (!res.writableEnded) {\n            res.end();\n          }\n          cleanup(true);\n        };\n\n        stream.once('error', handleStreamError);\n        req.once('aborted', handleRequestAborted);\n        res.once('close', handleResponseClose);\n        res.once('error', handleResponseError);\n        res.once('finish', handleResponseFinish);\n\n        // Pipe the stream to response\n        stream.pipe(res);\n        // Return void to satisfy TypeScript strict mode\n        return;\n      } catch (error: unknown) {\n        console.error('[AudioProxy] Proxy error:', error);\n\n        if (this.canSendJsonResponse(res)) {\n          const normalizedError = this.normalizeRequestError(\n            error,\n            url,\n            'proxy'\n          );\n          return res.status(normalizedError.status).json(normalizedError.body);\n        }\n        // If headers were already sent, just return\n        return;\n      }\n    });\n  }\n\n  private canSendJsonResponse(res: Response): boolean {\n    return !res.headersSent && !res.writableEnded;\n  }\n\n  private getRequestUrl(req: Request): RequestUrlValidationResult {\n    if (typeof req.query.url !== 'string') {\n      return {\n        valid: false,\n        status: 400,\n        error: 'URL parameter required',\n      };\n    }\n\n    const normalizedUrl = req.query.url.trim();\n    if (normalizedUrl.length === 0) {\n      return {\n        valid: false,\n        status: 400,\n        error: 'URL parameter required',\n      };\n    }\n\n    let parsedUrl: URL;\n    try {\n      parsedUrl = new URL(normalizedUrl);\n    } catch {\n      return {\n        valid: false,\n        status: 400,\n        error: 'Invalid URL parameter',\n        message: 'Only absolute URLs are supported',\n      };\n    }\n\n    const protocol = parsedUrl.protocol.slice(0, -1).toLowerCase();\n    if (!this.config.allowedProtocols.includes(protocol as 'http' | 'https')) {\n      return {\n        valid: false,\n        status: 400,\n        error: 'Unsupported URL protocol',\n        message: `Allowed protocols: ${this.config.allowedProtocols.join(', ')}`,\n      };\n    }\n\n    if (\n      !this.config.allowPrivateAddresses &&\n      this.isPrivateOrLocalHost(parsedUrl.hostname)\n    ) {\n      return {\n        valid: false,\n        status: 403,\n        error: 'Private or local addresses are blocked',\n        message:\n          'Set allowPrivateAddresses=true in ProxyConfig only for trusted local network sources',\n      };\n    }\n\n    return {\n      valid: true,\n      status: 200,\n      url: parsedUrl.toString(),\n    };\n  }\n\n  private getCachedInfo(url: string): InfoResponsePayload | null {\n    if (!this.config.cacheEnabled) {\n      return null;\n    }\n\n    const cachedEntry = this.infoCache.get(url);\n    if (!cachedEntry) {\n      return null;\n    }\n\n    if (cachedEntry.expiresAt <= Date.now()) {\n      this.infoCache.delete(url);\n      return null;\n    }\n\n    return cachedEntry.payload;\n  }\n\n  private setCachedInfo(url: string, payload: InfoResponsePayload): void {\n    if (!this.config.cacheEnabled) {\n      return;\n    }\n\n    const ttlMs = Math.max(1, this.config.cacheTTL) * 1000;\n    this.infoCache.set(url, {\n      expiresAt: Date.now() + ttlMs,\n      payload,\n    });\n  }\n\n  private isPrivateOrLocalHost(hostname: string): boolean {\n    const normalizedHost = hostname.toLowerCase().replace(/\\.$/, '');\n\n    if (\n      normalizedHost === 'localhost' ||\n      normalizedHost.endsWith('.localhost') ||\n      normalizedHost.endsWith('.local')\n    ) {\n      return true;\n    }\n\n    const ipVersion = isIP(normalizedHost);\n\n    if (ipVersion === 0) {\n      return false;\n    }\n\n    if (ipVersion === 4) {\n      const octets = normalizedHost.split('.').map(Number);\n      const first = octets[0];\n      const second = octets[1];\n\n      return (\n        first === 10 ||\n        first === 127 ||\n        first === 0 ||\n        (first === 169 && second === 254) ||\n        (first === 172 && second >= 16 && second <= 31) ||\n        (first === 192 && second === 168)\n      );\n    }\n\n    const compactIpv6 = normalizedHost;\n    if (\n      compactIpv6 === '::1' ||\n      compactIpv6 === '::' ||\n      compactIpv6.startsWith('fe8') ||\n      compactIpv6.startsWith('fe9') ||\n      compactIpv6.startsWith('fea') ||\n      compactIpv6.startsWith('feb') ||\n      compactIpv6.startsWith('fc') ||\n      compactIpv6.startsWith('fd')\n    ) {\n      return true;\n    }\n\n    if (compactIpv6.startsWith('::ffff:')) {\n      const mappedIpv4 = compactIpv6.slice('::ffff:'.length);\n      return this.isPrivateOrLocalHost(mappedIpv4);\n    }\n\n    return false;\n  }\n\n  private normalizeRequestError(\n    error: unknown,\n    url: string,\n    context: ErrorContext\n  ): NormalizedError {\n    const fallbackError =\n      context === 'info' ? 'Failed to get stream info' : 'Proxy request failed';\n\n    const axiosError = axios.isAxiosError(error)\n      ? (error as {\n          response?: { status: number; statusText: string };\n          code?: string;\n        })\n      : undefined;\n\n    if (axiosError?.response) {\n      return {\n        status: axiosError.response.status,\n        body: {\n          error: `Upstream error: ${axiosError.response.status} ${axiosError.response.statusText}`,\n          url,\n        },\n      };\n    }\n\n    const axiosErrorCode =\n      axiosError && typeof axiosError.code === 'string'\n        ? axiosError.code\n        : undefined;\n    const errorCode = getErrorCode(error) || axiosErrorCode;\n\n    if (errorCode === 'ENOTFOUND') {\n      return {\n        status: 404,\n        body: {\n          error: 'Audio source not found',\n          message: 'Unable to resolve hostname',\n          url,\n        },\n      };\n    }\n\n    if (errorCode === 'ECONNREFUSED') {\n      return {\n        status: 503,\n        body: {\n          error: 'Audio source unavailable',\n          message: 'Connection refused',\n          url,\n        },\n      };\n    }\n\n    if (errorCode === 'ETIMEDOUT' || errorCode === 'ECONNABORTED') {\n      return {\n        status: 408,\n        body: {\n          error: 'Request timeout',\n          message: 'Audio source did not respond in time',\n          url,\n        },\n      };\n    }\n\n    return {\n      status: 500,\n      body: {\n        error: fallbackError,\n        message: getErrorMessage(error),\n        url,\n      },\n    };\n  }\n\n  public async start(): Promise<void> {\n    try {\n      // Find an available port starting from the configured port\n      this.actualPort = await findAvailablePort(\n        this.config.port,\n        this.config.host\n      );\n\n      return new Promise((resolve, reject) => {\n        this.server = this.app.listen(this.actualPort, this.config.host, () => {\n          if (this.actualPort !== this.config.port) {\n            console.log(\n              `⚠️  Port ${this.config.port} was occupied, using port ${this.actualPort} instead`\n            );\n          }\n          console.log(\n            `Desktop Audio Proxy running on http://${this.config.host}:${this.actualPort}`\n          );\n          console.log(\n            `Use http://${this.config.host}:${this.actualPort}/proxy?url=YOUR_AUDIO_URL`\n          );\n          resolve();\n        });\n\n        this.server.on('error', (error: Error) => {\n          reject(error);\n        });\n      });\n    } catch (error: unknown) {\n      const errorMessage = getErrorMessage(error);\n      throw new Error(`Failed to start proxy server: ${errorMessage}`);\n    }\n  }\n\n  public async stop(): Promise<void> {\n    return new Promise(resolve => {\n      this.infoCache.clear();\n      if (this.server) {\n        this.server.close(() => {\n          console.log('Desktop Audio Proxy stopped');\n          resolve();\n        });\n      } else {\n        resolve();\n      }\n    });\n  }\n\n  public getActualPort(): number {\n    return this.actualPort || this.config.port;\n  }\n\n  public getProxyUrl(): string {\n    return `http://${this.config.host}:${this.getActualPort()}`;\n  }\n}\n\n// Convenience functions\nexport function createProxyServer(config?: ProxyConfig): AudioProxyServer {\n  return new AudioProxyServer(config);\n}\n\nexport async function startProxyServer(\n  config?: ProxyConfig\n): Promise<AudioProxyServer> {\n  const server = createProxyServer(config);\n  await server.start();\n  return server;\n}\n"],"names":["CODEC_FORMATS","isSupportedResult","mergeSupportedFormat","createServer","isIP"],"mappings":"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"}