@layers/amba-react-native 3.0.0 → 3.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +7 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -418,7 +418,7 @@ const P = {
|
|
|
418
418
|
roles: "/v1/client/roles",
|
|
419
419
|
referrals: "/v1/client/referrals",
|
|
420
420
|
content: "/v1/client/content",
|
|
421
|
-
deepLinks: "/v1/client/
|
|
421
|
+
deepLinks: "/v1/client/deep-links",
|
|
422
422
|
onboarding: "/v1/client/onboarding"
|
|
423
423
|
};
|
|
424
424
|
function encodePathSegment(s) {
|
|
@@ -736,7 +736,7 @@ const Amba = {
|
|
|
736
736
|
return (await getState().http.get(P.currencies)).data;
|
|
737
737
|
},
|
|
738
738
|
getTransactions: async (currencyKey) => {
|
|
739
|
-
return (await getState().http.get(`${P.currencies}
|
|
739
|
+
return (await getState().http.get(`${P.currencies}/transactions`, { currency_code: currencyKey })).data;
|
|
740
740
|
}
|
|
741
741
|
},
|
|
742
742
|
inventory: {
|
|
@@ -750,7 +750,8 @@ const Amba = {
|
|
|
750
750
|
return (await getState().http.post(`${P.inventory}/purchase`, request)).data;
|
|
751
751
|
},
|
|
752
752
|
consume: async (request) => {
|
|
753
|
-
|
|
753
|
+
const { item_id,...body } = request;
|
|
754
|
+
return (await getState().http.post(`${P.inventory}/${encodePathSegment(item_id)}/consume`, body)).data;
|
|
754
755
|
}
|
|
755
756
|
},
|
|
756
757
|
leaderboards: {
|
|
@@ -774,7 +775,7 @@ const Amba = {
|
|
|
774
775
|
purchase: async (storeKey, purchaseOptionId, receipt) => {
|
|
775
776
|
return (await getState().http.post(`${P.stores}/${encodePathSegment(storeKey)}/purchase`, {
|
|
776
777
|
purchase_option_id: purchaseOptionId,
|
|
777
|
-
receipt
|
|
778
|
+
receipt: receipt ?? {}
|
|
778
779
|
})).data;
|
|
779
780
|
}
|
|
780
781
|
},
|
|
@@ -905,7 +906,7 @@ const Amba = {
|
|
|
905
906
|
},
|
|
906
907
|
referrals: {
|
|
907
908
|
getReferralCode: async () => {
|
|
908
|
-
return (await getState().http.get(`${P.referrals}/
|
|
909
|
+
return (await getState().http.get(`${P.referrals}/my-code`)).data;
|
|
909
910
|
},
|
|
910
911
|
claimReferral: async (code) => {
|
|
911
912
|
return (await getState().http.post(`${P.referrals}/claim`, { code })).data;
|
|
@@ -942,7 +943,7 @@ const Amba = {
|
|
|
942
943
|
},
|
|
943
944
|
deepLinks: {
|
|
944
945
|
get: async (shortCode) => {
|
|
945
|
-
return (await getState().http.get(`${P.deepLinks}/${encodePathSegment(shortCode)}`)).data;
|
|
946
|
+
return (await getState().http.get(`${P.deepLinks}/resolve/${encodePathSegment(shortCode)}`)).data;
|
|
946
947
|
},
|
|
947
948
|
create: async (params) => {
|
|
948
949
|
return (await getState().http.post(P.deepLinks, params)).data;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["cachedStorage: AsyncStorageStatic | null","prefix: string","parts: string[]","h: Record<string, string>","init: RequestInit","response: Response","parsed: unknown","code: string | undefined","envelopeDetails: unknown","details: unknown","persistence: AsyncStoragePersistence","seed: PersistedIdentity","payload: PersistedIdentity","state: RuntimeState | null","response: Response","parsed: { data?: Record<string, unknown> }","version: string | null","query: Record<string, number | undefined>","body: Record<string, unknown>"],"sources":["../src/async-storage-adapter.ts","../src/error.ts","../src/http-client.ts","../src/uuid.ts","../src/identity.ts","../src/index.ts"],"sourcesContent":["/**\n * AsyncStorage-backed identity persistence for React Native.\n *\n * Bridges `@react-native-async-storage/async-storage` (peer-dep, installed\n * by the host app) to the SDK runtime. Reads/writes go through a\n * per-prefix namespace so different amba projects can coexist in the\n * same app.\n *\n * Identity records stored under `${prefix}:identity` survive app restarts.\n */\n\n// Late-imported to avoid bundling the peer-dep — host app installs it.\ntype AsyncStorageStatic = {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\nlet cachedStorage: AsyncStorageStatic | null = null;\n\nasync function getStorage(): Promise<AsyncStorageStatic | null> {\n if (cachedStorage !== null) return cachedStorage;\n try {\n const mod = await import(\"@react-native-async-storage/async-storage\");\n cachedStorage = (mod.default ?? mod) as AsyncStorageStatic;\n return cachedStorage;\n } catch {\n // Host app didn't install the peer dep — fall back to in-memory.\n // amba will still work but identity won't survive app restart.\n return null;\n }\n}\n\nexport class AsyncStoragePersistence {\n private memoryCache = new Map<string, string>();\n\n constructor(private readonly prefix: string) {}\n\n async hydrate(): Promise<void> {\n // Future: when the SDK runtime gains a JS-side persistence bridge,\n // this will pre-load the identity record into memory so the runtime\n // can read it synchronously at init.\n }\n\n async read(key: string): Promise<string | null> {\n const fullKey = `${this.prefix}:${key}`;\n if (this.memoryCache.has(fullKey))\n return this.memoryCache.get(fullKey) ?? null;\n const storage = await getStorage();\n if (!storage) return null;\n const v = await storage.getItem(fullKey);\n if (v !== null) this.memoryCache.set(fullKey, v);\n return v;\n }\n\n async write(key: string, value: string): Promise<void> {\n const fullKey = `${this.prefix}:${key}`;\n this.memoryCache.set(fullKey, value);\n const storage = await getStorage();\n if (storage) await storage.setItem(fullKey, value);\n }\n\n async delete(key: string): Promise<void> {\n const fullKey = `${this.prefix}:${key}`;\n this.memoryCache.delete(fullKey);\n const storage = await getStorage();\n if (storage) await storage.removeItem(fullKey);\n }\n}\n","/**\n * Typed error class for the amba SDK + helper that converts arbitrary\n * thrown values (native Error, plain objects, runtime-emitted errors)\n * into a stable `AmbaApiError` instance.\n *\n * Callers can `instanceof`-narrow safely, branch on `.code`, and pull\n * extra payload from `.details` (raw HTTP body, validation field paths,\n * etc.). The wrapper methods on `Amba` wrap every async call in\n * `toAmbaApiError`, so consumers see one error shape regardless of\n * which layer (network, runtime, validation) failed.\n */\n\n/**\n * Stable error codes surfaced by the SDK. Strings rather than an enum\n * so customers can extend with custom codes by simply throwing\n * `new AmbaApiError(\"MY_CODE\", \"...\")` without coordinating with this\n * package's TypeScript types.\n */\nexport type AmbaApiErrorCode =\n | \"UNAUTHORIZED\"\n | \"FORBIDDEN\"\n | \"NOT_FOUND\"\n | \"CONFLICT\"\n | \"RATE_LIMITED\"\n | \"VALIDATION_ERROR\"\n | \"NETWORK_ERROR\"\n | \"HTTP_ERROR\"\n | \"CIRCUIT_OPEN\"\n | \"CONSENT_NOT_GRANTED\"\n | \"NOT_INITIALIZED\"\n | \"INVALID_CONFIG\"\n | \"INVALID_ARGUMENT\"\n | \"PUSH_PERMISSION_DENIED\"\n | \"PUSH_REGISTRATION_FAILED\"\n | \"NOT_SANDBOX_TIER\"\n | \"UNKNOWN_ERROR\"\n | (string & {});\n\nexport class AmbaApiError extends Error {\n readonly code: AmbaApiErrorCode;\n readonly details?: unknown;\n constructor(\n code: AmbaApiErrorCode,\n message: string,\n details?: unknown,\n ) {\n super(message);\n this.name = \"AmbaApiError\";\n this.code = code;\n this.details = details;\n // Restore prototype chain when transpiled to ES5 targets — Error\n // subclasses lose their prototype otherwise and `instanceof` breaks.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Best-effort: pull a stable error code out of a Rust `AmbaError`\n * Display string. Used by `toAmbaApiError` when the underlying thrown\n * value is a generic `Error` produced by `wasm-bindgen`'s `JsError::new`.\n *\n * Keep in sync with `sdks/core/src/error.rs::AmbaError`'s `#[error]`\n * format strings — but the parser falls back to UNKNOWN_ERROR for any\n * pattern it doesn't recognize, so a stale match list isn't a footgun,\n * just a quality-of-life regression.\n */\nfunction codeFromMessage(message: string): AmbaApiErrorCode {\n // Cheapest checks first — most production errors are auth or HTTP.\n if (message.startsWith(\"Unauthorized\")) return \"UNAUTHORIZED\";\n if (message.startsWith(\"Forbidden\")) return \"FORBIDDEN\";\n if (message.startsWith(\"Not found\")) return \"NOT_FOUND\";\n if (message.startsWith(\"Conflict\")) return \"CONFLICT\";\n if (message.startsWith(\"Rate limited\")) return \"RATE_LIMITED\";\n if (message.startsWith(\"Validation error\")) return \"VALIDATION_ERROR\";\n if (message.startsWith(\"Network error\")) return \"NETWORK_ERROR\";\n if (message.startsWith(\"HTTP error\")) return \"HTTP_ERROR\";\n if (message.startsWith(\"Circuit breaker\")) return \"CIRCUIT_OPEN\";\n if (message.startsWith(\"Consent not granted\")) return \"CONSENT_NOT_GRANTED\";\n if (message.includes(\"not initialized\")) return \"NOT_INITIALIZED\";\n if (message.startsWith(\"Invalid configuration\")) return \"INVALID_CONFIG\";\n if (message.startsWith(\"Invalid argument\")) return \"INVALID_ARGUMENT\";\n return \"UNKNOWN_ERROR\";\n}\n\n/**\n * Coerce any thrown value into an `AmbaApiError`. Idempotent — passing\n * an existing `AmbaApiError` returns it unchanged so wrappers can stack\n * without re-wrapping.\n *\n * Heuristics:\n * 1. Existing `AmbaApiError` → returned as-is.\n * 2. Object with `.code` → use that code + `.message` + `.details`.\n * 3. `Error` (e.g. runtime-emitted error) → infer code from message prefix.\n * 4. Anything else → stringify and tag UNKNOWN_ERROR.\n */\nexport function toAmbaApiError(err: unknown): AmbaApiError {\n if (err instanceof AmbaApiError) return err;\n if (err && typeof err === \"object\") {\n const obj = err as { code?: unknown; message?: unknown; details?: unknown };\n if (typeof obj.code === \"string\") {\n return new AmbaApiError(\n obj.code,\n typeof obj.message === \"string\" ? obj.message : \"unknown\",\n obj.details,\n );\n }\n }\n if (err instanceof Error) {\n return new AmbaApiError(codeFromMessage(err.message), err.message);\n }\n return new AmbaApiError(\"UNKNOWN_ERROR\", String(err));\n}\n\n/**\n * Wrap a thunk so any thrown value becomes an `AmbaApiError`. The\n * wrapper methods on `Amba` use this to convert runtime-emitted errors\n * uniformly at the SDK boundary.\n */\nexport async function withAmbaError<T>(thunk: () => Promise<T>): Promise<T> {\n try {\n return await thunk();\n } catch (err) {\n throw toAmbaApiError(err);\n }\n}\n","/**\n * Pure-JS HTTP client for the amba API.\n *\n * Built on the platform `fetch` (React Native ships it; Hermes\n * provides it; Expo polyfills it where needed). No transitive\n * runtime deps. The previous implementation tunnelled every call\n * through a WASM core that did the same thing in Rust — moving the\n * logic to TS removes ~4 MB from the customer bundle and removes\n * a runtime that's foreign to Hermes.\n *\n * Responsibilities:\n * - Construct the request URL by joining `baseUrl + path` (with an\n * optional query string).\n * - Inject the standard amba auth headers — `X-Api-Key`,\n * `X-SDK-Platform`, `X-SDK-Version`, `Content-Type`, and\n * `Authorization: Bearer …` when a session token is present.\n * - Map non-2xx responses to typed `AmbaApiError` instances using\n * the same code set the WASM core used (UNAUTHORIZED, FORBIDDEN,\n * NOT_FOUND, CONFLICT, RATE_LIMITED, VALIDATION_ERROR, HTTP_ERROR,\n * NETWORK_ERROR).\n * - Parse JSON response bodies. 204 No Content returns `null`.\n */\n\nimport { AmbaApiError } from \"./error.js\";\nimport type { IdentityStore } from \"./identity.js\";\n\n/** Default amba API endpoint. */\nexport const DEFAULT_BASE_URL = \"https://api.amba.dev\";\n\n/**\n * Server response envelope. Most amba endpoints wrap their payload\n * in `{ data: ... }`. Helpers below let call sites declare whether\n * to return the envelope, the unwrapped `data` field, or the raw\n * body (e.g. `find` returns the whole envelope so consumers can\n * paginate via `next_cursor` / `has_more`).\n */\nexport interface Envelope<T> {\n data: T;\n next_cursor?: string | null;\n has_more?: boolean;\n}\n\nexport interface AmbaHttpClientOptions {\n apiKey: string;\n baseUrl: string;\n sdkPlatform: string;\n sdkVersionHeader: string;\n identity: IdentityStore;\n /** Override the `fetch` implementation — tests pass a vi.fn() shim. */\n fetchImpl?: typeof fetch;\n}\n\ntype Query = Record<string, string | number | boolean | undefined | null>;\n\nexport class AmbaHttpClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly sdkPlatform: string;\n private readonly sdkVersionHeader: string;\n private readonly identity: IdentityStore;\n private readonly fetchImpl: typeof fetch;\n\n constructor(opts: AmbaHttpClientOptions) {\n this.apiKey = opts.apiKey;\n this.baseUrl = opts.baseUrl.replace(/\\/+$/, \"\");\n this.sdkPlatform = opts.sdkPlatform;\n this.sdkVersionHeader = opts.sdkVersionHeader;\n this.identity = opts.identity;\n this.fetchImpl =\n opts.fetchImpl ??\n (globalThis.fetch.bind(globalThis) as typeof fetch);\n }\n\n /** Build the absolute URL for an API path, optionally with a query string. */\n url(path: string, query?: Query): string {\n const base = this.baseUrl + path;\n if (!query) return base;\n const parts: string[] = [];\n for (const k of Object.keys(query)) {\n const v = query[k];\n if (v === undefined || v === null) continue;\n parts.push(`${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`);\n }\n if (parts.length === 0) return base;\n return `${base}?${parts.join(\"&\")}`;\n }\n\n /** Build the standard request headers for the current identity state. */\n buildHeaders(extra?: Record<string, string>): Record<string, string> {\n const h: Record<string, string> = {\n \"X-Api-Key\": this.apiKey,\n \"X-SDK-Platform\": this.sdkPlatform,\n \"X-SDK-Version\": this.sdkVersionHeader,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...extra,\n };\n const tok = this.identity.getSessionToken();\n if (tok) h.Authorization = `Bearer ${tok}`;\n return h;\n }\n\n async get<T>(path: string, query?: Query): Promise<T> {\n return this.request<T>(\"GET\", path, undefined, query);\n }\n\n async post<T>(path: string, body?: unknown, query?: Query): Promise<T> {\n return this.request<T>(\"POST\", path, body, query);\n }\n\n async patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"PATCH\", path, body);\n }\n\n async delete<T>(path: string): Promise<T> {\n return this.request<T>(\"DELETE\", path);\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n query?: Query,\n ): Promise<T> {\n const url = this.url(path, query);\n const headers = this.buildHeaders();\n\n const init: RequestInit = {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body ?? {}),\n };\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, init);\n } catch (err) {\n // Transport-level failure (DNS, refused, offline, abort). The\n // platform fetch throws a TypeError or AbortError; we wrap it\n // into the SDK's stable error shape.\n const message =\n err instanceof Error\n ? err.message\n : typeof err === \"string\"\n ? err\n : \"fetch failed\";\n throw new AmbaApiError(\"NETWORK_ERROR\", `Network error: ${message}`, err);\n }\n\n return parseResponse<T>(response);\n }\n}\n\nasync function parseResponse<T>(response: Response): Promise<T> {\n // 204 No Content: most DELETE endpoints. Return null so generics\n // taking `unknown | null` decode cleanly.\n if (response.status === 204) {\n return null as T;\n }\n\n const text = await response.text();\n const ct = response.headers.get(\"content-type\") ?? \"\";\n const isJson = ct.includes(\"application/json\");\n\n if (!response.ok) {\n throw mapHttpError(response, text, isJson);\n }\n\n if (text === \"\") return null as T;\n if (isJson) {\n try {\n return JSON.parse(text) as T;\n } catch (err) {\n throw new AmbaApiError(\n \"HTTP_ERROR\",\n `Failed to parse JSON response: ${\n err instanceof Error ? err.message : String(err)\n }`,\n { body: text },\n );\n }\n }\n // Non-JSON success body (uncommon for this API). Return the raw text\n // string typed as the generic so the caller can decide.\n return text as unknown as T;\n}\n\nexport function mapHttpError(\n response: Response,\n rawBody: string,\n isJson: boolean,\n): AmbaApiError {\n let parsed: unknown = undefined;\n let message = rawBody || `HTTP ${response.status}`;\n let code: string | undefined;\n // `envelopeDetails` is the inner `error.details` field — surfaced as\n // `AmbaApiError.details` when the server emitted a typed envelope.\n // This matches the WASM-bridged web SDK, which carries the inner\n // details (e.g. `{ streak_key: 'weekly_login' }`) verbatim — NOT the\n // whole `{error:{...}}` wrapper. Customer code like\n // `e.details.streak_key` must work identically on both SDKs.\n // (Cursor BugBot PR #156, medium — cross-SDK details-shape divergence.)\n let envelopeDetails: unknown = undefined;\n let envelopeRecognized = false;\n if (isJson && rawBody) {\n try {\n parsed = JSON.parse(rawBody);\n } catch {\n parsed = undefined;\n }\n // Standard amba envelope: `{ error: { code, message, details } }`\n // and a few legacy `{ error: \"string\" }` shapes. We recognize the\n // envelope by the presence of a string `code` alone — message is\n // optional, matching the Rust `parse_error_envelope` rule so the\n // two SDKs agree on what \"envelope\" means. (Cursor BugBot PR #156.)\n const env = parsed as {\n error?: { code?: string; message?: string; details?: unknown };\n } | null;\n const innerErr = env?.error;\n if (innerErr && typeof innerErr === \"object\" && typeof innerErr.code === \"string\") {\n code = innerErr.code;\n envelopeRecognized = true;\n envelopeDetails = innerErr.details;\n if (typeof innerErr.message === \"string\") message = innerErr.message;\n }\n }\n\n // Use the inner envelope details when the server gave us a\n // recognizable envelope; fall back to the full parsed body\n // otherwise so legacy / proxy-shaped responses still carry\n // something the customer can inspect.\n const details: unknown = envelopeRecognized ? envelopeDetails : parsed;\n\n switch (response.status) {\n case 401:\n return new AmbaApiError(code ?? \"UNAUTHORIZED\", message, details);\n case 403:\n return new AmbaApiError(code ?? \"FORBIDDEN\", message, details);\n case 404:\n return new AmbaApiError(code ?? \"NOT_FOUND\", message, details);\n case 409:\n return new AmbaApiError(code ?? \"CONFLICT\", message, details);\n case 422:\n return new AmbaApiError(\n code ?? \"VALIDATION_ERROR\",\n message,\n details,\n );\n case 429: {\n const retryAfter = response.headers.get(\"retry-after\") ?? \"unspecified\";\n // Prefer the server's structured message if it gave us one; fall back\n // to a synthesized one that surfaces the Retry-After header so callers\n // can decide whether to back off vs surface to the user.\n const serverGaveMessage =\n message !== rawBody && message !== `HTTP ${response.status}`;\n return new AmbaApiError(\n code ?? \"RATE_LIMITED\",\n serverGaveMessage\n ? message\n : `Rate limited (retry after ${retryAfter})`,\n details,\n );\n }\n default:\n return new AmbaApiError(\n code ?? \"HTTP_ERROR\",\n message,\n envelopeRecognized\n ? envelopeDetails\n : (parsed ?? { status: response.status, body: rawBody }),\n );\n }\n}\n","/**\n * UUID v4 generator — pure JS, no dependencies.\n *\n * Why pure JS rather than `globalThis.crypto.randomUUID()`:\n * - Older Hermes builds (RN <0.74) don't ship `crypto` global.\n * - `expo-crypto` exposes `randomUUID()` but is a separate dep we\n * don't want to force on every consumer.\n * - The amba SDK only uses UUIDs for `anonymous_id` — a stable\n * per-install identifier. Cryptographic randomness is not a\n * security requirement here; uniqueness across installs is.\n *\n * If `globalThis.crypto?.getRandomValues` is available (it is on\n * Hermes 0.75+ via the engine and on every Expo runtime via\n * react-native-get-random-values that Expo auto-installs), we use it\n * for higher-quality randomness. Otherwise we fall back to\n * `Math.random()` — which is sufficient for the install-id use case\n * because per-device uniqueness is what we need, not collision\n * resistance across the global population.\n */\n\ntype GetRandomValues = (a: Uint8Array) => Uint8Array;\n\nfunction getRandomBytes(n: number): Uint8Array {\n const bytes = new Uint8Array(n);\n const grv = (globalThis as { crypto?: { getRandomValues?: GetRandomValues } })\n .crypto?.getRandomValues;\n if (typeof grv === \"function\") {\n // Bind to crypto to preserve `this`.\n (globalThis as { crypto: { getRandomValues: GetRandomValues } }).crypto.getRandomValues(\n bytes,\n );\n return bytes;\n }\n // Math.random fallback — not crypto-secure but good enough for\n // install-id uniqueness.\n for (let i = 0; i < n; i++) bytes[i] = Math.floor(Math.random() * 256);\n return bytes;\n}\n\n/**\n * Generate a UUID v4 (random) per RFC 4122. Wire shape:\n * `xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx` where `y ∈ {8,9,a,b}`.\n */\nexport function uuidv4(): string {\n const b = getRandomBytes(16);\n // Set version (4) and variant (10xx) bits.\n b[6] = (b[6]! & 0x0f) | 0x40;\n b[8] = (b[8]! & 0x3f) | 0x80;\n const h = Array.from(b, (v) => v.toString(16).padStart(2, \"0\"));\n return (\n h.slice(0, 4).join(\"\") +\n \"-\" +\n h.slice(4, 6).join(\"\") +\n \"-\" +\n h.slice(6, 8).join(\"\") +\n \"-\" +\n h.slice(8, 10).join(\"\") +\n \"-\" +\n h.slice(10, 16).join(\"\")\n );\n}\n","/**\n * Identity store — the minimal on-device state the SDK keeps between\n * launches: `anonymous_id` (stable per-install UUID), authenticated\n * user id, session token, refresh token, expiry.\n *\n * Persistence: writes go to `AsyncStoragePersistence` under\n * `<prefix>:identity_v1` (JSON-encoded). On `configure()` we hydrate\n * once; subsequent reads/writes are O(1) in-process.\n *\n * Why a small TS class instead of porting the Rust per-instance-key\n * machinery: the WASM core's race rationale (cross-core write race\n * with `amba_reset`) is specific to the FFI slot model — JS doesn't\n * have that hazard because there's one `Amba` singleton per module\n * graph. Keeping the persistence shape simple makes the AsyncStorage\n * cost predictable and the implementation auditable.\n */\n\nimport { AsyncStoragePersistence } from \"./async-storage-adapter.js\";\nimport { uuidv4 } from \"./uuid.js\";\n\n/** Storage key under the configured prefix. Bumped when shape changes. */\nconst IDENTITY_KEY = \"identity_v1\";\n\nexport interface IdentitySnapshot {\n anonymousId: string;\n appUserId: string | null;\n sessionToken: string | null;\n refreshToken: string | null;\n /** ISO-8601 expiry — null means \"no active session.\" */\n expiresAt: string | null;\n}\n\ninterface PersistedIdentity {\n anonymous_id: string;\n app_user_id: string | null;\n session_token: string | null;\n refresh_token: string | null;\n /** ISO-8601 string; null when not set. */\n expires_at: string | null;\n}\n\nfunction isExpired(expiresAt: string | null): boolean {\n if (!expiresAt) return false;\n const t = Date.parse(expiresAt);\n if (Number.isNaN(t)) return false;\n return t <= Date.now();\n}\n\n/**\n * The SDK's identity state — held in memory after hydration, persisted\n * to AsyncStorage on every mutation. All methods are sync after\n * `hydrate()` resolves.\n */\nexport class IdentityStore {\n private anonymousId: string;\n private appUserId: string | null = null;\n private sessionToken: string | null = null;\n private refreshToken: string | null = null;\n private expiresAt: string | null = null;\n\n private constructor(\n private readonly persistence: AsyncStoragePersistence,\n seed: PersistedIdentity,\n ) {\n this.anonymousId = seed.anonymous_id;\n this.appUserId = seed.app_user_id;\n this.sessionToken = seed.session_token;\n this.refreshToken = seed.refresh_token;\n this.expiresAt = seed.expires_at;\n }\n\n /**\n * Build a store, hydrating any prior identity from AsyncStorage.\n * If no prior identity exists, a fresh `anonymous_id` is minted.\n * Expired session tokens are dropped at hydration (the refresh token\n * survives so callers can `auth.refresh()` to mint a new pair).\n */\n static async create(\n persistence: AsyncStoragePersistence,\n ): Promise<IdentityStore> {\n const raw = await persistence.read(IDENTITY_KEY);\n let seed: PersistedIdentity;\n if (raw) {\n try {\n const parsed = JSON.parse(raw) as Partial<PersistedIdentity>;\n seed = {\n anonymous_id: parsed.anonymous_id ?? uuidv4(),\n app_user_id: parsed.app_user_id ?? null,\n session_token: parsed.session_token ?? null,\n refresh_token: parsed.refresh_token ?? null,\n expires_at: parsed.expires_at ?? null,\n };\n } catch {\n // Garbage on disk — start fresh. anonymous_id rotates which is\n // acceptable for a corrupt-state recovery (rare; users on\n // upgrade keep their id because the previous SDK wrote valid JSON).\n seed = freshSeed();\n }\n } else {\n seed = freshSeed();\n }\n\n if (isExpired(seed.expires_at)) {\n // Drop expired session_token but keep refresh_token so the caller\n // can mint a new pair.\n seed.session_token = null;\n seed.expires_at = null;\n }\n\n const store = new IdentityStore(persistence, seed);\n // Always persist after hydration — handles the first-run mint of\n // `anonymous_id` and clears any expired tokens from disk.\n await store.flush();\n return store;\n }\n\n snapshot(): IdentitySnapshot {\n return {\n anonymousId: this.anonymousId,\n appUserId: this.appUserId,\n sessionToken: this.sessionToken,\n refreshToken: this.refreshToken,\n expiresAt: this.expiresAt,\n };\n }\n\n getAnonymousId(): string {\n return this.anonymousId;\n }\n\n getAppUserId(): string | null {\n return this.appUserId;\n }\n\n getSessionToken(): string | null {\n return this.sessionToken;\n }\n\n getRefreshToken(): string | null {\n return this.refreshToken;\n }\n\n isAuthenticated(): boolean {\n return this.sessionToken !== null;\n }\n\n async setSession(args: {\n appUserId: string;\n sessionToken: string;\n refreshToken: string;\n expiresAt: string;\n }): Promise<void> {\n this.appUserId = args.appUserId;\n this.sessionToken = args.sessionToken;\n this.refreshToken = args.refreshToken;\n this.expiresAt = args.expiresAt;\n await this.flush();\n }\n\n async clearSession(rotateAnonymousId: boolean): Promise<void> {\n this.appUserId = null;\n this.sessionToken = null;\n this.refreshToken = null;\n this.expiresAt = null;\n if (rotateAnonymousId) {\n this.anonymousId = uuidv4();\n }\n await this.flush();\n }\n\n private async flush(): Promise<void> {\n const payload: PersistedIdentity = {\n anonymous_id: this.anonymousId,\n app_user_id: this.appUserId,\n session_token: this.sessionToken,\n refresh_token: this.refreshToken,\n expires_at: this.expiresAt,\n };\n await this.persistence.write(IDENTITY_KEY, JSON.stringify(payload));\n }\n}\n\nfunction freshSeed(): PersistedIdentity {\n return {\n anonymous_id: uuidv4(),\n app_user_id: null,\n session_token: null,\n refresh_token: null,\n expires_at: null,\n };\n}\n","/**\n * @layers/amba-react-native — React Native SDK for amba.\n *\n * Pure-JS implementation: the SDK is now a thin client over `fetch`\n * plus AsyncStorage-backed identity. No native modules, no WASM\n * dependency. The native SDKs (Swift/Kotlin/Flutter/Unity via the\n * shared runtime) keep their UniFFI bindings; this RN SDK aligns\n * with how Firebase/Supabase/PostHog ship to JS runtimes — pure\n * fetch-over-HTTP.\n *\n * @example\n * ```tsx\n * import { Amba } from '@layers/amba-react-native';\n *\n * await Amba.configure({ projectId: 'proj_...', clientKey: 'amba_ck_...' });\n * await Amba.auth.signInAnonymously();\n * await Amba.events.track('app_opened');\n *\n * // Push registration with a token from expo-notifications:\n * import * as Notifications from 'expo-notifications';\n * const { data: token } = await Notifications.getDevicePushTokenAsync();\n * await Amba.push.register(token, 'apns'); // or 'fcm' on Android\n * ```\n */\n\nexport type * from \"./types\";\nimport type {\n AmbaConfig,\n AuthResult,\n User,\n FindOptions,\n FindResponse,\n Filter,\n FilterValue,\n ConfigBundle,\n FlagAssignment,\n UserEntitlement,\n MediaAsset,\n PresignData,\n PushPlatform,\n PushToken,\n AiMessageRequest,\n AiMessageResponse,\n SocialProvider,\n Session,\n Achievement,\n AchievementProgress,\n Challenge,\n ChallengeProgress,\n CurrencyBalance,\n CurrencyTransaction,\n InventoryItem,\n PurchaseRequest,\n ConsumeRequest,\n Leaderboard,\n LeaderboardEntry,\n Store,\n PurchaseOption,\n PurchaseResult,\n XpBalance,\n XpTransaction,\n Streak,\n FeedResponse,\n Friendship,\n Group,\n GroupMember,\n GroupCreate,\n GroupUpdate,\n Conversation,\n Message,\n SendMessageRequest,\n CreateConversationRequest,\n ListMessagesOptions,\n MarkReadResult,\n Report,\n ReportRequest,\n ReferralCode,\n ReferralClaim,\n Review,\n ReviewCreate,\n ReviewUpdate,\n Role,\n CatalogItem,\n ContentItem,\n DeepLink,\n DeepLinkCreate,\n OnboardingStatus,\n} from \"./types\";\n\nimport { AsyncStoragePersistence } from \"./async-storage-adapter.js\";\nimport { AmbaApiError } from \"./error.js\";\nimport { AmbaHttpClient, DEFAULT_BASE_URL, mapHttpError } from \"./http-client.js\";\nimport type { Envelope } from \"./http-client.js\";\nimport { IdentityStore } from \"./identity.js\";\n\nexport { AmbaApiError } from \"./error.js\";\nexport type { AmbaApiErrorCode } from \"./error.js\";\n\n/** SDK semver — burned in at build time. Bump alongside package.json. */\nexport const SDK_VERSION = \"3.0.0\";\n\n// ── internal state ──────────────────────────────────────────────────\n\ninterface RuntimeState {\n http: AmbaHttpClient;\n identity: IdentityStore;\n debug: boolean;\n projectId: string;\n}\n\nlet state: RuntimeState | null = null;\n\nfunction getState(): RuntimeState {\n if (!state) {\n throw new AmbaApiError(\n \"NOT_INITIALIZED\",\n \"@layers/amba-react-native: SDK not configured. Call Amba.configure({ projectId, clientKey }) at app start.\",\n );\n }\n return state;\n}\n\n// ── auth state pub/sub ──────────────────────────────────────────────\n\ntype AuthSubscriber = (session: Session | null) => void;\nconst authSubscribers = new Set<AuthSubscriber>();\n\nfunction snapshotSession(user: User | null): Session | null {\n if (!user) return null;\n return {\n sessionToken: \"\",\n refreshToken: \"\",\n user,\n expiresAt: \"\",\n };\n}\n\nfunction notifyAuthSubscribers(session: Session | null): void {\n for (const cb of authSubscribers) {\n try {\n cb(session);\n } catch (err) {\n if (typeof console !== \"undefined\") {\n console.error(\"[amba] onAuthStateChange callback threw\", err);\n }\n }\n }\n}\n\nasync function notifyFromAuthResult(result: AuthResult): Promise<void> {\n notifyAuthSubscribers(snapshotSession(result.user));\n}\n\n// ── persist-on-auth helpers ─────────────────────────────────────────\n\nfunction expiresAtFromResult(result: AuthResult): string {\n if (result.expires_at && typeof result.expires_at === \"string\")\n return result.expires_at;\n // Default 1h session lifetime — matches the Rust core's contract\n // when the server omits `expires_at`.\n return new Date(Date.now() + 3600 * 1000).toISOString();\n}\n\nasync function persistAuthResult(\n state_: RuntimeState,\n result: AuthResult,\n): Promise<void> {\n await state_.identity.setSession({\n appUserId: result.user.id,\n sessionToken: result.session_token,\n refreshToken: result.refresh_token,\n expiresAt: expiresAtFromResult(result),\n });\n}\n\ninterface AuthEnvelope {\n data: AuthResult;\n}\n\nasync function postAuth(\n state_: RuntimeState,\n path: string,\n body: unknown,\n): Promise<AuthResult> {\n const env = await state_.http.post<AuthEnvelope>(path, body);\n const result = env.data;\n await persistAuthResult(state_, result);\n await notifyFromAuthResult(result);\n return result;\n}\n\n// ── light client-side validation (mirrors Rust core) ────────────────\n\nfunction requireEmail(email: string): void {\n const trimmed = email.trim();\n if (trimmed === \"\")\n throw new AmbaApiError(\n \"VALIDATION_ERROR\",\n \"email must not be empty\",\n );\n if (!trimmed.includes(\"@\") || !trimmed.includes(\".\"))\n throw new AmbaApiError(\n \"VALIDATION_ERROR\",\n `email '${email}' is not a valid email address`,\n );\n}\nfunction requirePassword(password: string): void {\n if (password.length < 8)\n throw new AmbaApiError(\n \"VALIDATION_ERROR\",\n \"password must be at least 8 characters\",\n );\n}\n\n// ── path helpers (mirror Rust constants) ────────────────────────────\n\nconst P = {\n authAnonymous: \"/v1/client/auth/anonymous\",\n authEmailLogin: \"/v1/client/auth/email/login\",\n authEmailSignup: \"/v1/client/auth/email/signup\",\n authSocial: \"/v1/client/auth/social\",\n authRefresh: \"/v1/client/auth/refresh\",\n authLogout: \"/v1/client/auth/logout\",\n authMe: \"/v1/client/auth/me\",\n events: \"/v1/client/events\",\n collections: \"/v1/client/collections\",\n storage: \"/v1/client/media\",\n storagePresign: \"/v1/client/media/presign\",\n storageCommit: \"/v1/client/media/commit\",\n push: \"/v1/client/push\",\n pushRegister: \"/v1/client/push/register\",\n pushUnregister: \"/v1/client/push/unregister\",\n pushTokens: \"/v1/client/push/tokens\",\n pushSubscribe: \"/v1/client/push/subscribe\",\n pushUnsubscribe: \"/v1/client/push/unsubscribe\",\n entitlements: \"/v1/client/entitlements\",\n aiAnthropic: \"/v1/client/ai/anthropic/messages\",\n config: \"/v1/client/config\",\n flags: \"/v1/client/flags\",\n achievements: \"/v1/client/achievements\",\n challenges: \"/v1/client/challenges\",\n catalog: \"/v1/client/catalog\",\n currencies: \"/v1/client/currencies\",\n inventory: \"/v1/client/inventory\",\n leaderboards: \"/v1/client/leaderboards\",\n stores: \"/v1/client/stores\",\n xp: \"/v1/client/xp\",\n streaks: \"/v1/client/streaks\",\n feeds: \"/v1/client/feeds\",\n friends: \"/v1/client/friends\",\n groups: \"/v1/client/groups\",\n messaging: \"/v1/client/messaging\",\n moderation: \"/v1/client/moderation\",\n reviews: \"/v1/client/reviews\",\n roles: \"/v1/client/roles\",\n referrals: \"/v1/client/referrals\",\n content: \"/v1/client/content\",\n deepLinks: \"/v1/client/deeplinks\",\n onboarding: \"/v1/client/onboarding\",\n};\n\nfunction encodePathSegment(s: string): string {\n return encodeURIComponent(s);\n}\n\n// ── public API ──────────────────────────────────────────────────────\n\n/**\n * Top-level SDK namespace for React Native.\n */\nexport const Amba = {\n configure: async (config: AmbaConfig): Promise<void> => {\n if (!config.projectId || config.projectId.trim() === \"\") {\n throw new Error(\"Amba.configure: projectId is required\");\n }\n if (!config.clientKey || config.clientKey.trim() === \"\") {\n throw new Error(\"Amba.configure: clientKey is required\");\n }\n const persistence = new AsyncStoragePersistence(\n config.storagePrefix ?? \"amba\",\n );\n await persistence.hydrate();\n const identity = await IdentityStore.create(persistence);\n\n const baseUrl = (config.apiUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const wrapperVersion = `amba-react-native/${SDK_VERSION}`;\n const sdkVersionHeader = `amba-sdk/${SDK_VERSION} ${wrapperVersion}`;\n const http = new AmbaHttpClient({\n apiKey: config.clientKey,\n baseUrl,\n sdkPlatform: \"react-native\",\n sdkVersionHeader,\n identity,\n });\n state = { http, identity, debug: config.debug ?? false, projectId: config.projectId };\n },\n\n /**\n * Test-only hook to reset the singleton between tests. Not part of\n * the customer-facing surface; the production SDK uses\n * `Amba.auth.signOut(true)` to fully reset identity.\n * @internal\n */\n _reset: (): void => {\n state = null;\n authSubscribers.clear();\n },\n\n get anonymousId(): string {\n return getState().identity.getAnonymousId();\n },\n get appUserId(): string | undefined {\n return getState().identity.getAppUserId() ?? undefined;\n },\n get isAuthenticated(): boolean {\n return getState().identity.isAuthenticated();\n },\n get projectId(): string {\n return getState().projectId;\n },\n setDebug: (enabled: boolean): void => {\n getState().debug = enabled;\n },\n\n events: {\n track: async (\n event: string,\n properties?: Record<string, unknown>,\n ): Promise<void> => {\n const s = getState();\n // POST /v1/client/events accepts a single event or a batch.\n // Single-shape: { name, properties?, anonymous_id?, timestamp? }\n await s.http.post(P.events, {\n name: event,\n properties: properties ?? undefined,\n anonymous_id: s.identity.getAnonymousId(),\n timestamp: new Date().toISOString(),\n });\n },\n },\n\n auth: {\n signInAnonymously: async (): Promise<AuthResult> => {\n const s = getState();\n // Send the SDK's current anonymous_id so the server can either\n // attach to the existing app_user (no MAU charge) or mint a new\n // one. See DX-2.\n return postAuth(s, P.authAnonymous, {\n anonymous_id: s.identity.getAnonymousId(),\n });\n },\n signInWithEmail: async (\n email: string,\n password: string,\n ): Promise<AuthResult> => {\n requireEmail(email);\n if (password === \"\")\n throw new AmbaApiError(\n \"VALIDATION_ERROR\",\n \"password must not be empty\",\n );\n return postAuth(getState(), P.authEmailLogin, { email, password });\n },\n signUpWithEmail: async (\n email: string,\n password: string,\n ): Promise<AuthResult> => {\n requireEmail(email);\n requirePassword(password);\n return postAuth(getState(), P.authEmailSignup, { email, password });\n },\n signInWithSocial: async (\n provider: SocialProvider,\n idToken: string,\n ): Promise<AuthResult> => {\n if (idToken.trim() === \"\")\n throw new AmbaApiError(\n \"VALIDATION_ERROR\",\n \"id_token must not be empty\",\n );\n return postAuth(getState(), P.authSocial, {\n provider,\n id_token: idToken,\n });\n },\n signOut: async (rotateAnonymousId = false): Promise<void> => {\n const s = getState();\n if (s.identity.getSessionToken()) {\n try {\n await s.http.post(P.authLogout, {});\n } catch (err) {\n // Best-effort: a server-side rejection should not trap the\n // user offline. Mirrors the Rust core's behaviour.\n if (typeof console !== \"undefined\") {\n console.warn(\"[amba] signOut server call failed\", err);\n }\n }\n }\n await s.identity.clearSession(rotateAnonymousId);\n notifyAuthSubscribers(null);\n },\n refresh: async (): Promise<AuthResult> => {\n const s = getState();\n const refreshToken = s.identity.getRefreshToken();\n if (!refreshToken)\n throw new AmbaApiError(\n \"UNAUTHORIZED\",\n \"no refresh token available — call signIn* first\",\n );\n return postAuth(s, P.authRefresh, { refresh_token: refreshToken });\n },\n me: async (): Promise<User> => {\n const s = getState();\n if (!s.identity.getSessionToken())\n throw new AmbaApiError(\n \"UNAUTHORIZED\",\n \"no active session — call signIn* first\",\n );\n const env = await s.http.get<Envelope<User>>(P.authMe);\n return env.data;\n },\n\n getSession: async (): Promise<Session | null> => {\n const s = getState();\n if (!s.identity.isAuthenticated()) return null;\n const env = await s.http.get<Envelope<User>>(P.authMe);\n return snapshotSession(env.data);\n },\n\n getAnonymousId: async (): Promise<string> => {\n return getState().identity.getAnonymousId();\n },\n\n onAuthStateChange: (\n cb: (session: Session | null) => void,\n ): (() => void) => {\n authSubscribers.add(cb);\n return () => {\n authSubscribers.delete(cb);\n };\n },\n },\n\n collections: {\n find: async <T = unknown>(\n name: string,\n options: FindOptions = {},\n ): Promise<FindResponse<T>> => {\n const s = getState();\n // Server returns `{ data, next_cursor, has_more }` for find —\n // the FindResponse shape matches the envelope directly.\n return s.http.post<FindResponse<T>>(\n `${P.collections}/${encodePathSegment(name)}/find`,\n options,\n );\n },\n findOne: async <T = unknown>(name: string, id: string): Promise<T> => {\n const s = getState();\n const env = await s.http.get<Envelope<T>>(\n `${P.collections}/${encodePathSegment(name)}/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n insert: async <T = unknown>(\n name: string,\n row: Record<string, unknown>,\n ): Promise<T> => {\n const s = getState();\n const env = await s.http.post<Envelope<T>>(\n `${P.collections}/${encodePathSegment(name)}`,\n row,\n );\n return env.data;\n },\n update: async <T = unknown>(\n name: string,\n id: string,\n set: Record<string, unknown>,\n ): Promise<T> => {\n const s = getState();\n const env = await s.http.patch<Envelope<T>>(\n `${P.collections}/${encodePathSegment(name)}/${encodePathSegment(id)}`,\n { set },\n );\n return env.data;\n },\n delete: async (\n name: string,\n id: string,\n ): Promise<{ data: { deleted: boolean } }> => {\n const s = getState();\n const result = await s.http.delete<{ data: { deleted: boolean } } | null>(\n `${P.collections}/${encodePathSegment(name)}/${encodePathSegment(id)}`,\n );\n // 204 No Content path — synthesise a `{ data: { deleted: true } }`\n // envelope so consumers can branch uniformly.\n return result ?? { data: { deleted: true } };\n },\n where: {\n eq: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"eq\",\n value,\n }),\n ne: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"ne\",\n value,\n }),\n gt: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"gt\",\n value,\n }),\n gte: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"gte\",\n value,\n }),\n lt: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"lt\",\n value,\n }),\n lte: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"lte\",\n value,\n }),\n in: (column: string, values: FilterValue[]): Filter => ({\n column,\n op: \"in\",\n value: values,\n }),\n notIn: (column: string, values: FilterValue[]): Filter => ({\n column,\n op: \"not_in\",\n value: values,\n }),\n like: (column: string, pattern: string): Filter => ({\n column,\n op: \"like\",\n value: pattern,\n }),\n ilike: (column: string, pattern: string): Filter => ({\n column,\n op: \"ilike\",\n value: pattern,\n }),\n isNull: (column: string): Filter => ({ column, op: \"is_null\" }),\n isNotNull: (column: string): Filter => ({ column, op: \"is_not_null\" }),\n and: (...filters: Filter[]): Filter => ({ and: filters }),\n or: (...filters: Filter[]): Filter => ({ or: filters }),\n not: (filter: Filter): Filter => ({ not: filter }),\n },\n },\n\n storage: {\n presign: async (params: {\n bucket: string;\n filename: string;\n mimeType: string;\n sizeBytes: number;\n retentionDays?: number;\n }): Promise<PresignData> => {\n const s = getState();\n const env = await s.http.post<Envelope<PresignData>>(P.storagePresign, {\n bucket: params.bucket,\n filename: params.filename,\n mime_type: params.mimeType,\n size_bytes: params.sizeBytes,\n retention_days: params.retentionDays,\n });\n return env.data;\n },\n commit: async (uploadId: string, assetId: string): Promise<MediaAsset> => {\n const s = getState();\n const env = await s.http.post<Envelope<MediaAsset>>(P.storageCommit, {\n upload_id: uploadId,\n asset_id: assetId,\n });\n return env.data;\n },\n },\n\n push: {\n register: async (\n token: string,\n platform: PushPlatform,\n bundleId?: string,\n ): Promise<PushToken> => {\n const s = getState();\n const env = await s.http.post<Envelope<PushToken>>(P.pushRegister, {\n token,\n platform,\n bundle_id: bundleId,\n });\n return env.data;\n },\n unregister: async (token: string): Promise<void> => {\n await getState().http.post(P.pushUnregister, { token });\n },\n getTokens: async (): Promise<PushToken[]> => {\n const env = await getState().http.get<Envelope<PushToken[]>>(\n P.pushTokens,\n );\n return env.data;\n },\n subscribe: async (topic: string): Promise<void> => {\n await getState().http.post(P.pushSubscribe, { topic });\n },\n unsubscribe: async (topic: string): Promise<void> => {\n await getState().http.post(P.pushUnsubscribe, { topic });\n },\n },\n\n entitlements: {\n list: async (): Promise<UserEntitlement[]> => {\n const env = await getState().http.get<Envelope<UserEntitlement[]>>(\n P.entitlements,\n );\n return env.data;\n },\n has: async (name: string): Promise<boolean> => {\n const env = await getState().http.get<Envelope<UserEntitlement[]>>(\n P.entitlements,\n { active_only: \"true\" },\n );\n return env.data.some((e) => e.name === name && e.is_active);\n },\n },\n\n ai: {\n anthropic: {\n messages: {\n create: async (\n request: AiMessageRequest,\n ): Promise<AiMessageResponse> => {\n const env = await getState().http.post<Envelope<AiMessageResponse>>(\n P.aiAnthropic,\n request,\n );\n return env.data;\n },\n },\n },\n },\n\n config: {\n fetch: async (): Promise<ConfigBundle> => {\n const s = getState();\n // Config returns `{ data: Record<string, unknown> }` plus an\n // `ETag` header that carries the version stamp.\n const url = s.http.url(P.config);\n const headers = s.http.buildHeaders();\n let response: Response;\n try {\n response = await (globalThis.fetch ?? fetch)(url, {\n method: \"GET\",\n headers,\n });\n } catch (err) {\n throw new AmbaApiError(\n \"NETWORK_ERROR\",\n `Network error: ${err instanceof Error ? err.message : String(err)}`,\n err,\n );\n }\n const text = await response.text();\n if (!response.ok) {\n const ct = response.headers.get(\"content-type\") ?? \"\";\n throw mapHttpError(response, text, ct.includes(\"application/json\"));\n }\n let parsed: { data?: Record<string, unknown> } = {};\n if (text) {\n try {\n parsed = JSON.parse(text);\n } catch {\n parsed = {};\n }\n }\n const etag = response.headers.get(\"etag\");\n // ETag format: `\"vN-...\"` — strip quotes then take the leading\n // `vN` prefix as the version stamp.\n let version: string | null = null;\n if (etag) {\n const cleaned = etag.replace(/^\"|\"$/g, \"\");\n const m = cleaned.match(/^(v\\d+)/);\n version = m ? (m[1] ?? null) : cleaned || null;\n }\n return {\n version,\n values: parsed.data ?? {},\n };\n },\n },\n\n flags: {\n fetch: async (): Promise<FlagAssignment[]> => {\n const env = await getState().http.get<Envelope<FlagAssignment[]>>(P.flags);\n return env.data;\n },\n },\n\n // ── Gamification ──────────────────────────────────────────────────\n\n achievements: {\n getAll: async (): Promise<Achievement[]> => {\n const env = await getState().http.get<Envelope<Achievement[]>>(\n P.achievements,\n );\n return env.data;\n },\n getProgress: async (): Promise<AchievementProgress[]> => {\n const env = await getState().http.get<Envelope<AchievementProgress[]>>(\n `${P.achievements}/progress`,\n );\n return env.data;\n },\n },\n\n challenges: {\n getActive: async (): Promise<Challenge[]> => {\n const env = await getState().http.get<Envelope<Challenge[]>>(\n `${P.challenges}/active`,\n );\n return env.data;\n },\n get: async (id: string): Promise<Challenge> => {\n const env = await getState().http.get<Envelope<Challenge>>(\n `${P.challenges}/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n getProgress: async (id: string): Promise<ChallengeProgress> => {\n const env = await getState().http.get<Envelope<ChallengeProgress>>(\n `${P.challenges}/${encodePathSegment(id)}/progress`,\n );\n return env.data;\n },\n claim: async (id: string): Promise<ChallengeProgress> => {\n const env = await getState().http.post<Envelope<ChallengeProgress>>(\n `${P.challenges}/${encodePathSegment(id)}/claim`,\n {},\n );\n return env.data;\n },\n },\n\n currencies: {\n getBalance: async (): Promise<CurrencyBalance[]> => {\n const env = await getState().http.get<Envelope<CurrencyBalance[]>>(\n P.currencies,\n );\n return env.data;\n },\n getTransactions: async (\n currencyKey: string,\n ): Promise<CurrencyTransaction[]> => {\n const env = await getState().http.get<Envelope<CurrencyTransaction[]>>(\n `${P.currencies}/${encodePathSegment(currencyKey)}/transactions`,\n );\n return env.data;\n },\n },\n\n inventory: {\n getItems: async (): Promise<InventoryItem[]> => {\n const env = await getState().http.get<Envelope<InventoryItem[]>>(\n P.inventory,\n );\n return env.data;\n },\n getItem: async (id: string): Promise<InventoryItem> => {\n const env = await getState().http.get<Envelope<InventoryItem>>(\n `${P.inventory}/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n purchase: async (request: PurchaseRequest): Promise<InventoryItem> => {\n const env = await getState().http.post<Envelope<InventoryItem>>(\n `${P.inventory}/purchase`,\n request,\n );\n return env.data;\n },\n consume: async (request: ConsumeRequest): Promise<InventoryItem> => {\n const env = await getState().http.post<Envelope<InventoryItem>>(\n `${P.inventory}/consume`,\n request,\n );\n return env.data;\n },\n },\n\n leaderboards: {\n get: async (key: string): Promise<Leaderboard> => {\n const env = await getState().http.get<Envelope<Leaderboard>>(\n `${P.leaderboards}/${encodePathSegment(key)}`,\n );\n return env.data;\n },\n getEntries: async (\n key: string,\n limit?: number,\n ): Promise<LeaderboardEntry[]> => {\n const env = await getState().http.get<Envelope<LeaderboardEntry[]>>(\n `${P.leaderboards}/${encodePathSegment(key)}/entries`,\n limit !== undefined ? { limit } : undefined,\n );\n return env.data;\n },\n getMyRank: async (key: string): Promise<LeaderboardEntry> => {\n const env = await getState().http.get<Envelope<LeaderboardEntry>>(\n `${P.leaderboards}/${encodePathSegment(key)}/me`,\n );\n return env.data;\n },\n },\n\n stores: {\n list: async (): Promise<Store[]> => {\n const env = await getState().http.get<Envelope<Store[]>>(P.stores);\n return env.data;\n },\n getPurchaseOptions: async (\n storeKey: string,\n ): Promise<PurchaseOption[]> => {\n const env = await getState().http.get<Envelope<PurchaseOption[]>>(\n `${P.stores}/${encodePathSegment(storeKey)}/options`,\n );\n return env.data;\n },\n purchase: async (\n storeKey: string,\n purchaseOptionId: string,\n receipt: unknown,\n ): Promise<PurchaseResult> => {\n const env = await getState().http.post<Envelope<PurchaseResult>>(\n `${P.stores}/${encodePathSegment(storeKey)}/purchase`,\n { purchase_option_id: purchaseOptionId, receipt },\n );\n return env.data;\n },\n },\n\n xp: {\n getBalance: async (): Promise<XpBalance> => {\n const env = await getState().http.get<Envelope<XpBalance>>(P.xp);\n return env.data;\n },\n getHistory: async (limit?: number): Promise<XpTransaction[]> => {\n const env = await getState().http.get<Envelope<XpTransaction[]>>(\n `${P.xp}/history`,\n limit !== undefined ? { limit } : undefined,\n );\n return env.data;\n },\n claim: async (grantKey: string): Promise<XpTransaction> => {\n const env = await getState().http.post<Envelope<XpTransaction>>(\n `${P.xp}/claim`,\n { grant_key: grantKey },\n );\n return env.data;\n },\n },\n\n streaks: {\n getAll: async (): Promise<Streak[]> => {\n const env = await getState().http.get<Envelope<Streak[]>>(P.streaks);\n return env.data;\n },\n qualify: async (streakKey: string): Promise<Streak> => {\n const env = await getState().http.post<Envelope<Streak>>(\n `${P.streaks}/${encodePathSegment(streakKey)}/qualify`,\n {},\n );\n return env.data;\n },\n },\n\n // ── Social ─────────────────────────────────────────────────────────\n\n feeds: {\n getActivity: async (\n feed?: string,\n cursor?: string,\n ): Promise<FeedResponse> => {\n const f = feed ?? \"default\";\n return getState().http.get<FeedResponse>(\n `${P.feeds}/${encodePathSegment(f)}`,\n cursor ? { cursor } : undefined,\n );\n },\n },\n\n friends: {\n getList: async (): Promise<Friendship[]> => {\n const env = await getState().http.get<Envelope<Friendship[]>>(\n P.friends,\n );\n return env.data;\n },\n getFriends: async (): Promise<Friendship[]> => {\n const env = await getState().http.get<Envelope<Friendship[]>>(\n P.friends,\n { state: \"accepted\" },\n );\n return env.data;\n },\n blockUser: async (userId: string): Promise<Friendship> => {\n const env = await getState().http.post<Envelope<Friendship>>(\n `${P.friends}/block`,\n { user_id: userId },\n );\n return env.data;\n },\n unblockUser: async (userId: string): Promise<void> => {\n await getState().http.post(`${P.friends}/unblock`, { user_id: userId });\n },\n removeBlock: async (friendshipId: string): Promise<void> => {\n await getState().http.delete(\n `${P.friends}/${encodePathSegment(friendshipId)}`,\n );\n },\n },\n\n groups: {\n create: async (params: GroupCreate): Promise<Group> => {\n const env = await getState().http.post<Envelope<Group>>(P.groups, params);\n return env.data;\n },\n get: async (id: string): Promise<Group> => {\n const env = await getState().http.get<Envelope<Group>>(\n `${P.groups}/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n update: async (id: string, patch: GroupUpdate): Promise<Group> => {\n const env = await getState().http.patch<Envelope<Group>>(\n `${P.groups}/${encodePathSegment(id)}`,\n patch,\n );\n return env.data;\n },\n delete: async (id: string): Promise<void> => {\n await getState().http.delete(`${P.groups}/${encodePathSegment(id)}`);\n },\n getMembers: async (id: string): Promise<GroupMember[]> => {\n const env = await getState().http.get<Envelope<GroupMember[]>>(\n `${P.groups}/${encodePathSegment(id)}/members`,\n );\n return env.data;\n },\n join: async (id: string): Promise<GroupMember> => {\n const env = await getState().http.post<Envelope<GroupMember>>(\n `${P.groups}/${encodePathSegment(id)}/join`,\n {},\n );\n return env.data;\n },\n leave: async (id: string): Promise<void> => {\n await getState().http.post(\n `${P.groups}/${encodePathSegment(id)}/leave`,\n {},\n );\n },\n invite: async (id: string, userId: string): Promise<GroupMember> => {\n const env = await getState().http.post<Envelope<GroupMember>>(\n `${P.groups}/${encodePathSegment(id)}/invite`,\n { user_id: userId },\n );\n return env.data;\n },\n },\n\n /**\n * User-to-user direct messaging. Task #62 corrected the path\n * constants — `sendMessage` previously POSTed to\n * `/v1/client/messaging/messages`, which the API doesn't serve.\n * The real route is `/v1/client/messaging/conversations/:id/messages`.\n */\n messaging: {\n /**\n * `POST /v1/client/messaging/conversations` — create (or fetch\n * the existing direct) conversation. Idempotent for direct\n * conversations between two users.\n */\n createConversation: async (\n request: CreateConversationRequest,\n ): Promise<Conversation> => {\n const env = await getState().http.post<Envelope<Conversation>>(\n `${P.messaging}/conversations`,\n request,\n );\n return env.data;\n },\n getConversations: async (): Promise<Conversation[]> => {\n const env = await getState().http.get<Envelope<Conversation[]>>(\n `${P.messaging}/conversations`,\n );\n return env.data;\n },\n /** Alias matching the `listX` naming convention used elsewhere. */\n listConversations: async (): Promise<Conversation[]> => {\n const env = await getState().http.get<Envelope<Conversation[]>>(\n `${P.messaging}/conversations`,\n );\n return env.data;\n },\n sendMessage: async (\n conversationId: string,\n request: SendMessageRequest,\n ): Promise<Message> => {\n const env = await getState().http.post<Envelope<Message>>(\n `${P.messaging}/conversations/${encodePathSegment(conversationId)}/messages`,\n request,\n );\n return env.data;\n },\n listMessages: async (\n conversationId: string,\n opts?: ListMessagesOptions,\n ): Promise<Message[]> => {\n const query: Record<string, number | undefined> = {};\n if (opts?.limit !== undefined) query.limit = opts.limit;\n if (opts?.offset !== undefined) query.offset = opts.offset;\n const env = await getState().http.get<Envelope<Message[]>>(\n `${P.messaging}/conversations/${encodePathSegment(conversationId)}/messages`,\n Object.keys(query).length > 0 ? query : undefined,\n );\n return env.data;\n },\n markRead: async (conversationId: string): Promise<MarkReadResult> => {\n const env = await getState().http.post<Envelope<MarkReadResult>>(\n `${P.messaging}/conversations/${encodePathSegment(conversationId)}/read`,\n {},\n );\n return env.data;\n },\n },\n\n moderation: {\n reportUser: async (request: ReportRequest): Promise<Report> => {\n const env = await getState().http.post<Envelope<Report>>(\n `${P.moderation}/reports/users`,\n request,\n );\n return env.data;\n },\n reportContent: async (request: ReportRequest): Promise<Report> => {\n const env = await getState().http.post<Envelope<Report>>(\n `${P.moderation}/reports/content`,\n request,\n );\n return env.data;\n },\n getReportStatus: async (id: string): Promise<Report> => {\n const env = await getState().http.get<Envelope<Report>>(\n `${P.moderation}/reports/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n },\n\n reviews: {\n list: async (\n targetType: string,\n targetId: string,\n ): Promise<Review[]> => {\n const env = await getState().http.get<Envelope<Review[]>>(P.reviews, {\n target_type: targetType,\n target_id: targetId,\n });\n return env.data;\n },\n create: async (params: ReviewCreate): Promise<Review> => {\n const env = await getState().http.post<Envelope<Review>>(P.reviews, params);\n return env.data;\n },\n update: async (id: string, patch: ReviewUpdate): Promise<Review> => {\n const env = await getState().http.patch<Envelope<Review>>(\n `${P.reviews}/${encodePathSegment(id)}`,\n patch,\n );\n return env.data;\n },\n delete: async (id: string): Promise<void> => {\n await getState().http.delete(`${P.reviews}/${encodePathSegment(id)}`);\n },\n },\n\n roles: {\n getMyRoles: async (): Promise<Role[]> => {\n const env = await getState().http.get<Envelope<Role[]>>(\n `${P.roles}/me`,\n );\n return env.data;\n },\n hasPermission: async (permission: string): Promise<boolean> => {\n const env = await getState().http.get<Envelope<{ allowed: boolean }>>(\n `${P.roles}/check`,\n { permission },\n );\n return env.data.allowed === true;\n },\n },\n\n referrals: {\n getReferralCode: async (): Promise<ReferralCode> => {\n const env = await getState().http.get<Envelope<ReferralCode>>(\n `${P.referrals}/me`,\n );\n return env.data;\n },\n claimReferral: async (code: string): Promise<ReferralClaim> => {\n const env = await getState().http.post<Envelope<ReferralClaim>>(\n `${P.referrals}/claim`,\n { code },\n );\n return env.data;\n },\n create: async (\n code?: string,\n maxUses?: number,\n ): Promise<ReferralCode> => {\n const body: Record<string, unknown> = {};\n if (code !== undefined) body.code = code;\n if (maxUses !== undefined) body.max_uses = maxUses;\n const env = await getState().http.post<Envelope<ReferralCode>>(\n P.referrals,\n body,\n );\n return env.data;\n },\n },\n\n // ── Lifecycle ──────────────────────────────────────────────────────\n\n catalog: {\n list: async (): Promise<CatalogItem[]> => {\n const env = await getState().http.get<Envelope<CatalogItem[]>>(\n P.catalog,\n );\n return env.data;\n },\n },\n\n content: {\n getToday: async (\n channel: string = \"default\",\n ): Promise<ContentItem | null> => {\n const env = await getState().http.get<Envelope<ContentItem | null>>(\n `${P.content}/today/${encodePathSegment(channel)}`,\n );\n return env.data ?? null;\n },\n getLibrary: async (\n channel: string = \"default\",\n options?: { limit?: number; cursor?: string },\n ): Promise<ContentItem[]> => {\n const env = await getState().http.get<Envelope<ContentItem[]>>(\n `${P.content}/library/${encodePathSegment(channel)}`,\n {\n limit: options?.limit,\n cursor: options?.cursor,\n },\n );\n return env.data;\n },\n getItem: async (id: string): Promise<ContentItem> => {\n const env = await getState().http.get<Envelope<ContentItem>>(\n `${P.content}/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n updateItem: async (id: string, state_: unknown): Promise<ContentItem> => {\n const env = await getState().http.post<Envelope<ContentItem>>(\n `${P.content}/${encodePathSegment(id)}/state`,\n state_ as Record<string, unknown>,\n );\n return env.data;\n },\n createItem: async (\n channel: string,\n item: unknown,\n ): Promise<ContentItem> => {\n const env = await getState().http.post<Envelope<ContentItem>>(\n `${P.content}/${encodePathSegment(channel)}`,\n item as Record<string, unknown>,\n );\n return env.data;\n },\n },\n\n deepLinks: {\n get: async (shortCode: string): Promise<DeepLink> => {\n const env = await getState().http.get<Envelope<DeepLink>>(\n `${P.deepLinks}/${encodePathSegment(shortCode)}`,\n );\n return env.data;\n },\n create: async (params: DeepLinkCreate): Promise<DeepLink> => {\n const env = await getState().http.post<Envelope<DeepLink>>(\n P.deepLinks,\n params,\n );\n return env.data;\n },\n },\n\n onboarding: {\n getStatus: async (): Promise<OnboardingStatus> => {\n const env = await getState().http.get<Envelope<OnboardingStatus>>(\n P.onboarding,\n );\n return env.data;\n },\n nextStep: async (payload: unknown): Promise<OnboardingStatus> => {\n const env = await getState().http.post<Envelope<OnboardingStatus>>(\n `${P.onboarding}/next`,\n payload as Record<string, unknown>,\n );\n return env.data;\n },\n skipStep: async (): Promise<OnboardingStatus> => {\n const env = await getState().http.post<Envelope<OnboardingStatus>>(\n `${P.onboarding}/skip`,\n {},\n );\n return env.data;\n },\n complete: async (): Promise<OnboardingStatus> => {\n const env = await getState().http.post<Envelope<OnboardingStatus>>(\n `${P.onboarding}/complete`,\n {},\n );\n return env.data;\n },\n },\n\n /**\n * Developer utilities. Only available on sandbox-tier projects.\n *\n * These methods are safe to call from client-side code — they use the\n * project's client key, not an admin credential.\n */\n dev: {\n /**\n * Wipe all users and their associated data on a sandbox-tier project.\n *\n * Lets a developer's Settings or Account tab add a \"Reset\" button\n * without embedding an admin credential on the device. Rejects with\n * an `AmbaApiError` with `code: 'NOT_SANDBOX_TIER'` if the project\n * is not on a sandbox tier.\n */\n resetSandbox: async (): Promise<{ deleted: number }> => {\n const s = getState();\n const env = await s.http.post<Envelope<{ deleted: number }>>(\n \"/v1/client/dev/reset-sandbox\",\n {},\n );\n return env.data;\n },\n },\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["cachedStorage: AsyncStorageStatic | null","prefix: string","parts: string[]","h: Record<string, string>","init: RequestInit","response: Response","parsed: unknown","code: string | undefined","envelopeDetails: unknown","details: unknown","persistence: AsyncStoragePersistence","seed: PersistedIdentity","payload: PersistedIdentity","state: RuntimeState | null","response: Response","parsed: { data?: Record<string, unknown> }","version: string | null","query: Record<string, number | undefined>","body: Record<string, unknown>"],"sources":["../src/async-storage-adapter.ts","../src/error.ts","../src/http-client.ts","../src/uuid.ts","../src/identity.ts","../src/index.ts"],"sourcesContent":["/**\n * AsyncStorage-backed identity persistence for React Native.\n *\n * Bridges `@react-native-async-storage/async-storage` (peer-dep, installed\n * by the host app) to the SDK runtime. Reads/writes go through a\n * per-prefix namespace so different amba projects can coexist in the\n * same app.\n *\n * Identity records stored under `${prefix}:identity` survive app restarts.\n */\n\n// Late-imported to avoid bundling the peer-dep — host app installs it.\ntype AsyncStorageStatic = {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\nlet cachedStorage: AsyncStorageStatic | null = null;\n\nasync function getStorage(): Promise<AsyncStorageStatic | null> {\n if (cachedStorage !== null) return cachedStorage;\n try {\n const mod = await import(\"@react-native-async-storage/async-storage\");\n cachedStorage = (mod.default ?? mod) as AsyncStorageStatic;\n return cachedStorage;\n } catch {\n // Host app didn't install the peer dep — fall back to in-memory.\n // amba will still work but identity won't survive app restart.\n return null;\n }\n}\n\nexport class AsyncStoragePersistence {\n private memoryCache = new Map<string, string>();\n\n constructor(private readonly prefix: string) {}\n\n async hydrate(): Promise<void> {\n // Future: when the SDK runtime gains a JS-side persistence bridge,\n // this will pre-load the identity record into memory so the runtime\n // can read it synchronously at init.\n }\n\n async read(key: string): Promise<string | null> {\n const fullKey = `${this.prefix}:${key}`;\n if (this.memoryCache.has(fullKey))\n return this.memoryCache.get(fullKey) ?? null;\n const storage = await getStorage();\n if (!storage) return null;\n const v = await storage.getItem(fullKey);\n if (v !== null) this.memoryCache.set(fullKey, v);\n return v;\n }\n\n async write(key: string, value: string): Promise<void> {\n const fullKey = `${this.prefix}:${key}`;\n this.memoryCache.set(fullKey, value);\n const storage = await getStorage();\n if (storage) await storage.setItem(fullKey, value);\n }\n\n async delete(key: string): Promise<void> {\n const fullKey = `${this.prefix}:${key}`;\n this.memoryCache.delete(fullKey);\n const storage = await getStorage();\n if (storage) await storage.removeItem(fullKey);\n }\n}\n","/**\n * Typed error class for the amba SDK + helper that converts arbitrary\n * thrown values (native Error, plain objects, runtime-emitted errors)\n * into a stable `AmbaApiError` instance.\n *\n * Callers can `instanceof`-narrow safely, branch on `.code`, and pull\n * extra payload from `.details` (raw HTTP body, validation field paths,\n * etc.). The wrapper methods on `Amba` wrap every async call in\n * `toAmbaApiError`, so consumers see one error shape regardless of\n * which layer (network, runtime, validation) failed.\n */\n\n/**\n * Stable error codes surfaced by the SDK. Strings rather than an enum\n * so customers can extend with custom codes by simply throwing\n * `new AmbaApiError(\"MY_CODE\", \"...\")` without coordinating with this\n * package's TypeScript types.\n */\nexport type AmbaApiErrorCode =\n | \"UNAUTHORIZED\"\n | \"FORBIDDEN\"\n | \"NOT_FOUND\"\n | \"CONFLICT\"\n | \"RATE_LIMITED\"\n | \"VALIDATION_ERROR\"\n | \"NETWORK_ERROR\"\n | \"HTTP_ERROR\"\n | \"CIRCUIT_OPEN\"\n | \"CONSENT_NOT_GRANTED\"\n | \"NOT_INITIALIZED\"\n | \"INVALID_CONFIG\"\n | \"INVALID_ARGUMENT\"\n | \"PUSH_PERMISSION_DENIED\"\n | \"PUSH_REGISTRATION_FAILED\"\n | \"NOT_SANDBOX_TIER\"\n | \"UNKNOWN_ERROR\"\n | (string & {});\n\nexport class AmbaApiError extends Error {\n readonly code: AmbaApiErrorCode;\n readonly details?: unknown;\n constructor(\n code: AmbaApiErrorCode,\n message: string,\n details?: unknown,\n ) {\n super(message);\n this.name = \"AmbaApiError\";\n this.code = code;\n this.details = details;\n // Restore prototype chain when transpiled to ES5 targets — Error\n // subclasses lose their prototype otherwise and `instanceof` breaks.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Best-effort: pull a stable error code out of a Rust `AmbaError`\n * Display string. Used by `toAmbaApiError` when the underlying thrown\n * value is a generic `Error` produced by `wasm-bindgen`'s `JsError::new`.\n *\n * Keep in sync with `sdks/core/src/error.rs::AmbaError`'s `#[error]`\n * format strings — but the parser falls back to UNKNOWN_ERROR for any\n * pattern it doesn't recognize, so a stale match list isn't a footgun,\n * just a quality-of-life regression.\n */\nfunction codeFromMessage(message: string): AmbaApiErrorCode {\n // Cheapest checks first — most production errors are auth or HTTP.\n if (message.startsWith(\"Unauthorized\")) return \"UNAUTHORIZED\";\n if (message.startsWith(\"Forbidden\")) return \"FORBIDDEN\";\n if (message.startsWith(\"Not found\")) return \"NOT_FOUND\";\n if (message.startsWith(\"Conflict\")) return \"CONFLICT\";\n if (message.startsWith(\"Rate limited\")) return \"RATE_LIMITED\";\n if (message.startsWith(\"Validation error\")) return \"VALIDATION_ERROR\";\n if (message.startsWith(\"Network error\")) return \"NETWORK_ERROR\";\n if (message.startsWith(\"HTTP error\")) return \"HTTP_ERROR\";\n if (message.startsWith(\"Circuit breaker\")) return \"CIRCUIT_OPEN\";\n if (message.startsWith(\"Consent not granted\")) return \"CONSENT_NOT_GRANTED\";\n if (message.includes(\"not initialized\")) return \"NOT_INITIALIZED\";\n if (message.startsWith(\"Invalid configuration\")) return \"INVALID_CONFIG\";\n if (message.startsWith(\"Invalid argument\")) return \"INVALID_ARGUMENT\";\n return \"UNKNOWN_ERROR\";\n}\n\n/**\n * Coerce any thrown value into an `AmbaApiError`. Idempotent — passing\n * an existing `AmbaApiError` returns it unchanged so wrappers can stack\n * without re-wrapping.\n *\n * Heuristics:\n * 1. Existing `AmbaApiError` → returned as-is.\n * 2. Object with `.code` → use that code + `.message` + `.details`.\n * 3. `Error` (e.g. runtime-emitted error) → infer code from message prefix.\n * 4. Anything else → stringify and tag UNKNOWN_ERROR.\n */\nexport function toAmbaApiError(err: unknown): AmbaApiError {\n if (err instanceof AmbaApiError) return err;\n if (err && typeof err === \"object\") {\n const obj = err as { code?: unknown; message?: unknown; details?: unknown };\n if (typeof obj.code === \"string\") {\n return new AmbaApiError(\n obj.code,\n typeof obj.message === \"string\" ? obj.message : \"unknown\",\n obj.details,\n );\n }\n }\n if (err instanceof Error) {\n return new AmbaApiError(codeFromMessage(err.message), err.message);\n }\n return new AmbaApiError(\"UNKNOWN_ERROR\", String(err));\n}\n\n/**\n * Wrap a thunk so any thrown value becomes an `AmbaApiError`. The\n * wrapper methods on `Amba` use this to convert runtime-emitted errors\n * uniformly at the SDK boundary.\n */\nexport async function withAmbaError<T>(thunk: () => Promise<T>): Promise<T> {\n try {\n return await thunk();\n } catch (err) {\n throw toAmbaApiError(err);\n }\n}\n","/**\n * Pure-JS HTTP client for the amba API.\n *\n * Built on the platform `fetch` (React Native ships it; Hermes\n * provides it; Expo polyfills it where needed). No transitive\n * runtime deps. The previous implementation tunnelled every call\n * through a WASM core that did the same thing in Rust — moving the\n * logic to TS removes ~4 MB from the customer bundle and removes\n * a runtime that's foreign to Hermes.\n *\n * Responsibilities:\n * - Construct the request URL by joining `baseUrl + path` (with an\n * optional query string).\n * - Inject the standard amba auth headers — `X-Api-Key`,\n * `X-SDK-Platform`, `X-SDK-Version`, `Content-Type`, and\n * `Authorization: Bearer …` when a session token is present.\n * - Map non-2xx responses to typed `AmbaApiError` instances using\n * the same code set the WASM core used (UNAUTHORIZED, FORBIDDEN,\n * NOT_FOUND, CONFLICT, RATE_LIMITED, VALIDATION_ERROR, HTTP_ERROR,\n * NETWORK_ERROR).\n * - Parse JSON response bodies. 204 No Content returns `null`.\n */\n\nimport { AmbaApiError } from \"./error.js\";\nimport type { IdentityStore } from \"./identity.js\";\n\n/** Default amba API endpoint. */\nexport const DEFAULT_BASE_URL = \"https://api.amba.dev\";\n\n/**\n * Server response envelope. Most amba endpoints wrap their payload\n * in `{ data: ... }`. Helpers below let call sites declare whether\n * to return the envelope, the unwrapped `data` field, or the raw\n * body (e.g. `find` returns the whole envelope so consumers can\n * paginate via `next_cursor` / `has_more`).\n */\nexport interface Envelope<T> {\n data: T;\n next_cursor?: string | null;\n has_more?: boolean;\n}\n\nexport interface AmbaHttpClientOptions {\n apiKey: string;\n baseUrl: string;\n sdkPlatform: string;\n sdkVersionHeader: string;\n identity: IdentityStore;\n /** Override the `fetch` implementation — tests pass a vi.fn() shim. */\n fetchImpl?: typeof fetch;\n}\n\ntype Query = Record<string, string | number | boolean | undefined | null>;\n\nexport class AmbaHttpClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly sdkPlatform: string;\n private readonly sdkVersionHeader: string;\n private readonly identity: IdentityStore;\n private readonly fetchImpl: typeof fetch;\n\n constructor(opts: AmbaHttpClientOptions) {\n this.apiKey = opts.apiKey;\n this.baseUrl = opts.baseUrl.replace(/\\/+$/, \"\");\n this.sdkPlatform = opts.sdkPlatform;\n this.sdkVersionHeader = opts.sdkVersionHeader;\n this.identity = opts.identity;\n this.fetchImpl =\n opts.fetchImpl ??\n (globalThis.fetch.bind(globalThis) as typeof fetch);\n }\n\n /** Build the absolute URL for an API path, optionally with a query string. */\n url(path: string, query?: Query): string {\n const base = this.baseUrl + path;\n if (!query) return base;\n const parts: string[] = [];\n for (const k of Object.keys(query)) {\n const v = query[k];\n if (v === undefined || v === null) continue;\n parts.push(`${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`);\n }\n if (parts.length === 0) return base;\n return `${base}?${parts.join(\"&\")}`;\n }\n\n /** Build the standard request headers for the current identity state. */\n buildHeaders(extra?: Record<string, string>): Record<string, string> {\n const h: Record<string, string> = {\n \"X-Api-Key\": this.apiKey,\n \"X-SDK-Platform\": this.sdkPlatform,\n \"X-SDK-Version\": this.sdkVersionHeader,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...extra,\n };\n const tok = this.identity.getSessionToken();\n if (tok) h.Authorization = `Bearer ${tok}`;\n return h;\n }\n\n async get<T>(path: string, query?: Query): Promise<T> {\n return this.request<T>(\"GET\", path, undefined, query);\n }\n\n async post<T>(path: string, body?: unknown, query?: Query): Promise<T> {\n return this.request<T>(\"POST\", path, body, query);\n }\n\n async patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"PATCH\", path, body);\n }\n\n async delete<T>(path: string): Promise<T> {\n return this.request<T>(\"DELETE\", path);\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n query?: Query,\n ): Promise<T> {\n const url = this.url(path, query);\n const headers = this.buildHeaders();\n\n const init: RequestInit = {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body ?? {}),\n };\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, init);\n } catch (err) {\n // Transport-level failure (DNS, refused, offline, abort). The\n // platform fetch throws a TypeError or AbortError; we wrap it\n // into the SDK's stable error shape.\n const message =\n err instanceof Error\n ? err.message\n : typeof err === \"string\"\n ? err\n : \"fetch failed\";\n throw new AmbaApiError(\"NETWORK_ERROR\", `Network error: ${message}`, err);\n }\n\n return parseResponse<T>(response);\n }\n}\n\nasync function parseResponse<T>(response: Response): Promise<T> {\n // 204 No Content: most DELETE endpoints. Return null so generics\n // taking `unknown | null` decode cleanly.\n if (response.status === 204) {\n return null as T;\n }\n\n const text = await response.text();\n const ct = response.headers.get(\"content-type\") ?? \"\";\n const isJson = ct.includes(\"application/json\");\n\n if (!response.ok) {\n throw mapHttpError(response, text, isJson);\n }\n\n if (text === \"\") return null as T;\n if (isJson) {\n try {\n return JSON.parse(text) as T;\n } catch (err) {\n throw new AmbaApiError(\n \"HTTP_ERROR\",\n `Failed to parse JSON response: ${\n err instanceof Error ? err.message : String(err)\n }`,\n { body: text },\n );\n }\n }\n // Non-JSON success body (uncommon for this API). Return the raw text\n // string typed as the generic so the caller can decide.\n return text as unknown as T;\n}\n\nexport function mapHttpError(\n response: Response,\n rawBody: string,\n isJson: boolean,\n): AmbaApiError {\n let parsed: unknown = undefined;\n let message = rawBody || `HTTP ${response.status}`;\n let code: string | undefined;\n // `envelopeDetails` is the inner `error.details` field — surfaced as\n // `AmbaApiError.details` when the server emitted a typed envelope.\n // This matches the WASM-bridged web SDK, which carries the inner\n // details (e.g. `{ streak_key: 'weekly_login' }`) verbatim — NOT the\n // whole `{error:{...}}` wrapper. Customer code like\n // `e.details.streak_key` must work identically on both SDKs.\n // (Cursor BugBot PR #156, medium — cross-SDK details-shape divergence.)\n let envelopeDetails: unknown = undefined;\n let envelopeRecognized = false;\n if (isJson && rawBody) {\n try {\n parsed = JSON.parse(rawBody);\n } catch {\n parsed = undefined;\n }\n // Standard amba envelope: `{ error: { code, message, details } }`\n // and a few legacy `{ error: \"string\" }` shapes. We recognize the\n // envelope by the presence of a string `code` alone — message is\n // optional, matching the Rust `parse_error_envelope` rule so the\n // two SDKs agree on what \"envelope\" means. (Cursor BugBot PR #156.)\n const env = parsed as {\n error?: { code?: string; message?: string; details?: unknown };\n } | null;\n const innerErr = env?.error;\n if (innerErr && typeof innerErr === \"object\" && typeof innerErr.code === \"string\") {\n code = innerErr.code;\n envelopeRecognized = true;\n envelopeDetails = innerErr.details;\n if (typeof innerErr.message === \"string\") message = innerErr.message;\n }\n }\n\n // Use the inner envelope details when the server gave us a\n // recognizable envelope; fall back to the full parsed body\n // otherwise so legacy / proxy-shaped responses still carry\n // something the customer can inspect.\n const details: unknown = envelopeRecognized ? envelopeDetails : parsed;\n\n switch (response.status) {\n case 401:\n return new AmbaApiError(code ?? \"UNAUTHORIZED\", message, details);\n case 403:\n return new AmbaApiError(code ?? \"FORBIDDEN\", message, details);\n case 404:\n return new AmbaApiError(code ?? \"NOT_FOUND\", message, details);\n case 409:\n return new AmbaApiError(code ?? \"CONFLICT\", message, details);\n case 422:\n return new AmbaApiError(\n code ?? \"VALIDATION_ERROR\",\n message,\n details,\n );\n case 429: {\n const retryAfter = response.headers.get(\"retry-after\") ?? \"unspecified\";\n // Prefer the server's structured message if it gave us one; fall back\n // to a synthesized one that surfaces the Retry-After header so callers\n // can decide whether to back off vs surface to the user.\n const serverGaveMessage =\n message !== rawBody && message !== `HTTP ${response.status}`;\n return new AmbaApiError(\n code ?? \"RATE_LIMITED\",\n serverGaveMessage\n ? message\n : `Rate limited (retry after ${retryAfter})`,\n details,\n );\n }\n default:\n return new AmbaApiError(\n code ?? \"HTTP_ERROR\",\n message,\n envelopeRecognized\n ? envelopeDetails\n : (parsed ?? { status: response.status, body: rawBody }),\n );\n }\n}\n","/**\n * UUID v4 generator — pure JS, no dependencies.\n *\n * Why pure JS rather than `globalThis.crypto.randomUUID()`:\n * - Older Hermes builds (RN <0.74) don't ship `crypto` global.\n * - `expo-crypto` exposes `randomUUID()` but is a separate dep we\n * don't want to force on every consumer.\n * - The amba SDK only uses UUIDs for `anonymous_id` — a stable\n * per-install identifier. Cryptographic randomness is not a\n * security requirement here; uniqueness across installs is.\n *\n * If `globalThis.crypto?.getRandomValues` is available (it is on\n * Hermes 0.75+ via the engine and on every Expo runtime via\n * react-native-get-random-values that Expo auto-installs), we use it\n * for higher-quality randomness. Otherwise we fall back to\n * `Math.random()` — which is sufficient for the install-id use case\n * because per-device uniqueness is what we need, not collision\n * resistance across the global population.\n */\n\ntype GetRandomValues = (a: Uint8Array) => Uint8Array;\n\nfunction getRandomBytes(n: number): Uint8Array {\n const bytes = new Uint8Array(n);\n const grv = (globalThis as { crypto?: { getRandomValues?: GetRandomValues } })\n .crypto?.getRandomValues;\n if (typeof grv === \"function\") {\n // Bind to crypto to preserve `this`.\n (globalThis as { crypto: { getRandomValues: GetRandomValues } }).crypto.getRandomValues(\n bytes,\n );\n return bytes;\n }\n // Math.random fallback — not crypto-secure but good enough for\n // install-id uniqueness.\n for (let i = 0; i < n; i++) bytes[i] = Math.floor(Math.random() * 256);\n return bytes;\n}\n\n/**\n * Generate a UUID v4 (random) per RFC 4122. Wire shape:\n * `xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx` where `y ∈ {8,9,a,b}`.\n */\nexport function uuidv4(): string {\n const b = getRandomBytes(16);\n // Set version (4) and variant (10xx) bits.\n b[6] = (b[6]! & 0x0f) | 0x40;\n b[8] = (b[8]! & 0x3f) | 0x80;\n const h = Array.from(b, (v) => v.toString(16).padStart(2, \"0\"));\n return (\n h.slice(0, 4).join(\"\") +\n \"-\" +\n h.slice(4, 6).join(\"\") +\n \"-\" +\n h.slice(6, 8).join(\"\") +\n \"-\" +\n h.slice(8, 10).join(\"\") +\n \"-\" +\n h.slice(10, 16).join(\"\")\n );\n}\n","/**\n * Identity store — the minimal on-device state the SDK keeps between\n * launches: `anonymous_id` (stable per-install UUID), authenticated\n * user id, session token, refresh token, expiry.\n *\n * Persistence: writes go to `AsyncStoragePersistence` under\n * `<prefix>:identity_v1` (JSON-encoded). On `configure()` we hydrate\n * once; subsequent reads/writes are O(1) in-process.\n *\n * Why a small TS class instead of porting the Rust per-instance-key\n * machinery: the WASM core's race rationale (cross-core write race\n * with `amba_reset`) is specific to the FFI slot model — JS doesn't\n * have that hazard because there's one `Amba` singleton per module\n * graph. Keeping the persistence shape simple makes the AsyncStorage\n * cost predictable and the implementation auditable.\n */\n\nimport { AsyncStoragePersistence } from \"./async-storage-adapter.js\";\nimport { uuidv4 } from \"./uuid.js\";\n\n/** Storage key under the configured prefix. Bumped when shape changes. */\nconst IDENTITY_KEY = \"identity_v1\";\n\nexport interface IdentitySnapshot {\n anonymousId: string;\n appUserId: string | null;\n sessionToken: string | null;\n refreshToken: string | null;\n /** ISO-8601 expiry — null means \"no active session.\" */\n expiresAt: string | null;\n}\n\ninterface PersistedIdentity {\n anonymous_id: string;\n app_user_id: string | null;\n session_token: string | null;\n refresh_token: string | null;\n /** ISO-8601 string; null when not set. */\n expires_at: string | null;\n}\n\nfunction isExpired(expiresAt: string | null): boolean {\n if (!expiresAt) return false;\n const t = Date.parse(expiresAt);\n if (Number.isNaN(t)) return false;\n return t <= Date.now();\n}\n\n/**\n * The SDK's identity state — held in memory after hydration, persisted\n * to AsyncStorage on every mutation. All methods are sync after\n * `hydrate()` resolves.\n */\nexport class IdentityStore {\n private anonymousId: string;\n private appUserId: string | null = null;\n private sessionToken: string | null = null;\n private refreshToken: string | null = null;\n private expiresAt: string | null = null;\n\n private constructor(\n private readonly persistence: AsyncStoragePersistence,\n seed: PersistedIdentity,\n ) {\n this.anonymousId = seed.anonymous_id;\n this.appUserId = seed.app_user_id;\n this.sessionToken = seed.session_token;\n this.refreshToken = seed.refresh_token;\n this.expiresAt = seed.expires_at;\n }\n\n /**\n * Build a store, hydrating any prior identity from AsyncStorage.\n * If no prior identity exists, a fresh `anonymous_id` is minted.\n * Expired session tokens are dropped at hydration (the refresh token\n * survives so callers can `auth.refresh()` to mint a new pair).\n */\n static async create(\n persistence: AsyncStoragePersistence,\n ): Promise<IdentityStore> {\n const raw = await persistence.read(IDENTITY_KEY);\n let seed: PersistedIdentity;\n if (raw) {\n try {\n const parsed = JSON.parse(raw) as Partial<PersistedIdentity>;\n seed = {\n anonymous_id: parsed.anonymous_id ?? uuidv4(),\n app_user_id: parsed.app_user_id ?? null,\n session_token: parsed.session_token ?? null,\n refresh_token: parsed.refresh_token ?? null,\n expires_at: parsed.expires_at ?? null,\n };\n } catch {\n // Garbage on disk — start fresh. anonymous_id rotates which is\n // acceptable for a corrupt-state recovery (rare; users on\n // upgrade keep their id because the previous SDK wrote valid JSON).\n seed = freshSeed();\n }\n } else {\n seed = freshSeed();\n }\n\n if (isExpired(seed.expires_at)) {\n // Drop expired session_token but keep refresh_token so the caller\n // can mint a new pair.\n seed.session_token = null;\n seed.expires_at = null;\n }\n\n const store = new IdentityStore(persistence, seed);\n // Always persist after hydration — handles the first-run mint of\n // `anonymous_id` and clears any expired tokens from disk.\n await store.flush();\n return store;\n }\n\n snapshot(): IdentitySnapshot {\n return {\n anonymousId: this.anonymousId,\n appUserId: this.appUserId,\n sessionToken: this.sessionToken,\n refreshToken: this.refreshToken,\n expiresAt: this.expiresAt,\n };\n }\n\n getAnonymousId(): string {\n return this.anonymousId;\n }\n\n getAppUserId(): string | null {\n return this.appUserId;\n }\n\n getSessionToken(): string | null {\n return this.sessionToken;\n }\n\n getRefreshToken(): string | null {\n return this.refreshToken;\n }\n\n isAuthenticated(): boolean {\n return this.sessionToken !== null;\n }\n\n async setSession(args: {\n appUserId: string;\n sessionToken: string;\n refreshToken: string;\n expiresAt: string;\n }): Promise<void> {\n this.appUserId = args.appUserId;\n this.sessionToken = args.sessionToken;\n this.refreshToken = args.refreshToken;\n this.expiresAt = args.expiresAt;\n await this.flush();\n }\n\n async clearSession(rotateAnonymousId: boolean): Promise<void> {\n this.appUserId = null;\n this.sessionToken = null;\n this.refreshToken = null;\n this.expiresAt = null;\n if (rotateAnonymousId) {\n this.anonymousId = uuidv4();\n }\n await this.flush();\n }\n\n private async flush(): Promise<void> {\n const payload: PersistedIdentity = {\n anonymous_id: this.anonymousId,\n app_user_id: this.appUserId,\n session_token: this.sessionToken,\n refresh_token: this.refreshToken,\n expires_at: this.expiresAt,\n };\n await this.persistence.write(IDENTITY_KEY, JSON.stringify(payload));\n }\n}\n\nfunction freshSeed(): PersistedIdentity {\n return {\n anonymous_id: uuidv4(),\n app_user_id: null,\n session_token: null,\n refresh_token: null,\n expires_at: null,\n };\n}\n","/**\n * @layers/amba-react-native — React Native SDK for amba.\n *\n * Pure-JS implementation: the SDK is now a thin client over `fetch`\n * plus AsyncStorage-backed identity. No native modules, no WASM\n * dependency. The native SDKs (Swift/Kotlin/Flutter/Unity via the\n * shared runtime) keep their UniFFI bindings; this RN SDK aligns\n * with how Firebase/Supabase/PostHog ship to JS runtimes — pure\n * fetch-over-HTTP.\n *\n * @example\n * ```tsx\n * import { Amba } from '@layers/amba-react-native';\n *\n * await Amba.configure({ projectId: 'proj_...', clientKey: 'amba_ck_...' });\n * await Amba.auth.signInAnonymously();\n * await Amba.events.track('app_opened');\n *\n * // Push registration with a token from expo-notifications:\n * import * as Notifications from 'expo-notifications';\n * const { data: token } = await Notifications.getDevicePushTokenAsync();\n * await Amba.push.register(token, 'apns'); // or 'fcm' on Android\n * ```\n */\n\nexport type * from \"./types\";\nimport type {\n AmbaConfig,\n AuthResult,\n User,\n FindOptions,\n FindResponse,\n Filter,\n FilterValue,\n ConfigBundle,\n FlagAssignment,\n UserEntitlement,\n MediaAsset,\n PresignData,\n PushPlatform,\n PushToken,\n AiMessageRequest,\n AiMessageResponse,\n SocialProvider,\n Session,\n Achievement,\n AchievementProgress,\n Challenge,\n ChallengeProgress,\n CurrencyBalance,\n CurrencyTransaction,\n InventoryItem,\n PurchaseRequest,\n ConsumeRequest,\n Leaderboard,\n LeaderboardEntry,\n Store,\n PurchaseOption,\n PurchaseResult,\n XpBalance,\n XpTransaction,\n Streak,\n FeedResponse,\n Friendship,\n Group,\n GroupMember,\n GroupCreate,\n GroupUpdate,\n Conversation,\n Message,\n SendMessageRequest,\n CreateConversationRequest,\n ListMessagesOptions,\n MarkReadResult,\n Report,\n ReportRequest,\n ReferralCode,\n ReferralClaim,\n Review,\n ReviewCreate,\n ReviewUpdate,\n Role,\n CatalogItem,\n ContentItem,\n DeepLink,\n DeepLinkCreate,\n OnboardingStatus,\n} from \"./types\";\n\nimport { AsyncStoragePersistence } from \"./async-storage-adapter.js\";\nimport { AmbaApiError } from \"./error.js\";\nimport { AmbaHttpClient, DEFAULT_BASE_URL, mapHttpError } from \"./http-client.js\";\nimport type { Envelope } from \"./http-client.js\";\nimport { IdentityStore } from \"./identity.js\";\n\nexport { AmbaApiError } from \"./error.js\";\nexport type { AmbaApiErrorCode } from \"./error.js\";\n\n/** SDK semver — burned in at build time. Bump alongside package.json. */\nexport const SDK_VERSION = \"3.0.0\";\n\n// ── internal state ──────────────────────────────────────────────────\n\ninterface RuntimeState {\n http: AmbaHttpClient;\n identity: IdentityStore;\n debug: boolean;\n projectId: string;\n}\n\nlet state: RuntimeState | null = null;\n\nfunction getState(): RuntimeState {\n if (!state) {\n throw new AmbaApiError(\n \"NOT_INITIALIZED\",\n \"@layers/amba-react-native: SDK not configured. Call Amba.configure({ projectId, clientKey }) at app start.\",\n );\n }\n return state;\n}\n\n// ── auth state pub/sub ──────────────────────────────────────────────\n\ntype AuthSubscriber = (session: Session | null) => void;\nconst authSubscribers = new Set<AuthSubscriber>();\n\nfunction snapshotSession(user: User | null): Session | null {\n if (!user) return null;\n return {\n sessionToken: \"\",\n refreshToken: \"\",\n user,\n expiresAt: \"\",\n };\n}\n\nfunction notifyAuthSubscribers(session: Session | null): void {\n for (const cb of authSubscribers) {\n try {\n cb(session);\n } catch (err) {\n if (typeof console !== \"undefined\") {\n console.error(\"[amba] onAuthStateChange callback threw\", err);\n }\n }\n }\n}\n\nasync function notifyFromAuthResult(result: AuthResult): Promise<void> {\n notifyAuthSubscribers(snapshotSession(result.user));\n}\n\n// ── persist-on-auth helpers ─────────────────────────────────────────\n\nfunction expiresAtFromResult(result: AuthResult): string {\n if (result.expires_at && typeof result.expires_at === \"string\")\n return result.expires_at;\n // Default 1h session lifetime — matches the Rust core's contract\n // when the server omits `expires_at`.\n return new Date(Date.now() + 3600 * 1000).toISOString();\n}\n\nasync function persistAuthResult(\n state_: RuntimeState,\n result: AuthResult,\n): Promise<void> {\n await state_.identity.setSession({\n appUserId: result.user.id,\n sessionToken: result.session_token,\n refreshToken: result.refresh_token,\n expiresAt: expiresAtFromResult(result),\n });\n}\n\ninterface AuthEnvelope {\n data: AuthResult;\n}\n\nasync function postAuth(\n state_: RuntimeState,\n path: string,\n body: unknown,\n): Promise<AuthResult> {\n const env = await state_.http.post<AuthEnvelope>(path, body);\n const result = env.data;\n await persistAuthResult(state_, result);\n await notifyFromAuthResult(result);\n return result;\n}\n\n// ── light client-side validation (mirrors Rust core) ────────────────\n\nfunction requireEmail(email: string): void {\n const trimmed = email.trim();\n if (trimmed === \"\")\n throw new AmbaApiError(\n \"VALIDATION_ERROR\",\n \"email must not be empty\",\n );\n if (!trimmed.includes(\"@\") || !trimmed.includes(\".\"))\n throw new AmbaApiError(\n \"VALIDATION_ERROR\",\n `email '${email}' is not a valid email address`,\n );\n}\nfunction requirePassword(password: string): void {\n if (password.length < 8)\n throw new AmbaApiError(\n \"VALIDATION_ERROR\",\n \"password must be at least 8 characters\",\n );\n}\n\n// ── path helpers (mirror Rust constants) ────────────────────────────\n\nconst P = {\n authAnonymous: \"/v1/client/auth/anonymous\",\n authEmailLogin: \"/v1/client/auth/email/login\",\n authEmailSignup: \"/v1/client/auth/email/signup\",\n authSocial: \"/v1/client/auth/social\",\n authRefresh: \"/v1/client/auth/refresh\",\n authLogout: \"/v1/client/auth/logout\",\n authMe: \"/v1/client/auth/me\",\n events: \"/v1/client/events\",\n collections: \"/v1/client/collections\",\n storage: \"/v1/client/media\",\n storagePresign: \"/v1/client/media/presign\",\n storageCommit: \"/v1/client/media/commit\",\n push: \"/v1/client/push\",\n pushRegister: \"/v1/client/push/register\",\n pushUnregister: \"/v1/client/push/unregister\",\n pushTokens: \"/v1/client/push/tokens\",\n pushSubscribe: \"/v1/client/push/subscribe\",\n pushUnsubscribe: \"/v1/client/push/unsubscribe\",\n entitlements: \"/v1/client/entitlements\",\n aiAnthropic: \"/v1/client/ai/anthropic/messages\",\n config: \"/v1/client/config\",\n flags: \"/v1/client/flags\",\n achievements: \"/v1/client/achievements\",\n challenges: \"/v1/client/challenges\",\n catalog: \"/v1/client/catalog\",\n currencies: \"/v1/client/currencies\",\n inventory: \"/v1/client/inventory\",\n leaderboards: \"/v1/client/leaderboards\",\n stores: \"/v1/client/stores\",\n xp: \"/v1/client/xp\",\n streaks: \"/v1/client/streaks\",\n feeds: \"/v1/client/feeds\",\n friends: \"/v1/client/friends\",\n groups: \"/v1/client/groups\",\n messaging: \"/v1/client/messaging\",\n moderation: \"/v1/client/moderation\",\n reviews: \"/v1/client/reviews\",\n roles: \"/v1/client/roles\",\n referrals: \"/v1/client/referrals\",\n content: \"/v1/client/content\",\n deepLinks: \"/v1/client/deep-links\",\n onboarding: \"/v1/client/onboarding\",\n};\n\nfunction encodePathSegment(s: string): string {\n return encodeURIComponent(s);\n}\n\n// ── public API ──────────────────────────────────────────────────────\n\n/**\n * Top-level SDK namespace for React Native.\n */\nexport const Amba = {\n configure: async (config: AmbaConfig): Promise<void> => {\n if (!config.projectId || config.projectId.trim() === \"\") {\n throw new Error(\"Amba.configure: projectId is required\");\n }\n if (!config.clientKey || config.clientKey.trim() === \"\") {\n throw new Error(\"Amba.configure: clientKey is required\");\n }\n const persistence = new AsyncStoragePersistence(\n config.storagePrefix ?? \"amba\",\n );\n await persistence.hydrate();\n const identity = await IdentityStore.create(persistence);\n\n const baseUrl = (config.apiUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const wrapperVersion = `amba-react-native/${SDK_VERSION}`;\n const sdkVersionHeader = `amba-sdk/${SDK_VERSION} ${wrapperVersion}`;\n const http = new AmbaHttpClient({\n apiKey: config.clientKey,\n baseUrl,\n sdkPlatform: \"react-native\",\n sdkVersionHeader,\n identity,\n });\n state = { http, identity, debug: config.debug ?? false, projectId: config.projectId };\n },\n\n /**\n * Test-only hook to reset the singleton between tests. Not part of\n * the customer-facing surface; the production SDK uses\n * `Amba.auth.signOut(true)` to fully reset identity.\n * @internal\n */\n _reset: (): void => {\n state = null;\n authSubscribers.clear();\n },\n\n get anonymousId(): string {\n return getState().identity.getAnonymousId();\n },\n get appUserId(): string | undefined {\n return getState().identity.getAppUserId() ?? undefined;\n },\n get isAuthenticated(): boolean {\n return getState().identity.isAuthenticated();\n },\n get projectId(): string {\n return getState().projectId;\n },\n setDebug: (enabled: boolean): void => {\n getState().debug = enabled;\n },\n\n events: {\n track: async (\n event: string,\n properties?: Record<string, unknown>,\n ): Promise<void> => {\n const s = getState();\n // POST /v1/client/events accepts a single event or a batch.\n // Single-shape: { name, properties?, anonymous_id?, timestamp? }\n await s.http.post(P.events, {\n name: event,\n properties: properties ?? undefined,\n anonymous_id: s.identity.getAnonymousId(),\n timestamp: new Date().toISOString(),\n });\n },\n },\n\n auth: {\n signInAnonymously: async (): Promise<AuthResult> => {\n const s = getState();\n // Send the SDK's current anonymous_id so the server can either\n // attach to the existing app_user (no MAU charge) or mint a new\n // one. See DX-2.\n return postAuth(s, P.authAnonymous, {\n anonymous_id: s.identity.getAnonymousId(),\n });\n },\n signInWithEmail: async (\n email: string,\n password: string,\n ): Promise<AuthResult> => {\n requireEmail(email);\n if (password === \"\")\n throw new AmbaApiError(\n \"VALIDATION_ERROR\",\n \"password must not be empty\",\n );\n return postAuth(getState(), P.authEmailLogin, { email, password });\n },\n signUpWithEmail: async (\n email: string,\n password: string,\n ): Promise<AuthResult> => {\n requireEmail(email);\n requirePassword(password);\n return postAuth(getState(), P.authEmailSignup, { email, password });\n },\n signInWithSocial: async (\n provider: SocialProvider,\n idToken: string,\n ): Promise<AuthResult> => {\n if (idToken.trim() === \"\")\n throw new AmbaApiError(\n \"VALIDATION_ERROR\",\n \"id_token must not be empty\",\n );\n return postAuth(getState(), P.authSocial, {\n provider,\n id_token: idToken,\n });\n },\n signOut: async (rotateAnonymousId = false): Promise<void> => {\n const s = getState();\n if (s.identity.getSessionToken()) {\n try {\n await s.http.post(P.authLogout, {});\n } catch (err) {\n // Best-effort: a server-side rejection should not trap the\n // user offline. Mirrors the Rust core's behaviour.\n if (typeof console !== \"undefined\") {\n console.warn(\"[amba] signOut server call failed\", err);\n }\n }\n }\n await s.identity.clearSession(rotateAnonymousId);\n notifyAuthSubscribers(null);\n },\n refresh: async (): Promise<AuthResult> => {\n const s = getState();\n const refreshToken = s.identity.getRefreshToken();\n if (!refreshToken)\n throw new AmbaApiError(\n \"UNAUTHORIZED\",\n \"no refresh token available — call signIn* first\",\n );\n return postAuth(s, P.authRefresh, { refresh_token: refreshToken });\n },\n me: async (): Promise<User> => {\n const s = getState();\n if (!s.identity.getSessionToken())\n throw new AmbaApiError(\n \"UNAUTHORIZED\",\n \"no active session — call signIn* first\",\n );\n const env = await s.http.get<Envelope<User>>(P.authMe);\n return env.data;\n },\n\n getSession: async (): Promise<Session | null> => {\n const s = getState();\n if (!s.identity.isAuthenticated()) return null;\n const env = await s.http.get<Envelope<User>>(P.authMe);\n return snapshotSession(env.data);\n },\n\n getAnonymousId: async (): Promise<string> => {\n return getState().identity.getAnonymousId();\n },\n\n onAuthStateChange: (\n cb: (session: Session | null) => void,\n ): (() => void) => {\n authSubscribers.add(cb);\n return () => {\n authSubscribers.delete(cb);\n };\n },\n },\n\n collections: {\n find: async <T = unknown>(\n name: string,\n options: FindOptions = {},\n ): Promise<FindResponse<T>> => {\n const s = getState();\n // Server returns `{ data, next_cursor, has_more }` for find —\n // the FindResponse shape matches the envelope directly.\n return s.http.post<FindResponse<T>>(\n `${P.collections}/${encodePathSegment(name)}/find`,\n options,\n );\n },\n findOne: async <T = unknown>(name: string, id: string): Promise<T> => {\n const s = getState();\n const env = await s.http.get<Envelope<T>>(\n `${P.collections}/${encodePathSegment(name)}/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n insert: async <T = unknown>(\n name: string,\n row: Record<string, unknown>,\n ): Promise<T> => {\n const s = getState();\n const env = await s.http.post<Envelope<T>>(\n `${P.collections}/${encodePathSegment(name)}`,\n row,\n );\n return env.data;\n },\n update: async <T = unknown>(\n name: string,\n id: string,\n set: Record<string, unknown>,\n ): Promise<T> => {\n const s = getState();\n const env = await s.http.patch<Envelope<T>>(\n `${P.collections}/${encodePathSegment(name)}/${encodePathSegment(id)}`,\n { set },\n );\n return env.data;\n },\n delete: async (\n name: string,\n id: string,\n ): Promise<{ data: { deleted: boolean } }> => {\n const s = getState();\n const result = await s.http.delete<{ data: { deleted: boolean } } | null>(\n `${P.collections}/${encodePathSegment(name)}/${encodePathSegment(id)}`,\n );\n // 204 No Content path — synthesise a `{ data: { deleted: true } }`\n // envelope so consumers can branch uniformly.\n return result ?? { data: { deleted: true } };\n },\n where: {\n eq: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"eq\",\n value,\n }),\n ne: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"ne\",\n value,\n }),\n gt: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"gt\",\n value,\n }),\n gte: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"gte\",\n value,\n }),\n lt: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"lt\",\n value,\n }),\n lte: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"lte\",\n value,\n }),\n in: (column: string, values: FilterValue[]): Filter => ({\n column,\n op: \"in\",\n value: values,\n }),\n notIn: (column: string, values: FilterValue[]): Filter => ({\n column,\n op: \"not_in\",\n value: values,\n }),\n like: (column: string, pattern: string): Filter => ({\n column,\n op: \"like\",\n value: pattern,\n }),\n ilike: (column: string, pattern: string): Filter => ({\n column,\n op: \"ilike\",\n value: pattern,\n }),\n isNull: (column: string): Filter => ({ column, op: \"is_null\" }),\n isNotNull: (column: string): Filter => ({ column, op: \"is_not_null\" }),\n and: (...filters: Filter[]): Filter => ({ and: filters }),\n or: (...filters: Filter[]): Filter => ({ or: filters }),\n not: (filter: Filter): Filter => ({ not: filter }),\n },\n },\n\n storage: {\n presign: async (params: {\n bucket: string;\n filename: string;\n mimeType: string;\n sizeBytes: number;\n retentionDays?: number;\n }): Promise<PresignData> => {\n const s = getState();\n const env = await s.http.post<Envelope<PresignData>>(P.storagePresign, {\n bucket: params.bucket,\n filename: params.filename,\n mime_type: params.mimeType,\n size_bytes: params.sizeBytes,\n retention_days: params.retentionDays,\n });\n return env.data;\n },\n commit: async (uploadId: string, assetId: string): Promise<MediaAsset> => {\n const s = getState();\n const env = await s.http.post<Envelope<MediaAsset>>(P.storageCommit, {\n upload_id: uploadId,\n asset_id: assetId,\n });\n return env.data;\n },\n },\n\n push: {\n register: async (\n token: string,\n platform: PushPlatform,\n bundleId?: string,\n ): Promise<PushToken> => {\n const s = getState();\n const env = await s.http.post<Envelope<PushToken>>(P.pushRegister, {\n token,\n platform,\n bundle_id: bundleId,\n });\n return env.data;\n },\n unregister: async (token: string): Promise<void> => {\n await getState().http.post(P.pushUnregister, { token });\n },\n getTokens: async (): Promise<PushToken[]> => {\n const env = await getState().http.get<Envelope<PushToken[]>>(\n P.pushTokens,\n );\n return env.data;\n },\n subscribe: async (topic: string): Promise<void> => {\n await getState().http.post(P.pushSubscribe, { topic });\n },\n unsubscribe: async (topic: string): Promise<void> => {\n await getState().http.post(P.pushUnsubscribe, { topic });\n },\n },\n\n entitlements: {\n list: async (): Promise<UserEntitlement[]> => {\n const env = await getState().http.get<Envelope<UserEntitlement[]>>(\n P.entitlements,\n );\n return env.data;\n },\n has: async (name: string): Promise<boolean> => {\n const env = await getState().http.get<Envelope<UserEntitlement[]>>(\n P.entitlements,\n { active_only: \"true\" },\n );\n return env.data.some((e) => e.name === name && e.is_active);\n },\n },\n\n ai: {\n anthropic: {\n messages: {\n create: async (\n request: AiMessageRequest,\n ): Promise<AiMessageResponse> => {\n const env = await getState().http.post<Envelope<AiMessageResponse>>(\n P.aiAnthropic,\n request,\n );\n return env.data;\n },\n },\n },\n },\n\n config: {\n fetch: async (): Promise<ConfigBundle> => {\n const s = getState();\n // Config returns `{ data: Record<string, unknown> }` plus an\n // `ETag` header that carries the version stamp.\n const url = s.http.url(P.config);\n const headers = s.http.buildHeaders();\n let response: Response;\n try {\n response = await (globalThis.fetch ?? fetch)(url, {\n method: \"GET\",\n headers,\n });\n } catch (err) {\n throw new AmbaApiError(\n \"NETWORK_ERROR\",\n `Network error: ${err instanceof Error ? err.message : String(err)}`,\n err,\n );\n }\n const text = await response.text();\n if (!response.ok) {\n const ct = response.headers.get(\"content-type\") ?? \"\";\n throw mapHttpError(response, text, ct.includes(\"application/json\"));\n }\n let parsed: { data?: Record<string, unknown> } = {};\n if (text) {\n try {\n parsed = JSON.parse(text);\n } catch {\n parsed = {};\n }\n }\n const etag = response.headers.get(\"etag\");\n // ETag format: `\"vN-...\"` — strip quotes then take the leading\n // `vN` prefix as the version stamp.\n let version: string | null = null;\n if (etag) {\n const cleaned = etag.replace(/^\"|\"$/g, \"\");\n const m = cleaned.match(/^(v\\d+)/);\n version = m ? (m[1] ?? null) : cleaned || null;\n }\n return {\n version,\n values: parsed.data ?? {},\n };\n },\n },\n\n flags: {\n fetch: async (): Promise<FlagAssignment[]> => {\n const env = await getState().http.get<Envelope<FlagAssignment[]>>(P.flags);\n return env.data;\n },\n },\n\n // ── Gamification ──────────────────────────────────────────────────\n\n achievements: {\n getAll: async (): Promise<Achievement[]> => {\n const env = await getState().http.get<Envelope<Achievement[]>>(\n P.achievements,\n );\n return env.data;\n },\n getProgress: async (): Promise<AchievementProgress[]> => {\n const env = await getState().http.get<Envelope<AchievementProgress[]>>(\n `${P.achievements}/progress`,\n );\n return env.data;\n },\n },\n\n challenges: {\n getActive: async (): Promise<Challenge[]> => {\n const env = await getState().http.get<Envelope<Challenge[]>>(\n `${P.challenges}/active`,\n );\n return env.data;\n },\n get: async (id: string): Promise<Challenge> => {\n const env = await getState().http.get<Envelope<Challenge>>(\n `${P.challenges}/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n getProgress: async (id: string): Promise<ChallengeProgress> => {\n const env = await getState().http.get<Envelope<ChallengeProgress>>(\n `${P.challenges}/${encodePathSegment(id)}/progress`,\n );\n return env.data;\n },\n claim: async (id: string): Promise<ChallengeProgress> => {\n const env = await getState().http.post<Envelope<ChallengeProgress>>(\n `${P.challenges}/${encodePathSegment(id)}/claim`,\n {},\n );\n return env.data;\n },\n },\n\n currencies: {\n getBalance: async (): Promise<CurrencyBalance[]> => {\n const env = await getState().http.get<Envelope<CurrencyBalance[]>>(\n P.currencies,\n );\n return env.data;\n },\n getTransactions: async (\n currencyKey: string,\n ): Promise<CurrencyTransaction[]> => {\n // Server route is `GET /currencies/transactions?currency_code=<key>`\n // — the key is a query param, not a path segment. DX-33 fix.\n const env = await getState().http.get<Envelope<CurrencyTransaction[]>>(\n `${P.currencies}/transactions`,\n { currency_code: currencyKey },\n );\n return env.data;\n },\n },\n\n inventory: {\n getItems: async (): Promise<InventoryItem[]> => {\n const env = await getState().http.get<Envelope<InventoryItem[]>>(\n P.inventory,\n );\n return env.data;\n },\n getItem: async (id: string): Promise<InventoryItem> => {\n const env = await getState().http.get<Envelope<InventoryItem>>(\n `${P.inventory}/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n purchase: async (request: PurchaseRequest): Promise<InventoryItem> => {\n const env = await getState().http.post<Envelope<InventoryItem>>(\n `${P.inventory}/purchase`,\n request,\n );\n return env.data;\n },\n consume: async (request: ConsumeRequest): Promise<InventoryItem> => {\n // Server route is `POST /v1/client/inventory/:itemId/consume`. The\n // item id moves into the path; only `quantity` stays in the body.\n // DX-36 fix.\n const { item_id, ...body } = request;\n const env = await getState().http.post<Envelope<InventoryItem>>(\n `${P.inventory}/${encodePathSegment(item_id)}/consume`,\n body,\n );\n return env.data;\n },\n },\n\n leaderboards: {\n get: async (key: string): Promise<Leaderboard> => {\n const env = await getState().http.get<Envelope<Leaderboard>>(\n `${P.leaderboards}/${encodePathSegment(key)}`,\n );\n return env.data;\n },\n getEntries: async (\n key: string,\n limit?: number,\n ): Promise<LeaderboardEntry[]> => {\n const env = await getState().http.get<Envelope<LeaderboardEntry[]>>(\n `${P.leaderboards}/${encodePathSegment(key)}/entries`,\n limit !== undefined ? { limit } : undefined,\n );\n return env.data;\n },\n getMyRank: async (key: string): Promise<LeaderboardEntry> => {\n const env = await getState().http.get<Envelope<LeaderboardEntry>>(\n `${P.leaderboards}/${encodePathSegment(key)}/me`,\n );\n return env.data;\n },\n },\n\n stores: {\n list: async (): Promise<Store[]> => {\n const env = await getState().http.get<Envelope<Store[]>>(P.stores);\n return env.data;\n },\n getPurchaseOptions: async (\n storeKey: string,\n ): Promise<PurchaseOption[]> => {\n const env = await getState().http.get<Envelope<PurchaseOption[]>>(\n `${P.stores}/${encodePathSegment(storeKey)}/options`,\n );\n return env.data;\n },\n purchase: async (\n storeKey: string,\n purchaseOptionId: string,\n receipt: unknown,\n ): Promise<PurchaseResult> => {\n // `undefined` doesn't survive JSON.stringify (it's omitted from\n // the object, leaving the server's body as if `receipt` was\n // never sent). For symmetry with the web SDK fix, default the\n // missing-receipt case to an empty object so the server sees a\n // valid `{ purchase_option_id, receipt: {} }` body (BugBot Low\n // 2026-05-19).\n const env = await getState().http.post<Envelope<PurchaseResult>>(\n `${P.stores}/${encodePathSegment(storeKey)}/purchase`,\n { purchase_option_id: purchaseOptionId, receipt: receipt ?? {} },\n );\n return env.data;\n },\n },\n\n xp: {\n getBalance: async (): Promise<XpBalance> => {\n const env = await getState().http.get<Envelope<XpBalance>>(P.xp);\n return env.data;\n },\n getHistory: async (limit?: number): Promise<XpTransaction[]> => {\n const env = await getState().http.get<Envelope<XpTransaction[]>>(\n `${P.xp}/history`,\n limit !== undefined ? { limit } : undefined,\n );\n return env.data;\n },\n claim: async (grantKey: string): Promise<XpTransaction> => {\n const env = await getState().http.post<Envelope<XpTransaction>>(\n `${P.xp}/claim`,\n { grant_key: grantKey },\n );\n return env.data;\n },\n },\n\n streaks: {\n getAll: async (): Promise<Streak[]> => {\n const env = await getState().http.get<Envelope<Streak[]>>(P.streaks);\n return env.data;\n },\n qualify: async (streakKey: string): Promise<Streak> => {\n const env = await getState().http.post<Envelope<Streak>>(\n `${P.streaks}/${encodePathSegment(streakKey)}/qualify`,\n {},\n );\n return env.data;\n },\n },\n\n // ── Social ─────────────────────────────────────────────────────────\n\n feeds: {\n getActivity: async (\n feed?: string,\n cursor?: string,\n ): Promise<FeedResponse> => {\n const f = feed ?? \"default\";\n return getState().http.get<FeedResponse>(\n `${P.feeds}/${encodePathSegment(f)}`,\n cursor ? { cursor } : undefined,\n );\n },\n },\n\n friends: {\n getList: async (): Promise<Friendship[]> => {\n const env = await getState().http.get<Envelope<Friendship[]>>(\n P.friends,\n );\n return env.data;\n },\n getFriends: async (): Promise<Friendship[]> => {\n const env = await getState().http.get<Envelope<Friendship[]>>(\n P.friends,\n { state: \"accepted\" },\n );\n return env.data;\n },\n blockUser: async (userId: string): Promise<Friendship> => {\n const env = await getState().http.post<Envelope<Friendship>>(\n `${P.friends}/block`,\n { user_id: userId },\n );\n return env.data;\n },\n unblockUser: async (userId: string): Promise<void> => {\n await getState().http.post(`${P.friends}/unblock`, { user_id: userId });\n },\n removeBlock: async (friendshipId: string): Promise<void> => {\n await getState().http.delete(\n `${P.friends}/${encodePathSegment(friendshipId)}`,\n );\n },\n },\n\n groups: {\n create: async (params: GroupCreate): Promise<Group> => {\n const env = await getState().http.post<Envelope<Group>>(P.groups, params);\n return env.data;\n },\n get: async (id: string): Promise<Group> => {\n const env = await getState().http.get<Envelope<Group>>(\n `${P.groups}/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n update: async (id: string, patch: GroupUpdate): Promise<Group> => {\n const env = await getState().http.patch<Envelope<Group>>(\n `${P.groups}/${encodePathSegment(id)}`,\n patch,\n );\n return env.data;\n },\n delete: async (id: string): Promise<void> => {\n await getState().http.delete(`${P.groups}/${encodePathSegment(id)}`);\n },\n getMembers: async (id: string): Promise<GroupMember[]> => {\n const env = await getState().http.get<Envelope<GroupMember[]>>(\n `${P.groups}/${encodePathSegment(id)}/members`,\n );\n return env.data;\n },\n join: async (id: string): Promise<GroupMember> => {\n const env = await getState().http.post<Envelope<GroupMember>>(\n `${P.groups}/${encodePathSegment(id)}/join`,\n {},\n );\n return env.data;\n },\n leave: async (id: string): Promise<void> => {\n await getState().http.post(\n `${P.groups}/${encodePathSegment(id)}/leave`,\n {},\n );\n },\n invite: async (id: string, userId: string): Promise<GroupMember> => {\n const env = await getState().http.post<Envelope<GroupMember>>(\n `${P.groups}/${encodePathSegment(id)}/invite`,\n { user_id: userId },\n );\n return env.data;\n },\n },\n\n /**\n * User-to-user direct messaging. Task #62 corrected the path\n * constants — `sendMessage` previously POSTed to\n * `/v1/client/messaging/messages`, which the API doesn't serve.\n * The real route is `/v1/client/messaging/conversations/:id/messages`.\n */\n messaging: {\n /**\n * `POST /v1/client/messaging/conversations` — create (or fetch\n * the existing direct) conversation. Idempotent for direct\n * conversations between two users.\n */\n createConversation: async (\n request: CreateConversationRequest,\n ): Promise<Conversation> => {\n const env = await getState().http.post<Envelope<Conversation>>(\n `${P.messaging}/conversations`,\n request,\n );\n return env.data;\n },\n getConversations: async (): Promise<Conversation[]> => {\n const env = await getState().http.get<Envelope<Conversation[]>>(\n `${P.messaging}/conversations`,\n );\n return env.data;\n },\n /** Alias matching the `listX` naming convention used elsewhere. */\n listConversations: async (): Promise<Conversation[]> => {\n const env = await getState().http.get<Envelope<Conversation[]>>(\n `${P.messaging}/conversations`,\n );\n return env.data;\n },\n sendMessage: async (\n conversationId: string,\n request: SendMessageRequest,\n ): Promise<Message> => {\n const env = await getState().http.post<Envelope<Message>>(\n `${P.messaging}/conversations/${encodePathSegment(conversationId)}/messages`,\n request,\n );\n return env.data;\n },\n listMessages: async (\n conversationId: string,\n opts?: ListMessagesOptions,\n ): Promise<Message[]> => {\n const query: Record<string, number | undefined> = {};\n if (opts?.limit !== undefined) query.limit = opts.limit;\n if (opts?.offset !== undefined) query.offset = opts.offset;\n const env = await getState().http.get<Envelope<Message[]>>(\n `${P.messaging}/conversations/${encodePathSegment(conversationId)}/messages`,\n Object.keys(query).length > 0 ? query : undefined,\n );\n return env.data;\n },\n markRead: async (conversationId: string): Promise<MarkReadResult> => {\n const env = await getState().http.post<Envelope<MarkReadResult>>(\n `${P.messaging}/conversations/${encodePathSegment(conversationId)}/read`,\n {},\n );\n return env.data;\n },\n },\n\n moderation: {\n reportUser: async (request: ReportRequest): Promise<Report> => {\n const env = await getState().http.post<Envelope<Report>>(\n `${P.moderation}/reports/users`,\n request,\n );\n return env.data;\n },\n reportContent: async (request: ReportRequest): Promise<Report> => {\n const env = await getState().http.post<Envelope<Report>>(\n `${P.moderation}/reports/content`,\n request,\n );\n return env.data;\n },\n getReportStatus: async (id: string): Promise<Report> => {\n const env = await getState().http.get<Envelope<Report>>(\n `${P.moderation}/reports/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n },\n\n reviews: {\n list: async (\n targetType: string,\n targetId: string,\n ): Promise<Review[]> => {\n const env = await getState().http.get<Envelope<Review[]>>(P.reviews, {\n target_type: targetType,\n target_id: targetId,\n });\n return env.data;\n },\n create: async (params: ReviewCreate): Promise<Review> => {\n const env = await getState().http.post<Envelope<Review>>(P.reviews, params);\n return env.data;\n },\n update: async (id: string, patch: ReviewUpdate): Promise<Review> => {\n const env = await getState().http.patch<Envelope<Review>>(\n `${P.reviews}/${encodePathSegment(id)}`,\n patch,\n );\n return env.data;\n },\n delete: async (id: string): Promise<void> => {\n await getState().http.delete(`${P.reviews}/${encodePathSegment(id)}`);\n },\n },\n\n roles: {\n getMyRoles: async (): Promise<Role[]> => {\n const env = await getState().http.get<Envelope<Role[]>>(\n `${P.roles}/me`,\n );\n return env.data;\n },\n hasPermission: async (permission: string): Promise<boolean> => {\n const env = await getState().http.get<Envelope<{ allowed: boolean }>>(\n `${P.roles}/check`,\n { permission },\n );\n return env.data.allowed === true;\n },\n },\n\n referrals: {\n getReferralCode: async (): Promise<ReferralCode> => {\n // Server route is `/v1/client/referrals/my-code` (DX-32 fix).\n const env = await getState().http.get<Envelope<ReferralCode>>(\n `${P.referrals}/my-code`,\n );\n return env.data;\n },\n claimReferral: async (code: string): Promise<ReferralClaim> => {\n const env = await getState().http.post<Envelope<ReferralClaim>>(\n `${P.referrals}/claim`,\n { code },\n );\n return env.data;\n },\n create: async (\n code?: string,\n maxUses?: number,\n ): Promise<ReferralCode> => {\n const body: Record<string, unknown> = {};\n if (code !== undefined) body.code = code;\n if (maxUses !== undefined) body.max_uses = maxUses;\n const env = await getState().http.post<Envelope<ReferralCode>>(\n P.referrals,\n body,\n );\n return env.data;\n },\n },\n\n // ── Lifecycle ──────────────────────────────────────────────────────\n\n catalog: {\n list: async (): Promise<CatalogItem[]> => {\n const env = await getState().http.get<Envelope<CatalogItem[]>>(\n P.catalog,\n );\n return env.data;\n },\n },\n\n content: {\n getToday: async (\n channel: string = \"default\",\n ): Promise<ContentItem | null> => {\n const env = await getState().http.get<Envelope<ContentItem | null>>(\n `${P.content}/today/${encodePathSegment(channel)}`,\n );\n return env.data ?? null;\n },\n getLibrary: async (\n channel: string = \"default\",\n options?: { limit?: number; cursor?: string },\n ): Promise<ContentItem[]> => {\n const env = await getState().http.get<Envelope<ContentItem[]>>(\n `${P.content}/library/${encodePathSegment(channel)}`,\n {\n limit: options?.limit,\n cursor: options?.cursor,\n },\n );\n return env.data;\n },\n getItem: async (id: string): Promise<ContentItem> => {\n const env = await getState().http.get<Envelope<ContentItem>>(\n `${P.content}/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n updateItem: async (id: string, state_: unknown): Promise<ContentItem> => {\n const env = await getState().http.post<Envelope<ContentItem>>(\n `${P.content}/${encodePathSegment(id)}/state`,\n state_ as Record<string, unknown>,\n );\n return env.data;\n },\n createItem: async (\n channel: string,\n item: unknown,\n ): Promise<ContentItem> => {\n const env = await getState().http.post<Envelope<ContentItem>>(\n `${P.content}/${encodePathSegment(channel)}`,\n item as Record<string, unknown>,\n );\n return env.data;\n },\n },\n\n deepLinks: {\n get: async (shortCode: string): Promise<DeepLink> => {\n // Server route is `/v1/client/deep-links/resolve/:slug` — DX-42 fix.\n const env = await getState().http.get<Envelope<DeepLink>>(\n `${P.deepLinks}/resolve/${encodePathSegment(shortCode)}`,\n );\n return env.data;\n },\n create: async (params: DeepLinkCreate): Promise<DeepLink> => {\n const env = await getState().http.post<Envelope<DeepLink>>(\n P.deepLinks,\n params,\n );\n return env.data;\n },\n },\n\n onboarding: {\n getStatus: async (): Promise<OnboardingStatus> => {\n const env = await getState().http.get<Envelope<OnboardingStatus>>(\n P.onboarding,\n );\n return env.data;\n },\n nextStep: async (payload: unknown): Promise<OnboardingStatus> => {\n const env = await getState().http.post<Envelope<OnboardingStatus>>(\n `${P.onboarding}/next`,\n payload as Record<string, unknown>,\n );\n return env.data;\n },\n skipStep: async (): Promise<OnboardingStatus> => {\n const env = await getState().http.post<Envelope<OnboardingStatus>>(\n `${P.onboarding}/skip`,\n {},\n );\n return env.data;\n },\n complete: async (): Promise<OnboardingStatus> => {\n const env = await getState().http.post<Envelope<OnboardingStatus>>(\n `${P.onboarding}/complete`,\n {},\n );\n return env.data;\n },\n },\n\n /**\n * Developer utilities. Only available on sandbox-tier projects.\n *\n * These methods are safe to call from client-side code — they use the\n * project's client key, not an admin credential.\n */\n dev: {\n /**\n * Wipe all users and their associated data on a sandbox-tier project.\n *\n * Lets a developer's Settings or Account tab add a \"Reset\" button\n * without embedding an admin credential on the device. Rejects with\n * an `AmbaApiError` with `code: 'NOT_SANDBOX_TIER'` if the project\n * is not on a sandbox tier.\n */\n resetSandbox: async (): Promise<{ deleted: number }> => {\n const s = getState();\n const env = await s.http.post<Envelope<{ deleted: number }>>(\n \"/v1/client/dev/reset-sandbox\",\n {},\n );\n return env.data;\n },\n },\n};\n"],"mappings":";;AAkBA,IAAIA,gBAA2C;AAE/C,eAAe,aAAiD;AAC9D,KAAI,kBAAkB,KAAM,QAAO;AACnC,KAAI;EACF,MAAM,MAAM,MAAM,OAAO;AACzB,kBAAiB,IAAI,WAAW;AAChC,SAAO;SACD;AAGN,SAAO;;;AAIX,IAAa,0BAAb,MAAqC;CACnC,AAAQ,8BAAc,IAAI,KAAqB;CAE/C,YAAY,AAAiBC,QAAgB;EAAhB;;CAE7B,MAAM,UAAyB;CAM/B,MAAM,KAAK,KAAqC;EAC9C,MAAM,UAAU,GAAG,KAAK,OAAO,GAAG;AAClC,MAAI,KAAK,YAAY,IAAI,QAAQ,CAC/B,QAAO,KAAK,YAAY,IAAI,QAAQ,IAAI;EAC1C,MAAM,UAAU,MAAM,YAAY;AAClC,MAAI,CAAC,QAAS,QAAO;EACrB,MAAM,IAAI,MAAM,QAAQ,QAAQ,QAAQ;AACxC,MAAI,MAAM,KAAM,MAAK,YAAY,IAAI,SAAS,EAAE;AAChD,SAAO;;CAGT,MAAM,MAAM,KAAa,OAA8B;EACrD,MAAM,UAAU,GAAG,KAAK,OAAO,GAAG;AAClC,OAAK,YAAY,IAAI,SAAS,MAAM;EACpC,MAAM,UAAU,MAAM,YAAY;AAClC,MAAI,QAAS,OAAM,QAAQ,QAAQ,SAAS,MAAM;;CAGpD,MAAM,OAAO,KAA4B;EACvC,MAAM,UAAU,GAAG,KAAK,OAAO,GAAG;AAClC,OAAK,YAAY,OAAO,QAAQ;EAChC,MAAM,UAAU,MAAM,YAAY;AAClC,MAAI,QAAS,OAAM,QAAQ,WAAW,QAAQ;;;;;;AC5BlD,IAAa,eAAb,cAAkC,MAAM;CACtC,AAAS;CACT,AAAS;CACT,YACE,MACA,SACA,SACA;AACA,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,OAAO;AACZ,OAAK,UAAU;AAGf,SAAO,eAAe,MAAM,IAAI,OAAO,UAAU;;;;;;;ACzBrD,MAAa,mBAAmB;AA2BhC,IAAa,iBAAb,MAA4B;CAC1B,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,YAAY,MAA6B;AACvC,OAAK,SAAS,KAAK;AACnB,OAAK,UAAU,KAAK,QAAQ,QAAQ,QAAQ,GAAG;AAC/C,OAAK,cAAc,KAAK;AACxB,OAAK,mBAAmB,KAAK;AAC7B,OAAK,WAAW,KAAK;AACrB,OAAK,YACH,KAAK,aACJ,WAAW,MAAM,KAAK,WAAW;;;CAItC,IAAI,MAAc,OAAuB;EACvC,MAAM,OAAO,KAAK,UAAU;AAC5B,MAAI,CAAC,MAAO,QAAO;EACnB,MAAMC,QAAkB,EAAE;AAC1B,OAAK,MAAM,KAAK,OAAO,KAAK,MAAM,EAAE;GAClC,MAAM,IAAI,MAAM;AAChB,OAAI,MAAM,UAAa,MAAM,KAAM;AACnC,SAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC,GAAG,mBAAmB,OAAO,EAAE,CAAC,GAAG;;AAEzE,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SAAO,GAAG,KAAK,GAAG,MAAM,KAAK,IAAI;;;CAInC,aAAa,OAAwD;EACnE,MAAMC,IAA4B;GAChC,aAAa,KAAK;GAClB,kBAAkB,KAAK;GACvB,iBAAiB,KAAK;GACtB,gBAAgB;GAChB,QAAQ;GACR,GAAG;GACJ;EACD,MAAM,MAAM,KAAK,SAAS,iBAAiB;AAC3C,MAAI,IAAK,GAAE,gBAAgB,UAAU;AACrC,SAAO;;CAGT,MAAM,IAAO,MAAc,OAA2B;AACpD,SAAO,KAAK,QAAW,OAAO,MAAM,QAAW,MAAM;;CAGvD,MAAM,KAAQ,MAAc,MAAgB,OAA2B;AACrE,SAAO,KAAK,QAAW,QAAQ,MAAM,MAAM,MAAM;;CAGnD,MAAM,MAAS,MAAc,MAA4B;AACvD,SAAO,KAAK,QAAW,SAAS,MAAM,KAAK;;CAG7C,MAAM,OAAU,MAA0B;AACxC,SAAO,KAAK,QAAW,UAAU,KAAK;;CAGxC,MAAc,QACZ,QACA,MACA,MACA,OACY;EACZ,MAAM,MAAM,KAAK,IAAI,MAAM,MAAM;EAGjC,MAAMC,OAAoB;GACxB;GACA,SAJc,KAAK,cAAc;GAKjC,MAAM,SAAS,SAAY,SAAY,KAAK,UAAU,QAAQ,EAAE,CAAC;GAClE;EAED,IAAIC;AACJ,MAAI;AACF,cAAW,MAAM,KAAK,UAAU,KAAK,KAAK;WACnC,KAAK;AAUZ,SAAM,IAAI,aAAa,iBAAiB,kBALtC,eAAe,QACX,IAAI,UACJ,OAAO,QAAQ,WACb,MACA,kBAC6D,IAAI;;AAG3E,SAAO,cAAiB,SAAS;;;AAIrC,eAAe,cAAiB,UAAgC;AAG9D,KAAI,SAAS,WAAW,IACtB,QAAO;CAGT,MAAM,OAAO,MAAM,SAAS,MAAM;CAElC,MAAM,UADK,SAAS,QAAQ,IAAI,eAAe,IAAI,IACjC,SAAS,mBAAmB;AAE9C,KAAI,CAAC,SAAS,GACZ,OAAM,aAAa,UAAU,MAAM,OAAO;AAG5C,KAAI,SAAS,GAAI,QAAO;AACxB,KAAI,OACF,KAAI;AACF,SAAO,KAAK,MAAM,KAAK;UAChB,KAAK;AACZ,QAAM,IAAI,aACR,cACA,kCACE,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,IAElD,EAAE,MAAM,MAAM,CACf;;AAKL,QAAO;;AAGT,SAAgB,aACd,UACA,SACA,QACc;CACd,IAAIC,SAAkB;CACtB,IAAI,UAAU,WAAW,QAAQ,SAAS;CAC1C,IAAIC;CAQJ,IAAIC,kBAA2B;CAC/B,IAAI,qBAAqB;AACzB,KAAI,UAAU,SAAS;AACrB,MAAI;AACF,YAAS,KAAK,MAAM,QAAQ;UACtB;AACN,YAAS;;EAUX,MAAM,WAHM,QAGU;AACtB,MAAI,YAAY,OAAO,aAAa,YAAY,OAAO,SAAS,SAAS,UAAU;AACjF,UAAO,SAAS;AAChB,wBAAqB;AACrB,qBAAkB,SAAS;AAC3B,OAAI,OAAO,SAAS,YAAY,SAAU,WAAU,SAAS;;;CAQjE,MAAMC,UAAmB,qBAAqB,kBAAkB;AAEhE,SAAQ,SAAS,QAAjB;EACE,KAAK,IACH,QAAO,IAAI,aAAa,QAAQ,gBAAgB,SAAS,QAAQ;EACnE,KAAK,IACH,QAAO,IAAI,aAAa,QAAQ,aAAa,SAAS,QAAQ;EAChE,KAAK,IACH,QAAO,IAAI,aAAa,QAAQ,aAAa,SAAS,QAAQ;EAChE,KAAK,IACH,QAAO,IAAI,aAAa,QAAQ,YAAY,SAAS,QAAQ;EAC/D,KAAK,IACH,QAAO,IAAI,aACT,QAAQ,oBACR,SACA,QACD;EACH,KAAK,KAAK;GACR,MAAM,aAAa,SAAS,QAAQ,IAAI,cAAc,IAAI;GAI1D,MAAM,oBACJ,YAAY,WAAW,YAAY,QAAQ,SAAS;AACtD,UAAO,IAAI,aACT,QAAQ,gBACR,oBACI,UACA,6BAA6B,WAAW,IAC5C,QACD;;EAEH,QACE,QAAO,IAAI,aACT,QAAQ,cACR,SACA,qBACI,kBACC,UAAU;GAAE,QAAQ,SAAS;GAAQ,MAAM;GAAS,CAC1D;;;;;;ACxPP,SAAS,eAAe,GAAuB;CAC7C,MAAM,QAAQ,IAAI,WAAW,EAAE;AAG/B,KAAI,OAFS,WACV,QAAQ,oBACQ,YAAY;AAE7B,EAAC,WAAgE,OAAO,gBACtE,MACD;AACD,SAAO;;AAIT,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAK,OAAM,KAAK,KAAK,MAAM,KAAK,QAAQ,GAAG,IAAI;AACtE,QAAO;;;;;;AAOT,SAAgB,SAAiB;CAC/B,MAAM,IAAI,eAAe,GAAG;AAE5B,GAAE,KAAM,EAAE,KAAM,KAAQ;AACxB,GAAE,KAAM,EAAE,KAAM,KAAQ;CACxB,MAAM,IAAI,MAAM,KAAK,IAAI,MAAM,EAAE,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;AAC/D,QACE,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK,GAAG,GACtB,MACA,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK,GAAG,GACtB,MACA,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK,GAAG,GACtB,MACA,EAAE,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,GACvB,MACA,EAAE,MAAM,IAAI,GAAG,CAAC,KAAK,GAAG;;;;;;ACrC5B,MAAM,eAAe;AAoBrB,SAAS,UAAU,WAAmC;AACpD,KAAI,CAAC,UAAW,QAAO;CACvB,MAAM,IAAI,KAAK,MAAM,UAAU;AAC/B,KAAI,OAAO,MAAM,EAAE,CAAE,QAAO;AAC5B,QAAO,KAAK,KAAK,KAAK;;;;;;;AAQxB,IAAa,gBAAb,MAAa,cAAc;CACzB,AAAQ;CACR,AAAQ,YAA2B;CACnC,AAAQ,eAA8B;CACtC,AAAQ,eAA8B;CACtC,AAAQ,YAA2B;CAEnC,AAAQ,YACN,AAAiBC,aACjB,MACA;EAFiB;AAGjB,OAAK,cAAc,KAAK;AACxB,OAAK,YAAY,KAAK;AACtB,OAAK,eAAe,KAAK;AACzB,OAAK,eAAe,KAAK;AACzB,OAAK,YAAY,KAAK;;;;;;;;CASxB,aAAa,OACX,aACwB;EACxB,MAAM,MAAM,MAAM,YAAY,KAAK,aAAa;EAChD,IAAIC;AACJ,MAAI,IACF,KAAI;GACF,MAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,UAAO;IACL,cAAc,OAAO,gBAAgB,QAAQ;IAC7C,aAAa,OAAO,eAAe;IACnC,eAAe,OAAO,iBAAiB;IACvC,eAAe,OAAO,iBAAiB;IACvC,YAAY,OAAO,cAAc;IAClC;UACK;AAIN,UAAO,WAAW;;MAGpB,QAAO,WAAW;AAGpB,MAAI,UAAU,KAAK,WAAW,EAAE;AAG9B,QAAK,gBAAgB;AACrB,QAAK,aAAa;;EAGpB,MAAM,QAAQ,IAAI,cAAc,aAAa,KAAK;AAGlD,QAAM,MAAM,OAAO;AACnB,SAAO;;CAGT,WAA6B;AAC3B,SAAO;GACL,aAAa,KAAK;GAClB,WAAW,KAAK;GAChB,cAAc,KAAK;GACnB,cAAc,KAAK;GACnB,WAAW,KAAK;GACjB;;CAGH,iBAAyB;AACvB,SAAO,KAAK;;CAGd,eAA8B;AAC5B,SAAO,KAAK;;CAGd,kBAAiC;AAC/B,SAAO,KAAK;;CAGd,kBAAiC;AAC/B,SAAO,KAAK;;CAGd,kBAA2B;AACzB,SAAO,KAAK,iBAAiB;;CAG/B,MAAM,WAAW,MAKC;AAChB,OAAK,YAAY,KAAK;AACtB,OAAK,eAAe,KAAK;AACzB,OAAK,eAAe,KAAK;AACzB,OAAK,YAAY,KAAK;AACtB,QAAM,KAAK,OAAO;;CAGpB,MAAM,aAAa,mBAA2C;AAC5D,OAAK,YAAY;AACjB,OAAK,eAAe;AACpB,OAAK,eAAe;AACpB,OAAK,YAAY;AACjB,MAAI,kBACF,MAAK,cAAc,QAAQ;AAE7B,QAAM,KAAK,OAAO;;CAGpB,MAAc,QAAuB;EACnC,MAAMC,UAA6B;GACjC,cAAc,KAAK;GACnB,aAAa,KAAK;GAClB,eAAe,KAAK;GACpB,eAAe,KAAK;GACpB,YAAY,KAAK;GAClB;AACD,QAAM,KAAK,YAAY,MAAM,cAAc,KAAK,UAAU,QAAQ,CAAC;;;AAIvE,SAAS,YAA+B;AACtC,QAAO;EACL,cAAc,QAAQ;EACtB,aAAa;EACb,eAAe;EACf,eAAe;EACf,YAAY;EACb;;;;;;AC1FH,MAAa,cAAc;AAW3B,IAAIC,QAA6B;AAEjC,SAAS,WAAyB;AAChC,KAAI,CAAC,MACH,OAAM,IAAI,aACR,mBACA,6GACD;AAEH,QAAO;;AAMT,MAAM,kCAAkB,IAAI,KAAqB;AAEjD,SAAS,gBAAgB,MAAmC;AAC1D,KAAI,CAAC,KAAM,QAAO;AAClB,QAAO;EACL,cAAc;EACd,cAAc;EACd;EACA,WAAW;EACZ;;AAGH,SAAS,sBAAsB,SAA+B;AAC5D,MAAK,MAAM,MAAM,gBACf,KAAI;AACF,KAAG,QAAQ;UACJ,KAAK;AACZ,MAAI,OAAO,YAAY,YACrB,SAAQ,MAAM,2CAA2C,IAAI;;;AAMrE,eAAe,qBAAqB,QAAmC;AACrE,uBAAsB,gBAAgB,OAAO,KAAK,CAAC;;AAKrD,SAAS,oBAAoB,QAA4B;AACvD,KAAI,OAAO,cAAc,OAAO,OAAO,eAAe,SACpD,QAAO,OAAO;AAGhB,QAAO,IAAI,KAAK,KAAK,KAAK,GAAG,OAAO,IAAK,CAAC,aAAa;;AAGzD,eAAe,kBACb,QACA,QACe;AACf,OAAM,OAAO,SAAS,WAAW;EAC/B,WAAW,OAAO,KAAK;EACvB,cAAc,OAAO;EACrB,cAAc,OAAO;EACrB,WAAW,oBAAoB,OAAO;EACvC,CAAC;;AAOJ,eAAe,SACb,QACA,MACA,MACqB;CAErB,MAAM,UADM,MAAM,OAAO,KAAK,KAAmB,MAAM,KAAK,EACzC;AACnB,OAAM,kBAAkB,QAAQ,OAAO;AACvC,OAAM,qBAAqB,OAAO;AAClC,QAAO;;AAKT,SAAS,aAAa,OAAqB;CACzC,MAAM,UAAU,MAAM,MAAM;AAC5B,KAAI,YAAY,GACd,OAAM,IAAI,aACR,oBACA,0BACD;AACH,KAAI,CAAC,QAAQ,SAAS,IAAI,IAAI,CAAC,QAAQ,SAAS,IAAI,CAClD,OAAM,IAAI,aACR,oBACA,UAAU,MAAM,gCACjB;;AAEL,SAAS,gBAAgB,UAAwB;AAC/C,KAAI,SAAS,SAAS,EACpB,OAAM,IAAI,aACR,oBACA,yCACD;;AAKL,MAAM,IAAI;CACR,eAAe;CACf,gBAAgB;CAChB,iBAAiB;CACjB,YAAY;CACZ,aAAa;CACb,YAAY;CACZ,QAAQ;CACR,QAAQ;CACR,aAAa;CACb,SAAS;CACT,gBAAgB;CAChB,eAAe;CACf,MAAM;CACN,cAAc;CACd,gBAAgB;CAChB,YAAY;CACZ,eAAe;CACf,iBAAiB;CACjB,cAAc;CACd,aAAa;CACb,QAAQ;CACR,OAAO;CACP,cAAc;CACd,YAAY;CACZ,SAAS;CACT,YAAY;CACZ,WAAW;CACX,cAAc;CACd,QAAQ;CACR,IAAI;CACJ,SAAS;CACT,OAAO;CACP,SAAS;CACT,QAAQ;CACR,WAAW;CACX,YAAY;CACZ,SAAS;CACT,OAAO;CACP,WAAW;CACX,SAAS;CACT,WAAW;CACX,YAAY;CACb;AAED,SAAS,kBAAkB,GAAmB;AAC5C,QAAO,mBAAmB,EAAE;;;;;AAQ9B,MAAa,OAAO;CAClB,WAAW,OAAO,WAAsC;AACtD,MAAI,CAAC,OAAO,aAAa,OAAO,UAAU,MAAM,KAAK,GACnD,OAAM,IAAI,MAAM,wCAAwC;AAE1D,MAAI,CAAC,OAAO,aAAa,OAAO,UAAU,MAAM,KAAK,GACnD,OAAM,IAAI,MAAM,wCAAwC;EAE1D,MAAM,cAAc,IAAI,wBACtB,OAAO,iBAAiB,OACzB;AACD,QAAM,YAAY,SAAS;EAC3B,MAAM,WAAW,MAAM,cAAc,OAAO,YAAY;EAExD,MAAM,WAAW,OAAO,UAAU,kBAAkB,QAAQ,QAAQ,GAAG;EAEvE,MAAM,mBAAmB,YAAY,YAAY,GAD1B,qBAAqB;AAS5C,UAAQ;GAAE,MAPG,IAAI,eAAe;IAC9B,QAAQ,OAAO;IACf;IACA,aAAa;IACb;IACA;IACD,CAAC;GACc;GAAU,OAAO,OAAO,SAAS;GAAO,WAAW,OAAO;GAAW;;CASvF,cAAoB;AAClB,UAAQ;AACR,kBAAgB,OAAO;;CAGzB,IAAI,cAAsB;AACxB,SAAO,UAAU,CAAC,SAAS,gBAAgB;;CAE7C,IAAI,YAAgC;AAClC,SAAO,UAAU,CAAC,SAAS,cAAc,IAAI;;CAE/C,IAAI,kBAA2B;AAC7B,SAAO,UAAU,CAAC,SAAS,iBAAiB;;CAE9C,IAAI,YAAoB;AACtB,SAAO,UAAU,CAAC;;CAEpB,WAAW,YAA2B;AACpC,YAAU,CAAC,QAAQ;;CAGrB,QAAQ,EACN,OAAO,OACL,OACA,eACkB;EAClB,MAAM,IAAI,UAAU;AAGpB,QAAM,EAAE,KAAK,KAAK,EAAE,QAAQ;GAC1B,MAAM;GACN,YAAY,cAAc;GAC1B,cAAc,EAAE,SAAS,gBAAgB;GACzC,4BAAW,IAAI,MAAM,EAAC,aAAa;GACpC,CAAC;IAEL;CAED,MAAM;EACJ,mBAAmB,YAAiC;GAClD,MAAM,IAAI,UAAU;AAIpB,UAAO,SAAS,GAAG,EAAE,eAAe,EAClC,cAAc,EAAE,SAAS,gBAAgB,EAC1C,CAAC;;EAEJ,iBAAiB,OACf,OACA,aACwB;AACxB,gBAAa,MAAM;AACnB,OAAI,aAAa,GACf,OAAM,IAAI,aACR,oBACA,6BACD;AACH,UAAO,SAAS,UAAU,EAAE,EAAE,gBAAgB;IAAE;IAAO;IAAU,CAAC;;EAEpE,iBAAiB,OACf,OACA,aACwB;AACxB,gBAAa,MAAM;AACnB,mBAAgB,SAAS;AACzB,UAAO,SAAS,UAAU,EAAE,EAAE,iBAAiB;IAAE;IAAO;IAAU,CAAC;;EAErE,kBAAkB,OAChB,UACA,YACwB;AACxB,OAAI,QAAQ,MAAM,KAAK,GACrB,OAAM,IAAI,aACR,oBACA,6BACD;AACH,UAAO,SAAS,UAAU,EAAE,EAAE,YAAY;IACxC;IACA,UAAU;IACX,CAAC;;EAEJ,SAAS,OAAO,oBAAoB,UAAyB;GAC3D,MAAM,IAAI,UAAU;AACpB,OAAI,EAAE,SAAS,iBAAiB,CAC9B,KAAI;AACF,UAAM,EAAE,KAAK,KAAK,EAAE,YAAY,EAAE,CAAC;YAC5B,KAAK;AAGZ,QAAI,OAAO,YAAY,YACrB,SAAQ,KAAK,qCAAqC,IAAI;;AAI5D,SAAM,EAAE,SAAS,aAAa,kBAAkB;AAChD,yBAAsB,KAAK;;EAE7B,SAAS,YAAiC;GACxC,MAAM,IAAI,UAAU;GACpB,MAAM,eAAe,EAAE,SAAS,iBAAiB;AACjD,OAAI,CAAC,aACH,OAAM,IAAI,aACR,gBACA,kDACD;AACH,UAAO,SAAS,GAAG,EAAE,aAAa,EAAE,eAAe,cAAc,CAAC;;EAEpE,IAAI,YAA2B;GAC7B,MAAM,IAAI,UAAU;AACpB,OAAI,CAAC,EAAE,SAAS,iBAAiB,CAC/B,OAAM,IAAI,aACR,gBACA,yCACD;AAEH,WADY,MAAM,EAAE,KAAK,IAAoB,EAAE,OAAO,EAC3C;;EAGb,YAAY,YAAqC;GAC/C,MAAM,IAAI,UAAU;AACpB,OAAI,CAAC,EAAE,SAAS,iBAAiB,CAAE,QAAO;AAE1C,UAAO,iBADK,MAAM,EAAE,KAAK,IAAoB,EAAE,OAAO,EAC3B,KAAK;;EAGlC,gBAAgB,YAA6B;AAC3C,UAAO,UAAU,CAAC,SAAS,gBAAgB;;EAG7C,oBACE,OACiB;AACjB,mBAAgB,IAAI,GAAG;AACvB,gBAAa;AACX,oBAAgB,OAAO,GAAG;;;EAG/B;CAED,aAAa;EACX,MAAM,OACJ,MACA,UAAuB,EAAE,KACI;AAI7B,UAHU,UAAU,CAGX,KAAK,KACZ,GAAG,EAAE,YAAY,GAAG,kBAAkB,KAAK,CAAC,QAC5C,QACD;;EAEH,SAAS,OAAoB,MAAc,OAA2B;AAKpE,WAHY,MADF,UAAU,CACA,KAAK,IACvB,GAAG,EAAE,YAAY,GAAG,kBAAkB,KAAK,CAAC,GAAG,kBAAkB,GAAG,GACrE,EACU;;EAEb,QAAQ,OACN,MACA,QACe;AAMf,WAJY,MADF,UAAU,CACA,KAAK,KACvB,GAAG,EAAE,YAAY,GAAG,kBAAkB,KAAK,IAC3C,IACD,EACU;;EAEb,QAAQ,OACN,MACA,IACA,QACe;AAMf,WAJY,MADF,UAAU,CACA,KAAK,MACvB,GAAG,EAAE,YAAY,GAAG,kBAAkB,KAAK,CAAC,GAAG,kBAAkB,GAAG,IACpE,EAAE,KAAK,CACR,EACU;;EAEb,QAAQ,OACN,MACA,OAC4C;AAO5C,UALe,MADL,UAAU,CACG,KAAK,OAC1B,GAAG,EAAE,YAAY,GAAG,kBAAkB,KAAK,CAAC,GAAG,kBAAkB,GAAG,GACrE,IAGgB,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE;;EAE9C,OAAO;GACL,KAAK,QAAgB,WAAgC;IACnD;IACA,IAAI;IACJ;IACD;GACD,KAAK,QAAgB,WAAgC;IACnD;IACA,IAAI;IACJ;IACD;GACD,KAAK,QAAgB,WAAgC;IACnD;IACA,IAAI;IACJ;IACD;GACD,MAAM,QAAgB,WAAgC;IACpD;IACA,IAAI;IACJ;IACD;GACD,KAAK,QAAgB,WAAgC;IACnD;IACA,IAAI;IACJ;IACD;GACD,MAAM,QAAgB,WAAgC;IACpD;IACA,IAAI;IACJ;IACD;GACD,KAAK,QAAgB,YAAmC;IACtD;IACA,IAAI;IACJ,OAAO;IACR;GACD,QAAQ,QAAgB,YAAmC;IACzD;IACA,IAAI;IACJ,OAAO;IACR;GACD,OAAO,QAAgB,aAA6B;IAClD;IACA,IAAI;IACJ,OAAO;IACR;GACD,QAAQ,QAAgB,aAA6B;IACnD;IACA,IAAI;IACJ,OAAO;IACR;GACD,SAAS,YAA4B;IAAE;IAAQ,IAAI;IAAW;GAC9D,YAAY,YAA4B;IAAE;IAAQ,IAAI;IAAe;GACrE,MAAM,GAAG,aAA+B,EAAE,KAAK,SAAS;GACxD,KAAK,GAAG,aAA+B,EAAE,IAAI,SAAS;GACtD,MAAM,YAA4B,EAAE,KAAK,QAAQ;GAClD;EACF;CAED,SAAS;EACP,SAAS,OAAO,WAMY;AAS1B,WAPY,MADF,UAAU,CACA,KAAK,KAA4B,EAAE,gBAAgB;IACrE,QAAQ,OAAO;IACf,UAAU,OAAO;IACjB,WAAW,OAAO;IAClB,YAAY,OAAO;IACnB,gBAAgB,OAAO;IACxB,CAAC,EACS;;EAEb,QAAQ,OAAO,UAAkB,YAAyC;AAMxE,WAJY,MADF,UAAU,CACA,KAAK,KAA2B,EAAE,eAAe;IACnE,WAAW;IACX,UAAU;IACX,CAAC,EACS;;EAEd;CAED,MAAM;EACJ,UAAU,OACR,OACA,UACA,aACuB;AAOvB,WALY,MADF,UAAU,CACA,KAAK,KAA0B,EAAE,cAAc;IACjE;IACA;IACA,WAAW;IACZ,CAAC,EACS;;EAEb,YAAY,OAAO,UAAiC;AAClD,SAAM,UAAU,CAAC,KAAK,KAAK,EAAE,gBAAgB,EAAE,OAAO,CAAC;;EAEzD,WAAW,YAAkC;AAI3C,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,EAAE,WACH,EACU;;EAEb,WAAW,OAAO,UAAiC;AACjD,SAAM,UAAU,CAAC,KAAK,KAAK,EAAE,eAAe,EAAE,OAAO,CAAC;;EAExD,aAAa,OAAO,UAAiC;AACnD,SAAM,UAAU,CAAC,KAAK,KAAK,EAAE,iBAAiB,EAAE,OAAO,CAAC;;EAE3D;CAED,cAAc;EACZ,MAAM,YAAwC;AAI5C,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,EAAE,aACH,EACU;;EAEb,KAAK,OAAO,SAAmC;AAK7C,WAJY,MAAM,UAAU,CAAC,KAAK,IAChC,EAAE,cACF,EAAE,aAAa,QAAQ,CACxB,EACU,KAAK,MAAM,MAAM,EAAE,SAAS,QAAQ,EAAE,UAAU;;EAE9D;CAED,IAAI,EACF,WAAW,EACT,UAAU,EACR,QAAQ,OACN,YAC+B;AAK/B,UAJY,MAAM,UAAU,CAAC,KAAK,KAChC,EAAE,aACF,QACD,EACU;IAEd,EACF,EACF;CAED,QAAQ,EACN,OAAO,YAAmC;EACxC,MAAM,IAAI,UAAU;EAGpB,MAAM,MAAM,EAAE,KAAK,IAAI,EAAE,OAAO;EAChC,MAAM,UAAU,EAAE,KAAK,cAAc;EACrC,IAAIC;AACJ,MAAI;AACF,cAAW,OAAO,WAAW,SAAS,OAAO,KAAK;IAChD,QAAQ;IACR;IACD,CAAC;WACK,KAAK;AACZ,SAAM,IAAI,aACR,iBACA,kBAAkB,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,IAClE,IACD;;EAEH,MAAM,OAAO,MAAM,SAAS,MAAM;AAClC,MAAI,CAAC,SAAS,IAAI;GAChB,MAAM,KAAK,SAAS,QAAQ,IAAI,eAAe,IAAI;AACnD,SAAM,aAAa,UAAU,MAAM,GAAG,SAAS,mBAAmB,CAAC;;EAErE,IAAIC,SAA6C,EAAE;AACnD,MAAI,KACF,KAAI;AACF,YAAS,KAAK,MAAM,KAAK;UACnB;AACN,YAAS,EAAE;;EAGf,MAAM,OAAO,SAAS,QAAQ,IAAI,OAAO;EAGzC,IAAIC,UAAyB;AAC7B,MAAI,MAAM;GACR,MAAM,UAAU,KAAK,QAAQ,UAAU,GAAG;GAC1C,MAAM,IAAI,QAAQ,MAAM,UAAU;AAClC,aAAU,IAAK,EAAE,MAAM,OAAQ,WAAW;;AAE5C,SAAO;GACL;GACA,QAAQ,OAAO,QAAQ,EAAE;GAC1B;IAEJ;CAED,OAAO,EACL,OAAO,YAAuC;AAE5C,UADY,MAAM,UAAU,CAAC,KAAK,IAAgC,EAAE,MAAM,EAC/D;IAEd;CAID,cAAc;EACZ,QAAQ,YAAoC;AAI1C,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,EAAE,aACH,EACU;;EAEb,aAAa,YAA4C;AAIvD,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,aAAa,WACnB,EACU;;EAEd;CAED,YAAY;EACV,WAAW,YAAkC;AAI3C,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,WAAW,SACjB,EACU;;EAEb,KAAK,OAAO,OAAmC;AAI7C,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,WAAW,GAAG,kBAAkB,GAAG,GACzC,EACU;;EAEb,aAAa,OAAO,OAA2C;AAI7D,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,WAAW,GAAG,kBAAkB,GAAG,CAAC,WAC1C,EACU;;EAEb,OAAO,OAAO,OAA2C;AAKvD,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,GAAG,EAAE,WAAW,GAAG,kBAAkB,GAAG,CAAC,SACzC,EAAE,CACH,EACU;;EAEd;CAED,YAAY;EACV,YAAY,YAAwC;AAIlD,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,EAAE,WACH,EACU;;EAEb,iBAAiB,OACf,gBACmC;AAOnC,WAJY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,WAAW,gBAChB,EAAE,eAAe,aAAa,CAC/B,EACU;;EAEd;CAED,WAAW;EACT,UAAU,YAAsC;AAI9C,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,EAAE,UACH,EACU;;EAEb,SAAS,OAAO,OAAuC;AAIrD,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,UAAU,GAAG,kBAAkB,GAAG,GACxC,EACU;;EAEb,UAAU,OAAO,YAAqD;AAKpE,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,GAAG,EAAE,UAAU,YACf,QACD,EACU;;EAEb,SAAS,OAAO,YAAoD;GAIlE,MAAM,EAAE,QAAS,GAAG,SAAS;AAK7B,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,GAAG,EAAE,UAAU,GAAG,kBAAkB,QAAQ,CAAC,WAC7C,KACD,EACU;;EAEd;CAED,cAAc;EACZ,KAAK,OAAO,QAAsC;AAIhD,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,aAAa,GAAG,kBAAkB,IAAI,GAC5C,EACU;;EAEb,YAAY,OACV,KACA,UACgC;AAKhC,WAJY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,aAAa,GAAG,kBAAkB,IAAI,CAAC,WAC5C,UAAU,SAAY,EAAE,OAAO,GAAG,OACnC,EACU;;EAEb,WAAW,OAAO,QAA2C;AAI3D,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,aAAa,GAAG,kBAAkB,IAAI,CAAC,KAC7C,EACU;;EAEd;CAED,QAAQ;EACN,MAAM,YAA8B;AAElC,WADY,MAAM,UAAU,CAAC,KAAK,IAAuB,EAAE,OAAO,EACvD;;EAEb,oBAAoB,OAClB,aAC8B;AAI9B,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,OAAO,GAAG,kBAAkB,SAAS,CAAC,UAC5C,EACU;;EAEb,UAAU,OACR,UACA,kBACA,YAC4B;AAW5B,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,GAAG,EAAE,OAAO,GAAG,kBAAkB,SAAS,CAAC,YAC3C;IAAE,oBAAoB;IAAkB,SAAS,WAAW,EAAE;IAAE,CACjE,EACU;;EAEd;CAED,IAAI;EACF,YAAY,YAAgC;AAE1C,WADY,MAAM,UAAU,CAAC,KAAK,IAAyB,EAAE,GAAG,EACrD;;EAEb,YAAY,OAAO,UAA6C;AAK9D,WAJY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,GAAG,WACR,UAAU,SAAY,EAAE,OAAO,GAAG,OACnC,EACU;;EAEb,OAAO,OAAO,aAA6C;AAKzD,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,GAAG,EAAE,GAAG,SACR,EAAE,WAAW,UAAU,CACxB,EACU;;EAEd;CAED,SAAS;EACP,QAAQ,YAA+B;AAErC,WADY,MAAM,UAAU,CAAC,KAAK,IAAwB,EAAE,QAAQ,EACzD;;EAEb,SAAS,OAAO,cAAuC;AAKrD,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,GAAG,EAAE,QAAQ,GAAG,kBAAkB,UAAU,CAAC,WAC7C,EAAE,CACH,EACU;;EAEd;CAID,OAAO,EACL,aAAa,OACX,MACA,WAC0B;EAC1B,MAAM,IAAI,QAAQ;AAClB,SAAO,UAAU,CAAC,KAAK,IACrB,GAAG,EAAE,MAAM,GAAG,kBAAkB,EAAE,IAClC,SAAS,EAAE,QAAQ,GAAG,OACvB;IAEJ;CAED,SAAS;EACP,SAAS,YAAmC;AAI1C,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,EAAE,QACH,EACU;;EAEb,YAAY,YAAmC;AAK7C,WAJY,MAAM,UAAU,CAAC,KAAK,IAChC,EAAE,SACF,EAAE,OAAO,YAAY,CACtB,EACU;;EAEb,WAAW,OAAO,WAAwC;AAKxD,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,GAAG,EAAE,QAAQ,SACb,EAAE,SAAS,QAAQ,CACpB,EACU;;EAEb,aAAa,OAAO,WAAkC;AACpD,SAAM,UAAU,CAAC,KAAK,KAAK,GAAG,EAAE,QAAQ,WAAW,EAAE,SAAS,QAAQ,CAAC;;EAEzE,aAAa,OAAO,iBAAwC;AAC1D,SAAM,UAAU,CAAC,KAAK,OACpB,GAAG,EAAE,QAAQ,GAAG,kBAAkB,aAAa,GAChD;;EAEJ;CAED,QAAQ;EACN,QAAQ,OAAO,WAAwC;AAErD,WADY,MAAM,UAAU,CAAC,KAAK,KAAsB,EAAE,QAAQ,OAAO,EAC9D;;EAEb,KAAK,OAAO,OAA+B;AAIzC,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,OAAO,GAAG,kBAAkB,GAAG,GACrC,EACU;;EAEb,QAAQ,OAAO,IAAY,UAAuC;AAKhE,WAJY,MAAM,UAAU,CAAC,KAAK,MAChC,GAAG,EAAE,OAAO,GAAG,kBAAkB,GAAG,IACpC,MACD,EACU;;EAEb,QAAQ,OAAO,OAA8B;AAC3C,SAAM,UAAU,CAAC,KAAK,OAAO,GAAG,EAAE,OAAO,GAAG,kBAAkB,GAAG,GAAG;;EAEtE,YAAY,OAAO,OAAuC;AAIxD,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,OAAO,GAAG,kBAAkB,GAAG,CAAC,UACtC,EACU;;EAEb,MAAM,OAAO,OAAqC;AAKhD,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,GAAG,EAAE,OAAO,GAAG,kBAAkB,GAAG,CAAC,QACrC,EAAE,CACH,EACU;;EAEb,OAAO,OAAO,OAA8B;AAC1C,SAAM,UAAU,CAAC,KAAK,KACpB,GAAG,EAAE,OAAO,GAAG,kBAAkB,GAAG,CAAC,SACrC,EAAE,CACH;;EAEH,QAAQ,OAAO,IAAY,WAAyC;AAKlE,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,GAAG,EAAE,OAAO,GAAG,kBAAkB,GAAG,CAAC,UACrC,EAAE,SAAS,QAAQ,CACpB,EACU;;EAEd;CAQD,WAAW;EAMT,oBAAoB,OAClB,YAC0B;AAK1B,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,GAAG,EAAE,UAAU,iBACf,QACD,EACU;;EAEb,kBAAkB,YAAqC;AAIrD,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,UAAU,gBAChB,EACU;;EAGb,mBAAmB,YAAqC;AAItD,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,UAAU,gBAChB,EACU;;EAEb,aAAa,OACX,gBACA,YACqB;AAKrB,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,GAAG,EAAE,UAAU,iBAAiB,kBAAkB,eAAe,CAAC,YAClE,QACD,EACU;;EAEb,cAAc,OACZ,gBACA,SACuB;GACvB,MAAMC,QAA4C,EAAE;AACpD,OAAI,MAAM,UAAU,OAAW,OAAM,QAAQ,KAAK;AAClD,OAAI,MAAM,WAAW,OAAW,OAAM,SAAS,KAAK;AAKpD,WAJY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,UAAU,iBAAiB,kBAAkB,eAAe,CAAC,YAClE,OAAO,KAAK,MAAM,CAAC,SAAS,IAAI,QAAQ,OACzC,EACU;;EAEb,UAAU,OAAO,mBAAoD;AAKnE,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,GAAG,EAAE,UAAU,iBAAiB,kBAAkB,eAAe,CAAC,QAClE,EAAE,CACH,EACU;;EAEd;CAED,YAAY;EACV,YAAY,OAAO,YAA4C;AAK7D,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,GAAG,EAAE,WAAW,iBAChB,QACD,EACU;;EAEb,eAAe,OAAO,YAA4C;AAKhE,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,GAAG,EAAE,WAAW,mBAChB,QACD,EACU;;EAEb,iBAAiB,OAAO,OAAgC;AAItD,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,WAAW,WAAW,kBAAkB,GAAG,GACjD,EACU;;EAEd;CAED,SAAS;EACP,MAAM,OACJ,YACA,aACsB;AAKtB,WAJY,MAAM,UAAU,CAAC,KAAK,IAAwB,EAAE,SAAS;IACnE,aAAa;IACb,WAAW;IACZ,CAAC,EACS;;EAEb,QAAQ,OAAO,WAA0C;AAEvD,WADY,MAAM,UAAU,CAAC,KAAK,KAAuB,EAAE,SAAS,OAAO,EAChE;;EAEb,QAAQ,OAAO,IAAY,UAAyC;AAKlE,WAJY,MAAM,UAAU,CAAC,KAAK,MAChC,GAAG,EAAE,QAAQ,GAAG,kBAAkB,GAAG,IACrC,MACD,EACU;;EAEb,QAAQ,OAAO,OAA8B;AAC3C,SAAM,UAAU,CAAC,KAAK,OAAO,GAAG,EAAE,QAAQ,GAAG,kBAAkB,GAAG,GAAG;;EAExE;CAED,OAAO;EACL,YAAY,YAA6B;AAIvC,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,MAAM,KACZ,EACU;;EAEb,eAAe,OAAO,eAAyC;AAK7D,WAJY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,MAAM,SACX,EAAE,YAAY,CACf,EACU,KAAK,YAAY;;EAE/B;CAED,WAAW;EACT,iBAAiB,YAAmC;AAKlD,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,UAAU,UAChB,EACU;;EAEb,eAAe,OAAO,SAAyC;AAK7D,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,GAAG,EAAE,UAAU,SACf,EAAE,MAAM,CACT,EACU;;EAEb,QAAQ,OACN,MACA,YAC0B;GAC1B,MAAMC,OAAgC,EAAE;AACxC,OAAI,SAAS,OAAW,MAAK,OAAO;AACpC,OAAI,YAAY,OAAW,MAAK,WAAW;AAK3C,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,EAAE,WACF,KACD,EACU;;EAEd;CAID,SAAS,EACP,MAAM,YAAoC;AAIxC,UAHY,MAAM,UAAU,CAAC,KAAK,IAChC,EAAE,QACH,EACU;IAEd;CAED,SAAS;EACP,UAAU,OACR,UAAkB,cACc;AAIhC,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,QAAQ,SAAS,kBAAkB,QAAQ,GACjD,EACU,QAAQ;;EAErB,YAAY,OACV,UAAkB,WAClB,YAC2B;AAQ3B,WAPY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,QAAQ,WAAW,kBAAkB,QAAQ,IAClD;IACE,OAAO,SAAS;IAChB,QAAQ,SAAS;IAClB,CACF,EACU;;EAEb,SAAS,OAAO,OAAqC;AAInD,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,QAAQ,GAAG,kBAAkB,GAAG,GACtC,EACU;;EAEb,YAAY,OAAO,IAAY,WAA0C;AAKvE,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,GAAG,EAAE,QAAQ,GAAG,kBAAkB,GAAG,CAAC,SACtC,OACD,EACU;;EAEb,YAAY,OACV,SACA,SACyB;AAKzB,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,GAAG,EAAE,QAAQ,GAAG,kBAAkB,QAAQ,IAC1C,KACD,EACU;;EAEd;CAED,WAAW;EACT,KAAK,OAAO,cAAyC;AAKnD,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,GAAG,EAAE,UAAU,WAAW,kBAAkB,UAAU,GACvD,EACU;;EAEb,QAAQ,OAAO,WAA8C;AAK3D,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,EAAE,WACF,OACD,EACU;;EAEd;CAED,YAAY;EACV,WAAW,YAAuC;AAIhD,WAHY,MAAM,UAAU,CAAC,KAAK,IAChC,EAAE,WACH,EACU;;EAEb,UAAU,OAAO,YAAgD;AAK/D,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,GAAG,EAAE,WAAW,QAChB,QACD,EACU;;EAEb,UAAU,YAAuC;AAK/C,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,GAAG,EAAE,WAAW,QAChB,EAAE,CACH,EACU;;EAEb,UAAU,YAAuC;AAK/C,WAJY,MAAM,UAAU,CAAC,KAAK,KAChC,GAAG,EAAE,WAAW,YAChB,EAAE,CACH,EACU;;EAEd;CAQD,KAAK,EASH,cAAc,YAA0C;AAMtD,UAJY,MADF,UAAU,CACA,KAAK,KACvB,gCACA,EAAE,CACH,EACU;IAEd;CACF"}
|
package/dist/index.d.cts
CHANGED
|
@@ -162,7 +162,8 @@ interface Achievement {
|
|
|
162
162
|
name: string;
|
|
163
163
|
description?: string | null;
|
|
164
164
|
icon_url?: string | null;
|
|
165
|
-
|
|
165
|
+
/** XP granted to the user on unlock. Mirrors the wire field `xp_reward`. */
|
|
166
|
+
xp_reward: number;
|
|
166
167
|
criteria: unknown;
|
|
167
168
|
}
|
|
168
169
|
interface AchievementProgress {
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/error.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/error.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -162,7 +162,8 @@ interface Achievement {
|
|
|
162
162
|
name: string;
|
|
163
163
|
description?: string | null;
|
|
164
164
|
icon_url?: string | null;
|
|
165
|
-
|
|
165
|
+
/** XP granted to the user on unlock. Mirrors the wire field `xp_reward`. */
|
|
166
|
+
xp_reward: number;
|
|
166
167
|
criteria: unknown;
|
|
167
168
|
}
|
|
168
169
|
interface AchievementProgress {
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/error.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/error.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -417,7 +417,7 @@ const P = {
|
|
|
417
417
|
roles: "/v1/client/roles",
|
|
418
418
|
referrals: "/v1/client/referrals",
|
|
419
419
|
content: "/v1/client/content",
|
|
420
|
-
deepLinks: "/v1/client/
|
|
420
|
+
deepLinks: "/v1/client/deep-links",
|
|
421
421
|
onboarding: "/v1/client/onboarding"
|
|
422
422
|
};
|
|
423
423
|
function encodePathSegment(s) {
|
|
@@ -735,7 +735,7 @@ const Amba = {
|
|
|
735
735
|
return (await getState().http.get(P.currencies)).data;
|
|
736
736
|
},
|
|
737
737
|
getTransactions: async (currencyKey) => {
|
|
738
|
-
return (await getState().http.get(`${P.currencies}
|
|
738
|
+
return (await getState().http.get(`${P.currencies}/transactions`, { currency_code: currencyKey })).data;
|
|
739
739
|
}
|
|
740
740
|
},
|
|
741
741
|
inventory: {
|
|
@@ -749,7 +749,8 @@ const Amba = {
|
|
|
749
749
|
return (await getState().http.post(`${P.inventory}/purchase`, request)).data;
|
|
750
750
|
},
|
|
751
751
|
consume: async (request) => {
|
|
752
|
-
|
|
752
|
+
const { item_id,...body } = request;
|
|
753
|
+
return (await getState().http.post(`${P.inventory}/${encodePathSegment(item_id)}/consume`, body)).data;
|
|
753
754
|
}
|
|
754
755
|
},
|
|
755
756
|
leaderboards: {
|
|
@@ -773,7 +774,7 @@ const Amba = {
|
|
|
773
774
|
purchase: async (storeKey, purchaseOptionId, receipt) => {
|
|
774
775
|
return (await getState().http.post(`${P.stores}/${encodePathSegment(storeKey)}/purchase`, {
|
|
775
776
|
purchase_option_id: purchaseOptionId,
|
|
776
|
-
receipt
|
|
777
|
+
receipt: receipt ?? {}
|
|
777
778
|
})).data;
|
|
778
779
|
}
|
|
779
780
|
},
|
|
@@ -904,7 +905,7 @@ const Amba = {
|
|
|
904
905
|
},
|
|
905
906
|
referrals: {
|
|
906
907
|
getReferralCode: async () => {
|
|
907
|
-
return (await getState().http.get(`${P.referrals}/
|
|
908
|
+
return (await getState().http.get(`${P.referrals}/my-code`)).data;
|
|
908
909
|
},
|
|
909
910
|
claimReferral: async (code) => {
|
|
910
911
|
return (await getState().http.post(`${P.referrals}/claim`, { code })).data;
|
|
@@ -941,7 +942,7 @@ const Amba = {
|
|
|
941
942
|
},
|
|
942
943
|
deepLinks: {
|
|
943
944
|
get: async (shortCode) => {
|
|
944
|
-
return (await getState().http.get(`${P.deepLinks}/${encodePathSegment(shortCode)}`)).data;
|
|
945
|
+
return (await getState().http.get(`${P.deepLinks}/resolve/${encodePathSegment(shortCode)}`)).data;
|
|
945
946
|
},
|
|
946
947
|
create: async (params) => {
|
|
947
948
|
return (await getState().http.post(P.deepLinks, params)).data;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["cachedStorage: AsyncStorageStatic | null","prefix: string","parts: string[]","h: Record<string, string>","init: RequestInit","response: Response","parsed: unknown","code: string | undefined","envelopeDetails: unknown","details: unknown","persistence: AsyncStoragePersistence","seed: PersistedIdentity","payload: PersistedIdentity","state: RuntimeState | null","response: Response","parsed: { data?: Record<string, unknown> }","version: string | null","query: Record<string, number | undefined>","body: Record<string, unknown>"],"sources":["../src/async-storage-adapter.ts","../src/error.ts","../src/http-client.ts","../src/uuid.ts","../src/identity.ts","../src/index.ts"],"sourcesContent":["/**\n * AsyncStorage-backed identity persistence for React Native.\n *\n * Bridges `@react-native-async-storage/async-storage` (peer-dep, installed\n * by the host app) to the SDK runtime. Reads/writes go through a\n * per-prefix namespace so different amba projects can coexist in the\n * same app.\n *\n * Identity records stored under `${prefix}:identity` survive app restarts.\n */\n\n// Late-imported to avoid bundling the peer-dep — host app installs it.\ntype AsyncStorageStatic = {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\nlet cachedStorage: AsyncStorageStatic | null = null;\n\nasync function getStorage(): Promise<AsyncStorageStatic | null> {\n if (cachedStorage !== null) return cachedStorage;\n try {\n const mod = await import(\"@react-native-async-storage/async-storage\");\n cachedStorage = (mod.default ?? mod) as AsyncStorageStatic;\n return cachedStorage;\n } catch {\n // Host app didn't install the peer dep — fall back to in-memory.\n // amba will still work but identity won't survive app restart.\n return null;\n }\n}\n\nexport class AsyncStoragePersistence {\n private memoryCache = new Map<string, string>();\n\n constructor(private readonly prefix: string) {}\n\n async hydrate(): Promise<void> {\n // Future: when the SDK runtime gains a JS-side persistence bridge,\n // this will pre-load the identity record into memory so the runtime\n // can read it synchronously at init.\n }\n\n async read(key: string): Promise<string | null> {\n const fullKey = `${this.prefix}:${key}`;\n if (this.memoryCache.has(fullKey))\n return this.memoryCache.get(fullKey) ?? null;\n const storage = await getStorage();\n if (!storage) return null;\n const v = await storage.getItem(fullKey);\n if (v !== null) this.memoryCache.set(fullKey, v);\n return v;\n }\n\n async write(key: string, value: string): Promise<void> {\n const fullKey = `${this.prefix}:${key}`;\n this.memoryCache.set(fullKey, value);\n const storage = await getStorage();\n if (storage) await storage.setItem(fullKey, value);\n }\n\n async delete(key: string): Promise<void> {\n const fullKey = `${this.prefix}:${key}`;\n this.memoryCache.delete(fullKey);\n const storage = await getStorage();\n if (storage) await storage.removeItem(fullKey);\n }\n}\n","/**\n * Typed error class for the amba SDK + helper that converts arbitrary\n * thrown values (native Error, plain objects, runtime-emitted errors)\n * into a stable `AmbaApiError` instance.\n *\n * Callers can `instanceof`-narrow safely, branch on `.code`, and pull\n * extra payload from `.details` (raw HTTP body, validation field paths,\n * etc.). The wrapper methods on `Amba` wrap every async call in\n * `toAmbaApiError`, so consumers see one error shape regardless of\n * which layer (network, runtime, validation) failed.\n */\n\n/**\n * Stable error codes surfaced by the SDK. Strings rather than an enum\n * so customers can extend with custom codes by simply throwing\n * `new AmbaApiError(\"MY_CODE\", \"...\")` without coordinating with this\n * package's TypeScript types.\n */\nexport type AmbaApiErrorCode =\n | \"UNAUTHORIZED\"\n | \"FORBIDDEN\"\n | \"NOT_FOUND\"\n | \"CONFLICT\"\n | \"RATE_LIMITED\"\n | \"VALIDATION_ERROR\"\n | \"NETWORK_ERROR\"\n | \"HTTP_ERROR\"\n | \"CIRCUIT_OPEN\"\n | \"CONSENT_NOT_GRANTED\"\n | \"NOT_INITIALIZED\"\n | \"INVALID_CONFIG\"\n | \"INVALID_ARGUMENT\"\n | \"PUSH_PERMISSION_DENIED\"\n | \"PUSH_REGISTRATION_FAILED\"\n | \"NOT_SANDBOX_TIER\"\n | \"UNKNOWN_ERROR\"\n | (string & {});\n\nexport class AmbaApiError extends Error {\n readonly code: AmbaApiErrorCode;\n readonly details?: unknown;\n constructor(\n code: AmbaApiErrorCode,\n message: string,\n details?: unknown,\n ) {\n super(message);\n this.name = \"AmbaApiError\";\n this.code = code;\n this.details = details;\n // Restore prototype chain when transpiled to ES5 targets — Error\n // subclasses lose their prototype otherwise and `instanceof` breaks.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Best-effort: pull a stable error code out of a Rust `AmbaError`\n * Display string. Used by `toAmbaApiError` when the underlying thrown\n * value is a generic `Error` produced by `wasm-bindgen`'s `JsError::new`.\n *\n * Keep in sync with `sdks/core/src/error.rs::AmbaError`'s `#[error]`\n * format strings — but the parser falls back to UNKNOWN_ERROR for any\n * pattern it doesn't recognize, so a stale match list isn't a footgun,\n * just a quality-of-life regression.\n */\nfunction codeFromMessage(message: string): AmbaApiErrorCode {\n // Cheapest checks first — most production errors are auth or HTTP.\n if (message.startsWith(\"Unauthorized\")) return \"UNAUTHORIZED\";\n if (message.startsWith(\"Forbidden\")) return \"FORBIDDEN\";\n if (message.startsWith(\"Not found\")) return \"NOT_FOUND\";\n if (message.startsWith(\"Conflict\")) return \"CONFLICT\";\n if (message.startsWith(\"Rate limited\")) return \"RATE_LIMITED\";\n if (message.startsWith(\"Validation error\")) return \"VALIDATION_ERROR\";\n if (message.startsWith(\"Network error\")) return \"NETWORK_ERROR\";\n if (message.startsWith(\"HTTP error\")) return \"HTTP_ERROR\";\n if (message.startsWith(\"Circuit breaker\")) return \"CIRCUIT_OPEN\";\n if (message.startsWith(\"Consent not granted\")) return \"CONSENT_NOT_GRANTED\";\n if (message.includes(\"not initialized\")) return \"NOT_INITIALIZED\";\n if (message.startsWith(\"Invalid configuration\")) return \"INVALID_CONFIG\";\n if (message.startsWith(\"Invalid argument\")) return \"INVALID_ARGUMENT\";\n return \"UNKNOWN_ERROR\";\n}\n\n/**\n * Coerce any thrown value into an `AmbaApiError`. Idempotent — passing\n * an existing `AmbaApiError` returns it unchanged so wrappers can stack\n * without re-wrapping.\n *\n * Heuristics:\n * 1. Existing `AmbaApiError` → returned as-is.\n * 2. Object with `.code` → use that code + `.message` + `.details`.\n * 3. `Error` (e.g. runtime-emitted error) → infer code from message prefix.\n * 4. Anything else → stringify and tag UNKNOWN_ERROR.\n */\nexport function toAmbaApiError(err: unknown): AmbaApiError {\n if (err instanceof AmbaApiError) return err;\n if (err && typeof err === \"object\") {\n const obj = err as { code?: unknown; message?: unknown; details?: unknown };\n if (typeof obj.code === \"string\") {\n return new AmbaApiError(\n obj.code,\n typeof obj.message === \"string\" ? obj.message : \"unknown\",\n obj.details,\n );\n }\n }\n if (err instanceof Error) {\n return new AmbaApiError(codeFromMessage(err.message), err.message);\n }\n return new AmbaApiError(\"UNKNOWN_ERROR\", String(err));\n}\n\n/**\n * Wrap a thunk so any thrown value becomes an `AmbaApiError`. The\n * wrapper methods on `Amba` use this to convert runtime-emitted errors\n * uniformly at the SDK boundary.\n */\nexport async function withAmbaError<T>(thunk: () => Promise<T>): Promise<T> {\n try {\n return await thunk();\n } catch (err) {\n throw toAmbaApiError(err);\n }\n}\n","/**\n * Pure-JS HTTP client for the amba API.\n *\n * Built on the platform `fetch` (React Native ships it; Hermes\n * provides it; Expo polyfills it where needed). No transitive\n * runtime deps. The previous implementation tunnelled every call\n * through a WASM core that did the same thing in Rust — moving the\n * logic to TS removes ~4 MB from the customer bundle and removes\n * a runtime that's foreign to Hermes.\n *\n * Responsibilities:\n * - Construct the request URL by joining `baseUrl + path` (with an\n * optional query string).\n * - Inject the standard amba auth headers — `X-Api-Key`,\n * `X-SDK-Platform`, `X-SDK-Version`, `Content-Type`, and\n * `Authorization: Bearer …` when a session token is present.\n * - Map non-2xx responses to typed `AmbaApiError` instances using\n * the same code set the WASM core used (UNAUTHORIZED, FORBIDDEN,\n * NOT_FOUND, CONFLICT, RATE_LIMITED, VALIDATION_ERROR, HTTP_ERROR,\n * NETWORK_ERROR).\n * - Parse JSON response bodies. 204 No Content returns `null`.\n */\n\nimport { AmbaApiError } from \"./error.js\";\nimport type { IdentityStore } from \"./identity.js\";\n\n/** Default amba API endpoint. */\nexport const DEFAULT_BASE_URL = \"https://api.amba.dev\";\n\n/**\n * Server response envelope. Most amba endpoints wrap their payload\n * in `{ data: ... }`. Helpers below let call sites declare whether\n * to return the envelope, the unwrapped `data` field, or the raw\n * body (e.g. `find` returns the whole envelope so consumers can\n * paginate via `next_cursor` / `has_more`).\n */\nexport interface Envelope<T> {\n data: T;\n next_cursor?: string | null;\n has_more?: boolean;\n}\n\nexport interface AmbaHttpClientOptions {\n apiKey: string;\n baseUrl: string;\n sdkPlatform: string;\n sdkVersionHeader: string;\n identity: IdentityStore;\n /** Override the `fetch` implementation — tests pass a vi.fn() shim. */\n fetchImpl?: typeof fetch;\n}\n\ntype Query = Record<string, string | number | boolean | undefined | null>;\n\nexport class AmbaHttpClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly sdkPlatform: string;\n private readonly sdkVersionHeader: string;\n private readonly identity: IdentityStore;\n private readonly fetchImpl: typeof fetch;\n\n constructor(opts: AmbaHttpClientOptions) {\n this.apiKey = opts.apiKey;\n this.baseUrl = opts.baseUrl.replace(/\\/+$/, \"\");\n this.sdkPlatform = opts.sdkPlatform;\n this.sdkVersionHeader = opts.sdkVersionHeader;\n this.identity = opts.identity;\n this.fetchImpl =\n opts.fetchImpl ??\n (globalThis.fetch.bind(globalThis) as typeof fetch);\n }\n\n /** Build the absolute URL for an API path, optionally with a query string. */\n url(path: string, query?: Query): string {\n const base = this.baseUrl + path;\n if (!query) return base;\n const parts: string[] = [];\n for (const k of Object.keys(query)) {\n const v = query[k];\n if (v === undefined || v === null) continue;\n parts.push(`${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`);\n }\n if (parts.length === 0) return base;\n return `${base}?${parts.join(\"&\")}`;\n }\n\n /** Build the standard request headers for the current identity state. */\n buildHeaders(extra?: Record<string, string>): Record<string, string> {\n const h: Record<string, string> = {\n \"X-Api-Key\": this.apiKey,\n \"X-SDK-Platform\": this.sdkPlatform,\n \"X-SDK-Version\": this.sdkVersionHeader,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...extra,\n };\n const tok = this.identity.getSessionToken();\n if (tok) h.Authorization = `Bearer ${tok}`;\n return h;\n }\n\n async get<T>(path: string, query?: Query): Promise<T> {\n return this.request<T>(\"GET\", path, undefined, query);\n }\n\n async post<T>(path: string, body?: unknown, query?: Query): Promise<T> {\n return this.request<T>(\"POST\", path, body, query);\n }\n\n async patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"PATCH\", path, body);\n }\n\n async delete<T>(path: string): Promise<T> {\n return this.request<T>(\"DELETE\", path);\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n query?: Query,\n ): Promise<T> {\n const url = this.url(path, query);\n const headers = this.buildHeaders();\n\n const init: RequestInit = {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body ?? {}),\n };\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, init);\n } catch (err) {\n // Transport-level failure (DNS, refused, offline, abort). The\n // platform fetch throws a TypeError or AbortError; we wrap it\n // into the SDK's stable error shape.\n const message =\n err instanceof Error\n ? err.message\n : typeof err === \"string\"\n ? err\n : \"fetch failed\";\n throw new AmbaApiError(\"NETWORK_ERROR\", `Network error: ${message}`, err);\n }\n\n return parseResponse<T>(response);\n }\n}\n\nasync function parseResponse<T>(response: Response): Promise<T> {\n // 204 No Content: most DELETE endpoints. Return null so generics\n // taking `unknown | null` decode cleanly.\n if (response.status === 204) {\n return null as T;\n }\n\n const text = await response.text();\n const ct = response.headers.get(\"content-type\") ?? \"\";\n const isJson = ct.includes(\"application/json\");\n\n if (!response.ok) {\n throw mapHttpError(response, text, isJson);\n }\n\n if (text === \"\") return null as T;\n if (isJson) {\n try {\n return JSON.parse(text) as T;\n } catch (err) {\n throw new AmbaApiError(\n \"HTTP_ERROR\",\n `Failed to parse JSON response: ${\n err instanceof Error ? err.message : String(err)\n }`,\n { body: text },\n );\n }\n }\n // Non-JSON success body (uncommon for this API). Return the raw text\n // string typed as the generic so the caller can decide.\n return text as unknown as T;\n}\n\nexport function mapHttpError(\n response: Response,\n rawBody: string,\n isJson: boolean,\n): AmbaApiError {\n let parsed: unknown = undefined;\n let message = rawBody || `HTTP ${response.status}`;\n let code: string | undefined;\n // `envelopeDetails` is the inner `error.details` field — surfaced as\n // `AmbaApiError.details` when the server emitted a typed envelope.\n // This matches the WASM-bridged web SDK, which carries the inner\n // details (e.g. `{ streak_key: 'weekly_login' }`) verbatim — NOT the\n // whole `{error:{...}}` wrapper. Customer code like\n // `e.details.streak_key` must work identically on both SDKs.\n // (Cursor BugBot PR #156, medium — cross-SDK details-shape divergence.)\n let envelopeDetails: unknown = undefined;\n let envelopeRecognized = false;\n if (isJson && rawBody) {\n try {\n parsed = JSON.parse(rawBody);\n } catch {\n parsed = undefined;\n }\n // Standard amba envelope: `{ error: { code, message, details } }`\n // and a few legacy `{ error: \"string\" }` shapes. We recognize the\n // envelope by the presence of a string `code` alone — message is\n // optional, matching the Rust `parse_error_envelope` rule so the\n // two SDKs agree on what \"envelope\" means. (Cursor BugBot PR #156.)\n const env = parsed as {\n error?: { code?: string; message?: string; details?: unknown };\n } | null;\n const innerErr = env?.error;\n if (innerErr && typeof innerErr === \"object\" && typeof innerErr.code === \"string\") {\n code = innerErr.code;\n envelopeRecognized = true;\n envelopeDetails = innerErr.details;\n if (typeof innerErr.message === \"string\") message = innerErr.message;\n }\n }\n\n // Use the inner envelope details when the server gave us a\n // recognizable envelope; fall back to the full parsed body\n // otherwise so legacy / proxy-shaped responses still carry\n // something the customer can inspect.\n const details: unknown = envelopeRecognized ? envelopeDetails : parsed;\n\n switch (response.status) {\n case 401:\n return new AmbaApiError(code ?? \"UNAUTHORIZED\", message, details);\n case 403:\n return new AmbaApiError(code ?? \"FORBIDDEN\", message, details);\n case 404:\n return new AmbaApiError(code ?? \"NOT_FOUND\", message, details);\n case 409:\n return new AmbaApiError(code ?? \"CONFLICT\", message, details);\n case 422:\n return new AmbaApiError(\n code ?? \"VALIDATION_ERROR\",\n message,\n details,\n );\n case 429: {\n const retryAfter = response.headers.get(\"retry-after\") ?? \"unspecified\";\n // Prefer the server's structured message if it gave us one; fall back\n // to a synthesized one that surfaces the Retry-After header so callers\n // can decide whether to back off vs surface to the user.\n const serverGaveMessage =\n message !== rawBody && message !== `HTTP ${response.status}`;\n return new AmbaApiError(\n code ?? \"RATE_LIMITED\",\n serverGaveMessage\n ? message\n : `Rate limited (retry after ${retryAfter})`,\n details,\n );\n }\n default:\n return new AmbaApiError(\n code ?? \"HTTP_ERROR\",\n message,\n envelopeRecognized\n ? envelopeDetails\n : (parsed ?? { status: response.status, body: rawBody }),\n );\n }\n}\n","/**\n * UUID v4 generator — pure JS, no dependencies.\n *\n * Why pure JS rather than `globalThis.crypto.randomUUID()`:\n * - Older Hermes builds (RN <0.74) don't ship `crypto` global.\n * - `expo-crypto` exposes `randomUUID()` but is a separate dep we\n * don't want to force on every consumer.\n * - The amba SDK only uses UUIDs for `anonymous_id` — a stable\n * per-install identifier. Cryptographic randomness is not a\n * security requirement here; uniqueness across installs is.\n *\n * If `globalThis.crypto?.getRandomValues` is available (it is on\n * Hermes 0.75+ via the engine and on every Expo runtime via\n * react-native-get-random-values that Expo auto-installs), we use it\n * for higher-quality randomness. Otherwise we fall back to\n * `Math.random()` — which is sufficient for the install-id use case\n * because per-device uniqueness is what we need, not collision\n * resistance across the global population.\n */\n\ntype GetRandomValues = (a: Uint8Array) => Uint8Array;\n\nfunction getRandomBytes(n: number): Uint8Array {\n const bytes = new Uint8Array(n);\n const grv = (globalThis as { crypto?: { getRandomValues?: GetRandomValues } })\n .crypto?.getRandomValues;\n if (typeof grv === \"function\") {\n // Bind to crypto to preserve `this`.\n (globalThis as { crypto: { getRandomValues: GetRandomValues } }).crypto.getRandomValues(\n bytes,\n );\n return bytes;\n }\n // Math.random fallback — not crypto-secure but good enough for\n // install-id uniqueness.\n for (let i = 0; i < n; i++) bytes[i] = Math.floor(Math.random() * 256);\n return bytes;\n}\n\n/**\n * Generate a UUID v4 (random) per RFC 4122. Wire shape:\n * `xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx` where `y ∈ {8,9,a,b}`.\n */\nexport function uuidv4(): string {\n const b = getRandomBytes(16);\n // Set version (4) and variant (10xx) bits.\n b[6] = (b[6]! & 0x0f) | 0x40;\n b[8] = (b[8]! & 0x3f) | 0x80;\n const h = Array.from(b, (v) => v.toString(16).padStart(2, \"0\"));\n return (\n h.slice(0, 4).join(\"\") +\n \"-\" +\n h.slice(4, 6).join(\"\") +\n \"-\" +\n h.slice(6, 8).join(\"\") +\n \"-\" +\n h.slice(8, 10).join(\"\") +\n \"-\" +\n h.slice(10, 16).join(\"\")\n );\n}\n","/**\n * Identity store — the minimal on-device state the SDK keeps between\n * launches: `anonymous_id` (stable per-install UUID), authenticated\n * user id, session token, refresh token, expiry.\n *\n * Persistence: writes go to `AsyncStoragePersistence` under\n * `<prefix>:identity_v1` (JSON-encoded). On `configure()` we hydrate\n * once; subsequent reads/writes are O(1) in-process.\n *\n * Why a small TS class instead of porting the Rust per-instance-key\n * machinery: the WASM core's race rationale (cross-core write race\n * with `amba_reset`) is specific to the FFI slot model — JS doesn't\n * have that hazard because there's one `Amba` singleton per module\n * graph. Keeping the persistence shape simple makes the AsyncStorage\n * cost predictable and the implementation auditable.\n */\n\nimport { AsyncStoragePersistence } from \"./async-storage-adapter.js\";\nimport { uuidv4 } from \"./uuid.js\";\n\n/** Storage key under the configured prefix. Bumped when shape changes. */\nconst IDENTITY_KEY = \"identity_v1\";\n\nexport interface IdentitySnapshot {\n anonymousId: string;\n appUserId: string | null;\n sessionToken: string | null;\n refreshToken: string | null;\n /** ISO-8601 expiry — null means \"no active session.\" */\n expiresAt: string | null;\n}\n\ninterface PersistedIdentity {\n anonymous_id: string;\n app_user_id: string | null;\n session_token: string | null;\n refresh_token: string | null;\n /** ISO-8601 string; null when not set. */\n expires_at: string | null;\n}\n\nfunction isExpired(expiresAt: string | null): boolean {\n if (!expiresAt) return false;\n const t = Date.parse(expiresAt);\n if (Number.isNaN(t)) return false;\n return t <= Date.now();\n}\n\n/**\n * The SDK's identity state — held in memory after hydration, persisted\n * to AsyncStorage on every mutation. All methods are sync after\n * `hydrate()` resolves.\n */\nexport class IdentityStore {\n private anonymousId: string;\n private appUserId: string | null = null;\n private sessionToken: string | null = null;\n private refreshToken: string | null = null;\n private expiresAt: string | null = null;\n\n private constructor(\n private readonly persistence: AsyncStoragePersistence,\n seed: PersistedIdentity,\n ) {\n this.anonymousId = seed.anonymous_id;\n this.appUserId = seed.app_user_id;\n this.sessionToken = seed.session_token;\n this.refreshToken = seed.refresh_token;\n this.expiresAt = seed.expires_at;\n }\n\n /**\n * Build a store, hydrating any prior identity from AsyncStorage.\n * If no prior identity exists, a fresh `anonymous_id` is minted.\n * Expired session tokens are dropped at hydration (the refresh token\n * survives so callers can `auth.refresh()` to mint a new pair).\n */\n static async create(\n persistence: AsyncStoragePersistence,\n ): Promise<IdentityStore> {\n const raw = await persistence.read(IDENTITY_KEY);\n let seed: PersistedIdentity;\n if (raw) {\n try {\n const parsed = JSON.parse(raw) as Partial<PersistedIdentity>;\n seed = {\n anonymous_id: parsed.anonymous_id ?? uuidv4(),\n app_user_id: parsed.app_user_id ?? null,\n session_token: parsed.session_token ?? null,\n refresh_token: parsed.refresh_token ?? null,\n expires_at: parsed.expires_at ?? null,\n };\n } catch {\n // Garbage on disk — start fresh. anonymous_id rotates which is\n // acceptable for a corrupt-state recovery (rare; users on\n // upgrade keep their id because the previous SDK wrote valid JSON).\n seed = freshSeed();\n }\n } else {\n seed = freshSeed();\n }\n\n if (isExpired(seed.expires_at)) {\n // Drop expired session_token but keep refresh_token so the caller\n // can mint a new pair.\n seed.session_token = null;\n seed.expires_at = null;\n }\n\n const store = new IdentityStore(persistence, seed);\n // Always persist after hydration — handles the first-run mint of\n // `anonymous_id` and clears any expired tokens from disk.\n await store.flush();\n return store;\n }\n\n snapshot(): IdentitySnapshot {\n return {\n anonymousId: this.anonymousId,\n appUserId: this.appUserId,\n sessionToken: this.sessionToken,\n refreshToken: this.refreshToken,\n expiresAt: this.expiresAt,\n };\n }\n\n getAnonymousId(): string {\n return this.anonymousId;\n }\n\n getAppUserId(): string | null {\n return this.appUserId;\n }\n\n getSessionToken(): string | null {\n return this.sessionToken;\n }\n\n getRefreshToken(): string | null {\n return this.refreshToken;\n }\n\n isAuthenticated(): boolean {\n return this.sessionToken !== null;\n }\n\n async setSession(args: {\n appUserId: string;\n sessionToken: string;\n refreshToken: string;\n expiresAt: string;\n }): Promise<void> {\n this.appUserId = args.appUserId;\n this.sessionToken = args.sessionToken;\n this.refreshToken = args.refreshToken;\n this.expiresAt = args.expiresAt;\n await this.flush();\n }\n\n async clearSession(rotateAnonymousId: boolean): Promise<void> {\n this.appUserId = null;\n this.sessionToken = null;\n this.refreshToken = null;\n this.expiresAt = null;\n if (rotateAnonymousId) {\n this.anonymousId = uuidv4();\n }\n await this.flush();\n }\n\n private async flush(): Promise<void> {\n const payload: PersistedIdentity = {\n anonymous_id: this.anonymousId,\n app_user_id: this.appUserId,\n session_token: this.sessionToken,\n refresh_token: this.refreshToken,\n expires_at: this.expiresAt,\n };\n await this.persistence.write(IDENTITY_KEY, JSON.stringify(payload));\n }\n}\n\nfunction freshSeed(): PersistedIdentity {\n return {\n anonymous_id: uuidv4(),\n app_user_id: null,\n session_token: null,\n refresh_token: null,\n expires_at: null,\n };\n}\n","/**\n * @layers/amba-react-native — React Native SDK for amba.\n *\n * Pure-JS implementation: the SDK is now a thin client over `fetch`\n * plus AsyncStorage-backed identity. No native modules, no WASM\n * dependency. The native SDKs (Swift/Kotlin/Flutter/Unity via the\n * shared runtime) keep their UniFFI bindings; this RN SDK aligns\n * with how Firebase/Supabase/PostHog ship to JS runtimes — pure\n * fetch-over-HTTP.\n *\n * @example\n * ```tsx\n * import { Amba } from '@layers/amba-react-native';\n *\n * await Amba.configure({ projectId: 'proj_...', clientKey: 'amba_ck_...' });\n * await Amba.auth.signInAnonymously();\n * await Amba.events.track('app_opened');\n *\n * // Push registration with a token from expo-notifications:\n * import * as Notifications from 'expo-notifications';\n * const { data: token } = await Notifications.getDevicePushTokenAsync();\n * await Amba.push.register(token, 'apns'); // or 'fcm' on Android\n * ```\n */\n\nexport type * from \"./types\";\nimport type {\n AmbaConfig,\n AuthResult,\n User,\n FindOptions,\n FindResponse,\n Filter,\n FilterValue,\n ConfigBundle,\n FlagAssignment,\n UserEntitlement,\n MediaAsset,\n PresignData,\n PushPlatform,\n PushToken,\n AiMessageRequest,\n AiMessageResponse,\n SocialProvider,\n Session,\n Achievement,\n AchievementProgress,\n Challenge,\n ChallengeProgress,\n CurrencyBalance,\n CurrencyTransaction,\n InventoryItem,\n PurchaseRequest,\n ConsumeRequest,\n Leaderboard,\n LeaderboardEntry,\n Store,\n PurchaseOption,\n PurchaseResult,\n XpBalance,\n XpTransaction,\n Streak,\n FeedResponse,\n Friendship,\n Group,\n GroupMember,\n GroupCreate,\n GroupUpdate,\n Conversation,\n Message,\n SendMessageRequest,\n CreateConversationRequest,\n ListMessagesOptions,\n MarkReadResult,\n Report,\n ReportRequest,\n ReferralCode,\n ReferralClaim,\n Review,\n ReviewCreate,\n ReviewUpdate,\n Role,\n CatalogItem,\n ContentItem,\n DeepLink,\n DeepLinkCreate,\n OnboardingStatus,\n} from \"./types\";\n\nimport { AsyncStoragePersistence } from \"./async-storage-adapter.js\";\nimport { AmbaApiError } from \"./error.js\";\nimport { AmbaHttpClient, DEFAULT_BASE_URL, mapHttpError } from \"./http-client.js\";\nimport type { Envelope } from \"./http-client.js\";\nimport { IdentityStore } from \"./identity.js\";\n\nexport { AmbaApiError } from \"./error.js\";\nexport type { AmbaApiErrorCode } from \"./error.js\";\n\n/** SDK semver — burned in at build time. Bump alongside package.json. */\nexport const SDK_VERSION = \"3.0.0\";\n\n// ── internal state ──────────────────────────────────────────────────\n\ninterface RuntimeState {\n http: AmbaHttpClient;\n identity: IdentityStore;\n debug: boolean;\n projectId: string;\n}\n\nlet state: RuntimeState | null = null;\n\nfunction getState(): RuntimeState {\n if (!state) {\n throw new AmbaApiError(\n \"NOT_INITIALIZED\",\n \"@layers/amba-react-native: SDK not configured. Call Amba.configure({ projectId, clientKey }) at app start.\",\n );\n }\n return state;\n}\n\n// ── auth state pub/sub ──────────────────────────────────────────────\n\ntype AuthSubscriber = (session: Session | null) => void;\nconst authSubscribers = new Set<AuthSubscriber>();\n\nfunction snapshotSession(user: User | null): Session | null {\n if (!user) return null;\n return {\n sessionToken: \"\",\n refreshToken: \"\",\n user,\n expiresAt: \"\",\n };\n}\n\nfunction notifyAuthSubscribers(session: Session | null): void {\n for (const cb of authSubscribers) {\n try {\n cb(session);\n } catch (err) {\n if (typeof console !== \"undefined\") {\n console.error(\"[amba] onAuthStateChange callback threw\", err);\n }\n }\n }\n}\n\nasync function notifyFromAuthResult(result: AuthResult): Promise<void> {\n notifyAuthSubscribers(snapshotSession(result.user));\n}\n\n// ── persist-on-auth helpers ─────────────────────────────────────────\n\nfunction expiresAtFromResult(result: AuthResult): string {\n if (result.expires_at && typeof result.expires_at === \"string\")\n return result.expires_at;\n // Default 1h session lifetime — matches the Rust core's contract\n // when the server omits `expires_at`.\n return new Date(Date.now() + 3600 * 1000).toISOString();\n}\n\nasync function persistAuthResult(\n state_: RuntimeState,\n result: AuthResult,\n): Promise<void> {\n await state_.identity.setSession({\n appUserId: result.user.id,\n sessionToken: result.session_token,\n refreshToken: result.refresh_token,\n expiresAt: expiresAtFromResult(result),\n });\n}\n\ninterface AuthEnvelope {\n data: AuthResult;\n}\n\nasync function postAuth(\n state_: RuntimeState,\n path: string,\n body: unknown,\n): Promise<AuthResult> {\n const env = await state_.http.post<AuthEnvelope>(path, body);\n const result = env.data;\n await persistAuthResult(state_, result);\n await notifyFromAuthResult(result);\n return result;\n}\n\n// ── light client-side validation (mirrors Rust core) ────────────────\n\nfunction requireEmail(email: string): void {\n const trimmed = email.trim();\n if (trimmed === \"\")\n throw new AmbaApiError(\n \"VALIDATION_ERROR\",\n \"email must not be empty\",\n );\n if (!trimmed.includes(\"@\") || !trimmed.includes(\".\"))\n throw new AmbaApiError(\n \"VALIDATION_ERROR\",\n `email '${email}' is not a valid email address`,\n );\n}\nfunction requirePassword(password: string): void {\n if (password.length < 8)\n throw new AmbaApiError(\n \"VALIDATION_ERROR\",\n \"password must be at least 8 characters\",\n );\n}\n\n// ── path helpers (mirror Rust constants) ────────────────────────────\n\nconst P = {\n authAnonymous: \"/v1/client/auth/anonymous\",\n authEmailLogin: \"/v1/client/auth/email/login\",\n authEmailSignup: \"/v1/client/auth/email/signup\",\n authSocial: \"/v1/client/auth/social\",\n authRefresh: \"/v1/client/auth/refresh\",\n authLogout: \"/v1/client/auth/logout\",\n authMe: \"/v1/client/auth/me\",\n events: \"/v1/client/events\",\n collections: \"/v1/client/collections\",\n storage: \"/v1/client/media\",\n storagePresign: \"/v1/client/media/presign\",\n storageCommit: \"/v1/client/media/commit\",\n push: \"/v1/client/push\",\n pushRegister: \"/v1/client/push/register\",\n pushUnregister: \"/v1/client/push/unregister\",\n pushTokens: \"/v1/client/push/tokens\",\n pushSubscribe: \"/v1/client/push/subscribe\",\n pushUnsubscribe: \"/v1/client/push/unsubscribe\",\n entitlements: \"/v1/client/entitlements\",\n aiAnthropic: \"/v1/client/ai/anthropic/messages\",\n config: \"/v1/client/config\",\n flags: \"/v1/client/flags\",\n achievements: \"/v1/client/achievements\",\n challenges: \"/v1/client/challenges\",\n catalog: \"/v1/client/catalog\",\n currencies: \"/v1/client/currencies\",\n inventory: \"/v1/client/inventory\",\n leaderboards: \"/v1/client/leaderboards\",\n stores: \"/v1/client/stores\",\n xp: \"/v1/client/xp\",\n streaks: \"/v1/client/streaks\",\n feeds: \"/v1/client/feeds\",\n friends: \"/v1/client/friends\",\n groups: \"/v1/client/groups\",\n messaging: \"/v1/client/messaging\",\n moderation: \"/v1/client/moderation\",\n reviews: \"/v1/client/reviews\",\n roles: \"/v1/client/roles\",\n referrals: \"/v1/client/referrals\",\n content: \"/v1/client/content\",\n deepLinks: \"/v1/client/deeplinks\",\n onboarding: \"/v1/client/onboarding\",\n};\n\nfunction encodePathSegment(s: string): string {\n return encodeURIComponent(s);\n}\n\n// ── public API ──────────────────────────────────────────────────────\n\n/**\n * Top-level SDK namespace for React Native.\n */\nexport const Amba = {\n configure: async (config: AmbaConfig): Promise<void> => {\n if (!config.projectId || config.projectId.trim() === \"\") {\n throw new Error(\"Amba.configure: projectId is required\");\n }\n if (!config.clientKey || config.clientKey.trim() === \"\") {\n throw new Error(\"Amba.configure: clientKey is required\");\n }\n const persistence = new AsyncStoragePersistence(\n config.storagePrefix ?? \"amba\",\n );\n await persistence.hydrate();\n const identity = await IdentityStore.create(persistence);\n\n const baseUrl = (config.apiUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const wrapperVersion = `amba-react-native/${SDK_VERSION}`;\n const sdkVersionHeader = `amba-sdk/${SDK_VERSION} ${wrapperVersion}`;\n const http = new AmbaHttpClient({\n apiKey: config.clientKey,\n baseUrl,\n sdkPlatform: \"react-native\",\n sdkVersionHeader,\n identity,\n });\n state = { http, identity, debug: config.debug ?? false, projectId: config.projectId };\n },\n\n /**\n * Test-only hook to reset the singleton between tests. Not part of\n * the customer-facing surface; the production SDK uses\n * `Amba.auth.signOut(true)` to fully reset identity.\n * @internal\n */\n _reset: (): void => {\n state = null;\n authSubscribers.clear();\n },\n\n get anonymousId(): string {\n return getState().identity.getAnonymousId();\n },\n get appUserId(): string | undefined {\n return getState().identity.getAppUserId() ?? undefined;\n },\n get isAuthenticated(): boolean {\n return getState().identity.isAuthenticated();\n },\n get projectId(): string {\n return getState().projectId;\n },\n setDebug: (enabled: boolean): void => {\n getState().debug = enabled;\n },\n\n events: {\n track: async (\n event: string,\n properties?: Record<string, unknown>,\n ): Promise<void> => {\n const s = getState();\n // POST /v1/client/events accepts a single event or a batch.\n // Single-shape: { name, properties?, anonymous_id?, timestamp? }\n await s.http.post(P.events, {\n name: event,\n properties: properties ?? undefined,\n anonymous_id: s.identity.getAnonymousId(),\n timestamp: new Date().toISOString(),\n });\n },\n },\n\n auth: {\n signInAnonymously: async (): Promise<AuthResult> => {\n const s = getState();\n // Send the SDK's current anonymous_id so the server can either\n // attach to the existing app_user (no MAU charge) or mint a new\n // one. See DX-2.\n return postAuth(s, P.authAnonymous, {\n anonymous_id: s.identity.getAnonymousId(),\n });\n },\n signInWithEmail: async (\n email: string,\n password: string,\n ): Promise<AuthResult> => {\n requireEmail(email);\n if (password === \"\")\n throw new AmbaApiError(\n \"VALIDATION_ERROR\",\n \"password must not be empty\",\n );\n return postAuth(getState(), P.authEmailLogin, { email, password });\n },\n signUpWithEmail: async (\n email: string,\n password: string,\n ): Promise<AuthResult> => {\n requireEmail(email);\n requirePassword(password);\n return postAuth(getState(), P.authEmailSignup, { email, password });\n },\n signInWithSocial: async (\n provider: SocialProvider,\n idToken: string,\n ): Promise<AuthResult> => {\n if (idToken.trim() === \"\")\n throw new AmbaApiError(\n \"VALIDATION_ERROR\",\n \"id_token must not be empty\",\n );\n return postAuth(getState(), P.authSocial, {\n provider,\n id_token: idToken,\n });\n },\n signOut: async (rotateAnonymousId = false): Promise<void> => {\n const s = getState();\n if (s.identity.getSessionToken()) {\n try {\n await s.http.post(P.authLogout, {});\n } catch (err) {\n // Best-effort: a server-side rejection should not trap the\n // user offline. Mirrors the Rust core's behaviour.\n if (typeof console !== \"undefined\") {\n console.warn(\"[amba] signOut server call failed\", err);\n }\n }\n }\n await s.identity.clearSession(rotateAnonymousId);\n notifyAuthSubscribers(null);\n },\n refresh: async (): Promise<AuthResult> => {\n const s = getState();\n const refreshToken = s.identity.getRefreshToken();\n if (!refreshToken)\n throw new AmbaApiError(\n \"UNAUTHORIZED\",\n \"no refresh token available — call signIn* first\",\n );\n return postAuth(s, P.authRefresh, { refresh_token: refreshToken });\n },\n me: async (): Promise<User> => {\n const s = getState();\n if (!s.identity.getSessionToken())\n throw new AmbaApiError(\n \"UNAUTHORIZED\",\n \"no active session — call signIn* first\",\n );\n const env = await s.http.get<Envelope<User>>(P.authMe);\n return env.data;\n },\n\n getSession: async (): Promise<Session | null> => {\n const s = getState();\n if (!s.identity.isAuthenticated()) return null;\n const env = await s.http.get<Envelope<User>>(P.authMe);\n return snapshotSession(env.data);\n },\n\n getAnonymousId: async (): Promise<string> => {\n return getState().identity.getAnonymousId();\n },\n\n onAuthStateChange: (\n cb: (session: Session | null) => void,\n ): (() => void) => {\n authSubscribers.add(cb);\n return () => {\n authSubscribers.delete(cb);\n };\n },\n },\n\n collections: {\n find: async <T = unknown>(\n name: string,\n options: FindOptions = {},\n ): Promise<FindResponse<T>> => {\n const s = getState();\n // Server returns `{ data, next_cursor, has_more }` for find —\n // the FindResponse shape matches the envelope directly.\n return s.http.post<FindResponse<T>>(\n `${P.collections}/${encodePathSegment(name)}/find`,\n options,\n );\n },\n findOne: async <T = unknown>(name: string, id: string): Promise<T> => {\n const s = getState();\n const env = await s.http.get<Envelope<T>>(\n `${P.collections}/${encodePathSegment(name)}/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n insert: async <T = unknown>(\n name: string,\n row: Record<string, unknown>,\n ): Promise<T> => {\n const s = getState();\n const env = await s.http.post<Envelope<T>>(\n `${P.collections}/${encodePathSegment(name)}`,\n row,\n );\n return env.data;\n },\n update: async <T = unknown>(\n name: string,\n id: string,\n set: Record<string, unknown>,\n ): Promise<T> => {\n const s = getState();\n const env = await s.http.patch<Envelope<T>>(\n `${P.collections}/${encodePathSegment(name)}/${encodePathSegment(id)}`,\n { set },\n );\n return env.data;\n },\n delete: async (\n name: string,\n id: string,\n ): Promise<{ data: { deleted: boolean } }> => {\n const s = getState();\n const result = await s.http.delete<{ data: { deleted: boolean } } | null>(\n `${P.collections}/${encodePathSegment(name)}/${encodePathSegment(id)}`,\n );\n // 204 No Content path — synthesise a `{ data: { deleted: true } }`\n // envelope so consumers can branch uniformly.\n return result ?? { data: { deleted: true } };\n },\n where: {\n eq: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"eq\",\n value,\n }),\n ne: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"ne\",\n value,\n }),\n gt: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"gt\",\n value,\n }),\n gte: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"gte\",\n value,\n }),\n lt: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"lt\",\n value,\n }),\n lte: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"lte\",\n value,\n }),\n in: (column: string, values: FilterValue[]): Filter => ({\n column,\n op: \"in\",\n value: values,\n }),\n notIn: (column: string, values: FilterValue[]): Filter => ({\n column,\n op: \"not_in\",\n value: values,\n }),\n like: (column: string, pattern: string): Filter => ({\n column,\n op: \"like\",\n value: pattern,\n }),\n ilike: (column: string, pattern: string): Filter => ({\n column,\n op: \"ilike\",\n value: pattern,\n }),\n isNull: (column: string): Filter => ({ column, op: \"is_null\" }),\n isNotNull: (column: string): Filter => ({ column, op: \"is_not_null\" }),\n and: (...filters: Filter[]): Filter => ({ and: filters }),\n or: (...filters: Filter[]): Filter => ({ or: filters }),\n not: (filter: Filter): Filter => ({ not: filter }),\n },\n },\n\n storage: {\n presign: async (params: {\n bucket: string;\n filename: string;\n mimeType: string;\n sizeBytes: number;\n retentionDays?: number;\n }): Promise<PresignData> => {\n const s = getState();\n const env = await s.http.post<Envelope<PresignData>>(P.storagePresign, {\n bucket: params.bucket,\n filename: params.filename,\n mime_type: params.mimeType,\n size_bytes: params.sizeBytes,\n retention_days: params.retentionDays,\n });\n return env.data;\n },\n commit: async (uploadId: string, assetId: string): Promise<MediaAsset> => {\n const s = getState();\n const env = await s.http.post<Envelope<MediaAsset>>(P.storageCommit, {\n upload_id: uploadId,\n asset_id: assetId,\n });\n return env.data;\n },\n },\n\n push: {\n register: async (\n token: string,\n platform: PushPlatform,\n bundleId?: string,\n ): Promise<PushToken> => {\n const s = getState();\n const env = await s.http.post<Envelope<PushToken>>(P.pushRegister, {\n token,\n platform,\n bundle_id: bundleId,\n });\n return env.data;\n },\n unregister: async (token: string): Promise<void> => {\n await getState().http.post(P.pushUnregister, { token });\n },\n getTokens: async (): Promise<PushToken[]> => {\n const env = await getState().http.get<Envelope<PushToken[]>>(\n P.pushTokens,\n );\n return env.data;\n },\n subscribe: async (topic: string): Promise<void> => {\n await getState().http.post(P.pushSubscribe, { topic });\n },\n unsubscribe: async (topic: string): Promise<void> => {\n await getState().http.post(P.pushUnsubscribe, { topic });\n },\n },\n\n entitlements: {\n list: async (): Promise<UserEntitlement[]> => {\n const env = await getState().http.get<Envelope<UserEntitlement[]>>(\n P.entitlements,\n );\n return env.data;\n },\n has: async (name: string): Promise<boolean> => {\n const env = await getState().http.get<Envelope<UserEntitlement[]>>(\n P.entitlements,\n { active_only: \"true\" },\n );\n return env.data.some((e) => e.name === name && e.is_active);\n },\n },\n\n ai: {\n anthropic: {\n messages: {\n create: async (\n request: AiMessageRequest,\n ): Promise<AiMessageResponse> => {\n const env = await getState().http.post<Envelope<AiMessageResponse>>(\n P.aiAnthropic,\n request,\n );\n return env.data;\n },\n },\n },\n },\n\n config: {\n fetch: async (): Promise<ConfigBundle> => {\n const s = getState();\n // Config returns `{ data: Record<string, unknown> }` plus an\n // `ETag` header that carries the version stamp.\n const url = s.http.url(P.config);\n const headers = s.http.buildHeaders();\n let response: Response;\n try {\n response = await (globalThis.fetch ?? fetch)(url, {\n method: \"GET\",\n headers,\n });\n } catch (err) {\n throw new AmbaApiError(\n \"NETWORK_ERROR\",\n `Network error: ${err instanceof Error ? err.message : String(err)}`,\n err,\n );\n }\n const text = await response.text();\n if (!response.ok) {\n const ct = response.headers.get(\"content-type\") ?? \"\";\n throw mapHttpError(response, text, ct.includes(\"application/json\"));\n }\n let parsed: { data?: Record<string, unknown> } = {};\n if (text) {\n try {\n parsed = JSON.parse(text);\n } catch {\n parsed = {};\n }\n }\n const etag = response.headers.get(\"etag\");\n // ETag format: `\"vN-...\"` — strip quotes then take the leading\n // `vN` prefix as the version stamp.\n let version: string | null = null;\n if (etag) {\n const cleaned = etag.replace(/^\"|\"$/g, \"\");\n const m = cleaned.match(/^(v\\d+)/);\n version = m ? (m[1] ?? null) : cleaned || null;\n }\n return {\n version,\n values: parsed.data ?? {},\n };\n },\n },\n\n flags: {\n fetch: async (): Promise<FlagAssignment[]> => {\n const env = await getState().http.get<Envelope<FlagAssignment[]>>(P.flags);\n return env.data;\n },\n },\n\n // ── Gamification ──────────────────────────────────────────────────\n\n achievements: {\n getAll: async (): Promise<Achievement[]> => {\n const env = await getState().http.get<Envelope<Achievement[]>>(\n P.achievements,\n );\n return env.data;\n },\n getProgress: async (): Promise<AchievementProgress[]> => {\n const env = await getState().http.get<Envelope<AchievementProgress[]>>(\n `${P.achievements}/progress`,\n );\n return env.data;\n },\n },\n\n challenges: {\n getActive: async (): Promise<Challenge[]> => {\n const env = await getState().http.get<Envelope<Challenge[]>>(\n `${P.challenges}/active`,\n );\n return env.data;\n },\n get: async (id: string): Promise<Challenge> => {\n const env = await getState().http.get<Envelope<Challenge>>(\n `${P.challenges}/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n getProgress: async (id: string): Promise<ChallengeProgress> => {\n const env = await getState().http.get<Envelope<ChallengeProgress>>(\n `${P.challenges}/${encodePathSegment(id)}/progress`,\n );\n return env.data;\n },\n claim: async (id: string): Promise<ChallengeProgress> => {\n const env = await getState().http.post<Envelope<ChallengeProgress>>(\n `${P.challenges}/${encodePathSegment(id)}/claim`,\n {},\n );\n return env.data;\n },\n },\n\n currencies: {\n getBalance: async (): Promise<CurrencyBalance[]> => {\n const env = await getState().http.get<Envelope<CurrencyBalance[]>>(\n P.currencies,\n );\n return env.data;\n },\n getTransactions: async (\n currencyKey: string,\n ): Promise<CurrencyTransaction[]> => {\n const env = await getState().http.get<Envelope<CurrencyTransaction[]>>(\n `${P.currencies}/${encodePathSegment(currencyKey)}/transactions`,\n );\n return env.data;\n },\n },\n\n inventory: {\n getItems: async (): Promise<InventoryItem[]> => {\n const env = await getState().http.get<Envelope<InventoryItem[]>>(\n P.inventory,\n );\n return env.data;\n },\n getItem: async (id: string): Promise<InventoryItem> => {\n const env = await getState().http.get<Envelope<InventoryItem>>(\n `${P.inventory}/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n purchase: async (request: PurchaseRequest): Promise<InventoryItem> => {\n const env = await getState().http.post<Envelope<InventoryItem>>(\n `${P.inventory}/purchase`,\n request,\n );\n return env.data;\n },\n consume: async (request: ConsumeRequest): Promise<InventoryItem> => {\n const env = await getState().http.post<Envelope<InventoryItem>>(\n `${P.inventory}/consume`,\n request,\n );\n return env.data;\n },\n },\n\n leaderboards: {\n get: async (key: string): Promise<Leaderboard> => {\n const env = await getState().http.get<Envelope<Leaderboard>>(\n `${P.leaderboards}/${encodePathSegment(key)}`,\n );\n return env.data;\n },\n getEntries: async (\n key: string,\n limit?: number,\n ): Promise<LeaderboardEntry[]> => {\n const env = await getState().http.get<Envelope<LeaderboardEntry[]>>(\n `${P.leaderboards}/${encodePathSegment(key)}/entries`,\n limit !== undefined ? { limit } : undefined,\n );\n return env.data;\n },\n getMyRank: async (key: string): Promise<LeaderboardEntry> => {\n const env = await getState().http.get<Envelope<LeaderboardEntry>>(\n `${P.leaderboards}/${encodePathSegment(key)}/me`,\n );\n return env.data;\n },\n },\n\n stores: {\n list: async (): Promise<Store[]> => {\n const env = await getState().http.get<Envelope<Store[]>>(P.stores);\n return env.data;\n },\n getPurchaseOptions: async (\n storeKey: string,\n ): Promise<PurchaseOption[]> => {\n const env = await getState().http.get<Envelope<PurchaseOption[]>>(\n `${P.stores}/${encodePathSegment(storeKey)}/options`,\n );\n return env.data;\n },\n purchase: async (\n storeKey: string,\n purchaseOptionId: string,\n receipt: unknown,\n ): Promise<PurchaseResult> => {\n const env = await getState().http.post<Envelope<PurchaseResult>>(\n `${P.stores}/${encodePathSegment(storeKey)}/purchase`,\n { purchase_option_id: purchaseOptionId, receipt },\n );\n return env.data;\n },\n },\n\n xp: {\n getBalance: async (): Promise<XpBalance> => {\n const env = await getState().http.get<Envelope<XpBalance>>(P.xp);\n return env.data;\n },\n getHistory: async (limit?: number): Promise<XpTransaction[]> => {\n const env = await getState().http.get<Envelope<XpTransaction[]>>(\n `${P.xp}/history`,\n limit !== undefined ? { limit } : undefined,\n );\n return env.data;\n },\n claim: async (grantKey: string): Promise<XpTransaction> => {\n const env = await getState().http.post<Envelope<XpTransaction>>(\n `${P.xp}/claim`,\n { grant_key: grantKey },\n );\n return env.data;\n },\n },\n\n streaks: {\n getAll: async (): Promise<Streak[]> => {\n const env = await getState().http.get<Envelope<Streak[]>>(P.streaks);\n return env.data;\n },\n qualify: async (streakKey: string): Promise<Streak> => {\n const env = await getState().http.post<Envelope<Streak>>(\n `${P.streaks}/${encodePathSegment(streakKey)}/qualify`,\n {},\n );\n return env.data;\n },\n },\n\n // ── Social ─────────────────────────────────────────────────────────\n\n feeds: {\n getActivity: async (\n feed?: string,\n cursor?: string,\n ): Promise<FeedResponse> => {\n const f = feed ?? \"default\";\n return getState().http.get<FeedResponse>(\n `${P.feeds}/${encodePathSegment(f)}`,\n cursor ? { cursor } : undefined,\n );\n },\n },\n\n friends: {\n getList: async (): Promise<Friendship[]> => {\n const env = await getState().http.get<Envelope<Friendship[]>>(\n P.friends,\n );\n return env.data;\n },\n getFriends: async (): Promise<Friendship[]> => {\n const env = await getState().http.get<Envelope<Friendship[]>>(\n P.friends,\n { state: \"accepted\" },\n );\n return env.data;\n },\n blockUser: async (userId: string): Promise<Friendship> => {\n const env = await getState().http.post<Envelope<Friendship>>(\n `${P.friends}/block`,\n { user_id: userId },\n );\n return env.data;\n },\n unblockUser: async (userId: string): Promise<void> => {\n await getState().http.post(`${P.friends}/unblock`, { user_id: userId });\n },\n removeBlock: async (friendshipId: string): Promise<void> => {\n await getState().http.delete(\n `${P.friends}/${encodePathSegment(friendshipId)}`,\n );\n },\n },\n\n groups: {\n create: async (params: GroupCreate): Promise<Group> => {\n const env = await getState().http.post<Envelope<Group>>(P.groups, params);\n return env.data;\n },\n get: async (id: string): Promise<Group> => {\n const env = await getState().http.get<Envelope<Group>>(\n `${P.groups}/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n update: async (id: string, patch: GroupUpdate): Promise<Group> => {\n const env = await getState().http.patch<Envelope<Group>>(\n `${P.groups}/${encodePathSegment(id)}`,\n patch,\n );\n return env.data;\n },\n delete: async (id: string): Promise<void> => {\n await getState().http.delete(`${P.groups}/${encodePathSegment(id)}`);\n },\n getMembers: async (id: string): Promise<GroupMember[]> => {\n const env = await getState().http.get<Envelope<GroupMember[]>>(\n `${P.groups}/${encodePathSegment(id)}/members`,\n );\n return env.data;\n },\n join: async (id: string): Promise<GroupMember> => {\n const env = await getState().http.post<Envelope<GroupMember>>(\n `${P.groups}/${encodePathSegment(id)}/join`,\n {},\n );\n return env.data;\n },\n leave: async (id: string): Promise<void> => {\n await getState().http.post(\n `${P.groups}/${encodePathSegment(id)}/leave`,\n {},\n );\n },\n invite: async (id: string, userId: string): Promise<GroupMember> => {\n const env = await getState().http.post<Envelope<GroupMember>>(\n `${P.groups}/${encodePathSegment(id)}/invite`,\n { user_id: userId },\n );\n return env.data;\n },\n },\n\n /**\n * User-to-user direct messaging. Task #62 corrected the path\n * constants — `sendMessage` previously POSTed to\n * `/v1/client/messaging/messages`, which the API doesn't serve.\n * The real route is `/v1/client/messaging/conversations/:id/messages`.\n */\n messaging: {\n /**\n * `POST /v1/client/messaging/conversations` — create (or fetch\n * the existing direct) conversation. Idempotent for direct\n * conversations between two users.\n */\n createConversation: async (\n request: CreateConversationRequest,\n ): Promise<Conversation> => {\n const env = await getState().http.post<Envelope<Conversation>>(\n `${P.messaging}/conversations`,\n request,\n );\n return env.data;\n },\n getConversations: async (): Promise<Conversation[]> => {\n const env = await getState().http.get<Envelope<Conversation[]>>(\n `${P.messaging}/conversations`,\n );\n return env.data;\n },\n /** Alias matching the `listX` naming convention used elsewhere. */\n listConversations: async (): Promise<Conversation[]> => {\n const env = await getState().http.get<Envelope<Conversation[]>>(\n `${P.messaging}/conversations`,\n );\n return env.data;\n },\n sendMessage: async (\n conversationId: string,\n request: SendMessageRequest,\n ): Promise<Message> => {\n const env = await getState().http.post<Envelope<Message>>(\n `${P.messaging}/conversations/${encodePathSegment(conversationId)}/messages`,\n request,\n );\n return env.data;\n },\n listMessages: async (\n conversationId: string,\n opts?: ListMessagesOptions,\n ): Promise<Message[]> => {\n const query: Record<string, number | undefined> = {};\n if (opts?.limit !== undefined) query.limit = opts.limit;\n if (opts?.offset !== undefined) query.offset = opts.offset;\n const env = await getState().http.get<Envelope<Message[]>>(\n `${P.messaging}/conversations/${encodePathSegment(conversationId)}/messages`,\n Object.keys(query).length > 0 ? query : undefined,\n );\n return env.data;\n },\n markRead: async (conversationId: string): Promise<MarkReadResult> => {\n const env = await getState().http.post<Envelope<MarkReadResult>>(\n `${P.messaging}/conversations/${encodePathSegment(conversationId)}/read`,\n {},\n );\n return env.data;\n },\n },\n\n moderation: {\n reportUser: async (request: ReportRequest): Promise<Report> => {\n const env = await getState().http.post<Envelope<Report>>(\n `${P.moderation}/reports/users`,\n request,\n );\n return env.data;\n },\n reportContent: async (request: ReportRequest): Promise<Report> => {\n const env = await getState().http.post<Envelope<Report>>(\n `${P.moderation}/reports/content`,\n request,\n );\n return env.data;\n },\n getReportStatus: async (id: string): Promise<Report> => {\n const env = await getState().http.get<Envelope<Report>>(\n `${P.moderation}/reports/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n },\n\n reviews: {\n list: async (\n targetType: string,\n targetId: string,\n ): Promise<Review[]> => {\n const env = await getState().http.get<Envelope<Review[]>>(P.reviews, {\n target_type: targetType,\n target_id: targetId,\n });\n return env.data;\n },\n create: async (params: ReviewCreate): Promise<Review> => {\n const env = await getState().http.post<Envelope<Review>>(P.reviews, params);\n return env.data;\n },\n update: async (id: string, patch: ReviewUpdate): Promise<Review> => {\n const env = await getState().http.patch<Envelope<Review>>(\n `${P.reviews}/${encodePathSegment(id)}`,\n patch,\n );\n return env.data;\n },\n delete: async (id: string): Promise<void> => {\n await getState().http.delete(`${P.reviews}/${encodePathSegment(id)}`);\n },\n },\n\n roles: {\n getMyRoles: async (): Promise<Role[]> => {\n const env = await getState().http.get<Envelope<Role[]>>(\n `${P.roles}/me`,\n );\n return env.data;\n },\n hasPermission: async (permission: string): Promise<boolean> => {\n const env = await getState().http.get<Envelope<{ allowed: boolean }>>(\n `${P.roles}/check`,\n { permission },\n );\n return env.data.allowed === true;\n },\n },\n\n referrals: {\n getReferralCode: async (): Promise<ReferralCode> => {\n const env = await getState().http.get<Envelope<ReferralCode>>(\n `${P.referrals}/me`,\n );\n return env.data;\n },\n claimReferral: async (code: string): Promise<ReferralClaim> => {\n const env = await getState().http.post<Envelope<ReferralClaim>>(\n `${P.referrals}/claim`,\n { code },\n );\n return env.data;\n },\n create: async (\n code?: string,\n maxUses?: number,\n ): Promise<ReferralCode> => {\n const body: Record<string, unknown> = {};\n if (code !== undefined) body.code = code;\n if (maxUses !== undefined) body.max_uses = maxUses;\n const env = await getState().http.post<Envelope<ReferralCode>>(\n P.referrals,\n body,\n );\n return env.data;\n },\n },\n\n // ── Lifecycle ──────────────────────────────────────────────────────\n\n catalog: {\n list: async (): Promise<CatalogItem[]> => {\n const env = await getState().http.get<Envelope<CatalogItem[]>>(\n P.catalog,\n );\n return env.data;\n },\n },\n\n content: {\n getToday: async (\n channel: string = \"default\",\n ): Promise<ContentItem | null> => {\n const env = await getState().http.get<Envelope<ContentItem | null>>(\n `${P.content}/today/${encodePathSegment(channel)}`,\n );\n return env.data ?? null;\n },\n getLibrary: async (\n channel: string = \"default\",\n options?: { limit?: number; cursor?: string },\n ): Promise<ContentItem[]> => {\n const env = await getState().http.get<Envelope<ContentItem[]>>(\n `${P.content}/library/${encodePathSegment(channel)}`,\n {\n limit: options?.limit,\n cursor: options?.cursor,\n },\n );\n return env.data;\n },\n getItem: async (id: string): Promise<ContentItem> => {\n const env = await getState().http.get<Envelope<ContentItem>>(\n `${P.content}/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n updateItem: async (id: string, state_: unknown): Promise<ContentItem> => {\n const env = await getState().http.post<Envelope<ContentItem>>(\n `${P.content}/${encodePathSegment(id)}/state`,\n state_ as Record<string, unknown>,\n );\n return env.data;\n },\n createItem: async (\n channel: string,\n item: unknown,\n ): Promise<ContentItem> => {\n const env = await getState().http.post<Envelope<ContentItem>>(\n `${P.content}/${encodePathSegment(channel)}`,\n item as Record<string, unknown>,\n );\n return env.data;\n },\n },\n\n deepLinks: {\n get: async (shortCode: string): Promise<DeepLink> => {\n const env = await getState().http.get<Envelope<DeepLink>>(\n `${P.deepLinks}/${encodePathSegment(shortCode)}`,\n );\n return env.data;\n },\n create: async (params: DeepLinkCreate): Promise<DeepLink> => {\n const env = await getState().http.post<Envelope<DeepLink>>(\n P.deepLinks,\n params,\n );\n return env.data;\n },\n },\n\n onboarding: {\n getStatus: async (): Promise<OnboardingStatus> => {\n const env = await getState().http.get<Envelope<OnboardingStatus>>(\n P.onboarding,\n );\n return env.data;\n },\n nextStep: async (payload: unknown): Promise<OnboardingStatus> => {\n const env = await getState().http.post<Envelope<OnboardingStatus>>(\n `${P.onboarding}/next`,\n payload as Record<string, unknown>,\n );\n return env.data;\n },\n skipStep: async (): Promise<OnboardingStatus> => {\n const env = await getState().http.post<Envelope<OnboardingStatus>>(\n `${P.onboarding}/skip`,\n {},\n );\n return env.data;\n },\n complete: async (): Promise<OnboardingStatus> => {\n const env = await getState().http.post<Envelope<OnboardingStatus>>(\n `${P.onboarding}/complete`,\n {},\n );\n return env.data;\n },\n },\n\n /**\n * Developer utilities. Only available on sandbox-tier projects.\n *\n * These methods are safe to call from client-side code — they use the\n * project's client key, not an admin credential.\n */\n dev: {\n /**\n * Wipe all users and their associated data on a sandbox-tier project.\n *\n * Lets a developer's Settings or Account tab add a \"Reset\" button\n * without embedding an admin credential on the device. Rejects with\n * an `AmbaApiError` with `code: 'NOT_SANDBOX_TIER'` if the project\n * is not on a sandbox tier.\n */\n resetSandbox: async (): Promise<{ deleted: number }> => {\n const s = getState();\n const env = await s.http.post<Envelope<{ deleted: number }>>(\n \"/v1/client/dev/reset-sandbox\",\n {},\n );\n return env.data;\n },\n },\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["cachedStorage: AsyncStorageStatic | null","prefix: string","parts: string[]","h: Record<string, string>","init: RequestInit","response: Response","parsed: unknown","code: string | undefined","envelopeDetails: unknown","details: unknown","persistence: AsyncStoragePersistence","seed: PersistedIdentity","payload: PersistedIdentity","state: RuntimeState | null","response: Response","parsed: { data?: Record<string, unknown> }","version: string | null","query: Record<string, number | undefined>","body: Record<string, unknown>"],"sources":["../src/async-storage-adapter.ts","../src/error.ts","../src/http-client.ts","../src/uuid.ts","../src/identity.ts","../src/index.ts"],"sourcesContent":["/**\n * AsyncStorage-backed identity persistence for React Native.\n *\n * Bridges `@react-native-async-storage/async-storage` (peer-dep, installed\n * by the host app) to the SDK runtime. Reads/writes go through a\n * per-prefix namespace so different amba projects can coexist in the\n * same app.\n *\n * Identity records stored under `${prefix}:identity` survive app restarts.\n */\n\n// Late-imported to avoid bundling the peer-dep — host app installs it.\ntype AsyncStorageStatic = {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\nlet cachedStorage: AsyncStorageStatic | null = null;\n\nasync function getStorage(): Promise<AsyncStorageStatic | null> {\n if (cachedStorage !== null) return cachedStorage;\n try {\n const mod = await import(\"@react-native-async-storage/async-storage\");\n cachedStorage = (mod.default ?? mod) as AsyncStorageStatic;\n return cachedStorage;\n } catch {\n // Host app didn't install the peer dep — fall back to in-memory.\n // amba will still work but identity won't survive app restart.\n return null;\n }\n}\n\nexport class AsyncStoragePersistence {\n private memoryCache = new Map<string, string>();\n\n constructor(private readonly prefix: string) {}\n\n async hydrate(): Promise<void> {\n // Future: when the SDK runtime gains a JS-side persistence bridge,\n // this will pre-load the identity record into memory so the runtime\n // can read it synchronously at init.\n }\n\n async read(key: string): Promise<string | null> {\n const fullKey = `${this.prefix}:${key}`;\n if (this.memoryCache.has(fullKey))\n return this.memoryCache.get(fullKey) ?? null;\n const storage = await getStorage();\n if (!storage) return null;\n const v = await storage.getItem(fullKey);\n if (v !== null) this.memoryCache.set(fullKey, v);\n return v;\n }\n\n async write(key: string, value: string): Promise<void> {\n const fullKey = `${this.prefix}:${key}`;\n this.memoryCache.set(fullKey, value);\n const storage = await getStorage();\n if (storage) await storage.setItem(fullKey, value);\n }\n\n async delete(key: string): Promise<void> {\n const fullKey = `${this.prefix}:${key}`;\n this.memoryCache.delete(fullKey);\n const storage = await getStorage();\n if (storage) await storage.removeItem(fullKey);\n }\n}\n","/**\n * Typed error class for the amba SDK + helper that converts arbitrary\n * thrown values (native Error, plain objects, runtime-emitted errors)\n * into a stable `AmbaApiError` instance.\n *\n * Callers can `instanceof`-narrow safely, branch on `.code`, and pull\n * extra payload from `.details` (raw HTTP body, validation field paths,\n * etc.). The wrapper methods on `Amba` wrap every async call in\n * `toAmbaApiError`, so consumers see one error shape regardless of\n * which layer (network, runtime, validation) failed.\n */\n\n/**\n * Stable error codes surfaced by the SDK. Strings rather than an enum\n * so customers can extend with custom codes by simply throwing\n * `new AmbaApiError(\"MY_CODE\", \"...\")` without coordinating with this\n * package's TypeScript types.\n */\nexport type AmbaApiErrorCode =\n | \"UNAUTHORIZED\"\n | \"FORBIDDEN\"\n | \"NOT_FOUND\"\n | \"CONFLICT\"\n | \"RATE_LIMITED\"\n | \"VALIDATION_ERROR\"\n | \"NETWORK_ERROR\"\n | \"HTTP_ERROR\"\n | \"CIRCUIT_OPEN\"\n | \"CONSENT_NOT_GRANTED\"\n | \"NOT_INITIALIZED\"\n | \"INVALID_CONFIG\"\n | \"INVALID_ARGUMENT\"\n | \"PUSH_PERMISSION_DENIED\"\n | \"PUSH_REGISTRATION_FAILED\"\n | \"NOT_SANDBOX_TIER\"\n | \"UNKNOWN_ERROR\"\n | (string & {});\n\nexport class AmbaApiError extends Error {\n readonly code: AmbaApiErrorCode;\n readonly details?: unknown;\n constructor(\n code: AmbaApiErrorCode,\n message: string,\n details?: unknown,\n ) {\n super(message);\n this.name = \"AmbaApiError\";\n this.code = code;\n this.details = details;\n // Restore prototype chain when transpiled to ES5 targets — Error\n // subclasses lose their prototype otherwise and `instanceof` breaks.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Best-effort: pull a stable error code out of a Rust `AmbaError`\n * Display string. Used by `toAmbaApiError` when the underlying thrown\n * value is a generic `Error` produced by `wasm-bindgen`'s `JsError::new`.\n *\n * Keep in sync with `sdks/core/src/error.rs::AmbaError`'s `#[error]`\n * format strings — but the parser falls back to UNKNOWN_ERROR for any\n * pattern it doesn't recognize, so a stale match list isn't a footgun,\n * just a quality-of-life regression.\n */\nfunction codeFromMessage(message: string): AmbaApiErrorCode {\n // Cheapest checks first — most production errors are auth or HTTP.\n if (message.startsWith(\"Unauthorized\")) return \"UNAUTHORIZED\";\n if (message.startsWith(\"Forbidden\")) return \"FORBIDDEN\";\n if (message.startsWith(\"Not found\")) return \"NOT_FOUND\";\n if (message.startsWith(\"Conflict\")) return \"CONFLICT\";\n if (message.startsWith(\"Rate limited\")) return \"RATE_LIMITED\";\n if (message.startsWith(\"Validation error\")) return \"VALIDATION_ERROR\";\n if (message.startsWith(\"Network error\")) return \"NETWORK_ERROR\";\n if (message.startsWith(\"HTTP error\")) return \"HTTP_ERROR\";\n if (message.startsWith(\"Circuit breaker\")) return \"CIRCUIT_OPEN\";\n if (message.startsWith(\"Consent not granted\")) return \"CONSENT_NOT_GRANTED\";\n if (message.includes(\"not initialized\")) return \"NOT_INITIALIZED\";\n if (message.startsWith(\"Invalid configuration\")) return \"INVALID_CONFIG\";\n if (message.startsWith(\"Invalid argument\")) return \"INVALID_ARGUMENT\";\n return \"UNKNOWN_ERROR\";\n}\n\n/**\n * Coerce any thrown value into an `AmbaApiError`. Idempotent — passing\n * an existing `AmbaApiError` returns it unchanged so wrappers can stack\n * without re-wrapping.\n *\n * Heuristics:\n * 1. Existing `AmbaApiError` → returned as-is.\n * 2. Object with `.code` → use that code + `.message` + `.details`.\n * 3. `Error` (e.g. runtime-emitted error) → infer code from message prefix.\n * 4. Anything else → stringify and tag UNKNOWN_ERROR.\n */\nexport function toAmbaApiError(err: unknown): AmbaApiError {\n if (err instanceof AmbaApiError) return err;\n if (err && typeof err === \"object\") {\n const obj = err as { code?: unknown; message?: unknown; details?: unknown };\n if (typeof obj.code === \"string\") {\n return new AmbaApiError(\n obj.code,\n typeof obj.message === \"string\" ? obj.message : \"unknown\",\n obj.details,\n );\n }\n }\n if (err instanceof Error) {\n return new AmbaApiError(codeFromMessage(err.message), err.message);\n }\n return new AmbaApiError(\"UNKNOWN_ERROR\", String(err));\n}\n\n/**\n * Wrap a thunk so any thrown value becomes an `AmbaApiError`. The\n * wrapper methods on `Amba` use this to convert runtime-emitted errors\n * uniformly at the SDK boundary.\n */\nexport async function withAmbaError<T>(thunk: () => Promise<T>): Promise<T> {\n try {\n return await thunk();\n } catch (err) {\n throw toAmbaApiError(err);\n }\n}\n","/**\n * Pure-JS HTTP client for the amba API.\n *\n * Built on the platform `fetch` (React Native ships it; Hermes\n * provides it; Expo polyfills it where needed). No transitive\n * runtime deps. The previous implementation tunnelled every call\n * through a WASM core that did the same thing in Rust — moving the\n * logic to TS removes ~4 MB from the customer bundle and removes\n * a runtime that's foreign to Hermes.\n *\n * Responsibilities:\n * - Construct the request URL by joining `baseUrl + path` (with an\n * optional query string).\n * - Inject the standard amba auth headers — `X-Api-Key`,\n * `X-SDK-Platform`, `X-SDK-Version`, `Content-Type`, and\n * `Authorization: Bearer …` when a session token is present.\n * - Map non-2xx responses to typed `AmbaApiError` instances using\n * the same code set the WASM core used (UNAUTHORIZED, FORBIDDEN,\n * NOT_FOUND, CONFLICT, RATE_LIMITED, VALIDATION_ERROR, HTTP_ERROR,\n * NETWORK_ERROR).\n * - Parse JSON response bodies. 204 No Content returns `null`.\n */\n\nimport { AmbaApiError } from \"./error.js\";\nimport type { IdentityStore } from \"./identity.js\";\n\n/** Default amba API endpoint. */\nexport const DEFAULT_BASE_URL = \"https://api.amba.dev\";\n\n/**\n * Server response envelope. Most amba endpoints wrap their payload\n * in `{ data: ... }`. Helpers below let call sites declare whether\n * to return the envelope, the unwrapped `data` field, or the raw\n * body (e.g. `find` returns the whole envelope so consumers can\n * paginate via `next_cursor` / `has_more`).\n */\nexport interface Envelope<T> {\n data: T;\n next_cursor?: string | null;\n has_more?: boolean;\n}\n\nexport interface AmbaHttpClientOptions {\n apiKey: string;\n baseUrl: string;\n sdkPlatform: string;\n sdkVersionHeader: string;\n identity: IdentityStore;\n /** Override the `fetch` implementation — tests pass a vi.fn() shim. */\n fetchImpl?: typeof fetch;\n}\n\ntype Query = Record<string, string | number | boolean | undefined | null>;\n\nexport class AmbaHttpClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly sdkPlatform: string;\n private readonly sdkVersionHeader: string;\n private readonly identity: IdentityStore;\n private readonly fetchImpl: typeof fetch;\n\n constructor(opts: AmbaHttpClientOptions) {\n this.apiKey = opts.apiKey;\n this.baseUrl = opts.baseUrl.replace(/\\/+$/, \"\");\n this.sdkPlatform = opts.sdkPlatform;\n this.sdkVersionHeader = opts.sdkVersionHeader;\n this.identity = opts.identity;\n this.fetchImpl =\n opts.fetchImpl ??\n (globalThis.fetch.bind(globalThis) as typeof fetch);\n }\n\n /** Build the absolute URL for an API path, optionally with a query string. */\n url(path: string, query?: Query): string {\n const base = this.baseUrl + path;\n if (!query) return base;\n const parts: string[] = [];\n for (const k of Object.keys(query)) {\n const v = query[k];\n if (v === undefined || v === null) continue;\n parts.push(`${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`);\n }\n if (parts.length === 0) return base;\n return `${base}?${parts.join(\"&\")}`;\n }\n\n /** Build the standard request headers for the current identity state. */\n buildHeaders(extra?: Record<string, string>): Record<string, string> {\n const h: Record<string, string> = {\n \"X-Api-Key\": this.apiKey,\n \"X-SDK-Platform\": this.sdkPlatform,\n \"X-SDK-Version\": this.sdkVersionHeader,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...extra,\n };\n const tok = this.identity.getSessionToken();\n if (tok) h.Authorization = `Bearer ${tok}`;\n return h;\n }\n\n async get<T>(path: string, query?: Query): Promise<T> {\n return this.request<T>(\"GET\", path, undefined, query);\n }\n\n async post<T>(path: string, body?: unknown, query?: Query): Promise<T> {\n return this.request<T>(\"POST\", path, body, query);\n }\n\n async patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"PATCH\", path, body);\n }\n\n async delete<T>(path: string): Promise<T> {\n return this.request<T>(\"DELETE\", path);\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n query?: Query,\n ): Promise<T> {\n const url = this.url(path, query);\n const headers = this.buildHeaders();\n\n const init: RequestInit = {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body ?? {}),\n };\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, init);\n } catch (err) {\n // Transport-level failure (DNS, refused, offline, abort). The\n // platform fetch throws a TypeError or AbortError; we wrap it\n // into the SDK's stable error shape.\n const message =\n err instanceof Error\n ? err.message\n : typeof err === \"string\"\n ? err\n : \"fetch failed\";\n throw new AmbaApiError(\"NETWORK_ERROR\", `Network error: ${message}`, err);\n }\n\n return parseResponse<T>(response);\n }\n}\n\nasync function parseResponse<T>(response: Response): Promise<T> {\n // 204 No Content: most DELETE endpoints. Return null so generics\n // taking `unknown | null` decode cleanly.\n if (response.status === 204) {\n return null as T;\n }\n\n const text = await response.text();\n const ct = response.headers.get(\"content-type\") ?? \"\";\n const isJson = ct.includes(\"application/json\");\n\n if (!response.ok) {\n throw mapHttpError(response, text, isJson);\n }\n\n if (text === \"\") return null as T;\n if (isJson) {\n try {\n return JSON.parse(text) as T;\n } catch (err) {\n throw new AmbaApiError(\n \"HTTP_ERROR\",\n `Failed to parse JSON response: ${\n err instanceof Error ? err.message : String(err)\n }`,\n { body: text },\n );\n }\n }\n // Non-JSON success body (uncommon for this API). Return the raw text\n // string typed as the generic so the caller can decide.\n return text as unknown as T;\n}\n\nexport function mapHttpError(\n response: Response,\n rawBody: string,\n isJson: boolean,\n): AmbaApiError {\n let parsed: unknown = undefined;\n let message = rawBody || `HTTP ${response.status}`;\n let code: string | undefined;\n // `envelopeDetails` is the inner `error.details` field — surfaced as\n // `AmbaApiError.details` when the server emitted a typed envelope.\n // This matches the WASM-bridged web SDK, which carries the inner\n // details (e.g. `{ streak_key: 'weekly_login' }`) verbatim — NOT the\n // whole `{error:{...}}` wrapper. Customer code like\n // `e.details.streak_key` must work identically on both SDKs.\n // (Cursor BugBot PR #156, medium — cross-SDK details-shape divergence.)\n let envelopeDetails: unknown = undefined;\n let envelopeRecognized = false;\n if (isJson && rawBody) {\n try {\n parsed = JSON.parse(rawBody);\n } catch {\n parsed = undefined;\n }\n // Standard amba envelope: `{ error: { code, message, details } }`\n // and a few legacy `{ error: \"string\" }` shapes. We recognize the\n // envelope by the presence of a string `code` alone — message is\n // optional, matching the Rust `parse_error_envelope` rule so the\n // two SDKs agree on what \"envelope\" means. (Cursor BugBot PR #156.)\n const env = parsed as {\n error?: { code?: string; message?: string; details?: unknown };\n } | null;\n const innerErr = env?.error;\n if (innerErr && typeof innerErr === \"object\" && typeof innerErr.code === \"string\") {\n code = innerErr.code;\n envelopeRecognized = true;\n envelopeDetails = innerErr.details;\n if (typeof innerErr.message === \"string\") message = innerErr.message;\n }\n }\n\n // Use the inner envelope details when the server gave us a\n // recognizable envelope; fall back to the full parsed body\n // otherwise so legacy / proxy-shaped responses still carry\n // something the customer can inspect.\n const details: unknown = envelopeRecognized ? envelopeDetails : parsed;\n\n switch (response.status) {\n case 401:\n return new AmbaApiError(code ?? \"UNAUTHORIZED\", message, details);\n case 403:\n return new AmbaApiError(code ?? \"FORBIDDEN\", message, details);\n case 404:\n return new AmbaApiError(code ?? \"NOT_FOUND\", message, details);\n case 409:\n return new AmbaApiError(code ?? \"CONFLICT\", message, details);\n case 422:\n return new AmbaApiError(\n code ?? \"VALIDATION_ERROR\",\n message,\n details,\n );\n case 429: {\n const retryAfter = response.headers.get(\"retry-after\") ?? \"unspecified\";\n // Prefer the server's structured message if it gave us one; fall back\n // to a synthesized one that surfaces the Retry-After header so callers\n // can decide whether to back off vs surface to the user.\n const serverGaveMessage =\n message !== rawBody && message !== `HTTP ${response.status}`;\n return new AmbaApiError(\n code ?? \"RATE_LIMITED\",\n serverGaveMessage\n ? message\n : `Rate limited (retry after ${retryAfter})`,\n details,\n );\n }\n default:\n return new AmbaApiError(\n code ?? \"HTTP_ERROR\",\n message,\n envelopeRecognized\n ? envelopeDetails\n : (parsed ?? { status: response.status, body: rawBody }),\n );\n }\n}\n","/**\n * UUID v4 generator — pure JS, no dependencies.\n *\n * Why pure JS rather than `globalThis.crypto.randomUUID()`:\n * - Older Hermes builds (RN <0.74) don't ship `crypto` global.\n * - `expo-crypto` exposes `randomUUID()` but is a separate dep we\n * don't want to force on every consumer.\n * - The amba SDK only uses UUIDs for `anonymous_id` — a stable\n * per-install identifier. Cryptographic randomness is not a\n * security requirement here; uniqueness across installs is.\n *\n * If `globalThis.crypto?.getRandomValues` is available (it is on\n * Hermes 0.75+ via the engine and on every Expo runtime via\n * react-native-get-random-values that Expo auto-installs), we use it\n * for higher-quality randomness. Otherwise we fall back to\n * `Math.random()` — which is sufficient for the install-id use case\n * because per-device uniqueness is what we need, not collision\n * resistance across the global population.\n */\n\ntype GetRandomValues = (a: Uint8Array) => Uint8Array;\n\nfunction getRandomBytes(n: number): Uint8Array {\n const bytes = new Uint8Array(n);\n const grv = (globalThis as { crypto?: { getRandomValues?: GetRandomValues } })\n .crypto?.getRandomValues;\n if (typeof grv === \"function\") {\n // Bind to crypto to preserve `this`.\n (globalThis as { crypto: { getRandomValues: GetRandomValues } }).crypto.getRandomValues(\n bytes,\n );\n return bytes;\n }\n // Math.random fallback — not crypto-secure but good enough for\n // install-id uniqueness.\n for (let i = 0; i < n; i++) bytes[i] = Math.floor(Math.random() * 256);\n return bytes;\n}\n\n/**\n * Generate a UUID v4 (random) per RFC 4122. Wire shape:\n * `xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx` where `y ∈ {8,9,a,b}`.\n */\nexport function uuidv4(): string {\n const b = getRandomBytes(16);\n // Set version (4) and variant (10xx) bits.\n b[6] = (b[6]! & 0x0f) | 0x40;\n b[8] = (b[8]! & 0x3f) | 0x80;\n const h = Array.from(b, (v) => v.toString(16).padStart(2, \"0\"));\n return (\n h.slice(0, 4).join(\"\") +\n \"-\" +\n h.slice(4, 6).join(\"\") +\n \"-\" +\n h.slice(6, 8).join(\"\") +\n \"-\" +\n h.slice(8, 10).join(\"\") +\n \"-\" +\n h.slice(10, 16).join(\"\")\n );\n}\n","/**\n * Identity store — the minimal on-device state the SDK keeps between\n * launches: `anonymous_id` (stable per-install UUID), authenticated\n * user id, session token, refresh token, expiry.\n *\n * Persistence: writes go to `AsyncStoragePersistence` under\n * `<prefix>:identity_v1` (JSON-encoded). On `configure()` we hydrate\n * once; subsequent reads/writes are O(1) in-process.\n *\n * Why a small TS class instead of porting the Rust per-instance-key\n * machinery: the WASM core's race rationale (cross-core write race\n * with `amba_reset`) is specific to the FFI slot model — JS doesn't\n * have that hazard because there's one `Amba` singleton per module\n * graph. Keeping the persistence shape simple makes the AsyncStorage\n * cost predictable and the implementation auditable.\n */\n\nimport { AsyncStoragePersistence } from \"./async-storage-adapter.js\";\nimport { uuidv4 } from \"./uuid.js\";\n\n/** Storage key under the configured prefix. Bumped when shape changes. */\nconst IDENTITY_KEY = \"identity_v1\";\n\nexport interface IdentitySnapshot {\n anonymousId: string;\n appUserId: string | null;\n sessionToken: string | null;\n refreshToken: string | null;\n /** ISO-8601 expiry — null means \"no active session.\" */\n expiresAt: string | null;\n}\n\ninterface PersistedIdentity {\n anonymous_id: string;\n app_user_id: string | null;\n session_token: string | null;\n refresh_token: string | null;\n /** ISO-8601 string; null when not set. */\n expires_at: string | null;\n}\n\nfunction isExpired(expiresAt: string | null): boolean {\n if (!expiresAt) return false;\n const t = Date.parse(expiresAt);\n if (Number.isNaN(t)) return false;\n return t <= Date.now();\n}\n\n/**\n * The SDK's identity state — held in memory after hydration, persisted\n * to AsyncStorage on every mutation. All methods are sync after\n * `hydrate()` resolves.\n */\nexport class IdentityStore {\n private anonymousId: string;\n private appUserId: string | null = null;\n private sessionToken: string | null = null;\n private refreshToken: string | null = null;\n private expiresAt: string | null = null;\n\n private constructor(\n private readonly persistence: AsyncStoragePersistence,\n seed: PersistedIdentity,\n ) {\n this.anonymousId = seed.anonymous_id;\n this.appUserId = seed.app_user_id;\n this.sessionToken = seed.session_token;\n this.refreshToken = seed.refresh_token;\n this.expiresAt = seed.expires_at;\n }\n\n /**\n * Build a store, hydrating any prior identity from AsyncStorage.\n * If no prior identity exists, a fresh `anonymous_id` is minted.\n * Expired session tokens are dropped at hydration (the refresh token\n * survives so callers can `auth.refresh()` to mint a new pair).\n */\n static async create(\n persistence: AsyncStoragePersistence,\n ): Promise<IdentityStore> {\n const raw = await persistence.read(IDENTITY_KEY);\n let seed: PersistedIdentity;\n if (raw) {\n try {\n const parsed = JSON.parse(raw) as Partial<PersistedIdentity>;\n seed = {\n anonymous_id: parsed.anonymous_id ?? uuidv4(),\n app_user_id: parsed.app_user_id ?? null,\n session_token: parsed.session_token ?? null,\n refresh_token: parsed.refresh_token ?? null,\n expires_at: parsed.expires_at ?? null,\n };\n } catch {\n // Garbage on disk — start fresh. anonymous_id rotates which is\n // acceptable for a corrupt-state recovery (rare; users on\n // upgrade keep their id because the previous SDK wrote valid JSON).\n seed = freshSeed();\n }\n } else {\n seed = freshSeed();\n }\n\n if (isExpired(seed.expires_at)) {\n // Drop expired session_token but keep refresh_token so the caller\n // can mint a new pair.\n seed.session_token = null;\n seed.expires_at = null;\n }\n\n const store = new IdentityStore(persistence, seed);\n // Always persist after hydration — handles the first-run mint of\n // `anonymous_id` and clears any expired tokens from disk.\n await store.flush();\n return store;\n }\n\n snapshot(): IdentitySnapshot {\n return {\n anonymousId: this.anonymousId,\n appUserId: this.appUserId,\n sessionToken: this.sessionToken,\n refreshToken: this.refreshToken,\n expiresAt: this.expiresAt,\n };\n }\n\n getAnonymousId(): string {\n return this.anonymousId;\n }\n\n getAppUserId(): string | null {\n return this.appUserId;\n }\n\n getSessionToken(): string | null {\n return this.sessionToken;\n }\n\n getRefreshToken(): string | null {\n return this.refreshToken;\n }\n\n isAuthenticated(): boolean {\n return this.sessionToken !== null;\n }\n\n async setSession(args: {\n appUserId: string;\n sessionToken: string;\n refreshToken: string;\n expiresAt: string;\n }): Promise<void> {\n this.appUserId = args.appUserId;\n this.sessionToken = args.sessionToken;\n this.refreshToken = args.refreshToken;\n this.expiresAt = args.expiresAt;\n await this.flush();\n }\n\n async clearSession(rotateAnonymousId: boolean): Promise<void> {\n this.appUserId = null;\n this.sessionToken = null;\n this.refreshToken = null;\n this.expiresAt = null;\n if (rotateAnonymousId) {\n this.anonymousId = uuidv4();\n }\n await this.flush();\n }\n\n private async flush(): Promise<void> {\n const payload: PersistedIdentity = {\n anonymous_id: this.anonymousId,\n app_user_id: this.appUserId,\n session_token: this.sessionToken,\n refresh_token: this.refreshToken,\n expires_at: this.expiresAt,\n };\n await this.persistence.write(IDENTITY_KEY, JSON.stringify(payload));\n }\n}\n\nfunction freshSeed(): PersistedIdentity {\n return {\n anonymous_id: uuidv4(),\n app_user_id: null,\n session_token: null,\n refresh_token: null,\n expires_at: null,\n };\n}\n","/**\n * @layers/amba-react-native — React Native SDK for amba.\n *\n * Pure-JS implementation: the SDK is now a thin client over `fetch`\n * plus AsyncStorage-backed identity. No native modules, no WASM\n * dependency. The native SDKs (Swift/Kotlin/Flutter/Unity via the\n * shared runtime) keep their UniFFI bindings; this RN SDK aligns\n * with how Firebase/Supabase/PostHog ship to JS runtimes — pure\n * fetch-over-HTTP.\n *\n * @example\n * ```tsx\n * import { Amba } from '@layers/amba-react-native';\n *\n * await Amba.configure({ projectId: 'proj_...', clientKey: 'amba_ck_...' });\n * await Amba.auth.signInAnonymously();\n * await Amba.events.track('app_opened');\n *\n * // Push registration with a token from expo-notifications:\n * import * as Notifications from 'expo-notifications';\n * const { data: token } = await Notifications.getDevicePushTokenAsync();\n * await Amba.push.register(token, 'apns'); // or 'fcm' on Android\n * ```\n */\n\nexport type * from \"./types\";\nimport type {\n AmbaConfig,\n AuthResult,\n User,\n FindOptions,\n FindResponse,\n Filter,\n FilterValue,\n ConfigBundle,\n FlagAssignment,\n UserEntitlement,\n MediaAsset,\n PresignData,\n PushPlatform,\n PushToken,\n AiMessageRequest,\n AiMessageResponse,\n SocialProvider,\n Session,\n Achievement,\n AchievementProgress,\n Challenge,\n ChallengeProgress,\n CurrencyBalance,\n CurrencyTransaction,\n InventoryItem,\n PurchaseRequest,\n ConsumeRequest,\n Leaderboard,\n LeaderboardEntry,\n Store,\n PurchaseOption,\n PurchaseResult,\n XpBalance,\n XpTransaction,\n Streak,\n FeedResponse,\n Friendship,\n Group,\n GroupMember,\n GroupCreate,\n GroupUpdate,\n Conversation,\n Message,\n SendMessageRequest,\n CreateConversationRequest,\n ListMessagesOptions,\n MarkReadResult,\n Report,\n ReportRequest,\n ReferralCode,\n ReferralClaim,\n Review,\n ReviewCreate,\n ReviewUpdate,\n Role,\n CatalogItem,\n ContentItem,\n DeepLink,\n DeepLinkCreate,\n OnboardingStatus,\n} from \"./types\";\n\nimport { AsyncStoragePersistence } from \"./async-storage-adapter.js\";\nimport { AmbaApiError } from \"./error.js\";\nimport { AmbaHttpClient, DEFAULT_BASE_URL, mapHttpError } from \"./http-client.js\";\nimport type { Envelope } from \"./http-client.js\";\nimport { IdentityStore } from \"./identity.js\";\n\nexport { AmbaApiError } from \"./error.js\";\nexport type { AmbaApiErrorCode } from \"./error.js\";\n\n/** SDK semver — burned in at build time. Bump alongside package.json. */\nexport const SDK_VERSION = \"3.0.0\";\n\n// ── internal state ──────────────────────────────────────────────────\n\ninterface RuntimeState {\n http: AmbaHttpClient;\n identity: IdentityStore;\n debug: boolean;\n projectId: string;\n}\n\nlet state: RuntimeState | null = null;\n\nfunction getState(): RuntimeState {\n if (!state) {\n throw new AmbaApiError(\n \"NOT_INITIALIZED\",\n \"@layers/amba-react-native: SDK not configured. Call Amba.configure({ projectId, clientKey }) at app start.\",\n );\n }\n return state;\n}\n\n// ── auth state pub/sub ──────────────────────────────────────────────\n\ntype AuthSubscriber = (session: Session | null) => void;\nconst authSubscribers = new Set<AuthSubscriber>();\n\nfunction snapshotSession(user: User | null): Session | null {\n if (!user) return null;\n return {\n sessionToken: \"\",\n refreshToken: \"\",\n user,\n expiresAt: \"\",\n };\n}\n\nfunction notifyAuthSubscribers(session: Session | null): void {\n for (const cb of authSubscribers) {\n try {\n cb(session);\n } catch (err) {\n if (typeof console !== \"undefined\") {\n console.error(\"[amba] onAuthStateChange callback threw\", err);\n }\n }\n }\n}\n\nasync function notifyFromAuthResult(result: AuthResult): Promise<void> {\n notifyAuthSubscribers(snapshotSession(result.user));\n}\n\n// ── persist-on-auth helpers ─────────────────────────────────────────\n\nfunction expiresAtFromResult(result: AuthResult): string {\n if (result.expires_at && typeof result.expires_at === \"string\")\n return result.expires_at;\n // Default 1h session lifetime — matches the Rust core's contract\n // when the server omits `expires_at`.\n return new Date(Date.now() + 3600 * 1000).toISOString();\n}\n\nasync function persistAuthResult(\n state_: RuntimeState,\n result: AuthResult,\n): Promise<void> {\n await state_.identity.setSession({\n appUserId: result.user.id,\n sessionToken: result.session_token,\n refreshToken: result.refresh_token,\n expiresAt: expiresAtFromResult(result),\n });\n}\n\ninterface AuthEnvelope {\n data: AuthResult;\n}\n\nasync function postAuth(\n state_: RuntimeState,\n path: string,\n body: unknown,\n): Promise<AuthResult> {\n const env = await state_.http.post<AuthEnvelope>(path, body);\n const result = env.data;\n await persistAuthResult(state_, result);\n await notifyFromAuthResult(result);\n return result;\n}\n\n// ── light client-side validation (mirrors Rust core) ────────────────\n\nfunction requireEmail(email: string): void {\n const trimmed = email.trim();\n if (trimmed === \"\")\n throw new AmbaApiError(\n \"VALIDATION_ERROR\",\n \"email must not be empty\",\n );\n if (!trimmed.includes(\"@\") || !trimmed.includes(\".\"))\n throw new AmbaApiError(\n \"VALIDATION_ERROR\",\n `email '${email}' is not a valid email address`,\n );\n}\nfunction requirePassword(password: string): void {\n if (password.length < 8)\n throw new AmbaApiError(\n \"VALIDATION_ERROR\",\n \"password must be at least 8 characters\",\n );\n}\n\n// ── path helpers (mirror Rust constants) ────────────────────────────\n\nconst P = {\n authAnonymous: \"/v1/client/auth/anonymous\",\n authEmailLogin: \"/v1/client/auth/email/login\",\n authEmailSignup: \"/v1/client/auth/email/signup\",\n authSocial: \"/v1/client/auth/social\",\n authRefresh: \"/v1/client/auth/refresh\",\n authLogout: \"/v1/client/auth/logout\",\n authMe: \"/v1/client/auth/me\",\n events: \"/v1/client/events\",\n collections: \"/v1/client/collections\",\n storage: \"/v1/client/media\",\n storagePresign: \"/v1/client/media/presign\",\n storageCommit: \"/v1/client/media/commit\",\n push: \"/v1/client/push\",\n pushRegister: \"/v1/client/push/register\",\n pushUnregister: \"/v1/client/push/unregister\",\n pushTokens: \"/v1/client/push/tokens\",\n pushSubscribe: \"/v1/client/push/subscribe\",\n pushUnsubscribe: \"/v1/client/push/unsubscribe\",\n entitlements: \"/v1/client/entitlements\",\n aiAnthropic: \"/v1/client/ai/anthropic/messages\",\n config: \"/v1/client/config\",\n flags: \"/v1/client/flags\",\n achievements: \"/v1/client/achievements\",\n challenges: \"/v1/client/challenges\",\n catalog: \"/v1/client/catalog\",\n currencies: \"/v1/client/currencies\",\n inventory: \"/v1/client/inventory\",\n leaderboards: \"/v1/client/leaderboards\",\n stores: \"/v1/client/stores\",\n xp: \"/v1/client/xp\",\n streaks: \"/v1/client/streaks\",\n feeds: \"/v1/client/feeds\",\n friends: \"/v1/client/friends\",\n groups: \"/v1/client/groups\",\n messaging: \"/v1/client/messaging\",\n moderation: \"/v1/client/moderation\",\n reviews: \"/v1/client/reviews\",\n roles: \"/v1/client/roles\",\n referrals: \"/v1/client/referrals\",\n content: \"/v1/client/content\",\n deepLinks: \"/v1/client/deep-links\",\n onboarding: \"/v1/client/onboarding\",\n};\n\nfunction encodePathSegment(s: string): string {\n return encodeURIComponent(s);\n}\n\n// ── public API ──────────────────────────────────────────────────────\n\n/**\n * Top-level SDK namespace for React Native.\n */\nexport const Amba = {\n configure: async (config: AmbaConfig): Promise<void> => {\n if (!config.projectId || config.projectId.trim() === \"\") {\n throw new Error(\"Amba.configure: projectId is required\");\n }\n if (!config.clientKey || config.clientKey.trim() === \"\") {\n throw new Error(\"Amba.configure: clientKey is required\");\n }\n const persistence = new AsyncStoragePersistence(\n config.storagePrefix ?? \"amba\",\n );\n await persistence.hydrate();\n const identity = await IdentityStore.create(persistence);\n\n const baseUrl = (config.apiUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const wrapperVersion = `amba-react-native/${SDK_VERSION}`;\n const sdkVersionHeader = `amba-sdk/${SDK_VERSION} ${wrapperVersion}`;\n const http = new AmbaHttpClient({\n apiKey: config.clientKey,\n baseUrl,\n sdkPlatform: \"react-native\",\n sdkVersionHeader,\n identity,\n });\n state = { http, identity, debug: config.debug ?? false, projectId: config.projectId };\n },\n\n /**\n * Test-only hook to reset the singleton between tests. Not part of\n * the customer-facing surface; the production SDK uses\n * `Amba.auth.signOut(true)` to fully reset identity.\n * @internal\n */\n _reset: (): void => {\n state = null;\n authSubscribers.clear();\n },\n\n get anonymousId(): string {\n return getState().identity.getAnonymousId();\n },\n get appUserId(): string | undefined {\n return getState().identity.getAppUserId() ?? undefined;\n },\n get isAuthenticated(): boolean {\n return getState().identity.isAuthenticated();\n },\n get projectId(): string {\n return getState().projectId;\n },\n setDebug: (enabled: boolean): void => {\n getState().debug = enabled;\n },\n\n events: {\n track: async (\n event: string,\n properties?: Record<string, unknown>,\n ): Promise<void> => {\n const s = getState();\n // POST /v1/client/events accepts a single event or a batch.\n // Single-shape: { name, properties?, anonymous_id?, timestamp? }\n await s.http.post(P.events, {\n name: event,\n properties: properties ?? undefined,\n anonymous_id: s.identity.getAnonymousId(),\n timestamp: new Date().toISOString(),\n });\n },\n },\n\n auth: {\n signInAnonymously: async (): Promise<AuthResult> => {\n const s = getState();\n // Send the SDK's current anonymous_id so the server can either\n // attach to the existing app_user (no MAU charge) or mint a new\n // one. See DX-2.\n return postAuth(s, P.authAnonymous, {\n anonymous_id: s.identity.getAnonymousId(),\n });\n },\n signInWithEmail: async (\n email: string,\n password: string,\n ): Promise<AuthResult> => {\n requireEmail(email);\n if (password === \"\")\n throw new AmbaApiError(\n \"VALIDATION_ERROR\",\n \"password must not be empty\",\n );\n return postAuth(getState(), P.authEmailLogin, { email, password });\n },\n signUpWithEmail: async (\n email: string,\n password: string,\n ): Promise<AuthResult> => {\n requireEmail(email);\n requirePassword(password);\n return postAuth(getState(), P.authEmailSignup, { email, password });\n },\n signInWithSocial: async (\n provider: SocialProvider,\n idToken: string,\n ): Promise<AuthResult> => {\n if (idToken.trim() === \"\")\n throw new AmbaApiError(\n \"VALIDATION_ERROR\",\n \"id_token must not be empty\",\n );\n return postAuth(getState(), P.authSocial, {\n provider,\n id_token: idToken,\n });\n },\n signOut: async (rotateAnonymousId = false): Promise<void> => {\n const s = getState();\n if (s.identity.getSessionToken()) {\n try {\n await s.http.post(P.authLogout, {});\n } catch (err) {\n // Best-effort: a server-side rejection should not trap the\n // user offline. Mirrors the Rust core's behaviour.\n if (typeof console !== \"undefined\") {\n console.warn(\"[amba] signOut server call failed\", err);\n }\n }\n }\n await s.identity.clearSession(rotateAnonymousId);\n notifyAuthSubscribers(null);\n },\n refresh: async (): Promise<AuthResult> => {\n const s = getState();\n const refreshToken = s.identity.getRefreshToken();\n if (!refreshToken)\n throw new AmbaApiError(\n \"UNAUTHORIZED\",\n \"no refresh token available — call signIn* first\",\n );\n return postAuth(s, P.authRefresh, { refresh_token: refreshToken });\n },\n me: async (): Promise<User> => {\n const s = getState();\n if (!s.identity.getSessionToken())\n throw new AmbaApiError(\n \"UNAUTHORIZED\",\n \"no active session — call signIn* first\",\n );\n const env = await s.http.get<Envelope<User>>(P.authMe);\n return env.data;\n },\n\n getSession: async (): Promise<Session | null> => {\n const s = getState();\n if (!s.identity.isAuthenticated()) return null;\n const env = await s.http.get<Envelope<User>>(P.authMe);\n return snapshotSession(env.data);\n },\n\n getAnonymousId: async (): Promise<string> => {\n return getState().identity.getAnonymousId();\n },\n\n onAuthStateChange: (\n cb: (session: Session | null) => void,\n ): (() => void) => {\n authSubscribers.add(cb);\n return () => {\n authSubscribers.delete(cb);\n };\n },\n },\n\n collections: {\n find: async <T = unknown>(\n name: string,\n options: FindOptions = {},\n ): Promise<FindResponse<T>> => {\n const s = getState();\n // Server returns `{ data, next_cursor, has_more }` for find —\n // the FindResponse shape matches the envelope directly.\n return s.http.post<FindResponse<T>>(\n `${P.collections}/${encodePathSegment(name)}/find`,\n options,\n );\n },\n findOne: async <T = unknown>(name: string, id: string): Promise<T> => {\n const s = getState();\n const env = await s.http.get<Envelope<T>>(\n `${P.collections}/${encodePathSegment(name)}/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n insert: async <T = unknown>(\n name: string,\n row: Record<string, unknown>,\n ): Promise<T> => {\n const s = getState();\n const env = await s.http.post<Envelope<T>>(\n `${P.collections}/${encodePathSegment(name)}`,\n row,\n );\n return env.data;\n },\n update: async <T = unknown>(\n name: string,\n id: string,\n set: Record<string, unknown>,\n ): Promise<T> => {\n const s = getState();\n const env = await s.http.patch<Envelope<T>>(\n `${P.collections}/${encodePathSegment(name)}/${encodePathSegment(id)}`,\n { set },\n );\n return env.data;\n },\n delete: async (\n name: string,\n id: string,\n ): Promise<{ data: { deleted: boolean } }> => {\n const s = getState();\n const result = await s.http.delete<{ data: { deleted: boolean } } | null>(\n `${P.collections}/${encodePathSegment(name)}/${encodePathSegment(id)}`,\n );\n // 204 No Content path — synthesise a `{ data: { deleted: true } }`\n // envelope so consumers can branch uniformly.\n return result ?? { data: { deleted: true } };\n },\n where: {\n eq: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"eq\",\n value,\n }),\n ne: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"ne\",\n value,\n }),\n gt: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"gt\",\n value,\n }),\n gte: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"gte\",\n value,\n }),\n lt: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"lt\",\n value,\n }),\n lte: (column: string, value: FilterValue): Filter => ({\n column,\n op: \"lte\",\n value,\n }),\n in: (column: string, values: FilterValue[]): Filter => ({\n column,\n op: \"in\",\n value: values,\n }),\n notIn: (column: string, values: FilterValue[]): Filter => ({\n column,\n op: \"not_in\",\n value: values,\n }),\n like: (column: string, pattern: string): Filter => ({\n column,\n op: \"like\",\n value: pattern,\n }),\n ilike: (column: string, pattern: string): Filter => ({\n column,\n op: \"ilike\",\n value: pattern,\n }),\n isNull: (column: string): Filter => ({ column, op: \"is_null\" }),\n isNotNull: (column: string): Filter => ({ column, op: \"is_not_null\" }),\n and: (...filters: Filter[]): Filter => ({ and: filters }),\n or: (...filters: Filter[]): Filter => ({ or: filters }),\n not: (filter: Filter): Filter => ({ not: filter }),\n },\n },\n\n storage: {\n presign: async (params: {\n bucket: string;\n filename: string;\n mimeType: string;\n sizeBytes: number;\n retentionDays?: number;\n }): Promise<PresignData> => {\n const s = getState();\n const env = await s.http.post<Envelope<PresignData>>(P.storagePresign, {\n bucket: params.bucket,\n filename: params.filename,\n mime_type: params.mimeType,\n size_bytes: params.sizeBytes,\n retention_days: params.retentionDays,\n });\n return env.data;\n },\n commit: async (uploadId: string, assetId: string): Promise<MediaAsset> => {\n const s = getState();\n const env = await s.http.post<Envelope<MediaAsset>>(P.storageCommit, {\n upload_id: uploadId,\n asset_id: assetId,\n });\n return env.data;\n },\n },\n\n push: {\n register: async (\n token: string,\n platform: PushPlatform,\n bundleId?: string,\n ): Promise<PushToken> => {\n const s = getState();\n const env = await s.http.post<Envelope<PushToken>>(P.pushRegister, {\n token,\n platform,\n bundle_id: bundleId,\n });\n return env.data;\n },\n unregister: async (token: string): Promise<void> => {\n await getState().http.post(P.pushUnregister, { token });\n },\n getTokens: async (): Promise<PushToken[]> => {\n const env = await getState().http.get<Envelope<PushToken[]>>(\n P.pushTokens,\n );\n return env.data;\n },\n subscribe: async (topic: string): Promise<void> => {\n await getState().http.post(P.pushSubscribe, { topic });\n },\n unsubscribe: async (topic: string): Promise<void> => {\n await getState().http.post(P.pushUnsubscribe, { topic });\n },\n },\n\n entitlements: {\n list: async (): Promise<UserEntitlement[]> => {\n const env = await getState().http.get<Envelope<UserEntitlement[]>>(\n P.entitlements,\n );\n return env.data;\n },\n has: async (name: string): Promise<boolean> => {\n const env = await getState().http.get<Envelope<UserEntitlement[]>>(\n P.entitlements,\n { active_only: \"true\" },\n );\n return env.data.some((e) => e.name === name && e.is_active);\n },\n },\n\n ai: {\n anthropic: {\n messages: {\n create: async (\n request: AiMessageRequest,\n ): Promise<AiMessageResponse> => {\n const env = await getState().http.post<Envelope<AiMessageResponse>>(\n P.aiAnthropic,\n request,\n );\n return env.data;\n },\n },\n },\n },\n\n config: {\n fetch: async (): Promise<ConfigBundle> => {\n const s = getState();\n // Config returns `{ data: Record<string, unknown> }` plus an\n // `ETag` header that carries the version stamp.\n const url = s.http.url(P.config);\n const headers = s.http.buildHeaders();\n let response: Response;\n try {\n response = await (globalThis.fetch ?? fetch)(url, {\n method: \"GET\",\n headers,\n });\n } catch (err) {\n throw new AmbaApiError(\n \"NETWORK_ERROR\",\n `Network error: ${err instanceof Error ? err.message : String(err)}`,\n err,\n );\n }\n const text = await response.text();\n if (!response.ok) {\n const ct = response.headers.get(\"content-type\") ?? \"\";\n throw mapHttpError(response, text, ct.includes(\"application/json\"));\n }\n let parsed: { data?: Record<string, unknown> } = {};\n if (text) {\n try {\n parsed = JSON.parse(text);\n } catch {\n parsed = {};\n }\n }\n const etag = response.headers.get(\"etag\");\n // ETag format: `\"vN-...\"` — strip quotes then take the leading\n // `vN` prefix as the version stamp.\n let version: string | null = null;\n if (etag) {\n const cleaned = etag.replace(/^\"|\"$/g, \"\");\n const m = cleaned.match(/^(v\\d+)/);\n version = m ? (m[1] ?? null) : cleaned || null;\n }\n return {\n version,\n values: parsed.data ?? {},\n };\n },\n },\n\n flags: {\n fetch: async (): Promise<FlagAssignment[]> => {\n const env = await getState().http.get<Envelope<FlagAssignment[]>>(P.flags);\n return env.data;\n },\n },\n\n // ── Gamification ──────────────────────────────────────────────────\n\n achievements: {\n getAll: async (): Promise<Achievement[]> => {\n const env = await getState().http.get<Envelope<Achievement[]>>(\n P.achievements,\n );\n return env.data;\n },\n getProgress: async (): Promise<AchievementProgress[]> => {\n const env = await getState().http.get<Envelope<AchievementProgress[]>>(\n `${P.achievements}/progress`,\n );\n return env.data;\n },\n },\n\n challenges: {\n getActive: async (): Promise<Challenge[]> => {\n const env = await getState().http.get<Envelope<Challenge[]>>(\n `${P.challenges}/active`,\n );\n return env.data;\n },\n get: async (id: string): Promise<Challenge> => {\n const env = await getState().http.get<Envelope<Challenge>>(\n `${P.challenges}/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n getProgress: async (id: string): Promise<ChallengeProgress> => {\n const env = await getState().http.get<Envelope<ChallengeProgress>>(\n `${P.challenges}/${encodePathSegment(id)}/progress`,\n );\n return env.data;\n },\n claim: async (id: string): Promise<ChallengeProgress> => {\n const env = await getState().http.post<Envelope<ChallengeProgress>>(\n `${P.challenges}/${encodePathSegment(id)}/claim`,\n {},\n );\n return env.data;\n },\n },\n\n currencies: {\n getBalance: async (): Promise<CurrencyBalance[]> => {\n const env = await getState().http.get<Envelope<CurrencyBalance[]>>(\n P.currencies,\n );\n return env.data;\n },\n getTransactions: async (\n currencyKey: string,\n ): Promise<CurrencyTransaction[]> => {\n // Server route is `GET /currencies/transactions?currency_code=<key>`\n // — the key is a query param, not a path segment. DX-33 fix.\n const env = await getState().http.get<Envelope<CurrencyTransaction[]>>(\n `${P.currencies}/transactions`,\n { currency_code: currencyKey },\n );\n return env.data;\n },\n },\n\n inventory: {\n getItems: async (): Promise<InventoryItem[]> => {\n const env = await getState().http.get<Envelope<InventoryItem[]>>(\n P.inventory,\n );\n return env.data;\n },\n getItem: async (id: string): Promise<InventoryItem> => {\n const env = await getState().http.get<Envelope<InventoryItem>>(\n `${P.inventory}/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n purchase: async (request: PurchaseRequest): Promise<InventoryItem> => {\n const env = await getState().http.post<Envelope<InventoryItem>>(\n `${P.inventory}/purchase`,\n request,\n );\n return env.data;\n },\n consume: async (request: ConsumeRequest): Promise<InventoryItem> => {\n // Server route is `POST /v1/client/inventory/:itemId/consume`. The\n // item id moves into the path; only `quantity` stays in the body.\n // DX-36 fix.\n const { item_id, ...body } = request;\n const env = await getState().http.post<Envelope<InventoryItem>>(\n `${P.inventory}/${encodePathSegment(item_id)}/consume`,\n body,\n );\n return env.data;\n },\n },\n\n leaderboards: {\n get: async (key: string): Promise<Leaderboard> => {\n const env = await getState().http.get<Envelope<Leaderboard>>(\n `${P.leaderboards}/${encodePathSegment(key)}`,\n );\n return env.data;\n },\n getEntries: async (\n key: string,\n limit?: number,\n ): Promise<LeaderboardEntry[]> => {\n const env = await getState().http.get<Envelope<LeaderboardEntry[]>>(\n `${P.leaderboards}/${encodePathSegment(key)}/entries`,\n limit !== undefined ? { limit } : undefined,\n );\n return env.data;\n },\n getMyRank: async (key: string): Promise<LeaderboardEntry> => {\n const env = await getState().http.get<Envelope<LeaderboardEntry>>(\n `${P.leaderboards}/${encodePathSegment(key)}/me`,\n );\n return env.data;\n },\n },\n\n stores: {\n list: async (): Promise<Store[]> => {\n const env = await getState().http.get<Envelope<Store[]>>(P.stores);\n return env.data;\n },\n getPurchaseOptions: async (\n storeKey: string,\n ): Promise<PurchaseOption[]> => {\n const env = await getState().http.get<Envelope<PurchaseOption[]>>(\n `${P.stores}/${encodePathSegment(storeKey)}/options`,\n );\n return env.data;\n },\n purchase: async (\n storeKey: string,\n purchaseOptionId: string,\n receipt: unknown,\n ): Promise<PurchaseResult> => {\n // `undefined` doesn't survive JSON.stringify (it's omitted from\n // the object, leaving the server's body as if `receipt` was\n // never sent). For symmetry with the web SDK fix, default the\n // missing-receipt case to an empty object so the server sees a\n // valid `{ purchase_option_id, receipt: {} }` body (BugBot Low\n // 2026-05-19).\n const env = await getState().http.post<Envelope<PurchaseResult>>(\n `${P.stores}/${encodePathSegment(storeKey)}/purchase`,\n { purchase_option_id: purchaseOptionId, receipt: receipt ?? {} },\n );\n return env.data;\n },\n },\n\n xp: {\n getBalance: async (): Promise<XpBalance> => {\n const env = await getState().http.get<Envelope<XpBalance>>(P.xp);\n return env.data;\n },\n getHistory: async (limit?: number): Promise<XpTransaction[]> => {\n const env = await getState().http.get<Envelope<XpTransaction[]>>(\n `${P.xp}/history`,\n limit !== undefined ? { limit } : undefined,\n );\n return env.data;\n },\n claim: async (grantKey: string): Promise<XpTransaction> => {\n const env = await getState().http.post<Envelope<XpTransaction>>(\n `${P.xp}/claim`,\n { grant_key: grantKey },\n );\n return env.data;\n },\n },\n\n streaks: {\n getAll: async (): Promise<Streak[]> => {\n const env = await getState().http.get<Envelope<Streak[]>>(P.streaks);\n return env.data;\n },\n qualify: async (streakKey: string): Promise<Streak> => {\n const env = await getState().http.post<Envelope<Streak>>(\n `${P.streaks}/${encodePathSegment(streakKey)}/qualify`,\n {},\n );\n return env.data;\n },\n },\n\n // ── Social ─────────────────────────────────────────────────────────\n\n feeds: {\n getActivity: async (\n feed?: string,\n cursor?: string,\n ): Promise<FeedResponse> => {\n const f = feed ?? \"default\";\n return getState().http.get<FeedResponse>(\n `${P.feeds}/${encodePathSegment(f)}`,\n cursor ? { cursor } : undefined,\n );\n },\n },\n\n friends: {\n getList: async (): Promise<Friendship[]> => {\n const env = await getState().http.get<Envelope<Friendship[]>>(\n P.friends,\n );\n return env.data;\n },\n getFriends: async (): Promise<Friendship[]> => {\n const env = await getState().http.get<Envelope<Friendship[]>>(\n P.friends,\n { state: \"accepted\" },\n );\n return env.data;\n },\n blockUser: async (userId: string): Promise<Friendship> => {\n const env = await getState().http.post<Envelope<Friendship>>(\n `${P.friends}/block`,\n { user_id: userId },\n );\n return env.data;\n },\n unblockUser: async (userId: string): Promise<void> => {\n await getState().http.post(`${P.friends}/unblock`, { user_id: userId });\n },\n removeBlock: async (friendshipId: string): Promise<void> => {\n await getState().http.delete(\n `${P.friends}/${encodePathSegment(friendshipId)}`,\n );\n },\n },\n\n groups: {\n create: async (params: GroupCreate): Promise<Group> => {\n const env = await getState().http.post<Envelope<Group>>(P.groups, params);\n return env.data;\n },\n get: async (id: string): Promise<Group> => {\n const env = await getState().http.get<Envelope<Group>>(\n `${P.groups}/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n update: async (id: string, patch: GroupUpdate): Promise<Group> => {\n const env = await getState().http.patch<Envelope<Group>>(\n `${P.groups}/${encodePathSegment(id)}`,\n patch,\n );\n return env.data;\n },\n delete: async (id: string): Promise<void> => {\n await getState().http.delete(`${P.groups}/${encodePathSegment(id)}`);\n },\n getMembers: async (id: string): Promise<GroupMember[]> => {\n const env = await getState().http.get<Envelope<GroupMember[]>>(\n `${P.groups}/${encodePathSegment(id)}/members`,\n );\n return env.data;\n },\n join: async (id: string): Promise<GroupMember> => {\n const env = await getState().http.post<Envelope<GroupMember>>(\n `${P.groups}/${encodePathSegment(id)}/join`,\n {},\n );\n return env.data;\n },\n leave: async (id: string): Promise<void> => {\n await getState().http.post(\n `${P.groups}/${encodePathSegment(id)}/leave`,\n {},\n );\n },\n invite: async (id: string, userId: string): Promise<GroupMember> => {\n const env = await getState().http.post<Envelope<GroupMember>>(\n `${P.groups}/${encodePathSegment(id)}/invite`,\n { user_id: userId },\n );\n return env.data;\n },\n },\n\n /**\n * User-to-user direct messaging. Task #62 corrected the path\n * constants — `sendMessage` previously POSTed to\n * `/v1/client/messaging/messages`, which the API doesn't serve.\n * The real route is `/v1/client/messaging/conversations/:id/messages`.\n */\n messaging: {\n /**\n * `POST /v1/client/messaging/conversations` — create (or fetch\n * the existing direct) conversation. Idempotent for direct\n * conversations between two users.\n */\n createConversation: async (\n request: CreateConversationRequest,\n ): Promise<Conversation> => {\n const env = await getState().http.post<Envelope<Conversation>>(\n `${P.messaging}/conversations`,\n request,\n );\n return env.data;\n },\n getConversations: async (): Promise<Conversation[]> => {\n const env = await getState().http.get<Envelope<Conversation[]>>(\n `${P.messaging}/conversations`,\n );\n return env.data;\n },\n /** Alias matching the `listX` naming convention used elsewhere. */\n listConversations: async (): Promise<Conversation[]> => {\n const env = await getState().http.get<Envelope<Conversation[]>>(\n `${P.messaging}/conversations`,\n );\n return env.data;\n },\n sendMessage: async (\n conversationId: string,\n request: SendMessageRequest,\n ): Promise<Message> => {\n const env = await getState().http.post<Envelope<Message>>(\n `${P.messaging}/conversations/${encodePathSegment(conversationId)}/messages`,\n request,\n );\n return env.data;\n },\n listMessages: async (\n conversationId: string,\n opts?: ListMessagesOptions,\n ): Promise<Message[]> => {\n const query: Record<string, number | undefined> = {};\n if (opts?.limit !== undefined) query.limit = opts.limit;\n if (opts?.offset !== undefined) query.offset = opts.offset;\n const env = await getState().http.get<Envelope<Message[]>>(\n `${P.messaging}/conversations/${encodePathSegment(conversationId)}/messages`,\n Object.keys(query).length > 0 ? query : undefined,\n );\n return env.data;\n },\n markRead: async (conversationId: string): Promise<MarkReadResult> => {\n const env = await getState().http.post<Envelope<MarkReadResult>>(\n `${P.messaging}/conversations/${encodePathSegment(conversationId)}/read`,\n {},\n );\n return env.data;\n },\n },\n\n moderation: {\n reportUser: async (request: ReportRequest): Promise<Report> => {\n const env = await getState().http.post<Envelope<Report>>(\n `${P.moderation}/reports/users`,\n request,\n );\n return env.data;\n },\n reportContent: async (request: ReportRequest): Promise<Report> => {\n const env = await getState().http.post<Envelope<Report>>(\n `${P.moderation}/reports/content`,\n request,\n );\n return env.data;\n },\n getReportStatus: async (id: string): Promise<Report> => {\n const env = await getState().http.get<Envelope<Report>>(\n `${P.moderation}/reports/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n },\n\n reviews: {\n list: async (\n targetType: string,\n targetId: string,\n ): Promise<Review[]> => {\n const env = await getState().http.get<Envelope<Review[]>>(P.reviews, {\n target_type: targetType,\n target_id: targetId,\n });\n return env.data;\n },\n create: async (params: ReviewCreate): Promise<Review> => {\n const env = await getState().http.post<Envelope<Review>>(P.reviews, params);\n return env.data;\n },\n update: async (id: string, patch: ReviewUpdate): Promise<Review> => {\n const env = await getState().http.patch<Envelope<Review>>(\n `${P.reviews}/${encodePathSegment(id)}`,\n patch,\n );\n return env.data;\n },\n delete: async (id: string): Promise<void> => {\n await getState().http.delete(`${P.reviews}/${encodePathSegment(id)}`);\n },\n },\n\n roles: {\n getMyRoles: async (): Promise<Role[]> => {\n const env = await getState().http.get<Envelope<Role[]>>(\n `${P.roles}/me`,\n );\n return env.data;\n },\n hasPermission: async (permission: string): Promise<boolean> => {\n const env = await getState().http.get<Envelope<{ allowed: boolean }>>(\n `${P.roles}/check`,\n { permission },\n );\n return env.data.allowed === true;\n },\n },\n\n referrals: {\n getReferralCode: async (): Promise<ReferralCode> => {\n // Server route is `/v1/client/referrals/my-code` (DX-32 fix).\n const env = await getState().http.get<Envelope<ReferralCode>>(\n `${P.referrals}/my-code`,\n );\n return env.data;\n },\n claimReferral: async (code: string): Promise<ReferralClaim> => {\n const env = await getState().http.post<Envelope<ReferralClaim>>(\n `${P.referrals}/claim`,\n { code },\n );\n return env.data;\n },\n create: async (\n code?: string,\n maxUses?: number,\n ): Promise<ReferralCode> => {\n const body: Record<string, unknown> = {};\n if (code !== undefined) body.code = code;\n if (maxUses !== undefined) body.max_uses = maxUses;\n const env = await getState().http.post<Envelope<ReferralCode>>(\n P.referrals,\n body,\n );\n return env.data;\n },\n },\n\n // ── Lifecycle ──────────────────────────────────────────────────────\n\n catalog: {\n list: async (): Promise<CatalogItem[]> => {\n const env = await getState().http.get<Envelope<CatalogItem[]>>(\n P.catalog,\n );\n return env.data;\n },\n },\n\n content: {\n getToday: async (\n channel: string = \"default\",\n ): Promise<ContentItem | null> => {\n const env = await getState().http.get<Envelope<ContentItem | null>>(\n `${P.content}/today/${encodePathSegment(channel)}`,\n );\n return env.data ?? null;\n },\n getLibrary: async (\n channel: string = \"default\",\n options?: { limit?: number; cursor?: string },\n ): Promise<ContentItem[]> => {\n const env = await getState().http.get<Envelope<ContentItem[]>>(\n `${P.content}/library/${encodePathSegment(channel)}`,\n {\n limit: options?.limit,\n cursor: options?.cursor,\n },\n );\n return env.data;\n },\n getItem: async (id: string): Promise<ContentItem> => {\n const env = await getState().http.get<Envelope<ContentItem>>(\n `${P.content}/${encodePathSegment(id)}`,\n );\n return env.data;\n },\n updateItem: async (id: string, state_: unknown): Promise<ContentItem> => {\n const env = await getState().http.post<Envelope<ContentItem>>(\n `${P.content}/${encodePathSegment(id)}/state`,\n state_ as Record<string, unknown>,\n );\n return env.data;\n },\n createItem: async (\n channel: string,\n item: unknown,\n ): Promise<ContentItem> => {\n const env = await getState().http.post<Envelope<ContentItem>>(\n `${P.content}/${encodePathSegment(channel)}`,\n item as Record<string, unknown>,\n );\n return env.data;\n },\n },\n\n deepLinks: {\n get: async (shortCode: string): Promise<DeepLink> => {\n // Server route is `/v1/client/deep-links/resolve/:slug` — DX-42 fix.\n const env = await getState().http.get<Envelope<DeepLink>>(\n `${P.deepLinks}/resolve/${encodePathSegment(shortCode)}`,\n );\n return env.data;\n },\n create: async (params: DeepLinkCreate): Promise<DeepLink> => {\n const env = await getState().http.post<Envelope<DeepLink>>(\n P.deepLinks,\n params,\n );\n return env.data;\n },\n },\n\n onboarding: {\n getStatus: async (): Promise<OnboardingStatus> => {\n const env = await getState().http.get<Envelope<OnboardingStatus>>(\n P.onboarding,\n );\n return env.data;\n },\n nextStep: async (payload: unknown): Promise<OnboardingStatus> => {\n const env = await getState().http.post<Envelope<OnboardingStatus>>(\n `${P.onboarding}/next`,\n payload as Record<string, unknown>,\n );\n return env.data;\n },\n skipStep: async (): Promise<OnboardingStatus> => {\n const env = await getState().http.post<Envelope<OnboardingStatus>>(\n `${P.onboarding}/skip`,\n {},\n );\n return env.data;\n },\n complete: async (): Promise<OnboardingStatus> => {\n const env = await getState().http.post<Envelope<OnboardingStatus>>(\n `${P.onboarding}/complete`,\n {},\n );\n return env.data;\n },\n },\n\n /**\n * Developer utilities. Only available on sandbox-tier projects.\n *\n * These methods are safe to call from client-side code — they use the\n * project's client key, not an admin credential.\n */\n dev: {\n /**\n * Wipe all users and their associated data on a sandbox-tier project.\n *\n * Lets a developer's Settings or Account tab add a \"Reset\" button\n * without embedding an admin credential on the device. Rejects with\n * an `AmbaApiError` with `code: 'NOT_SANDBOX_TIER'` if the project\n * is not on a sandbox tier.\n */\n resetSandbox: async (): Promise<{ deleted: number }> => {\n const s = getState();\n const env = await s.http.post<Envelope<{ deleted: number }>>(\n \"/v1/client/dev/reset-sandbox\",\n {},\n );\n return env.data;\n },\n },\n};\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@layers/amba-react-native",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.3",
|
|
4
4
|
"description": "amba SDK for React Native — pure-JS HTTP client, full 25-namespace surface, secure on-device identity persistence, native push notifications.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|