{"version":3,"file":"module-loader.mjs","sources":["../../../src/lib/vdom/module-loader.ts"],"sourcesContent":["/**\n * @file Module Loader\n * @module vdom/module-loader\n * @description Dynamic module loading orchestration with priority queues,\n * prefetch hints, code splitting integration, and performance monitoring.\n * Implements intelligent loading strategies for optimal user experience.\n *\n * @author Agent 5 - PhD Virtual DOM Expert\n * @version 1.0.0\n */\n\nimport type { ComponentType } from 'react';\nimport {\n  type ModuleId,\n  type ModuleLoadOptions,\n  type ModuleLoadingState,\n  LoadingPriority,\n} from './types';\nimport { getDefaultRegistry, type ModuleRegistry } from './module-registry';\nimport { DEFAULT_TIMEOUT, DEFAULT_RETRY_BASE_DELAY } from '@/lib/core/config/constants';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Loading task in the queue.\n */\ninterface LoadingTask {\n  /** Module ID */\n  moduleId: ModuleId;\n  /** Loading priority */\n  priority: LoadingPriority;\n  /** Loading options */\n  options: ModuleLoadOptions;\n  /** Task creation timestamp */\n  createdAt: number;\n  /** Number of retries attempted */\n  retryCount: number;\n  /** Resolve function for the promise */\n  resolve: (component: ComponentType<unknown>) => void;\n  /** Reject function for the promise */\n  reject: (error: Error) => void;\n}\n\n/**\n * Prefetch hint configuration.\n */\nexport interface PrefetchHint {\n  /** Module ID to prefetch */\n  moduleId: ModuleId;\n  /** Likelihood of being needed (0-1) */\n  probability: number;\n  /** When to trigger prefetch */\n  trigger: 'immediate' | 'idle' | 'visible' | 'hover';\n  /** Element to observe for visibility/hover */\n  element?: Element;\n}\n\n/**\n * Loading performance metrics.\n */\nexport interface LoadingMetrics {\n  /** Total modules loaded */\n  totalLoaded: number;\n  /** Total load time (ms) */\n  totalLoadTime: number;\n  /** Average load time (ms) */\n  averageLoadTime: number;\n  /** Failed loads */\n  failedLoads: number;\n  /** Cache hits */\n  cacheHits: number;\n  /** Prefetch hits */\n  prefetchHits: number;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default loading options.\n */\nconst DEFAULT_LOAD_OPTIONS: Required<ModuleLoadOptions> = {\n  priority: LoadingPriority.NORMAL,\n  timeout: DEFAULT_TIMEOUT,\n  retries: 3,\n  retryDelay: DEFAULT_RETRY_BASE_DELAY,\n  preloadDependencies: true,\n  onProgress: () => {},\n  onComplete: () => {},\n  onError: () => {},\n};\n\n/**\n * Maximum concurrent loads.\n */\nconst MAX_CONCURRENT_LOADS = 6;\n\n/**\n * Minimum probability for prefetch to trigger.\n */\nconst MIN_PREFETCH_PROBABILITY = 0.3;\n\n// ============================================================================\n// ModuleLoader Class\n// ============================================================================\n\n/**\n * Orchestrates module loading with intelligent strategies.\n * Supports priority-based loading, prefetching, and performance monitoring.\n *\n * @example\n * ```typescript\n * const loader = new ModuleLoader();\n *\n * // Load a module with high priority\n * const component = await loader.load(moduleId, {\n *   priority: LoadingPriority.HIGH,\n *   timeout: 5000,\n * });\n *\n * // Add prefetch hint\n * loader.addPrefetchHint({\n *   moduleId: otherModuleId,\n *   probability: 0.8,\n *   trigger: 'idle',\n * });\n * ```\n */\nexport class ModuleLoader {\n  /** Module registry reference */\n  private readonly registry: ModuleRegistry;\n\n  /** Priority queues for loading tasks */\n  private readonly queues: Map<LoadingPriority, LoadingTask[]> = new Map();\n\n  /** Currently loading modules */\n  private readonly loading: Set<ModuleId> = new Set();\n\n  /** Loading states by module */\n  private readonly loadingStates: Map<ModuleId, ModuleLoadingState> = new Map();\n\n  /** Prefetch hints */\n  private readonly prefetchHints: Map<ModuleId, PrefetchHint> = new Map();\n\n  /** Intersection observers for visibility-based prefetch */\n  private readonly visibilityObservers: Map<ModuleId, IntersectionObserver> = new Map();\n\n  /** Loading metrics */\n  private metrics: LoadingMetrics = {\n    totalLoaded: 0,\n    totalLoadTime: 0,\n    averageLoadTime: 0,\n    failedLoads: 0,\n    cacheHits: 0,\n    prefetchHits: 0,\n  };\n\n  /** Whether loader is processing queue */\n  private isProcessing: boolean = false;\n\n  /** Idle callback ID */\n  private idleCallbackId: number | null = null;\n\n  /**\n   * Creates a new ModuleLoader.\n   * @param registry - Module registry (defaults to global)\n   */\n  constructor(registry?: ModuleRegistry) {\n    this.registry = registry ?? getDefaultRegistry();\n\n    // Initialize priority queues\n    Object.values(LoadingPriority)\n      .filter((_v): _v is LoadingPriority => true)\n      .forEach((priority) => {\n        this.queues.set(priority, []);\n      });\n  }\n\n  // ==========================================================================\n  // Loading API\n  // ==========================================================================\n\n  /**\n   * Gets the number of pending loads.\n   */\n  get pendingCount(): number {\n    let count = 0;\n    for (const queue of this.queues.values()) {\n      count += queue.length;\n    }\n    return count;\n  }\n\n  /**\n   * Gets the number of currently loading modules.\n   */\n  get loadingCount(): number {\n    return this.loading.size;\n  }\n\n  /**\n   * Loads a module with the given options.\n   * @param moduleId - Module to load\n   * @param options - Loading options\n   * @returns Loaded component\n   */\n  async load(moduleId: ModuleId, options: ModuleLoadOptions = {}): Promise<ComponentType<unknown>> {\n    const opts = { ...DEFAULT_LOAD_OPTIONS, ...options };\n\n    // Check if already loaded (cache hit)\n    const entry = this.registry.get(moduleId);\n    if (entry?.component) {\n      this.metrics.cacheHits++;\n\n      // Check if this was a prefetch hit\n      if (this.prefetchHints.has(moduleId)) {\n        this.metrics.prefetchHits++;\n      }\n\n      opts.onComplete();\n      return entry.component;\n    }\n\n    // Check if module is registered\n    if (!entry) {\n      const error = new Error(`Module not registered: ${moduleId}`);\n      opts.onError(error);\n      throw error;\n    }\n\n    // Update loading state\n    this.updateLoadingState(moduleId, {\n      moduleId,\n      state: 'queued',\n      progress: 0,\n      error: null,\n      startedAt: null,\n      completedAt: null,\n      dependenciesLoaded: 0,\n      dependenciesTotal: entry.config.dependencies?.length ?? 0,\n    });\n\n    // Create loading promise\n    return new Promise<ComponentType<unknown>>((resolve, reject) => {\n      const task: LoadingTask = {\n        moduleId,\n        priority: opts.priority,\n        options: opts,\n        createdAt: Date.now(),\n        retryCount: 0,\n        resolve,\n        reject,\n      };\n\n      // Add to appropriate queue\n      const queue = this.queues.get(opts.priority) ?? [];\n      queue.push(task);\n      this.queues.set(opts.priority, queue);\n\n      // Process queue\n      void this.processQueue();\n    });\n  }\n\n  /**\n   * Loads multiple modules in parallel.\n   * @param moduleIds - Modules to load\n   * @param options - Loading options\n   * @returns Loaded components\n   */\n  async loadMany(\n    moduleIds: ModuleId[],\n    options: ModuleLoadOptions = {}\n  ): Promise<Map<ModuleId, ComponentType<unknown>>> {\n    const results = new Map<ModuleId, ComponentType<unknown>>();\n\n    await Promise.all(\n      moduleIds.map(async (id) => {\n        try {\n          const component = await this.load(id, options);\n          results.set(id, component);\n        } catch {\n          // Individual failures don't stop others\n        }\n      })\n    );\n\n    return results;\n  }\n\n  // ==========================================================================\n  // Prefetching\n  // ==========================================================================\n\n  /**\n   * Gets the loading state of a module.\n   * @param moduleId - Module ID\n   * @returns Loading state or null\n   */\n  getLoadingState(moduleId: ModuleId): ModuleLoadingState | null {\n    return this.loadingStates.get(moduleId) ?? null;\n  }\n\n  /**\n   * Cancels a pending load.\n   * @param moduleId - Module to cancel\n   * @returns Whether cancellation was successful\n   */\n  cancel(moduleId: ModuleId): boolean {\n    // Remove from queues\n    for (const [priority, queue] of this.queues) {\n      const index = queue.findIndex((t) => t.moduleId === moduleId);\n      if (index !== -1) {\n        const [task] = queue.splice(index, 1);\n        task?.reject(new Error('Loading cancelled'));\n        this.queues.set(priority, queue);\n        this.loadingStates.delete(moduleId);\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * Adds a prefetch hint for a module.\n   * @param hint - Prefetch hint configuration\n   */\n  addPrefetchHint(hint: PrefetchHint): void {\n    if (hint.probability < MIN_PREFETCH_PROBABILITY) {\n      return; // Too unlikely to prefetch\n    }\n\n    this.prefetchHints.set(hint.moduleId, hint);\n\n    switch (hint.trigger) {\n      case 'immediate':\n        this.triggerPrefetch(hint.moduleId);\n        break;\n\n      case 'idle':\n        this.schedulePrefetchOnIdle(hint.moduleId);\n        break;\n\n      case 'visible':\n        if (hint.element) {\n          this.observeForVisibility(hint.moduleId, hint.element);\n        }\n        break;\n\n      case 'hover':\n        if (hint.element) {\n          this.observeForHover(hint.moduleId, hint.element);\n        }\n        break;\n    }\n  }\n\n  /**\n   * Removes a prefetch hint.\n   * @param moduleId - Module ID\n   */\n  removePrefetchHint(moduleId: ModuleId): void {\n    this.prefetchHints.delete(moduleId);\n\n    // Clean up observers\n    const observer = this.visibilityObservers.get(moduleId);\n    if (observer) {\n      observer.disconnect();\n      this.visibilityObservers.delete(moduleId);\n    }\n  }\n\n  /**\n   * Gets loading metrics.\n   * @returns Loading metrics\n   */\n  getMetrics(): LoadingMetrics {\n    return { ...this.metrics };\n  }\n\n  /**\n   * Resets loading metrics.\n   */\n  resetMetrics(): void {\n    this.metrics = {\n      totalLoaded: 0,\n      totalLoadTime: 0,\n      averageLoadTime: 0,\n      failedLoads: 0,\n      cacheHits: 0,\n      prefetchHits: 0,\n    };\n  }\n\n  // ==========================================================================\n  // Queue Processing\n  // ==========================================================================\n\n  /**\n   * Clears all queues and cancels pending loads.\n   */\n  clearQueues(): void {\n    for (const [priority, queue] of this.queues) {\n      for (const task of queue) {\n        task.reject(new Error('Queue cleared'));\n      }\n      this.queues.set(priority, []);\n    }\n\n    this.loadingStates.clear();\n  }\n\n  /**\n   * Disposes the loader and cleans up resources.\n   */\n  dispose(): void {\n    this.clearQueues();\n\n    // Clean up observers\n    for (const observer of this.visibilityObservers.values()) {\n      observer.disconnect();\n    }\n    this.visibilityObservers.clear();\n\n    // Cancel idle callback\n    if (this.idleCallbackId !== null && 'cancelIdleCallback' in window) {\n      window.cancelIdleCallback(this.idleCallbackId);\n    }\n\n    this.prefetchHints.clear();\n  }\n\n  /**\n   * Triggers prefetch for a module.\n   * @param moduleId - Module to prefetch\n   */\n  private triggerPrefetch(moduleId: ModuleId): void {\n    this.load(moduleId, {\n      priority: LoadingPriority.PREFETCH,\n    }).catch(() => {\n      // Prefetch failures are silent\n    });\n  }\n\n  /**\n   * Schedules prefetch for idle time.\n   * @param moduleId - Module to prefetch\n   */\n  private schedulePrefetchOnIdle(moduleId: ModuleId): void {\n    if ('requestIdleCallback' in window) {\n      window.requestIdleCallback(\n        () => {\n          this.triggerPrefetch(moduleId);\n        },\n        { timeout: 5000 }\n      );\n    } else {\n      // Fallback to setTimeout\n      setTimeout(() => {\n        this.triggerPrefetch(moduleId);\n      }, 100);\n    }\n  }\n\n  /**\n   * Sets up visibility observation for prefetch.\n   * @param moduleId - Module ID\n   * @param element - Element to observe\n   */\n  private observeForVisibility(moduleId: ModuleId, element: Element): void {\n    const observer = new IntersectionObserver(\n      (entries) => {\n        for (const entry of entries) {\n          if (entry.isIntersecting) {\n            this.triggerPrefetch(moduleId);\n            observer.disconnect();\n            this.visibilityObservers.delete(moduleId);\n          }\n        }\n      },\n      { rootMargin: '100px' }\n    );\n\n    observer.observe(element);\n    this.visibilityObservers.set(moduleId, observer);\n  }\n\n  /**\n   * Sets up hover observation for prefetch.\n   * @param moduleId - Module ID\n   * @param element - Element to observe\n   */\n  private observeForHover(moduleId: ModuleId, element: Element): void {\n    const handler = (): void => {\n      void this.triggerPrefetch(moduleId);\n      element.removeEventListener('mouseenter', handler);\n    };\n\n    element.addEventListener('mouseenter', handler);\n  }\n\n  // ==========================================================================\n  // Metrics & Management\n  // ==========================================================================\n\n  /**\n   * Processes the loading queue.\n   */\n  private processQueue(): void {\n    if (this.isProcessing) {\n      return;\n    }\n\n    this.isProcessing = true;\n\n    try {\n      while (this.loading.size < MAX_CONCURRENT_LOADS) {\n        const task = this.getNextTask();\n        if (!task) {\n          break;\n        }\n\n        // Don't await - allow concurrent processing\n        void this.executeTask(task);\n      }\n    } finally {\n      this.isProcessing = false;\n\n      // Schedule next check if there are still items\n      if (this.hasQueuedTasks()) {\n        void Promise.resolve().then(() => this.processQueue());\n      }\n    }\n  }\n\n  /**\n   * Checks if there are any tasks in queues.\n   */\n  private hasQueuedTasks(): boolean {\n    for (const queue of this.queues.values()) {\n      if (queue.length > 0) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Gets the next task from queues (highest priority first).\n   * @returns Next task or null\n   */\n  private getNextTask(): LoadingTask | null {\n    const priorities: readonly LoadingPriority[] = Object.values(LoadingPriority)\n      .filter((_v): _v is LoadingPriority => true)\n      .sort((a, b) => a - b);\n\n    for (const priority of priorities) {\n      const queue = this.queues.get(priority);\n      if (queue !== undefined && queue.length > 0) {\n        const task = queue.shift();\n        if (task !== undefined) {\n          return task;\n        }\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * Executes a loading task.\n   * @param task - Task to execute\n   */\n  private async executeTask(task: LoadingTask): Promise<void> {\n    const { moduleId, options } = task;\n    const startTime = Date.now();\n\n    this.loading.add(moduleId);\n\n    this.updateLoadingState(moduleId, {\n      moduleId,\n      state: 'loading',\n      progress: 0.1,\n      error: null,\n      startedAt: startTime,\n      completedAt: null,\n      dependenciesLoaded: 0,\n      dependenciesTotal: 0,\n    });\n\n    try {\n      // Load dependencies first if configured\n      if (options.preloadDependencies === true) {\n        await this.loadDependencies(moduleId, options);\n      }\n\n      // Set up timeout\n      const timeoutPromise = new Promise<never>((_, reject) => {\n        setTimeout(() => {\n          reject(new Error(`Loading timeout for module: ${moduleId}`));\n        }, options.timeout);\n      });\n\n      // Load the component\n      const loadPromise = this.registry.getComponent(moduleId);\n\n      const component = await Promise.race([loadPromise, timeoutPromise]);\n\n      if (!component) {\n        throw new Error(`Failed to load component: ${moduleId}`);\n      }\n\n      // Update metrics\n      const loadTime = Date.now() - startTime;\n      this.metrics.totalLoaded++;\n      this.metrics.totalLoadTime += loadTime;\n      this.metrics.averageLoadTime = this.metrics.totalLoadTime / this.metrics.totalLoaded;\n\n      // Update state\n      this.updateLoadingState(moduleId, {\n        moduleId,\n        state: 'loaded',\n        progress: 1,\n        error: null,\n        startedAt: startTime,\n        completedAt: Date.now(),\n        dependenciesLoaded: 0,\n        dependenciesTotal: 0,\n      });\n\n      options.onProgress?.(1);\n      options.onComplete?.();\n      task.resolve(component);\n    } catch (error) {\n      const err = error instanceof Error ? error : new Error(String(error));\n\n      // Retry logic\n      if (task.retryCount < (options.retries ?? 0)) {\n        task.retryCount++;\n\n        // Re-queue with delay\n        setTimeout(() => {\n          const queue = this.queues.get(task.priority) ?? [];\n          queue.push(task);\n          this.queues.set(task.priority, queue);\n          void this.processQueue();\n        }, options.retryDelay);\n\n        return;\n      }\n\n      // Final failure\n      this.metrics.failedLoads++;\n\n      this.updateLoadingState(moduleId, {\n        moduleId,\n        state: 'error',\n        progress: 0,\n        error: err,\n        startedAt: startTime,\n        completedAt: Date.now(),\n        dependenciesLoaded: 0,\n        dependenciesTotal: 0,\n      });\n\n      options?.onError?.(err);\n      task.reject(err);\n    } finally {\n      this.loading.delete(moduleId);\n      void this.processQueue(); // Continue processing\n    }\n  }\n\n  /**\n   * Loads dependencies for a module.\n   * @param moduleId - Module ID\n   * @param options - Loading options\n   */\n  private async loadDependencies(moduleId: ModuleId, options: ModuleLoadOptions): Promise<void> {\n    const config = this.registry.getConfig(moduleId);\n    if (!config?.dependencies || config.dependencies.length === 0) {\n      return;\n    }\n\n    const deps = config.dependencies.filter((d) => d.lazy !== true);\n    let loaded = 0;\n\n    await Promise.all(\n      deps.map(async (dep) => {\n        try {\n          await this.load(dep.moduleId, {\n            ...options,\n            priority: LoadingPriority.HIGH,\n          });\n          loaded++;\n\n          const state = this.loadingStates.get(moduleId);\n          if (state) {\n            this.updateLoadingState(moduleId, {\n              ...state,\n              dependenciesLoaded: loaded,\n              dependenciesTotal: deps.length,\n            });\n          }\n        } catch (error) {\n          if (dep.required) {\n            throw error;\n          }\n        }\n      })\n    );\n  }\n\n  /**\n   * Updates loading state for a module.\n   * @param moduleId - Module ID\n   * @param state - New state\n   */\n  private updateLoadingState(moduleId: ModuleId, state: ModuleLoadingState): void {\n    this.loadingStates.set(moduleId, state);\n  }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\n/**\n * Default global module loader instance.\n */\nlet defaultLoader: ModuleLoader | null = null;\n\n/**\n * Gets the default global module loader.\n * @returns Default ModuleLoader instance\n */\nexport function getDefaultLoader(): ModuleLoader {\n  defaultLoader ??= new ModuleLoader();\n  return defaultLoader;\n}\n\n/**\n * Sets the default global module loader.\n * @param loader - Loader to set as default\n */\nexport function setDefaultLoader(loader: ModuleLoader): void {\n  if (defaultLoader) {\n    defaultLoader.dispose();\n  }\n  defaultLoader = loader;\n}\n\n/**\n * Resets the default global module loader.\n */\nexport function resetDefaultLoader(): void {\n  if (defaultLoader) {\n    defaultLoader.dispose();\n    defaultLoader = null;\n  }\n}\n\n// ============================================================================\n// Convenience Functions\n// ============================================================================\n\n/**\n * Loads a module using the default loader.\n * @param moduleId - Module to load\n * @param options - Loading options\n * @returns Loaded component\n */\nexport async function loadModule(\n  moduleId: ModuleId,\n  options?: ModuleLoadOptions\n): Promise<ComponentType<unknown>> {\n  return getDefaultLoader().load(moduleId, options);\n}\n\n/**\n * Prefetches a module using the default loader.\n * @param moduleId - Module to prefetch\n * @param probability - Likelihood of needing the module\n */\nexport function prefetchModule(moduleId: ModuleId, probability: number = 0.5): void {\n  getDefaultLoader().addPrefetchHint({\n    moduleId,\n    probability,\n    trigger: 'idle',\n  });\n}\n\n/**\n * Creates a lazy loader wrapper for React.lazy() compatibility.\n *\n * @example\n * ```typescript\n * const LazyModule = createLazyLoader(moduleId);\n *\n * // Use in JSX\n * <Suspense fallback={<Loading />}>\n *   <LazyModule />\n * </Suspense>\n * ```\n */\nexport function createLazyLoader(\n  moduleId: ModuleId,\n  options?: ModuleLoadOptions\n): () => Promise<{ default: ComponentType<unknown> }> {\n  return async () => {\n    const component = await loadModule(moduleId, options);\n    return { default: component };\n  };\n}\n"],"names":["DEFAULT_LOAD_OPTIONS","LoadingPriority","DEFAULT_TIMEOUT","DEFAULT_RETRY_BASE_DELAY","MAX_CONCURRENT_LOADS","MIN_PREFETCH_PROBABILITY","ModuleLoader","registry","getDefaultRegistry","_v","priority","count","queue","moduleId","options","opts","entry","error","resolve","reject","task","moduleIds","results","id","component","index","t","hint","observer","element","entries","handler","priorities","a","b","startTime","timeoutPromise","_","loadPromise","loadTime","err","config","deps","d","loaded","dep","state","defaultLoader","getDefaultLoader","setDefaultLoader","loader","resetDefaultLoader","loadModule","prefetchModule","probability","createLazyLoader"],"mappings":"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"}