{"version":3,"file":"idle-scheduler.mjs","sources":["../../../../src/lib/performance/advanced/idle-scheduler.ts"],"sourcesContent":["/**\n * @file Idle Scheduler\n * @description Orchestrates non-critical work during browser idle periods using\n * requestIdleCallback with fallback support. Enables priority-based task scheduling.\n *\n * Features:\n * - requestIdleCallback orchestration\n * - Priority-based task queue\n * - Time-sliced execution\n * - Deadline-aware scheduling\n * - Task cancellation\n * - Progress tracking\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Task priority\n */\nexport type IdleTaskPriority = 'critical' | 'high' | 'normal' | 'low';\n\n/**\n * Task status\n */\nexport type IdleTaskStatus = 'pending' | 'running' | 'completed' | 'cancelled' | 'failed';\n\n/**\n * Idle task definition\n */\nexport interface IdleTask<T = unknown> {\n  id: string;\n  name: string;\n  priority: IdleTaskPriority;\n  work: (deadline: IdleDeadline) => T | Promise<T>;\n  timeout?: number;\n  onComplete?: (result: T) => void;\n  onError?: (error: Error) => void;\n  onProgress?: (progress: number) => void;\n}\n\n/**\n * Task entry with metadata\n */\ninterface TaskEntry<T = unknown> {\n  task: IdleTask<T>;\n  status: IdleTaskStatus;\n  createdAt: number;\n  startedAt?: number;\n  completedAt?: number;\n  result?: T;\n  error?: Error;\n}\n\n/**\n * Scheduler configuration\n */\nexport interface IdleSchedulerConfig {\n  /** Maximum tasks to process per idle callback */\n  maxTasksPerIdle: number;\n  /** Default task timeout in ms */\n  defaultTimeout: number;\n  /** Minimum remaining time to start a task (ms) */\n  minRemainingTime: number;\n  /** Enable fallback for browsers without requestIdleCallback */\n  enableFallback: boolean;\n  /** Fallback check interval in ms */\n  fallbackInterval: number;\n  /** Debug mode */\n  debug: boolean;\n}\n\n/**\n * Scheduler statistics\n */\nexport interface SchedulerStats {\n  totalTasks: number;\n  pendingTasks: number;\n  completedTasks: number;\n  failedTasks: number;\n  cancelledTasks: number;\n  averageWaitTime: number;\n  averageExecutionTime: number;\n}\n\n/**\n * IdleDeadline interface (for browsers without native support)\n */\nexport interface IdleDeadline {\n  didTimeout: boolean;\n  timeRemaining(): number;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_CONFIG: IdleSchedulerConfig = {\n  maxTasksPerIdle: 5,\n  defaultTimeout: 2000,\n  minRemainingTime: 2,\n  enableFallback: true,\n  fallbackInterval: 100,\n  debug: false,\n};\n\nconst PRIORITY_WEIGHTS: Record<IdleTaskPriority, number> = {\n  critical: 0,\n  high: 1,\n  normal: 2,\n  low: 3,\n};\n\n// ============================================================================\n// Idle Scheduler\n// ============================================================================\n\n/**\n * Manages idle-time task execution\n */\nexport class IdleScheduler {\n  private config: IdleSchedulerConfig;\n  private taskQueue: Map<string, TaskEntry> = new Map();\n  private idleCallbackId: number | null = null;\n  private fallbackTimer: ReturnType<typeof setTimeout> | null = null;\n  private isRunning = false;\n  private taskIdCounter = 0;\n  private completionCallbacks: Map<string, Array<(result: unknown) => void>> = new Map();\n\n  constructor(config: Partial<IdleSchedulerConfig> = {}) {\n    this.config = { ...DEFAULT_CONFIG, ...config };\n  }\n\n  /**\n   * Schedule a task to run during idle time\n   */\n  schedule<T>(\n    work: (deadline: IdleDeadline) => T | Promise<T>,\n    options: Partial<Omit<IdleTask<T>, 'id' | 'work'>> = {}\n  ): string {\n    const id = this.generateTaskId();\n\n    const task: IdleTask<T> = {\n      id,\n      name: options.name ?? `task-${id}`,\n      priority: options.priority ?? 'normal',\n      work,\n      timeout: options.timeout ?? this.config.defaultTimeout,\n      onComplete: options.onComplete,\n      onError: options.onError,\n      onProgress: options.onProgress,\n    };\n\n    const entry: TaskEntry<T> = {\n      task,\n      status: 'pending',\n      createdAt: Date.now(),\n    };\n\n    this.taskQueue.set(id, entry as TaskEntry);\n    this.log(`Task scheduled: ${task.name} (priority: ${task.priority})`);\n\n    this.ensureSchedulerRunning();\n\n    return id;\n  }\n\n  /**\n   * Schedule a task and return a promise for its completion\n   */\n  async scheduleAsync<T>(\n    work: (deadline: IdleDeadline) => T | Promise<T>,\n    options: Partial<Omit<IdleTask<T>, 'id' | 'work'>> = {}\n  ): Promise<T> {\n    return new Promise((resolve, reject) => {\n      const id = this.schedule(work, {\n        ...options,\n        onComplete: (result) => {\n          options.onComplete?.(result);\n          resolve(result);\n        },\n        onError: (error) => {\n          options.onError?.(error);\n          reject(error);\n        },\n      });\n\n      // Store callback for potential cancellation\n      const callbacks = this.completionCallbacks.get(id) ?? [];\n      callbacks.push(resolve as (result: unknown) => void);\n      this.completionCallbacks.set(id, callbacks);\n    });\n  }\n\n  /**\n   * Cancel a scheduled task\n   */\n  cancel(taskId: string): boolean {\n    const entry = this.taskQueue.get(taskId);\n\n    if (entry?.status !== 'pending') {\n      return false;\n    }\n\n    entry.status = 'cancelled';\n    this.log(`Task cancelled: ${entry.task.name}`);\n\n    // Notify callbacks\n    const callbacks = this.completionCallbacks.get(taskId);\n    if (callbacks !== undefined) {\n      // Don't reject, just remove\n      this.completionCallbacks.delete(taskId);\n    }\n\n    return true;\n  }\n\n  /**\n   * Cancel all pending tasks\n   */\n  cancelAll(): number {\n    let cancelled = 0;\n\n    for (const [_id, entry] of this.taskQueue.entries()) {\n      if (entry.status === 'pending') {\n        entry.status = 'cancelled';\n        cancelled++;\n      }\n    }\n\n    this.completionCallbacks.clear();\n    this.log(`Cancelled ${cancelled} tasks`);\n\n    return cancelled;\n  }\n\n  /**\n   * Get task status\n   */\n  getTaskStatus(taskId: string): IdleTaskStatus | null {\n    const entry = this.taskQueue.get(taskId);\n    return entry?.status ?? null;\n  }\n\n  /**\n   * Get scheduler statistics\n   */\n  getStats(): SchedulerStats {\n    const entries = Array.from(this.taskQueue.values());\n\n    const completed = entries.filter((e) => e.status === 'completed');\n    const waitTimes = completed\n      .filter((e) => e.startedAt != null)\n      .map((e) => (e.startedAt as number) - e.createdAt);\n    const execTimes = completed\n      .filter((e) => e.completedAt != null && e.startedAt != null)\n      .map((e) => (e.completedAt as number) - (e.startedAt as number));\n\n    return {\n      totalTasks: entries.length,\n      pendingTasks: entries.filter((e) => e.status === 'pending').length,\n      completedTasks: completed.length,\n      failedTasks: entries.filter((e) => e.status === 'failed').length,\n      cancelledTasks: entries.filter((e) => e.status === 'cancelled').length,\n      averageWaitTime:\n        waitTimes.length > 0 ? waitTimes.reduce((a, b) => a + b, 0) / waitTimes.length : 0,\n      averageExecutionTime:\n        execTimes.length > 0 ? execTimes.reduce((a, b) => a + b, 0) / execTimes.length : 0,\n    };\n  }\n\n  /**\n   * Start the scheduler (called automatically when tasks are added)\n   */\n  start(): void {\n    if (this.isRunning) {\n      return;\n    }\n\n    this.isRunning = true;\n    this.scheduleIdleCallback();\n    this.log('Scheduler started');\n  }\n\n  /**\n   * Stop the scheduler\n   */\n  stop(): void {\n    if (!this.isRunning) {\n      return;\n    }\n\n    this.isRunning = false;\n\n    if (this.idleCallbackId !== null) {\n      this.cancelIdleCallback(this.idleCallbackId);\n      this.idleCallbackId = null;\n    }\n\n    if (this.fallbackTimer !== null) {\n      clearTimeout(this.fallbackTimer);\n      this.fallbackTimer = null;\n    }\n\n    this.log('Scheduler stopped');\n  }\n\n  /**\n   * Clear all tasks and statistics\n   */\n  clear(): void {\n    this.cancelAll();\n    this.taskQueue.clear();\n    this.log('Scheduler cleared');\n  }\n\n  // ============================================================================\n  // Private Methods\n  // ============================================================================\n\n  private ensureSchedulerRunning(): void {\n    if (!this.isRunning) {\n      this.start();\n    } else if (this.idleCallbackId === null && this.fallbackTimer === null) {\n      this.scheduleIdleCallback();\n    }\n  }\n\n  private scheduleIdleCallback(): void {\n    if (!this.isRunning) {\n      return;\n    }\n\n    if (this.hasIdleCallback()) {\n      this.idleCallbackId = (\n        window as Window &\n          typeof globalThis & {\n            requestIdleCallback: (\n              callback: (deadline: IdleDeadline) => void,\n              options?: { timeout?: number }\n            ) => number;\n          }\n      ).requestIdleCallback((deadline) => this.processIdleCallback(deadline), {\n        timeout: this.getMinTaskTimeout(),\n      });\n    } else if (this.config.enableFallback) {\n      this.fallbackTimer = setTimeout(() => {\n        this.processFallback();\n      }, this.config.fallbackInterval);\n    }\n  }\n\n  private processIdleCallback(deadline: IdleDeadline): void {\n    this.idleCallbackId = null;\n\n    const pendingTasks = this.getPendingTasksSorted();\n    let processed = 0;\n\n    for (const entry of pendingTasks) {\n      // Check if we have enough time\n      if (!deadline.didTimeout && deadline.timeRemaining() < this.config.minRemainingTime) {\n        break;\n      }\n\n      // Check if we've processed enough tasks\n      if (processed >= this.config.maxTasksPerIdle) {\n        break;\n      }\n\n      void this.executeTask(entry, deadline);\n      processed++;\n    }\n\n    // Schedule next callback if there are more pending tasks\n    if (this.hasPendingTasks()) {\n      this.scheduleIdleCallback();\n    }\n  }\n\n  private processFallback(): void {\n    this.fallbackTimer = null;\n\n    // Create synthetic deadline\n    const startTime = performance.now();\n    const deadline: IdleDeadline = {\n      didTimeout: false,\n      timeRemaining: () => Math.max(0, 50 - (performance.now() - startTime)),\n    };\n\n    const pendingTasks = this.getPendingTasksSorted();\n    let processed = 0;\n\n    for (const entry of pendingTasks) {\n      if (deadline.timeRemaining() < this.config.minRemainingTime) {\n        break;\n      }\n\n      if (processed >= this.config.maxTasksPerIdle) {\n        break;\n      }\n\n      void this.executeTask(entry, deadline);\n      processed++;\n    }\n\n    if (this.hasPendingTasks()) {\n      this.scheduleIdleCallback();\n    }\n  }\n\n  private async executeTask(entry: TaskEntry, deadline: IdleDeadline): Promise<void> {\n    const { task } = entry;\n\n    entry.status = 'running';\n    entry.startedAt = Date.now();\n\n    this.log(`Executing task: ${task.name}`);\n\n    try {\n      const result = await task.work(deadline);\n      entry.status = 'completed';\n      entry.completedAt = Date.now();\n      entry.result = result;\n\n      this.log(`Task completed: ${task.name} (${entry.completedAt - (entry.startedAt ?? 0)}ms)`);\n\n      task.onComplete?.(result);\n    } catch (error) {\n      entry.status = 'failed';\n      entry.completedAt = Date.now();\n      entry.error = error instanceof Error ? error : new Error(String(error));\n\n      this.log(`Task failed: ${task.name}`, entry.error);\n\n      task.onError?.(entry.error);\n    }\n  }\n\n  private getPendingTasksSorted(): TaskEntry[] {\n    return Array.from(this.taskQueue.values())\n      .filter((entry) => entry.status === 'pending')\n      .sort((a, b) => {\n        // Sort by priority first, then by creation time\n        const priorityDiff = PRIORITY_WEIGHTS[a.task.priority] - PRIORITY_WEIGHTS[b.task.priority];\n        if (priorityDiff !== 0) {\n          return priorityDiff;\n        }\n        return a.createdAt - b.createdAt;\n      });\n  }\n\n  private hasPendingTasks(): boolean {\n    for (const entry of this.taskQueue.values()) {\n      if (entry.status === 'pending') {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  private getMinTaskTimeout(): number {\n    let minTimeout = this.config.defaultTimeout;\n\n    for (const entry of this.taskQueue.values()) {\n      if (entry.status === 'pending' && entry.task.timeout !== undefined) {\n        minTimeout = Math.min(minTimeout, entry.task.timeout);\n      }\n    }\n\n    return minTimeout;\n  }\n\n  private hasIdleCallback(): boolean {\n    return typeof window !== 'undefined' && 'requestIdleCallback' in window;\n  }\n\n  private cancelIdleCallback(id: number): void {\n    if (this.hasIdleCallback()) {\n      (\n        window as Window &\n          typeof globalThis & {\n            cancelIdleCallback: (handle: number) => void;\n          }\n      ).cancelIdleCallback(id);\n    }\n  }\n\n  private generateTaskId(): string {\n    return `idle-${Date.now()}-${++this.taskIdCounter}`;\n  }\n\n  private log(message: string, ...args: unknown[]): void {\n    if (this.config.debug) {\n      // eslint-disable-next-line no-console\n      console.log(`[IdleScheduler] ${message}`, ...args);\n    }\n  }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet schedulerInstance: IdleScheduler | null = null;\n\n/**\n * Get or create the global idle scheduler instance\n */\nexport function getIdleScheduler(config?: Partial<IdleSchedulerConfig>): IdleScheduler {\n  schedulerInstance ??= new IdleScheduler(config);\n  return schedulerInstance;\n}\n\n/**\n * Reset the scheduler instance\n */\nexport function resetIdleScheduler(): void {\n  if (schedulerInstance !== null) {\n    schedulerInstance.stop();\n    schedulerInstance = null;\n  }\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Execute work during idle time (convenience function)\n */\nexport async function runWhenIdle<T>(\n  work: (deadline: IdleDeadline) => T | Promise<T>,\n  options?: Partial<Omit<IdleTask<T>, 'id' | 'work'>>\n): Promise<T> {\n  return getIdleScheduler().scheduleAsync(work, options);\n}\n\n/**\n * Defer work to idle time without waiting for result\n */\nexport function deferToIdle<T>(\n  work: (deadline: IdleDeadline) => T | Promise<T>,\n  options?: Partial<Omit<IdleTask<T>, 'id' | 'work'>>\n): string {\n  return getIdleScheduler().schedule(work, options);\n}\n\n/**\n * Create a yielding iterator for large workloads\n */\nexport function* createYieldingIterator<T>(\n  items: T[],\n  processItem: (item: T) => void,\n  deadline: IdleDeadline\n): Generator<number, void, unknown> {\n  for (let i = 0; i < items.length; i++) {\n    if (items[i] !== undefined) processItem(items[i] as T);\n    yield i + 1;\n\n    // Yield control if deadline is approaching\n    if (!deadline.didTimeout && deadline.timeRemaining() < 2) {\n      return;\n    }\n  }\n}\n\n/**\n * Process items in chunks during idle time\n */\nexport async function processInIdleChunks<T>(\n  items: T[],\n  processItem: (item: T) => void | Promise<void>,\n  chunkSize: number = 10\n): Promise<void> {\n  const scheduler = getIdleScheduler();\n  let processed = 0;\n\n  while (processed < items.length) {\n    await scheduler.scheduleAsync(async (deadline) => {\n      const end = Math.min(processed + chunkSize, items.length);\n\n      while (processed < end) {\n        if (!deadline.didTimeout && deadline.timeRemaining() < 2) {\n          break;\n        }\n        const item = items[processed];\n        if (item !== undefined) await processItem(item as T);\n        processed++;\n      }\n    });\n  }\n}\n\n/**\n * Debounce to idle time\n */\nexport function debounceToIdle<T extends (...args: unknown[]) => void>(\n  fn: T,\n  options?: Partial<Omit<IdleTask, 'id' | 'work'>>\n): (...args: Parameters<T>) => void {\n  let taskId: string | null = null;\n  const scheduler = getIdleScheduler();\n\n  return (...args: Parameters<T>) => {\n    if (taskId !== null) {\n      scheduler.cancel(taskId);\n    }\n\n    taskId = scheduler.schedule(() => {\n      fn(...args);\n      taskId = null;\n    }, options);\n  };\n}\n"],"names":["DEFAULT_CONFIG","PRIORITY_WEIGHTS","IdleScheduler","config","work","options","id","task","entry","resolve","reject","result","error","callbacks","taskId","cancelled","_id","entries","completed","e","waitTimes","execTimes","a","b","deadline","pendingTasks","processed","startTime","priorityDiff","minTimeout","message","args","schedulerInstance","getIdleScheduler","resetIdleScheduler","runWhenIdle","deferToIdle","createYieldingIterator","items","processItem","i","processInIdleChunks","chunkSize","scheduler","end","item","debounceToIdle","fn"],"mappings":"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"}