@varia-bly/variably-sdk
Version:
Official JavaScript/TypeScript SDK for Variably feature flags, experimentation, and real-time dynamic configurations
169 lines • 5.1 kB
TypeScript
/**
* 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