{"version":3,"file":"performanceMonitor.mjs","sources":["../../../src/lib/utils/performanceMonitor.ts"],"sourcesContent":["/**\n * @file Performance Monitor\n * @description Enterprise-grade performance monitoring with metrics collection,\n * profiling, and web vitals tracking\n */\n\n/**\n * Performance metric types\n */\nexport type MetricType =\n  | 'timing'\n  | 'counter'\n  | 'gauge'\n  | 'histogram';\n\n/**\n * Performance metric entry\n */\nexport interface PerformanceMetric {\n  name: string;\n  type: MetricType;\n  value: number;\n  timestamp: number;\n  tags?: Record<string, string>;\n  unit?: string;\n}\n\n/**\n * Histogram bucket\n */\ninterface HistogramBucket {\n  le: number;\n  count: number;\n}\n\n/**\n * Histogram data\n */\nexport interface HistogramData {\n  buckets: HistogramBucket[];\n  sum: number;\n  count: number;\n  min: number;\n  max: number;\n  avg: number;\n  p50: number;\n  p90: number;\n  p99: number;\n}\n\n/**\n * Performance monitor configuration\n */\nexport interface PerformanceMonitorConfig {\n  /** Enable performance monitoring */\n  enabled?: boolean;\n  /** Sample rate (0-1) */\n  sampleRate?: number;\n  /** Buffer size before flush */\n  bufferSize?: number;\n  /** Flush interval (ms) */\n  flushInterval?: number;\n  /** Metric reporter function */\n  reporter?: (metrics: PerformanceMetric[]) => void | Promise<void>;\n  /** Default tags for all metrics */\n  defaultTags?: Record<string, string>;\n}\n\n/**\n * Default histogram buckets (in ms)\n */\nconst DEFAULT_BUCKETS = [10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000];\n\n/**\n * Performance monitor class\n */\nexport class PerformanceMonitor {\n  private config: Required<Omit<PerformanceMonitorConfig, 'reporter' | 'defaultTags'>> & {\n    reporter?: PerformanceMonitorConfig['reporter'];\n    defaultTags: Record<string, string>;\n  };\n  private buffer: PerformanceMetric[] = [];\n  private counters: Map<string, number> = new Map();\n  private gauges: Map<string, number> = new Map();\n  private histograms: Map<string, number[]> = new Map();\n  private flushTimer: ReturnType<typeof setInterval> | null = null;\n  private marks: Map<string, number> = new Map();\n\n  constructor(config: PerformanceMonitorConfig = {}) {\n    this.config = {\n      enabled: config.enabled ?? true,\n      sampleRate: config.sampleRate ?? 1.0,\n      bufferSize: config.bufferSize ?? 100,\n      flushInterval: config.flushInterval ?? 30000, // 30 seconds\n      reporter: config.reporter,\n      defaultTags: config.defaultTags ?? {},\n    };\n\n    if (this.config.enabled && this.config.flushInterval > 0) {\n      this.startFlushTimer();\n    }\n  }\n\n  /**\n   * Record a timing metric\n   */\n  timing(\n    name: string,\n    value: number,\n    tags?: Record<string, string>\n  ): void {\n    if (!this.shouldSample()) return;\n\n    this.addMetric({\n      name,\n      type: 'timing',\n      value,\n      timestamp: Date.now(),\n      tags: { ...this.config.defaultTags, ...tags },\n      unit: 'ms',\n    });\n\n    // Also add to histogram\n    this.recordHistogram(name, value);\n  }\n\n  /**\n   * Increment a counter\n   */\n  increment(\n    name: string,\n    value = 1,\n    tags?: Record<string, string>\n  ): void {\n    if (!this.config.enabled) return;\n\n    const key = this.getKey(name, tags);\n    const current = this.counters.get(key) ?? 0;\n    this.counters.set(key, current + value);\n\n    this.addMetric({\n      name,\n      type: 'counter',\n      value: current + value,\n      timestamp: Date.now(),\n      tags: { ...this.config.defaultTags, ...tags },\n    });\n  }\n\n  /**\n   * Decrement a counter\n   */\n  decrement(\n    name: string,\n    value = 1,\n    tags?: Record<string, string>\n  ): void {\n    this.increment(name, -value, tags);\n  }\n\n  /**\n   * Set a gauge value\n   */\n  gauge(\n    name: string,\n    value: number,\n    tags?: Record<string, string>\n  ): void {\n    if (!this.config.enabled) return;\n\n    const key = this.getKey(name, tags);\n    this.gauges.set(key, value);\n\n    this.addMetric({\n      name,\n      type: 'gauge',\n      value,\n      timestamp: Date.now(),\n      tags: { ...this.config.defaultTags, ...tags },\n    });\n  }\n\n  /**\n   * Record a histogram value\n   */\n  histogram(\n    name: string,\n    value: number,\n    tags?: Record<string, string>\n  ): void {\n    if (!this.shouldSample()) return;\n\n    this.recordHistogram(name, value);\n\n    this.addMetric({\n      name,\n      type: 'histogram',\n      value,\n      timestamp: Date.now(),\n      tags: { ...this.config.defaultTags, ...tags },\n      unit: 'ms',\n    });\n  }\n\n  /**\n   * Get histogram statistics\n   */\n  getHistogramStats(name: string): HistogramData | null {\n    const values = this.histograms.get(name);\n    if (!values || values.length === 0) return null;\n\n    const sorted = [...values].sort((a, b) => a - b);\n    const sum = values.reduce((a, b) => a + b, 0);\n    const count = values.length;\n\n    // Calculate percentiles\n    const p50 = sorted[Math.floor(count * 0.5)] ?? 0;\n    const p90 = sorted[Math.floor(count * 0.9)] ?? 0;\n    const p99 = sorted[Math.floor(count * 0.99)] ?? 0;\n\n    // Calculate bucket counts\n    const buckets = DEFAULT_BUCKETS.map((le) => ({\n      le,\n      count: values.filter((v) => v <= le).length,\n    }));\n\n    return {\n      buckets,\n      sum,\n      count,\n      min: sorted[0] ?? 0,\n      max: sorted[count - 1] ?? 0,\n      avg: sum / count,\n      p50,\n      p90,\n      p99,\n    };\n  }\n\n  /**\n   * Mark a point in time for later measurement\n   */\n  mark(name: string): void {\n    this.marks.set(name, performance.now());\n  }\n\n  /**\n   * Measure time since a mark\n   */\n  measure(name: string, markName: string, tags?: Record<string, string>): number {\n    const start = this.marks.get(markName);\n    if (start === undefined) {\n      console.warn(`[PerformanceMonitor] Mark \"${markName}\" not found`);\n      return 0;\n    }\n\n    const duration = performance.now() - start;\n    this.timing(name, duration, tags);\n    return duration;\n  }\n\n  /**\n   * Create a timer function\n   */\n  startTimer(name: string, tags?: Record<string, string>): () => number {\n    const start = performance.now();\n    return () => {\n      const duration = performance.now() - start;\n      this.timing(name, duration, tags);\n      return duration;\n    };\n  }\n\n  /**\n   * Time an async function\n   */\n  async timeAsync<T>(\n    name: string,\n    fn: () => Promise<T>,\n    tags?: Record<string, string>\n  ): Promise<T> {\n    const end = this.startTimer(name, tags);\n    try {\n      return await fn();\n    } finally {\n      end();\n    }\n  }\n\n  /**\n   * Time a sync function\n   */\n  timeSync<T>(\n    name: string,\n    fn: () => T,\n    tags?: Record<string, string>\n  ): T {\n    const end = this.startTimer(name, tags);\n    try {\n      return fn();\n    } finally {\n      end();\n    }\n  }\n\n  /**\n   * Flush metrics buffer\n   */\n  async flush(): Promise<void> {\n    if (this.buffer.length === 0) return;\n\n    const metrics = [...this.buffer];\n    this.buffer = [];\n\n    try {\n      await this.config.reporter?.(metrics);\n    } catch (error) {\n      console.error('[PerformanceMonitor] Failed to report metrics:', error);\n      // Re-add metrics to buffer if reporting fails\n      this.buffer.unshift(...metrics);\n    }\n  }\n\n  /**\n   * Get all current counter values\n   */\n  getCounters(): Map<string, number> {\n    return new Map(this.counters);\n  }\n\n  /**\n   * Get all current gauge values\n   */\n  getGauges(): Map<string, number> {\n    return new Map(this.gauges);\n  }\n\n  /**\n   * Reset all metrics\n   */\n  reset(): void {\n    this.buffer = [];\n    this.counters.clear();\n    this.gauges.clear();\n    this.histograms.clear();\n    this.marks.clear();\n  }\n\n  /**\n   * Dispose the monitor\n   */\n  dispose(): void {\n    if (this.flushTimer) {\n      clearInterval(this.flushTimer);\n      this.flushTimer = null;\n    }\n    void this.flush();\n    this.reset();\n  }\n\n  /**\n   * Start periodic flush timer\n   */\n  private startFlushTimer(): void {\n    this.flushTimer = setInterval(() => {\n      void this.flush();\n    }, this.config.flushInterval);\n  }\n\n  /**\n   * Check if metric should be sampled\n   */\n  private shouldSample(): boolean {\n    return this.config.enabled && Math.random() < (this.config.sampleRate ?? 1);\n  }\n\n  /**\n   * Record histogram internally\n   */\n  private recordHistogram(name: string, value: number): void {\n    const values = this.histograms.get(name) ?? [];\n    values.push(value);\n\n    // Keep last 1000 values\n    if (values.length > 1000) {\n      values.shift();\n    }\n\n    this.histograms.set(name, values);\n  }\n\n  /**\n   * Add metric to buffer\n   */\n  private addMetric(metric: PerformanceMetric): void {\n    this.buffer.push(metric);\n\n    if (this.buffer.length >= this.config.bufferSize) {\n      void this.flush();\n    }\n  }\n\n  /**\n   * Generate key from name and tags\n   */\n  private getKey(name: string, tags?: Record<string, string>): string {\n    if (!tags) return name;\n    const tagStr = Object.entries(tags)\n      .sort(([a], [b]) => a.localeCompare(b))\n      .map(([k, v]) => `${k}=${v}`)\n      .join(',');\n    return `${name}:${tagStr}`;\n  }\n}\n\n/**\n * Web Vitals metrics\n */\nexport interface WebVitals {\n  /** Largest Contentful Paint */\n  LCP?: number;\n  /** First Input Delay */\n  FID?: number;\n  /** Cumulative Layout Shift */\n  CLS?: number;\n  /** First Contentful Paint */\n  FCP?: number;\n  /** Time to First Byte */\n  TTFB?: number;\n  /** Interaction to Next Paint */\n  INP?: number;\n}\n\n/**\n * Web Vitals collector\n */\nexport class WebVitalsCollector {\n  private vitals: WebVitals = {};\n  private callbacks: Set<(vitals: WebVitals) => void> = new Set();\n  private observer: PerformanceObserver | null = null;\n\n  /**\n   * Start collecting web vitals\n   */\n  start(): void {\n    if (typeof window === 'undefined' || typeof PerformanceObserver === 'undefined') {\n      return;\n    }\n\n    // Collect paint timing\n    this.observePaintTiming();\n\n    // Collect layout shift\n    this.observeLayoutShift();\n\n    // Collect largest contentful paint\n    this.observeLCP();\n\n    // Collect first input delay\n    this.observeFirstInput();\n  }\n\n  /**\n   * Get current vitals\n   */\n  getVitals(): WebVitals {\n    // Calculate TTFB\n    if (typeof window !== 'undefined' && window.performance !== undefined) {\n      const navigation = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined;\n      if (navigation !== undefined) {\n        this.vitals.TTFB = navigation.responseStart - navigation.requestStart;\n      }\n    }\n    return { ...this.vitals };\n  }\n\n  /**\n   * Subscribe to vitals updates\n   */\n  subscribe(callback: (vitals: WebVitals) => void): () => void {\n    this.callbacks.add(callback);\n    return () => this.callbacks.delete(callback);\n  }\n\n  /**\n   * Stop collecting\n   */\n  stop(): void {\n    if (this.observer) {\n      this.observer.disconnect();\n      this.observer = null;\n    }\n  }\n\n  /**\n   * Observe paint timing\n   */\n  private observePaintTiming(): void {\n    try {\n      const observer = new PerformanceObserver((list) => {\n        for (const entry of list.getEntries()) {\n          if (entry.name === 'first-contentful-paint') {\n            this.vitals.FCP = entry.startTime;\n            this.notify();\n          }\n        }\n      });\n      observer.observe({ entryTypes: ['paint'] });\n    } catch {\n      // Paint timing not supported\n    }\n  }\n\n  /**\n   * Observe layout shift\n   */\n  private observeLayoutShift(): void {\n    try {\n      let clsValue = 0;\n      const observer = new PerformanceObserver((list) => {\n        for (const entry of list.getEntries()) {\n          const layoutShiftEntry = entry as PerformanceEntry & {\n            hadRecentInput?: boolean;\n            value?: number;\n          };\n          if (layoutShiftEntry.hadRecentInput !== true && typeof layoutShiftEntry.value === 'number' && layoutShiftEntry.value > 0) {\n            clsValue += layoutShiftEntry.value;\n            this.vitals.CLS = clsValue;\n            this.notify();\n          }\n        }\n      });\n      observer.observe({ entryTypes: ['layout-shift'] });\n    } catch {\n      // Layout shift not supported\n    }\n  }\n\n  /**\n   * Observe LCP\n   */\n  private observeLCP(): void {\n    try {\n      const observer = new PerformanceObserver((list) => {\n        const entries = list.getEntries();\n        const lastEntry = entries[entries.length - 1];\n        if (lastEntry) {\n          this.vitals.LCP = lastEntry.startTime;\n          this.notify();\n        }\n      });\n      observer.observe({ entryTypes: ['largest-contentful-paint'] });\n    } catch {\n      // LCP not supported\n    }\n  }\n\n  /**\n   * Observe first input\n   */\n  private observeFirstInput(): void {\n    try {\n      const observer = new PerformanceObserver((list) => {\n        const entry = list.getEntries()[0] as PerformanceEntry & {\n          processingStart?: number;\n        };\n        if (entry?.processingStart !== undefined) {\n          this.vitals.FID = entry.processingStart - entry.startTime;\n          this.notify();\n        }\n      });\n      observer.observe({ entryTypes: ['first-input'] });\n    } catch {\n      // First input not supported\n    }\n  }\n\n  /**\n   * Notify subscribers\n   */\n  private notify(): void {\n    const vitals = this.getVitals();\n    for (const callback of this.callbacks) {\n      try {\n        callback(vitals);\n      } catch (error) {\n        console.error('[WebVitalsCollector] Callback error:', error);\n      }\n    }\n  }\n}\n\n/**\n * Resource timing utilities\n */\nexport const resourceTiming = {\n  /**\n   * Get all resource timing entries\n   */\n  getEntries(): PerformanceResourceTiming[] {\n    if (typeof window === 'undefined' || window.performance === undefined) {\n      return [];\n    }\n    return performance.getEntriesByType('resource');\n  },\n\n  /**\n   * Get entries by type\n   */\n  getEntriesByType(type: 'script' | 'link' | 'img' | 'fetch' | 'xmlhttprequest'): PerformanceResourceTiming[] {\n    return this.getEntries().filter((entry) => entry.initiatorType === type);\n  },\n\n  /**\n   * Get slow resources\n   */\n  getSlowResources(threshold = 1000): PerformanceResourceTiming[] {\n    return this.getEntries().filter((entry) => entry.duration > threshold);\n  },\n\n  /**\n   * Get total transfer size\n   */\n  getTotalTransferSize(): number {\n    return this.getEntries().reduce((sum, entry) => sum + (entry.transferSize ?? 0), 0);\n  },\n\n  /**\n   * Get resource summary\n   */\n  getSummary(): {\n    count: number;\n    totalSize: number;\n    slowCount: number;\n    avgDuration: number;\n    byType: Record<string, number>;\n  } {\n    const entries = this.getEntries();\n    const byType: Record<string, number> = {};\n\n    for (const entry of entries) {\n      byType[entry.initiatorType] = (byType[entry.initiatorType] ?? 0) + 1;\n    }\n\n    const totalDuration = entries.reduce((sum, e) => sum + e.duration, 0);\n\n    return {\n      count: entries.length,\n      totalSize: this.getTotalTransferSize(),\n      slowCount: this.getSlowResources().length,\n      avgDuration: entries.length > 0 ? totalDuration / entries.length : 0,\n      byType,\n    };\n  },\n\n  /**\n   * Clear resource timing buffer\n   */\n  clearBuffer(): void {\n    if (typeof window !== 'undefined' && typeof window.performance !== 'undefined') {\n      performance.clearResourceTimings();\n    }\n  },\n};\n\n/**\n * Long task observer\n */\nexport class LongTaskObserver {\n  private observer: PerformanceObserver | null = null;\n  private tasks: Array<{ startTime: number; duration: number; attribution: string }> = [];\n  private callbacks: Set<(task: { startTime: number; duration: number; attribution: string }) => void> = new Set();\n\n  /**\n   * Start observing long tasks\n   */\n  start(): void {\n    if (typeof window === 'undefined' || typeof PerformanceObserver === 'undefined') {\n      return;\n    }\n\n    try {\n      this.observer = new PerformanceObserver((list) => {\n        for (const entry of list.getEntries()) {\n          const longTaskEntry = entry as PerformanceEntry & {\n            attribution?: Array<{ name?: string }>;\n          };\n          const task = {\n            startTime: entry.startTime,\n            duration: entry.duration,\n            attribution: longTaskEntry.attribution?.[0]?.name ?? 'unknown',\n          };\n          this.tasks.push(task);\n          this.notifyCallbacks(task);\n        }\n      });\n      this.observer.observe({ entryTypes: ['longtask'] });\n    } catch {\n      // Long tasks not supported\n    }\n  }\n\n  /**\n   * Stop observing\n   */\n  stop(): void {\n    if (this.observer) {\n      this.observer.disconnect();\n      this.observer = null;\n    }\n  }\n\n  /**\n   * Subscribe to long task events\n   */\n  subscribe(callback: (task: { startTime: number; duration: number; attribution: string }) => void): () => void {\n    this.callbacks.add(callback);\n    return () => this.callbacks.delete(callback);\n  }\n\n  /**\n   * Get all recorded long tasks\n   */\n  getTasks(): Array<{ startTime: number; duration: number; attribution: string }> {\n    return [...this.tasks];\n  }\n\n  /**\n   * Get task statistics\n   */\n  getStats(): {\n    count: number;\n    totalDuration: number;\n    avgDuration: number;\n    maxDuration: number;\n  } {\n    if (this.tasks.length === 0) {\n      return { count: 0, totalDuration: 0, avgDuration: 0, maxDuration: 0 };\n    }\n\n    const totalDuration = this.tasks.reduce((sum, t) => sum + t.duration, 0);\n    const maxDuration = Math.max(...this.tasks.map((t) => t.duration));\n\n    return {\n      count: this.tasks.length,\n      totalDuration,\n      avgDuration: totalDuration / this.tasks.length,\n      maxDuration,\n    };\n  }\n\n  /**\n   * Clear recorded tasks\n   */\n  clear(): void {\n    this.tasks = [];\n  }\n\n  /**\n   * Notify callbacks\n   */\n  private notifyCallbacks(task: { startTime: number; duration: number; attribution: string }): void {\n    for (const callback of this.callbacks) {\n      try {\n        callback(task);\n      } catch (error) {\n        console.error('[LongTaskObserver] Callback error:', error);\n      }\n    }\n  }\n}\n\n  /**\n   * Global performance monitor singleton\n   */\n  export const performanceMonitor = new PerformanceMonitor({\n    reporter: (metrics) => {\n      if (import.meta.env.DEV) {\n        console.info('[Performance]', metrics);\n      }\n    },\n  });/**\n * Global web vitals collector\n */\nexport const webVitals = new WebVitalsCollector();\n\n/**\n * Global long task observer\n */\nexport const longTaskObserver = new LongTaskObserver();\n"],"names":["DEFAULT_BUCKETS","PerformanceMonitor","config","name","value","tags","key","current","values","sorted","a","b","sum","count","p50","p90","p99","le","v","markName","start","duration","fn","end","metrics","error","metric","tagStr","k","WebVitalsCollector","navigation","callback","list","entry","clsValue","layoutShiftEntry","entries","lastEntry","vitals","resourceTiming","type","threshold","byType","totalDuration","e","LongTaskObserver","longTaskEntry","task","t","maxDuration","performanceMonitor","webVitals","longTaskObserver"],"mappings":"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"}