{"version":3,"file":"asset-prefetch.mjs","sources":["../../../../src/lib/performance/prefetch/asset-prefetch.ts"],"sourcesContent":["/**\n * @file Asset Prefetching\n * @description Static asset prefetching for images, fonts, scripts, and stylesheets.\n * Optimizes loading of critical and non-critical assets.\n *\n * Features:\n * - Image prefetching with responsive support\n * - Font prefetching with display strategies\n * - Script and stylesheet prefetching\n * - Asset prioritization\n * - Responsive image prefetching\n * - Network-aware asset loading\n */\n\nimport { getPrefetchQueue, type PrefetchQueue, type PrefetchPriority } from './prefetch-queue';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Asset type\n */\nexport type AssetType = 'image' | 'font' | 'script' | 'style' | 'video' | 'audio' | 'document';\n\n/**\n * Asset definition\n */\nexport interface Asset {\n  url: string;\n  type: AssetType;\n  priority?: PrefetchPriority;\n  crossOrigin?: 'anonymous' | 'use-credentials';\n  as?: string;\n  media?: string;\n  sizes?: string;\n  srcset?: string;\n}\n\n/**\n * Image asset with responsive support\n */\nexport interface ResponsiveImage {\n  src: string;\n  srcset?: Array<{ url: string; width: number }>;\n  sizes?: string;\n  alt?: string;\n  priority?: PrefetchPriority;\n}\n\n/**\n * Font asset configuration\n */\nexport interface FontAsset {\n  url: string;\n  family: string;\n  weight?: string | number;\n  style?: 'normal' | 'italic';\n  display?: 'auto' | 'block' | 'swap' | 'fallback' | 'optional';\n  unicodeRange?: string;\n  priority?: PrefetchPriority;\n}\n\n/**\n * Asset prefetch configuration\n */\nexport interface AssetPrefetchConfig {\n  /** Enable asset prefetching */\n  enabled: boolean;\n  /** Network quality awareness */\n  networkAware: boolean;\n  /** Minimum network quality for prefetch */\n  minNetworkQuality: '4g' | '3g' | '2g' | 'slow-2g';\n  /** Maximum concurrent prefetches */\n  maxConcurrent: number;\n  /** Prefetch images by default */\n  prefetchImages: boolean;\n  /** Prefetch fonts by default */\n  prefetchFonts: boolean;\n  /** Use responsive image prefetching */\n  responsiveImages: boolean;\n  /** Default image priority */\n  defaultImagePriority: PrefetchPriority;\n  /** Default font priority */\n  defaultFontPriority: PrefetchPriority;\n  /** Debug mode */\n  debug: boolean;\n}\n\n/**\n * Prefetch result\n */\nexport interface AssetPrefetchResult {\n  url: string;\n  type: AssetType;\n  success: boolean;\n  duration: number;\n  size?: number;\n  error?: Error;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_CONFIG: AssetPrefetchConfig = {\n  enabled: true,\n  networkAware: true,\n  minNetworkQuality: '3g',\n  maxConcurrent: 4,\n  prefetchImages: true,\n  prefetchFonts: true,\n  responsiveImages: true,\n  defaultImagePriority: 'normal',\n  defaultFontPriority: 'high',\n  debug: false,\n};\n\nconst NETWORK_QUALITY_ORDER: Record<string, number> = {\n  '4g': 4,\n  '3g': 3,\n  '2g': 2,\n  'slow-2g': 1,\n};\n\n// ============================================================================\n// Asset Prefetch Manager\n// ============================================================================\n\n/**\n * Manages asset prefetching\n */\nexport class AssetPrefetchManager {\n  private config: AssetPrefetchConfig;\n  private queue: PrefetchQueue;\n  private prefetchedAssets: Set<string> = new Set();\n  private loadedFonts: Set<string> = new Set();\n\n  constructor(config: Partial<AssetPrefetchConfig> = {}) {\n    this.config = { ...DEFAULT_CONFIG, ...config };\n    this.queue = getPrefetchQueue({ maxConcurrent: this.config.maxConcurrent });\n  }\n\n  /**\n   * Prefetch an asset\n   */\n  async prefetch(asset: Asset): Promise<AssetPrefetchResult> {\n    const startTime = performance.now();\n\n    if (!this.config.enabled) {\n      return {\n        url: asset.url,\n        type: asset.type,\n        success: false,\n        duration: 0,\n        error: new Error('Asset prefetch disabled'),\n      };\n    }\n\n    if (this.prefetchedAssets.has(asset.url)) {\n      return {\n        url: asset.url,\n        type: asset.type,\n        success: true,\n        duration: 0,\n      };\n    }\n\n    if (!this.shouldPrefetch()) {\n      return {\n        url: asset.url,\n        type: asset.type,\n        success: false,\n        duration: 0,\n        error: new Error('Network conditions not suitable'),\n      };\n    }\n\n    this.log(`Prefetching asset: ${asset.url}`);\n\n    try {\n      const size = await this.prefetchByType(asset);\n      this.prefetchedAssets.add(asset.url);\n\n      const duration = performance.now() - startTime;\n      this.log(`Asset prefetched: ${asset.url} (${duration.toFixed(2)}ms)`);\n\n      return {\n        url: asset.url,\n        type: asset.type,\n        success: true,\n        duration,\n        size,\n      };\n    } catch (error) {\n      const duration = performance.now() - startTime;\n      this.log(`Asset prefetch failed: ${asset.url}`, error);\n\n      return {\n        url: asset.url,\n        type: asset.type,\n        success: false,\n        duration,\n        error: error instanceof Error ? error : new Error(String(error)),\n      };\n    }\n  }\n\n  /**\n   * Prefetch multiple assets\n   */\n  async prefetchMany(assets: Asset[]): Promise<AssetPrefetchResult[]> {\n    const results: AssetPrefetchResult[] = [];\n\n    // Sort by priority\n    const sorted = [...assets].sort((a, b) => {\n      const priorityOrder: Record<PrefetchPriority, number> = {\n        critical: 0,\n        high: 1,\n        normal: 2,\n        low: 3,\n        idle: 4,\n      };\n      const priorityA = priorityOrder[a.priority ?? 'normal'];\n      const priorityB = priorityOrder[b.priority ?? 'normal'];\n      return priorityA - priorityB;\n    });\n\n    for (const asset of sorted) {\n      const result = await this.prefetch(asset);\n      results.push(result);\n    }\n\n    return results;\n  }\n\n  /**\n   * Prefetch an image with responsive support\n   */\n  async prefetchImage(image: ResponsiveImage): Promise<AssetPrefetchResult> {\n    const url =\n      this.config.responsiveImages && image.srcset\n        ? this.selectResponsiveSource(image.srcset)\n        : image.src;\n\n    return this.prefetch({\n      url,\n      type: 'image',\n      priority: image.priority ?? this.config.defaultImagePriority,\n    });\n  }\n\n  /**\n   * Prefetch multiple images\n   */\n  async prefetchImages(images: Array<string | ResponsiveImage>): Promise<AssetPrefetchResult[]> {\n    const assets: Asset[] = images.map((img) => {\n      if (typeof img === 'string') {\n        return {\n          url: img,\n          type: 'image' as AssetType,\n          priority: this.config.defaultImagePriority,\n        };\n      }\n\n      const url =\n        this.config.responsiveImages && img.srcset\n          ? this.selectResponsiveSource(img.srcset)\n          : img.src;\n\n      return {\n        url,\n        type: 'image' as AssetType,\n        priority: img.priority ?? this.config.defaultImagePriority,\n      };\n    });\n\n    return this.prefetchMany(assets);\n  }\n\n  /**\n   * Prefetch a font\n   */\n  async prefetchFont(font: FontAsset): Promise<AssetPrefetchResult> {\n    const startTime = performance.now();\n\n    if (this.loadedFonts.has(font.url)) {\n      return {\n        url: font.url,\n        type: 'font',\n        success: true,\n        duration: 0,\n      };\n    }\n\n    this.log(`Prefetching font: ${font.family}`);\n\n    try {\n      // Create preload link\n      this.createPreloadLink(font.url, 'font', {\n        crossOrigin: 'anonymous',\n      });\n\n      // Use CSS Font Loading API if available\n      if ('FontFace' in window) {\n        const fontFace = new FontFace(font.family, `url(${font.url})`, {\n          weight: String(font.weight ?? 'normal'),\n          style: font.style ?? 'normal',\n          display: font.display ?? 'swap',\n          unicodeRange: font.unicodeRange,\n        });\n\n        await fontFace.load();\n        document.fonts.add(fontFace);\n      }\n\n      this.loadedFonts.add(font.url);\n      this.prefetchedAssets.add(font.url);\n\n      const duration = performance.now() - startTime;\n      this.log(`Font prefetched: ${font.family} (${duration.toFixed(2)}ms)`);\n\n      return {\n        url: font.url,\n        type: 'font',\n        success: true,\n        duration,\n      };\n    } catch (error) {\n      const duration = performance.now() - startTime;\n      this.log(`Font prefetch failed: ${font.family}`, error);\n\n      return {\n        url: font.url,\n        type: 'font',\n        success: false,\n        duration,\n        error: error instanceof Error ? error : new Error(String(error)),\n      };\n    }\n  }\n\n  /**\n   * Prefetch multiple fonts\n   */\n  async prefetchFonts(fonts: FontAsset[]): Promise<AssetPrefetchResult[]> {\n    const results: AssetPrefetchResult[] = [];\n\n    for (const font of fonts) {\n      const result = await this.prefetchFont(font);\n      results.push(result);\n    }\n\n    return results;\n  }\n\n  /**\n   * Prefetch a script\n   */\n  prefetchScript(url: string, priority?: PrefetchPriority): void {\n    if (this.prefetchedAssets.has(url)) {\n      return;\n    }\n\n    this.queue.enqueue(url, {\n      type: 'script',\n      priority: priority ?? 'normal',\n    });\n\n    this.prefetchedAssets.add(url);\n  }\n\n  /**\n   * Prefetch a stylesheet\n   */\n  prefetchStyle(url: string, priority?: PrefetchPriority): void {\n    if (this.prefetchedAssets.has(url)) {\n      return;\n    }\n\n    this.queue.enqueue(url, {\n      type: 'style',\n      priority: priority ?? 'high',\n    });\n\n    this.prefetchedAssets.add(url);\n  }\n\n  /**\n   * Preload a critical asset\n   */\n  preload(\n    url: string,\n    as: string,\n    options: {\n      crossOrigin?: 'anonymous' | 'use-credentials';\n      type?: string;\n      media?: string;\n    } = {}\n  ): HTMLLinkElement {\n    return this.createPreloadLink(url, as, options);\n  }\n\n  /**\n   * Create DNS prefetch hint\n   */\n  dnsPrefetch(hostname: string): void {\n    if (document.querySelector(`link[rel=\"dns-prefetch\"][href=\"${hostname}\"]`)) {\n      return;\n    }\n\n    const link = document.createElement('link');\n    link.rel = 'dns-prefetch';\n    link.href = hostname;\n    document.head.appendChild(link);\n\n    this.log(`DNS prefetch: ${hostname}`);\n  }\n\n  /**\n   * Create preconnect hint\n   */\n  preconnect(origin: string, crossOrigin?: boolean): void {\n    if (document.querySelector(`link[rel=\"preconnect\"][href=\"${origin}\"]`)) {\n      return;\n    }\n\n    const link = document.createElement('link');\n    link.rel = 'preconnect';\n    link.href = origin;\n    if (crossOrigin === true) {\n      link.crossOrigin = 'anonymous';\n    }\n    document.head.appendChild(link);\n\n    this.log(`Preconnect: ${origin}`);\n  }\n\n  /**\n   * Check if asset was prefetched\n   */\n  isPrefetched(url: string): boolean {\n    return this.prefetchedAssets.has(url);\n  }\n\n  /**\n   * Get prefetch statistics\n   */\n  getStats(): {\n    prefetchedAssets: number;\n    loadedFonts: number;\n    queueStats: ReturnType<PrefetchQueue['getStats']>;\n  } {\n    return {\n      prefetchedAssets: this.prefetchedAssets.size,\n      loadedFonts: this.loadedFonts.size,\n      queueStats: this.queue.getStats(),\n    };\n  }\n\n  /**\n   * Clear prefetch tracking\n   */\n  clear(): void {\n    this.prefetchedAssets.clear();\n    this.loadedFonts.clear();\n  }\n\n  // ============================================================================\n  // Private Methods\n  // ============================================================================\n\n  private async prefetchByType(asset: Asset): Promise<number | undefined> {\n    switch (asset.type) {\n      case 'image':\n        return this.prefetchImageUrl(asset.url);\n      case 'font':\n        this.createPreloadLink(asset.url, 'font', {\n          crossOrigin: asset.crossOrigin ?? 'anonymous',\n        });\n        return undefined;\n      case 'script':\n        this.queue.enqueue(asset.url, {\n          type: 'script',\n          priority: asset.priority ?? 'normal',\n        });\n        return undefined;\n      case 'style':\n        this.queue.enqueue(asset.url, {\n          type: 'style',\n          priority: asset.priority ?? 'high',\n        });\n        return undefined;\n      case 'video':\n      case 'audio':\n        this.createPreloadLink(asset.url, asset.type);\n        return undefined;\n      case 'document':\n        this.queue.enqueue(asset.url, {\n          type: 'document',\n          priority: asset.priority ?? 'normal',\n        });\n        return undefined;\n      default:\n        this.createPrefetchLink(asset.url);\n        return undefined;\n    }\n  }\n\n  private async prefetchImageUrl(url: string): Promise<number> {\n    return new Promise((resolve, reject) => {\n      const img = new Image();\n      img.onload = () => {\n        // Estimate size (rough calculation)\n        const size = img.naturalWidth * img.naturalHeight * 4;\n        resolve(size);\n      };\n      img.onerror = () => reject(new Error(`Failed to prefetch image: ${url}`));\n      img.src = url;\n    });\n  }\n\n  private selectResponsiveSource(srcset: Array<{ url: string; width: number }>): string {\n    if (typeof window === 'undefined') {\n      return srcset[0]?.url ?? '';\n    }\n\n    const dpr = window.devicePixelRatio ?? 1;\n    const viewportWidth = window.innerWidth * dpr;\n\n    // Find the best matching source\n    const sorted = [...srcset].sort((a, b) => a.width - b.width);\n    const best = sorted.find((s) => s.width >= viewportWidth) ?? sorted[sorted.length - 1];\n\n    return best?.url ?? '';\n  }\n\n  private createPreloadLink(\n    url: string,\n    as: string,\n    options: {\n      crossOrigin?: 'anonymous' | 'use-credentials';\n      type?: string;\n      media?: string;\n    } = {}\n  ): HTMLLinkElement {\n    // Check if already exists\n    const existing = document.querySelector(`link[rel=\"preload\"][href=\"${url}\"]`);\n    if (existing) {\n      return existing as HTMLLinkElement;\n    }\n\n    const link = document.createElement('link');\n    link.rel = 'preload';\n    link.href = url;\n    link.as = as;\n\n    if (options.crossOrigin != null) {\n      link.crossOrigin = options.crossOrigin;\n    }\n\n    if (options.type != null && options.type !== '') {\n      link.type = options.type;\n    }\n\n    if (options.media != null && options.media !== '') {\n      link.media = options.media;\n    }\n\n    document.head.appendChild(link);\n    return link;\n  }\n\n  private createPrefetchLink(url: string): HTMLLinkElement {\n    // Check if already exists\n    const existing = document.querySelector(`link[rel=\"prefetch\"][href=\"${url}\"]`);\n    if (existing) {\n      return existing as HTMLLinkElement;\n    }\n\n    const link = document.createElement('link');\n    link.rel = 'prefetch';\n    link.href = url;\n    document.head.appendChild(link);\n    return link;\n  }\n\n  private shouldPrefetch(): boolean {\n    if (!this.config.networkAware) {\n      return true;\n    }\n\n    const connection = this.getNetworkInfo();\n    if (connection === null) {\n      return true;\n    }\n\n    if (connection.saveData === true) {\n      this.log('Skipping prefetch: Data saver enabled');\n      return false;\n    }\n\n    if (connection.effectiveType !== undefined) {\n      const currentQuality = NETWORK_QUALITY_ORDER[connection.effectiveType] ?? 3;\n      const minQuality = NETWORK_QUALITY_ORDER[this.config.minNetworkQuality] ?? 3;\n\n      if (currentQuality < minQuality) {\n        this.log(`Skipping prefetch: Network quality ${connection.effectiveType} below minimum`);\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  private getNetworkInfo(): {\n    effectiveType?: string;\n    saveData?: boolean;\n  } | null {\n    const nav = navigator as Navigator & {\n      connection?: {\n        effectiveType?: string;\n        saveData?: boolean;\n      };\n    };\n    return nav.connection ?? null;\n  }\n\n  private log(message: string, ...args: unknown[]): void {\n    if (this.config.debug) {\n      console.info(`[AssetPrefetch] ${message}`, ...args);\n    }\n  }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet managerInstance: AssetPrefetchManager | null = null;\n\n/**\n * Get or create the global asset prefetch manager\n */\nexport function getAssetPrefetchManager(\n  config?: Partial<AssetPrefetchConfig>\n): AssetPrefetchManager {\n  managerInstance ??= new AssetPrefetchManager(config);\n  return managerInstance;\n}\n\n/**\n * Reset the manager instance\n */\nexport function resetAssetPrefetchManager(): void {\n  if (managerInstance !== null) {\n    managerInstance.clear();\n    managerInstance = null;\n  }\n}\n\n// ============================================================================\n// Convenience Functions\n// ============================================================================\n\n/**\n * Prefetch an image\n */\nexport async function prefetchImage(\n  url: string,\n  priority?: PrefetchPriority\n): Promise<AssetPrefetchResult> {\n  return getAssetPrefetchManager().prefetch({\n    url,\n    type: 'image',\n    priority,\n  });\n}\n\n/**\n * Prefetch images\n */\nexport async function prefetchImages(urls: string[]): Promise<AssetPrefetchResult[]> {\n  return getAssetPrefetchManager().prefetchImages(urls);\n}\n\n/**\n * Prefetch a font\n */\nexport async function prefetchFont(font: FontAsset): Promise<AssetPrefetchResult> {\n  return getAssetPrefetchManager().prefetchFont(font);\n}\n\n/**\n * Create DNS prefetch hint\n */\nexport function dnsPrefetch(hostname: string): void {\n  getAssetPrefetchManager().dnsPrefetch(hostname);\n}\n\n/**\n * Create preconnect hint\n */\nexport function preconnect(origin: string, crossOrigin?: boolean): void {\n  getAssetPrefetchManager().preconnect(origin, crossOrigin);\n}\n\n/**\n * Preload a critical asset\n */\nexport function preloadAsset(\n  url: string,\n  as: string,\n  options?: Parameters<AssetPrefetchManager['preload']>[2]\n): HTMLLinkElement {\n  return getAssetPrefetchManager().preload(url, as, options);\n}\n"],"names":["DEFAULT_CONFIG","NETWORK_QUALITY_ORDER","AssetPrefetchManager","config","getPrefetchQueue","asset","startTime","size","duration","error","assets","results","sorted","a","b","priorityOrder","priorityA","priorityB","result","image","url","images","img","font","fontFace","fonts","priority","as","options","hostname","link","origin","crossOrigin","resolve","reject","srcset","dpr","viewportWidth","s","existing","connection","currentQuality","minQuality","message","args","managerInstance","getAssetPrefetchManager","resetAssetPrefetchManager","prefetchImage","prefetchImages","urls","prefetchFont","dnsPrefetch","preconnect","preloadAsset"],"mappings":"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"}