{"version":3,"file":"index.mjs","sources":["../../../../src/lib/flags/providers/index.ts"],"sourcesContent":["/**\n * @fileoverview Feature flag provider module exports.\n *\n * This module provides multiple flag data source implementations:\n * - Local/static provider for offline-first\n * - Remote provider for API-based flags\n * - Cached provider for performance\n * - Composite provider for combining sources\n * - Polling provider for periodic updates\n * - WebSocket provider for real-time updates\n *\n * @module flags/providers\n *\n * @example\n * ```typescript\n * import {\n *   LocalProvider,\n *   RemoteProvider,\n *   CachedProvider,\n *   CompositeProvider,\n * } from '@/lib/flags/providers';\n *\n * // Create a robust provider setup\n * const localProvider = new LocalProvider({\n *   flags: defaultFlags,\n *   persistToStorage: true,\n * });\n *\n * const remoteProvider = new RemoteProvider({\n *   endpoint: 'https://api.example.com/flags',\n *   apiKey: process.env.FLAG_API_KEY,\n * });\n *\n * const cachedRemote = new CachedProvider({\n *   provider: remoteProvider,\n *   ttl: 60000,\n * });\n *\n * const composite = new CompositeProvider({\n *   providers: [localProvider, cachedRemote],\n *   strategy: 'priority',\n * });\n *\n * await composite.initialize();\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type {\n  // Provider Interfaces\n  FlagProvider,\n  WritableFlagProvider,\n\n  // Events\n  FlagChangeType,\n  FlagChangeEvent,\n  FlagChangeListener,\n\n  // Configuration\n  BaseProviderConfig,\n  LocalProviderConfig,\n  RemoteProviderConfig,\n  CachedProviderConfig,\n  CompositeProviderConfig,\n  PollingProviderConfig,\n  WebSocketProviderConfig,\n  RetryConfig,\n  ReconnectConfig,\n\n  // Status\n  ProviderHealth,\n  ProviderStats,\n\n  // Factory\n  ProviderFactory,\n  ProviderRegistryEntry,\n} from './types';\n\n// ============================================================================\n// Local Provider\n// ============================================================================\n\nexport { LocalProvider, createLocalProvider } from './local-provider';\n\n// ============================================================================\n// Remote Provider\n// ============================================================================\n\nexport { RemoteProvider, createRemoteProvider } from './remote-provider';\n\n// ============================================================================\n// Cached Provider\n// ============================================================================\n\nexport { CachedProvider, createCachedProvider } from './cached-provider';\n\n// ============================================================================\n// Composite Provider\n// ============================================================================\n\nexport { CompositeProvider, createCompositeProvider } from './composite-provider';\n\n// ============================================================================\n// Polling Provider\n// ============================================================================\n\nexport { PollingProvider, createPollingProvider } from './polling-provider';\n\n// ============================================================================\n// WebSocket Provider\n// ============================================================================\n\nexport { WebSocketProvider, createWebSocketProvider } from './websocket-provider';\n\n// ============================================================================\n// Provider Factory Utilities\n// ============================================================================\n\nimport type { FlagProvider, BaseProviderConfig } from './types';\nimport { LocalProvider } from './local-provider';\nimport { RemoteProvider } from './remote-provider';\nimport { CachedProvider } from './cached-provider';\nimport { CompositeProvider } from './composite-provider';\nimport { PollingProvider } from './polling-provider';\nimport { WebSocketProvider } from './websocket-provider';\n\n/**\n * Provider type names.\n */\nexport type ProviderType = 'local' | 'remote' | 'cached' | 'composite' | 'polling' | 'websocket';\n\n/**\n * Create a provider by type.\n */\nexport function createProvider(\n  type: ProviderType,\n  config: BaseProviderConfig & Record<string, unknown>\n): FlagProvider {\n  switch (type) {\n    case 'local':\n      return new LocalProvider(config);\n    case 'remote':\n      if (!('endpoint' in config)) {\n        throw new Error('Remote provider requires endpoint');\n      }\n      return new RemoteProvider(\n        config as unknown as ConstructorParameters<typeof RemoteProvider>[0]\n      );\n    case 'cached':\n      if (!('provider' in config)) {\n        throw new Error('Cached provider requires wrapped provider');\n      }\n      return new CachedProvider(\n        config as unknown as ConstructorParameters<typeof CachedProvider>[0]\n      );\n    case 'composite':\n      if (!('providers' in config)) {\n        throw new Error('Composite provider requires providers array');\n      }\n      return new CompositeProvider(\n        config as unknown as ConstructorParameters<typeof CompositeProvider>[0]\n      );\n    case 'polling':\n      if (!('provider' in config)) {\n        throw new Error('Polling provider requires wrapped provider');\n      }\n      return new PollingProvider(\n        config as unknown as ConstructorParameters<typeof PollingProvider>[0]\n      );\n    case 'websocket':\n      if (!('url' in config)) {\n        throw new Error('WebSocket provider requires url');\n      }\n      return new WebSocketProvider(\n        config as unknown as ConstructorParameters<typeof WebSocketProvider>[0]\n      );\n    default:\n      throw new Error(`Unknown provider type: ${String(type)}`);\n  }\n}\n\n/**\n * Create a provider chain with caching and fallback.\n */\nexport function createProviderChain(options: {\n  remote: {\n    endpoint: string;\n    apiKey?: string;\n    timeout?: number;\n  };\n  local?: {\n    flags?: readonly import('../advanced/types').FeatureFlag[];\n    persistToStorage?: boolean;\n  };\n  cache?: {\n    ttl?: number;\n    staleWhileRevalidate?: number;\n  };\n  polling?: {\n    interval?: number;\n    pauseWhenHidden?: boolean;\n  };\n  debug?: boolean;\n}): FlagProvider {\n  const { remote, local, cache, polling, debug } = options;\n\n  // Create remote provider\n  const remoteProvider = new RemoteProvider({\n    ...remote,\n    debug,\n  });\n\n  // Wrap with cache if configured\n  let provider: FlagProvider = cache\n    ? new CachedProvider({\n        provider: remoteProvider,\n        ...cache,\n        debug,\n      })\n    : remoteProvider;\n\n  // Wrap with polling if configured\n  if (polling) {\n    provider = new PollingProvider({\n      provider,\n      ...polling,\n      debug,\n    });\n  }\n\n  // Add local fallback if configured\n  if (local) {\n    const localProvider = new LocalProvider({\n      ...local,\n      debug,\n    });\n\n    provider = new CompositeProvider({\n      providers: [provider, localProvider],\n      strategy: 'priority',\n      fallback: 'first-available',\n      debug,\n    });\n  }\n\n  return provider;\n}\n"],"names":["createProvider","type","config","LocalProvider","RemoteProvider","CachedProvider","CompositeProvider","PollingProvider","WebSocketProvider","createProviderChain","options","remote","local","cache","polling","debug","remoteProvider","provider","localProvider"],"mappings":";;;;;;;;;;;;AAyIO,SAASA,EACdC,GACAC,GACc;AACd,UAAQD,GAAA;AAAA,IACN,KAAK;AACH,aAAO,IAAIE,EAAcD,CAAM;AAAA,IACjC,KAAK;AACH,UAAI,EAAE,cAAcA;AAClB,cAAM,IAAI,MAAM,mCAAmC;AAErD,aAAO,IAAIE;AAAAA,QACTF;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,UAAI,EAAE,cAAcA;AAClB,cAAM,IAAI,MAAM,2CAA2C;AAE7D,aAAO,IAAIG;AAAAA,QACTH;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,UAAI,EAAE,eAAeA;AACnB,cAAM,IAAI,MAAM,6CAA6C;AAE/D,aAAO,IAAII;AAAAA,QACTJ;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,UAAI,EAAE,cAAcA;AAClB,cAAM,IAAI,MAAM,4CAA4C;AAE9D,aAAO,IAAIK;AAAAA,QACTL;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,UAAI,EAAE,SAASA;AACb,cAAM,IAAI,MAAM,iCAAiC;AAEnD,aAAO,IAAIM;AAAAA,QACTN;AAAA,MAAA;AAAA,IAEJ;AACE,YAAM,IAAI,MAAM,0BAA0B,OAAOD,CAAI,CAAC,EAAE;AAAA,EAAA;AAE9D;AAKO,SAASQ,EAAoBC,GAmBnB;AACf,QAAM,EAAE,QAAAC,GAAQ,OAAAC,GAAO,OAAAC,GAAO,SAAAC,GAAS,OAAAC,MAAUL,GAG3CM,IAAiB,IAAIZ,EAAe;AAAA,IACxC,GAAGO;AAAA,IACH,OAAAI;AAAA,EAAA,CACD;AAGD,MAAIE,IAAyBJ,IACzB,IAAIR,EAAe;AAAA,IACjB,UAAUW;AAAA,IACV,GAAGH;AAAA,IACH,OAAAE;AAAA,EAAA,CACD,IACDC;AAYJ,MATIF,MACFG,IAAW,IAAIV,EAAgB;AAAA,IAC7B,UAAAU;AAAA,IACA,GAAGH;AAAA,IACH,OAAAC;AAAA,EAAA,CACD,IAICH,GAAO;AACT,UAAMM,IAAgB,IAAIf,EAAc;AAAA,MACtC,GAAGS;AAAA,MACH,OAAAG;AAAA,IAAA,CACD;AAED,IAAAE,IAAW,IAAIX,EAAkB;AAAA,MAC/B,WAAW,CAACW,GAAUC,CAAa;AAAA,MACnC,UAAU;AAAA,MACV,UAAU;AAAA,MACV,OAAAH;AAAA,IAAA,CACD;AAAA,EACH;AAEA,SAAOE;AACT;"}