{"version":3,"file":"composite-provider.mjs","sources":["../../../../src/lib/flags/providers/composite-provider.ts"],"sourcesContent":["/**\n * @fileoverview Composite provider that combines multiple flag providers.\n *\n * Supports various merge strategies:\n * - Priority-based (highest priority provider wins)\n * - Merge (combine flags from all providers)\n * - Override (later providers override earlier)\n *\n * @module flags/providers/composite-provider\n *\n * @example\n * ```typescript\n * const composite = new CompositeProvider({\n *   providers: [\n *     localProvider,  // Fallback\n *     remoteProvider, // Primary\n *   ],\n *   strategy: 'priority',\n *   fallback: 'first-available',\n * });\n *\n * await composite.initialize();\n * const flags = await composite.getFlags();\n * ```\n */\n\nimport type {\n  FeatureFlag,\n  Segment,\n  SegmentId,\n} from '../advanced/types';\nimport type {\n  FlagProvider,\n  CompositeProviderConfig,\n  FlagChangeListener,\n  FlagChangeEvent,\n  ProviderStats,\n} from './types';\n\n// ============================================================================\n// Composite Provider\n// ============================================================================\n\n/**\n * Composite provider that combines multiple flag providers.\n */\nexport class CompositeProvider implements FlagProvider {\n  readonly name: string;\n  readonly priority: number;\n\n  private readonly providers: FlagProvider[];\n  private listeners = new Set<FlagChangeListener>();\n  private ready = false;\n  private config: Required<CompositeProviderConfig>;\n  private unsubscribes: Array<() => void> = [];\n\n  constructor(config: CompositeProviderConfig) {\n    this.name = config.name ?? 'composite';\n    this.priority = config.priority ?? 0;\n\n    this.config = {\n      name: this.name,\n      priority: this.priority,\n      debug: config.debug ?? false,\n      providers: config.providers,\n      strategy: config.strategy ?? 'priority',\n      fallback: config.fallback ?? 'first-available',\n    };\n\n    this.providers = [...config.providers].sort(\n      (a, b) => a.priority - b.priority\n    );\n  }\n\n  // ==========================================================================\n  // Initialization\n  // ==========================================================================\n\n  /**\n   * Initialize all providers.\n   */\n  async initialize(): Promise<void> {\n    this.log('Initializing composite provider');\n\n    if (this.config.fallback === 'all-must-succeed') {\n      // All providers must initialize successfully\n      await Promise.all(\n        this.providers.map(async (p) => p.initialize())\n      );\n    } else {\n      // At least one provider must succeed\n      const results = await Promise.allSettled(\n        this.providers.map(async (p) => p.initialize())\n      );\n\n      const hasSuccess = results.some((r) => r.status === 'fulfilled');\n      if (!hasSuccess) {\n        throw new Error('All providers failed to initialize');\n      }\n    }\n\n    // Subscribe to all providers\n    for (const provider of this.providers) {\n      if (provider.subscribe) {\n        const unsubscribe = provider.subscribe(\n          this.handleProviderChange.bind(this)\n        );\n        this.unsubscribes.push(unsubscribe);\n      }\n    }\n\n    this.ready = true;\n    this.log(\n      `Initialized with ${this.providers.length} providers`\n    );\n  }\n\n  // ==========================================================================\n  // Flag Operations\n  // ==========================================================================\n\n  /**\n   * Get all flags from providers based on strategy.\n   */\n  async getFlags(): Promise<readonly FeatureFlag[]> {\n    switch (this.config.strategy) {\n      case 'priority':\n        return this.getFlagsWithPriority();\n      case 'merge':\n        return this.getFlagsWithMerge();\n      case 'override':\n        return this.getFlagsWithOverride();\n      default:\n        return this.getFlagsWithPriority();\n    }\n  }\n\n  /**\n   * Get a specific flag.\n   */\n  async getFlag(key: string): Promise<FeatureFlag | null> {\n    // Check providers in priority order\n    for (const provider of this.providers) {\n      if (!provider.isReady()) {\n        continue;\n      }\n\n      try {\n        const flag = await provider.getFlag(key);\n        if (flag) {\n          return flag;\n        }\n      } catch (error) {\n        this.log(`Provider ${provider.name} failed for flag ${key}:`, error);\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * Get all segments from providers.\n   */\n  async getSegments(): Promise<readonly Segment[]> {\n    const segmentMap = new Map<SegmentId, Segment>();\n\n    for (const provider of this.providers) {\n      if (!provider.isReady() || !provider.getSegments) {\n        continue;\n      }\n\n      try {\n        const segments = await provider.getSegments();\n        for (const segment of segments) {\n          if (!segmentMap.has(segment.id)) {\n            segmentMap.set(segment.id, segment);\n          }\n        }\n      } catch (error) {\n        this.log(`Provider ${provider.name} failed for segments:`, error);\n      }\n    }\n\n    return Array.from(segmentMap.values());\n  }\n\n  /**\n   * Get a segment by ID.\n   */\n  async getSegment(id: SegmentId): Promise<Segment | null> {\n    for (const provider of this.providers) {\n      if (!provider.isReady() || !provider.getSegment) {\n        continue;\n      }\n\n      try {\n        const segment = await provider.getSegment(id);\n        if (segment) {\n          return segment;\n        }\n      } catch (error) {\n        this.log(`Provider ${provider.name} failed for segment ${id}:`, error);\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * Add a provider.\n   */\n  addProvider(provider: FlagProvider): void {\n    this.providers.push(provider);\n    this.providers.sort((a, b) => a.priority - b.priority);\n\n    if (provider.subscribe) {\n      const unsubscribe = provider.subscribe(\n        this.handleProviderChange.bind(this)\n      );\n      this.unsubscribes.push(unsubscribe);\n    }\n\n    this.log(`Added provider: ${provider.name}`);\n  }\n\n  // ==========================================================================\n  // Segment Operations\n  // ==========================================================================\n\n  /**\n   * Remove a provider.\n   */\n  removeProvider(name: string): void {\n    const index = this.providers.findIndex((p) => p.name === name);\n    if (index !== -1) {\n      this.providers.splice(index, 1);\n      this.log(`Removed provider: ${name}`);\n    }\n  }\n\n  /**\n   * Get all providers.\n   */\n  getProviders(): readonly FlagProvider[] {\n    return [...this.providers];\n  }\n\n  // ==========================================================================\n  // Provider Management\n  // ==========================================================================\n\n  /**\n   * Get a provider by name.\n   */\n  getProvider(name: string): FlagProvider | undefined {\n    return this.providers.find((p) => p.name === name);\n  }\n\n  /**\n   * Check if the provider is ready.\n   */\n  isReady(): boolean {\n    if (!this.ready) {\n      return false;\n    }\n\n    if (this.config.fallback === 'all-must-succeed') {\n      return this.providers.every((p) => p.isReady());\n    }\n\n    return this.providers.some((p) => p.isReady());\n  }\n\n  /**\n   * Check if the provider is healthy.\n   */\n  async isHealthy(): Promise<boolean> {\n    if (this.config.fallback === 'all-must-succeed') {\n      const results = await Promise.all(\n        this.providers.map(async (p) => p.isHealthy())\n      );\n      return results.every(Boolean);\n    }\n\n    const results = await Promise.all(\n      this.providers.map(async (p) => p.isHealthy())\n    );\n    return results.some(Boolean);\n  }\n\n  /**\n   * Get health status for all providers.\n   */\n  async getProviderHealths(): Promise<Map<string, boolean>> {\n    const healths = new Map<string, boolean>();\n\n    await Promise.all(\n      this.providers.map(async (p) => {\n        const healthy = await p.isHealthy();\n        healths.set(p.name, healthy);\n      })\n    );\n\n    return healths;\n  }\n\n  // ==========================================================================\n  // Provider Change Handling\n  // ==========================================================================\n\n  /**\n   * Get aggregate statistics.\n   */\n  getStats(): ProviderStats {\n    let flagCount = 0;\n    let segmentCount = 0;\n\n    // Use stats from highest priority ready provider\n    for (const provider of this.providers) {\n      if (provider.isReady()) {\n        // This is a simplified approach - in practice you might want\n        // to aggregate or pick based on strategy\n        flagCount = Math.max(flagCount, 0);\n        segmentCount = Math.max(segmentCount, 0);\n        break;\n      }\n    }\n\n    return {\n      flagCount,\n      segmentCount,\n      requestCount: 0,\n      errorCount: 0,\n    };\n  }\n\n  // ==========================================================================\n  // Status and Health\n  // ==========================================================================\n\n  /**\n   * Subscribe to flag changes.\n   */\n  subscribe(listener: FlagChangeListener): () => void {\n    this.listeners.add(listener);\n    return () => {\n      this.listeners.delete(listener);\n    };\n  }\n\n  /**\n   * Shutdown the provider and all child providers.\n   */\n  async shutdown(): Promise<void> {\n    // Unsubscribe from all providers\n    for (const unsubscribe of this.unsubscribes) {\n      unsubscribe();\n    }\n    this.unsubscribes = [];\n\n    // Shutdown all providers\n    await Promise.all(\n      this.providers.map(async (p) => p.shutdown())\n    );\n\n    this.ready = false;\n    this.listeners.clear();\n    this.log('Composite provider shutdown');\n  }\n\n  private async getFlagsWithPriority(): Promise<FeatureFlag[]> {\n    // Return flags from the first available (highest priority) provider\n    for (const provider of this.providers) {\n      if (!provider.isReady()) {\n        continue;\n      }\n\n      try {\n        const flags = await provider.getFlags();\n        if (flags.length > 0) {\n          this.log(`Using flags from provider: ${provider.name}`);\n          return [...flags];\n        }\n      } catch (error) {\n        this.log(`Provider ${provider.name} failed:`, error);\n      }\n    }\n\n    return [];\n  }\n\n  private async getFlagsWithMerge(): Promise<FeatureFlag[]> {\n    // Combine flags from all providers (higher priority wins on conflicts)\n    const flagMap = new Map<string, FeatureFlag>();\n\n    // Process in reverse order so higher priority overwrites\n    for (const provider of [...this.providers].reverse()) {\n      if (!provider.isReady()) {\n        continue;\n      }\n\n      try {\n        const flags = await provider.getFlags();\n        for (const flag of flags) {\n          flagMap.set(flag.key, flag);\n        }\n      } catch (error) {\n        this.log(`Provider ${provider.name} failed:`, error);\n        if (this.config.fallback === 'all-must-succeed') {\n          throw error;\n        }\n      }\n    }\n\n    return Array.from(flagMap.values());\n  }\n\n  // ==========================================================================\n  // Subscription\n  // ==========================================================================\n\n  private async getFlagsWithOverride(): Promise<FeatureFlag[]> {\n    // Start with empty, each provider overrides\n    const flagMap = new Map<string, FeatureFlag>();\n\n    for (const provider of this.providers) {\n      if (!provider.isReady()) {\n        continue;\n      }\n\n      try {\n        const flags = await provider.getFlags();\n        for (const flag of flags) {\n          flagMap.set(flag.key, flag);\n        }\n      } catch (error) {\n        this.log(`Provider ${provider.name} failed:`, error);\n        if (this.config.fallback === 'all-must-succeed') {\n          throw error;\n        }\n      }\n    }\n\n    return Array.from(flagMap.values());\n  }\n\n  private handleProviderChange(event: FlagChangeEvent): void {\n    // Forward to listeners\n    this.emitChange(event);\n  }\n\n  // ==========================================================================\n  // Shutdown\n  // ==========================================================================\n\n  private emitChange(event: FlagChangeEvent): void {\n    for (const listener of this.listeners) {\n      try {\n        listener(event);\n      } catch (error) {\n        this.log('Error in change listener:', error);\n      }\n    }\n  }\n\n  // ==========================================================================\n  // Utilities\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(`[CompositeProvider] ${message}`, ...args);\n    }\n  }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n/**\n * Create a composite provider instance.\n */\nexport function createCompositeProvider(\n  config: CompositeProviderConfig\n): CompositeProvider {\n  return new CompositeProvider(config);\n}\n"],"names":["CompositeProvider","config","a","b","p","r","provider","unsubscribe","key","flag","error","segmentMap","segments","segment","id","name","index","healths","healthy","flagCount","segmentCount","listener","flags","flagMap","event","message","args","createCompositeProvider"],"mappings":"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"}