@ops-ai/react-router-toggly 1.0.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/types.ts","../src/core/utils.ts","../src/core/constants.ts","../src/core/telemetry/hash.ts","../src/core/telemetry/usage-batcher.ts","../src/core/telemetry/metrics-batcher.ts","../src/core/sdk-identity.ts","../src/core/telemetry/https-client.ts","../src/core/telemetry/index.ts","../src/server/eval-context-store.ts","../src/server/extract-context.ts","../src/server/sdk-identity.ts","../src/server/ws-sync.ts","../src/core/telemetry/grpc-clients.ts","../src/server/client.ts","../src/server/loader.ts","../src/server/action.ts"],"names":["appendEvaluationContext","evaluateDefinitions","snapshot","path","AsyncLocalStorage","fromHttpRequest","SDK_ID","SDK_VERSION","sdkUserAgent","createRequire","fileURLToPath","fs","buildFlagGateIndex","claims","snapshotEvaluatedBooleans","applyLocalGate","readResponseBody","parseEvaluatedResponseBody","parseDefinitionsPayload","normalizeEntityContext","registerContext","WebSocket","isFeatureEnabled","redirect"],"mappings":"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","file":"server.cjs","sourcesContent":["/**\n * Core types for Toggly React Router SDK\n */\n\nimport type { LocalGate } from '@ops-ai/toggly-local-gates'\nimport type { EvaluatedDefinitions } from '@ops-ai/toggly-hooks-types'\n\nexport type {\n EntityGate,\n EntityGateRule,\n EvaluatedDefinitions,\n TogglyEntityContext,\n} from '@ops-ai/toggly-hooks-types'\n\nexport type { LocalGate }\n\n/**\n * Feature requirement - whether all or any features must be enabled\n */\nexport type FeatureRequirement = 'all' | 'any';\n\n/**\n * Where feature evaluation happens for definitions fetches.\n * - `remote` (default): fetch `evaluated-signed` with context query params\n * - `local`: fetch `definitions-signed` (rules only) and evaluate with `@ops-ai/toggly-eval`\n */\nexport type EvaluationMode = 'local' | 'remote';\n\n/**\n * Configuration options for Toggly\n */\nexport interface TogglyConfig {\n /** Toggly application key */\n appKey?: string;\n /** Environment name (e.g., 'Production', 'Staging') */\n environment?: string;\n /** Base URL for Toggly API */\n baseUrl?: string;\n /**\n * Evaluation rail. Defaults to `remote` for backward compatibility.\n * Use `local` for definitions-signed + call-site evaluation (server multi-tenant).\n */\n evaluationMode?: EvaluationMode;\n /** Default feature values for offline/fallback mode */\n featureDefaults?: Record<string, boolean>;\n /** Request timeout in milliseconds */\n timeout?: number;\n /** Enable debug logging */\n debug?: boolean;\n /**\n * When true, verify ES256 signed definition envelopes via JWKS before applying flags.\n */\n verifySignatures?: boolean;\n /**\n * Optional allow-list of JWKS `kid` values when verifySignatures is enabled.\n */\n allowedKeyIds?: string[];\n /**\n * Reject envelopes whose `timestamp` is older than this many seconds.\n * Unset or <= 0 disables freshness checks.\n */\n maxSignatureAgeSeconds?: number;\n /** Device-local gates applied as a read-time AND on worker-evaluated booleans */\n localGates?: LocalGate[];\n /** Optional SDK error callback for reporting fetch/evaluation failures. */\n onError?: (message: string, error?: unknown) => void;\n /** Initial browser identity; hydrated server identity takes precedence. */\n identity?: string;\n /** User groups for targeting */\n groups?: string[];\n /** Custom claims for targeting */\n claims?: Record<string, string>;\n /**\n * Base URL for usage/metrics transport (default: https://app.toggly.io/).\n * Separate from `baseUrl`, which is for definitions/JWKS.\n */\n metricsBaseUrl?: string;\n /**\n * Enable feature usage tracking (Usage.SendStats / api/usage/stats).\n * Defaults to false in core; react-router-toggly server enables when appKey is set.\n */\n enableUsageTracking?: boolean;\n /**\n * Enable business metrics (Metrics.SendMetrics / api/metrics).\n * Defaults to false in core; react-router-toggly server enables when appKey is set.\n */\n enableMetrics?: boolean;\n /** Usage flush interval in ms (default: 60000). 0 disables the timer. */\n usageFlushInterval?: number;\n /** Metrics flush interval in ms (default: 60000). 0 disables the timer. */\n metricsFlushInterval?: number;\n /** Hostname/instance name reported with usage/metrics payloads. */\n instanceName?: string;\n /** Application version reported with usage payloads. */\n appVersion?: string;\n /**\n * Telemetry transport when clients are not injected.\n * Server should use `grpc` with injected clients; edge adapters use `https`.\n */\n telemetryTransport?: 'grpc' | 'https';\n /**\n * Attach Node process signal handlers for best-effort flush (default: true for grpc).\n * Edge adapters must set false.\n */\n telemetryAttachProcessHandlers?: boolean;\n /**\n * Injected usage sender (gRPC stub or test double).\n * @internal\n */\n usageClient?: import('./telemetry/index').UsageSender | null;\n /**\n * Injected metrics sender (gRPC stub or test double).\n * @internal\n */\n metricsClient?: import('./telemetry/index').MetricsSender | null;\n /** Optional fetch override for HTTPS telemetry (edge/tests). */\n telemetryFetch?: typeof fetch;\n}\n\n/**\n * User identity context for feature targeting\n */\nexport interface IdentityContext {\n /** Unique user identifier */\n identity?: string;\n /** User groups for targeting */\n groups?: string[];\n /** Custom traits for targeting */\n traits?: Record<string, string | number | boolean>;\n /** Custom claims for targeting */\n claims?: Record<string, string>;\n /** HTTP request segment fields (UA / Accept-Language / country) */\n request?: {\n userAgent?: string;\n acceptLanguage?: string;\n country?: string;\n };\n}\n\n/**\n * Feature flags state (boolean or entity gate per flag)\n */\nexport type FeatureFlags = EvaluatedDefinitions;\n\n/**\n * Feature evaluation options\n */\nexport interface EvaluationOptions {\n /** Feature key or keys to evaluate */\n featureKey?: string;\n featureKeys?: string[];\n /** Requirement type for multiple features */\n requirement?: FeatureRequirement;\n /** Negate the result */\n negate?: boolean;\n /** Default value if feature is not found */\n defaultValue?: boolean;\n}\n\n/**\n * Feature evaluation result\n */\nexport interface EvaluationResult {\n /** Whether the feature(s) are enabled */\n enabled: boolean;\n /** The feature keys that were evaluated */\n featureKeys: string[];\n /** The requirement type used */\n requirement: FeatureRequirement;\n /** Whether the result was negated */\n negated: boolean;\n}\n\n/**\n * Server-side feature context passed to client\n */\nexport interface ServerFeatureContext {\n /** Pre-fetched feature flags */\n flags: FeatureFlags;\n /** User identity (if any) */\n identity?: string;\n /** App key (for client-side refresh) */\n appKey?: string;\n /** Environment */\n environment?: string;\n /** Timestamp when flags were fetched */\n fetchedAt: number;\n}\n\n/**\n * Loader data with feature flags\n */\nexport interface TogglyLoaderData {\n /** Feature context for hydration */\n __toggly: ServerFeatureContext;\n}\n\n/**\n * Hook metadata\n */\nexport interface HookMetadata {\n name: string;\n version?: string;\n description?: string;\n}\n\n/**\n * Evaluation series data passed between before/after hooks\n */\nexport interface EvaluationSeriesData {\n [key: string]: unknown;\n}\n\n/**\n * Identity series data passed between before/after hooks\n */\nexport interface IdentitySeriesData {\n [key: string]: unknown;\n}\n\n/**\n * Hook interface for extending SDK behavior\n */\nexport interface TogglyHook {\n /** Get hook metadata */\n getMetadata(): HookMetadata;\n\n /** Called before feature evaluation */\n beforeEvaluation?(\n flagKey: string,\n defaultValue?: boolean\n ): Promise<EvaluationSeriesData | void> | EvaluationSeriesData | void;\n\n /** Called after feature evaluation */\n afterEvaluation?(\n flagKey: string,\n data: EvaluationSeriesData | void,\n result: boolean\n ): Promise<void> | void;\n\n /** Called before user identification */\n beforeIdentify?(\n identity: string\n ): Promise<IdentitySeriesData | void> | IdentitySeriesData | void;\n\n /** Called after user identification */\n afterIdentify?(\n identity: string,\n data: IdentitySeriesData | void\n ): Promise<void> | void;\n\n /** Called after feature flags are refreshed */\n afterRefresh?(flags: FeatureFlags): Promise<void> | void;\n}\n\n/**\n * Cookie/session storage options\n */\nexport interface StorageOptions {\n /** Cookie name for identity */\n identityCookieName?: string;\n /** Cookie name for feature flags cache */\n flagsCookieName?: string;\n /** Cookie max age in seconds */\n maxAge?: number;\n /** Cookie path */\n path?: string;\n /** Cookie domain */\n domain?: string;\n /** Secure flag */\n secure?: boolean;\n /** SameSite attribute */\n sameSite?: 'strict' | 'lax' | 'none';\n}\n\n/**\n * Error types for Toggly SDK\n */\nexport class TogglyError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly cause?: unknown\n ) {\n super(message);\n this.name = 'TogglyError';\n }\n}\n\nexport class TogglyNetworkError extends TogglyError {\n constructor(message: string, cause?: unknown) {\n super(message, 'NETWORK_ERROR', cause);\n this.name = 'TogglyNetworkError';\n }\n}\n\nexport class TogglyConfigError extends TogglyError {\n constructor(message: string) {\n super(message, 'CONFIG_ERROR');\n this.name = 'TogglyConfigError';\n }\n}\n\nexport class TogglyTimeoutError extends TogglyError {\n constructor(message: string) {\n super(message, 'TIMEOUT_ERROR');\n this.name = 'TogglyTimeoutError';\n }\n}\n","/**\n * Utility functions for Toggly React Router SDK\n */\n\nimport type {\n FeatureFlags,\n FeatureRequirement,\n EvaluationResult,\n TogglyConfig,\n} from './types';\nimport {\n appendEvaluationContext,\n clearRegisteredContexts,\n evaluateEvaluatedGate,\n normalizeEntityContext,\n registerContext,\n resolveEvaluatedDefinition,\n type TogglyEvaluationContext,\n type TogglyEntityContext,\n} from '@ops-ai/toggly-hooks-types';\nimport {\n evaluateDefinitions,\n evaluateFeatureGate as evaluateLocalFeatureGate,\n type DefinitionsByKey,\n type EvalContext,\n} from '@ops-ai/toggly-eval';\n\n/**\n * Default Toggly configuration\n */\nexport const DEFAULT_CONFIG: Required<\n Pick<TogglyConfig, 'baseUrl' | 'environment' | 'timeout' | 'debug' | 'evaluationMode'>\n> = {\n baseUrl: 'https://definitions.toggly.io',\n environment: 'Production',\n timeout: 10000,\n debug: false,\n evaluationMode: 'remote',\n};\n\n/**\n * Merge user config with defaults\n */\nexport function mergeConfig(config: TogglyConfig): TogglyConfig {\n return {\n ...DEFAULT_CONFIG,\n ...config,\n };\n}\n\n/**\n * Build the feature definitions URL.\n *\n * - `evaluationMode: 'remote'` (default): `/evaluated-signed/...` + context query params\n * - `evaluationMode: 'local'`: `/definitions-signed/...` with no evaluation context params\n */\nexport function buildDefinitionsUrl(\n config: TogglyConfig,\n context?: string | TogglyEvaluationContext\n): string {\n const { baseUrl, appKey, environment, groups, claims, evaluationMode } =\n mergeConfig(config);\n\n if (!appKey) {\n throw new Error('appKey is required');\n }\n\n const mode = evaluationMode ?? 'remote';\n const pathSegment =\n mode === 'local' ? 'definitions-signed' : 'evaluated-signed';\n const url = new URL(`${baseUrl}/${pathSegment}/${appKey}/${environment}`);\n\n if (mode === 'local') {\n return url.toString();\n }\n\n const fromParam =\n typeof context === 'string' ? { identity: context } : context;\n\n appendEvaluationContext(\n url,\n {\n identity: fromParam?.identity,\n groups: fromParam?.groups ?? groups,\n claims: fromParam?.claims ?? claims,\n },\n 'evaluated',\n );\n\n return url.toString();\n}\n\n/**\n * Evaluate a single feature\n */\nexport function isFeatureEnabled(\n flags: FeatureFlags,\n featureKey: string,\n defaultValue = false,\n entityContext?: TogglyEntityContext | null,\n): boolean {\n if (!flags || Object.keys(flags).length === 0) {\n return defaultValue;\n }\n\n const value = flags[featureKey];\n if (value === undefined) {\n return defaultValue;\n }\n\n return resolveEvaluatedDefinition(value, entityContext);\n}\n\nexport { registerContext, clearRegisteredContexts, normalizeEntityContext };\n\n/**\n * Locally evaluate a single feature against definitions-signed rules.\n */\nexport function isFeatureEnabledLocal(\n defsByKey: DefinitionsByKey | null | undefined,\n featureKey: string,\n evalCtx: EvalContext = {},\n defaultValue = false,\n): boolean {\n if (!defsByKey || defsByKey.size === 0) {\n return defaultValue;\n }\n\n if (!defsByKey.has(featureKey)) {\n return defaultValue;\n }\n\n return evaluateDefinitions(defsByKey, featureKey, evalCtx);\n}\n\n/**\n * Locally evaluate multiple features with requirement against definitions-signed rules.\n */\nexport function evaluateFeatureGateLocal(\n defsByKey: DefinitionsByKey | null | undefined,\n featureKeys: string[],\n requirement: FeatureRequirement = 'all',\n negate = false,\n defaultValue = false,\n evalCtx: EvalContext = {},\n): EvaluationResult {\n if (!defsByKey || defsByKey.size === 0) {\n return {\n enabled: negate ? !defaultValue : defaultValue,\n featureKeys,\n requirement,\n negated: negate,\n };\n }\n\n if (featureKeys.length === 0) {\n return {\n enabled: negate ? false : true,\n featureKeys,\n requirement,\n negated: negate,\n };\n }\n\n const enabled = evaluateLocalFeatureGate(\n defsByKey,\n featureKeys,\n requirement,\n negate,\n evalCtx,\n );\n\n return {\n enabled,\n featureKeys,\n requirement,\n negated: negate,\n };\n}\n\n/**\n * Evaluate multiple features with requirement\n */\nexport function evaluateFeatureGate(\n flags: FeatureFlags,\n featureKeys: string[],\n requirement: FeatureRequirement = 'all',\n negate = false,\n defaultValue = false,\n entityContext?: TogglyEntityContext | null,\n): EvaluationResult {\n if (!flags || Object.keys(flags).length === 0) {\n return {\n enabled: negate ? !defaultValue : defaultValue,\n featureKeys,\n requirement,\n negated: negate,\n };\n }\n\n if (featureKeys.length === 0) {\n return {\n enabled: negate ? false : true,\n featureKeys,\n requirement,\n negated: negate,\n };\n }\n\n const enabled = evaluateEvaluatedGate(\n flags,\n featureKeys,\n requirement,\n negate,\n entityContext,\n );\n\n return {\n enabled,\n featureKeys,\n requirement,\n negated: negate,\n };\n}\n\n/**\n * Normalize feature keys from options\n */\nexport function normalizeFeatureKeys(\n featureKey?: string,\n featureKeys?: string[]\n): string[] {\n const keys: string[] = [];\n\n if (featureKey) {\n keys.push(featureKey);\n }\n\n if (featureKeys && Array.isArray(featureKeys)) {\n keys.push(...featureKeys);\n }\n\n return [...new Set(keys)]; // Remove duplicates\n}\n\n/**\n * Create a debug logger\n */\nexport function createLogger(debug: boolean) {\n return {\n debug: (...args: unknown[]) => {\n if (debug) {\n console.debug('[Toggly]', ...args);\n }\n },\n info: (...args: unknown[]) => {\n if (debug) {\n console.info('[Toggly]', ...args);\n }\n },\n warn: (...args: unknown[]) => {\n console.warn('[Toggly]', ...args);\n },\n error: (...args: unknown[]) => {\n console.error('[Toggly]', ...args);\n },\n };\n}\n\n/**\n * Parse identity from various sources (cookie value, header, etc.)\n */\nexport function parseIdentity(value: string | null | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n\n // Try to parse as JSON (in case it's a stringified object)\n try {\n const parsed = JSON.parse(value);\n if (typeof parsed === 'string') {\n return parsed;\n }\n if (typeof parsed === 'object' && parsed !== null) {\n // Look for common identity fields\n return parsed.identity || parsed.id || parsed.userId || parsed.sub;\n }\n } catch {\n // Not JSON, use as-is\n }\n\n return value;\n}\n\n/**\n * Serialize feature flags for transport\n */\nexport function serializeFlags(flags: FeatureFlags): string {\n return JSON.stringify(flags);\n}\n\n/**\n * Deserialize feature flags from transport\n */\nexport function deserializeFlags(value: string | null | undefined): FeatureFlags {\n if (!value) {\n return {};\n }\n\n try {\n const parsed = JSON.parse(value);\n if (typeof parsed === 'object' && parsed !== null) {\n return parsed as FeatureFlags;\n }\n } catch {\n // Invalid JSON\n }\n\n return {};\n}\n\n/**\n * Check if we're running on the server\n */\nexport function isServer(): boolean {\n return !isClient();\n}\n\n/**\n * Check if we're running on the client\n */\nexport function isClient(): boolean {\n return (\n typeof globalThis !== 'undefined' &&\n typeof (globalThis as { window?: unknown }).window !== 'undefined'\n );\n}\n\n/**\n * Create a timeout promise\n */\nexport function createTimeout(ms: number): Promise<never> {\n return new Promise((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Request timed out after ${ms}ms`));\n }, ms);\n });\n}\n\n/**\n * Fetch with timeout\n */\nexport async function fetchWithTimeout(\n url: string,\n options: RequestInit = {},\n timeout = 10000\n): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n return response;\n } finally {\n clearTimeout(timeoutId);\n }\n}\n","/**\n * Constants for Toggly React Router SDK\n */\n\n/** Default base URL for Toggly API */\nexport const DEFAULT_BASE_URL = 'https://definitions.toggly.io';\n\n/** Default environment name */\nexport const DEFAULT_ENVIRONMENT = 'Production';\n\n/** Default request timeout in milliseconds */\nexport const DEFAULT_TIMEOUT = 10000;\n\n/** Cookie/storage key names */\nexport const STORAGE_KEYS = {\n /** Identity cookie/storage key */\n IDENTITY: 'toggly_identity',\n /** Feature flags cache key */\n FLAGS: 'toggly_flags',\n /** Config cache key */\n CONFIG: 'toggly_config',\n /** Last fetch timestamp key */\n LAST_FETCH: 'toggly_last_fetch',\n} as const;\n\n/** HTTP header names */\nexport const HEADERS = {\n /** Identity header */\n IDENTITY: 'x-toggly-identity',\n /** Feature flags header */\n FLAGS: 'x-toggly-flags',\n /** Cache control */\n CACHE_CONTROL: 'cache-control',\n} as const;\n\n/** Feature requirement types */\nexport const REQUIREMENT = {\n ALL: 'all' as const,\n ANY: 'any' as const,\n};\n\n/** Error codes */\nexport const ERROR_CODES = {\n NETWORK_ERROR: 'NETWORK_ERROR',\n CONFIG_ERROR: 'CONFIG_ERROR',\n TIMEOUT_ERROR: 'TIMEOUT_ERROR',\n PARSE_ERROR: 'PARSE_ERROR',\n UNKNOWN_ERROR: 'UNKNOWN_ERROR',\n} as const;\n\n/** Meta key for loader data */\nexport const TOGGLY_LOADER_KEY = '__toggly' as const;\n","const utf8Encoder = new TextEncoder()\n\n/**\n * FNV-1a 32-bit as signed int32 (matches Go `hash/fnv` New32a on `[]byte(s)`).\n * Hashes UTF-8 bytes — not UTF-16 code units from `String.charCodeAt`.\n */\nexport function hashIdentity(identity: string): number {\n let hash = 2166136261 // FNV offset basis\n const bytes = utf8Encoder.encode(identity)\n for (let i = 0; i < bytes.length; i++) {\n hash ^= bytes[i]!\n hash = Math.imul(hash, 16777619) // FNV prime\n }\n const unsigned = hash >>> 0\n return unsigned > 0x7fffffff ? unsigned - 0x100000000 : unsigned\n}\n\nexport function toProtobufTimestamp(date: Date = new Date()): {\n seconds: number\n nanos: number\n} {\n const ms = date.getTime()\n const seconds = Math.floor(ms / 1000)\n const nanos = (ms % 1000) * 1_000_000\n return { seconds, nanos }\n}\n\nexport function protobufTimestampToIso(ts: {\n seconds: number\n nanos: number\n}): string {\n return new Date(ts.seconds * 1000 + Math.floor(ts.nanos / 1_000_000)).toISOString()\n}\n","import { hashIdentity, toProtobufTimestamp } from './hash.js'\n\n/** Hard caps aligned with PHP/.NET unique-hash limits. */\nexport const MAX_UNIQUE_USER_HASHES_PER_FEATURE = 10_000\nexport const MAX_APPLICATION_UNIQUE_USER_HASHES = 10_000\n/** Max distinct feature keys retained in one in-memory batch. */\nexport const MAX_FEATURES_PER_BATCH = 500\n\nexport interface VariantStatsAgg {\n checkCount: number\n requestCount: number\n usedCount: number\n viewedCount: number\n}\n\nexport interface FeatureUsageAgg {\n variantStats: Map<string, VariantStatsAgg>\n uniqueUsersEnabled: Set<number>\n uniqueUsersDisabled: Set<number>\n uniqueUsersUsed: Set<number>\n uniqueUsersViewed: Set<number>\n uniqueUserHashes: Set<number>\n uniqueViewedUserHashes: Set<number>\n}\n\nexport interface UsageBatcherOptions {\n appKey: string\n environment: string\n instanceName?: string\n appVersion?: string\n processStartTime?: Date\n maxUniqueHashesPerFeature?: number\n maxApplicationUniqueHashes?: number\n maxFeatures?: number\n}\n\nexport interface FeatureStatPayload {\n appKey: string\n environment: string\n time: { seconds: number; nanos: number }\n stats: Array<{\n feature: string\n uniqueContextIdentifierEnabledCount: number\n uniqueContextIdentifierDisabledCount: number\n uniqueUsersUsedCount: number\n uniqueUserHashes: number[]\n uniqueViewedUserHashes: number[]\n variantStats: Record<string, VariantStatsAgg>\n }>\n totalUniqueUsers: number\n uniqueUserHashes: number[]\n instanceName?: string\n appVersion?: string\n processStartTime?: { seconds: number; nanos: number }\n /** Definition-refresh cache hits since last successful flush (optional proto field). */\n definitionCacheHits?: number\n /** Definition-refresh cache misses since last successful flush (optional proto field). */\n definitionCacheMisses?: number\n}\n\n/**\n * Wire payload plus uniqueness hash-set snapshots for soft-fail HTTPS restore.\n */\nexport interface UsageFlushBundle {\n payload: FeatureStatPayload\n uniqueUsersEnabled: Record<string, number[]>\n uniqueUsersDisabled: Record<string, number[]>\n uniqueUsersUsed: Record<string, number[]>\n}\n\nfunction emptyVariant(): VariantStatsAgg {\n return { checkCount: 0, requestCount: 0, usedCount: 0, viewedCount: 0 }\n}\n\nfunction emptyFeature(): FeatureUsageAgg {\n return {\n variantStats: new Map(),\n uniqueUsersEnabled: new Set(),\n uniqueUsersDisabled: new Set(),\n uniqueUsersUsed: new Set(),\n uniqueUsersViewed: new Set(),\n uniqueUserHashes: new Set(),\n uniqueViewedUserHashes: new Set(),\n }\n}\n\n/**\n * In-memory feature usage aggregator. Prefer variantStats over legacy scalars\n * (matches .NET TogglyUsageStatsProvider send shape).\n */\nexport class UsageBatcher {\n private readonly appKey: string\n private readonly environment: string\n private readonly instanceName?: string\n private readonly appVersion?: string\n private readonly processStartTime: Date\n private readonly maxUniqueHashesPerFeature: number\n private readonly maxApplicationUniqueHashes: number\n private readonly maxFeatures: number\n private perFeature = new Map<string, FeatureUsageAgg>()\n private appUnique = new Set<number>()\n private droppedFeatures = false\n private definitionCacheHits = 0\n private definitionCacheMisses = 0\n\n constructor(options: UsageBatcherOptions) {\n this.appKey = options.appKey\n this.environment = options.environment\n this.instanceName = options.instanceName\n this.appVersion = options.appVersion\n this.processStartTime = options.processStartTime ?? new Date()\n this.maxUniqueHashesPerFeature =\n options.maxUniqueHashesPerFeature ?? MAX_UNIQUE_USER_HASHES_PER_FEATURE\n this.maxApplicationUniqueHashes =\n options.maxApplicationUniqueHashes ?? MAX_APPLICATION_UNIQUE_USER_HASHES\n this.maxFeatures = options.maxFeatures ?? MAX_FEATURES_PER_BATCH\n }\n\n /** Count a definition-refresh outcome served from local/cache (not a new revision). */\n recordDefinitionCacheHit(): void {\n this.definitionCacheHits += 1\n }\n\n /** Count a definition-refresh that applied a new revision from the network. */\n recordDefinitionCacheMiss(): void {\n this.definitionCacheMisses += 1\n }\n\n private get(feature: string): FeatureUsageAgg | null {\n let agg = this.perFeature.get(feature)\n if (!agg) {\n if (this.perFeature.size >= this.maxFeatures) {\n this.droppedFeatures = true\n return null\n }\n agg = emptyFeature()\n this.perFeature.set(feature, agg)\n }\n return agg\n }\n\n private getVariant(agg: FeatureUsageAgg, variant: string): VariantStatsAgg {\n let stats = agg.variantStats.get(variant)\n if (!stats) {\n stats = emptyVariant()\n agg.variantStats.set(variant, stats)\n }\n return stats\n }\n\n private addHashCapped(set: Set<number>, hash: number, max: number): void {\n if (set.has(hash) || set.size < max) {\n set.add(hash)\n }\n }\n\n private trackAppUnique(hash: number): void {\n this.addHashCapped(this.appUnique, hash, this.maxApplicationUniqueHashes)\n }\n\n /**\n * Record a feature evaluation.\n *\n * `checkCount` increments on every call. `requestCount` maps to .NET\n * UniqueRequestEnabled/Disabled when `uniqueRequest` is true.\n */\n recordCheck(\n feature: string,\n enabled: boolean,\n identity?: string,\n variant?: string,\n uniqueRequest = false,\n ): void {\n const agg = this.get(feature)\n if (!agg) return\n\n const name = variant ?? (enabled ? 'enabled' : 'disabled')\n const stats = this.getVariant(agg, name)\n stats.checkCount += 1\n if (uniqueRequest) {\n stats.requestCount += 1\n }\n\n if (identity) {\n const hash = hashIdentity(identity)\n this.trackAppUnique(hash)\n if (enabled) {\n this.addHashCapped(agg.uniqueUsersEnabled, hash, this.maxUniqueHashesPerFeature)\n } else {\n this.addHashCapped(agg.uniqueUsersDisabled, hash, this.maxUniqueHashesPerFeature)\n }\n }\n }\n\n recordUsage(feature: string, identity?: string, variant = 'enabled'): void {\n const agg = this.get(feature)\n if (!agg) return\n\n this.getVariant(agg, variant).usedCount += 1\n if (identity) {\n const hash = hashIdentity(identity)\n this.trackAppUnique(hash)\n this.addHashCapped(agg.uniqueUsersUsed, hash, this.maxUniqueHashesPerFeature)\n this.addHashCapped(agg.uniqueUserHashes, hash, this.maxUniqueHashesPerFeature)\n }\n }\n\n recordView(feature: string, identity?: string, variant = 'enabled'): void {\n const agg = this.get(feature)\n if (!agg) return\n\n this.getVariant(agg, variant).viewedCount += 1\n if (identity) {\n const hash = hashIdentity(identity)\n this.trackAppUnique(hash)\n this.addHashCapped(agg.uniqueUsersViewed, hash, this.maxUniqueHashesPerFeature)\n this.addHashCapped(agg.uniqueViewedUserHashes, hash, this.maxUniqueHashesPerFeature)\n }\n }\n\n isEmpty(): boolean {\n return (\n this.perFeature.size === 0 &&\n this.appUnique.size === 0 &&\n this.definitionCacheHits === 0 &&\n this.definitionCacheMisses === 0\n )\n }\n\n hitFeatureCap(): boolean {\n return this.droppedFeatures\n }\n\n featureCount(): number {\n return this.perFeature.size\n }\n\n buildAndReset(): UsageFlushBundle | null {\n if (this.isEmpty()) {\n return null\n }\n\n const payload: FeatureStatPayload = {\n appKey: this.appKey,\n environment: this.environment,\n time: toProtobufTimestamp(),\n stats: [],\n totalUniqueUsers: this.appUnique.size,\n uniqueUserHashes: [...this.appUnique],\n processStartTime: toProtobufTimestamp(this.processStartTime),\n }\n\n if (this.instanceName) {\n payload.instanceName = this.instanceName\n }\n if (this.appVersion) {\n payload.appVersion = this.appVersion\n }\n if (this.definitionCacheHits > 0) {\n payload.definitionCacheHits = this.definitionCacheHits\n }\n if (this.definitionCacheMisses > 0) {\n payload.definitionCacheMisses = this.definitionCacheMisses\n }\n\n const uniqueUsersEnabled: Record<string, number[]> = {}\n const uniqueUsersDisabled: Record<string, number[]> = {}\n const uniqueUsersUsed: Record<string, number[]> = {}\n\n for (const [feature, agg] of this.perFeature) {\n const variantStats: Record<string, VariantStatsAgg> = {}\n for (const [name, stats] of agg.variantStats) {\n if (\n stats.checkCount > 0 ||\n stats.requestCount > 0 ||\n stats.usedCount > 0 ||\n stats.viewedCount > 0\n ) {\n variantStats[name] = { ...stats }\n }\n }\n\n if (agg.uniqueUsersEnabled.size > 0) {\n uniqueUsersEnabled[feature] = [...agg.uniqueUsersEnabled]\n }\n if (agg.uniqueUsersDisabled.size > 0) {\n uniqueUsersDisabled[feature] = [...agg.uniqueUsersDisabled]\n }\n if (agg.uniqueUsersUsed.size > 0) {\n uniqueUsersUsed[feature] = [...agg.uniqueUsersUsed]\n }\n\n payload.stats.push({\n feature,\n uniqueContextIdentifierEnabledCount: agg.uniqueUsersEnabled.size,\n uniqueContextIdentifierDisabledCount: agg.uniqueUsersDisabled.size,\n uniqueUsersUsedCount: agg.uniqueUsersUsed.size,\n uniqueUserHashes: [...agg.uniqueUserHashes],\n uniqueViewedUserHashes: [...agg.uniqueViewedUserHashes],\n variantStats,\n })\n }\n\n this.perFeature = new Map()\n this.appUnique = new Set()\n this.droppedFeatures = false\n this.definitionCacheHits = 0\n this.definitionCacheMisses = 0\n return {\n payload,\n uniqueUsersEnabled,\n uniqueUsersDisabled,\n uniqueUsersUsed,\n }\n }\n\n restoreFromBundle(bundle: UsageFlushBundle): void {\n const { payload } = bundle\n\n this.definitionCacheHits += payload.definitionCacheHits ?? 0\n this.definitionCacheMisses += payload.definitionCacheMisses ?? 0\n\n for (const hash of payload.uniqueUserHashes ?? []) {\n this.trackAppUnique(hash)\n }\n\n for (const stat of payload.stats ?? []) {\n const feature = stat.feature\n if (!feature) continue\n const agg = this.get(feature)\n if (!agg) continue\n\n for (const [name, vs] of Object.entries(stat.variantStats ?? {})) {\n const target = this.getVariant(agg, name)\n target.checkCount += vs.checkCount ?? 0\n target.requestCount += vs.requestCount ?? 0\n target.usedCount += vs.usedCount ?? 0\n target.viewedCount += vs.viewedCount ?? 0\n }\n for (const hash of stat.uniqueUserHashes ?? []) {\n this.addHashCapped(agg.uniqueUserHashes, hash, this.maxUniqueHashesPerFeature)\n }\n for (const hash of stat.uniqueViewedUserHashes ?? []) {\n this.addHashCapped(agg.uniqueViewedUserHashes, hash, this.maxUniqueHashesPerFeature)\n this.addHashCapped(agg.uniqueUsersViewed, hash, this.maxUniqueHashesPerFeature)\n }\n }\n\n this.mergeUniqueHashMap(bundle.uniqueUsersEnabled, 'uniqueUsersEnabled')\n this.mergeUniqueHashMap(bundle.uniqueUsersDisabled, 'uniqueUsersDisabled')\n this.mergeUniqueHashMap(bundle.uniqueUsersUsed, 'uniqueUsersUsed')\n }\n\n private mergeUniqueHashMap(\n snapshot: Record<string, number[]>,\n field: 'uniqueUsersEnabled' | 'uniqueUsersDisabled' | 'uniqueUsersUsed',\n ): void {\n for (const [feature, hashes] of Object.entries(snapshot ?? {})) {\n const agg = this.get(feature)\n if (!agg) continue\n for (const hash of hashes) {\n this.addHashCapped(agg[field], hash, this.maxUniqueHashesPerFeature)\n this.trackAppUnique(hash)\n }\n }\n }\n}\n","import { toProtobufTimestamp } from './hash.js'\n\n/** Max distinct metric keys (metric+feature) retained per measures/counters map. */\nexport const MAX_METRIC_KEYS_PER_BATCH = 500\n/** Max observation rows retained before flush. */\nexport const MAX_OBSERVATIONS_PER_BATCH = 1_000\n\nexport interface MetricsFeatureOptions {\n /** Optional feature key for experiment-style subcounts. */\n feature?: string\n /** Variant name (default: enabled). */\n variant?: string\n}\n\nexport interface MetricsBatcherOptions {\n appKey: string\n environment: string\n instanceName?: string\n maxMetricKeys?: number\n maxObservations?: number\n}\n\ntype MetricKey = string // `${metric}\\0${feature ?? ''}`\n\nexport interface MetricStatPayload {\n appKey: string\n environment: string\n time: { seconds: number; nanos: number }\n stats: Array<{\n metric: string\n feature?: string\n variantValues: Record<string, number>\n }>\n counters: Array<{\n metric: string\n feature?: string\n variantValues: Record<string, number>\n }>\n observations: Array<{\n time: { seconds: number; nanos: number }\n metric: string\n feature?: string\n variantValues: Record<string, number>\n }>\n instanceName?: string\n}\n\n/**\n * In-memory business metrics aggregator using variantValues maps (.NET parity).\n */\nexport class MetricsBatcher {\n private readonly appKey: string\n private readonly environment: string\n private readonly instanceName?: string\n private readonly maxMetricKeys: number\n private readonly maxObservations: number\n private measures = new Map<MetricKey, Map<string, number>>()\n private counters = new Map<MetricKey, Map<string, number>>()\n private observations: Array<{\n time: Date\n metric: string\n feature?: string\n variant: string\n value: number\n }> = []\n private droppedKeys = false\n\n constructor(options: MetricsBatcherOptions) {\n this.appKey = options.appKey\n this.environment = options.environment\n this.instanceName = options.instanceName\n this.maxMetricKeys = options.maxMetricKeys ?? MAX_METRIC_KEYS_PER_BATCH\n this.maxObservations = options.maxObservations ?? MAX_OBSERVATIONS_PER_BATCH\n }\n\n private key(metric: string, feature?: string): MetricKey {\n return `${metric}\\0${feature ?? ''}`\n }\n\n private parseKey(key: MetricKey): { metric: string; feature?: string } {\n const sep = key.indexOf('\\0')\n if (sep < 0) {\n return { metric: key }\n }\n const metric = key.slice(0, sep)\n const feature = key.slice(sep + 1)\n return feature ? { metric, feature } : { metric }\n }\n\n private addToMap(\n store: Map<MetricKey, Map<string, number>>,\n metric: string,\n value: number,\n options?: MetricsFeatureOptions,\n ): void {\n const variant = options?.variant ?? 'enabled'\n const mapKey = this.key(metric, options?.feature)\n let variants = store.get(mapKey)\n if (!variants) {\n if (store.size >= this.maxMetricKeys) {\n this.droppedKeys = true\n return\n }\n variants = new Map()\n store.set(mapKey, variants)\n }\n variants.set(variant, (variants.get(variant) ?? 0) + value)\n }\n\n measure(metric: string, value: number, options?: MetricsFeatureOptions): void {\n this.addToMap(this.measures, metric, value, options)\n }\n\n incrementCounter(metric: string, value = 1, options?: MetricsFeatureOptions): void {\n this.addToMap(this.counters, metric, value, options)\n }\n\n observe(metric: string, value: number, options?: MetricsFeatureOptions): void {\n if (this.observations.length >= this.maxObservations) {\n this.droppedKeys = true\n return\n }\n this.observations.push({\n time: new Date(),\n metric,\n feature: options?.feature,\n variant: options?.variant ?? 'enabled',\n value,\n })\n }\n\n isEmpty(): boolean {\n return this.measures.size === 0 && this.counters.size === 0 && this.observations.length === 0\n }\n\n hitCap(): boolean {\n return this.droppedKeys\n }\n\n private drainMap(\n store: Map<MetricKey, Map<string, number>>,\n ): Array<{ metric: string; feature?: string; variantValues: Record<string, number> }> {\n const out: Array<{ metric: string; feature?: string; variantValues: Record<string, number> }> =\n []\n for (const [key, variants] of store) {\n const parsed = this.parseKey(key)\n const variantValues: Record<string, number> = {}\n for (const [variant, value] of variants) {\n if (value !== 0) {\n variantValues[variant] = value\n }\n }\n if (Object.keys(variantValues).length > 0) {\n out.push({\n metric: parsed.metric,\n ...(parsed.feature ? { feature: parsed.feature } : {}),\n variantValues,\n })\n }\n }\n store.clear()\n return out\n }\n\n buildAndReset(): MetricStatPayload | null {\n if (this.isEmpty()) {\n return null\n }\n\n const observationGroups = new Map<\n string,\n {\n time: { seconds: number; nanos: number }\n metric: string\n feature?: string\n variantValues: Record<string, number>\n }\n >()\n\n for (const obs of this.observations) {\n const groupKey = `${obs.time.toISOString()}\\0${obs.metric}\\0${obs.feature ?? ''}`\n let group = observationGroups.get(groupKey)\n if (!group) {\n group = {\n time: toProtobufTimestamp(obs.time),\n metric: obs.metric,\n ...(obs.feature ? { feature: obs.feature } : {}),\n variantValues: {},\n }\n observationGroups.set(groupKey, group)\n }\n group.variantValues[obs.variant] = obs.value\n }\n this.observations = []\n this.droppedKeys = false\n\n const payload: MetricStatPayload = {\n appKey: this.appKey,\n environment: this.environment,\n time: toProtobufTimestamp(),\n stats: this.drainMap(this.measures),\n counters: this.drainMap(this.counters),\n observations: [...observationGroups.values()],\n }\n\n if (this.instanceName) {\n payload.instanceName = this.instanceName\n }\n\n return payload\n }\n\n restoreFromPayload(payload: MetricStatPayload): void {\n for (const stat of payload.stats ?? []) {\n for (const [variant, value] of Object.entries(stat.variantValues ?? {})) {\n this.measure(stat.metric, value, { feature: stat.feature, variant })\n }\n }\n for (const counter of payload.counters ?? []) {\n for (const [variant, value] of Object.entries(counter.variantValues ?? {})) {\n this.incrementCounter(counter.metric, value, {\n feature: counter.feature,\n variant,\n })\n }\n }\n for (const obs of payload.observations ?? []) {\n for (const [variant, value] of Object.entries(obs.variantValues ?? {})) {\n this.observe(obs.metric, value, { feature: obs.feature, variant })\n }\n }\n }\n}\n","export const SDK_ID = 'react-router'\nexport const SDK_VERSION = '1.0.0'\n\nexport const SDK_HEADER_ID = 'X-Toggly-Sdk'\nexport const SDK_HEADER_VERSION = 'X-Toggly-Sdk-Version'\n\nexport function sdkUserAgent(): string {\n return `toggly-${SDK_ID}/${SDK_VERSION}`\n}\n\nexport function sdkCustomHeaders(): Record<string, string> {\n return {\n [SDK_HEADER_ID]: SDK_ID,\n [SDK_HEADER_VERSION]: SDK_VERSION,\n }\n}\n\nexport function appendSdkQueryParams(params: URLSearchParams): void {\n params.set('sdk', SDK_ID)\n params.set('sdkVersion', SDK_VERSION)\n}\n\ntype BrowserLikeGlobal = typeof globalThis & {\n window?: unknown\n document?: unknown\n navigator?: { product?: string }\n}\n\n/** Browser and React Native use custom headers on HTTP (User-Agent is forbidden in browser fetch). */\nexport function usesSdkCustomHeaders(): boolean {\n const g = globalThis as BrowserLikeGlobal\n if (g.window !== undefined && g.document !== undefined) {\n return true\n }\n if (g.navigator?.product === 'ReactNative') {\n return true\n }\n return false\n}\n\nexport function buildDefinitionFetchHeaders(\n existing: Record<string, string> = {},\n): Record<string, string> {\n const headers = { ...existing }\n if (usesSdkCustomHeaders()) {\n Object.assign(headers, sdkCustomHeaders())\n } else {\n headers['User-Agent'] = sdkUserAgent()\n }\n return headers\n}\n","import { sdkUserAgent } from '../sdk-identity.js'\nimport { protobufTimestampToIso } from './hash.js'\nimport type { FeatureStatPayload } from './usage-batcher.js'\nimport type { MetricStatPayload } from './metrics-batcher.js'\n\nexport const DEFAULT_METRICS_BASE_URL = 'https://app.toggly.io/'\nexport const DEFAULT_TELEMETRY_FLUSH_MS = 60_000\n\nexport interface HttpsTelemetryClientOptions {\n metricsBaseUrl?: string\n userAgent?: string\n fetchImpl?: typeof fetch\n}\n\nfunction ensureTrailingSlash(baseUrl: string): string {\n return baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`\n}\n\n/** Convert protobuf-timestamp usage payload to gateway HTTPS JSON (PHP parity). */\nexport function usagePayloadToHttpJson(payload: FeatureStatPayload): Record<string, unknown> {\n return {\n ...payload,\n time: protobufTimestampToIso(payload.time),\n ...(payload.processStartTime\n ? { processStartTime: protobufTimestampToIso(payload.processStartTime) }\n : {}),\n }\n}\n\n/** Convert protobuf-timestamp metrics payload to gateway HTTPS JSON (PHP parity). */\nexport function metricsPayloadToHttpJson(payload: MetricStatPayload): Record<string, unknown> {\n return {\n ...payload,\n time: protobufTimestampToIso(payload.time),\n observations: (payload.observations ?? []).map((obs) => ({\n ...obs,\n time: protobufTimestampToIso(obs.time),\n })),\n }\n}\n\n/**\n * Soft-fail HTTPS JSON client for gateway-accepted usage/metrics paths.\n * Network and non-2xx errors never throw to callers.\n */\nexport class HttpsTelemetryClient {\n private readonly baseUrl: string\n private readonly userAgent: string\n private readonly fetchImpl: typeof fetch\n\n constructor(options: HttpsTelemetryClientOptions = {}) {\n this.baseUrl = ensureTrailingSlash(options.metricsBaseUrl ?? DEFAULT_METRICS_BASE_URL)\n this.userAgent = options.userAgent ?? sdkUserAgent()\n this.fetchImpl = options.fetchImpl ?? fetch.bind(globalThis)\n }\n\n getUserAgent(): string {\n return this.userAgent\n }\n\n getBaseUrl(): string {\n return this.baseUrl\n }\n\n /**\n * POST JSON. Returns true on 2xx, false on soft-fail (network / non-2xx).\n */\n async post(path: string, body: unknown): Promise<boolean> {\n try {\n const url = new URL(path.replace(/^\\//, ''), this.baseUrl).toString()\n const response = await this.fetchImpl(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'User-Agent': this.userAgent,\n },\n body: JSON.stringify(body),\n })\n return response.ok\n } catch {\n return false\n }\n }\n\n sendUsageStats(payload: FeatureStatPayload): Promise<boolean> {\n return this.post('api/usage/stats', usagePayloadToHttpJson(payload))\n }\n\n sendMetrics(payload: MetricStatPayload): Promise<boolean> {\n return this.post('api/metrics', metricsPayloadToHttpJson(payload))\n }\n}\n\nexport function resolveMetricsBaseUrl(raw?: string): string {\n const trimmed = (raw ?? '').trim()\n if (!trimmed) {\n return DEFAULT_METRICS_BASE_URL\n }\n return ensureTrailingSlash(trimmed)\n}\n\nexport function isTelemetryEnvDisabled(): boolean {\n try {\n return typeof process !== 'undefined' && process.env?.TOGGLY_DISABLE_TELEMETRY === '1'\n } catch {\n return false\n }\n}\n\n/**\n * Resolve an enable flag. `TOGGLY_DISABLE_TELEMETRY=1` is authoritative and\n * wins over any explicit `true` in config.\n */\nexport function resolveTelemetryEnableFlag(\n explicit: boolean | undefined,\n defaultWhenUnset: boolean,\n): boolean {\n if (isTelemetryEnvDisabled()) {\n return false\n }\n return explicit ?? defaultWhenUnset\n}\n","import {\n DEFAULT_METRICS_BASE_URL,\n DEFAULT_TELEMETRY_FLUSH_MS,\n HttpsTelemetryClient,\n resolveMetricsBaseUrl,\n resolveTelemetryEnableFlag,\n} from './https-client.js'\nimport { MetricsBatcher, type MetricsFeatureOptions } from './metrics-batcher.js'\nimport { UsageBatcher, type UsageFlushBundle } from './usage-batcher.js'\nimport type { MetricStatPayload } from './metrics-batcher.js'\n\nexport interface UsageSender {\n sendStats(request: Record<string, unknown>): Promise<unknown>\n close?(): void\n}\n\nexport interface MetricsSender {\n sendMetrics(request: Record<string, unknown>): Promise<unknown>\n close?(): void\n}\n\nexport type TelemetryTransport = 'grpc' | 'https'\n\nexport interface TelemetryConfig {\n appKey: string\n environment: string\n metricsBaseUrl?: string\n enableUsageTracking?: boolean\n enableMetrics?: boolean\n usageFlushInterval?: number\n metricsFlushInterval?: number\n instanceName?: string\n appVersion?: string\n debug?: boolean\n /**\n * Transport used when clients are not injected.\n * - `grpc`: expect injected usage/metrics clients (server creates them)\n * - `https`: build soft-fail fetch clients to api/usage/stats + api/metrics\n */\n transport?: TelemetryTransport\n /**\n * When true (default for Node/server), attach beforeExit/SIGTERM/SIGINT flush.\n * Edge runtimes must set false — signal handlers are not available / unsafe.\n */\n attachProcessHandlers?: boolean\n /** When true, restore batches if HTTPS/send returns soft-fail (default for https). */\n restoreOnSendFailure?: boolean\n fetchImpl?: typeof fetch\n /** Injected clients for tests or gRPC transport. */\n usageClient?: UsageSender | null\n metricsClient?: MetricsSender | null\n}\n\nexport interface TelemetryLogger {\n debug: (...args: unknown[]) => void\n warn: (...args: unknown[]) => void\n error: (...args: unknown[]) => void\n}\n\n/**\n * Owns usage + metrics batchers, flush timers, and optional process signal handlers.\n */\nexport class TelemetryRuntime {\n private usageBatcher: UsageBatcher | null = null\n private metricsBatcher: MetricsBatcher | null = null\n private usageClient: UsageSender | null = null\n private metricsClient: MetricsSender | null = null\n private httpsClient: HttpsTelemetryClient | null = null\n private usageTimer: ReturnType<typeof setInterval> | null = null\n private metricsTimer: ReturnType<typeof setInterval> | null = null\n /** Single-flight drain promise (CF Worker TelemetryRuntime pattern). */\n private flushInFlight: Promise<void> | null = null\n /** Set when flush/close is requested during an in-flight drain. */\n private pendingDrain = false\n private closed = false\n private readonly processStartTime = new Date()\n private readonly signalHandlers: Array<{\n event: NodeJS.Signals | 'beforeExit'\n handler: (...args: unknown[]) => void\n }> = []\n private readonly logger: TelemetryLogger\n private readonly restoreOnSendFailure: boolean\n private readonly attachProcessHandlers: boolean\n private readonly transport: TelemetryTransport\n private readonly config: Required<\n Pick<\n TelemetryConfig,\n | 'appKey'\n | 'environment'\n | 'metricsBaseUrl'\n | 'enableUsageTracking'\n | 'enableMetrics'\n | 'usageFlushInterval'\n | 'metricsFlushInterval'\n >\n > &\n Pick<TelemetryConfig, 'instanceName' | 'appVersion' | 'usageClient' | 'metricsClient' | 'fetchImpl'>\n\n constructor(config: TelemetryConfig, logger?: TelemetryLogger) {\n const hasAppKey = Boolean(config.appKey)\n this.transport = config.transport ?? 'grpc'\n this.attachProcessHandlers = config.attachProcessHandlers ?? this.transport === 'grpc'\n this.restoreOnSendFailure =\n config.restoreOnSendFailure ?? this.transport === 'https'\n this.config = {\n appKey: config.appKey,\n environment: config.environment,\n metricsBaseUrl: resolveMetricsBaseUrl(config.metricsBaseUrl ?? DEFAULT_METRICS_BASE_URL),\n // TOGGLY_DISABLE_TELEMETRY=1 wins over explicit true.\n enableUsageTracking: resolveTelemetryEnableFlag(\n config.enableUsageTracking,\n hasAppKey,\n ),\n enableMetrics: resolveTelemetryEnableFlag(config.enableMetrics, hasAppKey),\n usageFlushInterval: config.usageFlushInterval ?? DEFAULT_TELEMETRY_FLUSH_MS,\n metricsFlushInterval: config.metricsFlushInterval ?? DEFAULT_TELEMETRY_FLUSH_MS,\n instanceName: config.instanceName,\n appVersion: config.appVersion,\n usageClient: config.usageClient,\n metricsClient: config.metricsClient,\n fetchImpl: config.fetchImpl,\n }\n this.logger = logger ?? {\n debug: () => {},\n warn: (...args) => console.warn('[Toggly]', ...args),\n error: (...args) => console.error('[Toggly]', ...args),\n }\n }\n\n get usageEnabled(): boolean {\n return this.config.enableUsageTracking && !this.closed\n }\n\n get metricsEnabled(): boolean {\n return this.config.enableMetrics && !this.closed\n }\n\n start(): void {\n if (this.closed) return\n if (!this.config.enableUsageTracking && !this.config.enableMetrics) {\n return\n }\n\n if (this.config.usageClient !== undefined || this.config.metricsClient !== undefined) {\n this.usageClient = (this.config.usageClient as UsageSender) ?? null\n this.metricsClient = (this.config.metricsClient as MetricsSender) ?? null\n } else if (this.transport === 'https') {\n this.httpsClient = new HttpsTelemetryClient({\n metricsBaseUrl: this.config.metricsBaseUrl,\n fetchImpl: this.config.fetchImpl,\n })\n this.usageClient = {\n sendStats: async (request) => {\n const ok = await this.httpsClient!.sendUsageStats(\n request as unknown as Parameters<HttpsTelemetryClient['sendUsageStats']>[0],\n )\n return { ok }\n },\n }\n this.metricsClient = {\n sendMetrics: async (request) => {\n const ok = await this.httpsClient!.sendMetrics(\n request as unknown as Parameters<HttpsTelemetryClient['sendMetrics']>[0],\n )\n return { ok }\n },\n }\n } else {\n this.logger.warn(\n 'Usage/metrics enabled with gRPC transport but no clients were injected. ' +\n 'Pass usageClient/metricsClient from createGrpcClients (optional @grpc/grpc-js).',\n )\n }\n\n if (this.config.enableUsageTracking) {\n this.usageBatcher = new UsageBatcher({\n appKey: this.config.appKey,\n environment: this.config.environment,\n instanceName: this.config.instanceName,\n appVersion: this.config.appVersion,\n processStartTime: this.processStartTime,\n })\n if (this.config.usageFlushInterval > 0) {\n this.usageTimer = setInterval(() => {\n void this.flush()\n }, this.config.usageFlushInterval)\n this.usageTimer.unref?.()\n }\n }\n\n if (this.config.enableMetrics) {\n this.metricsBatcher = new MetricsBatcher({\n appKey: this.config.appKey,\n environment: this.config.environment,\n instanceName: this.config.instanceName,\n })\n if (this.config.metricsFlushInterval > 0) {\n this.metricsTimer = setInterval(() => {\n void this.flush()\n }, this.config.metricsFlushInterval)\n this.metricsTimer.unref?.()\n }\n }\n\n if (this.attachProcessHandlers) {\n this.attachHandlers()\n }\n }\n\n /** Best-effort flush budget before re-emitting the signal so Node can exit. */\n static readonly SIGNAL_FLUSH_TIMEOUT_MS = 2_000\n\n /* istanbul ignore next -- process signal exit paths; covered by attach/detach tests */\n private attachHandlers(): void {\n if (typeof process === 'undefined' || typeof process.on !== 'function') {\n return\n }\n\n const flush = () => {\n void this.flushAll()\n }\n\n process.on('beforeExit', flush)\n this.signalHandlers.push({ event: 'beforeExit', handler: flush })\n\n for (const signal of ['SIGTERM', 'SIGINT'] as const) {\n try {\n const onSignal = () => {\n void this.handleProcessSignal(signal)\n }\n process.on(signal, onSignal)\n this.signalHandlers.push({ event: signal, handler: onSignal })\n } catch {\n // Some runtimes disallow signal handlers\n }\n }\n }\n\n /* istanbul ignore next -- process.kill / process.exit on SIGTERM/SIGINT */\n private async handleProcessSignal(signal: NodeJS.Signals): Promise<void> {\n try {\n await Promise.race([\n this.close(),\n new Promise<void>((resolve) => {\n const timer = setTimeout(resolve, TelemetryRuntime.SIGNAL_FLUSH_TIMEOUT_MS)\n timer.unref?.()\n }),\n ])\n } catch {\n // Best-effort flush; still exit\n } finally {\n this.detachProcessHandlers()\n this.reemitSignalAndExit(signal)\n }\n }\n\n /* istanbul ignore next -- process.kill / process.exit on SIGTERM/SIGINT */\n private reemitSignalAndExit(signal: NodeJS.Signals): void {\n try {\n process.kill(process.pid, signal)\n } catch {\n const code = signal === 'SIGINT' ? 130 : signal === 'SIGTERM' ? 143 : 0\n process.exit(code)\n }\n }\n\n private detachProcessHandlers(): void {\n if (typeof process === 'undefined' || typeof process.off !== 'function') {\n return\n }\n for (const { event, handler } of this.signalHandlers) {\n process.off(event, handler)\n }\n this.signalHandlers.length = 0\n }\n\n recordCheck(\n feature: string,\n enabled: boolean,\n identity?: string,\n variant?: string,\n uniqueRequest = false,\n ): void {\n this.usageBatcher?.recordCheck(feature, enabled, identity, variant, uniqueRequest)\n }\n\n recordUsage(feature: string, identity?: string, variant?: string): void {\n this.usageBatcher?.recordUsage(feature, identity, variant)\n }\n\n recordView(feature: string, identity?: string, variant?: string): void {\n this.usageBatcher?.recordView(feature, identity, variant)\n }\n\n recordDefinitionCacheHit(): void {\n this.usageBatcher?.recordDefinitionCacheHit()\n }\n\n recordDefinitionCacheMiss(): void {\n this.usageBatcher?.recordDefinitionCacheMiss()\n }\n\n measure(metric: string, value: number, options?: MetricsFeatureOptions): void {\n this.metricsBatcher?.measure(metric, value, options)\n }\n\n incrementCounter(metric: string, value = 1, options?: MetricsFeatureOptions): void {\n this.metricsBatcher?.incrementCounter(metric, value, options)\n }\n\n observe(metric: string, value: number, options?: MetricsFeatureOptions): void {\n this.metricsBatcher?.observe(metric, value, options)\n }\n\n shouldFlushForCaps(): boolean {\n return Boolean(this.usageBatcher?.hitFeatureCap() || this.metricsBatcher?.hitCap())\n }\n\n /**\n * Single-flight flush with pending-drain follow-up (CF Worker parity).\n * Concurrent flush/close during an active send coalesces onto one drain and\n * runs another pass so batches recorded mid-send are not stranded.\n */\n async flush(): Promise<void> {\n this.pendingDrain = true\n if (this.flushInFlight) {\n return this.flushInFlight\n }\n\n this.flushInFlight = this.drainUntilIdle()\n return this.flushInFlight\n }\n\n async flushAll(): Promise<void> {\n await this.flush()\n }\n\n /** @deprecated Prefer {@link flush}; kept for callers that split usage/metrics. */\n async flushUsage(): Promise<void> {\n await this.flush()\n }\n\n /** @deprecated Prefer {@link flush}; kept for callers that split usage/metrics. */\n async flushMetrics(): Promise<void> {\n await this.flush()\n }\n\n private async drainUntilIdle(): Promise<void> {\n try {\n while (this.pendingDrain) {\n this.pendingDrain = false\n await this.flushInternal()\n }\n } finally {\n this.flushInFlight = null\n // Race: another flush()/close() set pendingDrain after the while check\n // but while we still owned inFlight — start a follow-up drain.\n if (this.pendingDrain) {\n await this.flush()\n }\n }\n }\n\n private async flushInternal(): Promise<void> {\n await Promise.all([this.sendUsageOnce(), this.sendMetricsOnce()])\n }\n\n private async sendUsageOnce(): Promise<void> {\n if (!this.usageBatcher) return\n\n const client = this.usageClient\n if (!client?.sendStats) {\n this.logger.debug('Usage flush skipped: no usage client')\n return\n }\n\n const bundle = this.usageBatcher.buildAndReset()\n if (!bundle) return\n\n try {\n const result = await client.sendStats(bundle.payload as unknown as Record<string, unknown>)\n if (\n this.restoreOnSendFailure &&\n result &&\n typeof result === 'object' &&\n 'ok' in result &&\n (result as { ok: boolean }).ok === false\n ) {\n this.usageBatcher.restoreFromBundle(bundle)\n this.logger.debug('Usage HTTPS soft-fail; batch restored')\n }\n } catch (error) {\n if (this.restoreOnSendFailure) {\n this.usageBatcher.restoreFromBundle(bundle)\n }\n this.logger.error('Failed to send usage stats:', error)\n }\n }\n\n private async sendMetricsOnce(): Promise<void> {\n if (!this.metricsBatcher) return\n\n const client = this.metricsClient\n if (!client?.sendMetrics) {\n this.logger.debug('Metrics flush skipped: no metrics client')\n return\n }\n\n const payload = this.metricsBatcher.buildAndReset()\n if (!payload) return\n\n try {\n const result = await client.sendMetrics(payload as unknown as Record<string, unknown>)\n if (\n this.restoreOnSendFailure &&\n result &&\n typeof result === 'object' &&\n 'ok' in result &&\n (result as { ok: boolean }).ok === false\n ) {\n this.metricsBatcher.restoreFromPayload(payload)\n this.logger.debug('Metrics HTTPS soft-fail; batch restored')\n }\n } catch (error) {\n if (this.restoreOnSendFailure) {\n this.metricsBatcher.restoreFromPayload(payload)\n }\n this.logger.error('Failed to send metrics:', error)\n }\n }\n\n async close(): Promise<void> {\n if (this.closed) return\n this.closed = true\n\n if (this.usageTimer) {\n clearInterval(this.usageTimer)\n this.usageTimer = null\n }\n if (this.metricsTimer) {\n clearInterval(this.metricsTimer)\n this.metricsTimer = null\n }\n\n this.detachProcessHandlers()\n\n try {\n // Sets pendingDrain so data recorded during an in-flight send is drained.\n await this.flush()\n } finally {\n try {\n this.usageClient?.close?.()\n } catch {\n // ignore\n }\n try {\n this.metricsClient?.close?.()\n } catch {\n // ignore\n }\n this.usageClient = null\n this.metricsClient = null\n this.httpsClient = null\n this.usageBatcher = null\n this.metricsBatcher = null\n }\n }\n}\n\nexport type { UsageFlushBundle, MetricStatPayload }\n","/**\n * Request-scoped ambient EvalContext for React Router loaders and actions.\n * Never mutates the process-global client identity — bind overrides here only.\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport type { IdentityContext } from '../core';\n\nconst ambientStore = new AsyncLocalStorage<IdentityContext>();\n\nfunction snapshot(ctx: IdentityContext): IdentityContext {\n return {\n ...(ctx.identity !== undefined ? { identity: ctx.identity } : {}),\n ...(ctx.groups !== undefined ? { groups: ctx.groups } : {}),\n ...(ctx.claims !== undefined ? { claims: ctx.claims } : {}),\n ...(ctx.traits !== undefined ? { traits: ctx.traits } : {}),\n ...(ctx.request !== undefined ? { request: ctx.request } : {}),\n };\n}\n\n/**\n * Ambient IdentityContext for the current async scope, if any.\n * Returns a shallow copy so callers cannot mutate the ALS store.\n */\nexport function getAmbientEvalOverrides(): IdentityContext | undefined {\n const store = ambientStore.getStore();\n return store ? snapshot(store) : undefined;\n}\n\n/**\n * Run `fn` with the given EvalContext bound for the async scope.\n * Nested calls replace (do not deep-merge) the ambient store for their duration.\n */\nexport function runWithEvalContext<T>(\n ctx: IdentityContext,\n fn: () => T,\n): T {\n return ambientStore.run(snapshot(ctx), fn);\n}\n\n/**\n * Merge ambient defaults with per-call IdentityContext. Explicit per-call\n * fields win field-by-field via `??`, so a field only overrides ambient when\n * its value is not `undefined` — a key present with an `undefined` value\n * (e.g. from `{ claims: user.claims }` where `user.claims` is optional)\n * falls back to ambient, same as an omitted key. No `IdentityContext` field\n * is typed nullable, so `??` and an explicit `!== undefined` check are\n * equivalent here; prefer `??` per lint (S6606).\n */\nexport function mergeIdentityContext(\n ambient: IdentityContext | undefined,\n perCall: IdentityContext | undefined,\n): IdentityContext | undefined {\n if (ambient == null && perCall == null) {\n return undefined;\n }\n if (ambient == null) {\n return perCall ? snapshot(perCall) : undefined;\n }\n if (perCall == null) {\n return snapshot(ambient);\n }\n\n return {\n identity: perCall.identity ?? ambient.identity,\n groups: perCall.groups ?? ambient.groups,\n claims: perCall.claims ?? ambient.claims,\n traits: perCall.traits ?? ambient.traits,\n request: perCall.request ?? ambient.request,\n };\n}\n","/**\n * Build ambient IdentityContext / EvalContext from a Remix Request.\n */\n\nimport {\n fromHttpRequest,\n parseIdentity,\n HEADERS,\n STORAGE_KEYS,\n type IdentityContext,\n} from '../core';\n\n/**\n * Providers that build ambient EvalContext for a Remix request.\n */\nexport interface EvalContextProviders {\n /** Extract identity from the request */\n getIdentity?: (\n request: Request,\n ) => string | undefined | Promise<string | undefined>;\n /** Extract identity from cookies (fallback when getIdentity is unset) */\n getIdentityFromCookies?: (cookies: string | null) => string | undefined;\n /** Extract group memberships for Targeting / Percentage filters */\n getGroups?: (\n request: Request,\n ) => string[] | undefined | Promise<string[] | undefined>;\n /** Extract principal / JWT-style claims for UserClaims filters */\n getClaims?: (\n request: Request,\n ) =>\n | Record<string, string>\n | undefined\n | Promise<Record<string, string> | undefined>;\n /**\n * Full ambient context. When provided, returned fields are used;\n * missing `request` keys are still filled from headers via `fromHttpRequest`.\n */\n getContext?: (\n request: Request,\n ) => IdentityContext | Promise<IdentityContext>;\n}\n\nfunction headersToBag(\n headers: Headers,\n): Record<string, string | string[] | undefined> {\n const bag: Record<string, string | string[] | undefined> = {};\n headers.forEach((value, key) => {\n bag[key] = value;\n });\n return bag;\n}\n\nfunction getIdentityFromRequest(\n request: Request,\n customCookieParser?: (cookies: string | null) => string | undefined,\n): string | undefined {\n const headerIdentity = request.headers.get(HEADERS.IDENTITY);\n if (headerIdentity) {\n return parseIdentity(headerIdentity);\n }\n\n const cookies = request.headers.get('cookie');\n\n if (customCookieParser) {\n return customCookieParser(cookies);\n }\n\n if (cookies) {\n const identity = parseCookie(cookies, STORAGE_KEYS.IDENTITY);\n if (identity) {\n return parseIdentity(identity);\n }\n }\n\n return undefined;\n}\n\nfunction parseCookie(cookies: string, name: string): string | undefined {\n const pairs = cookies.split(';');\n\n for (const pair of pairs) {\n const [key, value] = pair.trim().split('=');\n if (key === name && value) {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Resolve ambient IdentityContext for a Remix Request.\n * Uses `getContext` when provided; otherwise getIdentity / getGroups / getClaims.\n * Always fills missing `request` fields from headers via `fromHttpRequest`.\n * UserClaims must be supplied via `claims` (not `traits`).\n */\nexport async function extractEvalContext(\n request: Request,\n providers: EvalContextProviders = {},\n): Promise<IdentityContext> {\n const headers = headersToBag(request.headers);\n const headerRequest = fromHttpRequest(headers).request;\n\n if (providers.getContext) {\n const custom = await providers.getContext(request);\n return {\n identity: custom.identity,\n groups: custom.groups,\n // Prefer claims for UserClaims; ignore traits-as-claims from custom\n claims: custom.claims,\n traits: custom.traits,\n request: {\n ...headerRequest,\n ...custom.request,\n },\n };\n }\n\n let identity: string | undefined;\n if (providers.getIdentity) {\n identity = await providers.getIdentity(request);\n } else {\n identity = getIdentityFromRequest(\n request,\n providers.getIdentityFromCookies,\n );\n }\n\n const groups = providers.getGroups\n ? await providers.getGroups(request)\n : undefined;\n const claims = providers.getClaims\n ? await providers.getClaims(request)\n : undefined;\n\n const fromReq = fromHttpRequest(headers, { identity, groups, claims });\n\n return {\n identity: fromReq.identity,\n groups: fromReq.groups,\n claims: fromReq.claims,\n request: fromReq.request,\n };\n}\n\nexport { getIdentityFromRequest, parseCookie };\n","export const SDK_ID = 'react-router';\nexport const SDK_VERSION = '1.0.0';\n\nexport const SDK_HEADER_ID = 'X-Toggly-Sdk';\nexport const SDK_HEADER_VERSION = 'X-Toggly-Sdk-Version';\n\nexport function sdkUserAgent(): string {\n return `toggly-${SDK_ID}/${SDK_VERSION}`;\n}\n\nexport function sdkCustomHeaders(): Record<string, string> {\n return {\n [SDK_HEADER_ID]: SDK_ID,\n [SDK_HEADER_VERSION]: SDK_VERSION,\n };\n}\n\nexport function appendSdkQueryParams(params: URLSearchParams): void {\n params.set('sdk', SDK_ID);\n params.set('sdkVersion', SDK_VERSION);\n}\n\ntype BrowserLikeGlobal = typeof globalThis & {\n window?: unknown;\n document?: unknown;\n navigator?: { product?: string };\n};\n\n/** Browser and React Native use custom headers on HTTP (User-Agent is forbidden in browser fetch). */\nexport function usesSdkCustomHeaders(): boolean {\n const g = globalThis as BrowserLikeGlobal;\n if (g.window !== undefined && g.document !== undefined) {\n return true;\n }\n if (g.navigator?.product === 'ReactNative') {\n return true;\n }\n return false;\n}\n\nexport function buildDefinitionFetchHeaders(existing: Record<string, string> = {}): Record<string, string> {\n const headers = { ...existing };\n if (usesSdkCustomHeaders()) {\n Object.assign(headers, sdkCustomHeaders());\n } else {\n headers['User-Agent'] = sdkUserAgent();\n }\n return headers;\n}\n","import { appendSdkQueryParams } from './sdk-identity';\n\nexport const DEFINITIONS_REVISION_HEADER = 'X-Definitions-Revision';\n\nexport const WS_RECONNECT_BASE_MS = 5000;\nexport const WS_RECONNECT_MAX_MS = 60000;\nexport const REFRESH_DEBOUNCE_MS = 300;\n\nexport interface WsSyncMessage {\n type: string;\n etag?: string;\n lastUpdated?: number;\n unchanged?: boolean;\n kid?: string;\n}\n\nexport function buildWebSocketUrl(baseUri: string, appKey: string, cachedEtag: string | null): string {\n const wsBase = baseUri\n .replace(/^https:\\/\\//, 'wss://')\n .replace(/^http:\\/\\//, 'ws://')\n .replace(/\\/$/, '');\n const params = new URLSearchParams();\n if (cachedEtag) {\n params.set('rev', cachedEtag);\n }\n appendSdkQueryParams(params);\n const query = params.toString();\n return `${wsBase}/${appKey}/ws${query ? `?${query}` : ''}`;\n}\n\nexport function getNextReconnectDelayMs(attempt: number): number {\n return Math.min(WS_RECONNECT_BASE_MS * Math.pow(2, attempt), WS_RECONNECT_MAX_MS);\n}\n\nexport function shouldFetchOnSync(message: WsSyncMessage, cachedEtag: string | null): boolean {\n if (message.type !== 'sync') {\n return false;\n }\n if (message.unchanged === true) {\n return false;\n }\n if (!cachedEtag) {\n return true;\n }\n if (message.etag && message.etag !== cachedEtag) {\n return true;\n }\n return false;\n}\n\nexport function shouldFetchOnFlagsUpdated(message: WsSyncMessage, cachedEtag: string | null): boolean {\n if (message.type !== 'flags-updated' && message.type !== 'update') {\n return false;\n }\n if (!message.etag || !cachedEtag) {\n return true;\n }\n return message.etag !== cachedEtag;\n}\n\nexport function shouldFetchOnSigningKeyUpdated(message: WsSyncMessage): boolean {\n return message.type === 'signing-key-updated';\n}\n\nexport type FlagsUpdatedRefreshPlan =\n | { action: 'none' }\n | { action: 'refresh-jwks' }\n | { action: 'refresh-pinned'; pin: string | null };\n\nexport function planFlagsUpdatedRefresh(\n message: WsSyncMessage,\n previousRevision: string | null,\n): FlagsUpdatedRefreshPlan {\n if (shouldFetchOnSigningKeyUpdated(message)) {\n return { action: 'refresh-jwks' };\n }\n if (shouldFetchOnFlagsUpdated(message, previousRevision)) {\n return { action: 'refresh-pinned', pin: message.etag ?? null };\n }\n return { action: 'none' };\n}\n\nexport function applyFlagsUpdatedPlan(\n plan: FlagsUpdatedRefreshPlan,\n message: WsSyncMessage,\n hooks: {\n refreshJwks: () => void;\n refreshPinned: (pin: string | null) => void;\n cacheEtagIfPresent: (etag: string) => void;\n },\n): void {\n if (plan.action === 'refresh-jwks') {\n hooks.refreshJwks();\n return;\n }\n if (plan.action === 'refresh-pinned') {\n hooks.refreshPinned(plan.pin);\n return;\n }\n if (message.etag) {\n hooks.cacheEtagIfPresent(message.etag);\n }\n}\n\n\nexport function extractDefinitionsRevision(response: Response): string | null {\n if (!response.headers?.get) {\n return null;\n }\n return response.headers.get(DEFINITIONS_REVISION_HEADER) ?? response.headers.get('ETag');\n}\n\n\n/**\n * Append `?rev=` for a cache-proof definitions GET after `flags-updated`.\n * Invariant: never cache a WebSocket etag before HTTP confirms the revision;\n * post-notify GETs should use `?rev=` and must not send If-None-Match.\n */\nexport function appendDefinitionsRevisionParam(\n url: string,\n rev: string | null | undefined,\n): string {\n if (!rev) {\n return url;\n }\n try {\n const parsed = new URL(url);\n parsed.searchParams.set('rev', rev);\n return parsed.toString();\n } catch {\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}rev=${encodeURIComponent(rev)}`;\n }\n}\n","import { createRequire } from 'node:module'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { sdkUserAgent } from '../sdk-identity.js'\nimport { DEFAULT_METRICS_BASE_URL } from './https-client.js'\n\ndeclare global {\n var __TOGGLY_MODULE_URL__: string\n}\n\n// Rollup replaces this test seam with the native module URL for each output:\n// `import.meta.url` in ESM and `pathToFileURL(__filename).href` in CommonJS.\n// This lets a packed SDK find its proto files without asking the consuming app\n// to supply a process-global filename.\nconst thisModuleUrl = globalThis.__TOGGLY_MODULE_URL__\nconst nodeRequire = createRequire(thisModuleUrl)\n\n/**\n * Resolve vendored proto/ for source (src/telemetry), bundled dist/ ESM+CJS,\n * and the published package layout (files includes \"proto\").\n */\nexport function resolveProtoRoot(moduleUrl: string = thisModuleUrl): string {\n const moduleDir = path.dirname(fileURLToPath(moduleUrl))\n const candidates = [\n // Built dist/cjs|esm/telemetry/grpc.js → packageRoot/proto\n path.resolve(moduleDir, '..', '..', '..', 'proto'),\n // Built dist/telemetry/grpc.js → packageRoot/proto\n path.resolve(moduleDir, '..', '..', 'proto'),\n // Built dist/index.js sibling layouts\n path.resolve(moduleDir, '..', 'proto'),\n // Source src/telemetry/*.ts → packageRoot/proto\n path.resolve(moduleDir, '..', '..', 'proto'),\n path.resolve(moduleDir, 'proto'),\n ]\n for (const candidate of candidates) {\n if (fs.existsSync(path.join(candidate, 'usage.proto'))) {\n return candidate\n }\n }\n return candidates[0] ?? path.resolve(moduleDir, '..', '..', 'proto')\n}\n\nconst protoRoot = resolveProtoRoot()\n\nexport function grpcTarget(baseUrl: string): string {\n try {\n const u = new URL(baseUrl.includes('://') ? baseUrl : `https://${baseUrl}`)\n let host = u.host\n if (!host.includes(':')) {\n host = `${host}:443`\n }\n return host\n } catch {\n const trimmed = baseUrl.replace(/^https?:\\/\\//, '').replace(/\\/$/, '')\n return trimmed.includes(':') ? trimmed : `${trimmed}:443`\n }\n}\n\nexport function resolveUserAgent(override?: string): string {\n return override ?? sdkUserAgent()\n}\n\nexport type GrpcMetadataMap = Record<string, string>\n\nexport interface UsageGrpcClient {\n sendStats(\n request: Record<string, unknown>,\n metadata?: GrpcMetadataMap,\n ): Promise<{ featureCount?: number }>\n close(): void\n}\n\nexport interface MetricsGrpcClient {\n sendMetrics(\n request: Record<string, unknown>,\n metadata?: GrpcMetadataMap,\n ): Promise<{ count?: number }>\n close(): void\n}\n\nexport interface GrpcClients {\n usage: UsageGrpcClient\n metrics: MetricsGrpcClient\n}\n\ntype ProtoLoader = typeof import('@grpc/proto-loader')\ntype GrpcJs = typeof import('@grpc/grpc-js')\n\nfunction tryLoadGrpcModules(): { grpc: GrpcJs; protoLoader: ProtoLoader } | null {\n try {\n // Optional peer/optionalDependencies — evaluate flags without gRPC installed.\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const grpc = nodeRequire('@grpc/grpc-js') as GrpcJs\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const protoLoader = nodeRequire('@grpc/proto-loader') as ProtoLoader\n return { grpc, protoLoader }\n } catch {\n return null\n }\n}\n\nfunction loadPackageDefinition(\n protoLoader: ProtoLoader,\n grpc: GrpcJs,\n protoFile: string,\n): Record<string, unknown> {\n const packageDefinition = protoLoader.loadSync(path.join(protoRoot, protoFile), {\n keepCase: true,\n longs: Number,\n enums: String,\n defaults: true,\n oneofs: true,\n includeDirs: [protoRoot],\n })\n return grpc.loadPackageDefinition(packageDefinition) as Record<string, unknown>\n}\n\nfunction createMetadata(grpc: GrpcJs, map?: GrpcMetadataMap): InstanceType<GrpcJs['Metadata']> {\n const metadata = new grpc.Metadata()\n if (map) {\n for (const [key, value] of Object.entries(map)) {\n metadata.set(key, value)\n }\n }\n return metadata\n}\n\n/**\n * Dial usage + metrics gRPC clients against metricsBaseUrl.\n * Returns null when @grpc/grpc-js (+ proto-loader) are not installed.\n */\nexport function createGrpcClients(\n metricsBaseUrl: string = DEFAULT_METRICS_BASE_URL,\n userAgent?: string,\n): GrpcClients | null {\n const modules = tryLoadGrpcModules()\n if (!modules) {\n return null\n }\n\n const { grpc, protoLoader } = modules\n const target = grpcTarget(metricsBaseUrl)\n const credentials = grpc.credentials.createSsl()\n const ua = resolveUserAgent(userAgent)\n const defaultMeta: GrpcMetadataMap = { UA: ua }\n\n const usageDef = loadPackageDefinition(protoLoader, grpc, 'usage.proto')\n const metricsDef = loadPackageDefinition(protoLoader, grpc, 'metrics.proto')\n\n const UsageService = (usageDef as { Usage: { Usage: new (...args: unknown[]) => unknown } }).Usage\n .Usage as new (\n address: string,\n creds: unknown,\n ) => {\n SendStats: (\n req: unknown,\n meta: unknown,\n cb: (err: Error | null, res: { featureCount?: number }) => void,\n ) => void\n close: () => void\n }\n\n const MetricsService = (\n metricsDef as { Metrics: { Metrics: new (...args: unknown[]) => unknown } }\n ).Metrics.Metrics as new (\n address: string,\n creds: unknown,\n ) => {\n SendMetrics: (\n req: unknown,\n meta: unknown,\n cb: (err: Error | null, res: { count?: number }) => void,\n ) => void\n close: () => void\n }\n\n const usageStub = new UsageService(target, credentials)\n const metricsStub = new MetricsService(target, credentials)\n\n return {\n usage: {\n sendStats(request, metadata) {\n return new Promise((resolve, reject) => {\n usageStub.SendStats(\n request,\n createMetadata(grpc, { ...defaultMeta, ...metadata }),\n (err, res) => {\n if (err) reject(err)\n else resolve(res ?? {})\n },\n )\n })\n },\n close() {\n usageStub.close()\n },\n },\n metrics: {\n sendMetrics(request, metadata) {\n return new Promise((resolve, reject) => {\n metricsStub.SendMetrics(\n request,\n createMetadata(grpc, { ...defaultMeta, ...metadata }),\n (err, res) => {\n if (err) reject(err)\n else resolve(res ?? {})\n },\n )\n })\n },\n close() {\n metricsStub.close()\n },\n },\n }\n}\n\nexport function isGrpcAvailable(): boolean {\n return tryLoadGrpcModules() !== null\n}\n\nexport function getProtoRoot(): string {\n return protoRoot\n}\n\nexport { DEFAULT_METRICS_BASE_URL }\n","/**\n * Server-side Toggly client\n */\n\nimport {\n TogglyConfig,\n FeatureFlags,\n IdentityContext,\n TogglyHook,\n EvaluationSeriesData,\n IdentitySeriesData,\n LocalGate,\n TogglyNetworkError,\n mergeConfig,\n buildDefinitionsUrl,\n isFeatureEnabledLocal,\n parseDefinitionsPayload,\n snapshotEvaluatedBooleans,\n fetchWithTimeout,\n createLogger,\n normalizeEntityContext,\n registerContext as registerEntityContext,\n TelemetryRuntime,\n resolveTelemetryEnableFlag,\n isTelemetryEnvDisabled,\n type MetricsFeatureOptions,\n type UsageSender,\n type MetricsSender,\n} from '../core';\nimport type {\n TogglyEntityContext,\n DefinitionsByKey,\n EvalContext,\n FeatureDefinitionModel,\n} from '../core';\nimport {\n applyLocalGate,\n buildFlagGateIndex,\n type FlagGateIndex,\n} from '@ops-ai/toggly-local-gates';\nimport WebSocket from 'ws';\nimport {\n buildWebSocketUrl,\n extractDefinitionsRevision,\n getNextReconnectDelayMs,\n REFRESH_DEBOUNCE_MS,\n appendDefinitionsRevisionParam,\n applyFlagsUpdatedPlan,\n planFlagsUpdatedRefresh,\n shouldFetchOnSync,\n type WsSyncMessage,\n} from './ws-sync';\nimport { buildDefinitionFetchHeaders } from './sdk-identity';\nimport {\n parseEvaluatedResponseBody,\n readResponseBody,\n} from './signed-response';\nimport {\n getAmbientEvalOverrides,\n mergeIdentityContext,\n} from './eval-context-store';\nimport { createGrpcClients, isGrpcAvailable } from '../core/telemetry/grpc';\n\nfunction resolveServerTelemetryFlags(\n config: TogglyConfig,\n): Pick<TogglyConfig, 'enableUsageTracking' | 'enableMetrics'> {\n const hasAppKey = Boolean(config.appKey);\n return {\n enableUsageTracking: resolveTelemetryEnableFlag(\n config.enableUsageTracking,\n hasAppKey,\n ),\n enableMetrics: resolveTelemetryEnableFlag(config.enableMetrics, hasAppKey),\n };\n}\n\nfunction resolveGrpcClients(config: TogglyConfig): {\n usageClient?: UsageSender | null;\n metricsClient?: MetricsSender | null;\n} {\n if (config.usageClient !== undefined || config.metricsClient !== undefined) {\n return {\n usageClient: config.usageClient,\n metricsClient: config.metricsClient,\n };\n }\n\n const flags = resolveServerTelemetryFlags(config);\n if (!flags.enableUsageTracking && !flags.enableMetrics) {\n return {};\n }\n\n const transport = config.telemetryTransport ?? 'grpc';\n if (transport !== 'grpc') {\n return {};\n }\n\n if (!isGrpcAvailable()) {\n console.warn(\n '[Toggly] Usage/metrics enabled but @grpc/grpc-js and @grpc/proto-loader are not installed. ' +\n 'Install them to send telemetry: npm install @grpc/grpc-js @grpc/proto-loader',\n );\n return { usageClient: null, metricsClient: null };\n }\n\n const clients = createGrpcClients(config.metricsBaseUrl);\n if (!clients) {\n console.warn('[Toggly] Failed to create gRPC clients; telemetry transport disabled');\n return { usageClient: null, metricsClient: null };\n }\n return { usageClient: clients.usage, metricsClient: clients.metrics };\n}\n\n/**\n * Server-side Toggly client for fetching and evaluating feature flags\n */\nexport class TogglyServerClient {\n private readonly config: TogglyConfig;\n private readonly logger: ReturnType<typeof createLogger>;\n /** Compatibility snapshot of locally evaluated booleans (hydration / afterRefresh). */\n private flags: FeatureFlags = {};\n /** Raw definitions-signed models keyed by featureKey. */\n private definitions: Map<string, FeatureDefinitionModel> = new Map();\n private hooks: TogglyHook[] = [];\n private initialized = false;\n /** Dedupes concurrent cold-start definition fetches. */\n private definitionsLoadPromise: Promise<void> | null = null;\n /** Single-flight for definition GET so concurrent joiners are not double-counted. */\n private definitionsFetchInFlight: Promise<FeatureFlags> | null = null;\n\n // WebSocket live updates\n private ws: WebSocket | null = null;\n private wsConnected = false;\n private wsReconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private wsReconnectAttempt = 0;\n private refreshDebounceTimer: ReturnType<typeof setTimeout> | null = null;\n private cachedDefinitionsRevision: string | null = null;\n private pendingDefinitionsPin: string | null = null;\n private refreshTimer: ReturnType<typeof setInterval> | null = null;\n private identity?: string;\n\n private localGates: LocalGate[] = [];\n private localGateIndex: FlagGateIndex = new Map();\n private readonly localGatesListeners = new Set<() => void>();\n private telemetry: TelemetryRuntime | null = null;\n\n constructor(config: TogglyConfig) {\n // Server always uses definitions-signed + local evaluation (OPS-825).\n const telemetryFlags = resolveServerTelemetryFlags(config);\n const grpcClients = resolveGrpcClients({ ...config, ...telemetryFlags });\n this.config = mergeConfig({\n ...config,\n ...telemetryFlags,\n ...grpcClients,\n evaluationMode: 'local',\n telemetryTransport: config.telemetryTransport ?? 'grpc',\n telemetryAttachProcessHandlers:\n config.telemetryAttachProcessHandlers ??\n (config.telemetryTransport ?? 'grpc') === 'grpc',\n });\n this.logger = createLogger(this.config.debug ?? false);\n\n if (this.config.localGates) {\n this.setLocalGates(this.config.localGates);\n }\n\n if (!this.config.appKey && !this.config.featureDefaults) {\n this.logger.warn(\n 'No appKey provided and no featureDefaults set. All features will be disabled.'\n );\n }\n\n this.startTelemetry();\n }\n\n private startTelemetry(): void {\n if (!this.config.appKey || isTelemetryEnvDisabled()) {\n return;\n }\n if (!this.config.enableUsageTracking && !this.config.enableMetrics) {\n return;\n }\n if (this.telemetry) {\n void this.telemetry.close();\n this.telemetry = null;\n }\n this.telemetry = new TelemetryRuntime({\n appKey: this.config.appKey,\n environment: this.config.environment ?? 'Production',\n metricsBaseUrl: this.config.metricsBaseUrl,\n enableUsageTracking: this.config.enableUsageTracking,\n enableMetrics: this.config.enableMetrics,\n usageFlushInterval: this.config.usageFlushInterval,\n metricsFlushInterval: this.config.metricsFlushInterval,\n instanceName: this.config.instanceName,\n appVersion: this.config.appVersion,\n transport: this.config.telemetryTransport ?? 'grpc',\n attachProcessHandlers: this.config.telemetryAttachProcessHandlers,\n usageClient: this.config.usageClient,\n metricsClient: this.config.metricsClient,\n fetchImpl: this.config.telemetryFetch,\n });\n this.telemetry.start();\n }\n\n private recordCheckForKey(\n featureKey: string,\n enabled: boolean,\n identityOverride?: IdentityContext,\n ): void {\n if (!this.telemetry?.usageEnabled) {\n return;\n }\n const identity = identityOverride?.identity ?? this.identity;\n this.telemetry.recordCheck(featureKey, enabled, identity);\n }\n\n /** Soft-fail wrapper — definition refresh must not throw from telemetry. */\n private noteDefinitionCacheHit(): void {\n try {\n this.telemetry?.recordDefinitionCacheHit();\n } catch {\n // Telemetry must never break flag refresh.\n }\n }\n\n private noteDefinitionCacheMiss(): void {\n try {\n this.telemetry?.recordDefinitionCacheMiss();\n } catch {\n // Telemetry must never break flag refresh.\n }\n }\n\n private normalizeDefinitionsRevision(\n revision: string | null | undefined,\n ): string | null {\n if (!revision) {\n return null;\n }\n return revision.replace(/^\"+|\"+$/g, '');\n }\n\n private definitionsRevisionsMatch(\n previous: string | null | undefined,\n incoming: string | null | undefined,\n ): boolean {\n const a = this.normalizeDefinitionsRevision(previous);\n const b = this.normalizeDefinitionsRevision(incoming);\n if (!a || !b) {\n return false;\n }\n return a === b;\n }\n\n /**\n * Add a hook to the client\n */\n addHook(hook: TogglyHook): void {\n const metadata = hook.getMetadata();\n const exists = this.hooks.find((h) => h.getMetadata().name === metadata.name);\n\n if (exists) {\n this.logger.warn(`Hook \"${metadata.name}\" already registered. Skipping.`);\n return;\n }\n\n this.hooks.push(hook);\n this.logger.debug(`Hook \"${metadata.name}\" registered.`);\n }\n\n /**\n * Remove a hook by name\n */\n removeHook(name: string): boolean {\n const index = this.hooks.findIndex((h) => h.getMetadata().name === name);\n\n if (index > -1) {\n this.hooks.splice(index, 1);\n this.logger.debug(`Hook \"${name}\" removed.`);\n return true;\n }\n\n return false;\n }\n\n /**\n * Register device-local post-filter gates\n */\n setLocalGates(gates: LocalGate[]): void {\n this.localGates = [...gates];\n this.localGateIndex = buildFlagGateIndex(this.localGates);\n }\n\n /**\n * Notify subscribers that local gate state changed (no network)\n */\n notifyLocalGatesChanged(): void {\n this.localGatesListeners.forEach((listener) => {\n try {\n listener();\n } catch (error) {\n this.logger.error('Local gate listener error:', error);\n }\n });\n }\n\n /**\n * Subscribe to local gate changes\n */\n subscribeLocalGatesChanged(listener: () => void): () => void {\n this.localGatesListeners.add(listener);\n return () => {\n this.localGatesListeners.delete(listener);\n };\n }\n\n private buildEvalContext(\n identityOverride?: IdentityContext,\n entityContext?: TogglyEntityContext | null,\n ): EvalContext {\n // Ambient (loader/action ALS) merges with per-call override; per-call wins.\n // When neither is set, fall back to process defaults (identity / config).\n const merged = mergeIdentityContext(\n getAmbientEvalOverrides(),\n identityOverride,\n );\n\n if (merged) {\n // Prefer claims for UserClaims filters; traits remain a separate bag.\n const claims =\n (merged.claims as Record<string, string> | undefined) ??\n (this.config.claims as Record<string, string> | undefined);\n return {\n identity: merged.identity,\n groups: merged.groups ?? this.config.groups,\n traits: merged.traits ?? this.config.claims,\n claims,\n request: merged.request,\n entity: entityContext ?? null,\n };\n }\n\n const claims = this.config.claims as Record<string, string> | undefined;\n return {\n identity: this.identity,\n groups: this.config.groups,\n traits: this.config.claims,\n claims,\n entity: entityContext ?? null,\n };\n }\n\n /**\n * Evaluate a boolean snapshot for a specific identity without relying on\n * shared mutable `this.flags` / `this.identity` (safe under concurrency).\n */\n snapshotFlags(identityOverride?: IdentityContext): FeatureFlags {\n return {\n ...(this.config.featureDefaults ?? {}),\n ...snapshotEvaluatedBooleans(\n this.definitions as DefinitionsByKey,\n this.buildEvalContext(identityOverride),\n ),\n };\n }\n\n private getEffectiveFlag(\n featureKey: string,\n defaultValue = false,\n entityContext?: TogglyEntityContext | null,\n identityOverride?: IdentityContext,\n ): boolean {\n const evaluated = isFeatureEnabledLocal(\n this.definitions as DefinitionsByKey,\n featureKey,\n this.buildEvalContext(identityOverride, entityContext),\n this.config.featureDefaults?.[featureKey] ?? defaultValue,\n );\n return applyLocalGate(evaluated, featureKey, this.localGates, this.localGateIndex);\n }\n\n private getDefinitionsRevision(): string | null {\n return this.cachedDefinitionsRevision;\n }\n\n private cacheDefinitionsRevision(revision: string | null | undefined): void {\n const normalized = this.normalizeDefinitionsRevision(revision);\n if (!normalized) {\n return;\n }\n this.cachedDefinitionsRevision = normalized;\n }\n\n private scheduleDebouncedRefresh(forceRevisionReset = false): void {\n if (this.refreshDebounceTimer) {\n clearTimeout(this.refreshDebounceTimer);\n }\n this.refreshDebounceTimer = setTimeout(() => {\n this.refreshDebounceTimer = null;\n if (forceRevisionReset) {\n this.cachedDefinitionsRevision = null;\n }\n void this.fetchFlags(this.identity);\n }, REFRESH_DEBOUNCE_MS);\n }\n\n private handleWsSyncMessage(message: WsSyncMessage): void {\n const previousRevision = this.getDefinitionsRevision();\n if (shouldFetchOnSync(message, previousRevision)) {\n // Do not cache WS etag before HTTP confirms — avoids conditional 304 with stale defs.\n this.scheduleDebouncedRefresh();\n return;\n }\n this.cacheDefinitionsRevision(message.etag);\n }\n\n private handleWsUpdateMessage(message: WsSyncMessage): void {\n applyFlagsUpdatedPlan(\n planFlagsUpdatedRefresh(message, this.getDefinitionsRevision()),\n message,\n {\n refreshJwks: () => this.scheduleDebouncedRefresh(true),\n refreshPinned: (pin) => {\n this.pendingDefinitionsPin = pin;\n this.cachedDefinitionsRevision = null;\n this.scheduleDebouncedRefresh();\n },\n cacheEtagIfPresent: (etag) => this.cacheDefinitionsRevision(etag),\n },\n );\n }\n\n private evaluateGateEffective(\n featureKeys: string[],\n requirement: 'all' | 'any' = 'all',\n negate = false,\n defaultValue = false,\n entityContext?: TogglyEntityContext | null,\n identityOverride?: IdentityContext,\n ): boolean {\n if (featureKeys.length === 0) {\n return !negate;\n }\n\n // Record once per key (Next/Node parity), then combine.\n const checks = featureKeys.map((key) => {\n const enabled = this.getEffectiveFlag(\n key,\n defaultValue,\n entityContext,\n identityOverride,\n );\n this.recordCheckForKey(key, enabled, identityOverride);\n return enabled;\n });\n\n let result: boolean;\n if (requirement === 'any') {\n result = checks.some(Boolean);\n } else {\n result = checks.every(Boolean);\n }\n\n return negate ? !result : result;\n }\n\n /**\n * Whether the WebSocket connection is active\n */\n get isWsConnected(): boolean {\n return this.wsConnected;\n }\n\n /**\n * Initialize the client by fetching feature definitions.\n * When already initialized, rebinds identity (including clearing it) and\n * re-snapshots flags without re-fetching (definitions are identity-agnostic).\n * Concurrent cold starts share one fetch; each caller still receives a\n * request-local snapshot for its identity.\n */\n async init(identity?: string): Promise<FeatureFlags> {\n const wasWarm = this.initialized && this.definitions.size > 0;\n\n if (!wasWarm) {\n if (!this.definitionsLoadPromise) {\n this.definitionsLoadPromise = (async () => {\n await this.fetchFlags();\n this.initialized = true;\n this.startWebSocket();\n })().finally(() => {\n this.definitionsLoadPromise = null;\n });\n }\n await this.definitionsLoadPromise;\n\n if (identity) {\n await this.executeBeforeIdentify(identity);\n await this.executeAfterIdentify(identity);\n }\n }\n\n // Always rebind — including `undefined` so identified→anonymous is correct.\n this.identity = identity;\n this.flags = this.snapshotFlags({ identity });\n if (wasWarm) {\n this.logger.debug('Client already initialized; re-snapshotted for identity.');\n }\n return this.flags;\n }\n\n /**\n * Fetch feature definitions from the API (definitions-signed; no identity query).\n * Counts one definition-refresh hit/miss per performed attempt; concurrent\n * in-flight joiners await the same fetch and are not counted.\n */\n async fetchFlags(identity?: string): Promise<FeatureFlags> {\n if (identity !== undefined) {\n this.identity = identity;\n }\n\n if (this.definitionsFetchInFlight) {\n return this.definitionsFetchInFlight;\n }\n\n this.definitionsFetchInFlight = this.performDefinitionsFetch();\n try {\n return await this.definitionsFetchInFlight;\n } finally {\n this.definitionsFetchInFlight = null;\n }\n }\n\n private async performDefinitionsFetch(): Promise<FeatureFlags> {\n if (!this.config.appKey) {\n this.logger.debug('No appKey, using featureDefaults.');\n this.definitions = new Map();\n this.flags = this.config.featureDefaults ?? {};\n return this.flags;\n }\n\n let outcomeRecorded = false;\n\n try {\n const pin = this.pendingDefinitionsPin;\n this.pendingDefinitionsPin = null;\n // Local mode: do not pass identity into URL builder (no evaluation query params).\n const url = appendDefinitionsRevisionParam(\n buildDefinitionsUrl(this.config),\n pin,\n );\n this.logger.debug(`Fetching definitions from: ${url}`);\n\n // Pin forces a cache-proof GET; do not treat prior etag as still current.\n const previousRevision = pin ? null : this.getDefinitionsRevision();\n const headers = buildDefinitionFetchHeaders(\n previousRevision ? { 'If-None-Match': previousRevision } : {},\n );\n\n const response = await fetchWithTimeout(url, { headers }, this.config.timeout);\n\n const responseRevision = this.normalizeDefinitionsRevision(\n extractDefinitionsRevision(response),\n );\n\n if (response.status === 304) {\n if (responseRevision) {\n this.cacheDefinitionsRevision(responseRevision);\n }\n this.noteDefinitionCacheHit();\n outcomeRecorded = true;\n this.logger.debug('Definitions unchanged (304)');\n return this.flags;\n }\n\n if (!response.ok) {\n throw new TogglyNetworkError(\n `HTTP ${response.status}: ${response.statusText}`\n );\n }\n\n // Always parse/apply the body on HTTP 200. Equal revision is still a cache\n // hit (CDN replay), but the body must still be applied.\n const bodyText = await readResponseBody(response);\n const parsed = await parseEvaluatedResponseBody(bodyText, {\n verifySignatures: this.config.verifySignatures,\n baseUrl: this.config.baseUrl ?? 'https://definitions.toggly.io',\n allowedKeyIds: this.config.allowedKeyIds,\n maxSignatureAgeSeconds: this.config.maxSignatureAgeSeconds,\n headers: buildDefinitionFetchHeaders({}),\n });\n\n this.definitions = parseDefinitionsPayload(parsed);\n this.flags = {\n ...(this.config.featureDefaults ?? {}),\n ...snapshotEvaluatedBooleans(this.definitions, this.buildEvalContext()),\n };\n if (responseRevision) {\n this.cacheDefinitionsRevision(responseRevision);\n }\n this.logger.debug(`Fetched ${this.definitions.size} definitions.`);\n\n if (this.definitionsRevisionsMatch(previousRevision, responseRevision)) {\n this.noteDefinitionCacheHit();\n } else {\n this.noteDefinitionCacheMiss();\n }\n outcomeRecorded = true;\n\n // Execute afterRefresh hooks\n await this.executeAfterRefresh(this.flags);\n\n return this.flags;\n } catch (error) {\n this.logger.warn('Failed to fetch flags, preserving last-known-good flags when available.', error);\n this.config.onError?.('Error fetching feature flags', error);\n\n // Network error keeping last-good definitions only — not featureDefaults alone.\n if (!outcomeRecorded && this.definitions.size > 0) {\n this.noteDefinitionCacheHit();\n }\n\n if (Object.keys(this.flags).length === 0) {\n this.flags = this.config.featureDefaults ?? {};\n }\n return this.flags;\n }\n }\n\n /**\n * Get all flags\n */\n getFlags(): FeatureFlags {\n return { ...this.flags };\n }\n\n /**\n * Check if a feature is enabled\n */\n async isEnabled(\n featureKey: string,\n context?: IdentityContext,\n defaultValue = false,\n entity?: TogglyEntityContext | Record<string, unknown> | null,\n kind?: string,\n ): Promise<boolean> {\n const entityContext = normalizeEntityContext(entity, kind);\n\n // Execute beforeEvaluation hooks\n const hookData = await this.executeBeforeEvaluation(featureKey, defaultValue);\n\n const result = this.getEffectiveFlag(featureKey, defaultValue, entityContext, context);\n this.recordCheckForKey(featureKey, result, context);\n\n // Execute afterEvaluation hooks\n await this.executeAfterEvaluation(featureKey, hookData, result);\n\n return result;\n }\n\n registerContext<T>(\n kind: string,\n mapper: (entity: T) => TogglyEntityContext,\n ): void {\n registerEntityContext(kind, mapper);\n }\n\n /**\n * Check if a feature is disabled\n */\n async isDisabled(\n featureKey: string,\n context?: IdentityContext,\n defaultValue = true,\n entity?: TogglyEntityContext | Record<string, unknown> | null,\n kind?: string,\n ): Promise<boolean> {\n return !(await this.isEnabled(featureKey, context, !defaultValue, entity, kind));\n }\n\n /**\n * Evaluate a feature gate (multiple features)\n */\n async evaluateGate(\n featureKeys: string[],\n requirement: 'all' | 'any' = 'all',\n negate = false,\n defaultValue = false,\n entity?: TogglyEntityContext | Record<string, unknown> | null,\n kind?: string,\n identityOverride?: IdentityContext,\n ): Promise<boolean> {\n const entityContext = normalizeEntityContext(entity, kind);\n\n // Execute beforeEvaluation for first feature\n const firstKey = featureKeys[0] ?? 'gate';\n const hookData = await this.executeBeforeEvaluation(firstKey, defaultValue);\n\n const result = this.evaluateGateEffective(\n featureKeys,\n requirement,\n negate,\n defaultValue,\n entityContext,\n identityOverride,\n );\n\n // Execute afterEvaluation\n await this.executeAfterEvaluation(firstKey, hookData, result);\n\n return result;\n }\n\n /**\n * Get the server context for client hydration\n */\n getServerContext(): {\n flags: FeatureFlags;\n appKey?: string;\n environment?: string;\n fetchedAt: number;\n } {\n return {\n flags: this.flags,\n appKey: this.config.appKey,\n environment: this.config.environment,\n fetchedAt: Date.now(),\n };\n }\n\n // WebSocket live updates\n\n /**\n * Start WebSocket connection for live updates\n */\n private startWebSocket(): void {\n if (!this.config.appKey) {\n return;\n }\n\n if (this.ws) {\n return;\n }\n\n const baseUrl = this.config.baseUrl ?? 'https://definitions.toggly.io';\n const wsUrl = buildWebSocketUrl(baseUrl, this.config.appKey, this.getDefinitionsRevision());\n this.logger.debug(`WebSocket connecting to: ${wsUrl}`);\n\n try {\n this.ws = new WebSocket(wsUrl);\n\n this.ws.on('open', () => {\n this.wsConnected = true;\n this.wsReconnectAttempt = 0;\n this.logger.debug('WebSocket connected');\n });\n\n this.ws.on('message', (data: Buffer) => {\n const text = data.toString();\n\n if (text === 'update' || text === 'flags-updated') {\n this.scheduleDebouncedRefresh();\n return;\n }\n\n try {\n const message = JSON.parse(text) as WsSyncMessage;\n if (message.type === 'ping') {\n return;\n }\n if (message.type === 'sync') {\n this.handleWsSyncMessage(message);\n return;\n }\n if (\n message.type === 'flags-updated' ||\n message.type === 'update' ||\n message.type === 'signing-key-updated'\n ) {\n this.handleWsUpdateMessage(message);\n }\n } catch {\n // Unrecognized message, ignore\n }\n });\n\n this.ws.on('close', () => {\n this.wsConnected = false;\n this.ws = null;\n this.logger.debug('WebSocket disconnected, scheduling reconnect');\n this.scheduleReconnect();\n });\n\n this.ws.on('error', (error) => {\n this.logger.error('WebSocket error:', error.message);\n // close event will fire after error, triggering reconnect\n });\n } catch (error) {\n this.logger.error('Failed to create WebSocket:', error);\n this.ws = null;\n this.scheduleReconnect();\n }\n }\n\n /**\n * Schedule WebSocket reconnection\n */\n private scheduleReconnect(): void {\n if (this.wsReconnectTimer) {\n return;\n }\n const delay = getNextReconnectDelayMs(this.wsReconnectAttempt);\n this.wsReconnectAttempt += 1;\n this.wsReconnectTimer = setTimeout(() => {\n this.wsReconnectTimer = null;\n this.startWebSocket();\n }, delay);\n }\n\n /**\n * Stop WebSocket connection and cleanup\n */\n private stopWebSocket(): void {\n if (this.wsReconnectTimer) {\n clearTimeout(this.wsReconnectTimer);\n this.wsReconnectTimer = null;\n }\n if (this.refreshDebounceTimer) {\n clearTimeout(this.refreshDebounceTimer);\n this.refreshDebounceTimer = null;\n }\n if (this.ws) {\n this.ws.removeAllListeners();\n this.ws.close();\n this.ws = null;\n this.wsConnected = false;\n }\n }\n\n /**\n * Close the client and cleanup all resources\n */\n close(): void {\n this.stopWebSocket();\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n }\n if (this.telemetry) {\n void this.telemetry.close();\n this.telemetry = null;\n }\n this.logger.debug('TogglyServerClient closed');\n }\n\n /** Record a feature \"used\" interaction (usage telemetry). */\n recordUsage(featureKey: string, identity?: string, variant?: string): void {\n this.telemetry?.recordUsage(featureKey, identity ?? this.identity, variant);\n }\n\n /** Record a feature \"viewed\" event (usage telemetry). */\n recordView(featureKey: string, identity?: string, variant?: string): void {\n this.telemetry?.recordView(featureKey, identity ?? this.identity, variant);\n }\n\n measure(\n metricKey: string,\n value: number,\n options?: MetricsFeatureOptions,\n ): void {\n this.telemetry?.measure(metricKey, value, options);\n }\n\n incrementCounter(\n metricKey: string,\n value = 1,\n options?: MetricsFeatureOptions,\n ): void {\n this.telemetry?.incrementCounter(metricKey, value, options);\n }\n\n observe(\n metricKey: string,\n value: number,\n options?: MetricsFeatureOptions,\n ): void {\n this.telemetry?.observe(metricKey, value, options);\n }\n\n async flushTelemetry(): Promise<void> {\n await this.telemetry?.flushAll();\n }\n\n // Hook execution methods\n\n private async executeBeforeEvaluation(\n flagKey: string,\n defaultValue?: boolean\n ): Promise<Map<string, EvaluationSeriesData | void>> {\n const dataMap = new Map<string, EvaluationSeriesData | void>();\n\n for (const hook of this.hooks) {\n if (hook.beforeEvaluation) {\n try {\n const data = await hook.beforeEvaluation(flagKey, defaultValue);\n dataMap.set(hook.getMetadata().name, data);\n } catch (error) {\n this.logger.error(\n `Error in hook \"${hook.getMetadata().name}.beforeEvaluation\":`,\n error\n );\n }\n }\n }\n\n return dataMap;\n }\n\n private async executeAfterEvaluation(\n flagKey: string,\n dataMap: Map<string, EvaluationSeriesData | void>,\n result: boolean\n ): Promise<void> {\n // Execute in reverse order\n for (let i = this.hooks.length - 1; i >= 0; i--) {\n const hook = this.hooks[i];\n if (hook.afterEvaluation) {\n try {\n const data = dataMap.get(hook.getMetadata().name);\n await hook.afterEvaluation(flagKey, data, result);\n } catch (error) {\n this.logger.error(\n `Error in hook \"${hook.getMetadata().name}.afterEvaluation\":`,\n error\n );\n }\n }\n }\n }\n\n private async executeBeforeIdentify(\n identity: string\n ): Promise<Map<string, IdentitySeriesData | void>> {\n const dataMap = new Map<string, IdentitySeriesData | void>();\n\n for (const hook of this.hooks) {\n if (hook.beforeIdentify) {\n try {\n const data = await hook.beforeIdentify(identity);\n dataMap.set(hook.getMetadata().name, data);\n } catch (error) {\n this.logger.error(\n `Error in hook \"${hook.getMetadata().name}.beforeIdentify\":`,\n error\n );\n }\n }\n }\n\n return dataMap;\n }\n\n private async executeAfterIdentify(identity: string): Promise<void> {\n for (let i = this.hooks.length - 1; i >= 0; i--) {\n const hook = this.hooks[i];\n if (hook.afterIdentify) {\n try {\n await hook.afterIdentify(identity, undefined);\n } catch (error) {\n this.logger.error(\n `Error in hook \"${hook.getMetadata().name}.afterIdentify\":`,\n error\n );\n }\n }\n }\n }\n\n private async executeAfterRefresh(flags: FeatureFlags): Promise<void> {\n for (const hook of this.hooks) {\n if (hook.afterRefresh) {\n try {\n await hook.afterRefresh(flags);\n } catch (error) {\n this.logger.error(\n `Error in hook \"${hook.getMetadata().name}.afterRefresh\":`,\n error\n );\n }\n }\n }\n }\n}\n\n/**\n * Create a new server client instance\n */\nexport function createServerClient(config: TogglyConfig): TogglyServerClient {\n return new TogglyServerClient(config);\n}\n","/**\n * React Router loader utilities for Toggly\n */\n\nimport {\n TogglyConfig,\n FeatureFlags,\n ServerFeatureContext,\n IdentityContext,\n TOGGLY_LOADER_KEY,\n} from '../core';\nimport { TogglyServerClient, createServerClient } from './client';\nimport {\n extractEvalContext,\n type EvalContextProviders,\n} from './extract-context';\nimport {\n getAmbientEvalOverrides,\n mergeIdentityContext,\n runWithEvalContext,\n} from './eval-context-store';\n\n/** Structural args for framework-mode loaders (RR7/RR8). */\nexport interface LoaderFunctionArgs {\n request: Request;\n params?: Record<string, string | undefined>;\n context?: unknown;\n}\n\nexport interface TogglyLoaderOptions\n extends TogglyConfig, EvalContextProviders {}\n\nfunction resolveIdentityOverride(\n override?: string | IdentityContext,\n): IdentityContext | undefined {\n if (override == null) {\n return getAmbientEvalOverrides();\n }\n if (typeof override === 'string') {\n return mergeIdentityContext(getAmbientEvalOverrides(), {\n identity: override,\n });\n }\n return mergeIdentityContext(getAmbientEvalOverrides(), override);\n}\n\n/**\n * Create a loader helper for fetching feature flags\n */\nexport function createTogglyLoader(options: TogglyLoaderOptions) {\n const client = createServerClient(options);\n\n return {\n /**\n * Get the Toggly client\n */\n getClient(): TogglyServerClient {\n return client;\n },\n\n /**\n * Load feature flags for a loader function.\n * Builds ambient EvalContext (identity / groups / claims / request) for\n * the snapshot. Prefer `run` when calling `client.isEnabled('X')` without\n * an IdentityContext for the full loader duration.\n */\n async load(args: LoaderFunctionArgs): Promise<ServerFeatureContext> {\n const ambient = await extractEvalContext(args.request, options);\n await client.init(ambient.identity);\n\n return {\n flags: client.snapshotFlags(ambient),\n identity: ambient.identity,\n appKey: options.appKey,\n environment: options.environment,\n fetchedAt: Date.now(),\n };\n },\n\n /**\n * Bind ambient EvalContext for the full loader duration, then run `fn`.\n * Prefer this when calling `client.isEnabled('X')` without an IdentityContext.\n */\n async run<T>(\n args: LoaderFunctionArgs,\n fn: (\n ctx: ServerFeatureContext & { client: TogglyServerClient },\n ) => T | Promise<T>,\n ): Promise<T> {\n const ambient = await extractEvalContext(args.request, options);\n\n return runWithEvalContext(ambient, async () => {\n await client.init(ambient.identity);\n const ctx: ServerFeatureContext & { client: TogglyServerClient } = {\n flags: client.snapshotFlags(ambient),\n identity: ambient.identity,\n appKey: options.appKey,\n environment: options.environment,\n fetchedAt: Date.now(),\n client,\n };\n return fn(ctx);\n });\n },\n\n /**\n * Create loader data with feature context\n */\n async getLoaderData<T extends Record<string, unknown>>(\n args: LoaderFunctionArgs,\n additionalData?: T,\n ): Promise<T & { [TOGGLY_LOADER_KEY]: ServerFeatureContext }> {\n const context = await this.load(args);\n\n return {\n ...additionalData,\n [TOGGLY_LOADER_KEY]: context,\n } as T & { [TOGGLY_LOADER_KEY]: ServerFeatureContext };\n },\n\n /**\n * Check if a feature is enabled.\n * Ambient EvalContext (from `run` / `load` ALS scope) is merged;\n * per-call string identity or IdentityContext overrides field-by-field.\n */\n async isEnabled(\n featureKey: string,\n defaultValue = false,\n identityOrContext?: string | IdentityContext,\n ): Promise<boolean> {\n return client.isEnabled(\n featureKey,\n resolveIdentityOverride(identityOrContext),\n defaultValue,\n );\n },\n\n /**\n * Check if a feature is disabled\n */\n async isDisabled(\n featureKey: string,\n defaultValue = true,\n identityOrContext?: string | IdentityContext,\n ): Promise<boolean> {\n return client.isDisabled(\n featureKey,\n resolveIdentityOverride(identityOrContext),\n defaultValue,\n );\n },\n\n /**\n * Evaluate a feature gate\n */\n async evaluateGate(\n featureKeys: string[],\n requirement: 'all' | 'any' = 'all',\n negate = false,\n identityOrContext?: string | IdentityContext,\n ): Promise<boolean> {\n return client.evaluateGate(\n featureKeys,\n requirement,\n negate,\n false,\n undefined,\n undefined,\n resolveIdentityOverride(identityOrContext),\n );\n },\n\n /**\n * Get all flags\n */\n getFlags(): FeatureFlags {\n return client.getFlags();\n },\n };\n}\n\n/**\n * Standalone function to get feature flags in a loader\n */\nexport async function getFeatureFlags(\n request: Request,\n options: TogglyLoaderOptions,\n): Promise<ServerFeatureContext> {\n const loader = createTogglyLoader(options);\n return loader.load({ request, params: {}, context: {} });\n}\n\n/**\n * Check if a single feature is enabled (standalone)\n */\nexport async function isFeatureEnabled(\n request: Request,\n featureKey: string,\n options: TogglyLoaderOptions,\n defaultValue = false,\n): Promise<boolean> {\n const loader = createTogglyLoader(options);\n return loader.run({ request, params: {}, context: {} }, async ({ client }) =>\n client.isEnabled(featureKey, undefined, defaultValue),\n );\n}\n\n/**\n * Type helper for loader data with Toggly context\n */\nexport type WithTogglyContext<T> = T & {\n [TOGGLY_LOADER_KEY]: ServerFeatureContext;\n};\n","/**\n * React Router action utilities for Toggly\n */\n\nimport { redirect } from 'react-router';\nimport type { FeatureFlags, IdentityContext } from '../core';\nimport { TogglyServerClient, createServerClient } from './client';\nimport type { TogglyLoaderOptions } from './loader';\nimport { extractEvalContext } from './extract-context';\nimport { mergeIdentityContext, runWithEvalContext } from './eval-context-store';\n\n/** Structural args for framework-mode actions (RR7/RR8). */\nexport interface ActionFunctionArgs {\n request: Request;\n params?: Record<string, string | undefined>;\n context?: unknown;\n}\n/**\n * Options for feature-gated actions\n */\nexport interface FeatureGatedActionOptions extends TogglyLoaderOptions {\n /** Feature key(s) required for this action */\n requiredFeatures?: string | string[];\n /** Feature requirement type */\n requirement?: 'all' | 'any';\n /** Response when feature is disabled */\n onFeatureDisabled?: (\n request: Request,\n featureKeys: string[],\n ) => Response | Promise<Response>;\n /** Redirect URL when feature is disabled */\n redirectTo?: string;\n /** Status code for JSON error response */\n errorStatus?: number;\n /** Error message for JSON error response */\n errorMessage?: string;\n}\n\n/**\n * Action context with Toggly client\n */\nexport interface TogglyActionContext {\n /** Toggly server client */\n client: TogglyServerClient;\n /** Feature flags */\n flags: FeatureFlags;\n /** Ambient EvalContext bound for this action */\n context: IdentityContext;\n /** Check if feature is enabled (uses ambient; optional override) */\n isEnabled: (\n featureKey: string,\n defaultValue?: boolean,\n override?: IdentityContext,\n ) => Promise<boolean>;\n /** Check if feature is disabled */\n isDisabled: (\n featureKey: string,\n defaultValue?: boolean,\n override?: IdentityContext,\n ) => Promise<boolean>;\n /** Evaluate feature gate */\n evaluateGate: (\n featureKeys: string[],\n requirement?: 'all' | 'any',\n negate?: boolean,\n override?: IdentityContext,\n ) => Promise<boolean>;\n}\n\nfunction buildActionContext(\n client: TogglyServerClient,\n ambient: IdentityContext,\n): TogglyActionContext {\n return {\n client,\n flags: client.snapshotFlags(ambient),\n context: ambient,\n isEnabled: (key, def, override) =>\n client.isEnabled(key, mergeIdentityContext(ambient, override), def),\n isDisabled: (key, def, override) =>\n client.isDisabled(key, mergeIdentityContext(ambient, override), def),\n evaluateGate: (keys, req, neg, override) =>\n client.evaluateGate(\n keys,\n req,\n neg,\n false,\n undefined,\n undefined,\n mergeIdentityContext(ambient, override),\n ),\n };\n}\n\n/**\n * Create a feature-gated action handler\n */\nexport function createFeatureGatedAction<T>(\n options: FeatureGatedActionOptions,\n handler: (\n args: ActionFunctionArgs,\n toggly: TogglyActionContext,\n ) => Promise<T> | T,\n) {\n return async (args: ActionFunctionArgs): Promise<T | Response> => {\n const { request } = args;\n const client = createServerClient(options);\n const ambient = await extractEvalContext(request, options);\n\n return runWithEvalContext(ambient, async () => {\n await client.init(ambient.identity);\n const togglyContext = buildActionContext(client, ambient);\n\n if (options.requiredFeatures) {\n const featureKeys = Array.isArray(options.requiredFeatures)\n ? options.requiredFeatures\n : [options.requiredFeatures];\n\n const requirement = options.requirement ?? 'all';\n const isAllowed = await client.evaluateGate(\n featureKeys,\n requirement,\n false,\n false,\n undefined,\n undefined,\n ambient,\n );\n\n if (!isAllowed) {\n if (options.onFeatureDisabled) {\n return options.onFeatureDisabled(request, featureKeys);\n }\n\n if (options.redirectTo) {\n return redirect(options.redirectTo);\n }\n\n return Response.json(\n {\n error: options.errorMessage ?? 'Feature is not available',\n featureKeys,\n },\n { status: options.errorStatus ?? 403 },\n );\n }\n }\n\n return handler(args, togglyContext);\n });\n };\n}\n\n/**\n * Create a Toggly-aware action helper\n */\nexport function createTogglyAction(options: TogglyLoaderOptions) {\n const client = createServerClient(options);\n\n return {\n /**\n * Get the Toggly client\n */\n getClient(): TogglyServerClient {\n return client;\n },\n\n /**\n * Initialize for an action request.\n * Returned helpers close over ambient EvalContext so `toggly.isEnabled('X')`\n * needs no IdentityContext. Prefer `run` when using `client.isEnabled('X')`\n * directly for the full action duration.\n */\n async init(request: Request): Promise<TogglyActionContext> {\n const ambient = await extractEvalContext(request, options);\n await client.init(ambient.identity);\n return buildActionContext(client, ambient);\n },\n\n /**\n * Bind ambient EvalContext and run an action handler.\n */\n async run<T>(\n args: ActionFunctionArgs,\n fn: (\n args: ActionFunctionArgs,\n toggly: TogglyActionContext,\n ) => T | Promise<T>,\n ): Promise<T> {\n const ambient = await extractEvalContext(args.request, options);\n return runWithEvalContext(ambient, async () => {\n await client.init(ambient.identity);\n return fn(args, buildActionContext(client, ambient));\n });\n },\n\n /**\n * Wrap an action with feature checks\n */\n requireFeature<T>(\n featureKey: string,\n handler: (\n args: ActionFunctionArgs,\n toggly: TogglyActionContext,\n ) => Promise<T> | T,\n onDisabled?: () => Response | Promise<Response>,\n ) {\n return createFeatureGatedAction(\n {\n ...options,\n requiredFeatures: featureKey,\n onFeatureDisabled: onDisabled,\n },\n handler,\n );\n },\n\n /**\n * Wrap an action with feature gate checks\n */\n requireFeatures<T>(\n featureKeys: string[],\n requirement: 'all' | 'any',\n handler: (\n args: ActionFunctionArgs,\n toggly: TogglyActionContext,\n ) => Promise<T> | T,\n onDisabled?: () => Response | Promise<Response>,\n ) {\n return createFeatureGatedAction(\n {\n ...options,\n requiredFeatures: featureKeys,\n requirement,\n onFeatureDisabled: onDisabled,\n },\n handler,\n );\n },\n };\n}\n\n/**\n * Higher-order function to require a feature for an action\n */\nexport function requireFeature(\n featureKey: string,\n options: TogglyLoaderOptions,\n onDisabled?: () => Response | Promise<Response>,\n) {\n return function <T>(\n handler: (\n args: ActionFunctionArgs,\n toggly: TogglyActionContext,\n ) => Promise<T> | T,\n ) {\n return createFeatureGatedAction(\n {\n ...options,\n requiredFeatures: featureKey,\n onFeatureDisabled: onDisabled\n ? () => onDisabled()\n : undefined,\n },\n handler,\n );\n };\n}\n"]}