@simplr-ai/react-native 1.2.0 → 1.2.2

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.
@@ -954,12 +954,13 @@ var SimplrFraud = class {
954
954
  this.baseUrl = config.baseUrl ? normalizeBaseUrl(config.baseUrl) : DEFAULT_BASE_URL4;
955
955
  if (config.timeoutMs !== void 0) this.timeoutMs = config.timeoutMs;
956
956
  this.fetchImpl = config.fetchImpl;
957
- this.logBodies = config.logBodies ?? config.shipNetworkLogs;
957
+ const logSelf = !!config.logSelfCalls;
958
+ this.logBodies = config.logBodies ?? (config.shipNetworkLogs && logSelf);
958
959
  this.redactFields = config.redactFields;
959
960
  this.configured = true;
960
961
  this.shipper?.stop();
961
962
  this.shipper = void 0;
962
- if (config.shipNetworkLogs) {
963
+ if (config.shipNetworkLogs && logSelf) {
963
964
  this.shipper = new NetworkLogShipper({
964
965
  baseUrl: this.baseUrl,
965
966
  apiKey: this.apiKey,
@@ -1127,12 +1128,19 @@ var SimplrFlags = class {
1127
1128
  this.flags = {};
1128
1129
  this.timer = null;
1129
1130
  this.ready = false;
1131
+ this.etag = null;
1130
1132
  }
1131
1133
  async initialize(config) {
1134
+ if (this.timer) {
1135
+ clearInterval(this.timer);
1136
+ this.timer = null;
1137
+ }
1132
1138
  this.apiKey = config.apiKey;
1133
1139
  if (config.baseUrl) this.baseUrl = normalizeBaseUrl(config.baseUrl);
1134
1140
  if (config.environment) this.environment = config.environment;
1135
- if (config.refreshIntervalMs !== void 0) this.refreshIntervalMs = config.refreshIntervalMs;
1141
+ if (config.refreshIntervalMs !== void 0) {
1142
+ this.refreshIntervalMs = config.refreshIntervalMs > 0 ? Math.max(config.refreshIntervalMs, 3e4) : 0;
1143
+ }
1136
1144
  if (config.defaultUserId) this.defaultUserId = config.defaultUserId;
1137
1145
  this.fetchImpl = config.fetchImpl;
1138
1146
  await this.refresh();
@@ -1153,12 +1161,18 @@ var SimplrFlags = class {
1153
1161
  const fetchImpl = this.fetchImpl ?? globalThis.fetch;
1154
1162
  if (typeof fetchImpl !== "function") return;
1155
1163
  try {
1164
+ const headers = { "X-API-Key": this.apiKey };
1165
+ if (this.etag) headers["If-None-Match"] = this.etag;
1156
1166
  const res = await fetchImpl(
1157
1167
  `${this.baseUrl}/v1/flags?environment=${this.environment}`,
1158
- { headers: { "X-API-Key": this.apiKey } }
1168
+ { headers }
1159
1169
  );
1170
+ if (res.status === 304) return;
1160
1171
  if (!res.ok) return;
1161
- const json = await res.json();
1172
+ const etag = res.headers?.get?.("etag");
1173
+ if (etag) this.etag = etag;
1174
+ const text = await res.text();
1175
+ const json = text ? JSON.parse(text) : {};
1162
1176
  const list = json?.content?.flags || json?.flags || [];
1163
1177
  const map = {};
1164
1178
  for (const f of list) map[f.key] = f;
@@ -1199,5 +1213,5 @@ var SimplrFlags = class {
1199
1213
  var simplrFlags = new SimplrFlags();
1200
1214
 
1201
1215
  export { NetworkLogShipper, SimplrAI, SimplrError, SimplrFlags, SimplrFraud, SimplrProfiles, SimplrRUM, TouchTracker, clearDeviceId, collectDeviceSignals, createFingerprintHash, createTouchTracker, getAsyncStorage, getDeviceId, murmurHash3, simplr, simplrAI, simplrFlags, simplrProfiles, simplrRUM };
1202
- //# sourceMappingURL=chunk-AJZHWHYK.js.map
1203
- //# sourceMappingURL=chunk-AJZHWHYK.js.map
1216
+ //# sourceMappingURL=chunk-3PGKTM6W.js.map
1217
+ //# sourceMappingURL=chunk-3PGKTM6W.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/network-shipper.ts","../src/hash.ts","../src/device/storage.ts","../src/device/signals.ts","../src/biometrics/touch.ts","../src/network-log.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-3PGKTM6W.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","import type { NetworkLogEntry } from \"./network-log\";\n\nexport interface ShipperConfig {\n baseUrl: string;\n apiKey: string;\n fetchImpl: typeof fetch;\n sdk: string;\n applicationId?: string;\n environment?: string;\n batchSize?: number;\n flushIntervalMs?: number;\n}\n\nconst DEFAULT_BATCH = 25;\nconst DEFAULT_FLUSH_MS = 5000;\n\nexport class NetworkLogShipper {\n private readonly cfg: ShipperConfig;\n private queue: NetworkLogEntry[] = [];\n private timer: ReturnType<typeof setInterval> | null = null;\n\n constructor(cfg: ShipperConfig) {\n this.cfg = cfg;\n }\n\n start(): void {\n if (this.timer) return;\n const interval = this.cfg.flushIntervalMs ?? DEFAULT_FLUSH_MS;\n this.timer = setInterval(() => {\n void this.flush();\n }, interval);\n (this.timer as any)?.unref?.();\n }\n\n add(entry: NetworkLogEntry): void {\n this.queue.push({\n ...entry,\n sdk: this.cfg.sdk,\n applicationId: entry.applicationId ?? this.cfg.applicationId,\n environment: entry.environment ?? this.cfg.environment,\n });\n if (this.queue.length >= (this.cfg.batchSize ?? DEFAULT_BATCH)) {\n void this.flush();\n }\n }\n\n async flush(): Promise<void> {\n if (this.queue.length === 0) return;\n const logs = this.queue;\n this.queue = [];\n try {\n await this.cfg.fetchImpl(`${this.cfg.baseUrl}/v1/network-logs`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": this.cfg.apiKey,\n },\n body: JSON.stringify({ logs }),\n });\n } catch {\n /* empty */\n }\n }\n\n stop(): void {\n if (this.timer) clearInterval(this.timer);\n this.timer = null;\n void this.flush();\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","export type NetworkSource = \"frontend\" | \"backend\";\n\nexport interface NetworkLogEntry {\n id: string;\n requestId?: string;\n source: NetworkSource;\n timestamp: string;\n sdk?: string;\n applicationId?: string;\n environment?: string;\n method: string;\n url: string;\n requestHeaders?: Record<string, string>;\n requestBody?: unknown;\n status?: number;\n statusText?: string;\n responseHeaders?: Record<string, string>;\n responseBody?: unknown;\n durationMs?: number;\n ok?: boolean;\n error?: string;\n}\n\nexport type NetworkLogger = (entry: NetworkLogEntry) => void;\n\nconst SENSITIVE_HEADERS = new Set([\n \"authorization\",\n \"cookie\",\n \"set-cookie\",\n \"x-api-key\",\n \"x-auth-token\",\n \"x-csrf-token\",\n \"x-xsrf-token\",\n]);\n\nconst SENSITIVE_KEY_PARTS = [\n \"password\",\n \"passwd\",\n \"secret\",\n \"token\",\n \"api_key\",\n \"apikey\",\n \"authorization\",\n \"auth\",\n \"credential\",\n \"private_key\",\n \"card\",\n \"cardnumber\",\n \"pan\",\n \"cvv\",\n \"cvc\",\n \"ssn\",\n \"pin\",\n \"otp\",\n];\n\nconst MAX_REDACT_DEPTH = 8;\n\nexport const MAX_BODY_CHARS = 10_000;\n\nfunction isSensitiveKey(key: string, extraKeys: string[]): boolean {\n const lower = key.toLowerCase();\n if (extraKeys.some((k) => lower === k.toLowerCase())) return true;\n return SENSITIVE_KEY_PARTS.some((part) => lower.includes(part));\n}\n\nfunction redactDeep(value: unknown, extraKeys: string[], depth = 0): unknown {\n if (depth >= MAX_REDACT_DEPTH) return \"[truncated]\";\n if (Array.isArray(value)) return value.map((v) => redactDeep(v, extraKeys, depth + 1));\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n out[key] = isSensitiveKey(key, extraKeys)\n ? \"[REDACTED]\"\n : redactDeep(val, extraKeys, depth + 1);\n }\n return out;\n }\n return value;\n}\n\nexport function redactHeaders(\n headers: Record<string, string> | Headers | undefined,\n): Record<string, string> | undefined {\n if (!headers) return undefined;\n const out: Record<string, string> = {};\n const set = (key: string, value: string) => {\n out[key] = SENSITIVE_HEADERS.has(key.toLowerCase()) ? \"[REDACTED]\" : value;\n };\n if (typeof (headers as Headers).forEach === \"function\" && !Array.isArray(headers)) {\n (headers as Headers).forEach((value, key) => set(key, value));\n } else {\n for (const [key, value] of Object.entries(headers as Record<string, string>)) {\n set(key, String(value));\n }\n }\n return out;\n}\n\nexport function previewBody(raw: unknown, redactFields: string[] = []): unknown {\n if (raw === undefined || raw === null) return undefined;\n let value: unknown = raw;\n if (typeof raw === \"string\") {\n try {\n value = JSON.parse(raw);\n } catch {\n return raw.length > MAX_BODY_CHARS ? raw.slice(0, MAX_BODY_CHARS) + \"…[truncated]\" : raw;\n }\n }\n const redacted = redactDeep(value, redactFields);\n let text: string;\n try {\n text = JSON.stringify(redacted);\n } catch {\n return \"[unserializable]\";\n }\n if (text.length > MAX_BODY_CHARS) {\n return text.slice(0, MAX_BODY_CHARS) + \"…[truncated]\";\n }\n return redacted;\n}\n\nexport function newLogId(): string {\n const uuid = (globalThis as any)?.crypto?.randomUUID;\n if (typeof uuid === \"function\") return uuid.call((globalThis as any).crypto);\n return `req_${Date.now().toString(36)}${Math.random().toString(36).slice(2, 10)}`;\n}\n","import { SimplrError } from \"./errors\";\nimport {\n newLogId,\n previewBody,\n redactHeaders,\n type NetworkLogger,\n} from \"./network-log\";\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 onNetworkLog?: NetworkLogger;\n logBodies?: boolean;\n redactFields?: string[];\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\n const url = `${cfg.baseUrl}${path}`;\n const requestHeaders = {\n \"Content-Type\": \"application/json\",\n ...cfg.authHeaders,\n };\n const startedAt = Date.now();\n const log = cfg.onNetworkLog\n ? {\n id: newLogId(),\n source: \"frontend\" as const,\n timestamp: new Date(startedAt).toISOString(),\n method,\n url,\n requestHeaders: redactHeaders(requestHeaders),\n requestBody: cfg.logBodies ? previewBody(body, cfg.redactFields) : undefined,\n }\n : null;\n\n const emit = (extra: Record<string, unknown>) => {\n if (!log || !cfg.onNetworkLog) return;\n try {\n cfg.onNetworkLog({ ...log, durationMs: Date.now() - startedAt, ...extra });\n } catch {\n /* empty */\n }\n };\n\n try {\n const res = await fetchImpl(url, {\n method,\n headers: requestHeaders,\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 emit({\n status: res.status,\n statusText: res.statusText,\n ok: res.ok,\n responseHeaders: redactHeaders(res.headers),\n responseBody: cfg.logBodies ? previewBody(parsed ?? text, cfg.redactFields) : undefined,\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 emit({ ok: false, error: `timed out after ${cfg.timeoutMs}ms` });\n throw new SimplrError(`Request to ${path} timed out after ${cfg.timeoutMs}ms`, 0, null);\n }\n emit({ ok: false, error: err instanceof Error ? err.message : \"Network error\" });\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 { NetworkLogger } from \"./network-log\";\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 onNetworkLog?: NetworkLogger;\n logBodies?: boolean;\n redactFields?: string[];\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 onNetworkLog?: NetworkLogger;\n private logBodies?: boolean;\n private redactFields?: string[];\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.onNetworkLog = config.onNetworkLog;\n this.logBodies = config.logBodies;\n this.redactFields = config.redactFields;\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 onNetworkLog: this.onNetworkLog,\n logBodies: this.logBodies,\n redactFields: this.redactFields,\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 { NetworkLogger } from \"./network-log\";\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 onNetworkLog?: NetworkLogger;\n logBodies?: boolean;\n redactFields?: string[];\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 onNetworkLog?: NetworkLogger;\n private logBodies?: boolean;\n private redactFields?: string[];\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.onNetworkLog = config.onNetworkLog;\n this.logBodies = config.logBodies;\n this.redactFields = config.redactFields;\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 onNetworkLog: this.onNetworkLog,\n logBodies: this.logBodies,\n redactFields: this.redactFields,\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 { NetworkLogShipper } from \"./network-shipper\";\nimport type { NetworkLogger } from \"./network-log\";\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 onNetworkLog?: NetworkLogger;\n logBodies?: boolean;\n redactFields?: string[];\n shipNetworkLogs?: boolean;\n applicationId?: string;\n environment?: string;\n logSelfCalls?: boolean;\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 private shipper?: NetworkLogShipper;\n private onNetworkLog?: NetworkLogger;\n private logBodies?: boolean;\n private redactFields?: string[];\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 const logSelf = !!config.logSelfCalls;\n this.logBodies = config.logBodies ?? (config.shipNetworkLogs && logSelf);\n this.redactFields = config.redactFields;\n this.configured = true;\n\n this.shipper?.stop();\n this.shipper = undefined;\n if (config.shipNetworkLogs && logSelf) {\n this.shipper = new NetworkLogShipper({\n baseUrl: this.baseUrl,\n apiKey: this.apiKey,\n fetchImpl: this.fetchImpl ?? (globalThis.fetch as typeof fetch),\n sdk: \"react-native\",\n applicationId: config.applicationId,\n environment: config.environment,\n });\n this.shipper.start();\n }\n\n const shipper = this.shipper;\n const userLog = config.onNetworkLog;\n this.onNetworkLog =\n shipper || userLog\n ? (entry) => {\n shipper?.add(entry);\n userLog?.(entry);\n }\n : undefined;\n\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 onNetworkLog: this.onNetworkLog,\n logBodies: this.logBodies,\n redactFields: this.redactFields,\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 onNetworkLog: this.onNetworkLog,\n logBodies: this.logBodies,\n redactFields: this.redactFields,\n };\n }\n\n /** Flush any queued network logs to /v1/network-logs. */\n flushNetworkLogs(): Promise<void> {\n return this.shipper?.flush() ?? Promise.resolve();\n }\n\n /** Stop the network-log shipper and flush remaining logs. */\n close(): void {\n this.shipper?.stop();\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 private etag: string | null = null;\n\n async initialize(config: SimplrFlagsConfig): Promise<void> {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\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) {\n this.refreshIntervalMs =\n config.refreshIntervalMs > 0 ? Math.max(config.refreshIntervalMs, 30000) : 0;\n }\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 headers: Record<string, string> = { \"X-API-Key\": this.apiKey };\n if (this.etag) headers[\"If-None-Match\"] = this.etag;\n const res = await fetchImpl(\n `${this.baseUrl}/v1/flags?environment=${this.environment}`,\n { headers },\n );\n if (res.status === 304) return;\n if (!res.ok) return;\n const etag = res.headers?.get?.(\"etag\");\n if (etag) this.etag = etag;\n const text = await res.text();\n const json = text ? JSON.parse(text) : {};\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"]}
@@ -549,6 +549,7 @@ interface SimplrFraudConfig {
549
549
  shipNetworkLogs?: boolean;
550
550
  applicationId?: string;
551
551
  environment?: string;
552
+ logSelfCalls?: boolean;
552
553
  }
553
554
  declare class SimplrFraud {
554
555
  private apiKey;
@@ -638,6 +639,7 @@ declare class SimplrFlags {
638
639
  private fetchImpl?;
639
640
  private timer;
640
641
  private ready;
642
+ private etag;
641
643
  initialize(config: SimplrFlagsConfig): Promise<void>;
642
644
  setUser(userId: string): void;
643
645
  /** Sets the fallback identity (typically the persisted device_id). */
@@ -549,6 +549,7 @@ interface SimplrFraudConfig {
549
549
  shipNetworkLogs?: boolean;
550
550
  applicationId?: string;
551
551
  environment?: string;
552
+ logSelfCalls?: boolean;
552
553
  }
553
554
  declare class SimplrFraud {
554
555
  private apiKey;
@@ -638,6 +639,7 @@ declare class SimplrFlags {
638
639
  private fetchImpl?;
639
640
  private timer;
640
641
  private ready;
642
+ private etag;
641
643
  initialize(config: SimplrFlagsConfig): Promise<void>;
642
644
  setUser(userId: string): void;
643
645
  /** Sets the fallback identity (typically the persisted device_id). */
@@ -946,12 +946,13 @@ var SimplrFraud = class {
946
946
  this.baseUrl = config.baseUrl ? normalizeBaseUrl(config.baseUrl) : DEFAULT_BASE_URL4;
947
947
  if (config.timeoutMs !== void 0) this.timeoutMs = config.timeoutMs;
948
948
  this.fetchImpl = config.fetchImpl;
949
- this.logBodies = config.logBodies ?? config.shipNetworkLogs;
949
+ const logSelf = !!config.logSelfCalls;
950
+ this.logBodies = config.logBodies ?? (config.shipNetworkLogs && logSelf);
950
951
  this.redactFields = config.redactFields;
951
952
  this.configured = true;
952
953
  this.shipper?.stop();
953
954
  this.shipper = void 0;
954
- if (config.shipNetworkLogs) {
955
+ if (config.shipNetworkLogs && logSelf) {
955
956
  this.shipper = new NetworkLogShipper({
956
957
  baseUrl: this.baseUrl,
957
958
  apiKey: this.apiKey,
@@ -1119,12 +1120,19 @@ var SimplrFlags = class {
1119
1120
  this.flags = {};
1120
1121
  this.timer = null;
1121
1122
  this.ready = false;
1123
+ this.etag = null;
1122
1124
  }
1123
1125
  async initialize(config) {
1126
+ if (this.timer) {
1127
+ clearInterval(this.timer);
1128
+ this.timer = null;
1129
+ }
1124
1130
  this.apiKey = config.apiKey;
1125
1131
  if (config.baseUrl) this.baseUrl = normalizeBaseUrl(config.baseUrl);
1126
1132
  if (config.environment) this.environment = config.environment;
1127
- if (config.refreshIntervalMs !== void 0) this.refreshIntervalMs = config.refreshIntervalMs;
1133
+ if (config.refreshIntervalMs !== void 0) {
1134
+ this.refreshIntervalMs = config.refreshIntervalMs > 0 ? Math.max(config.refreshIntervalMs, 3e4) : 0;
1135
+ }
1128
1136
  if (config.defaultUserId) this.defaultUserId = config.defaultUserId;
1129
1137
  this.fetchImpl = config.fetchImpl;
1130
1138
  await this.refresh();
@@ -1145,12 +1153,18 @@ var SimplrFlags = class {
1145
1153
  const fetchImpl = this.fetchImpl ?? globalThis.fetch;
1146
1154
  if (typeof fetchImpl !== "function") return;
1147
1155
  try {
1156
+ const headers = { "X-API-Key": this.apiKey };
1157
+ if (this.etag) headers["If-None-Match"] = this.etag;
1148
1158
  const res = await fetchImpl(
1149
1159
  `${this.baseUrl}/v1/flags?environment=${this.environment}`,
1150
- { headers: { "X-API-Key": this.apiKey } }
1160
+ { headers }
1151
1161
  );
1162
+ if (res.status === 304) return;
1152
1163
  if (!res.ok) return;
1153
- const json = await res.json();
1164
+ const etag = res.headers?.get?.("etag");
1165
+ if (etag) this.etag = etag;
1166
+ const text = await res.text();
1167
+ const json = text ? JSON.parse(text) : {};
1154
1168
  const list = json?.content?.flags || json?.flags || [];
1155
1169
  const map = {};
1156
1170
  for (const f of list) map[f.key] = f;