UNPKG

@varia-bly/variably-sdk

Version:

Official JavaScript/TypeScript SDK for Variably feature flags, experimentation, and real-time dynamic configurations

169 lines 5.1 kB
/** * Dynamic Configuration Client with Real-time Updates */ import { WebSocketConfig } from './websocket-client'; import { UserContext } from './types'; export interface DynamicConfigClientConfig { /** API key for authentication */ apiKey: string; /** JWT token for WebSocket authentication */ jwtToken?: string; /** Base URL for the API */ baseUrl?: string; /** Project ID for configuration subscriptions */ projectId: string; /** Enable real-time updates via WebSocket (default: true) */ enableRealtime?: boolean; /** Polling interval for fallback mode in ms (default: 30000) */ pollingInterval?: number; /** Cache configuration */ cache?: { ttl?: number; maxSize?: number; enabled?: boolean; }; /** WebSocket configuration */ websocket?: Partial<WebSocketConfig>; /** Enable debug logging (default: false) */ debug?: boolean; } export interface DynamicConfigResult<T = any> { /** Configuration key */ key: string; /** Configuration value */ value: T; /** Evaluation reason */ reason: string; /** Rule ID that matched (if any) */ ruleId?: string; /** ETag for cache validation */ etag?: string; /** Configuration version */ version?: number; /** When the config was last updated */ updatedAt?: Date; /** Whether the result came from cache */ cacheHit: boolean; /** Whether the result came from real-time update */ realTimeUpdate: boolean; /** When the config was evaluated/retrieved */ retrievedAt: Date; /** Error if evaluation failed */ error?: Error; } export interface DynamicConfigEvaluationRequest { config_key: string; context: UserContext; } export interface DynamicConfigEvaluationResponse { config_key: string; value: any; reason: string; rule_id?: string; etag?: string; version?: number; updated_at?: string; } export type ConfigChangeCallback<T = any> = (result: DynamicConfigResult<T>) => void; export declare class DynamicConfigClient { private config; private wsClient; private cache; private logger; private metrics; private configValues; private configCallbacks; private pollingTimer; private isRealTimeMode; private fallbackMode; constructor(config: DynamicConfigClientConfig); /** * Get a dynamic configuration value */ getConfig<T = any>(configKey: string, defaultValue: T, userContext: UserContext): Promise<T>; /** * Get a boolean dynamic configuration */ getConfigBool(configKey: string, defaultValue: boolean, userContext: UserContext): Promise<boolean>; /** * Get a string dynamic configuration */ getConfigString(configKey: string, defaultValue: string, userContext: UserContext): Promise<string>; /** * Get a number dynamic configuration */ getConfigNumber(configKey: string, defaultValue: number, userContext: UserContext): Promise<number>; /** * Get a JSON dynamic configuration */ getConfigJSON<T = any>(configKey: string, defaultValue: T, userContext: UserContext): Promise<T>; /** * Evaluate a dynamic configuration with full details */ evaluateConfig<T = any>(configKey: string, defaultValue: T, userContext: UserContext): Promise<DynamicConfigResult<T>>; /** * Subscribe to real-time updates for a specific configuration */ onConfigChange<T = any>(configKey: string, callback: ConfigChangeCallback<T>): () => void; /** * Subscribe to all configuration changes in the project */ onAnyConfigChange(callback: ConfigChangeCallback): () => void; /** * Refresh all cached configurations */ refreshConfigs(userContext: UserContext): Promise<void>; /** * Get current connection status */ getConnectionStatus(): { mode: 'realtime' | 'polling' | 'offline'; connected: boolean; fallbackActive: boolean; }; /** * Disconnect and cleanup */ disconnect(): void; /** * Initialize WebSocket client and set up real-time updates */ private initializeWebSocket; /** * Handle real-time configuration updates from WebSocket */ private handleRealtimeConfigUpdate; /** * Notify configuration change callbacks */ private notifyConfigCallbacks; /** * Start polling mode for fallback */ private startPolling; /** * Stop polling mode */ private stopPolling; /** * Poll for configuration changes (fallback mode) */ private pollConfigurations; /** * Evaluate configuration via HTTP API with ETag support */ private evaluateConfigViaAPI; /** * Generate cache key for configuration */ private generateCacheKey; /** * Generate a simple hash of user context for caching */ private hashUserContext; /** * Normalize configuration with defaults */ private normalizeConfig; } //# sourceMappingURL=dynamic-config-client.d.ts.map