@featureflare/sdk-js 0.0.138 → 0.0.140
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.
- package/dist/index.cjs +6 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/index.cjs
CHANGED
|
@@ -1013,18 +1013,19 @@ var FeatureFlareClient = class {
|
|
|
1013
1013
|
});
|
|
1014
1014
|
this.emitConnectionState({ state: "connected", transport: "sse" });
|
|
1015
1015
|
}
|
|
1016
|
-
|
|
1016
|
+
debugLog("SSE message received", {
|
|
1017
1017
|
raw: String(event.data)
|
|
1018
1018
|
});
|
|
1019
1019
|
try {
|
|
1020
1020
|
const payload = JSON.parse(String(event.data));
|
|
1021
1021
|
if (payload.type === "snapshot.invalidate") {
|
|
1022
1022
|
const realtimeUser = this.resolveRealtimeUser();
|
|
1023
|
-
|
|
1024
|
-
payload
|
|
1025
|
-
|
|
1023
|
+
debugLog("Snapshot invalidate message received", {
|
|
1024
|
+
payload,
|
|
1025
|
+
realtimeUser
|
|
1026
|
+
});
|
|
1026
1027
|
if (realtimeUser) {
|
|
1027
|
-
|
|
1028
|
+
debugLog("Refetching flags from snapshot invalidate", {
|
|
1028
1029
|
userKey: realtimeUser.key,
|
|
1029
1030
|
defaultValue: this.lastDefaultValue
|
|
1030
1031
|
});
|
package/dist/index.cjs.map
CHANGED
|
@@ -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 /** 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 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"]}
|
|
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 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 debugLog('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 debugLog('Snapshot invalidate message received', {\n payload,\n realtimeUser\n });\n if (realtimeUser) {\n debugLog('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.js
CHANGED
|
@@ -1011,18 +1011,19 @@ var FeatureFlareClient = class {
|
|
|
1011
1011
|
});
|
|
1012
1012
|
this.emitConnectionState({ state: "connected", transport: "sse" });
|
|
1013
1013
|
}
|
|
1014
|
-
|
|
1014
|
+
debugLog("SSE message received", {
|
|
1015
1015
|
raw: String(event.data)
|
|
1016
1016
|
});
|
|
1017
1017
|
try {
|
|
1018
1018
|
const payload = JSON.parse(String(event.data));
|
|
1019
1019
|
if (payload.type === "snapshot.invalidate") {
|
|
1020
1020
|
const realtimeUser = this.resolveRealtimeUser();
|
|
1021
|
-
|
|
1022
|
-
payload
|
|
1023
|
-
|
|
1021
|
+
debugLog("Snapshot invalidate message received", {
|
|
1022
|
+
payload,
|
|
1023
|
+
realtimeUser
|
|
1024
|
+
});
|
|
1024
1025
|
if (realtimeUser) {
|
|
1025
|
-
|
|
1026
|
+
debugLog("Refetching flags from snapshot invalidate", {
|
|
1026
1027
|
userKey: realtimeUser.key,
|
|
1027
1028
|
defaultValue: this.lastDefaultValue
|
|
1028
1029
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["metadata"],"mappings":";AA4BA,IAAM,iCAAA,GACJ,8BAAA;AACF,IAAM,oBAAA,GAAuB,KAAK,EAAA,GAAK,GAAA;AACvC,IAAM,oBAAA,GAAuB,KAAK,EAAA,GAAK,GAAA;AAEvC,SAAS,oBAAA,GAAsC;AAC7C,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAK;AACjD,IAAA,OACE,OAAA,CAAQ,IAAI,yBAAA,EAA2B,IAAA,MACvC,OAAA,CAAQ,GAAA,CAAI,mBAAA,EAAqB,IAAA,EAAK,IACtC,IAAA;AAAA,EAEJ;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,cAAc,QAAA,EAA2B;AAChD,EAAA,MAAM,WAAA,GAAc,UAAU,IAAA,EAAK;AACnC,EAAA,IAAI,aAAa,OAAO,WAAA;AAExB,EAAA,MAAM,UAAU,oBAAA,EAAqB;AACrC,EAAA,IAAI,SAAS,OAAO,OAAA;AAEpB,EAAA,OAAO,iCAAA;AACT;AAkIA,SAAS,gBAAA,GAAkC;AACzC,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAK;AACjD,IAAA,OACE,OAAA,CAAQ,IAAI,oBAAA,EAAsB,IAAA,MAClC,OAAA,CAAQ,GAAA,CAAI,cAAA,EAAgB,IAAA,EAAK,IACjC,IAAA;AAAA,EAEJ;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,mBAAmB,KAAA,EAAyB;AACnD,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,MAAM,GAAA,CAAI,CAAC,KAAA,KAAU,kBAAA,CAAmB,KAAK,CAAC,CAAA;AAAA,EACvD;AAEA,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,CAC5D,OAAO,CAAC,GAAG,UAAU,CAAA,KAAM,UAAA,KAAe,MAAS,CAAA,CACnD,IAAA,CAAK,CAAC,CAAC,OAAO,CAAA,EAAG,CAAC,QAAQ,CAAA,KAAM,OAAA,CAAQ,aAAA,CAAc,QAAQ,CAAC,CAAA;AAElE,IAAA,OAAO,MAAA,CAAO,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,UAAU,CAAA,KAAM,CAAC,GAAA,EAAK,kBAAA,CAAmB,UAAU,CAAC,CAAC,CAAC,CAAA;AAAA,EACrG;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAAwB;AAC7C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,kBAAA,CAAmB,KAAK,CAAC,CAAA;AAEtD,EAAA,IAAI,OAAA,GAAU,UAAA;AACd,EAAA,IAAI,QAAA,GAAW,UAAA;AACf,EAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,KAAA,CAAM,MAAA,EAAQ,SAAS,CAAA,EAAG;AACpD,IAAA,OAAA,IAAW,KAAA,CAAM,WAAW,KAAK,CAAA;AACjC,IAAA,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,QAAU,CAAA;AAEvC,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA;AACxC,IAAA,QAAA,IAAY,KAAA,CAAM,WAAW,YAAY,CAAA;AACzC,IAAA,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,QAAU,CAAA;AAAA,EAC3C;AAEA,EAAA,OAAO,IAAI,OAAA,KAAY,CAAA,EAAG,SAAS,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAA,CAAI,QAAA,KAAa,GAAG,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAC1G;AAEA,SAAS,gBAAgB,KAAA,EAAuB;AAC9C,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO,OAAO,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA,CAAE,SAAS,WAAW,CAAA;AAAA,EACxD;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAO,WAAA,KAAgB,WAAA,GAAc,IAAI,aAAY,CAAE,MAAA,CAAO,KAAK,CAAA,GAAI,EAAC;AACtF,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAA,IAAU,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA,EACpC;AAEA,EAAA,MAAM,SAAS,OAAO,IAAA,KAAS,UAAA,GAAa,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA;AAC3D,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAC1E;AASA,SAAS,+BAA+B,KAAA,EAA2D;AACjG,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,EAAA,EAAI,KAAA,CAAM,EAAA,IAAM,KAAA,CAAM;AAAA,GACxB;AAEA,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,cAAc,OAAO,CAAA;AAAA,IAClC,MAAA,EAAQ;AAAA,MACN,GAAK,KAAA,CAAM,EAAA,IAAM,KAAA,CAAM,MAAO,EAAE,EAAA,EAAI,aAAA,CAAc,KAAA,CAAM,EAAA,IAAM,KAAA,CAAM,GAAG,CAAA,KAAM;AAAC,KAChF;AAAA,IACA,aAAa,EAAC;AAAA,IACd,eAAe;AAAC,GAClB;AACF;AAEA,SAAS,gBAAA,GAAkC;AACzC,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAK;AACjD,IAAA,OACE,QAAQ,GAAA,CAAI,uBAAA,EAAyB,MAAK,IAC1C,OAAA,CAAQ,IAAI,uBAAA,EAAyB,IAAA,MACrC,OAAA,CAAQ,GAAA,CAAI,mBAAmB,IAAA,EAAK,IACpC,QAAQ,GAAA,CAAI,iBAAA,EAAmB,MAAK,IACpC,IAAA;AAAA,EAEJ;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,YAAA,GAAuB;AAC9B,EAAA,IAAI,OAAO,WAAA,KAAgB,WAAA,IAAe,OAAO,WAAA,CAAY,QAAQ,UAAA,EAAY;AAC/E,IAAA,OAAO,YAAY,GAAA,EAAI;AAAA,EACzB;AACA,EAAA,OAAO,KAAK,GAAA,EAAI;AAClB;AAEA,SAAS,0BAAA,GAAsC;AAC7C,EAAA,MAAM,QAAA,GACJ,OAAO,OAAA,KAAY,WAAA,IAAe,QAAQ,GAAA,GACtC,OAAA,CAAQ,GAAA,CAAI,8BAAA,EAAgC,MAAK,IAAK,OAAA,CAAQ,GAAA,CAAI,kBAAA,EAAoB,MAAK,GAC3F,EAAA;AAEN,EAAA,IAAI,QAAA,KAAa,GAAA,IAAO,QAAA,EAAU,WAAA,OAAkB,MAAA,EAAQ;AAC1D,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,oBAAoB,CAAA;AACrE,MAAA,OAAO,YAAA,KAAiB,GAAA,IAAO,YAAA,EAAc,WAAA,EAAY,KAAM,MAAA;AAAA,IACjE,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,QAAA,CAAS,SAAiB,OAAA,EAAyC;AAC1E,EAAA,IAAI,CAAC,4BAA2B,EAAG;AACjC,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,mBAAA,EAAsB,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA;AACtD,IAAA;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,mBAAA,EAAsB,OAAO,CAAA,CAAE,CAAA;AAC/C;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,UAAA,CAAW,SAAS,EAAE,CAAA;AAAA,EACxB,CAAC,CAAA;AACH;AAEA,SAAS,kBAAkB,MAAA,EAAyB;AAClD,EAAA,OAAO,WAAW,GAAA,IAAO,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,OAAO,MAAA,IAAU,GAAA;AACzE;AAEA,SAAS,iBACP,KAAA,EACwC;AACxC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,EAAG;AAC9B,IAAA,OAAO,MAAM,KAAA,CACV,MAAA;AAAA,MAAO,CAAC,KAAA,KACP,OAAA,CAAQ,KAAK,CAAA,IAAK,OAAO,KAAA,CAAM,GAAA,KAAQ,QAAA,IAAY,OAAO,KAAA,CAAM,KAAA,KAAU;AAAA,KAC5E,CACC,GAAA,CAAI,CAAC,KAAA,MAAW,EAAE,GAAA,EAAK,KAAA,CAAM,GAAA,EAAK,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,CAAE,CAAA;AAAA,EAC5D;AAEA,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,IAAU,EAAC;AAChC,EAAA,OAAO,OAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,MAAO,EAAE,GAAA,EAAK,KAAA,EAAO,OAAA,CAAQ,KAAK,GAAE,CAAE,CAAA;AACtF;AAEO,IAAM,2BAAN,MAA+B;AAAA,EACnB,OAAA,uBAAc,GAAA,EAAsB;AAAA,EAErD,MAAA,GAAS,CAAC,UAAA,EAAoC,KAAA,EAAe,IAAA,KAAkC;AAC7F,IAAA,MAAM,GAAA,GAAM,GAAG,UAAU,CAAA,CAAA,EAAI,KAAK,SAAA,CAAU,IAAA,IAAQ,EAAE,CAAC,CAAA,CAAA;AACvD,IAAA,MAAM,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,KAAK,EAAC;AACvC,IAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AACf,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AAAA,EAC5B,CAAA;AAAA,EAEA,IAAI,UAAA,EAA+F;AACjG,IAAA,MAAM,OAAkE,EAAC;AACzE,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,KAAK,IAAA,CAAK,OAAA,CAAQ,SAAQ,EAAG;AAClD,MAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,CAAA,EAAG,UAAU,GAAG,CAAA,EAAG;AACvC,MAAA,IAAA,CAAK,IAAA,CAAK;AAAA,QACR,IAAA,EAAM,KAAK,KAAA,CAAM,GAAA,CAAI,MAAM,UAAA,CAAW,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,QACjD,MAAA,EAAQ,CAAC,GAAG,MAAM;AAAA,OACnB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,IAAM,qBAAN,MAAyB;AAAA,EACb,UAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAEb;AAAA,IACF,MAAA,sBAAY,GAAA,EAAI;AAAA,IAChB,WAAA,sBAAiB,GAAA,EAAI;AAAA,IACrB,YAAA,sBAAkB,GAAA,EAAI;AAAA,IACtB,eAAA,sBAAqB,GAAA;AAAI,GAC3B;AAAA,EAEiB,KAAA,uBAAY,GAAA,EAAuB;AAAA,EACnC,WAAA,uBAAkB,GAAA,EAA4C;AAAA,EAC9D,YAAA,uBAAmB,GAAA,EAAY;AAAA,EAExC,QAAA,GAAW,CAAA;AAAA,EACX,WAAA,GAAc,KAAA;AAAA,EACd,qBAAA,GAA8C,IAAA;AAAA,EACrC,kBAAA,uBAAyB,GAAA,EAAoE;AAAA,EACtG,QAAA,GAAoC,IAAA;AAAA,EACpC,gBAAA,GAAmB,KAAA;AAAA,EAEnB,eAAA,GAAkB,IAAA;AAAA,EAClB,sBAAA,GAAyB,IAAA;AAAA,EACzB,iBAAA,GAAoB,IAAA;AAAA,EACpB,eAAA,GAAkB,oBAAA;AAAA,EAClB,4BAAA,GAA+B,IAAA;AAAA,EAC/B,0BAAA,GAA6B,KAAA;AAAA,EAC7B,eAAA,GAA+C,EAAE,KAAA,EAAO,SAAA,EAAW,WAAW,MAAA,EAAO;AAAA,EACrF,SAAA,GAAkD,IAAA;AAAA,EAClD,cAAA,GAAuD,IAAA;AAAA,EACvD,WAAA,GAAkC,IAAA;AAAA,EAClC,oBAAA,GAAuB,CAAA;AAAA,EAE/B,WAAA,CAAY,OAAA,GAAqC,EAAC,EAAG;AACnD,IAAA,IAAA,CAAK,aAAa,aAAA,CAAc,OAAA,CAAQ,UAAU,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AACrE,IAAA,IAAA,CAAK,MAAA,GAAS,OAAA,CAAQ,MAAA,EAAQ,IAAA,MAAU,gBAAA,EAAiB;AACzD,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,EAAY,IAAA,KAAS,OAAA,CAAQ,UAAA,CAAW,MAAK,GAAI,IAAA;AAC3E,IAAA,MAAM,mBAAmB,OAAA,CAAQ,MAAA,EAAQ,IAAA,EAAK,IAAK,kBAAiB,IAAK,IAAA;AACzE,IAAA,IAAA,CAAK,SAAS,gBAAA,IAAoB,YAAA;AAClC,IAAA,IAAA,CAAK,cAAA,GAAiB,gBAAA;AACtB,IAAA,IAAA,CAAK,kBAAkB,OAAA,CAAQ,eAAA;AAE/B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,KAAK,UAAA,EAAY;AACpC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA,IAAA,CAAM,OAAA,CAAQ,SAAA,IAAa,CAAA,IAAK,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,GAAI,GAAA;AAClH,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,UAAU,CAAA,IAAA,CAAM,OAAA,CAAQ,UAAA,IAAc,CAAA,KAAM,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,GAAI,CAAA;AACvH,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA,IAAA,CAAM,OAAA,CAAQ,SAAA,IAAa,CAAA,IAAK,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,GAAI,GAAA;AAClH,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,MAAM,CAAA,IAAA,CAAM,OAAA,CAAQ,MAAA,IAAU,CAAA,KAAM,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,GAAI,IAAA;AAEvG,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,UAAU,CAAA,IAAA,CAAM,OAAA,CAAQ,UAAA,IAAc,CAAA,IAAK,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,GAAI,oBAAA;AACtH,IAAA,MAAM,oBAAA,GACJ,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,UAAU,CAAA,IAAA,CAAM,OAAA,CAAQ,UAAA,IAAc,CAAA,IAAK,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,GAAI,oBAAA;AACtG,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,oBAAA,EAAsB,KAAK,UAAU,CAAA;AAEhE,IAAA,IAAA,CAAK,kBAAkB,OAAA,CAAQ,eAAA;AAC/B,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAExB,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAA,CAAQ,QAAA,EAAU,OAAA,IAAW,IAAA;AACpD,IAAA,MAAM,2BAAA,GAA8B,MAAA,CAAO,OAAA,CAAQ,QAAA,EAAU,qBAAqB,GAAG,CAAA;AACrF,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,2BAA2B,CAAA,IAAK,gCAAgC,CAAA,EAAG;AACrF,MAAA,IAAA,CAAK,sBAAA,GAAyB,KAAA;AAC9B,MAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,sBAAA,GAAyB,IAAA;AAC9B,MAAA,IAAA,CAAK,oBACH,MAAA,CAAO,QAAA,CAAS,2BAA2B,CAAA,IAAK,2BAAA,GAA8B,IAC1E,2BAAA,GACA,IAAA;AAAA,IACR;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAA,CAAQ,QAAA,EAAU,OAAA,IAAW,oBAAA;AACpD,IAAA,IAAA,CAAK,4BAAA,GAA+B,OAAA,CAAQ,QAAA,EAAU,oBAAA,IAAwB,IAAA;AAE9E,IAAA,IAAA,CAAK,cAAA,CAAe,QAAQ,SAAS,CAAA;AACrC,IAAA,IAAA,CAAK,qBAAA,GAAwB,KAAK,mBAAA,EAAoB;AAEtD,IAAA,IAAI,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,MAAA,EAAQ;AACvC,MAAA,IAAA,CAAK,uBAAA,EAAwB;AAC7B,MAAA,IAAI,KAAK,4BAAA,IAAgC,OAAO,aAAa,WAAA,IAAe,QAAA,CAAS,oBAAoB,QAAA,EAAU;AACjH,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,aAAA,EAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEiB,yBAAyB,MAAY;AACpD,IAAA,IAAI,CAAC,IAAA,CAAK,4BAAA,IAAgC,OAAO,aAAa,WAAA,EAAa;AAE3E,IAAA,QAAA,CAAS,oBAAA,EAAsB;AAAA,MAC7B,iBAAiB,QAAA,CAAS,eAAA;AAAA,MAC1B,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,cAAA,EAAgB,OAAA,CAAQ,IAAA,CAAK,WAAW;AAAA,KACzC,CAAA;AAED,IAAA,IAAI,QAAA,CAAS,oBAAoB,QAAA,EAAU;AACzC,MAAA,IAAA,CAAK,YAAA,CAAa,EAAE,eAAA,EAAiB,IAAA,EAAM,CAAA;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,eAAA,IAAmB,IAAA,CAAK,MAAA,IAAU,CAAC,KAAK,WAAA,EAAa;AAC5D,MAAA,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAAA,EAEQ,uBAAA,GAAgC;AACtC,IAAA,IAAI,CAAC,IAAA,CAAK,4BAAA,IAAgC,KAAK,0BAAA,IAA8B,OAAO,aAAa,WAAA,EAAa;AAC9G,IAAA,QAAA,CAAS,gBAAA,CAAiB,kBAAA,EAAoB,IAAA,CAAK,sBAAsB,CAAA;AACzE,IAAA,IAAA,CAAK,0BAAA,GAA6B,IAAA;AAAA,EACpC;AAAA,EAEQ,uBAAA,GAAgC;AACtC,IAAA,IAAI,CAAC,IAAA,CAAK,0BAAA,IAA8B,OAAO,aAAa,WAAA,EAAa;AACzE,IAAA,QAAA,CAAS,mBAAA,CAAoB,kBAAA,EAAoB,IAAA,CAAK,sBAAsB,CAAA;AAC5E,IAAA,IAAA,CAAK,0BAAA,GAA6B,KAAA;AAAA,EACpC;AAAA,EAEQ,YAAY,OAAA,EAAyB;AAC3C,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAAA,EAClC;AAAA,EAEQ,cAAc,KAAA,EAAkD;AACtE,IAAA,MAAM,OAAO,KAAA,CAAM,EAAA,IAAM,KAAA,CAAM,GAAA,IAAO,IAAI,IAAA,EAAK;AAC/C,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,2DAA2D,CAAA;AACrF,IAAA,OAAO;AAAA,MACL,GAAA;AAAA,MACA,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,MAAA,EAAQ,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,MAAA;AAAA,MAC5B,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,SAAS,KAAA,CAAM;AAAA,KACjB;AAAA,EACF;AAAA,EAEQ,0BAAA,GAA6D;AACnE,IAAA,MAAM,SAAA,GAAY,KAAK,eAAA,IAAkB;AACzC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAI;AACF,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AACnD,QAAA,IAAA,CAAK,QAAA,GAAW,cAAA;AAChB,QAAA,OAAO,SAAA;AAAA,MACT,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAK,QAAA,CAAS,GAAA;AAAA,MAClB,KAAA,EAAO,KAAK,QAAA,CAAS,KAAA;AAAA,MACrB,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,MACpB,OAAA,EAAS,KAAK,QAAA,CAAS,OAAA;AAAA,MACvB,IAAA,EAAM,KAAK,QAAA,CAAS,MAAA;AAAA,MACpB,OAAA,EAAS,KAAK,QAAA,CAAS,OAAA;AAAA,MACvB,OAAA,EAAS,KAAK,QAAA,CAAS;AAAA,KACzB;AAAA,EACF;AAAA,EAEQ,mBAAA,GAA+C;AACrD,IAAA,MAAM,SAAA,GAAY,KAAK,0BAAA,EAA2B;AAClD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAI;AACF,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AACnD,QAAA,IAAA,CAAK,QAAA,GAAW,cAAA;AAChB,QAAA,OAAO,cAAA;AAAA,MACT,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEQ,uBAAA,GAAkF;AACxF,IAAA,MAAM,mBAAA,GAAsB,KAAK,0BAAA,EAA2B;AAC5D,IAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,aAAA,GAAgB,+BAA+B,mBAAmB,CAAA;AACxE,IAAA,OAAO;AAAA,MACL,eAAA,EAAiB,eAAA,CAAgB,IAAA,CAAK,SAAA,CAAU,aAAa,CAAC,CAAA;AAAA,MAC9D,iBAAiB,aAAA,CAAc;AAAA,KACjC;AAAA,EACF;AAAA,EAEA,MAAc,gBAAA,GAA2C;AACvD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,OAAO,UAAU,UAAA,EAAY;AAC/C,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,EAAE,eAAA,EAAiB,eAAA,EAAgB,GAAI,KAAK,uBAAA,EAAwB;AAE1E,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,wBAAA,CAAA,EAA4B;AAAA,QACzE,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,0BAA0B,IAAA,CAAK;AAAA,SACjC;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,cAAA,EAAgB,KAAK,cAAA,IAAkB,KAAA,CAAA;AAAA,UACvC,eAAA;AAAA,UACA;AAAA,SACD;AAAA,OACF,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,OAAA,GAAW,MAAM,QAAA,CAAS,IAAA,EAAK;AACrC,MAAA,OAAO,OAAO,QAAQ,GAAA,KAAQ,QAAA,IAAY,QAAQ,GAAA,CAAI,IAAA,EAAK,GAAI,OAAA,CAAQ,GAAA,GAAM,IAAA;AAAA,IAC/E,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,IAAA,CAA+C,OAAU,OAAA,EAA4C;AAC3G,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAG;AAC5C,MAAA,QAAA,CAAS,OAAO,CAAA;AAAA,IAClB;AAAA,EACF;AAAA,EAEQ,oBAAoB,KAAA,EAA0C;AACpE,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,IAAA,IAAA,CAAK,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA,EACpC;AAAA,EAEA,EAAA,CACE,OACA,QAAA,EACY;AACZ,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAE,GAAA,CAAI,QAAQ,CAAA;AAClC,IAAA,IAAI,UAAU,iBAAA,EAAmB;AAC/B,MAAC,QAAA,CAA4D,KAAK,eAAe,CAAA;AAAA,IACnF;AACA,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAE,MAAA,CAAO,QAAQ,CAAA;AAAA,IACvC,CAAA;AAAA,EACF;AAAA,EAEA,iBAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,eAAA,IAAmB,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AAAA,EACpD;AAAA,EAEQ,UAAA,CAAW,UAAA,EAAoC,KAAA,EAAe,IAAA,EAAqC;AACzG,IAAA,IAAA,CAAK,QAAA,GAAW,UAAA,EAAY,KAAA,EAAO,IAAI,CAAA;AAAA,EACzC;AAAA,EAEA,MAAc,sBAAA,GAAwC;AACpD,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AACjC,IAAA,MAAM,IAAA,CAAK,qBAAA;AAAA,EACb;AAAA,EAEA,MAAc,mBAAA,GAAqC;AACjD,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,KAAK,MAAM,CAAA;AAC5D,MAAA,IAAI,CAAC,QAAA,EAAU;AACf,MAAA,IAAA,CAAK,WAAW,IAAA,CAAK,GAAA,CAAI,KAAK,QAAA,EAAU,QAAA,CAAS,YAAY,CAAC,CAAA;AAC9D,MAAA,KAAA,MAAW,aAAA,IAAiB,QAAA,CAAS,YAAA,IAAgB,EAAC,EAAG;AACvD,QAAA,IAAA,CAAK,YAAA,CAAa,IAAI,aAAa,CAAA;AAAA,MACrC;AAEA,MAAA,KAAA,MAAW,CAAC,OAAA,EAAS,IAAI,CAAA,IAAK,MAAA,CAAO,QAAQ,QAAA,CAAS,KAAA,IAAS,EAAE,CAAA,EAAG;AAClE,QAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAK,WAAA,CAAY,OAAO,CAAC,CAAA;AACzD,QAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,WAAA,EAAa;AACjD,QAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA,EAAG;AAAA,UACxC,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,OAAA;AAAA,UACA,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAAA,UACzB,WAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,IAAK,KAAK,GAAA,EAAI;AAAA,UAC9C,SAAS,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,IAAK,KAAK,GAAA,EAAI;AAAA,UAC1C,WAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,IAAK,KAAK,GAAA,EAAI;AAAA,UAC9C,MAAA,EAAQ,KAAK,MAAA,IAAU,YAAA;AAAA,UACvB,QAAA,EAAU,KAAK,QAAA,IAAY;AAAA,SAC5B,CAAA;AAAA,MACH;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,MAAc,YAAA,GAA8B;AAC1C,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AAC3B,IAAA,MAAM,QAAA,GAA2C;AAAA,MAC/C,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAA,EAAc,CAAC,GAAG,IAAA,CAAK,YAAY,CAAA;AAAA,MACnC,OAAO;AAAC,KACV;AAEA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,IAAA,CAAK,KAAA,CAAM,SAAQ,EAAG;AAC9C,MAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,GAAG,IAAA,CAAK,MAAM,GAAG,CAAA,EAAG;AACxC,MAAA,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA,GAAI;AAAA,QAC7B,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,UAAU,IAAA,CAAK;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAAA,IACvD,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,eAAA,CAAgB,EAAA,GAAK,IAAA,CAAK,GAAA,EAAI,EAA2D;AAC/F,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,EAAA;AAAA,MACX,OAAA,EAAS,KAAK,IAAA,CAAK,UAAA;AAAA,MACnB,SAAA,EAAW,KAAK,IAAA,CAAK;AAAA,KACvB;AAAA,EACF;AAAA,EAEQ,YAAA,CACN,OAAA,EACA,KAAA,EACA,MAAA,EACA,QAAA,GAAW,KAAK,QAAA,EAChB,EAAA,GAAK,IAAA,CAAK,GAAA,EAAI,EACR;AACN,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA,EAAG;AAAA,MACxC,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAG,IAAA,CAAK,eAAA,CAAgB,EAAE;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA,EAEQ,eAAe,SAAA,EAAgD;AACrE,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,GAAA,CAAI,KAAK,QAAA,EAAU,SAAA,CAAU,YAAY,CAAC,CAAA;AAC/D,IAAA,KAAA,MAAW,aAAA,IAAiB,SAAA,CAAU,YAAA,IAAgB,EAAC,EAAG;AACxD,MAAA,IAAA,CAAK,YAAA,CAAa,IAAI,aAAa,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,KAAA,GAAQ,CAAC,OAAA,EAAiB,KAAA,EAAgB,UAAmB,SAAA,KAAuB;AACxF,MAAA,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,KAAA,EAAO,WAAA,EAAa,QAAA,IAAY,KAAK,QAAA,EAAU,SAAA,IAAa,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,IACnG,CAAA;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA,EAAG;AAClC,MAAA,KAAA,MAAW,IAAA,IAAQ,UAAU,KAAA,EAAO;AAClC,QAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,CAAK,QAAQ,QAAA,EAAU;AAC3C,QAAA,KAAA,CAAM,IAAA,CAAK,KAAK,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,SAAS,CAAA;AAAA,MACpE;AACA,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,KAAK,CAAA,IAAK,MAAA,CAAO,QAAQ,SAAA,CAAU,KAAA,IAAS,EAAE,CAAA,EAAG;AACpE,MAAA,KAAA,CAAM,OAAA,EAAS,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,aAAA,CAAc,IAAA,EAA6B,GAAA,GAAM,IAAA,CAAK,KAAI,EAA8C;AAC9G,IAAA,IAAI,CAAC,MAAM,OAAO,SAAA;AAClB,IAAA,IAAI,GAAA,IAAO,IAAA,CAAK,OAAA,EAAS,OAAO,OAAA;AAChC,IAAA,IAAI,GAAA,IAAO,IAAA,CAAK,SAAA,EAAW,OAAO,OAAA;AAClC,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEQ,eAAA,CAAgB,MAAA,EAAiB,MAAA,GAAS,EAAA,EAAU;AAC1D,IAAA,IAAI,IAAA,CAAK,gBAAgB,MAAA,EAAQ;AACjC,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AACnB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,KAAK,aAAA,EAAe,EAAE,QAAQ,IAAA,CAAK,MAAA,EAAQ,QAAQ,CAAA;AACxD,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,KAAK,cAAA,EAAgB,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EACnD;AAAA,EAEA,MAAc,cAAA,CAAe,GAAA,EAAa,IAAA,EAAmB,SAAA,EAAkC;AAC7F,IAAA,IAAI,SAAA,GAAqB,IAAA;AAEzB,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,IAAA,CAAK,YAAY,OAAA,EAAA,EAAW;AAC3D,MAAA,MAAM,KAAK,OAAO,eAAA,KAAoB,WAAA,GAAc,IAAI,iBAAgB,GAAI,IAAA;AAC5E,MAAA,MAAM,OAAA,GACJ,EAAA,KAAO,IAAA,GACH,UAAA,CAAW,MAAM;AACf,QAAA,EAAA,CAAG,KAAA,EAAM;AAAA,MACX,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,GACjB,IAAA;AAEN,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,UAChC,GAAG,IAAA;AAAA,UACH,QAAQ,EAAA,EAAI;AAAA,SACb,CAAA;AAED,QAAA,IAAI,OAAA,eAAsB,OAAO,CAAA;AAEjC,QAAA,IAAI,CAAC,SAAS,EAAA,IAAM,iBAAA,CAAkB,SAAS,MAAM,CAAA,IAAK,OAAA,GAAU,IAAA,CAAK,UAAA,EAAY;AACnF,UAAA,SAAA,GAAY,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAC/C,UAAA,MAAM,eAAe,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,EAAO;AAChE,UAAA,MAAM,KAAA,CAAM,IAAA,CAAK,SAAA,IAAa,OAAA,GAAU,KAAK,YAAY,CAAA;AACzD,UAAA;AAAA,QACF;AAEA,QAAA,OAAO,QAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,OAAA,eAAsB,OAAO,CAAA;AACjC,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA,IAAI,OAAA,IAAW,KAAK,UAAA,EAAY;AAChC,QAAA,MAAM,eAAe,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,EAAO;AAChE,QAAA,MAAM,KAAA,CAAM,IAAA,CAAK,SAAA,IAAa,OAAA,GAAU,KAAK,YAAY,CAAA;AAAA,MAC3D;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,eAAA,CAAgB,MAAM,SAAS,CAAA;AACpC,IAAA,MAAM,SAAA;AAAA,EACR;AAAA,EAEQ,kBAAA,GAA6D;AACnE,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,QAAgD,EAAC;AAEvD,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,IAAI,KAAK,IAAA,CAAK,KAAA,CAAM,SAAQ,EAAG;AACnD,MAAA,IAAI,CAAC,QAAA,CAAS,UAAA,CAAW,GAAG,IAAA,CAAK,MAAM,GAAG,CAAA,EAAG;AAC7C,MAAA,IAAI,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,EAAG;AACvC,QAAA,KAAA,CAAM,KAAK,EAAE,GAAA,EAAK,KAAK,OAAA,EAAS,KAAA,EAAO,OAAO,CAAA;AAC9C,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,IAAA,EAAM,GAAG,CAAA;AAC1C,MAAA,IAAI,KAAA,KAAU,SAAA,IAAa,KAAA,KAAU,SAAA,EAAW;AAChD,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,GAAA,EAAK,IAAA,CAAK,SAAS,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AAAA,IACrD;AAEA,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,GAAA,CAAI,aAAA,CAAc,CAAA,CAAE,GAAG,CAAC,CAAA;AAAA,EACxD;AAAA,EAEA,cAAA,GAGE;AACA,IAAA,MAAM,KAAA,GAAQ,KAAK,kBAAA,EAAmB;AACtC,IAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,CAAM,SAAS,CAAA,EAAE;AAAA,EAC5C;AAAA,EAEA,mBAAmB,OAAA,EAAwD;AACzE,IAAA,OAAO,KAAK,WAAA,CAAY,GAAA,CAAI,KAAK,WAAA,CAAY,OAAO,CAAC,CAAA,IAAK,IAAA;AAAA,EAC5D;AAAA,EAEA,aAAA,CAAc,SAAiB,OAAA,EAAwB;AACrD,IAAA,MAAM,UAAU,YAAA,EAAa;AAC7B,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,YAAA,CAAa,IAAI,OAAO,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,YAAA,CAAa,OAAO,OAAO,CAAA;AAAA,IAClC;AACA,IAAA,MAAM,OAAA,GAAU,cAAa,GAAI,OAAA;AACjC,IAAA,IAAA,CAAK,UAAA,CAAW,kCAAkC,OAAA,EAAS;AAAA,MACzD,KAAK,IAAA,CAAK,MAAA;AAAA,MACV,MAAA,EAAQ,UAAU,SAAA,GAAY;AAAA,KAC/B,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,CAAK,UAAU,EAAE,WAAA,EAAa,CAAC,OAAO,CAAA,EAAG,MAAA,EAAQ,UAAA,EAAY,CAAA;AAClE,IAAA,KAAK,KAAK,YAAA,EAAa;AAAA,EACzB;AAAA,EAEA,MAAc,oBAAA,CACZ,OAAA,EACA,cAAA,EACA,YAAA,EACyB;AACzB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,GAClB,MAAM,IAAA,CAAK,cAAA;AAAA,MACT,CAAA,EAAG,KAAK,UAAU,CAAA,gBAAA,CAAA;AAAA,MAClB;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,0BAA0B,IAAA,CAAK;AAAA,SACjC;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,OAAA;AAAA,UACA,IAAA,EAAM,cAAA;AAAA,UACN,YAAA;AAAA,UACA,cAAA,EAAgB,KAAK,cAAA,IAAkB;AAAA,SACxC;AAAA,OACH;AAAA,MACA;AAAA,KACF,GACA,MAAM,IAAA,CAAK,cAAA;AAAA,MACT,CAAA,EAAG,KAAK,UAAU,CAAA,YAAA,CAAA;AAAA,MAClB;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,OAAA;AAAA,UACA,IAAA,EAAM,cAAA;AAAA,UACN;AAAA,SACD;AAAA,OACH;AAAA,MACA;AAAA,KACF;AAEJ,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,IAAI,CAAC,iBAAA,CAAkB,QAAA,CAAS,MAAM,CAAA,EAAG;AACvC,QAAA,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,MACtD;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,MAAM,QAAQ,OAAO,IAAA,CAAK,KAAA,KAAU,SAAA,GAAY,KAAK,KAAA,GAAQ,YAAA;AAE7D,IAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM;AAC5B,MAAA,IAAA,CAAK,YAAA,CAAa,IAAI,OAAO,CAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA;AACvC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,UAAU,QAAQ,CAAA;AAChD,IAAA,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,QAAQ,CAAA;AACrD,IAAA,IAAA,CAAK,gBAAgB,KAAK,CAAA;AAC1B,IAAA,KAAK,KAAK,YAAA,EAAa;AACvB,IAAA,IAAA,CAAK,IAAA,CAAK,UAAU,EAAE,WAAA,EAAa,CAAC,OAAO,CAAA,EAAG,MAAA,EAAQ,SAAA,EAAW,CAAA;AACjE,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAc,qBAAA,CACZ,cAAA,EACA,YAAA,EACA,WACA,IAAA,EACwD;AACxD,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAU,YAAA,EAAa;AAE7B,IAAA,QAAA,CAAS,gBAAA,EAAkB;AAAA,MACzB,SAAA;AAAA,MACA,sBAAA,EAAwB,OAAA,CAAQ,IAAA,EAAM,sBAAsB,CAAA;AAAA,MAC5D,SAAS,cAAA,CAAe,GAAA;AAAA,MACxB;AAAA,KACD,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,cAAA;AAAA,QAC1B,CAAA,EAAG,KAAK,UAAU,CAAA,iBAAA,CAAA;AAAA,QAClB;AAAA,UACE,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,cAAA,EAAgB,kBAAA;AAAA,YAChB,0BAA0B,IAAA,CAAK;AAAA,WACjC;AAAA,UACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,IAAA,EAAM,cAAA;AAAA,YACN,YAAA;AAAA,YACA,cAAA,EAAgB,KAAK,cAAA,IAAkB,KAAA;AAAA,WACxC;AAAA,SACH;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,IAAI,CAAC,iBAAA,CAAkB,QAAA,CAAS,MAAM,CAAA,EAAG;AACvC,UAAA,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,QACtD;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAOlC,MAAA,MAAM,IAAA,GAAO,iBAAiB,IAAI,CAAA;AAClC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA;AACvC,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,UAAU,QAAQ,CAAA;AAEhD,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,YAAY,CAAA,EAAG;AACpC,QAAA,KAAA,MAAW,GAAA,IAAO,KAAK,YAAA,EAAc;AACnC,UAAA,IAAA,CAAK,YAAA,CAAa,IAAI,GAAG,CAAA;AAAA,QAC3B;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,MAAA,KAAA,MAAW,SAAS,IAAA,EAAM;AACxB,QAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,GAAA,CAAI,KAAK,WAAA,CAAY,KAAA,CAAM,GAAG,CAAC,CAAA;AAC3D,QAAA,IAAI,CAAC,YAAY,QAAA,CAAS,KAAA,KAAU,MAAM,KAAA,IAAS,QAAA,CAAS,aAAa,QAAA,EAAU;AACjF,UAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,GAAG,CAAA;AAAA,QACvB;AACA,QAAA,IAAA,CAAK,aAAa,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,KAAA,EAAO,WAAW,QAAQ,CAAA;AAAA,MAC/D;AAEA,MAAA,IAAI,IAAA,EAAM,sBAAA,IAA0B,IAAA,KAAS,IAAA,EAAM;AACjD,QAAA,IAAA,CAAK,KAAK,QAAA,EAAU;AAAA,UAClB,aAAa,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,GAAG,CAAA;AAAA,UAClC,MAAA,EAAQ,UAAA;AAAA,UACR,kBAAA,EAAoB;AAAA,SACrB,CAAA;AAAA,MACH,CAAA,MAAA,IAAW,OAAA,CAAQ,IAAA,GAAO,CAAA,EAAG;AAC3B,QAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,EAAE,WAAA,EAAa,CAAC,GAAG,OAAO,CAAA,EAAG,MAAA,EAAQ,SAAA,EAAW,CAAA;AAAA,MACtE;AAEA,MAAA,IAAA,CAAK,gBAAgB,KAAK,CAAA;AAC1B,MAAA,KAAK,KAAK,YAAA,EAAa;AACvB,MAAA,IAAA,CAAK,UAAA,CAAW,0BAAA,EAA4B,YAAA,EAAa,GAAI,OAAA,EAAS;AAAA,QACpE,KAAK,IAAA,CAAK,MAAA;AAAA,QACV;AAAA,OACD,CAAA;AACD,MAAA,QAAA,CAAS,eAAA,EAAiB;AAAA,QACxB,SAAA;AAAA,QACA,sBAAA,EAAwB,OAAA,CAAQ,IAAA,EAAM,sBAAsB,CAAA;AAAA,QAC5D,YAAY,IAAA,CAAK,MAAA;AAAA,QACjB;AAAA,OACD,CAAA;AACD,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,UAAA,CAAW,0BAAA,EAA4B,YAAA,EAAa,GAAI,OAAA,EAAS;AAAA,QACpE,KAAK,IAAA,CAAK,MAAA;AAAA,QACV,SAAA;AAAA,QACA,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,QAAA,CAAS,oBAAA,EAAsB;AAAA,QAC7B,SAAA;AAAA,QACA,sBAAA,EAAwB,OAAA,CAAQ,IAAA,EAAM,sBAAsB;AAAA,OAC7D,CAAA;AACD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,UAAA,CACN,cAAA,EACA,YAAA,EACA,IAAA,EACwD;AACxD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,KAAK,MAAM,CAAA;AACxD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI,MAAM,sBAAA,EAAwB;AAChC,QAAA,KAAK,QAAA,CAAS,IAAA,CAAK,CAAC,IAAA,KAAS;AAC3B,UAAA,IAAI,SAAS,IAAA,EAAM;AACjB,YAAA,IAAA,CAAK,KAAK,QAAA,EAAU;AAAA,cAClB,aAAa,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,GAAG,CAAA;AAAA,cAClC,MAAA,EAAQ,UAAA;AAAA,cACR,kBAAA,EAAoB;AAAA,aACrB,CAAA;AAAA,UACH;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AACA,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAA,GAAU,KAAK,qBAAA,CAAsB,cAAA,EAAgB,cAAc,SAAA,EAAW,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAM;AACtG,MAAA,IAAA,CAAK,kBAAA,CAAmB,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,IAC5C,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA;AAChD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,QAAA,CACJ,OAAA,EACA,IAAA,EACA,eAAe,KAAA,EACwB;AACvC,IAAA,MAAM,UAAU,YAAA,EAAa;AAC7B,IAAA,MAAM,KAAK,sBAAA,EAAuB;AAElC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AAC9C,IAAA,IAAA,CAAK,QAAA,GAAW,cAAA;AAChB,IAAA,IAAA,CAAK,gBAAA,GAAmB,YAAA;AAExB,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA,EAAG;AAClC,MAAA,MAAMA,SAAAA,GAA2C;AAAA,QAC/C,MAAA,EAAQ,aAAA;AAAA,QACR,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW,cAAa,GAAI,OAAA;AAAA,QAC5B,MAAA,EAAQ;AAAA,OACV;AACA,MAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsBA,SAAAA,CAAS,SAAA,EAAW;AAAA,QACxD,KAAK,IAAA,CAAK,MAAA;AAAA,QACV,QAAQA,SAAAA,CAAS,MAAA;AAAA,QACjB,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,IAAA,CAAK,YAAY,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,OAAO,GAAGA,SAAQ,CAAA;AACxD,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,QAAA,EAAAA,SAAAA,EAAS;AAAA,IAClC;AAEA,IAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAK,WAAA,CAAY,OAAO,CAAC,CAAA;AAC1D,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AAE/C,IAAA,IAAI,SAAA,IAAa,eAAe,OAAA,EAAS;AACvC,MAAA,MAAMA,SAAAA,GAA2C;AAAA,QAC/C,QAAQ,SAAA,CAAU,MAAA,KAAW,eAAe,SAAA,CAAU,MAAA,KAAW,eAAe,WAAA,GAAc,aAAA;AAAA,QAC9F,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW,cAAa,GAAI,OAAA;AAAA,QAC5B,QAAQ,SAAA,CAAU,MAAA;AAAA,QAClB,WAAW,SAAA,CAAU,SAAA;AAAA,QACrB,SAAS,SAAA,CAAU,OAAA;AAAA,QACnB,WAAW,SAAA,CAAU;AAAA,OACvB;AACA,MAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsB,CAAA,EAAG,EAAE,GAAA,EAAK,KAAK,MAAA,EAAQ,MAAA,EAAQA,SAAAA,CAAS,MAAA,EAAQ,CAAA;AACtF,MAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsBA,SAAAA,CAAS,SAAA,EAAW;AAAA,QACxD,KAAK,IAAA,CAAK,MAAA;AAAA,QACV,QAAQA,SAAAA,CAAS,MAAA;AAAA,QACjB,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,IAAA,CAAK,YAAY,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,OAAO,GAAGA,SAAQ,CAAA;AACxD,MAAA,OAAO,EAAE,KAAA,EAAO,SAAA,CAAU,KAAA,EAAO,UAAAA,SAAAA,EAAS;AAAA,IAC5C;AAEA,IAAA,IAAI,SAAA,IAAa,eAAe,OAAA,EAAS;AACvC,MAAA,KAAK,IAAA,CAAK,UAAA,CAAW,cAAA,EAAgB,YAAY,CAAA;AACjD,MAAA,MAAMA,SAAAA,GAA2C;AAAA,QAC/C,MAAA,EAAQ,aAAA;AAAA,QACR,OAAA,EAAS,IAAA;AAAA,QACT,SAAA,EAAW,cAAa,GAAI,OAAA;AAAA,QAC5B,QAAQ,SAAA,CAAU,MAAA;AAAA,QAClB,WAAW,SAAA,CAAU,SAAA;AAAA,QACrB,SAAS,SAAA,CAAU,OAAA;AAAA,QACnB,WAAW,SAAA,CAAU;AAAA,OACvB;AACA,MAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsB,CAAA,EAAG,EAAE,GAAA,EAAK,KAAK,MAAA,EAAQ,MAAA,EAAQA,SAAAA,CAAS,MAAA,EAAQ,CAAA;AACtF,MAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsBA,SAAAA,CAAS,SAAA,EAAW;AAAA,QACxD,KAAK,IAAA,CAAK,MAAA;AAAA,QACV,QAAQA,SAAAA,CAAS,MAAA;AAAA,QACjB,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,IAAA,CAAK,YAAY,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,OAAO,GAAGA,SAAQ,CAAA;AACxD,MAAA,OAAO,EAAE,KAAA,EAAO,SAAA,CAAU,KAAA,EAAO,UAAAA,SAAAA,EAAS;AAAA,IAC5C;AAEA,IAAA,IAAI,cAAc,SAAA,CAAU,MAAA,KAAW,WAAA,IAAe,SAAA,CAAU,WAAW,YAAA,CAAA,EAAe;AACxF,MAAA,KAAK,IAAA,CAAK,UAAA,CAAW,cAAA,EAAgB,YAAY,CAAA;AACjD,MAAA,MAAMA,SAAAA,GAA2C;AAAA,QAC/C,MAAA,EAAQ,WAAA;AAAA,QACR,OAAA,EAAS,IAAA;AAAA,QACT,SAAA,EAAW,cAAa,GAAI,OAAA;AAAA,QAC5B,QAAQ,SAAA,CAAU,MAAA;AAAA,QAClB,WAAW,SAAA,CAAU,SAAA;AAAA,QACrB,SAAS,SAAA,CAAU,OAAA;AAAA,QACnB,WAAW,SAAA,CAAU;AAAA,OACvB;AACA,MAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsB,CAAA,EAAG,EAAE,GAAA,EAAK,KAAK,MAAA,EAAQ,MAAA,EAAQA,SAAAA,CAAS,MAAA,EAAQ,CAAA;AACtF,MAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsBA,SAAAA,CAAS,SAAA,EAAW;AAAA,QACxD,KAAK,IAAA,CAAK,MAAA;AAAA,QACV,QAAQA,SAAAA,CAAS,MAAA;AAAA,QACjB,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,IAAA,CAAK,YAAY,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,OAAO,GAAGA,SAAQ,CAAA;AACxD,MAAA,OAAO,EAAE,KAAA,EAAO,SAAA,CAAU,KAAA,EAAO,UAAAA,SAAAA,EAAS;AAAA,IAC5C;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,eAAe,MAAM,IAAA,CAAK,oBAAA,CAAqB,OAAA,EAAS,gBAAgB,YAAY,CAAA;AAC1F,MAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,QAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAK,WAAA,CAAY,OAAO,CAAC,CAAA;AACrD,QAAA,MAAMA,SAAAA,GAA2C;AAAA,UAC/C,MAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAS,KAAA;AAAA,UACT,SAAA,EAAW,cAAa,GAAI,OAAA;AAAA,UAC5B,MAAA,EAAQ,SAAA;AAAA,UACR,WAAW,IAAA,EAAM,SAAA;AAAA,UACjB,SAAS,IAAA,EAAM,OAAA;AAAA,UACf,WAAW,IAAA,EAAM;AAAA,SACnB;AACA,QAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsB,CAAA,EAAG,EAAE,GAAA,EAAK,KAAK,MAAA,EAAQ,MAAA,EAAQA,SAAAA,CAAS,MAAA,EAAQ,CAAA;AACtF,QAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsBA,SAAAA,CAAS,SAAA,EAAW;AAAA,UACxD,KAAK,IAAA,CAAK,MAAA;AAAA,UACV,QAAQA,SAAAA,CAAS,MAAA;AAAA,UACjB,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAA,IAAA,CAAK,YAAY,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,OAAO,GAAGA,SAAQ,CAAA;AACxD,QAAA,OAAO,EAAE,KAAA,EAAO,YAAA,EAAc,QAAA,EAAAA,SAAAA,EAAS;AAAA,MACzC;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,QAAA,GAA2C;AAAA,MAC/C,MAAA,EAAQ,SAAA;AAAA,MACR,OAAA,EAAS,KAAA;AAAA,MACT,SAAA,EAAW,cAAa,GAAI,OAAA;AAAA,MAC5B,MAAA,EAAQ;AAAA,KACV;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsB,CAAA,EAAG,EAAE,GAAA,EAAK,KAAK,MAAA,EAAQ,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAQ,CAAA;AACtF,IAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsB,QAAA,CAAS,SAAA,EAAW;AAAA,MACxD,KAAK,IAAA,CAAK,MAAA;AAAA,MACV,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,IAAA,CAAK,YAAY,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,OAAO,GAAG,QAAQ,CAAA;AACxD,IAAA,OAAO,EAAE,KAAA,EAAO,YAAA,EAAc,QAAA,EAAS;AAAA,EACzC;AAAA,EAEA,MAAM,IAAA,CAAK,OAAA,EAAiB,IAAA,EAA+B,eAAe,KAAA,EAAyB;AACjG,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,MAAM,YAAY,CAAA;AAC9D,IAAA,OAAO,MAAA,CAAO,KAAA;AAAA,EAChB;AAAA,EAEA,MAAM,KAAA,CAAM,IAAA,EAA+B,YAAA,GAAe,KAAA,EAAwD;AAChH,IAAA,MAAM,KAAK,sBAAA,EAAuB;AAClC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AAC9C,IAAA,IAAA,CAAK,QAAA,GAAW,cAAA;AAChB,IAAA,IAAA,CAAK,gBAAA,GAAmB,YAAA;AAExB,IAAA,MAAM,MAAA,GAAS,KAAK,kBAAA,EAAmB;AACvC,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,KAAK,IAAA,CAAK,UAAA,CAAW,cAAA,EAAgB,YAAY,CAAA;AACjD,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,CAAW,gBAAgB,YAAY,CAAA;AAC/D,IAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC3B,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QAC1B,KAAK,KAAA,CAAM,GAAA;AAAA,QACX,KAAA,EAAO,KAAK,YAAA,CAAa,GAAA,CAAI,MAAM,GAAG,CAAA,GAAI,QAAQ,KAAA,CAAM;AAAA,OAC1D,CAAE,CAAA;AAAA,IACJ;AAEA,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEQ,qBAAqB,OAAA,EAAqC;AAChE,IAAA,IAAI,OAAO,OAAA,CAAQ,QAAA,KAAa,YAAY,OAAA,CAAQ,QAAA,GAAW,KAAK,QAAA,EAAU;AAC5E,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,OAAA,CAAQ,QAAA,KAAa,QAAA,EAAU;AACxC,MAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAAA,IAC1B;AAEA,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,IAAI,OAAA,CAAQ,SAAS,cAAA,EAAgB;AACnC,MAAA,MAAM,OAAA,GAAU,OAAO,OAAA,CAAQ,IAAA,EAAM,YAAY,QAAA,GAAW,OAAA,CAAQ,KAAK,OAAA,GAAU,IAAA;AACnF,MAAA,MAAM,KAAA,GAAQ,OAAO,OAAA,CAAQ,IAAA,EAAM,UAAU,SAAA,GAAY,OAAA,CAAQ,KAAK,KAAA,GAAQ,IAAA;AAC9E,MAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,KAAA,KAAU,IAAA,EAAM;AACtC,QAAA,IAAA,CAAK,YAAA,CAAa,SAAS,KAAA,EAAO,UAAA,EAAY,QAAQ,QAAA,IAAY,IAAA,CAAK,UAAU,GAAG,CAAA;AACpF,QAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AAAA,MACrB;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,cAAA,EAAgB;AACnC,MAAA,MAAM,OAAA,GAAU,OAAO,OAAA,CAAQ,IAAA,EAAM,YAAY,QAAA,GAAW,OAAA,CAAQ,KAAK,OAAA,GAAU,IAAA;AACnF,MAAA,IAAI,YAAY,IAAA,EAAM;AACpB,QAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,OAAO,CAAC,CAAA;AAC3C,QAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AAAA,MACrB;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,yBAAA,EAA2B;AAC9C,MAAA,MAAM,UAAU,YAAA,EAAa;AAC7B,MAAA,MAAM,OAAA,GAAU,OAAO,OAAA,CAAQ,IAAA,EAAM,YAAY,QAAA,GAAW,OAAA,CAAQ,KAAK,OAAA,GAAU,IAAA;AACnF,MAAA,MAAM,OAAA,GAAU,OAAO,OAAA,CAAQ,IAAA,EAAM,YAAY,SAAA,GAAY,OAAA,CAAQ,KAAK,OAAA,GAAU,IAAA;AACpF,MAAA,IAAI,YAAY,IAAA,EAAM;AACpB,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,IAAA,CAAK,YAAA,CAAa,IAAI,OAAO,CAAA;AAAA,QAC/B,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,YAAA,CAAa,OAAO,OAAO,CAAA;AAAA,QAClC;AACA,QAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AACnB,QAAA,IAAA,CAAK,UAAA,CAAW,gCAAA,EAAkC,YAAA,EAAa,GAAI,OAAA,EAAS;AAAA,UAC1E,KAAK,IAAA,CAAK,MAAA;AAAA,UACV,SAAA,EAAW,IAAA,CAAK,WAAA,GAAc,KAAA,GAAQ,SAAA;AAAA,UACtC,MAAA,EAAQ,UAAU,SAAA,GAAY;AAAA,SAC/B,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,EAAI,IAAK,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI,CAAE,CAAA;AAC7E,IAAA,IAAA,CAAK,UAAA,CAAW,sBAAsB,UAAA,EAAY;AAAA,MAChD,KAAK,IAAA,CAAK,MAAA;AAAA,MACV,SAAA,EAAW,IAAA,CAAK,WAAA,GAAc,KAAA,GAAQ;AAAA,KACvC,CAAA;AAED,IAAA,IAAI,OAAA,CAAQ,OAAO,CAAA,EAAG;AACpB,MAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,EAAE,WAAA,EAAa,CAAC,GAAG,OAAO,CAAA,EAAG,MAAA,EAAQ,UAAA,EAAY,CAAA;AACrE,MAAA,KAAK,KAAK,YAAA,EAAa;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,YAAA,CAAa,YAAY,KAAA,EAAa;AAC5C,IAAA,IAAI,CAAC,KAAK,sBAAA,EAAwB;AAChC,MAAA,QAAA,CAAS,kBAAA,EAAoB;AAAA,QAC3B,SAAA;AAAA,QACA,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3B,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AAEA,IAAA,MAAM,OAAO,YAAY;AAEvB,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,QAAA,CAAS,sBAAA,EAAwB;AAAA,UAC/B,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,YAAA,GAAe,KAAK,mBAAA,EAAoB;AAC9C,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,QAAA,CAAS,uBAAA,EAAyB;AAAA,UAChC,MAAA,EAAQ,uBAAA;AAAA,UACR,UAAU,IAAA,CAAK;AAAA,SAChB,CAAA;AACD,QAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,UAAA,IAAA,CAAK,SAAA,GAAY,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,iBAAiB,CAAA;AAAA,QAC1D;AACA,QAAA;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,sBAAA,EAAwB;AAAA,QAC/B,YAAY,IAAA,CAAK,iBAAA;AAAA,QACjB,SAAS,YAAA,CAAa;AAAA,OACvB,CAAA;AAED,MAAA,MAAM,IAAA,CAAK,qBAAA,CAAsB,YAAA,EAAc,IAAA,CAAK,kBAAkB,SAAS,CAAA;AAG/E,MAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,QAAA,IAAA,CAAK,SAAA,GAAY,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,iBAAiB,CAAA;AAAA,MAC1D,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,QAAA,CAAS,6BAAA,EAA+B;AAAA,QACtC,YAAY,IAAA,CAAK;AAAA,OAClB,CAAA;AACD,MAAA,KAAK,IAAA,EAAK;AACV,MAAA;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,mBAAA,EAAqB;AAAA,MAC5B,YAAY,IAAA,CAAK;AAAA,KAClB,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,GAAY,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,iBAAiB,CAAA;AAAA,EAC1D;AAAA,EAEQ,UAAA,CAAW,UAAU,CAAA,EAAS;AACpC,IAAA,KAAK,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACtC;AAAA,EAEA,MAAc,kBAAA,CAAmB,OAAA,GAAU,CAAA,EAAkB;AAC3D,IAAA,MAAM,eAAA,GAAkB,OAAO,WAAA,KAAgB,WAAA,GAAc,WAAA,GAAc,IAAA;AAC3E,IAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,IAAA,CAAK,MAAA,EAAQ;AACpC,MAAA,QAAA,CAAS,+BAAA,EAAiC;AAAA,QACxC,kBAAA,EAAoB,QAAQ,eAAe,CAAA;AAAA,QAC3C,SAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AAAA,QAC9B,gBAAgB,IAAA,CAAK;AAAA,OACtB,CAAA;AACD,MAAA,IAAA,CAAK,mBAAA,CAAoB,EAAE,KAAA,EAAO,IAAA,CAAK,sBAAA,GAAyB,UAAA,GAAa,SAAA,EAAW,SAAA,EAAW,IAAA,CAAK,sBAAA,GAAyB,SAAA,GAAY,MAAA,EAAQ,CAAA;AACrJ,MAAA,IAAI,KAAK,sBAAA,EAAwB;AAC/B,QAAA,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,MACxB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,iBAAA,GAAoB,EAAE,IAAA,CAAK,oBAAA;AACjC,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,gBAAA,EAAiB;AAChD,IAAA,IAAI,iBAAA,KAAsB,KAAK,oBAAA,EAAsB;AACnD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAM,IAAI,GAAA,CAAI,IAAA,CAAK,eAAA,EAAiB,KAAK,UAAU,CAAA;AACzD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,KAAA,EAAO,WAAW,CAAA;AAAA,IACzC,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAC1C,MAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,QAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,cAAc,CAAA;AAAA,MACpD;AACA,MAAA,MAAM,EAAE,eAAA,EAAiB,eAAA,EAAgB,GAAI,KAAK,uBAAA,EAAwB;AAC1E,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,iBAAA,EAAmB,eAAe,CAAA;AAAA,MACzD;AACA,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,iBAAA,EAAmB,eAAe,CAAA;AAAA,MACzD;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,gBAAA,EAAkB;AAAA,MACzB,OAAA;AAAA,MACA,GAAA,EAAK,IAAI,QAAA,EAAS;AAAA,MAClB,gBAAgB,IAAA,CAAK,sBAAA;AAAA,MACrB,QAAA,EAAU,cAAc,cAAA,GAAiB;AAAA,KAC1C,CAAA;AAED,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,eAAA,CAAgB,GAAA,CAAI,UAAU,CAAA;AAErD,IAAA,IAAA,CAAK,WAAA,CAAY,SAAS,MAAM;AAC9B,MAAA,QAAA,CAAS,eAAA,EAAiB;AAAA,QACxB,OAAA;AAAA,QACA,GAAA,EAAK,IAAI,QAAA;AAAS,OACnB,CAAA;AACD,MAAA,IAAA,CAAK,oBAAoB,EAAE,KAAA,EAAO,WAAA,EAAa,SAAA,EAAW,OAAO,CAAA;AACjE,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3B,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,SAAA,GAAY,CAAC,KAAA,KAAwB;AACpD,MAAA,IAAI,KAAK,eAAA,CAAgB,KAAA,KAAU,eAAe,IAAA,CAAK,eAAA,CAAgB,cAAc,KAAA,EAAO;AAC1F,QAAA,QAAA,CAAS,0DAAA,EAA4D;AAAA,UACnE,aAAA,EAAe,KAAK,eAAA,CAAgB,KAAA;AAAA,UACpC,iBAAA,EAAmB,KAAK,eAAA,CAAgB;AAAA,SACzC,CAAA;AACD,QAAA,IAAA,CAAK,oBAAoB,EAAE,KAAA,EAAO,WAAA,EAAa,SAAA,EAAW,OAAO,CAAA;AAAA,MACnE;AAEA,MAAA,OAAA,CAAQ,IAAI,sBAAA,EAAwB;AAAA,QAClC,GAAA,EAAK,MAAA,CAAO,KAAA,CAAM,IAAI;AAAA,OACvB,CAAA;AACD,MAAA,IAAI;AACF,QAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,IAAI,CAAC,CAAA;AAC7C,QAAA,IAAI,OAAA,CAAQ,SAAS,qBAAA,EAAuB;AAC1C,UAAA,MAAM,YAAA,GAAe,KAAK,mBAAA,EAAoB;AAC9C,UAAA,OAAA,CAAQ,IAAI,sCAAA,EAAwC;AAAA,YAClD;AAAA,aACC,YAAY,CAAA;AACf,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,OAAA,CAAQ,IAAI,2CAAA,EAA6C;AAAA,cACvD,SAAS,YAAA,CAAa,GAAA;AAAA,cACtB,cAAc,IAAA,CAAK;AAAA,aACpB,CAAA;AACD,YAAA,KAAK,IAAA,CAAK,WAAW,YAAA,EAAc,IAAA,CAAK,kBAAkB,EAAE,sBAAA,EAAwB,MAAM,CAAA;AAAA,UAC5F,CAAA,MAAO;AACL,YAAA,QAAA,CAAS,oEAAoE,CAAA;AAAA,UAC/E;AAAA,QACF;AACA,QAAA,IAAA,CAAK,qBAAqB,OAAO,CAAA;AAAA,MACnC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,UAAU,MAAM;AAC/B,MAAA,QAAA,CAAS,aAAA,EAAe;AAAA,QACtB,OAAA;AAAA,QACA,gBAAgB,IAAA,CAAK,sBAAA;AAAA,QACrB,eAAe,IAAA,CAAK,GAAA,CAAI,KAAK,SAAA,IAAa,OAAA,GAAU,IAAI,GAAK;AAAA,OAC9D,CAAA;AACD,MAAA,IAAA,CAAK,mBAAA,CAAoB;AAAA,QACvB,KAAA,EAAO,IAAA,CAAK,sBAAA,GAAyB,UAAA,GAAa,SAAA;AAAA,QAClD,SAAA,EAAW,IAAA,CAAK,sBAAA,GAAyB,SAAA,GAAY;AAAA,OACtD,CAAA;AACD,MAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,IAAI,KAAK,sBAAA,EAAwB;AAC/B,QAAA,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,MACxB;AAEA,MAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,QAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAAA,MAClC;AACA,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,KAAK,SAAA,IAAa,OAAA,GAAU,IAAI,GAAK,CAAA;AAC9D,MAAA,IAAA,CAAK,cAAA,GAAiB,WAAW,MAAM;AACrC,QAAA,IAAA,CAAK,UAAA,CAAW,UAAU,CAAC,CAAA;AAAA,MAC7B,GAAG,OAAO,CAAA;AAAA,IACZ,CAAA;AAAA,EACF;AAAA,EAEA,aAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAEvB,IAAA,QAAA,CAAS,0BAAA,EAA4B;AAAA,MACnC,sBAAsB,IAAA,CAAK,4BAAA;AAAA,MAC3B,eAAA,EAAiB,OAAO,QAAA,KAAa,WAAA,GAAc,SAAS,eAAA,GAAkB,SAAA;AAAA,MAC9E,gBAAgB,IAAA,CAAK;AAAA,KACtB,CAAA;AAED,IAAA,IAAA,CAAK,uBAAA,EAAwB;AAC7B,IAAA,IAAI,KAAK,4BAAA,IAAgC,OAAO,aAAa,WAAA,IAAe,QAAA,CAAS,oBAAoB,QAAA,EAAU;AACjH,MAAA,QAAA,CAAS,mDAAmD,CAAA;AAC5D,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,EACnB;AAAA,EAEA,aAAa,IAAA,EAA4C;AACvD,IAAA,IAAA,CAAK,oBAAA,IAAwB,CAAA;AAC7B,IAAA,QAAA,CAAS,yBAAA,EAA2B;AAAA,MAClC,eAAA,EAAiB,OAAA,CAAQ,IAAA,EAAM,eAAe,CAAA;AAAA,MAC9C,cAAA,EAAgB,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA;AAAA,MACxC,YAAA,EAAc,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AAAA,MACpC,iBAAA,EAAmB,OAAA,CAAQ,IAAA,CAAK,cAAc;AAAA,KAC/C,CAAA;AAED,IAAA,IAAI,CAAC,MAAM,eAAA,EAAiB;AAC1B,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,MAAA,IAAA,CAAK,uBAAA,EAAwB;AAAA,IAC/B;AAEA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB;AACA,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3B,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AACA,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAChC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB;AACA,IAAA,IAAA,CAAK,oBAAoB,EAAE,KAAA,EAAO,SAAA,EAAW,SAAA,EAAW,QAAQ,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAY,MAAA,EAAgD;AAChE,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,kBAAA,CAAA,EAAsB;AAAA,QAClD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,0BAA0B,IAAA,CAAK;AAAA,SACjC;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,YAAY,MAAA,CAAO,UAAA,IAAA,iBAAc,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,UACxD,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,SAAS,MAAA,CAAO;AAAA,SACjB;AAAA,OACF,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAA,CAAK,SAAA,CAAU,OAAO,KAAA,EAAM;AAC5B,IAAA,IAAA,CAAK,SAAA,CAAU,YAAY,KAAA,EAAM;AACjC,IAAA,IAAA,CAAK,SAAA,CAAU,aAAa,KAAA,EAAM;AAClC,IAAA,IAAA,CAAK,SAAA,CAAU,gBAAgB,KAAA,EAAM;AAAA,EACvC;AACF","file":"index.js","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 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"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["metadata"],"mappings":"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","file":"index.js","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 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 debugLog('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 debugLog('Snapshot invalidate message received', {\n payload,\n realtimeUser\n });\n if (realtimeUser) {\n debugLog('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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@featureflare/sdk-js",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.140",
|
|
4
4
|
"private": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"dev": "tsup --watch",
|
|
26
26
|
"build": "tsup",
|
|
27
27
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
28
|
+
"test": "pnpm run build && node --test test/client.test.mjs",
|
|
28
29
|
"lint": "eslint .",
|
|
29
30
|
"format": "prettier -w ."
|
|
30
31
|
},
|