@simplr-ai/react-native 1.1.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-FCBLJE3T.js → chunk-JDFZXUFN.js} +231 -12
- package/dist/chunk-JDFZXUFN.js.map +1 -0
- package/dist/{flags-CwhHmaHQ.d.cts → flags-DFkb45Q8.d.cts} +51 -1
- package/dist/{flags-CwhHmaHQ.d.ts → flags-DFkb45Q8.d.ts} +51 -1
- package/dist/hooks/index.cjs +228 -9
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.d.cts +1 -1
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/index.cjs +229 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +24 -3
- package/dist/index.d.ts +24 -3
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-FCBLJE3T.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/hash.ts","../src/device/storage.ts","../src/device/signals.ts","../src/biometrics/touch.ts","../src/http.ts","../src/profiles.ts","../src/rum.ts","../src/ai.ts","../src/client.ts","../src/flags.ts"],"names":["DEFAULT_BASE_URL"],"mappings":"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","file":"chunk-FCBLJE3T.js","sourcesContent":["/** Thrown when the Simplr API returns a non-2xx response or a network/timeout error. */\nexport class SimplrError extends Error {\n readonly status: number;\n readonly body: unknown;\n\n constructor(message: string, status: number, body: unknown) {\n super(message);\n this.name = \"SimplrError\";\n this.status = status;\n this.body = body;\n // Restore prototype chain for transpiled targets.\n Object.setPrototypeOf(this, SimplrError.prototype);\n }\n}\n","/**\n * MurmurHash3 x86 32-bit — verbatim port from @simplr-ai/js so that\n * feature-flag bucketing matches the server, browser, Node and Flutter SDKs\n * byte-for-byte. seed=0, c1=0xcc9e2d51, c2=0x1b873593, returns h1 >>> 0.\n */\nexport function murmurHash3(input: string, seed = 0): number {\n let h1 = seed;\n const c1 = 0xcc9e2d51;\n const c2 = 0x1b873593;\n\n for (let i = 0; i < input.length; i++) {\n let k1 = input.charCodeAt(i);\n k1 = Math.imul(k1, c1);\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = Math.imul(k1, c2);\n h1 ^= k1;\n h1 = (h1 << 13) | (h1 >>> 19);\n h1 = Math.imul(h1, 5) + 0xe6546b64;\n }\n\n h1 ^= input.length;\n h1 ^= h1 >>> 16;\n h1 = Math.imul(h1, 0x85ebca6b);\n h1 ^= h1 >>> 13;\n h1 = Math.imul(h1, 0xc2b2ae35);\n h1 ^= h1 >>> 16;\n\n return h1 >>> 0;\n}\n\n/**\n * Builds a stable, deterministic fingerprint hash (hex) from device components.\n * Uses murmurHash3 because React Native has no DOM/WebCrypto/canvas.\n */\nexport function createFingerprintHash(\n components: Record<string, string | number | boolean | null | undefined>,\n): string {\n const sortedKeys = Object.keys(components).sort();\n const values = sortedKeys.map((key) => `${key}:${components[key] ?? \"null\"}`);\n return murmurHash3(values.join(\"|\")).toString(16).padStart(8, \"0\");\n}\n","/**\n * Persistent device ID storage for React Native.\n *\n * Uses @react-native-async-storage/async-storage when it is installed,\n * detected lazily via try/require so the package NEVER hard-depends on it.\n * Falls back to an in-memory value (stable for the process lifetime) when\n * AsyncStorage is unavailable (e.g. tests, SSR, or apps without the dep).\n */\n\nconst STORAGE_KEY = \"simplr_device_id\";\nconst STORAGE_TIMESTAMP_KEY = \"simplr_device_id_ts\";\n\ninterface AsyncStorageLike {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n\nlet asyncStorage: AsyncStorageLike | null | undefined;\n\n/** Lazily resolve AsyncStorage. Returns null when the module is missing. */\nexport function getAsyncStorage(): AsyncStorageLike | null {\n if (asyncStorage !== undefined) return asyncStorage;\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const mod = require(\"@react-native-async-storage/async-storage\");\n const candidate = (mod && (mod.default || mod)) as AsyncStorageLike | undefined;\n asyncStorage =\n candidate && typeof candidate.getItem === \"function\" ? candidate : null;\n } catch {\n asyncStorage = null;\n }\n return asyncStorage;\n}\n\n/** Test/override hook: inject a fake AsyncStorage (or null to force fallback). */\nexport function __setAsyncStorageForTests(impl: AsyncStorageLike | null): void {\n asyncStorage = impl;\n memoryDeviceId = null;\n memoryCreatedAt = null;\n}\n\n// In-memory fallback so a device_id is at least stable within a session.\nlet memoryDeviceId: string | null = null;\nlet memoryCreatedAt: string | null = null;\n\nfunction generateDeviceId(): string {\n const timestamp = Date.now().toString(36);\n const r1 = Math.random().toString(36).substring(2, 15);\n const r2 = Math.random().toString(36).substring(2, 15);\n return `${timestamp}-${r1}-${r2}`;\n}\n\n/**\n * Gets (or creates and persists) the device ID along with its creation\n * timestamp. Resolves from AsyncStorage when present, else the in-memory value.\n */\nexport async function getDeviceId(): Promise<{ id: string; createdAt: string | null }> {\n const store = getAsyncStorage();\n if (store) {\n try {\n let id = await store.getItem(STORAGE_KEY);\n let createdAt = await store.getItem(STORAGE_TIMESTAMP_KEY);\n if (!id) {\n id = generateDeviceId();\n createdAt = new Date().toISOString();\n await store.setItem(STORAGE_KEY, id);\n await store.setItem(STORAGE_TIMESTAMP_KEY, createdAt);\n }\n return { id, createdAt: createdAt ?? null };\n } catch {\n // Fall through to in-memory on any storage error.\n }\n }\n\n if (!memoryDeviceId) {\n memoryDeviceId = generateDeviceId();\n memoryCreatedAt = new Date().toISOString();\n }\n return { id: memoryDeviceId, createdAt: memoryCreatedAt };\n}\n\n/** Clears the stored device ID (useful for testing / logout). */\nexport async function clearDeviceId(): Promise<void> {\n memoryDeviceId = null;\n memoryCreatedAt = null;\n const store = getAsyncStorage();\n if (store) {\n try {\n await store.removeItem(STORAGE_KEY);\n await store.removeItem(STORAGE_TIMESTAMP_KEY);\n } catch {\n // ignore\n }\n }\n}\n","/**\n * Device signal collection for React Native.\n *\n * React Native has no DOM/canvas/WebGL/audio, so instead of those browser\n * fingerprints we build a STABLE device signature from React Native APIs that\n * require no native modules: Platform, Dimensions, PixelRatio, plus Intl for\n * timezone/locale and a persisted device_id. The resulting DeviceSignals shape\n * mirrors the browser SDK but with `platform: \"ios\" | \"android\"`.\n */\n\nimport { createFingerprintHash } from \"../hash\";\nimport { getDeviceId } from \"./storage\";\nimport type { DeviceSignals } from \"../types\";\n\n/** Minimal shapes for the react-native APIs we touch (kept dependency-free). */\ninterface RNPlatform {\n OS: string;\n Version?: string | number;\n constants?: Record<string, unknown>;\n select?: <T>(spec: Record<string, T>) => T | undefined;\n}\ninterface RNDimensions {\n get(dim: \"window\" | \"screen\"): { width: number; height: number; scale?: number; fontScale?: number };\n}\ninterface RNPixelRatio {\n get(): number;\n getFontScale(): number;\n}\n\ninterface RNModule {\n Platform?: RNPlatform;\n Dimensions?: RNDimensions;\n PixelRatio?: RNPixelRatio;\n}\n\nlet rnOverride: RNModule | undefined;\n\n/** Test/override hook: inject a react-native module stand-in. */\nexport function __setReactNativeForTests(rn: RNModule | undefined): void {\n rnOverride = rn;\n}\n\n/**\n * Lazily resolve react-native. Returns an empty object if it's not present so\n * signal collection degrades gracefully (e.g. tests / non-RN environments)\n * instead of hard-crashing.\n */\nfunction getReactNative(): RNModule {\n if (rnOverride !== undefined) return rnOverride;\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const rn = require(\"react-native\");\n return (rn?.default || rn || {}) as RNModule;\n } catch {\n return {};\n }\n}\n\nfunction safeTimezone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || \"UTC\";\n } catch {\n return \"UTC\";\n }\n}\n\nfunction safeLocale(): { language: string; languages: string[] } {\n try {\n const opts = Intl.DateTimeFormat().resolvedOptions();\n const lang = opts.locale || \"en\";\n return { language: lang, languages: [lang] };\n } catch {\n return { language: \"en\", languages: [\"en\"] };\n }\n}\n\n/**\n * Collects device signals from React Native APIs and a persisted device ID.\n */\nexport async function collectDeviceSignals(): Promise<DeviceSignals> {\n const rn = getReactNative();\n const Platform = rn.Platform;\n const Dimensions = rn.Dimensions;\n const PixelRatio = rn.PixelRatio;\n\n const osRaw = (Platform?.OS || \"unknown\").toLowerCase();\n const platform: \"ios\" | \"android\" = osRaw === \"ios\" ? \"ios\" : \"android\";\n const osVersion =\n Platform?.Version !== undefined && Platform?.Version !== null\n ? String(Platform.Version)\n : null;\n\n // Model / brand are exposed on Platform.constants for some RN versions.\n const constants = (Platform?.constants || {}) as Record<string, any>;\n const model: string | null =\n constants.Model || constants.uiMode || constants.Brand\n ? String(constants.Model || constants.uiMode || \"\")\n : null;\n const brand: string | null = constants.Brand ? String(constants.Brand) : null;\n const isEmulator: boolean | null =\n typeof constants.isTesting === \"boolean\" ? constants.isTesting : null;\n\n let width = 0;\n let height = 0;\n try {\n const screen = Dimensions?.get(\"screen\") || Dimensions?.get(\"window\");\n if (screen) {\n width = Math.round(screen.width);\n height = Math.round(screen.height);\n }\n } catch {\n // ignore\n }\n\n let pixelRatio = 1;\n let fontScale = 1;\n try {\n pixelRatio = PixelRatio?.get() ?? 1;\n fontScale = PixelRatio?.getFontScale() ?? 1;\n } catch {\n // ignore\n }\n\n const timezone = safeTimezone();\n const timezoneOffset = new Date().getTimezoneOffset();\n const { language, languages } = safeLocale();\n\n const screenResolution = `${width}x${height}`;\n\n const deviceSignature = createFingerprintHash({\n os: platform,\n os_version: osVersion,\n model,\n brand,\n });\n const screenSignature = createFingerprintHash({\n resolution: screenResolution,\n pixel_ratio: pixelRatio,\n font_scale: fontScale,\n });\n const localeSignature = createFingerprintHash({\n timezone,\n timezone_offset: timezoneOffset,\n language,\n });\n\n const fingerprint = createFingerprintHash({\n device: deviceSignature,\n screen: screenSignature,\n locale: localeSignature,\n });\n\n const { id: deviceId, createdAt } = await getDeviceId();\n\n return {\n fingerprint,\n fingerprint_components: {\n device_signature: deviceSignature,\n screen_signature: screenSignature,\n locale_signature: localeSignature,\n },\n device_id: deviceId,\n device_id_created_at: createdAt,\n platform,\n os: platform,\n os_version: osVersion,\n model,\n brand,\n screen_resolution: screenResolution,\n device_pixel_ratio: pixelRatio,\n font_scale: fontScale,\n timezone,\n timezone_offset: timezoneOffset,\n language,\n languages,\n is_emulator: isEmulator,\n };\n}\n","/**\n * Touch / gesture dynamics tracker for React Native.\n *\n * Pure JS, analogous to the browser touch tracker but fed by handlers the\n * developer attaches to RN gesture responders (PanResponder / onTouch* props).\n * It records tap intervals, touch pressure/force (when reported), swipe\n * velocity and touch durations, then derives stable behavioral metrics.\n */\n\nimport type { TouchMetrics } from \"../types\";\n\n/** A single touch sample. Shaped to accept RN GestureResponderEvent fields. */\nexport interface TouchSample {\n x: number;\n y: number;\n timestamp: number;\n /** Pressure/force 0..1 (iOS 3D-touch / pencil); 0 when unreported. */\n force?: number;\n}\n\n/** Subset of an RN GestureResponderEvent we read from. */\ninterface RNTouchEventLike {\n nativeEvent?: {\n locationX?: number;\n locationY?: number;\n pageX?: number;\n pageY?: number;\n force?: number;\n timestamp?: number;\n touches?: unknown[];\n };\n}\n\nfunction now(): number {\n return typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n}\n\nfunction mean(values: number[]): number {\n if (values.length === 0) return 0;\n return values.reduce((s, v) => s + v, 0) / values.length;\n}\n\nfunction stdDev(values: number[]): number {\n if (values.length < 2) return 0;\n const m = mean(values);\n return Math.sqrt(mean(values.map((v) => (v - m) ** 2)));\n}\n\nexport class TouchTracker {\n private samples: TouchSample[] = [];\n private touchDurations: number[] = [];\n private tapTimestamps: number[] = [];\n private activeStart: number | null = null;\n private multiTouchCount = 0;\n private startTime: number | null = null;\n private tracking = false;\n\n start(): void {\n this.tracking = true;\n this.reset();\n this.tracking = true;\n }\n\n stop(): void {\n this.tracking = false;\n }\n\n reset(): void {\n this.samples = [];\n this.touchDurations = [];\n this.tapTimestamps = [];\n this.activeStart = null;\n this.multiTouchCount = 0;\n this.startTime = null;\n }\n\n private extract(e: RNTouchEventLike): TouchSample {\n const ne = e?.nativeEvent || {};\n const x = ne.locationX ?? ne.pageX ?? 0;\n const y = ne.locationY ?? ne.pageY ?? 0;\n const ts = ne.timestamp ?? now();\n return { x, y, timestamp: ts, force: ne.force ?? 0 };\n }\n\n /** Call on touch/gesture start (e.g. onResponderGrant / onTouchStart). */\n handleTouchStart(e: RNTouchEventLike): void {\n if (!this.tracking) return;\n const touches = e?.nativeEvent?.touches;\n if (Array.isArray(touches) && touches.length > 1) {\n this.multiTouchCount++;\n }\n const sample = this.extract(e);\n if (this.startTime === null) this.startTime = sample.timestamp;\n this.activeStart = sample.timestamp;\n this.samples.push(sample);\n }\n\n /** Call on touch/gesture move (e.g. onResponderMove / onTouchMove). */\n handleTouchMove(e: RNTouchEventLike): void {\n if (!this.tracking) return;\n this.samples.push(this.extract(e));\n if (this.samples.length > 1000) {\n this.samples = this.samples.slice(-500);\n }\n }\n\n /** Call on touch/gesture end (e.g. onResponderRelease / onTouchEnd). */\n handleTouchEnd(e: RNTouchEventLike): void {\n if (!this.tracking) return;\n const sample = this.extract(e);\n this.samples.push(sample);\n if (this.activeStart !== null) {\n this.touchDurations.push(sample.timestamp - this.activeStart);\n this.activeStart = null;\n }\n this.tapTimestamps.push(sample.timestamp);\n }\n\n /** Handlers ready to spread onto a View's responder/touch props. */\n getEventHandlers(): {\n onTouchStart: (e: RNTouchEventLike) => void;\n onTouchMove: (e: RNTouchEventLike) => void;\n onTouchEnd: (e: RNTouchEventLike) => void;\n } {\n return {\n onTouchStart: this.handleTouchStart.bind(this),\n onTouchMove: this.handleTouchMove.bind(this),\n onTouchEnd: this.handleTouchEnd.bind(this),\n };\n }\n\n getMetrics(): TouchMetrics {\n const pressures = this.samples.map((s) => s.force ?? 0).filter((f) => f > 0);\n\n const velocities: number[] = [];\n for (let i = 1; i < this.samples.length; i++) {\n const prev = this.samples[i - 1];\n const curr = this.samples[i];\n const dt = (curr.timestamp - prev.timestamp) / 1000;\n if (dt > 0 && dt < 1) {\n const dist = Math.sqrt((curr.x - prev.x) ** 2 + (curr.y - prev.y) ** 2);\n velocities.push(dist / dt);\n }\n }\n\n const tapIntervals: number[] = [];\n for (let i = 1; i < this.tapTimestamps.length; i++) {\n tapIntervals.push(this.tapTimestamps[i] - this.tapTimestamps[i - 1]);\n }\n\n const totalDuration =\n this.samples.length > 1\n ? this.samples[this.samples.length - 1].timestamp - this.samples[0].timestamp\n : 0;\n\n return {\n avgPressure: mean(pressures),\n pressureStdDev: stdDev(pressures),\n avgSwipeVelocity: mean(velocities),\n touchCount: this.samples.length,\n tapCount: this.tapTimestamps.length,\n avgTapInterval: mean(tapIntervals),\n tapIntervalStdDev: stdDev(tapIntervals),\n avgTouchDuration: mean(this.touchDurations),\n multiTouchCount: this.multiTouchCount,\n totalDuration,\n };\n }\n\n getRawData(): TouchSample[] {\n return [...this.samples];\n }\n}\n\nexport function createTouchTracker(): TouchTracker {\n return new TouchTracker();\n}\n","import { SimplrError } from \"./errors\";\n\nexport interface HttpConfig {\n /** Auth headers, e.g. { \"X-API-Key\": \"pk_…\" }. */\n authHeaders: Record<string, string>;\n baseUrl: string;\n /** Per-request timeout in ms (default 15000). */\n timeoutMs: number;\n /** Override fetch (defaults to the RN/global fetch). */\n fetchImpl?: typeof fetch;\n}\n\n/**\n * Internal request helper. Sends the public X-API-Key, applies a 15s timeout\n * via AbortController, and unwraps the standard `{ success, message, content }`\n * envelope (returning `content`). Non-2xx and network/timeout errors raise\n * SimplrError to stay contract-compatible with the other SDKs.\n */\nexport async function apiRequest<T>(\n cfg: HttpConfig,\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\",\n path: string,\n body?: unknown,\n): Promise<T> {\n const fetchImpl = cfg.fetchImpl ?? (globalThis.fetch as typeof fetch);\n if (typeof fetchImpl !== \"function\") {\n throw new SimplrError(\"global fetch is not available in this environment\", 0, null);\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), cfg.timeoutMs);\n try {\n const res = await fetchImpl(`${cfg.baseUrl}${path}`, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n ...cfg.authHeaders,\n },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n const text = await res.text();\n let parsed: any;\n try {\n parsed = text ? JSON.parse(text) : undefined;\n } catch {\n parsed = text;\n }\n\n if (!res.ok) {\n const message =\n (parsed && (parsed.message || parsed.error)) || `Simplr API error ${res.status}`;\n throw new SimplrError(message, res.status, parsed);\n }\n\n // Unwrap the standard envelope when present.\n return (parsed && typeof parsed === \"object\" && \"content\" in parsed\n ? parsed.content\n : parsed) as T;\n } catch (err) {\n if (err instanceof SimplrError) throw err;\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new SimplrError(`Request to ${path} timed out after ${cfg.timeoutMs}ms`, 0, null);\n }\n throw new SimplrError(err instanceof Error ? err.message : \"Network error\", 0, null);\n } finally {\n clearTimeout(timer);\n }\n}\n\n/** Strip trailing slashes from a base URL (contract convention). */\nexport function normalizeBaseUrl(url: string): string {\n return url.replace(/\\/+$/, \"\");\n}\n","/**\n * Anonymous user profile management + order fraud monitoring for React Native.\n *\n * Configure with a PUBLIC key (pk_…). Ported from the browser SimplrProfiles,\n * but reuses the RN http helper (which sends `X-API-Key` and unwraps the\n * `{ success, message, content }` envelope) and the shared SimplrError.\n */\n\nimport { apiRequest, normalizeBaseUrl, type HttpConfig } from \"./http\";\nimport type {\n DeviceSignals,\n IdentifyOptions,\n OrderInput,\n OrderResult,\n ProfileResult,\n ProfileRiskResult,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api.simplr.sh\";\n\nexport interface SimplrProfilesConfig {\n /** Public API key (pk_*). */\n apiKey: string;\n /** API base URL (default https://api.simplr.sh). */\n baseUrl?: string;\n /** Per-request timeout in ms (default 15000). */\n timeoutMs?: number;\n /** Override fetch (defaults to the RN/global fetch). */\n fetchImpl?: typeof fetch;\n}\n\nexport class SimplrProfiles {\n private apiKey = \"\";\n private baseUrl = DEFAULT_BASE_URL;\n private timeoutMs = 15000;\n private fetchImpl?: typeof fetch;\n private collectDeviceSignalsFn?: () => Promise<DeviceSignals>;\n private configured = false;\n\n constructor(config?: SimplrProfilesConfig) {\n if (config) this.configure(config);\n }\n\n configure(config: SimplrProfilesConfig): this {\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl ? normalizeBaseUrl(config.baseUrl) : DEFAULT_BASE_URL;\n if (config.timeoutMs !== undefined) this.timeoutMs = config.timeoutMs;\n this.fetchImpl = config.fetchImpl;\n this.configured = true;\n return this;\n }\n\n /**\n * Set the device-signal collector so identify()/submitOrder() can auto-attach\n * a fingerprint. The main client wires this to its own collector.\n */\n setDeviceSignalCollector(fn: () => Promise<DeviceSignals>): void {\n this.collectDeviceSignalsFn = fn;\n }\n\n private requireConfigured(): void {\n if (!this.configured || !this.apiKey) {\n throw new Error(\"SimplrProfiles is not configured. Call configure({ apiKey }) first.\");\n }\n }\n\n private get httpConfig(): HttpConfig {\n return {\n authHeaders: { \"X-API-Key\": this.apiKey },\n baseUrl: this.baseUrl,\n timeoutMs: this.timeoutMs,\n fetchImpl: this.fetchImpl,\n };\n }\n\n /** Create or update an anonymous profile and link the current device. */\n async identify(externalId: string, options?: IdentifyOptions): Promise<ProfileResult> {\n this.requireConfigured();\n const { profileType, deviceSignals, ...rest } = options ?? {};\n let signals = deviceSignals;\n if (!signals && this.collectDeviceSignalsFn) {\n try {\n signals = await this.collectDeviceSignalsFn();\n } catch {\n // proceed without a fingerprint\n }\n }\n const body: Record<string, unknown> = {\n external_id: externalId,\n profile_type: profileType || \"customer\",\n ...rest,\n };\n if (signals) body.fingerprint_hash = signals.fingerprint;\n return apiRequest<ProfileResult>(this.httpConfig, \"POST\", \"/v1/profiles\", body);\n }\n\n /** Submit an order for real-time fraud scoring; auto-attaches a fingerprint. */\n async submitOrder(order: OrderInput): Promise<OrderResult> {\n this.requireConfigured();\n let body: OrderInput = order;\n if (!order.fingerprint_hash && this.collectDeviceSignalsFn) {\n try {\n const signals = await this.collectDeviceSignalsFn();\n body = { ...order, fingerprint_hash: signals.fingerprint };\n } catch {\n // send as-is\n }\n }\n return apiRequest<OrderResult>(this.httpConfig, \"POST\", \"/v1/orders\", body);\n }\n\n /** Get the risk profile for a user. */\n async getProfileRisk(externalId: string): Promise<ProfileRiskResult> {\n this.requireConfigured();\n return apiRequest<ProfileRiskResult>(\n this.httpConfig,\n \"GET\",\n `/v1/profiles/${encodeURIComponent(externalId)}`,\n );\n }\n\n /** Report a profile as fraud or legitimate. */\n async reportOutcome(externalId: string, outcome: \"fraud\" | \"legitimate\"): Promise<void> {\n this.requireConfigured();\n await apiRequest(\n this.httpConfig,\n \"POST\",\n `/v1/profiles/${encodeURIComponent(externalId)}/outcome`,\n { outcome },\n );\n }\n}\n\n/** Convenience singleton. */\nexport const simplrProfiles = new SimplrProfiles();\n","/**\n * SimplrRUM — Real User Monitoring for React Native.\n *\n * Configure with a PUBLIC key (pk_…). Batches events and flushes them to\n * POST /v1/rum/events using a timer-based flush (setInterval). There are no\n * native dependencies — screen views are captured via the public trackView()\n * API the developer calls (or the useTrackView hook). Reuses the RN http helper\n * (`X-API-Key` + envelope unwrapping) and the shared SimplrError.\n */\n\nimport { apiRequest, normalizeBaseUrl, type HttpConfig } from \"./http\";\nimport type { RUMEvent, RUMEventType, RUMLogLevel } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api.simplr.sh\";\nconst DEFAULT_BATCH_SIZE = 30;\nconst DEFAULT_FLUSH_INTERVAL = 10000;\n\nexport interface SimplrRUMConfig {\n /** Public API key (pk_*). */\n apiKey: string;\n /** Application identifier (required). */\n applicationId: string;\n /** Optional version/environment tags applied to every event. */\n applicationVersion?: string;\n environment?: string;\n /** API base URL (default https://api.simplr.sh). */\n baseUrl?: string;\n /** Flush when this many events are queued (default 30). */\n batchSize?: number;\n /** Background flush interval in ms (default 10000; 0 disables the timer). */\n flushInterval?: number;\n /** Per-request timeout in ms (default 15000). */\n timeoutMs?: number;\n /** Override fetch (defaults to the RN/global fetch). */\n fetchImpl?: typeof fetch;\n}\n\nfunction genId(): string {\n return Date.now().toString(36) + Math.random().toString(36).slice(2, 10);\n}\n\nexport class SimplrRUM {\n private config: SimplrRUMConfig | null = null;\n private initialized = false;\n private baseUrl = DEFAULT_BASE_URL;\n private timeoutMs = 15000;\n private fetchImpl?: typeof fetch;\n private batchSize = DEFAULT_BATCH_SIZE;\n\n private queue: RUMEvent[] = [];\n private timer: ReturnType<typeof setInterval> | null = null;\n private flushing = false;\n\n private sessionId: string | null = null;\n private currentViewId: string | null = null;\n private userId?: string;\n private userAttributes?: Record<string, unknown>;\n private globalAttributes: Record<string, unknown> = {};\n\n /** Initialize the SDK, start a session, and begin the flush timer. */\n initialize(config: SimplrRUMConfig): void {\n if (this.initialized) return;\n this.config = config;\n this.baseUrl = config.baseUrl ? normalizeBaseUrl(config.baseUrl) : DEFAULT_BASE_URL;\n if (config.timeoutMs !== undefined) this.timeoutMs = config.timeoutMs;\n this.fetchImpl = config.fetchImpl;\n this.batchSize = config.batchSize ?? DEFAULT_BATCH_SIZE;\n this.sessionId = genId();\n this.initialized = true;\n\n this.trackEvent(\"session_start\");\n\n const interval = config.flushInterval ?? DEFAULT_FLUSH_INTERVAL;\n if (interval > 0 && typeof setInterval !== \"undefined\") {\n this.timer = setInterval(() => {\n void this.flush();\n }, interval);\n // Don't keep the RN/Node event loop alive just for flushes (matters in tests/SSR).\n (this.timer as any)?.unref?.();\n }\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n private get httpConfig(): HttpConfig {\n return {\n authHeaders: { \"X-API-Key\": this.config!.apiKey },\n baseUrl: this.baseUrl,\n timeoutMs: this.timeoutMs,\n fetchImpl: this.fetchImpl,\n };\n }\n\n /** Associate subsequent events with a user. */\n setUser(userId: string, attributes?: Record<string, unknown>): void {\n this.userId = userId;\n this.userAttributes = attributes;\n }\n\n clearUser(): void {\n this.userId = undefined;\n this.userAttributes = undefined;\n }\n\n addAttribute(key: string, value: unknown): void {\n this.globalAttributes[key] = value;\n }\n\n removeAttribute(key: string): void {\n delete this.globalAttributes[key];\n }\n\n /** Track a screen view (call from your navigation listener or useTrackView). */\n trackView(name: string, attributes?: Record<string, unknown>): void {\n if (!this.initialized) return;\n this.currentViewId = genId();\n this.trackEvent(\"view\", { view: { id: this.currentViewId, name }, attributes });\n }\n\n /** Track a user action (tap, swipe, submit, …). */\n trackAction(name: string, attributes?: Record<string, unknown>): void {\n if (!this.initialized) return;\n this.trackEvent(\"action\", { action: { name, type: \"custom\" }, attributes });\n }\n\n /** Track an error. */\n trackError(\n error: Error | { message: string; stack?: string; type?: string },\n attributes?: Record<string, unknown>,\n ): void {\n if (!this.initialized) return;\n const data =\n error instanceof Error\n ? { message: error.message, stack: error.stack, type: error.constructor.name }\n : error;\n this.trackEvent(\"error\", { error: data, attributes });\n }\n\n /** Emit a log line. */\n log(level: RUMLogLevel, message: string, attributes?: Record<string, unknown>): void {\n if (!this.initialized) return;\n this.trackEvent(\"log\", { log: { level, message }, attributes });\n }\n\n private trackEvent(type: RUMEventType, data?: Partial<RUMEvent>): void {\n if (!this.initialized || !this.sessionId) return;\n const event: RUMEvent = {\n type,\n timestamp: Date.now(),\n sessionId: this.sessionId,\n viewId: this.currentViewId || undefined,\n userId: this.userId,\n applicationId: this.config!.applicationId,\n applicationVersion: this.config?.applicationVersion,\n environment: this.config?.environment,\n platform: \"react-native\",\n userAttributes: this.userAttributes,\n globalAttributes:\n Object.keys(this.globalAttributes).length > 0 ? this.globalAttributes : undefined,\n ...data,\n };\n this.queue.push(event);\n if (this.queue.length >= this.batchSize) void this.flush();\n }\n\n /** Flush queued events to POST /v1/rum/events. */\n async flush(): Promise<void> {\n if (this.flushing || this.queue.length === 0 || !this.config) return;\n this.flushing = true;\n const events = this.queue;\n this.queue = [];\n try {\n await apiRequest(this.httpConfig, \"POST\", \"/v1/rum/events\", {\n events,\n sentAt: Date.now(),\n });\n } catch {\n // Re-queue on failure so events aren't lost.\n this.queue = [...events, ...this.queue];\n } finally {\n this.flushing = false;\n }\n }\n\n /** End the session, flush remaining events, and stop the timer. */\n async stopSession(): Promise<void> {\n if (!this.initialized) return;\n this.trackEvent(\"session_end\");\n await this.flush();\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n this.initialized = false;\n }\n\n getSessionId(): string | null {\n return this.sessionId;\n }\n\n getViewId(): string | null {\n return this.currentViewId;\n }\n}\n\n/** Convenience singleton. */\nexport const simplrRUM = new SimplrRUM();\n","/**\n * AI delegation (SimplrAI) for React Native — OAuth-like AI authentication.\n *\n * Configure with a PUBLIC key (pk_…). Mint, validate, and revoke delegation\n * tokens an end user shares with their AI agent. Reuses the RN http helper\n * (`X-API-Key` + envelope unwrapping) and the shared SimplrError.\n *\n * The browser SDK's interactive `connect()` popup is browser-only (uses\n * window.open / postMessage) and is intentionally omitted here — use\n * createDelegation() to mint tokens directly.\n */\n\nimport { apiRequest, normalizeBaseUrl, type HttpConfig } from \"./http\";\nimport type {\n CreateDelegationOptions,\n DelegationInfo,\n DelegationResult,\n DelegationStats,\n ValidationResult,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api.simplr.sh\";\n\nexport interface SimplrAIConfig {\n /** API key (public pk_* for clients). */\n apiKey: string;\n /** API base URL (default https://api.simplr.sh). */\n baseUrl?: string;\n timeoutMs?: number;\n fetchImpl?: typeof fetch;\n}\n\nfunction mapDelegation(d: any): DelegationInfo {\n return {\n delegationId: d.delegation_id,\n endUserId: d.end_user_id,\n bindingMode: d.binding_mode,\n status: d.status,\n expiresAt: d.expires_at,\n useCount: d.use_count,\n lastUsedAt: d.last_used_at,\n createdAt: d.created_at,\n };\n}\n\nexport class SimplrAI {\n private apiKey = \"\";\n private baseUrl = DEFAULT_BASE_URL;\n private timeoutMs = 15000;\n private fetchImpl?: typeof fetch;\n private configured = false;\n\n constructor(config?: SimplrAIConfig) {\n if (config) this.configure(config);\n }\n\n configure(config: SimplrAIConfig): this {\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl ? normalizeBaseUrl(config.baseUrl) : DEFAULT_BASE_URL;\n if (config.timeoutMs !== undefined) this.timeoutMs = config.timeoutMs;\n this.fetchImpl = config.fetchImpl;\n this.configured = true;\n return this;\n }\n\n private requireConfigured(): void {\n if (!this.configured || !this.apiKey) {\n throw new Error(\"SimplrAI is not configured. Call configure({ apiKey }) first.\");\n }\n }\n\n private get httpConfig(): HttpConfig {\n return {\n authHeaders: { \"X-API-Key\": this.apiKey },\n baseUrl: this.baseUrl,\n timeoutMs: this.timeoutMs,\n fetchImpl: this.fetchImpl,\n };\n }\n\n /** Create a new AI delegation token for a user. POST /v1/ai/delegations. */\n async createDelegation(options: CreateDelegationOptions): Promise<DelegationResult> {\n this.requireConfigured();\n const content = await apiRequest<any>(this.httpConfig, \"POST\", \"/v1/ai/delegations\", {\n end_user_id: options.userId,\n end_user_email: options.email,\n binding: options.binding || \"any_location\",\n expires_in_days: options.expiresInDays || 7,\n session_id: options.sessionId,\n fingerprint_hash: options.fingerprintHash,\n });\n const d = content.delegation;\n return {\n token: d.token,\n delegationId: d.delegation_id,\n expiresAt: d.expires_at,\n bindingMode: d.binding_mode,\n };\n }\n\n /** Validate (introspect) an AI delegation token. POST /v1/ai/validate. */\n async validate(\n token: string,\n options?: { fingerprintHash?: string; aiProvider?: string; action?: string },\n ): Promise<ValidationResult> {\n this.requireConfigured();\n try {\n const content = await apiRequest<any>(this.httpConfig, \"POST\", \"/v1/ai/validate\", {\n token,\n fingerprint_hash: options?.fingerprintHash,\n ai_provider: options?.aiProvider,\n action: options?.action,\n });\n return {\n valid: true,\n sessionType: content.session_type,\n endUserId: content.end_user_id,\n delegation: content.delegation\n ? {\n delegationId: content.delegation.delegation_id,\n bindingMode: content.delegation.binding_mode,\n expiresAt: content.delegation.expires_at,\n useCount: content.delegation.use_count,\n }\n : undefined,\n };\n } catch (err) {\n return { valid: false, error: err instanceof Error ? err.message : \"Validation failed\" };\n }\n }\n\n /** Revoke a delegation. POST /v1/ai/delegations/{id}/revoke. */\n async revoke(delegationId: string, reason?: string): Promise<void> {\n this.requireConfigured();\n await apiRequest(\n this.httpConfig,\n \"POST\",\n `/v1/ai/delegations/${encodeURIComponent(delegationId)}/revoke`,\n { reason },\n );\n }\n\n /** List delegations, optionally filtered by user. GET /v1/ai/delegations. */\n async list(userId?: string): Promise<DelegationInfo[]> {\n this.requireConfigured();\n const path = userId\n ? `/v1/ai/delegations?end_user_id=${encodeURIComponent(userId)}`\n : \"/v1/ai/delegations\";\n const content = await apiRequest<any>(this.httpConfig, \"GET\", path);\n return (content.delegations || []).map(mapDelegation);\n }\n\n /** Get a single delegation. GET /v1/ai/delegations/{id}. */\n async get(delegationId: string): Promise<DelegationInfo> {\n this.requireConfigured();\n const content = await apiRequest<any>(\n this.httpConfig,\n \"GET\",\n `/v1/ai/delegations/${encodeURIComponent(delegationId)}`,\n );\n return mapDelegation(content.delegation);\n }\n\n /** Get delegation statistics. GET /v1/ai/stats. */\n async stats(): Promise<DelegationStats> {\n this.requireConfigured();\n const content = await apiRequest<any>(this.httpConfig, \"GET\", \"/v1/ai/stats\");\n const s = content.stats;\n return {\n totalDelegations: s.total_delegations,\n activeDelegations: s.active_delegations,\n totalUses: s.total_uses,\n delegationsByBinding: {\n verifiedDevice: s.delegations_by_binding.verified_device,\n anyLocation: s.delegations_by_binding.any_location,\n },\n };\n }\n\n /** Revoke all delegations for a user (e.g. on logout). POST /v1/ai/revoke-all. */\n async revokeAllForUser(userId: string, reason?: string): Promise<number> {\n this.requireConfigured();\n const content = await apiRequest<any>(this.httpConfig, \"POST\", \"/v1/ai/revoke-all\", {\n end_user_id: userId,\n reason,\n });\n return content.revoked_count;\n }\n}\n\n/** Convenience singleton. */\nexport const simplrAI = new SimplrAI();\n","/**\n * SimplrFraud — the React Native client surface.\n *\n * Configure with a PUBLIC key (pk_…), collect device signals, run fraud checks\n * (POST /v1/check), submit orders (POST /v1/orders), and optionally identify\n * profiles. Uses the global fetch (available in React Native).\n */\n\nimport { apiRequest, normalizeBaseUrl } from \"./http\";\nimport { collectDeviceSignals } from \"./device/signals\";\nimport { TouchTracker, createTouchTracker } from \"./biometrics/touch\";\nimport { SimplrProfiles } from \"./profiles\";\nimport { SimplrRUM } from \"./rum\";\nimport { SimplrAI } from \"./ai\";\nimport type {\n DeviceSignals,\n BehaviorSignals,\n CollectedSignals,\n CheckInput,\n CheckResult,\n OrderInput,\n OrderResult,\n} from \"./types\";\n\nexport interface SimplrFraudConfig {\n /** Public API key (pk_live_… / pk_test_…). Safe for client use. */\n apiKey: string;\n /** API base URL (default https://api.simplr.sh). Trailing slashes stripped. */\n baseUrl?: string;\n /** Per-request timeout in ms (default 15000). */\n timeoutMs?: number;\n /** Begin collecting touch biometrics immediately (default true). */\n autoStart?: boolean;\n /** Override fetch (defaults to the RN/global fetch). */\n fetchImpl?: typeof fetch;\n}\n\nconst DEFAULT_BASE_URL = \"https://api.simplr.sh\";\n\nexport class SimplrFraud {\n private apiKey = \"\";\n private baseUrl = DEFAULT_BASE_URL;\n private timeoutMs = 15000;\n private fetchImpl?: typeof fetch;\n private touchTracker: TouchTracker;\n private formStartTime: number | null = null;\n private configured = false;\n\n /** Anonymous user profiles + order fraud monitoring (shares this client's config). */\n readonly profiles: SimplrProfiles;\n /** Real User Monitoring — batched events to /v1/rum/events. */\n readonly rum: SimplrRUM;\n /** AI delegation — OAuth-like AI authentication. */\n readonly ai: SimplrAI;\n\n constructor(config?: SimplrFraudConfig) {\n this.touchTracker = createTouchTracker();\n this.profiles = new SimplrProfiles();\n this.rum = new SimplrRUM();\n this.ai = new SimplrAI();\n // Let profiles auto-attach the device fingerprint.\n this.profiles.setDeviceSignalCollector(() => this.getDeviceSignals());\n if (config) this.configure(config);\n }\n\n /** Configure (or re-configure) the client. */\n configure(config: SimplrFraudConfig): this {\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl ? normalizeBaseUrl(config.baseUrl) : DEFAULT_BASE_URL;\n if (config.timeoutMs !== undefined) this.timeoutMs = config.timeoutMs;\n this.fetchImpl = config.fetchImpl;\n this.configured = true;\n // Propagate config to the feature sub-clients (public-key surface).\n const sub = {\n apiKey: this.apiKey,\n baseUrl: this.baseUrl,\n timeoutMs: this.timeoutMs,\n fetchImpl: this.fetchImpl,\n };\n this.profiles.configure(sub);\n this.ai.configure(sub);\n if (config.autoStart ?? true) {\n this.startTracking();\n }\n return this;\n }\n\n private requireConfigured(): void {\n if (!this.configured || !this.apiKey) {\n throw new Error(\"SimplrFraud is not configured. Call configure({ apiKey }) first.\");\n }\n }\n\n private get httpConfig() {\n return {\n authHeaders: { \"X-API-Key\": this.apiKey },\n baseUrl: this.baseUrl,\n timeoutMs: this.timeoutMs,\n fetchImpl: this.fetchImpl,\n };\n }\n\n // --- Biometrics ---------------------------------------------------------\n\n /** Start collecting touch biometrics and reset the form timer. */\n startTracking(): void {\n this.touchTracker.start();\n this.formStartTime = nowMs();\n }\n\n stopTracking(): void {\n this.touchTracker.stop();\n }\n\n reset(): void {\n this.touchTracker.reset();\n this.formStartTime = nowMs();\n }\n\n /** The shared touch tracker; attach its handlers to your Views. */\n getTouchTracker(): TouchTracker {\n return this.touchTracker;\n }\n\n collectBehaviorSignals(): BehaviorSignals {\n const signals: BehaviorSignals = {\n touch: this.touchTracker.getMetrics(),\n };\n if (this.formStartTime !== null) {\n signals.form_fill_time = nowMs() - this.formStartTime;\n }\n return signals;\n }\n\n // --- Device signals -----------------------------------------------------\n\n /** Collect stable device signals from React Native APIs. */\n async getDeviceSignals(): Promise<DeviceSignals> {\n return collectDeviceSignals();\n }\n\n /** Collect device + behavior signals together. */\n async collect(): Promise<CollectedSignals> {\n const device = await this.getDeviceSignals();\n return {\n device,\n behavior: this.collectBehaviorSignals(),\n collected_at: new Date().toISOString(),\n };\n }\n\n // --- API calls ----------------------------------------------------------\n\n /**\n * Run a fraud check. Device + behavior signals are auto-collected and merged\n * into the request unless already present on `input`.\n */\n async check(input: CheckInput = {}): Promise<CheckResult> {\n this.requireConfigured();\n const collected = await this.collect();\n const body: CheckInput = {\n ...input,\n device: input.device ?? (collected.device as unknown as Record<string, unknown>),\n behavior: input.behavior ?? (collected.behavior as unknown as Record<string, unknown>),\n };\n return apiRequest<CheckResult>(this.httpConfig, \"POST\", \"/v1/check\", body);\n }\n\n /** Submit an order for scoring (POST /v1/orders). */\n async submitOrder(order: OrderInput): Promise<OrderResult> {\n this.requireConfigured();\n let body: OrderInput = order;\n if (!order.fingerprint_hash) {\n try {\n const device = await this.getDeviceSignals();\n body = { ...order, fingerprint_hash: device.fingerprint };\n } catch {\n // Send the order as-is if signal collection fails.\n }\n }\n return apiRequest<OrderResult>(this.httpConfig, \"POST\", \"/v1/orders\", body);\n }\n\n /**\n * Identify/associate the current device with an external profile id.\n * Sends a profile check via POST /v1/check with the device signals attached.\n */\n async identify(\n externalId: string,\n metadata?: Record<string, unknown>,\n ): Promise<CheckResult> {\n this.requireConfigured();\n const device = await this.getDeviceSignals();\n return apiRequest<CheckResult>(this.httpConfig, \"POST\", \"/v1/check\", {\n event_type: \"identify\",\n event_id: externalId,\n device: device as unknown as Record<string, unknown>,\n metadata,\n });\n }\n}\n\nfunction nowMs(): number {\n return typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n}\n\n/** Convenience singleton for simple apps. */\nexport const simplr = new SimplrFraud();\n","/**\n * Feature flags with deterministic per-user rollout + targeting.\n *\n * Ported from @simplr-ai/js. Flags are fetched once from\n * GET /v1/flags (public key) and refreshed on an interval, then evaluated\n * locally — no network call per `isEnabled`. Bucketing uses the verbatim\n * murmurHash3 port so it matches the server/browser/Node/Flutter exactly.\n */\n\nimport { murmurHash3 } from \"./hash\";\nimport { normalizeBaseUrl } from \"./http\";\nimport type { FlagDefinition, FlagRule, EvalContext } from \"./types\";\n\nexport interface SimplrFlagsConfig {\n /** Public API key (pk_*). */\n apiKey: string;\n /** API base URL (default https://api.simplr.sh). */\n baseUrl?: string;\n /** Which key environment's flags to load (default: test). */\n environment?: \"live\" | \"test\";\n /** Auto-refresh interval in ms (default 60000; 0 disables). */\n refreshIntervalMs?: number;\n /** Fallback identity used when no userId is supplied (e.g. device_id). */\n defaultUserId?: string;\n /** Override fetch (defaults to global fetch). */\n fetchImpl?: typeof fetch;\n}\n\nfunction matchRule(rule: FlagRule, attributes: Record<string, unknown>): boolean {\n const actual = attributes[rule.attribute];\n switch (rule.op) {\n case \"eq\":\n return String(actual) === rule.value;\n case \"neq\":\n return String(actual) !== rule.value;\n case \"contains\":\n return String(actual ?? \"\").includes(rule.value);\n default:\n return false;\n }\n}\n\nexport class SimplrFlags {\n private apiKey = \"\";\n private baseUrl = \"https://api.simplr.sh\";\n private environment: \"live\" | \"test\" = \"test\";\n private refreshIntervalMs = 60000;\n private flags: Record<string, FlagDefinition> = {};\n private userId?: string;\n private defaultUserId?: string;\n private fetchImpl?: typeof fetch;\n private timer: ReturnType<typeof setInterval> | null = null;\n private ready = false;\n\n async initialize(config: SimplrFlagsConfig): Promise<void> {\n this.apiKey = config.apiKey;\n if (config.baseUrl) this.baseUrl = normalizeBaseUrl(config.baseUrl);\n if (config.environment) this.environment = config.environment;\n if (config.refreshIntervalMs !== undefined) this.refreshIntervalMs = config.refreshIntervalMs;\n if (config.defaultUserId) this.defaultUserId = config.defaultUserId;\n this.fetchImpl = config.fetchImpl;\n await this.refresh();\n this.ready = true;\n if (this.refreshIntervalMs > 0 && typeof setInterval !== \"undefined\") {\n this.timer = setInterval(() => this.refresh(), this.refreshIntervalMs);\n // Don't keep the Node event loop alive (matters for tests / SSR).\n (this.timer as any)?.unref?.();\n }\n }\n\n setUser(userId: string): void {\n this.userId = userId;\n }\n\n /** Sets the fallback identity (typically the persisted device_id). */\n setDefaultUser(userId: string): void {\n this.defaultUserId = userId;\n }\n\n async refresh(): Promise<void> {\n const fetchImpl = this.fetchImpl ?? (globalThis.fetch as typeof fetch);\n if (typeof fetchImpl !== \"function\") return;\n try {\n const res = await fetchImpl(\n `${this.baseUrl}/v1/flags?environment=${this.environment}`,\n { headers: { \"X-API-Key\": this.apiKey } },\n );\n if (!res.ok) return;\n const json = await res.json();\n const list: FlagDefinition[] = json?.content?.flags || json?.flags || [];\n const map: Record<string, FlagDefinition> = {};\n for (const f of list) map[f.key] = f;\n this.flags = map;\n } catch {\n // Keep last-known flags on network error.\n }\n }\n\n isEnabled(key: string, ctx?: EvalContext): boolean {\n const f = this.flags[key];\n if (!f || !f.enabled) return false;\n\n const uid = ctx?.userId || this.userId || this.defaultUserId || \"anonymous\";\n if (f.target_user_ids && f.target_user_ids.includes(uid)) return true;\n if (ctx?.attributes && f.rules?.length && f.rules.some((r) => matchRule(r, ctx.attributes!)))\n return true;\n\n if (f.rollout_percentage >= 100) return true;\n if (f.rollout_percentage <= 0) return false;\n const bucket = murmurHash3(`${key}:${uid}`) % 100;\n return bucket < f.rollout_percentage;\n }\n\n getAll(): Record<string, FlagDefinition> {\n return { ...this.flags };\n }\n\n /** Replace the in-memory flag set directly (useful for testing/SSR). */\n setFlags(list: FlagDefinition[]): void {\n const map: Record<string, FlagDefinition> = {};\n for (const f of list) map[f.key] = f;\n this.flags = map;\n this.ready = true;\n }\n\n isReady(): boolean {\n return this.ready;\n }\n\n dispose(): void {\n if (this.timer) clearInterval(this.timer);\n this.timer = null;\n }\n}\n\nexport const simplrFlags = new SimplrFlags();\n"]}
|