{"version":3,"file":"RuntimeConfigManager.mjs","sources":["../../../../../src/lib/core/config/runtime/RuntimeConfigManager.ts"],"sourcesContent":["/**\n * @fileoverview Runtime configuration manager for hot updates without restarts.\n *\n * The RuntimeConfigManager provides:\n * - Hot configuration updates\n * - Change batching with debounce\n * - Persistence to storage\n * - Rollback capabilities\n * - Remote configuration polling\n *\n * @module core/config/runtime/RuntimeConfigManager\n */\n\nimport type {\n  LibraryConfig,\n  DeepPartial,\n  ConfigPath,\n  ConfigSource,\n  ConfigChangeListener,\n  RuntimeConfigOptions,\n  Unsubscribe,\n  Milliseconds,\n} from '../types';\n\nimport { getConfigRegistry } from '../registry/ConfigRegistry';\nimport { STORAGE_KEYS, DEFAULT_POLLING_INTERVAL } from '../constants';\n\n// =============================================================================\n// Types\n// =============================================================================\n\ninterface PendingChange {\n  path: ConfigPath;\n  value: unknown;\n  source: ConfigSource;\n}\n\ninterface ConfigSnapshot {\n  timestamp: Date;\n  config: DeepPartial<LibraryConfig>;\n  reason?: string;\n}\n\n// =============================================================================\n// RuntimeConfigManager Implementation\n// =============================================================================\n\n/**\n * Manages runtime configuration updates with batching, persistence, and rollback.\n *\n * @example\n * ```typescript\n * const manager = RuntimeConfigManager.getInstance();\n *\n * // Enable persistence\n * manager.enablePersistence();\n *\n * // Make changes (batched)\n * manager.set('network.defaultTimeout', 60000);\n * manager.set('cache.defaultTTL', 120000);\n *\n * // Manually flush batched changes\n * manager.flush();\n *\n * // Rollback to last snapshot\n * manager.rollback();\n *\n * // Start polling remote config\n * manager.startPolling('https://config.example.com/lib-config');\n * ```\n */\nexport class RuntimeConfigManager {\n  private static instance: RuntimeConfigManager | null = null;\n\n  private options: Required<RuntimeConfigOptions>;\n  private pendingChanges: PendingChange[] = [];\n  private snapshots: ConfigSnapshot[] = [];\n  private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n  private pollingTimer: ReturnType<typeof setInterval> | null = null;\n  private remoteUrl: string | null = null;\n  private listeners: Set<ConfigChangeListener> = new Set();\n  private maxSnapshots = 10;\n\n  private constructor(options: RuntimeConfigOptions = {}) {\n    this.options = {\n      persist: options.persist ?? false,\n      storageKey: options.storageKey ?? STORAGE_KEYS.CONFIG_OVERRIDES,\n      validate: options.validate ?? true,\n      emitEvents: options.emitEvents ?? true,\n      debounceDelay: (options.debounceDelay ?? 100) as Milliseconds,\n    };\n\n    // Load persisted config on initialization\n    if (this.options.persist) {\n      this.loadFromStorage();\n    }\n  }\n\n  /**\n   * Get the singleton instance.\n   */\n  static getInstance(options?: RuntimeConfigOptions): RuntimeConfigManager {\n    RuntimeConfigManager.instance ??= new RuntimeConfigManager(options);\n    return RuntimeConfigManager.instance;\n  }\n\n  /**\n   * Reset the singleton instance (for testing).\n   */\n  static resetInstance(): void {\n    if (RuntimeConfigManager.instance) {\n      RuntimeConfigManager.instance.stopPolling();\n    }\n    RuntimeConfigManager.instance = null;\n  }\n\n  // ===========================================================================\n  // Configuration Updates\n  // ===========================================================================\n\n  /**\n   * Set a configuration value (batched by default).\n   */\n  set(path: ConfigPath, value: unknown, source: ConfigSource = 'runtime'): void {\n    this.pendingChanges.push({ path, value, source });\n    this.scheduleFlush();\n  }\n\n  /**\n   * Set a configuration value immediately (bypasses batching).\n   */\n  setImmediate(path: ConfigPath, value: unknown, source: ConfigSource = 'runtime'): void {\n    this.createSnapshot(`Before immediate change: ${path}`);\n    const registry = getConfigRegistry();\n    registry.set(path, value, source);\n\n    if (this.options.persist) {\n      this.saveToStorage();\n    }\n  }\n\n  /**\n   * Apply a partial configuration overlay (batched).\n   */\n  applyOverlay(overlay: DeepPartial<LibraryConfig>, source: ConfigSource = 'runtime'): void {\n    this.traverseAndQueue(overlay, '', source);\n    this.scheduleFlush();\n  }\n\n  /**\n   * Apply a partial configuration overlay immediately.\n   */\n  applyOverlayImmediate(\n    overlay: DeepPartial<LibraryConfig>,\n    source: ConfigSource = 'runtime'\n  ): void {\n    this.createSnapshot('Before overlay');\n    const registry = getConfigRegistry();\n    registry.applyOverlay(overlay, source);\n\n    if (this.options.persist) {\n      this.saveToStorage();\n    }\n  }\n\n  /**\n   * Flush all pending changes.\n   */\n  flush(): void {\n    if (this.debounceTimer) {\n      clearTimeout(this.debounceTimer);\n      this.debounceTimer = null;\n    }\n\n    if (this.pendingChanges.length === 0) {\n      return;\n    }\n\n    this.createSnapshot('Before batch update');\n\n    const registry = getConfigRegistry();\n    const changes = [...this.pendingChanges];\n    this.pendingChanges = [];\n\n    for (const { path, value, source } of changes) {\n      registry.set(path, value, source);\n    }\n\n    if (this.options.persist) {\n      this.saveToStorage();\n    }\n  }\n\n  /**\n   * Cancel pending changes.\n   */\n  cancelPending(): void {\n    if (this.debounceTimer) {\n      clearTimeout(this.debounceTimer);\n      this.debounceTimer = null;\n    }\n    this.pendingChanges = [];\n  }\n\n  /**\n   * Get the number of pending changes.\n   */\n  getPendingCount(): number {\n    return this.pendingChanges.length;\n  }\n\n  // ===========================================================================\n  // Snapshots and Rollback\n  // ===========================================================================\n\n  /**\n   * Create a snapshot of the current configuration.\n   */\n  createSnapshot(reason?: string): void {\n    const registry = getConfigRegistry();\n    const config = registry.getConfig();\n\n    this.snapshots.push({\n      timestamp: new Date(),\n      config: JSON.parse(JSON.stringify(config)) as typeof config,\n      reason,\n    });\n\n    // Keep only the last N snapshots\n    while (this.snapshots.length > this.maxSnapshots) {\n      this.snapshots.shift();\n    }\n  }\n\n  /**\n   * Rollback to the last snapshot.\n   */\n  rollback(): boolean {\n    if (this.snapshots.length === 0) {\n      console.warn('[RuntimeConfigManager] No snapshots available for rollback');\n      return false;\n    }\n\n    const snapshot = this.snapshots.pop();\n    if (snapshot === undefined) {\n      return false;\n    }\n    const registry = getConfigRegistry();\n    registry.reset();\n    registry.applyOverlay(snapshot.config, 'runtime');\n\n    if (this.options.persist) {\n      this.saveToStorage();\n    }\n\n    console.info('[RuntimeConfigManager] Rolled back to snapshot from', snapshot.timestamp);\n    return true;\n  }\n\n  /**\n   * Get all snapshots.\n   */\n  getSnapshots(): readonly ConfigSnapshot[] {\n    return [...this.snapshots];\n  }\n\n  /**\n   * Clear all snapshots.\n   */\n  clearSnapshots(): void {\n    this.snapshots = [];\n  }\n\n  // ===========================================================================\n  // Persistence\n  // ===========================================================================\n\n  /**\n   * Enable configuration persistence.\n   */\n  enablePersistence(storageKey?: string): void {\n    (this.options as { persist?: boolean; storageKey?: string }).persist = true;\n    if (storageKey != null && storageKey !== '') {\n      (this.options as { persist?: boolean; storageKey?: string }).storageKey = storageKey;\n    }\n    this.saveToStorage();\n  }\n\n  /**\n   * Disable configuration persistence.\n   */\n  disablePersistence(): void {\n    (this.options as { persist?: boolean }).persist = false;\n  }\n\n  /**\n   * Save current configuration to storage.\n   */\n  saveToStorage(): void {\n    if (typeof localStorage === 'undefined') {\n      return;\n    }\n\n    try {\n      const registry = getConfigRegistry();\n      const config = registry.getConfig();\n      localStorage.setItem(this.options.storageKey, JSON.stringify(config));\n    } catch (error) {\n      console.error('[RuntimeConfigManager] Failed to save to storage:', error);\n    }\n  }\n\n  /**\n   * Load configuration from storage.\n   */\n  loadFromStorage(): void {\n    if (typeof localStorage === 'undefined') {\n      return;\n    }\n\n    try {\n      const stored = localStorage.getItem(this.options.storageKey);\n      if (stored != null && stored !== '') {\n        const config = JSON.parse(stored) as DeepPartial<LibraryConfig>;\n        const registry = getConfigRegistry();\n        registry.applyOverlay(config, 'runtime');\n      }\n    } catch (error) {\n      console.error('[RuntimeConfigManager] Failed to load from storage:', error);\n    }\n  }\n\n  /**\n   * Clear persisted configuration.\n   */\n  clearStorage(): void {\n    if (typeof localStorage !== 'undefined') {\n      localStorage.removeItem(this.options.storageKey);\n    }\n  }\n\n  // ===========================================================================\n  // Remote Configuration\n  // ===========================================================================\n\n  /**\n   * Start polling for remote configuration updates.\n   */\n  startPolling(url: string, interval: Milliseconds = DEFAULT_POLLING_INTERVAL): void {\n    this.remoteUrl = url;\n\n    // Fetch immediately\n    void this.fetchRemoteConfig();\n\n    // Set up polling\n    this.pollingTimer = setInterval(() => {\n      void this.fetchRemoteConfig();\n    }, interval);\n  }\n\n  /**\n   * Stop polling for remote configuration.\n   */\n  stopPolling(): void {\n    if (this.pollingTimer) {\n      clearInterval(this.pollingTimer);\n      this.pollingTimer = null;\n    }\n    this.remoteUrl = null;\n  }\n\n  /**\n   * Fetch remote configuration once.\n   */\n  async fetchRemoteConfig(): Promise<void> {\n    if (this.remoteUrl == null || this.remoteUrl === '') {\n      return;\n    }\n\n    try {\n      const response = await fetch(this.remoteUrl, {\n        headers: { Accept: 'application/json' },\n      });\n\n      if (!response.ok) {\n        throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n      }\n\n      const config = (await response.json()) as DeepPartial<LibraryConfig>;\n      this.applyOverlayImmediate(config, 'remote');\n    } catch (error) {\n      console.error('[RuntimeConfigManager] Failed to fetch remote config:', error);\n    }\n  }\n\n  // ===========================================================================\n  // Subscriptions\n  // ===========================================================================\n\n  /**\n   * Subscribe to runtime configuration changes.\n   */\n  subscribe(listener: ConfigChangeListener): Unsubscribe {\n    this.listeners.add(listener);\n    return () => {\n      this.listeners.delete(listener);\n    };\n  }\n\n  // ===========================================================================\n  // Private Methods\n  // ===========================================================================\n\n  private scheduleFlush(): void {\n    if (this.debounceTimer) {\n      clearTimeout(this.debounceTimer);\n    }\n\n    this.debounceTimer = setTimeout(() => {\n      this.flush();\n    }, this.options.debounceDelay);\n  }\n\n  private traverseAndQueue(obj: unknown, prefix: string, source: ConfigSource): void {\n    if (obj === null || typeof obj !== 'object') {\n      if (prefix) {\n        this.pendingChanges.push({ path: prefix, value: obj, source });\n      }\n      return;\n    }\n\n    for (const [key, value] of Object.entries(obj)) {\n      const path = prefix ? `${prefix}.${key}` : key;\n      if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n        this.traverseAndQueue(value, path, source);\n      } else {\n        this.pendingChanges.push({ path, value, source });\n      }\n    }\n  }\n}\n\n// =============================================================================\n// Convenience Functions\n// =============================================================================\n\n/**\n * Get the RuntimeConfigManager singleton instance.\n */\nexport function getRuntimeConfigManager(options?: RuntimeConfigOptions): RuntimeConfigManager {\n  return RuntimeConfigManager.getInstance(options);\n}\n\n/**\n * Set a runtime configuration value.\n */\nexport function setRuntimeConfig(path: ConfigPath, value: unknown): void {\n  getRuntimeConfigManager().set(path, value);\n}\n\n/**\n * Apply a runtime configuration overlay.\n */\nexport function applyRuntimeOverlay(overlay: DeepPartial<LibraryConfig>): void {\n  getRuntimeConfigManager().applyOverlay(overlay);\n}\n\n/**\n * Rollback to the previous configuration snapshot.\n */\nexport function rollbackConfig(): boolean {\n  return getRuntimeConfigManager().rollback();\n}\n\n/**\n * Start polling for remote configuration.\n */\nexport function startConfigPolling(url: string, interval?: Milliseconds): void {\n  getRuntimeConfigManager().startPolling(url, interval);\n}\n\n/**\n * Stop polling for remote configuration.\n */\nexport function stopConfigPolling(): void {\n  getRuntimeConfigManager().stopPolling();\n}\n"],"names":["RuntimeConfigManager","options","STORAGE_KEYS","path","value","source","getConfigRegistry","overlay","registry","changes","reason","config","snapshot","storageKey","error","stored","url","interval","DEFAULT_POLLING_INTERVAL","response","listener","obj","prefix","key","getRuntimeConfigManager","setRuntimeConfig","applyRuntimeOverlay","rollbackConfig","startConfigPolling","stopConfigPolling"],"mappings":"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"}