@featureflare/sdk-js 0.0.85 → 0.0.87

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["metadata"],"mappings":"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","file":"index.cjs","sourcesContent":["export type FeatureFlareUserPayload = {\n /** Unique user identifier (preferred). */\n id?: string;\n /** Legacy alias for id. */\n key?: string;\n email?: string;\n name?: string;\n country?: string;\n /** Queryable attributes. */\n meta?: Record<string, string | number | boolean | null>;\n /** Legacy alias for meta. */\n custom?: Record<string, string | number | boolean | null>;\n};\n\ntype FeatureFlareUser = {\n key: string;\n email?: string;\n name?: string;\n country?: string;\n custom?: Record<string, string | number | boolean | null>;\n};\n\nconst DEFAULT_FEATUREFLARE_API_BASE_URL =\n 'https://api.featureflare.com';\n\nfunction getApiBaseUrlFromEnv(): string | null {\n if (typeof process !== 'undefined' && process.env) {\n return (\n process.env.FEATUREFLARE_API_BASE_URL?.trim() ||\n process.env.SHIPIT_API_BASE_URL?.trim() ||\n null\n );\n }\n return null;\n}\n\nfunction getApiBaseUrl(explicit?: string): string {\n const fromOptions = explicit?.trim();\n if (fromOptions) return fromOptions;\n\n const fromEnv = getApiBaseUrlFromEnv();\n if (fromEnv) return fromEnv;\n\n return DEFAULT_FEATUREFLARE_API_BASE_URL;\n}\n\nexport type FeatureFlareCacheSource = 'bootstrap' | 'network' | 'realtime' | 'persistent';\nexport type FeatureFlareEvaluationReason = 'fresh_cache' | 'stale_cache' | 'bootstrap' | 'default' | 'network' | 'kill_switch';\n\nexport type FeatureFlareEvaluationMetadata = {\n reason: FeatureFlareEvaluationReason;\n isStale: boolean;\n latencyMs: number;\n source: FeatureFlareCacheSource | 'default' | 'kill_switch';\n updatedAt?: number;\n staleAt?: number;\n expiresAt?: number;\n};\n\nexport type FeatureFlareEvaluationResult = {\n value: boolean;\n metadata: FeatureFlareEvaluationMetadata;\n};\n\nexport type FeatureFlareMetricName =\n | 'ff_eval_latency_ms'\n | 'ff_cache_hit_ratio'\n | 'ff_revalidate_latency_ms'\n | 'ff_realtime_lag_ms'\n | 'ff_killswitch_apply_latency_ms';\n\nexport type FeatureFlareMetricTags = Record<string, string | number | boolean | undefined>;\n\nexport type FeatureFlareErrorReport = {\n /** The flag key being evaluated when the error was observed. */\n flagKey: string;\n /** Observed error rate as a fraction from 0 to 1 (e.g. 0.05 = 5%). */\n errorRate: number;\n /** Observed p99 latency in milliseconds. */\n latencyMs?: number;\n /** ISO-8601 timestamp of the observation window end. Defaults to now. */\n observedAt?: string;\n /** Optional free-form context about the error (e.g. HTTP status, exception name). */\n context?: Record<string, string | number | boolean>;\n};\n\nexport type FeatureFlarePersistentSnapshot = {\n revision?: number;\n killSwitches?: string[];\n flags: Record<\n string,\n {\n value: boolean;\n updatedAt: number;\n staleAt: number;\n expiresAt: number;\n source?: FeatureFlareCacheSource;\n revision?: number;\n }\n >;\n};\n\nexport type FeatureFlarePersistentCacheAdapter = {\n load: (envKey: string) => Promise<FeatureFlarePersistentSnapshot | null> | FeatureFlarePersistentSnapshot | null;\n save: (envKey: string, snapshot: FeatureFlarePersistentSnapshot) => Promise<void> | void;\n};\n\nexport type FeatureFlareBootstrapPayload = {\n revision?: number;\n killSwitches?: string[];\n flags?:\n | Record<string, boolean>\n | Array<{ key: string; value: boolean; revision?: number; updatedAt?: number }>;\n};\n\nexport type FeatureFlareClientOptions = {\n apiBaseUrl?: string;\n sdkKey?: string;\n projectKey?: string;\n envKey?: string;\n timeoutMs?: number;\n maxRetries?: number;\n backoffMs?: number;\n jitter?: number;\n cacheTtlMs?: number;\n staleTtlMs?: number;\n bootstrap?: FeatureFlareBootstrapPayload;\n persistentCache?: FeatureFlarePersistentCacheAdapter;\n onMetric?: (metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags) => void;\n realtime?: {\n enabled?: boolean;\n pollingIntervalMs?: number;\n ssePath?: string;\n };\n};\n\ntype CacheItem = {\n envKey: string;\n flagKey: string;\n value: boolean;\n updatedAt: number;\n staleAt: number;\n expiresAt: number;\n source: FeatureFlareCacheSource;\n revision: number;\n};\n\ntype RealtimeEventPayload = {\n type: 'flag.updated' | 'flag.deleted' | 'env.kill_switch.updated' | 'snapshot.invalidate';\n timestamp?: number;\n revision?: number;\n data?: Record<string, unknown>;\n};\n\ntype FeatureFlareClientEvents = {\n update: {\n changedKeys: string[];\n source: FeatureFlareCacheSource | 'network';\n /** Set when a server snapshot invalidation caused a full flags refetch; listeners should refresh UI even if values are unchanged. */\n snapshotInvalidate?: boolean;\n };\n circuitOpen: { envKey: string; reason: string };\n circuitClose: { envKey: string };\n connectionState: { state: 'connected' | 'degraded' | 'offline'; transport: 'sse' | 'polling' | 'none' };\n};\n\nfunction getEnvKeyFromEnv(): string | null {\n if (typeof process !== 'undefined' && process.env) {\n return (\n process.env.FEATUREFLARE_ENV_KEY?.trim() ||\n process.env.SHIPIT_ENV_KEY?.trim() ||\n null\n );\n }\n return null;\n}\n\nfunction getSdkKeyFromEnv(): string | null {\n if (typeof process !== 'undefined' && process.env) {\n return (\n process.env.FEATUREFLARE_CLIENT_KEY?.trim() ||\n process.env.FEATUREFLARE_SERVER_KEY?.trim() ||\n process.env.SHIPIT_CLIENT_KEY?.trim() ||\n process.env.SHIPIT_SERVER_KEY?.trim() ||\n null\n );\n }\n return null;\n}\n\nfunction monotonicNow(): number {\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n return performance.now();\n }\n return Date.now();\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction isRetriableStatus(status: number): boolean {\n return status === 408 || status === 425 || status === 429 || status >= 500;\n}\n\nfunction normalizeBoolMap(\n input: { flags?: Array<{ key: string; value: boolean }>; values?: Record<string, boolean> }\n): Array<{ key: string; value: boolean }> {\n if (Array.isArray(input.flags)) {\n return input.flags\n .filter((entry): entry is { key: string; value: boolean } =>\n Boolean(entry) && typeof entry.key === 'string' && typeof entry.value === 'boolean'\n )\n .map((entry) => ({ key: entry.key, value: entry.value }));\n }\n\n const values = input.values ?? {};\n return Object.entries(values).map(([key, value]) => ({ key, value: Boolean(value) }));\n}\n\nexport class InMemoryMetricsCollector {\n private readonly buckets = new Map<string, number[]>();\n\n record = (metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags) => {\n const key = `${metricName}:${JSON.stringify(tags ?? {})}`;\n const list = this.buckets.get(key) ?? [];\n list.push(value);\n this.buckets.set(key, list);\n };\n\n get(metricName: FeatureFlareMetricName): Array<{ tags: FeatureFlareMetricTags; values: number[] }> {\n const rows: Array<{ tags: FeatureFlareMetricTags; values: number[] }> = [];\n for (const [key, values] of this.buckets.entries()) {\n if (!key.startsWith(`${metricName}:`)) continue;\n rows.push({\n tags: JSON.parse(key.slice(metricName.length + 1)) as FeatureFlareMetricTags,\n values: [...values]\n });\n }\n return rows;\n }\n}\n\nexport class FeatureFlareClient {\n private readonly apiBaseUrl: string;\n private readonly sdkKey: string | null;\n private readonly projectKey: string | null;\n private readonly envKey: string;\n private readonly expectedEnvKey: string | null;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly backoffMs: number;\n private readonly jitter: number;\n private readonly cacheTtlMs: number;\n private readonly staleTtlMs: number;\n private readonly persistentCache: FeatureFlarePersistentCacheAdapter | undefined;\n private readonly onMetric?: (metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags) => void;\n private readonly listeners: {\n [K in keyof FeatureFlareClientEvents]: Set<(payload: FeatureFlareClientEvents[K]) => void>;\n } = {\n update: new Set(),\n circuitOpen: new Set(),\n circuitClose: new Set(),\n connectionState: new Set()\n };\n\n private readonly cache = new Map<string, CacheItem>();\n private readonly diagnostics = new Map<string, FeatureFlareEvaluationMetadata>();\n private readonly killSwitches = new Set<string>();\n\n private revision = 0;\n private circuitOpen = false;\n private persistentLoadPromise: Promise<void> | null = null;\n private readonly inFlightRevalidate = new Map<string, Promise<Array<{ key: string; value: boolean }> | null>>();\n private lastUser: FeatureFlareUser | null = null;\n private lastDefaultValue = false;\n\n private realtimeEnabled = true;\n private realtimePollingMs = 15000;\n private realtimeSsePath = '/api/v1/sdk/stream';\n private pollTimer: ReturnType<typeof setTimeout> | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private eventSource: EventSource | null = null;\n\n constructor(options: FeatureFlareClientOptions = {}) {\n this.apiBaseUrl = getApiBaseUrl(options.apiBaseUrl).replace(/\\/$/, '');\n this.sdkKey = options.sdkKey?.trim() || getSdkKeyFromEnv();\n this.projectKey = options.projectKey?.trim() ? options.projectKey.trim() : null;\n const explicitOrEnvKey = options.envKey?.trim() || getEnvKeyFromEnv() || null;\n this.envKey = explicitOrEnvKey ?? 'production';\n this.expectedEnvKey = explicitOrEnvKey;\n\n if (!this.sdkKey && !this.projectKey) {\n throw new Error(\n 'FeatureFlareClient requires either sdkKey (recommended) or projectKey (legacy). Set FEATUREFLARE_CLIENT_KEY or FEATUREFLARE_SERVER_KEY env var, or pass sdkKey in options.'\n );\n }\n\n this.timeoutMs = Number.isFinite(options.timeoutMs) && (options.timeoutMs ?? 0) > 0 ? Number(options.timeoutMs) : 3000;\n this.maxRetries = Number.isFinite(options.maxRetries) && (options.maxRetries ?? 0) >= 0 ? Number(options.maxRetries) : 2;\n this.backoffMs = Number.isFinite(options.backoffMs) && (options.backoffMs ?? 0) > 0 ? Number(options.backoffMs) : 200;\n this.jitter = Number.isFinite(options.jitter) && (options.jitter ?? 0) >= 0 ? Number(options.jitter) : 0.25;\n\n this.cacheTtlMs = Number.isFinite(options.cacheTtlMs) && (options.cacheTtlMs ?? 0) > 0 ? Number(options.cacheTtlMs) : 60000;\n const configuredStaleTtlMs =\n Number.isFinite(options.staleTtlMs) && (options.staleTtlMs ?? 0) > 0 ? Number(options.staleTtlMs) : 10000;\n this.staleTtlMs = Math.min(configuredStaleTtlMs, this.cacheTtlMs);\n\n this.persistentCache = options.persistentCache;\n this.onMetric = options.onMetric;\n\n this.realtimeEnabled = options.realtime?.enabled ?? true;\n this.realtimePollingMs =\n Number.isFinite(options.realtime?.pollingIntervalMs) && (options.realtime?.pollingIntervalMs ?? 0) > 0\n ? Number(options.realtime?.pollingIntervalMs)\n : 15000;\n this.realtimeSsePath = options.realtime?.ssePath ?? '/api/v1/sdk/stream';\n\n this.applyBootstrap(options.bootstrap);\n this.persistentLoadPromise = this.loadPersistentCache();\n\n if (this.realtimeEnabled && this.sdkKey) {\n this.startRealtime();\n }\n }\n\n private getCacheKey(flagKey: string): string {\n return `${this.envKey}:${flagKey}`;\n }\n\n private normalizeUser(input: FeatureFlareUserPayload): FeatureFlareUser {\n const key = (input.id ?? input.key ?? '').trim();\n if (!key) throw new Error('FeatureFlareClient requires user.id (or legacy user.key).');\n return {\n key,\n email: input.email,\n name: input.name,\n country: input.country,\n custom: input.meta ?? input.custom\n };\n }\n\n private emit<K extends keyof FeatureFlareClientEvents>(event: K, payload: FeatureFlareClientEvents[K]): void {\n for (const listener of this.listeners[event]) {\n listener(payload);\n }\n }\n\n on<K extends keyof FeatureFlareClientEvents>(\n event: K,\n listener: (payload: FeatureFlareClientEvents[K]) => void\n ): () => void {\n this.listeners[event].add(listener);\n return () => {\n this.listeners[event].delete(listener);\n };\n }\n\n private emitMetric(metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags): void {\n this.onMetric?.(metricName, value, tags);\n }\n\n private async ensurePersistentLoaded(): Promise<void> {\n if (!this.persistentLoadPromise) return;\n await this.persistentLoadPromise;\n }\n\n private async loadPersistentCache(): Promise<void> {\n if (!this.persistentCache) return;\n try {\n const snapshot = await this.persistentCache.load(this.envKey);\n if (!snapshot) return;\n this.revision = Math.max(this.revision, snapshot.revision ?? 0);\n for (const killSwitchKey of snapshot.killSwitches ?? []) {\n this.killSwitches.add(killSwitchKey);\n }\n\n for (const [flagKey, item] of Object.entries(snapshot.flags ?? {})) {\n const existing = this.cache.get(this.getCacheKey(flagKey));\n if (existing && existing.source === 'bootstrap') continue;\n this.cache.set(this.getCacheKey(flagKey), {\n envKey: this.envKey,\n flagKey,\n value: Boolean(item.value),\n updatedAt: Number(item.updatedAt) || Date.now(),\n staleAt: Number(item.staleAt) || Date.now(),\n expiresAt: Number(item.expiresAt) || Date.now(),\n source: item.source ?? 'persistent',\n revision: item.revision ?? 0\n });\n }\n } catch {\n // Ignore persistent cache failures; runtime must stay non-throwing for outage semantics.\n }\n }\n\n private async persistCache(): Promise<void> {\n if (!this.persistentCache) return;\n const snapshot: FeatureFlarePersistentSnapshot = {\n revision: this.revision,\n killSwitches: [...this.killSwitches],\n flags: {}\n };\n\n for (const [key, item] of this.cache.entries()) {\n if (!key.startsWith(`${this.envKey}:`)) continue;\n snapshot.flags[item.flagKey] = {\n value: item.value,\n updatedAt: item.updatedAt,\n staleAt: item.staleAt,\n expiresAt: item.expiresAt,\n source: item.source,\n revision: item.revision\n };\n }\n\n try {\n await this.persistentCache.save(this.envKey, snapshot);\n } catch {\n // Persistent errors must not break evaluation.\n }\n }\n\n private makeCacheWindow(at = Date.now()): Pick<CacheItem, 'updatedAt' | 'staleAt' | 'expiresAt'> {\n return {\n updatedAt: at,\n staleAt: at + this.staleTtlMs,\n expiresAt: at + this.cacheTtlMs\n };\n }\n\n private setCacheItem(\n flagKey: string,\n value: boolean,\n source: FeatureFlareCacheSource,\n revision = this.revision,\n at = Date.now()\n ): void {\n this.cache.set(this.getCacheKey(flagKey), {\n envKey: this.envKey,\n flagKey,\n value,\n source,\n revision,\n ...this.makeCacheWindow(at)\n });\n }\n\n private applyBootstrap(bootstrap?: FeatureFlareBootstrapPayload): void {\n if (!bootstrap) return;\n this.revision = Math.max(this.revision, bootstrap.revision ?? 0);\n for (const killSwitchKey of bootstrap.killSwitches ?? []) {\n this.killSwitches.add(killSwitchKey);\n }\n\n const apply = (flagKey: string, value: boolean, revision?: number, updatedAt?: number) => {\n this.setCacheItem(flagKey, value, 'bootstrap', revision ?? this.revision, updatedAt ?? Date.now());\n };\n\n if (Array.isArray(bootstrap.flags)) {\n for (const item of bootstrap.flags) {\n if (!item || typeof item.key !== 'string') continue;\n apply(item.key, Boolean(item.value), item.revision, item.updatedAt);\n }\n return;\n }\n\n for (const [flagKey, value] of Object.entries(bootstrap.flags ?? {})) {\n apply(flagKey, Boolean(value));\n }\n }\n\n private getCacheState(item: CacheItem | undefined, now = Date.now()): 'fresh' | 'stale' | 'expired' | 'missing' {\n if (!item) return 'missing';\n if (now <= item.staleAt) return 'fresh';\n if (now <= item.expiresAt) return 'stale';\n return 'expired';\n }\n\n private setCircuitState(isOpen: boolean, reason = ''): void {\n if (this.circuitOpen === isOpen) return;\n this.circuitOpen = isOpen;\n if (isOpen) {\n this.emit('circuitOpen', { envKey: this.envKey, reason });\n return;\n }\n this.emit('circuitClose', { envKey: this.envKey });\n }\n\n private async fetchWithRetry(url: string, init: RequestInit, transport: 'network' | 'polling') {\n let lastError: unknown = null;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n const ac = typeof AbortController !== 'undefined' ? new AbortController() : null;\n const timeout =\n ac !== null\n ? setTimeout(() => {\n ac.abort();\n }, this.timeoutMs)\n : null;\n\n try {\n const response = await fetch(url, {\n ...init,\n signal: ac?.signal\n });\n\n if (timeout) clearTimeout(timeout);\n\n if (!response.ok && isRetriableStatus(response.status) && attempt < this.maxRetries) {\n lastError = new Error(`HTTP ${response.status}`);\n const jitterOffset = this.backoffMs * this.jitter * Math.random();\n await sleep(this.backoffMs * (attempt + 1) + jitterOffset);\n continue;\n }\n\n return response;\n } catch (error) {\n if (timeout) clearTimeout(timeout);\n lastError = error;\n if (attempt >= this.maxRetries) break;\n const jitterOffset = this.backoffMs * this.jitter * Math.random();\n await sleep(this.backoffMs * (attempt + 1) + jitterOffset);\n }\n }\n\n this.setCircuitState(true, transport);\n throw lastError;\n }\n\n private collectCachedFlags(): Array<{ key: string; value: boolean }> {\n const now = Date.now();\n const flags: Array<{ key: string; value: boolean }> = [];\n\n for (const [cacheKey, item] of this.cache.entries()) {\n if (!cacheKey.startsWith(`${this.envKey}:`)) continue;\n if (this.killSwitches.has(item.flagKey)) {\n flags.push({ key: item.flagKey, value: false });\n continue;\n }\n\n const state = this.getCacheState(item, now);\n if (state === 'missing' || state === 'expired') continue;\n flags.push({ key: item.flagKey, value: item.value });\n }\n\n return flags.sort((a, b) => a.key.localeCompare(b.key));\n }\n\n getCachedFlags(): {\n flags: Array<{ key: string; value: boolean }>;\n hasData: boolean;\n } {\n const flags = this.collectCachedFlags();\n return { flags, hasData: flags.length > 0 };\n }\n\n getFlagDiagnostics(flagKey: string): FeatureFlareEvaluationMetadata | null {\n return this.diagnostics.get(this.getCacheKey(flagKey)) ?? null;\n }\n\n setKillSwitch(flagKey: string, enabled: boolean): void {\n const started = monotonicNow();\n if (enabled) {\n this.killSwitches.add(flagKey);\n } else {\n this.killSwitches.delete(flagKey);\n }\n const elapsed = monotonicNow() - started;\n this.emitMetric('ff_killswitch_apply_latency_ms', elapsed, {\n env: this.envKey,\n result: enabled ? 'enabled' : 'disabled'\n });\n this.emit('update', { changedKeys: [flagKey], source: 'realtime' });\n void this.persistCache();\n }\n\n private async fetchEvalFromNetwork(\n flagKey: string,\n normalizedUser: FeatureFlareUser,\n defaultValue: boolean\n ): Promise<boolean | null> {\n const response = this.sdkKey\n ? await this.fetchWithRetry(\n `${this.apiBaseUrl}/api/v1/sdk/eval`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n flagKey,\n user: normalizedUser,\n defaultValue,\n expectedEnvKey: this.expectedEnvKey ?? undefined\n })\n },\n 'network'\n )\n : await this.fetchWithRetry(\n `${this.apiBaseUrl}/api/v1/eval`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n projectKey: this.projectKey,\n envKey: this.envKey,\n flagKey,\n user: normalizedUser,\n defaultValue\n })\n },\n 'network'\n );\n\n if (!response.ok) {\n if (!isRetriableStatus(response.status)) {\n this.setCircuitState(true, `http_${response.status}`);\n }\n return null;\n }\n\n const json = (await response.json()) as { value?: boolean; revision?: number; killSwitch?: boolean };\n const value = typeof json.value === 'boolean' ? json.value : defaultValue;\n\n if (json.killSwitch === true) {\n this.killSwitches.add(flagKey);\n }\n\n const revision = json.revision ?? this.revision;\n this.revision = Math.max(this.revision, revision);\n this.setCacheItem(flagKey, value, 'network', revision);\n this.setCircuitState(false);\n void this.persistCache();\n this.emit('update', { changedKeys: [flagKey], source: 'network' });\n return value;\n }\n\n private async fetchFlagsFromNetwork(\n normalizedUser: FeatureFlareUser,\n defaultValue: boolean,\n transport: 'network' | 'polling',\n opts?: { fromSnapshotInvalidate?: boolean }\n ): Promise<Array<{ key: string; value: boolean }> | null> {\n if (!this.sdkKey) {\n return null;\n }\n\n const started = monotonicNow();\n\n try {\n const response = await this.fetchWithRetry(\n `${this.apiBaseUrl}/api/v1/sdk/flags`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n user: normalizedUser,\n defaultValue,\n expectedEnvKey: this.expectedEnvKey ?? undefined\n })\n },\n transport\n );\n\n if (!response.ok) {\n if (!isRetriableStatus(response.status)) {\n this.setCircuitState(true, `http_${response.status}`);\n }\n return null;\n }\n\n const json = (await response.json()) as {\n flags?: Array<{ key: string; value: boolean }>;\n values?: Record<string, boolean>;\n revision?: number;\n killSwitches?: string[];\n };\n\n const list = normalizeBoolMap(json);\n const revision = json.revision ?? this.revision;\n this.revision = Math.max(this.revision, revision);\n\n if (Array.isArray(json.killSwitches)) {\n for (const key of json.killSwitches) {\n this.killSwitches.add(key);\n }\n }\n\n const changed = new Set<string>();\n for (const entry of list) {\n const existing = this.cache.get(this.getCacheKey(entry.key));\n if (!existing || existing.value !== entry.value || existing.revision !== revision) {\n changed.add(entry.key);\n }\n this.setCacheItem(entry.key, entry.value, 'network', revision);\n }\n\n if (opts?.fromSnapshotInvalidate && list !== null) {\n this.emit('update', {\n changedKeys: list.map((e) => e.key),\n source: 'realtime',\n snapshotInvalidate: true\n });\n } else if (changed.size > 0) {\n this.emit('update', { changedKeys: [...changed], source: 'network' });\n }\n\n this.setCircuitState(false);\n void this.persistCache();\n this.emitMetric('ff_revalidate_latency_ms', monotonicNow() - started, {\n env: this.envKey,\n transport\n });\n return list;\n } catch {\n this.emitMetric('ff_revalidate_latency_ms', monotonicNow() - started, {\n env: this.envKey,\n transport,\n result: 'error'\n });\n return null;\n }\n }\n\n private revalidate(\n normalizedUser: FeatureFlareUser,\n defaultValue: boolean,\n opts?: { fromSnapshotInvalidate?: boolean }\n ): Promise<Array<{ key: string; value: boolean }> | null> {\n const existing = this.inFlightRevalidate.get(this.envKey);\n if (existing) {\n if (opts?.fromSnapshotInvalidate) {\n void existing.then((list) => {\n if (list !== null) {\n this.emit('update', {\n changedKeys: list.map((e) => e.key),\n source: 'realtime',\n snapshotInvalidate: true\n });\n }\n });\n }\n return existing;\n }\n\n const promise = this.fetchFlagsFromNetwork(normalizedUser, defaultValue, 'network', opts).finally(() => {\n this.inFlightRevalidate.delete(this.envKey);\n });\n\n this.inFlightRevalidate.set(this.envKey, promise);\n return promise;\n }\n\n async evaluate(\n flagKey: string,\n user: FeatureFlareUserPayload,\n defaultValue = false\n ): Promise<FeatureFlareEvaluationResult> {\n const started = monotonicNow();\n await this.ensurePersistentLoaded();\n\n const normalizedUser = this.normalizeUser(user);\n this.lastUser = normalizedUser;\n this.lastDefaultValue = defaultValue;\n\n if (this.killSwitches.has(flagKey)) {\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'kill_switch',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: 'kill_switch'\n };\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'disabled'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: false, metadata };\n }\n\n const cacheItem = this.cache.get(this.getCacheKey(flagKey));\n const cacheState = this.getCacheState(cacheItem);\n\n if (cacheItem && cacheState === 'fresh') {\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: cacheItem.source === 'bootstrap' || cacheItem.source === 'persistent' ? 'bootstrap' : 'fresh_cache',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: cacheItem.source,\n updatedAt: cacheItem.updatedAt,\n staleAt: cacheItem.staleAt,\n expiresAt: cacheItem.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 1, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'cache_hit'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: cacheItem.value, metadata };\n }\n\n if (cacheItem && cacheState === 'stale') {\n void this.revalidate(normalizedUser, defaultValue);\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'stale_cache',\n isStale: true,\n latencyMs: monotonicNow() - started,\n source: cacheItem.source,\n updatedAt: cacheItem.updatedAt,\n staleAt: cacheItem.staleAt,\n expiresAt: cacheItem.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 1, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'stale'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: cacheItem.value, metadata };\n }\n\n if (cacheItem && (cacheItem.source === 'bootstrap' || cacheItem.source === 'persistent')) {\n void this.revalidate(normalizedUser, defaultValue);\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'bootstrap',\n isStale: true,\n latencyMs: monotonicNow() - started,\n source: cacheItem.source,\n updatedAt: cacheItem.updatedAt,\n staleAt: cacheItem.staleAt,\n expiresAt: cacheItem.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 1, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'bootstrap'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: cacheItem.value, metadata };\n }\n\n try {\n const networkValue = await this.fetchEvalFromNetwork(flagKey, normalizedUser, defaultValue);\n if (networkValue !== null) {\n const item = this.cache.get(this.getCacheKey(flagKey));\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'network',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: 'network',\n updatedAt: item?.updatedAt,\n staleAt: item?.staleAt,\n expiresAt: item?.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 0, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'network'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: networkValue, metadata };\n }\n } catch {\n // Fall through to deterministic default for outage semantics.\n }\n\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'default',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: 'default'\n };\n this.emitMetric('ff_cache_hit_ratio', 0, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'default'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: defaultValue, metadata };\n }\n\n async bool(flagKey: string, user: FeatureFlareUserPayload, defaultValue = false): Promise<boolean> {\n const result = await this.evaluate(flagKey, user, defaultValue);\n return result.value;\n }\n\n async flags(user: FeatureFlareUserPayload, defaultValue = false): Promise<Array<{ key: string; value: boolean }>> {\n await this.ensurePersistentLoaded();\n const normalizedUser = this.normalizeUser(user);\n this.lastUser = normalizedUser;\n this.lastDefaultValue = defaultValue;\n\n const list = await this.revalidate(normalizedUser, defaultValue);\n if (list && list.length > 0) {\n return list.map((entry) => ({\n key: entry.key,\n value: this.killSwitches.has(entry.key) ? false : entry.value\n }));\n }\n\n const cached = this.collectCachedFlags();\n if (cached.length > 0) return cached;\n return [];\n }\n\n private applyRealtimeMessage(message: RealtimeEventPayload): void {\n if (typeof message.revision === 'number' && message.revision < this.revision) {\n return;\n }\n\n if (typeof message.revision === 'number') {\n this.revision = message.revision;\n }\n\n const changed = new Set<string>();\n const now = Date.now();\n\n if (message.type === 'flag.updated') {\n const flagKey = typeof message.data?.flagKey === 'string' ? message.data.flagKey : null;\n const value = typeof message.data?.value === 'boolean' ? message.data.value : null;\n if (flagKey !== null && value !== null) {\n this.setCacheItem(flagKey, value, 'realtime', message.revision ?? this.revision, now);\n changed.add(flagKey);\n }\n }\n\n if (message.type === 'flag.deleted') {\n const flagKey = typeof message.data?.flagKey === 'string' ? message.data.flagKey : null;\n if (flagKey !== null) {\n this.cache.delete(this.getCacheKey(flagKey));\n changed.add(flagKey);\n }\n }\n\n if (message.type === 'env.kill_switch.updated') {\n const started = monotonicNow();\n const flagKey = typeof message.data?.flagKey === 'string' ? message.data.flagKey : null;\n const enabled = typeof message.data?.enabled === 'boolean' ? message.data.enabled : true;\n if (flagKey !== null) {\n if (enabled) {\n this.killSwitches.add(flagKey);\n } else {\n this.killSwitches.delete(flagKey);\n }\n changed.add(flagKey);\n this.emitMetric('ff_killswitch_apply_latency_ms', monotonicNow() - started, {\n env: this.envKey,\n transport: this.eventSource ? 'sse' : 'polling',\n result: enabled ? 'enabled' : 'disabled'\n });\n }\n }\n\n if (message.type === 'snapshot.invalidate' && this.lastUser) {\n void this.revalidate(this.lastUser, this.lastDefaultValue, { fromSnapshotInvalidate: true });\n }\n\n const eventLagMs = Math.max(0, Date.now() - (message.timestamp ?? Date.now()));\n this.emitMetric('ff_realtime_lag_ms', eventLagMs, {\n env: this.envKey,\n transport: this.eventSource ? 'sse' : 'polling'\n });\n\n if (changed.size > 0) {\n this.emit('update', { changedKeys: [...changed], source: 'realtime' });\n void this.persistCache();\n }\n }\n\n private startPolling(immediate = false): void {\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n\n const tick = async () => {\n if (!this.lastUser) {\n this.pollTimer = setTimeout(tick, this.realtimePollingMs);\n return;\n }\n await this.fetchFlagsFromNetwork(this.lastUser, this.lastDefaultValue, 'polling');\n this.pollTimer = setTimeout(tick, this.realtimePollingMs);\n };\n\n if (immediate) {\n void tick();\n return;\n }\n\n this.pollTimer = setTimeout(tick, this.realtimePollingMs);\n }\n\n private connectSse(attempt = 0): void {\n const EventSourceImpl = typeof EventSource !== 'undefined' ? EventSource : null;\n if (!EventSourceImpl || !this.sdkKey) {\n this.emit('connectionState', { state: 'degraded', transport: 'polling' });\n this.startPolling(true);\n return;\n }\n\n const url = new URL(this.realtimeSsePath, this.apiBaseUrl);\n url.searchParams.set('sdkKey', this.sdkKey);\n url.searchParams.set('envKey', this.envKey);\n\n this.eventSource = new EventSourceImpl(url.toString());\n\n this.eventSource.onopen = () => {\n this.emit('connectionState', { state: 'connected', transport: 'sse' });\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n };\n\n this.eventSource.onmessage = (event: MessageEvent) => {\n try {\n const payload = JSON.parse(String(event.data)) as RealtimeEventPayload;\n this.applyRealtimeMessage(payload);\n } catch {\n // Ignore malformed realtime messages.\n }\n };\n\n this.eventSource.onerror = () => {\n this.emit('connectionState', { state: 'degraded', transport: 'polling' });\n this.eventSource?.close();\n this.eventSource = null;\n this.startPolling(true);\n\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n }\n const backoff = Math.min(this.backoffMs * (attempt + 1), 30000);\n this.reconnectTimer = setTimeout(() => {\n this.connectSse(attempt + 1);\n }, backoff);\n };\n }\n\n startRealtime(): void {\n this.realtimeEnabled = true;\n this.connectSse(0);\n }\n\n stopRealtime(): void {\n this.realtimeEnabled = false;\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n }\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.emit('connectionState', { state: 'offline', transport: 'none' });\n }\n\n /**\n * Report observed error metrics (error rate, latency) for a flag back to the FeatureFlare API.\n * The API evaluates the report against active rollback policies and may trigger an automated\n * rollback if configured thresholds are breached.\n *\n * Errors from this call are silently swallowed so that reporting never disrupts the host application.\n */\n async reportError(report: FeatureFlareErrorReport): Promise<void> {\n if (!this.sdkKey) return;\n try {\n await fetch(`${this.apiBaseUrl}/api/v1/sdk/report`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n flagKey: report.flagKey,\n errorRate: report.errorRate,\n latencyMs: report.latencyMs,\n observedAt: report.observedAt ?? new Date().toISOString(),\n envKey: this.envKey,\n context: report.context\n })\n });\n } catch {\n // Reporting failures must never surface to the caller.\n }\n }\n\n dispose(): void {\n this.stopRealtime();\n this.listeners.update.clear();\n this.listeners.circuitOpen.clear();\n this.listeners.circuitClose.clear();\n this.listeners.connectionState.clear();\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["metadata"],"mappings":"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","file":"index.cjs","sourcesContent":["export type FeatureFlareUserPayload = {\n /** Unique user identifier (preferred). */\n id?: string;\n /** Legacy alias for id. */\n key?: string;\n email?: string;\n name?: string;\n country?: string;\n /** Queryable attributes. */\n meta?: Record<string, string | number | boolean | null>;\n /** Legacy alias for meta. */\n custom?: Record<string, string | number | boolean | null>;\n /** Session data to persist for later product and analytics features. */\n session?: Record<string, string | number | boolean | null>;\n /** Product metrics or counters associated with the current evaluator. */\n metrics?: Record<string, string | number | boolean | null>;\n};\n\ntype FeatureFlareUser = {\n key: string;\n email?: string;\n name?: string;\n country?: string;\n custom?: Record<string, string | number | boolean | null>;\n session?: Record<string, string | number | boolean | null>;\n metrics?: Record<string, string | number | boolean | null>;\n};\n\nconst DEFAULT_FEATUREFLARE_API_BASE_URL =\n 'https://api.featureflare.com';\nconst DEFAULT_CACHE_TTL_MS = 30 * 60 * 1000;\nconst DEFAULT_STALE_TTL_MS = 10 * 60 * 1000;\n\nfunction getApiBaseUrlFromEnv(): string | null {\n if (typeof process !== 'undefined' && process.env) {\n return (\n process.env.FEATUREFLARE_API_BASE_URL?.trim() ||\n process.env.SHIPIT_API_BASE_URL?.trim() ||\n null\n );\n }\n return null;\n}\n\nfunction getApiBaseUrl(explicit?: string): string {\n const fromOptions = explicit?.trim();\n if (fromOptions) return fromOptions;\n\n const fromEnv = getApiBaseUrlFromEnv();\n if (fromEnv) return fromEnv;\n\n return DEFAULT_FEATUREFLARE_API_BASE_URL;\n}\n\nexport type FeatureFlareCacheSource = 'bootstrap' | 'network' | 'realtime' | 'persistent';\nexport type FeatureFlareEvaluationReason = 'fresh_cache' | 'stale_cache' | 'bootstrap' | 'default' | 'network' | 'kill_switch';\n\nexport type FeatureFlareEvaluationMetadata = {\n reason: FeatureFlareEvaluationReason;\n isStale: boolean;\n latencyMs: number;\n source: FeatureFlareCacheSource | 'default' | 'kill_switch';\n updatedAt?: number;\n staleAt?: number;\n expiresAt?: number;\n};\n\nexport type FeatureFlareEvaluationResult = {\n value: boolean;\n metadata: FeatureFlareEvaluationMetadata;\n};\n\nexport type FeatureFlareMetricName =\n | 'ff_eval_latency_ms'\n | 'ff_cache_hit_ratio'\n | 'ff_revalidate_latency_ms'\n | 'ff_realtime_lag_ms'\n | 'ff_killswitch_apply_latency_ms';\n\nexport type FeatureFlareMetricTags = Record<string, string | number | boolean | undefined>;\n\nexport type FeatureFlareErrorReport = {\n /** The flag key being evaluated when the error was observed. */\n flagKey: string;\n /** Observed error rate as a fraction from 0 to 1 (e.g. 0.05 = 5%). */\n errorRate: number;\n /** Observed p99 latency in milliseconds. */\n latencyMs?: number;\n /** ISO-8601 timestamp of the observation window end. Defaults to now. */\n observedAt?: string;\n /** Optional free-form context about the error (e.g. HTTP status, exception name). */\n context?: Record<string, string | number | boolean>;\n};\n\nexport type FeatureFlarePersistentSnapshot = {\n revision?: number;\n killSwitches?: string[];\n flags: Record<\n string,\n {\n value: boolean;\n updatedAt: number;\n staleAt: number;\n expiresAt: number;\n source?: FeatureFlareCacheSource;\n revision?: number;\n }\n >;\n};\n\nexport type FeatureFlarePersistentCacheAdapter = {\n load: (envKey: string) => Promise<FeatureFlarePersistentSnapshot | null> | FeatureFlarePersistentSnapshot | null;\n save: (envKey: string, snapshot: FeatureFlarePersistentSnapshot) => Promise<void> | void;\n};\n\nexport type FeatureFlareBootstrapPayload = {\n revision?: number;\n killSwitches?: string[];\n flags?:\n | Record<string, boolean>\n | Array<{ key: string; value: boolean; revision?: number; updatedAt?: number }>;\n};\n\nexport type FeatureFlareClientOptions = {\n apiBaseUrl?: string;\n sdkKey?: string;\n projectKey?: string;\n envKey?: string;\n getRealtimeUser?: () => FeatureFlareUserPayload | null | undefined;\n timeoutMs?: number;\n maxRetries?: number;\n backoffMs?: number;\n jitter?: number;\n cacheTtlMs?: number;\n staleTtlMs?: number;\n bootstrap?: FeatureFlareBootstrapPayload;\n persistentCache?: FeatureFlarePersistentCacheAdapter;\n onMetric?: (metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags) => void;\n realtime?: {\n enabled?: boolean;\n pollingIntervalMs?: number;\n ssePath?: string;\n disconnectWhenHidden?: boolean;\n };\n};\n\ntype CacheItem = {\n envKey: string;\n flagKey: string;\n value: boolean;\n updatedAt: number;\n staleAt: number;\n expiresAt: number;\n source: FeatureFlareCacheSource;\n revision: number;\n};\n\ntype RealtimeEventPayload = {\n type: 'flag.updated' | 'flag.deleted' | 'env.kill_switch.updated' | 'snapshot.invalidate';\n timestamp?: number;\n revision?: number;\n data?: Record<string, unknown>;\n};\n\ntype StreamTokenResponse = {\n key?: string;\n};\n\ntype FeatureFlareClientEvents = {\n update: {\n changedKeys: string[];\n source: FeatureFlareCacheSource | 'network';\n /** Set when a server snapshot invalidation caused a full flags refetch; listeners should refresh UI even if values are unchanged. */\n snapshotInvalidate?: boolean;\n };\n circuitOpen: { envKey: string; reason: string };\n circuitClose: { envKey: string };\n connectionState: { state: 'connected' | 'degraded' | 'offline'; transport: 'sse' | 'polling' | 'none' };\n};\n\ntype FeatureFlareConnectionState = FeatureFlareClientEvents['connectionState'];\n\nfunction getEnvKeyFromEnv(): string | null {\n if (typeof process !== 'undefined' && process.env) {\n return (\n process.env.FEATUREFLARE_ENV_KEY?.trim() ||\n process.env.SHIPIT_ENV_KEY?.trim() ||\n null\n );\n }\n return null;\n}\n\nfunction normalizeHashInput(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeHashInput(entry));\n }\n\n if (value && typeof value === 'object') {\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, entryValue]) => entryValue !== undefined)\n .sort(([leftKey], [rightKey]) => leftKey.localeCompare(rightKey));\n\n return Object.fromEntries(entries.map(([key, entryValue]) => [key, normalizeHashInput(entryValue)]));\n }\n\n return value;\n}\n\nfunction hashForStream(value: unknown): string {\n const input = JSON.stringify(normalizeHashInput(value));\n\n let forward = 0x811c9dc5;\n let backward = 0x811c9dc5;\n for (let index = 0; index < input.length; index += 1) {\n forward ^= input.charCodeAt(index);\n forward = Math.imul(forward, 0x01000193);\n\n const reverseIndex = input.length - 1 - index;\n backward ^= input.charCodeAt(reverseIndex);\n backward = Math.imul(backward, 0x01000193);\n }\n\n return `${(forward >>> 0).toString(16).padStart(8, '0')}${(backward >>> 0).toString(16).padStart(8, '0')}`;\n}\n\nfunction encodeBase64Url(value: string): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(value, 'utf8').toString('base64url');\n }\n\n const bytes = typeof TextEncoder !== 'undefined' ? new TextEncoder().encode(value) : [];\n let binary = '';\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n\n const base64 = typeof btoa === 'function' ? btoa(binary) : '';\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n}\n\ntype HashedRealtimeUserContext = {\n payloadHash: string;\n fields: Partial<Record<'id' | 'key' | 'email' | 'name' | 'country', string>>;\n metaEntries: Array<{ keyHash: string; valueHash: string }>;\n customEntries: Array<{ keyHash: string; valueHash: string }>;\n};\n\nfunction hashRecordEntries(record?: Record<string, string | number | boolean | null>): Array<{ keyHash: string; valueHash: string }> {\n if (!record) {\n return [];\n }\n\n return Object.entries(record)\n .sort(([leftKey], [rightKey]) => leftKey.localeCompare(rightKey))\n .map(([key, value]) => ({\n keyHash: hashForStream(key),\n valueHash: hashForStream(value)\n }));\n}\n\nfunction buildHashedRealtimeUserContext(input: FeatureFlareUserPayload): HashedRealtimeUserContext {\n const payload = {\n id: input.id ?? input.key\n };\n\n return {\n payloadHash: hashForStream(payload),\n fields: {\n ...((input.id ?? input.key) ? { id: hashForStream(input.id ?? input.key) } : {})\n },\n metaEntries: [],\n customEntries: []\n };\n}\n\nfunction getSdkKeyFromEnv(): string | null {\n if (typeof process !== 'undefined' && process.env) {\n return (\n process.env.FEATUREFLARE_CLIENT_KEY?.trim() ||\n process.env.FEATUREFLARE_SERVER_KEY?.trim() ||\n process.env.SHIPIT_CLIENT_KEY?.trim() ||\n process.env.SHIPIT_SERVER_KEY?.trim() ||\n null\n );\n }\n return null;\n}\n\nfunction monotonicNow(): number {\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n return performance.now();\n }\n return Date.now();\n}\n\nfunction isFeatureFlareDebugEnabled(): boolean {\n const envDebug =\n typeof process !== 'undefined' && process.env\n ? process.env.NEXT_PUBLIC_FEATUREFLARE_DEBUG?.trim() || process.env.FEATUREFLARE_DEBUG?.trim()\n : '';\n\n if (envDebug === '1' || envDebug?.toLowerCase() === 'true') {\n return true;\n }\n\n if (typeof window !== 'undefined') {\n try {\n const storageDebug = window.localStorage.getItem('featureflare:debug');\n return storageDebug === '1' || storageDebug?.toLowerCase() === 'true';\n } catch {\n return false;\n }\n }\n\n return false;\n}\n\nfunction debugLog(message: string, details?: Record<string, unknown>): void {\n if (!isFeatureFlareDebugEnabled()) {\n return;\n }\n\n if (details) {\n console.debug(`[FeatureFlare SDK] ${message}`, details);\n return;\n }\n\n console.debug(`[FeatureFlare SDK] ${message}`);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction isRetriableStatus(status: number): boolean {\n return status === 408 || status === 425 || status === 429 || status >= 500;\n}\n\nfunction normalizeBoolMap(\n input: { flags?: Array<{ key: string; value: boolean }>; values?: Record<string, boolean> }\n): Array<{ key: string; value: boolean }> {\n if (Array.isArray(input.flags)) {\n return input.flags\n .filter((entry): entry is { key: string; value: boolean } =>\n Boolean(entry) && typeof entry.key === 'string' && typeof entry.value === 'boolean'\n )\n .map((entry) => ({ key: entry.key, value: entry.value }));\n }\n\n const values = input.values ?? {};\n return Object.entries(values).map(([key, value]) => ({ key, value: Boolean(value) }));\n}\n\nexport class InMemoryMetricsCollector {\n private readonly buckets = new Map<string, number[]>();\n\n record = (metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags) => {\n const key = `${metricName}:${JSON.stringify(tags ?? {})}`;\n const list = this.buckets.get(key) ?? [];\n list.push(value);\n this.buckets.set(key, list);\n };\n\n get(metricName: FeatureFlareMetricName): Array<{ tags: FeatureFlareMetricTags; values: number[] }> {\n const rows: Array<{ tags: FeatureFlareMetricTags; values: number[] }> = [];\n for (const [key, values] of this.buckets.entries()) {\n if (!key.startsWith(`${metricName}:`)) continue;\n rows.push({\n tags: JSON.parse(key.slice(metricName.length + 1)) as FeatureFlareMetricTags,\n values: [...values]\n });\n }\n return rows;\n }\n}\n\nexport class FeatureFlareClient {\n private readonly apiBaseUrl: string;\n private readonly sdkKey: string | null;\n private readonly projectKey: string | null;\n private readonly envKey: string;\n private readonly expectedEnvKey: string | null;\n private readonly getRealtimeUser?: () => FeatureFlareUserPayload | null | undefined;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly backoffMs: number;\n private readonly jitter: number;\n private readonly cacheTtlMs: number;\n private readonly staleTtlMs: number;\n private readonly persistentCache: FeatureFlarePersistentCacheAdapter | undefined;\n private readonly onMetric?: (metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags) => void;\n private readonly listeners: {\n [K in keyof FeatureFlareClientEvents]: Set<(payload: FeatureFlareClientEvents[K]) => void>;\n } = {\n update: new Set(),\n circuitOpen: new Set(),\n circuitClose: new Set(),\n connectionState: new Set()\n };\n\n private readonly cache = new Map<string, CacheItem>();\n private readonly diagnostics = new Map<string, FeatureFlareEvaluationMetadata>();\n private readonly killSwitches = new Set<string>();\n\n private revision = 0;\n private circuitOpen = false;\n private persistentLoadPromise: Promise<void> | null = null;\n private readonly inFlightRevalidate = new Map<string, Promise<Array<{ key: string; value: boolean }> | null>>();\n private lastUser: FeatureFlareUser | null = null;\n private lastDefaultValue = false;\n\n private realtimeEnabled = true;\n private realtimePollingEnabled = true;\n private realtimePollingMs = 15000;\n private realtimeSsePath = '/api/v1/sdk/stream';\n private realtimeDisconnectWhenHidden = true;\n private visibilityListenerAttached = false;\n private connectionState: FeatureFlareConnectionState = { state: 'offline', transport: 'none' };\n private pollTimer: ReturnType<typeof setTimeout> | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private eventSource: EventSource | null = null;\n private streamConnectVersion = 0;\n\n constructor(options: FeatureFlareClientOptions = {}) {\n this.apiBaseUrl = getApiBaseUrl(options.apiBaseUrl).replace(/\\/$/, '');\n this.sdkKey = options.sdkKey?.trim() || getSdkKeyFromEnv();\n this.projectKey = options.projectKey?.trim() ? options.projectKey.trim() : null;\n const explicitOrEnvKey = options.envKey?.trim() || getEnvKeyFromEnv() || null;\n this.envKey = explicitOrEnvKey ?? 'production';\n this.expectedEnvKey = explicitOrEnvKey;\n this.getRealtimeUser = options.getRealtimeUser;\n\n if (!this.sdkKey && !this.projectKey) {\n throw new Error(\n 'FeatureFlareClient requires either sdkKey (recommended) or projectKey (legacy). Set FEATUREFLARE_CLIENT_KEY or FEATUREFLARE_SERVER_KEY env var, or pass sdkKey in options.'\n );\n }\n\n this.timeoutMs = Number.isFinite(options.timeoutMs) && (options.timeoutMs ?? 0) > 0 ? Number(options.timeoutMs) : 3000;\n this.maxRetries = Number.isFinite(options.maxRetries) && (options.maxRetries ?? 0) >= 0 ? Number(options.maxRetries) : 2;\n this.backoffMs = Number.isFinite(options.backoffMs) && (options.backoffMs ?? 0) > 0 ? Number(options.backoffMs) : 200;\n this.jitter = Number.isFinite(options.jitter) && (options.jitter ?? 0) >= 0 ? Number(options.jitter) : 0.25;\n\n this.cacheTtlMs = Number.isFinite(options.cacheTtlMs) && (options.cacheTtlMs ?? 0) > 0 ? Number(options.cacheTtlMs) : DEFAULT_CACHE_TTL_MS;\n const configuredStaleTtlMs =\n Number.isFinite(options.staleTtlMs) && (options.staleTtlMs ?? 0) > 0 ? Number(options.staleTtlMs) : DEFAULT_STALE_TTL_MS;\n this.staleTtlMs = Math.min(configuredStaleTtlMs, this.cacheTtlMs);\n\n this.persistentCache = options.persistentCache;\n this.onMetric = options.onMetric;\n\n this.realtimeEnabled = options.realtime?.enabled ?? true;\n const configuredPollingIntervalMs = Number(options.realtime?.pollingIntervalMs ?? NaN);\n if (Number.isFinite(configuredPollingIntervalMs) && configuredPollingIntervalMs === 0) {\n this.realtimePollingEnabled = false;\n this.realtimePollingMs = 0;\n } else {\n this.realtimePollingEnabled = true;\n this.realtimePollingMs =\n Number.isFinite(configuredPollingIntervalMs) && configuredPollingIntervalMs > 0\n ? configuredPollingIntervalMs\n : 15000;\n }\n this.realtimeSsePath = options.realtime?.ssePath ?? '/api/v1/sdk/stream';\n this.realtimeDisconnectWhenHidden = options.realtime?.disconnectWhenHidden ?? true;\n\n this.applyBootstrap(options.bootstrap);\n this.persistentLoadPromise = this.loadPersistentCache();\n\n if (this.realtimeEnabled && this.sdkKey) {\n this.attachVisibilityHandler();\n if (this.realtimeDisconnectWhenHidden && typeof document !== 'undefined' && document.visibilityState === 'hidden') {\n return;\n }\n this.startRealtime();\n }\n }\n\n private readonly handleVisibilityChange = (): void => {\n if (!this.realtimeDisconnectWhenHidden || typeof document === 'undefined') return;\n\n debugLog('Visibility changed', {\n visibilityState: document.visibilityState,\n realtimeEnabled: this.realtimeEnabled,\n hasEventSource: Boolean(this.eventSource)\n });\n\n if (document.visibilityState === 'hidden') {\n this.stopRealtime({ preserveEnabled: true });\n return;\n }\n\n if (this.realtimeEnabled && this.sdkKey && !this.eventSource) {\n this.connectSse(0);\n }\n };\n\n private attachVisibilityHandler(): void {\n if (!this.realtimeDisconnectWhenHidden || this.visibilityListenerAttached || typeof document === 'undefined') return;\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n this.visibilityListenerAttached = true;\n }\n\n private detachVisibilityHandler(): void {\n if (!this.visibilityListenerAttached || typeof document === 'undefined') return;\n document.removeEventListener('visibilitychange', this.handleVisibilityChange);\n this.visibilityListenerAttached = false;\n }\n\n private getCacheKey(flagKey: string): string {\n return `${this.envKey}:${flagKey}`;\n }\n\n private normalizeUser(input: FeatureFlareUserPayload): FeatureFlareUser {\n const key = (input.id ?? input.key ?? '').trim();\n if (!key) throw new Error('FeatureFlareClient requires user.id (or legacy user.key).');\n return {\n key,\n email: input.email,\n name: input.name,\n country: input.country,\n custom: input.meta ?? input.custom,\n session: input.session,\n metrics: input.metrics\n };\n }\n\n private resolveRealtimeUserPayload(): FeatureFlareUserPayload | null {\n const candidate = this.getRealtimeUser?.();\n if (candidate) {\n try {\n const normalizedUser = this.normalizeUser(candidate);\n this.lastUser = normalizedUser;\n return candidate;\n } catch {\n // Ignore invalid callback payloads and fall back to the last known valid user.\n }\n }\n\n if (!this.lastUser) {\n return null;\n }\n\n return {\n id: this.lastUser.key,\n email: this.lastUser.email,\n name: this.lastUser.name,\n country: this.lastUser.country,\n meta: this.lastUser.custom,\n session: this.lastUser.session,\n metrics: this.lastUser.metrics\n };\n }\n\n private resolveRealtimeUser(): FeatureFlareUser | null {\n const candidate = this.resolveRealtimeUserPayload();\n if (candidate) {\n try {\n const normalizedUser = this.normalizeUser(candidate);\n this.lastUser = normalizedUser;\n return normalizedUser;\n } catch {\n // Ignore invalid callback payloads and fall back to the last known valid user.\n }\n }\n\n return this.lastUser;\n }\n\n private getRealtimeStreamHashes(): { userContextHash?: string; userPayloadHash?: string } {\n const realtimeUserPayload = this.resolveRealtimeUserPayload();\n if (!realtimeUserPayload) {\n return {};\n }\n\n const hashedContext = buildHashedRealtimeUserContext(realtimeUserPayload);\n return {\n userContextHash: encodeBase64Url(JSON.stringify(hashedContext)),\n userPayloadHash: hashedContext.payloadHash\n };\n }\n\n private async fetchStreamToken(): Promise<string | null> {\n if (!this.sdkKey || typeof fetch !== 'function') {\n return null;\n }\n\n const { userContextHash, userPayloadHash } = this.getRealtimeStreamHashes();\n\n try {\n const response = await fetch(`${this.apiBaseUrl}/api/v1/sdk/stream-token`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n expectedEnvKey: this.expectedEnvKey ?? undefined,\n userContextHash,\n userPayloadHash\n })\n });\n\n if (!response.ok) {\n return null;\n }\n\n const payload = (await response.json()) as StreamTokenResponse;\n return typeof payload.key === 'string' && payload.key.trim() ? payload.key : null;\n } catch {\n return null;\n }\n }\n\n private emit<K extends keyof FeatureFlareClientEvents>(event: K, payload: FeatureFlareClientEvents[K]): void {\n for (const listener of this.listeners[event]) {\n listener(payload);\n }\n }\n\n private emitConnectionState(state: FeatureFlareConnectionState): void {\n this.connectionState = state;\n this.emit('connectionState', state);\n }\n\n on<K extends keyof FeatureFlareClientEvents>(\n event: K,\n listener: (payload: FeatureFlareClientEvents[K]) => void\n ): () => void {\n this.listeners[event].add(listener);\n if (event === 'connectionState') {\n (listener as (payload: FeatureFlareConnectionState) => void)(this.connectionState);\n }\n return () => {\n this.listeners[event].delete(listener);\n };\n }\n\n isRealtimeEnabled(): boolean {\n return this.realtimeEnabled && Boolean(this.sdkKey);\n }\n\n private emitMetric(metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags): void {\n this.onMetric?.(metricName, value, tags);\n }\n\n private async ensurePersistentLoaded(): Promise<void> {\n if (!this.persistentLoadPromise) return;\n await this.persistentLoadPromise;\n }\n\n private async loadPersistentCache(): Promise<void> {\n if (!this.persistentCache) return;\n try {\n const snapshot = await this.persistentCache.load(this.envKey);\n if (!snapshot) return;\n this.revision = Math.max(this.revision, snapshot.revision ?? 0);\n for (const killSwitchKey of snapshot.killSwitches ?? []) {\n this.killSwitches.add(killSwitchKey);\n }\n\n for (const [flagKey, item] of Object.entries(snapshot.flags ?? {})) {\n const existing = this.cache.get(this.getCacheKey(flagKey));\n if (existing && existing.source === 'bootstrap') continue;\n this.cache.set(this.getCacheKey(flagKey), {\n envKey: this.envKey,\n flagKey,\n value: Boolean(item.value),\n updatedAt: Number(item.updatedAt) || Date.now(),\n staleAt: Number(item.staleAt) || Date.now(),\n expiresAt: Number(item.expiresAt) || Date.now(),\n source: item.source ?? 'persistent',\n revision: item.revision ?? 0\n });\n }\n } catch {\n // Ignore persistent cache failures; runtime must stay non-throwing for outage semantics.\n }\n }\n\n private async persistCache(): Promise<void> {\n if (!this.persistentCache) return;\n const snapshot: FeatureFlarePersistentSnapshot = {\n revision: this.revision,\n killSwitches: [...this.killSwitches],\n flags: {}\n };\n\n for (const [key, item] of this.cache.entries()) {\n if (!key.startsWith(`${this.envKey}:`)) continue;\n snapshot.flags[item.flagKey] = {\n value: item.value,\n updatedAt: item.updatedAt,\n staleAt: item.staleAt,\n expiresAt: item.expiresAt,\n source: item.source,\n revision: item.revision\n };\n }\n\n try {\n await this.persistentCache.save(this.envKey, snapshot);\n } catch {\n // Persistent errors must not break evaluation.\n }\n }\n\n private makeCacheWindow(at = Date.now()): Pick<CacheItem, 'updatedAt' | 'staleAt' | 'expiresAt'> {\n return {\n updatedAt: at,\n staleAt: at + this.staleTtlMs,\n expiresAt: at + this.cacheTtlMs\n };\n }\n\n private setCacheItem(\n flagKey: string,\n value: boolean,\n source: FeatureFlareCacheSource,\n revision = this.revision,\n at = Date.now()\n ): void {\n this.cache.set(this.getCacheKey(flagKey), {\n envKey: this.envKey,\n flagKey,\n value,\n source,\n revision,\n ...this.makeCacheWindow(at)\n });\n }\n\n private applyBootstrap(bootstrap?: FeatureFlareBootstrapPayload): void {\n if (!bootstrap) return;\n this.revision = Math.max(this.revision, bootstrap.revision ?? 0);\n for (const killSwitchKey of bootstrap.killSwitches ?? []) {\n this.killSwitches.add(killSwitchKey);\n }\n\n const apply = (flagKey: string, value: boolean, revision?: number, updatedAt?: number) => {\n this.setCacheItem(flagKey, value, 'bootstrap', revision ?? this.revision, updatedAt ?? Date.now());\n };\n\n if (Array.isArray(bootstrap.flags)) {\n for (const item of bootstrap.flags) {\n if (!item || typeof item.key !== 'string') continue;\n apply(item.key, Boolean(item.value), item.revision, item.updatedAt);\n }\n return;\n }\n\n for (const [flagKey, value] of Object.entries(bootstrap.flags ?? {})) {\n apply(flagKey, Boolean(value));\n }\n }\n\n private getCacheState(item: CacheItem | undefined, now = Date.now()): 'fresh' | 'stale' | 'expired' | 'missing' {\n if (!item) return 'missing';\n if (now <= item.staleAt) return 'fresh';\n if (now <= item.expiresAt) return 'stale';\n return 'expired';\n }\n\n private setCircuitState(isOpen: boolean, reason = ''): void {\n if (this.circuitOpen === isOpen) return;\n this.circuitOpen = isOpen;\n if (isOpen) {\n this.emit('circuitOpen', { envKey: this.envKey, reason });\n return;\n }\n this.emit('circuitClose', { envKey: this.envKey });\n }\n\n private async fetchWithRetry(url: string, init: RequestInit, transport: 'network' | 'polling') {\n let lastError: unknown = null;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n const ac = typeof AbortController !== 'undefined' ? new AbortController() : null;\n const timeout =\n ac !== null\n ? setTimeout(() => {\n ac.abort();\n }, this.timeoutMs)\n : null;\n\n try {\n const response = await fetch(url, {\n ...init,\n signal: ac?.signal\n });\n\n if (timeout) clearTimeout(timeout);\n\n if (!response.ok && isRetriableStatus(response.status) && attempt < this.maxRetries) {\n lastError = new Error(`HTTP ${response.status}`);\n const jitterOffset = this.backoffMs * this.jitter * Math.random();\n await sleep(this.backoffMs * (attempt + 1) + jitterOffset);\n continue;\n }\n\n return response;\n } catch (error) {\n if (timeout) clearTimeout(timeout);\n lastError = error;\n if (attempt >= this.maxRetries) break;\n const jitterOffset = this.backoffMs * this.jitter * Math.random();\n await sleep(this.backoffMs * (attempt + 1) + jitterOffset);\n }\n }\n\n this.setCircuitState(true, transport);\n throw lastError;\n }\n\n private collectCachedFlags(): Array<{ key: string; value: boolean }> {\n const now = Date.now();\n const flags: Array<{ key: string; value: boolean }> = [];\n\n for (const [cacheKey, item] of this.cache.entries()) {\n if (!cacheKey.startsWith(`${this.envKey}:`)) continue;\n if (this.killSwitches.has(item.flagKey)) {\n flags.push({ key: item.flagKey, value: false });\n continue;\n }\n\n const state = this.getCacheState(item, now);\n if (state === 'missing' || state === 'expired') continue;\n flags.push({ key: item.flagKey, value: item.value });\n }\n\n return flags.sort((a, b) => a.key.localeCompare(b.key));\n }\n\n getCachedFlags(): {\n flags: Array<{ key: string; value: boolean }>;\n hasData: boolean;\n } {\n const flags = this.collectCachedFlags();\n return { flags, hasData: flags.length > 0 };\n }\n\n getFlagDiagnostics(flagKey: string): FeatureFlareEvaluationMetadata | null {\n return this.diagnostics.get(this.getCacheKey(flagKey)) ?? null;\n }\n\n setKillSwitch(flagKey: string, enabled: boolean): void {\n const started = monotonicNow();\n if (enabled) {\n this.killSwitches.add(flagKey);\n } else {\n this.killSwitches.delete(flagKey);\n }\n const elapsed = monotonicNow() - started;\n this.emitMetric('ff_killswitch_apply_latency_ms', elapsed, {\n env: this.envKey,\n result: enabled ? 'enabled' : 'disabled'\n });\n this.emit('update', { changedKeys: [flagKey], source: 'realtime' });\n void this.persistCache();\n }\n\n private async fetchEvalFromNetwork(\n flagKey: string,\n normalizedUser: FeatureFlareUser,\n defaultValue: boolean\n ): Promise<boolean | null> {\n const response = this.sdkKey\n ? await this.fetchWithRetry(\n `${this.apiBaseUrl}/api/v1/sdk/eval`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n flagKey,\n user: normalizedUser,\n defaultValue,\n expectedEnvKey: this.expectedEnvKey ?? undefined\n })\n },\n 'network'\n )\n : await this.fetchWithRetry(\n `${this.apiBaseUrl}/api/v1/eval`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n projectKey: this.projectKey,\n envKey: this.envKey,\n flagKey,\n user: normalizedUser,\n defaultValue\n })\n },\n 'network'\n );\n\n if (!response.ok) {\n if (!isRetriableStatus(response.status)) {\n this.setCircuitState(true, `http_${response.status}`);\n }\n return null;\n }\n\n const json = (await response.json()) as { value?: boolean; revision?: number; killSwitch?: boolean };\n const value = typeof json.value === 'boolean' ? json.value : defaultValue;\n\n if (json.killSwitch === true) {\n this.killSwitches.add(flagKey);\n }\n\n const revision = json.revision ?? this.revision;\n this.revision = Math.max(this.revision, revision);\n this.setCacheItem(flagKey, value, 'network', revision);\n this.setCircuitState(false);\n void this.persistCache();\n this.emit('update', { changedKeys: [flagKey], source: 'network' });\n return value;\n }\n\n private async fetchFlagsFromNetwork(\n normalizedUser: FeatureFlareUser,\n defaultValue: boolean,\n transport: 'network' | 'polling',\n opts?: { fromSnapshotInvalidate?: boolean }\n ): Promise<Array<{ key: string; value: boolean }> | null> {\n if (!this.sdkKey) {\n return null;\n }\n\n const started = monotonicNow();\n\n debugLog('Fetching flags', {\n transport,\n fromSnapshotInvalidate: Boolean(opts?.fromSnapshotInvalidate),\n userKey: normalizedUser.key,\n defaultValue\n });\n\n try {\n const response = await this.fetchWithRetry(\n `${this.apiBaseUrl}/api/v1/sdk/flags`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n user: normalizedUser,\n defaultValue,\n expectedEnvKey: this.expectedEnvKey ?? undefined\n })\n },\n transport\n );\n\n if (!response.ok) {\n if (!isRetriableStatus(response.status)) {\n this.setCircuitState(true, `http_${response.status}`);\n }\n return null;\n }\n\n const json = (await response.json()) as {\n flags?: Array<{ key: string; value: boolean }>;\n values?: Record<string, boolean>;\n revision?: number;\n killSwitches?: string[];\n };\n\n const list = normalizeBoolMap(json);\n const revision = json.revision ?? this.revision;\n this.revision = Math.max(this.revision, revision);\n\n if (Array.isArray(json.killSwitches)) {\n for (const key of json.killSwitches) {\n this.killSwitches.add(key);\n }\n }\n\n const changed = new Set<string>();\n for (const entry of list) {\n const existing = this.cache.get(this.getCacheKey(entry.key));\n if (!existing || existing.value !== entry.value || existing.revision !== revision) {\n changed.add(entry.key);\n }\n this.setCacheItem(entry.key, entry.value, 'network', revision);\n }\n\n if (opts?.fromSnapshotInvalidate && list !== null) {\n this.emit('update', {\n changedKeys: list.map((e) => e.key),\n source: 'realtime',\n snapshotInvalidate: true\n });\n } else if (changed.size > 0) {\n this.emit('update', { changedKeys: [...changed], source: 'network' });\n }\n\n this.setCircuitState(false);\n void this.persistCache();\n this.emitMetric('ff_revalidate_latency_ms', monotonicNow() - started, {\n env: this.envKey,\n transport\n });\n debugLog('Fetched flags', {\n transport,\n fromSnapshotInvalidate: Boolean(opts?.fromSnapshotInvalidate),\n flagsCount: list.length,\n revision\n });\n return list;\n } catch {\n this.emitMetric('ff_revalidate_latency_ms', monotonicNow() - started, {\n env: this.envKey,\n transport,\n result: 'error'\n });\n debugLog('Fetch flags failed', {\n transport,\n fromSnapshotInvalidate: Boolean(opts?.fromSnapshotInvalidate)\n });\n return null;\n }\n }\n\n private revalidate(\n normalizedUser: FeatureFlareUser,\n defaultValue: boolean,\n opts?: { fromSnapshotInvalidate?: boolean }\n ): Promise<Array<{ key: string; value: boolean }> | null> {\n const existing = this.inFlightRevalidate.get(this.envKey);\n if (existing) {\n if (opts?.fromSnapshotInvalidate) {\n void existing.then((list) => {\n if (list !== null) {\n this.emit('update', {\n changedKeys: list.map((e) => e.key),\n source: 'realtime',\n snapshotInvalidate: true\n });\n }\n });\n }\n return existing;\n }\n\n const promise = this.fetchFlagsFromNetwork(normalizedUser, defaultValue, 'network', opts).finally(() => {\n this.inFlightRevalidate.delete(this.envKey);\n });\n\n this.inFlightRevalidate.set(this.envKey, promise);\n return promise;\n }\n\n async evaluate(\n flagKey: string,\n user: FeatureFlareUserPayload,\n defaultValue = false\n ): Promise<FeatureFlareEvaluationResult> {\n const started = monotonicNow();\n await this.ensurePersistentLoaded();\n\n const normalizedUser = this.normalizeUser(user);\n this.lastUser = normalizedUser;\n this.lastDefaultValue = defaultValue;\n\n if (this.killSwitches.has(flagKey)) {\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'kill_switch',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: 'kill_switch'\n };\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'disabled'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: false, metadata };\n }\n\n const cacheItem = this.cache.get(this.getCacheKey(flagKey));\n const cacheState = this.getCacheState(cacheItem);\n\n if (cacheItem && cacheState === 'fresh') {\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: cacheItem.source === 'bootstrap' || cacheItem.source === 'persistent' ? 'bootstrap' : 'fresh_cache',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: cacheItem.source,\n updatedAt: cacheItem.updatedAt,\n staleAt: cacheItem.staleAt,\n expiresAt: cacheItem.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 1, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'cache_hit'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: cacheItem.value, metadata };\n }\n\n if (cacheItem && cacheState === 'stale') {\n void this.revalidate(normalizedUser, defaultValue);\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'stale_cache',\n isStale: true,\n latencyMs: monotonicNow() - started,\n source: cacheItem.source,\n updatedAt: cacheItem.updatedAt,\n staleAt: cacheItem.staleAt,\n expiresAt: cacheItem.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 1, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'stale'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: cacheItem.value, metadata };\n }\n\n if (cacheItem && (cacheItem.source === 'bootstrap' || cacheItem.source === 'persistent')) {\n void this.revalidate(normalizedUser, defaultValue);\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'bootstrap',\n isStale: true,\n latencyMs: monotonicNow() - started,\n source: cacheItem.source,\n updatedAt: cacheItem.updatedAt,\n staleAt: cacheItem.staleAt,\n expiresAt: cacheItem.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 1, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'bootstrap'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: cacheItem.value, metadata };\n }\n\n try {\n const networkValue = await this.fetchEvalFromNetwork(flagKey, normalizedUser, defaultValue);\n if (networkValue !== null) {\n const item = this.cache.get(this.getCacheKey(flagKey));\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'network',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: 'network',\n updatedAt: item?.updatedAt,\n staleAt: item?.staleAt,\n expiresAt: item?.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 0, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'network'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: networkValue, metadata };\n }\n } catch {\n // Fall through to deterministic default for outage semantics.\n }\n\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'default',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: 'default'\n };\n this.emitMetric('ff_cache_hit_ratio', 0, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'default'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: defaultValue, metadata };\n }\n\n async bool(flagKey: string, user: FeatureFlareUserPayload, defaultValue = false): Promise<boolean> {\n const result = await this.evaluate(flagKey, user, defaultValue);\n return result.value;\n }\n\n async flags(user: FeatureFlareUserPayload, defaultValue = false): Promise<Array<{ key: string; value: boolean }>> {\n await this.ensurePersistentLoaded();\n const normalizedUser = this.normalizeUser(user);\n this.lastUser = normalizedUser;\n this.lastDefaultValue = defaultValue;\n\n const cached = this.collectCachedFlags();\n if (cached.length > 0) {\n void this.revalidate(normalizedUser, defaultValue);\n return cached;\n }\n\n const list = await this.revalidate(normalizedUser, defaultValue);\n if (list && list.length > 0) {\n return list.map((entry) => ({\n key: entry.key,\n value: this.killSwitches.has(entry.key) ? false : entry.value\n }));\n }\n\n return [];\n }\n\n private applyRealtimeMessage(message: RealtimeEventPayload): void {\n if (typeof message.revision === 'number' && message.revision < this.revision) {\n return;\n }\n\n if (typeof message.revision === 'number') {\n this.revision = message.revision;\n }\n\n const changed = new Set<string>();\n const now = Date.now();\n\n if (message.type === 'flag.updated') {\n const flagKey = typeof message.data?.flagKey === 'string' ? message.data.flagKey : null;\n const value = typeof message.data?.value === 'boolean' ? message.data.value : null;\n if (flagKey !== null && value !== null) {\n this.setCacheItem(flagKey, value, 'realtime', message.revision ?? this.revision, now);\n changed.add(flagKey);\n }\n }\n\n if (message.type === 'flag.deleted') {\n const flagKey = typeof message.data?.flagKey === 'string' ? message.data.flagKey : null;\n if (flagKey !== null) {\n this.cache.delete(this.getCacheKey(flagKey));\n changed.add(flagKey);\n }\n }\n\n if (message.type === 'env.kill_switch.updated') {\n const started = monotonicNow();\n const flagKey = typeof message.data?.flagKey === 'string' ? message.data.flagKey : null;\n const enabled = typeof message.data?.enabled === 'boolean' ? message.data.enabled : true;\n if (flagKey !== null) {\n if (enabled) {\n this.killSwitches.add(flagKey);\n } else {\n this.killSwitches.delete(flagKey);\n }\n changed.add(flagKey);\n this.emitMetric('ff_killswitch_apply_latency_ms', monotonicNow() - started, {\n env: this.envKey,\n transport: this.eventSource ? 'sse' : 'polling',\n result: enabled ? 'enabled' : 'disabled'\n });\n }\n }\n\n const eventLagMs = Math.max(0, Date.now() - (message.timestamp ?? Date.now()));\n this.emitMetric('ff_realtime_lag_ms', eventLagMs, {\n env: this.envKey,\n transport: this.eventSource ? 'sse' : 'polling'\n });\n\n if (changed.size > 0) {\n this.emit('update', { changedKeys: [...changed], source: 'realtime' });\n void this.persistCache();\n }\n }\n\n private startPolling(immediate = false): void {\n if (!this.realtimePollingEnabled) {\n debugLog('Polling disabled', {\n immediate,\n reason: 'realtimePollingEnabled=false'\n });\n return;\n }\n\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n\n const tick = async () => {\n // If SSE is active, polling must remain disabled.\n if (this.eventSource) {\n debugLog('Polling tick skipped', {\n reason: 'eventSource-active'\n });\n this.pollTimer = null;\n return;\n }\n\n const realtimeUser = this.resolveRealtimeUser();\n if (!realtimeUser) {\n debugLog('Polling tick deferred', {\n reason: 'missing-realtime-user',\n nextInMs: this.realtimePollingMs\n });\n if (!this.eventSource) {\n this.pollTimer = setTimeout(tick, this.realtimePollingMs);\n }\n return;\n }\n\n debugLog('Polling tick started', {\n intervalMs: this.realtimePollingMs,\n userKey: realtimeUser.key\n });\n\n await this.fetchFlagsFromNetwork(realtimeUser, this.lastDefaultValue, 'polling');\n\n // Avoid resurrecting the polling timer if SSE connected while polling request was in-flight.\n if (!this.eventSource) {\n this.pollTimer = setTimeout(tick, this.realtimePollingMs);\n } else {\n this.pollTimer = null;\n }\n };\n\n if (immediate) {\n debugLog('Polling started immediately', {\n intervalMs: this.realtimePollingMs\n });\n void tick();\n return;\n }\n\n debugLog('Polling scheduled', {\n intervalMs: this.realtimePollingMs\n });\n this.pollTimer = setTimeout(tick, this.realtimePollingMs);\n }\n\n private connectSse(attempt = 0): void {\n void this.connectSseInternal(attempt);\n }\n\n private async connectSseInternal(attempt = 0): Promise<void> {\n const EventSourceImpl = typeof EventSource !== 'undefined' ? EventSource : null;\n if (!EventSourceImpl || !this.sdkKey) {\n debugLog('SSE unavailable, falling back', {\n hasEventSourceImpl: Boolean(EventSourceImpl),\n hasSdkKey: Boolean(this.sdkKey),\n pollingEnabled: this.realtimePollingEnabled\n });\n this.emitConnectionState({ state: this.realtimePollingEnabled ? 'degraded' : 'offline', transport: this.realtimePollingEnabled ? 'polling' : 'none' });\n if (this.realtimePollingEnabled) {\n this.startPolling(true);\n }\n return;\n }\n\n const connectionVersion = ++this.streamConnectVersion;\n const streamToken = await this.fetchStreamToken();\n if (connectionVersion !== this.streamConnectVersion) {\n return;\n }\n\n const url = new URL(this.realtimeSsePath, this.apiBaseUrl);\n if (streamToken) {\n url.searchParams.set('key', streamToken);\n } else {\n url.searchParams.set('sdkKey', this.sdkKey);\n if (this.expectedEnvKey) {\n url.searchParams.set('envKey', this.expectedEnvKey);\n }\n const { userContextHash, userPayloadHash } = this.getRealtimeStreamHashes();\n if (userContextHash) {\n url.searchParams.set('userContextHash', userContextHash);\n }\n if (userPayloadHash) {\n url.searchParams.set('userPayloadHash', userPayloadHash);\n }\n }\n\n debugLog('Connecting SSE', {\n attempt,\n url: url.toString(),\n pollingEnabled: this.realtimePollingEnabled,\n authMode: streamToken ? 'stream-token' : 'sdk-key'\n });\n\n this.eventSource = new EventSourceImpl(url.toString());\n\n this.eventSource.onopen = () => {\n debugLog('SSE connected', {\n attempt,\n url: url.toString()\n });\n this.emitConnectionState({ state: 'connected', transport: 'sse' });\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n };\n\n this.eventSource.onmessage = (event: MessageEvent) => {\n if (this.connectionState.state !== 'connected' || this.connectionState.transport !== 'sse') {\n debugLog('Promoting connection state to connected from SSE message', {\n previousState: this.connectionState.state,\n previousTransport: this.connectionState.transport\n });\n this.emitConnectionState({ state: 'connected', transport: 'sse' });\n }\n\n console.log('SSE message received', {\n raw: String(event.data)\n });\n try {\n const payload = JSON.parse(String(event.data)) as RealtimeEventPayload;\n if (payload.type === 'snapshot.invalidate') {\n const realtimeUser = this.resolveRealtimeUser();\n console.log('Snapshot invalidate message received', {\n payload\n }, realtimeUser);\n if (realtimeUser) {\n console.log('Refetching flags from snapshot invalidate', {\n userKey: realtimeUser.key,\n defaultValue: this.lastDefaultValue\n });\n void this.revalidate(realtimeUser, this.lastDefaultValue, { fromSnapshotInvalidate: true });\n } else {\n debugLog('Snapshot invalidate ignored because no user has been evaluated yet');\n }\n }\n this.applyRealtimeMessage(payload);\n } catch {\n // Ignore malformed realtime messages.\n }\n };\n\n this.eventSource.onerror = () => {\n debugLog('SSE errored', {\n attempt,\n pollingEnabled: this.realtimePollingEnabled,\n reconnectInMs: Math.min(this.backoffMs * (attempt + 1), 30000)\n });\n this.emitConnectionState({\n state: this.realtimePollingEnabled ? 'degraded' : 'offline',\n transport: this.realtimePollingEnabled ? 'polling' : 'none'\n });\n this.eventSource?.close();\n this.eventSource = null;\n if (this.realtimePollingEnabled) {\n this.startPolling(true);\n }\n\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n }\n const backoff = Math.min(this.backoffMs * (attempt + 1), 30000);\n this.reconnectTimer = setTimeout(() => {\n this.connectSse(attempt + 1);\n }, backoff);\n };\n }\n\n startRealtime(): void {\n this.realtimeEnabled = true;\n\n debugLog('Realtime start requested', {\n disconnectWhenHidden: this.realtimeDisconnectWhenHidden,\n visibilityState: typeof document !== 'undefined' ? document.visibilityState : 'unknown',\n pollingEnabled: this.realtimePollingEnabled\n });\n\n this.attachVisibilityHandler();\n if (this.realtimeDisconnectWhenHidden && typeof document !== 'undefined' && document.visibilityState === 'hidden') {\n debugLog('Realtime start skipped because document is hidden');\n return;\n }\n\n this.connectSse(0);\n }\n\n stopRealtime(opts?: { preserveEnabled?: boolean }): void {\n this.streamConnectVersion += 1;\n debugLog('Realtime stop requested', {\n preserveEnabled: Boolean(opts?.preserveEnabled),\n hadEventSource: Boolean(this.eventSource),\n hadPollTimer: Boolean(this.pollTimer),\n hadReconnectTimer: Boolean(this.reconnectTimer)\n });\n\n if (!opts?.preserveEnabled) {\n this.realtimeEnabled = false;\n this.detachVisibilityHandler();\n }\n\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n }\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.emitConnectionState({ state: 'offline', transport: 'none' });\n }\n\n /**\n * Report observed error metrics (error rate, latency) for a flag back to the FeatureFlare API.\n * The API evaluates the report against active rollback policies and may trigger an automated\n * rollback if configured thresholds are breached.\n *\n * Errors from this call are silently swallowed so that reporting never disrupts the host application.\n */\n async reportError(report: FeatureFlareErrorReport): Promise<void> {\n if (!this.sdkKey) return;\n try {\n await fetch(`${this.apiBaseUrl}/api/v1/sdk/report`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n flagKey: report.flagKey,\n errorRate: report.errorRate,\n latencyMs: report.latencyMs,\n observedAt: report.observedAt ?? new Date().toISOString(),\n envKey: this.envKey,\n context: report.context\n })\n });\n } catch {\n // Reporting failures must never surface to the caller.\n }\n }\n\n dispose(): void {\n this.stopRealtime();\n this.listeners.update.clear();\n this.listeners.circuitOpen.clear();\n this.listeners.circuitClose.clear();\n this.listeners.connectionState.clear();\n }\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -10,6 +10,10 @@ type FeatureFlareUserPayload = {
10
10
  meta?: Record<string, string | number | boolean | null>;
11
11
  /** Legacy alias for meta. */
12
12
  custom?: Record<string, string | number | boolean | null>;
13
+ /** Session data to persist for later product and analytics features. */
14
+ session?: Record<string, string | number | boolean | null>;
15
+ /** Product metrics or counters associated with the current evaluator. */
16
+ metrics?: Record<string, string | number | boolean | null>;
13
17
  };
14
18
  type FeatureFlareCacheSource = 'bootstrap' | 'network' | 'realtime' | 'persistent';
15
19
  type FeatureFlareEvaluationReason = 'fresh_cache' | 'stale_cache' | 'bootstrap' | 'default' | 'network' | 'kill_switch';
@@ -71,6 +75,7 @@ type FeatureFlareClientOptions = {
71
75
  sdkKey?: string;
72
76
  projectKey?: string;
73
77
  envKey?: string;
78
+ getRealtimeUser?: () => FeatureFlareUserPayload | null | undefined;
74
79
  timeoutMs?: number;
75
80
  maxRetries?: number;
76
81
  backoffMs?: number;
@@ -84,6 +89,7 @@ type FeatureFlareClientOptions = {
84
89
  enabled?: boolean;
85
90
  pollingIntervalMs?: number;
86
91
  ssePath?: string;
92
+ disconnectWhenHidden?: boolean;
87
93
  };
88
94
  };
89
95
  type FeatureFlareClientEvents = {
@@ -119,6 +125,7 @@ declare class FeatureFlareClient {
119
125
  private readonly projectKey;
120
126
  private readonly envKey;
121
127
  private readonly expectedEnvKey;
128
+ private readonly getRealtimeUser?;
122
129
  private readonly timeoutMs;
123
130
  private readonly maxRetries;
124
131
  private readonly backoffMs;
@@ -138,16 +145,30 @@ declare class FeatureFlareClient {
138
145
  private lastUser;
139
146
  private lastDefaultValue;
140
147
  private realtimeEnabled;
148
+ private realtimePollingEnabled;
141
149
  private realtimePollingMs;
142
150
  private realtimeSsePath;
151
+ private realtimeDisconnectWhenHidden;
152
+ private visibilityListenerAttached;
153
+ private connectionState;
143
154
  private pollTimer;
144
155
  private reconnectTimer;
145
156
  private eventSource;
157
+ private streamConnectVersion;
146
158
  constructor(options?: FeatureFlareClientOptions);
159
+ private readonly handleVisibilityChange;
160
+ private attachVisibilityHandler;
161
+ private detachVisibilityHandler;
147
162
  private getCacheKey;
148
163
  private normalizeUser;
164
+ private resolveRealtimeUserPayload;
165
+ private resolveRealtimeUser;
166
+ private getRealtimeStreamHashes;
167
+ private fetchStreamToken;
149
168
  private emit;
169
+ private emitConnectionState;
150
170
  on<K extends keyof FeatureFlareClientEvents>(event: K, listener: (payload: FeatureFlareClientEvents[K]) => void): () => void;
171
+ isRealtimeEnabled(): boolean;
151
172
  private emitMetric;
152
173
  private ensurePersistentLoaded;
153
174
  private loadPersistentCache;
@@ -180,8 +201,11 @@ declare class FeatureFlareClient {
180
201
  private applyRealtimeMessage;
181
202
  private startPolling;
182
203
  private connectSse;
204
+ private connectSseInternal;
183
205
  startRealtime(): void;
184
- stopRealtime(): void;
206
+ stopRealtime(opts?: {
207
+ preserveEnabled?: boolean;
208
+ }): void;
185
209
  /**
186
210
  * Report observed error metrics (error rate, latency) for a flag back to the FeatureFlare API.
187
211
  * The API evaluates the report against active rollback policies and may trigger an automated
package/dist/index.d.ts CHANGED
@@ -10,6 +10,10 @@ type FeatureFlareUserPayload = {
10
10
  meta?: Record<string, string | number | boolean | null>;
11
11
  /** Legacy alias for meta. */
12
12
  custom?: Record<string, string | number | boolean | null>;
13
+ /** Session data to persist for later product and analytics features. */
14
+ session?: Record<string, string | number | boolean | null>;
15
+ /** Product metrics or counters associated with the current evaluator. */
16
+ metrics?: Record<string, string | number | boolean | null>;
13
17
  };
14
18
  type FeatureFlareCacheSource = 'bootstrap' | 'network' | 'realtime' | 'persistent';
15
19
  type FeatureFlareEvaluationReason = 'fresh_cache' | 'stale_cache' | 'bootstrap' | 'default' | 'network' | 'kill_switch';
@@ -71,6 +75,7 @@ type FeatureFlareClientOptions = {
71
75
  sdkKey?: string;
72
76
  projectKey?: string;
73
77
  envKey?: string;
78
+ getRealtimeUser?: () => FeatureFlareUserPayload | null | undefined;
74
79
  timeoutMs?: number;
75
80
  maxRetries?: number;
76
81
  backoffMs?: number;
@@ -84,6 +89,7 @@ type FeatureFlareClientOptions = {
84
89
  enabled?: boolean;
85
90
  pollingIntervalMs?: number;
86
91
  ssePath?: string;
92
+ disconnectWhenHidden?: boolean;
87
93
  };
88
94
  };
89
95
  type FeatureFlareClientEvents = {
@@ -119,6 +125,7 @@ declare class FeatureFlareClient {
119
125
  private readonly projectKey;
120
126
  private readonly envKey;
121
127
  private readonly expectedEnvKey;
128
+ private readonly getRealtimeUser?;
122
129
  private readonly timeoutMs;
123
130
  private readonly maxRetries;
124
131
  private readonly backoffMs;
@@ -138,16 +145,30 @@ declare class FeatureFlareClient {
138
145
  private lastUser;
139
146
  private lastDefaultValue;
140
147
  private realtimeEnabled;
148
+ private realtimePollingEnabled;
141
149
  private realtimePollingMs;
142
150
  private realtimeSsePath;
151
+ private realtimeDisconnectWhenHidden;
152
+ private visibilityListenerAttached;
153
+ private connectionState;
143
154
  private pollTimer;
144
155
  private reconnectTimer;
145
156
  private eventSource;
157
+ private streamConnectVersion;
146
158
  constructor(options?: FeatureFlareClientOptions);
159
+ private readonly handleVisibilityChange;
160
+ private attachVisibilityHandler;
161
+ private detachVisibilityHandler;
147
162
  private getCacheKey;
148
163
  private normalizeUser;
164
+ private resolveRealtimeUserPayload;
165
+ private resolveRealtimeUser;
166
+ private getRealtimeStreamHashes;
167
+ private fetchStreamToken;
149
168
  private emit;
169
+ private emitConnectionState;
150
170
  on<K extends keyof FeatureFlareClientEvents>(event: K, listener: (payload: FeatureFlareClientEvents[K]) => void): () => void;
171
+ isRealtimeEnabled(): boolean;
151
172
  private emitMetric;
152
173
  private ensurePersistentLoaded;
153
174
  private loadPersistentCache;
@@ -180,8 +201,11 @@ declare class FeatureFlareClient {
180
201
  private applyRealtimeMessage;
181
202
  private startPolling;
182
203
  private connectSse;
204
+ private connectSseInternal;
183
205
  startRealtime(): void;
184
- stopRealtime(): void;
206
+ stopRealtime(opts?: {
207
+ preserveEnabled?: boolean;
208
+ }): void;
185
209
  /**
186
210
  * Report observed error metrics (error rate, latency) for a flag back to the FeatureFlare API.
187
211
  * The API evaluates the report against active rollback policies and may trigger an automated