@layers/amba-react-native 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs
CHANGED
|
@@ -148,7 +148,7 @@ async function notifyFromAuthResult(result) {
|
|
|
148
148
|
const Amba = {
|
|
149
149
|
configure: async (config) => {
|
|
150
150
|
if (!config.apiKey || config.apiKey.trim() === "") throw new Error("Amba.configure: apiKey is required");
|
|
151
|
-
const coreWasm = await import("@layers/amba-core
|
|
151
|
+
const coreWasm = await import("@layers/amba-core");
|
|
152
152
|
const init = coreWasm.default;
|
|
153
153
|
const AmbaCoreWasm = coreWasm.AmbaCoreWasm;
|
|
154
154
|
await init();
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["cachedStorage: AsyncStorageStatic | null","prefix: string","coreInstance: AmbaCoreWasmInstance | null"],"sources":["../src/async-storage-adapter.ts","../src/error.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 Rust core's persistence trait. Reads/writes go\n * through a per-prefix namespace so different amba projects can coexist\n * in the 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 Rust core gains a JS-side persistence bridge,\n // this will pre-load the identity record into memory so the WASM\n // core 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 (WASM JsError, native Error, plain objects) into a\n * 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, FFI, 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 | \"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. WASM JsError) → 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 WASM-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 * @layers/amba-react-native — React Native SDK for amba.\n *\n * Companion to `@layers/amba-web`. Same 25-namespace surface, but:\n * - Persists identity in `AsyncStorage` (peer-dep on\n * `@react-native-async-storage/async-storage`) so anonymous_id +\n * session_token survive app restarts.\n * - Push registration takes a native APNs/FCM token from the wrapper\n * layer (host app obtains it via `expo-notifications` or\n * `@react-native-firebase/messaging`).\n * - Sign-in flows expect identity tokens fetched by the host app via\n * `expo-apple-authentication` (Apple) or `expo-auth-session` /\n * `@react-native-google-signin/google-signin` (Google) — see README.\n *\n * Works in Expo Go AND bare React Native via the same WASM core.\n *\n * @example\n * ```tsx\n * import { Amba } from '@layers/amba-react-native';\n *\n * await Amba.configure({ apiKey: 'amba_pk_...' });\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\n// NOTE: `@layers/amba-core-wasm` is intentionally NOT statically imported.\n//\n// Reason (Task #69): this package ships both ESM (`dist/index.js`) and CJS\n// (`dist/index.cjs`) so Expo's autolinker — which `require()`s our entry\n// from a Node CJS context during `expo prebuild` — can resolve us. But\n// `@layers/amba-core-wasm` is ESM-only (no `require` export condition,\n// since it's `wasm-pack` ESM output). A top-level `import` of it would\n// be lowered to a top-level `require(\"@layers/amba-core-wasm\")` in our\n// CJS dist, and that `require()` would crash with\n// `ERR_PACKAGE_PATH_NOT_EXPORTED` the moment Expo autolinker loads us.\n//\n// Lazy-loading via dynamic `import()` (inside `configure()`) sidesteps\n// this: Expo's autolinker can `require()` our CJS entry and inspect\n// metadata without ever firing the WASM core load. Metro/RN at app\n// runtime still picks the ESM dist and the dynamic import resolves\n// normally.\ntype CoreWasmModule = typeof import(\"@layers/amba-core-wasm\");\n// `AmbaCoreWasm` declares a `private constructor()` (wasm-pack pattern),\n// so `InstanceType<typeof AmbaCoreWasm>` is rejected by TS as\n// \"Cannot assign a 'private' constructor type to a 'public' constructor\n// type\". Type the instance from the public static factory instead.\ntype AmbaCoreWasmInstance = ReturnType<CoreWasmModule[\"AmbaCoreWasm\"][\"init\"]>;\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 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 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\";\nimport { AmbaApiError, toAmbaApiError } from \"./error\";\nimport type { Session } from \"./types\";\n\nexport { AmbaApiError } from \"./error\";\nexport type { AmbaApiErrorCode } from \"./error\";\n\nlet coreInstance: AmbaCoreWasmInstance | null = null;\n\nfunction requireCore(): AmbaCoreWasmInstance {\n if (!coreInstance) {\n throw new AmbaApiError(\n \"NOT_INITIALIZED\",\n \"@layers/amba-react-native: SDK not configured. Call Amba.configure({ apiKey }) at app start.\",\n );\n }\n return coreInstance;\n}\n\n/**\n * Run a single WASM-core call and rewrap any thrown value into a\n * stable `AmbaApiError`. Mirrors the helper in `@layers/amba-web`.\n */\nasync function coreCall<T>(\n fn: (c: AmbaCoreWasmInstance) => Promise<T>,\n): Promise<T> {\n try {\n return await fn(requireCore());\n } catch (err) {\n throw toAmbaApiError(err);\n }\n}\n\n/**\n * In-SDK auth-state pub/sub. Mirrors the web SDK shape so\n * `Amba.auth.onAuthStateChange` works identically across packages.\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/**\n * Top-level SDK namespace for React Native.\n *\n * Differences from `@layers/amba-web`:\n * - `configure` is async (waits for WASM init AND AsyncStorage hydration).\n * - Persistence is AsyncStorage-backed — identity survives app restarts.\n */\nexport const Amba = {\n configure: async (config: AmbaConfig): Promise<void> => {\n if (!config.apiKey || config.apiKey.trim() === \"\") {\n throw new Error(\"Amba.configure: apiKey is required\");\n }\n // Lazy-load the WASM core. See the top-of-file note on Task #69:\n // a static `import` would lower to a top-level `require()` in the\n // CJS dist, which crashes Expo's autolinker because core-wasm is\n // ESM-only. Dynamic import works from both ESM and CJS contexts.\n const coreWasm = await import(\"@layers/amba-core-wasm\");\n const init = coreWasm.default;\n const AmbaCoreWasm = coreWasm.AmbaCoreWasm;\n\n await init();\n const persistence = new AsyncStoragePersistence(\n config.storagePrefix ?? \"amba\",\n );\n await persistence.hydrate();\n\n coreInstance = AmbaCoreWasm.init(\n JSON.stringify({\n api_key: config.apiKey,\n base_url: config.baseUrl,\n sdk_platform: \"react-native\",\n sdk_wrapper_version: `amba-react-native/${SDK_VERSION}`,\n consent_required: config.consentRequired,\n debug: config.debug,\n }),\n globalThis.fetch.bind(globalThis),\n );\n },\n\n get anonymousId(): string {\n return requireCore().anonymousId();\n },\n get appUserId(): string | undefined {\n return requireCore().appUserId() ?? undefined;\n },\n get isAuthenticated(): boolean {\n return requireCore().isAuthenticated();\n },\n setDebug: (enabled: boolean): void => {\n requireCore().setDebug(enabled);\n },\n\n events: {\n track: async (\n event: string,\n properties?: Record<string, unknown>,\n ): Promise<void> => {\n await coreCall((c) => c.track(\n event,\n properties ? JSON.stringify(properties) : undefined,\n ));\n },\n },\n\n auth: {\n signInAnonymously: async (): Promise<AuthResult> => {\n const r = (await coreCall((c) => c.signInAnonymously())) as AuthResult;\n await notifyFromAuthResult(r);\n return r;\n },\n signInWithEmail: async (\n email: string,\n password: string,\n ): Promise<AuthResult> => {\n const r = (await coreCall((c) =>\n c.signInWithEmail(email, password),\n )) as AuthResult;\n await notifyFromAuthResult(r);\n return r;\n },\n signUpWithEmail: async (\n email: string,\n password: string,\n ): Promise<AuthResult> => {\n const r = (await coreCall((c) =>\n c.signUpWithEmail(email, password),\n )) as AuthResult;\n await notifyFromAuthResult(r);\n return r;\n },\n /**\n * Sign in with an Apple / Google identity token. The host app obtains\n * the token via `expo-apple-authentication` or `expo-auth-session`.\n */\n signInWithSocial: async (\n provider: SocialProvider,\n idToken: string,\n ): Promise<AuthResult> => {\n const r = (await coreCall((c) =>\n c.signInWithSocial(provider, idToken),\n )) as AuthResult;\n await notifyFromAuthResult(r);\n return r;\n },\n signOut: async (rotateAnonymousId = false): Promise<void> => {\n await coreCall((c) => c.signOut(rotateAnonymousId));\n notifyAuthSubscribers(null);\n },\n refresh: async (): Promise<AuthResult> => {\n const r = (await coreCall((c) => c.refreshSession())) as AuthResult;\n await notifyFromAuthResult(r);\n return r;\n },\n me: async (): Promise<User> => (await coreCall((c) => c.me())) as User,\n\n /** Snapshot the current session, or null if not authenticated. */\n getSession: async (): Promise<Session | null> => {\n const core = requireCore();\n if (!core.isAuthenticated()) return null;\n const user = (await coreCall((c) => c.me())) as User;\n return snapshotSession(user);\n },\n\n /** Stable anonymous identifier. */\n getAnonymousId: async (): Promise<string> => {\n return requireCore().anonymousId();\n },\n\n /**\n * Subscribe to session changes. Fires after every signIn* / signUp* /\n * refresh / signOut. Returns an unsubscribe function.\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 (await coreCall((c) => c.collectionsFind(\n name,\n JSON.stringify(options),\n ))) as FindResponse<T>,\n findOne: async <T = unknown>(name: string, id: string): Promise<T> =>\n (await coreCall((c) => c.collectionsFindOne(name, id))) as T,\n insert: async <T = unknown>(\n name: string,\n row: Record<string, unknown>,\n ): Promise<T> =>\n (await coreCall((c) => c.collectionsInsert(name, JSON.stringify(row)))) as T,\n update: async <T = unknown>(\n name: string,\n id: string,\n set: Record<string, unknown>,\n ): Promise<T> =>\n (await coreCall((c) => c.collectionsUpdate(\n name,\n id,\n JSON.stringify(set),\n ))) as T,\n delete: async (\n name: string,\n id: string,\n ): Promise<{ data: { deleted: boolean } }> =>\n (await coreCall((c) => c.collectionsDelete(name, id))) as {\n data: { deleted: boolean };\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 (await coreCall((c) => c.storagePresign(\n params.bucket,\n params.filename,\n params.mimeType,\n params.sizeBytes,\n params.retentionDays,\n ))) as PresignData,\n commit: async (uploadId: string, assetId: string): Promise<MediaAsset> =>\n (await coreCall((c) => c.storageCommit(uploadId, assetId))) as MediaAsset,\n },\n\n push: {\n /**\n * Register a native push token. On iOS, pass the APNs token from\n * `expo-notifications` `getDevicePushTokenAsync()` with platform `'apns'`.\n * On Android, pass the FCM token with platform `'fcm'`.\n */\n register: async (\n token: string,\n platform: PushPlatform,\n bundleId?: string,\n ): Promise<PushToken> =>\n (await coreCall((c) => c.pushRegister(\n token,\n platform,\n bundleId,\n ))) as PushToken,\n unregister: async (token: string): Promise<void> => {\n await coreCall((c) => c.pushUnregister(token));\n },\n getTokens: async (): Promise<PushToken[]> =>\n (await coreCall((c) => c.pushGetTokens())) as PushToken[],\n subscribe: async (topic: string): Promise<void> => {\n await coreCall((c) => c.pushSubscribe(topic));\n },\n unsubscribe: async (topic: string): Promise<void> => {\n await coreCall((c) => c.pushUnsubscribe(topic));\n },\n },\n\n entitlements: {\n list: async (): Promise<UserEntitlement[]> =>\n (await coreCall((c) => c.entitlementsList())) as UserEntitlement[],\n has: async (name: string): Promise<boolean> =>\n (await coreCall((c) => c.entitlementsHas(name))) as boolean,\n },\n\n ai: {\n anthropic: {\n messages: {\n create: async (request: AiMessageRequest): Promise<AiMessageResponse> =>\n (await coreCall((c) => c.aiAnthropicMessages(\n JSON.stringify(request),\n ))) as AiMessageResponse,\n },\n },\n },\n\n config: {\n fetch: async (): Promise<ConfigBundle> =>\n (await coreCall((c) => c.configFetch())) as ConfigBundle,\n },\n\n flags: {\n fetch: async (): Promise<FlagAssignment[]> =>\n (await coreCall((c) => c.flagsFetch())) as FlagAssignment[],\n },\n\n // ── Gamification ──────────────────────────────────────────────────\n\n achievements: {\n getAll: async (): Promise<Achievement[]> =>\n (await coreCall((c) => c.achievementsGetAll())) as Achievement[],\n getProgress: async (): Promise<AchievementProgress[]> =>\n (await coreCall((c) => c.achievementsGetProgress())) as AchievementProgress[],\n },\n\n challenges: {\n getActive: async (): Promise<Challenge[]> =>\n (await coreCall((c) => c.challengesGetActive())) as Challenge[],\n get: async (id: string): Promise<Challenge> =>\n (await coreCall((c) => c.challengesGet(id))) as Challenge,\n getProgress: async (id: string): Promise<ChallengeProgress> =>\n (await coreCall((c) => c.challengesGetProgress(id))) as ChallengeProgress,\n claim: async (id: string): Promise<ChallengeProgress> =>\n (await coreCall((c) => c.challengesClaim(id))) as ChallengeProgress,\n },\n\n currencies: {\n getBalance: async (): Promise<CurrencyBalance[]> =>\n (await coreCall((c) => c.currenciesGetBalance())) as CurrencyBalance[],\n getTransactions: async (\n currencyKey: string,\n ): Promise<CurrencyTransaction[]> =>\n (await coreCall((c) => c.currenciesGetTransactions(\n currencyKey,\n ))) as CurrencyTransaction[],\n },\n\n inventory: {\n getItems: async (): Promise<InventoryItem[]> =>\n (await coreCall((c) => c.inventoryGetItems())) as InventoryItem[],\n getItem: async (id: string): Promise<InventoryItem> =>\n (await coreCall((c) => c.inventoryGetItem(id))) as InventoryItem,\n purchase: async (request: PurchaseRequest): Promise<InventoryItem> =>\n (await coreCall((c) => c.inventoryPurchase(\n JSON.stringify(request),\n ))) as InventoryItem,\n consume: async (request: ConsumeRequest): Promise<InventoryItem> =>\n (await coreCall((c) => c.inventoryConsume(\n JSON.stringify(request),\n ))) as InventoryItem,\n },\n\n leaderboards: {\n get: async (key: string): Promise<Leaderboard> =>\n (await coreCall((c) => c.leaderboardsGet(key))) as Leaderboard,\n getEntries: async (\n key: string,\n limit?: number,\n ): Promise<LeaderboardEntry[]> =>\n (await coreCall((c) => c.leaderboardsGetEntries(\n key,\n limit ?? undefined,\n ))) as LeaderboardEntry[],\n getMyRank: async (key: string): Promise<LeaderboardEntry> =>\n (await coreCall((c) => c.leaderboardsGetMyRank(key))) as LeaderboardEntry,\n },\n\n stores: {\n list: async (): Promise<Store[]> =>\n (await coreCall((c) => c.storesList())) as Store[],\n getPurchaseOptions: async (storeKey: string): Promise<PurchaseOption[]> =>\n (await coreCall((c) => c.storesGetPurchaseOptions(\n storeKey,\n ))) as PurchaseOption[],\n purchase: async (\n storeKey: string,\n purchaseOptionId: string,\n receipt: unknown,\n ): Promise<PurchaseResult> =>\n (await coreCall((c) => c.storesPurchase(\n storeKey,\n purchaseOptionId,\n JSON.stringify(receipt),\n ))) as PurchaseResult,\n },\n\n xp: {\n getBalance: async (): Promise<XpBalance> =>\n (await coreCall((c) => c.xpGetBalance())) as XpBalance,\n getHistory: async (limit?: number): Promise<XpTransaction[]> =>\n (await coreCall((c) => c.xpGetHistory(\n limit ?? undefined,\n ))) as XpTransaction[],\n claim: async (grantKey: string): Promise<XpTransaction> =>\n (await coreCall((c) => c.xpClaim(grantKey))) as XpTransaction,\n },\n\n streaks: {\n getAll: async (): Promise<Streak[]> =>\n (await coreCall((c) => c.streaksGetAll())) as Streak[],\n qualify: async (streakKey: string): Promise<Streak> =>\n (await coreCall((c) => c.streaksQualify(streakKey))) as Streak,\n },\n\n // ── Social ─────────────────────────────────────────────────────────\n\n feeds: {\n getActivity: async (\n feed?: string,\n cursor?: string,\n ): Promise<FeedResponse> =>\n (await coreCall((c) => c.feedsGetActivity(\n feed ?? undefined,\n cursor ?? undefined,\n ))) as FeedResponse,\n },\n\n friends: {\n getList: async (): Promise<Friendship[]> =>\n (await coreCall((c) => c.friendsGetList())) as Friendship[],\n getFriends: async (): Promise<Friendship[]> =>\n (await coreCall((c) => c.friendsGetFriends())) as Friendship[],\n blockUser: async (userId: string): Promise<Friendship> =>\n (await coreCall((c) => c.friendsBlockUser(userId))) as Friendship,\n unblockUser: async (userId: string): Promise<void> => {\n await coreCall((c) => c.friendsUnblockUser(userId));\n },\n removeBlock: async (friendshipId: string): Promise<void> => {\n await coreCall((c) => c.friendsRemoveBlock(friendshipId));\n },\n },\n\n groups: {\n create: async (params: GroupCreate): Promise<Group> =>\n (await coreCall((c) => c.groupsCreate(JSON.stringify(params)))) as Group,\n get: async (id: string): Promise<Group> =>\n (await coreCall((c) => c.groupsGet(id))) as Group,\n update: async (id: string, patch: GroupUpdate): Promise<Group> =>\n (await coreCall((c) => c.groupsUpdate(id, JSON.stringify(patch)))) as Group,\n delete: async (id: string): Promise<void> => {\n await coreCall((c) => c.groupsDelete(id));\n },\n getMembers: async (id: string): Promise<GroupMember[]> =>\n (await coreCall((c) => c.groupsGetMembers(id))) as GroupMember[],\n join: async (id: string): Promise<GroupMember> =>\n (await coreCall((c) => c.groupsJoin(id))) as GroupMember,\n leave: async (id: string): Promise<void> => {\n await coreCall((c) => c.groupsLeave(id));\n },\n invite: async (id: string, userId: string): Promise<GroupMember> =>\n (await coreCall((c) => c.groupsInvite(id, userId))) as GroupMember,\n },\n\n messaging: {\n getConversations: async (): Promise<Conversation[]> =>\n (await coreCall((c) => c.messagingGetConversations())) as Conversation[],\n getMessage: async (id: string): Promise<Message> =>\n (await coreCall((c) => c.messagingGetMessage(id))) as Message,\n sendMessage: async (request: SendMessageRequest): Promise<Message> =>\n (await coreCall((c) => c.messagingSendMessage(\n JSON.stringify(request),\n ))) as Message,\n },\n\n moderation: {\n reportUser: async (request: ReportRequest): Promise<Report> =>\n (await coreCall((c) => c.moderationReportUser(\n JSON.stringify(request),\n ))) as Report,\n reportContent: async (request: ReportRequest): Promise<Report> =>\n (await coreCall((c) => c.moderationReportContent(\n JSON.stringify(request),\n ))) as Report,\n getReportStatus: async (id: string): Promise<Report> =>\n (await coreCall((c) => c.moderationGetReportStatus(id))) as Report,\n },\n\n reviews: {\n list: async (targetType: string, targetId: string): Promise<Review[]> =>\n (await coreCall((c) => c.reviewsList(targetType, targetId))) as Review[],\n create: async (params: ReviewCreate): Promise<Review> =>\n (await coreCall((c) => c.reviewsCreate(JSON.stringify(params)))) as Review,\n update: async (id: string, patch: ReviewUpdate): Promise<Review> =>\n (await coreCall((c) => c.reviewsUpdate(id, JSON.stringify(patch)))) as Review,\n delete: async (id: string): Promise<void> => {\n await coreCall((c) => c.reviewsDelete(id));\n },\n },\n\n roles: {\n getMyRoles: async (): Promise<Role[]> =>\n (await coreCall((c) => c.rolesGetMyRoles())) as Role[],\n hasPermission: async (permission: string): Promise<boolean> =>\n (await coreCall((c) => c.rolesHasPermission(permission))) as boolean,\n },\n\n referrals: {\n getReferralCode: async (): Promise<ReferralCode> =>\n (await coreCall((c) => c.referralsGetReferralCode())) as ReferralCode,\n claimReferral: async (code: string): Promise<ReferralClaim> =>\n (await coreCall((c) => c.referralsClaimReferral(code))) as ReferralClaim,\n create: async (\n code?: string,\n maxUses?: number,\n ): Promise<ReferralCode> =>\n (await coreCall((c) => c.referralsCreate(\n code ?? undefined,\n maxUses ?? undefined,\n ))) as ReferralCode,\n },\n\n // ── Lifecycle ──────────────────────────────────────────────────────\n\n catalog: {\n list: async (): Promise<CatalogItem[]> =>\n (await coreCall((c) => c.catalogList())) as CatalogItem[],\n },\n\n content: {\n /**\n * Get today's published item for `channel`. Defaults to `\"default\"`\n * so single-channel apps can call `Amba.content.getToday()` bare.\n */\n getToday: async (\n channel: string = \"default\",\n ): Promise<ContentItem | null> =>\n (await coreCall((c) => c.contentGetToday(channel))) as ContentItem | null,\n /**\n * Paginated library list for `channel`. `options.limit` caps page size;\n * `options.cursor` is the opaque token returned by a prior page.\n */\n getLibrary: async (\n channel: string = \"default\",\n options?: { limit?: number; cursor?: string },\n ): Promise<ContentItem[]> =>\n (await coreCall((c) => c.contentGetLibrary(\n channel,\n options?.limit ?? undefined,\n options?.cursor ?? undefined,\n ))) as ContentItem[],\n getItem: async (id: string): Promise<ContentItem> =>\n (await coreCall((c) => c.contentGetItem(id))) as ContentItem,\n updateItem: async (id: string, state: unknown): Promise<ContentItem> =>\n (await coreCall((c) => c.contentUpdateItem(\n id,\n JSON.stringify(state),\n ))) as ContentItem,\n createItem: async (\n channel: string,\n item: unknown,\n ): Promise<ContentItem> =>\n (await coreCall((c) => c.contentCreateItem(\n channel,\n JSON.stringify(item),\n ))) as ContentItem,\n },\n\n deepLinks: {\n get: async (shortCode: string): Promise<DeepLink> =>\n (await coreCall((c) => c.deepLinksGet(shortCode))) as DeepLink,\n create: async (params: DeepLinkCreate): Promise<DeepLink> =>\n (await coreCall((c) => c.deepLinksCreate(JSON.stringify(params)))) as DeepLink,\n },\n\n onboarding: {\n getStatus: async (): Promise<OnboardingStatus> =>\n (await coreCall((c) => c.onboardingGetStatus())) as OnboardingStatus,\n nextStep: async (payload: unknown): Promise<OnboardingStatus> =>\n (await coreCall((c) => c.onboardingNextStep(\n JSON.stringify(payload),\n ))) as OnboardingStatus,\n skipStep: async (): Promise<OnboardingStatus> =>\n (await coreCall((c) => c.onboardingSkipStep())) as OnboardingStatus,\n complete: async (): Promise<OnboardingStatus> =>\n (await coreCall((c) => c.onboardingComplete())) as OnboardingStatus,\n },\n};\n\nexport const SDK_VERSION = \"0.1.0\";\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;;;;;;AC7BlD,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;;;;;;;;;;;;;AAcrD,SAAS,gBAAgB,SAAmC;AAE1D,KAAI,QAAQ,WAAW,eAAe,CAAE,QAAO;AAC/C,KAAI,QAAQ,WAAW,YAAY,CAAE,QAAO;AAC5C,KAAI,QAAQ,WAAW,YAAY,CAAE,QAAO;AAC5C,KAAI,QAAQ,WAAW,WAAW,CAAE,QAAO;AAC3C,KAAI,QAAQ,WAAW,eAAe,CAAE,QAAO;AAC/C,KAAI,QAAQ,WAAW,mBAAmB,CAAE,QAAO;AACnD,KAAI,QAAQ,WAAW,gBAAgB,CAAE,QAAO;AAChD,KAAI,QAAQ,WAAW,aAAa,CAAE,QAAO;AAC7C,KAAI,QAAQ,WAAW,kBAAkB,CAAE,QAAO;AAClD,KAAI,QAAQ,WAAW,sBAAsB,CAAE,QAAO;AACtD,KAAI,QAAQ,SAAS,kBAAkB,CAAE,QAAO;AAChD,KAAI,QAAQ,WAAW,wBAAwB,CAAE,QAAO;AACxD,KAAI,QAAQ,WAAW,mBAAmB,CAAE,QAAO;AACnD,QAAO;;;;;;;;;;;;;AAcT,SAAgB,eAAe,KAA4B;AACzD,KAAI,eAAe,aAAc,QAAO;AACxC,KAAI,OAAO,OAAO,QAAQ,UAAU;EAClC,MAAM,MAAM;AACZ,MAAI,OAAO,IAAI,SAAS,SACtB,QAAO,IAAI,aACT,IAAI,MACJ,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU,WAChD,IAAI,QACL;;AAGL,KAAI,eAAe,MACjB,QAAO,IAAI,aAAa,gBAAgB,IAAI,QAAQ,EAAE,IAAI,QAAQ;AAEpE,QAAO,IAAI,aAAa,iBAAiB,OAAO,IAAI,CAAC;;;;;ACYvD,IAAIC,eAA4C;AAEhD,SAAS,cAAoC;AAC3C,KAAI,CAAC,aACH,OAAM,IAAI,aACR,mBACA,+FACD;AAEH,QAAO;;;;;;AAOT,eAAe,SACb,IACY;AACZ,KAAI;AACF,SAAO,MAAM,GAAG,aAAa,CAAC;UACvB,KAAK;AACZ,QAAM,eAAe,IAAI;;;AAS7B,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;;;;;;;;;AAUrD,MAAa,OAAO;CAClB,WAAW,OAAO,WAAsC;AACtD,MAAI,CAAC,OAAO,UAAU,OAAO,OAAO,MAAM,KAAK,GAC7C,OAAM,IAAI,MAAM,qCAAqC;EAMvD,MAAM,WAAW,MAAM,OAAO;EAC9B,MAAM,OAAO,SAAS;EACtB,MAAM,eAAe,SAAS;AAE9B,QAAM,MAAM;AAIZ,QAHoB,IAAI,wBACtB,OAAO,iBAAiB,OACzB,CACiB,SAAS;AAE3B,iBAAe,aAAa,KAC1B,KAAK,UAAU;GACb,SAAS,OAAO;GAChB,UAAU,OAAO;GACjB,cAAc;GACd,qBAAqB,qBAAqB;GAC1C,kBAAkB,OAAO;GACzB,OAAO,OAAO;GACf,CAAC,EACF,WAAW,MAAM,KAAK,WAAW,CAClC;;CAGH,IAAI,cAAsB;AACxB,SAAO,aAAa,CAAC,aAAa;;CAEpC,IAAI,YAAgC;AAClC,SAAO,aAAa,CAAC,WAAW,IAAI;;CAEtC,IAAI,kBAA2B;AAC7B,SAAO,aAAa,CAAC,iBAAiB;;CAExC,WAAW,YAA2B;AACpC,eAAa,CAAC,SAAS,QAAQ;;CAGjC,QAAQ,EACN,OAAO,OACL,OACA,eACkB;AAClB,QAAM,UAAU,MAAM,EAAE,MACtB,OACA,aAAa,KAAK,UAAU,WAAW,GAAG,OAC3C,CAAC;IAEL;CAED,MAAM;EACJ,mBAAmB,YAAiC;GAClD,MAAM,IAAK,MAAM,UAAU,MAAM,EAAE,mBAAmB,CAAC;AACvD,SAAM,qBAAqB,EAAE;AAC7B,UAAO;;EAET,iBAAiB,OACf,OACA,aACwB;GACxB,MAAM,IAAK,MAAM,UAAU,MACzB,EAAE,gBAAgB,OAAO,SAAS,CACnC;AACD,SAAM,qBAAqB,EAAE;AAC7B,UAAO;;EAET,iBAAiB,OACf,OACA,aACwB;GACxB,MAAM,IAAK,MAAM,UAAU,MACzB,EAAE,gBAAgB,OAAO,SAAS,CACnC;AACD,SAAM,qBAAqB,EAAE;AAC7B,UAAO;;EAMT,kBAAkB,OAChB,UACA,YACwB;GACxB,MAAM,IAAK,MAAM,UAAU,MACzB,EAAE,iBAAiB,UAAU,QAAQ,CACtC;AACD,SAAM,qBAAqB,EAAE;AAC7B,UAAO;;EAET,SAAS,OAAO,oBAAoB,UAAyB;AAC3D,SAAM,UAAU,MAAM,EAAE,QAAQ,kBAAkB,CAAC;AACnD,yBAAsB,KAAK;;EAE7B,SAAS,YAAiC;GACxC,MAAM,IAAK,MAAM,UAAU,MAAM,EAAE,gBAAgB,CAAC;AACpD,SAAM,qBAAqB,EAAE;AAC7B,UAAO;;EAET,IAAI,YAA4B,MAAM,UAAU,MAAM,EAAE,IAAI,CAAC;EAG7D,YAAY,YAAqC;AAE/C,OAAI,CADS,aAAa,CAChB,iBAAiB,CAAE,QAAO;AAEpC,UAAO,gBADO,MAAM,UAAU,MAAM,EAAE,IAAI,CAAC,CACf;;EAI9B,gBAAgB,YAA6B;AAC3C,UAAO,aAAa,CAAC,aAAa;;EAOpC,oBACE,OACiB;AACjB,mBAAgB,IAAI,GAAG;AACvB,gBAAa;AACX,oBAAgB,OAAO,GAAG;;;EAG/B;CAED,aAAa;EACX,MAAM,OACJ,MACA,UAAuB,EAAE,KAExB,MAAM,UAAU,MAAM,EAAE,gBACvB,MACA,KAAK,UAAU,QAAQ,CACxB,CAAC;EACJ,SAAS,OAAoB,MAAc,OACxC,MAAM,UAAU,MAAM,EAAE,mBAAmB,MAAM,GAAG,CAAC;EACxD,QAAQ,OACN,MACA,QAEC,MAAM,UAAU,MAAM,EAAE,kBAAkB,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC;EACxE,QAAQ,OACN,MACA,IACA,QAEC,MAAM,UAAU,MAAM,EAAE,kBACvB,MACA,IACA,KAAK,UAAU,IAAI,CACpB,CAAC;EACJ,QAAQ,OACN,MACA,OAEC,MAAM,UAAU,MAAM,EAAE,kBAAkB,MAAM,GAAG,CAAC;EAGvD,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,WAOb,MAAM,UAAU,MAAM,EAAE,eACvB,OAAO,QACP,OAAO,UACP,OAAO,UACP,OAAO,WACP,OAAO,cACR,CAAC;EACJ,QAAQ,OAAO,UAAkB,YAC9B,MAAM,UAAU,MAAM,EAAE,cAAc,UAAU,QAAQ,CAAC;EAC7D;CAED,MAAM;EAMJ,UAAU,OACR,OACA,UACA,aAEC,MAAM,UAAU,MAAM,EAAE,aACvB,OACA,UACA,SACD,CAAC;EACJ,YAAY,OAAO,UAAiC;AAClD,SAAM,UAAU,MAAM,EAAE,eAAe,MAAM,CAAC;;EAEhD,WAAW,YACR,MAAM,UAAU,MAAM,EAAE,eAAe,CAAC;EAC3C,WAAW,OAAO,UAAiC;AACjD,SAAM,UAAU,MAAM,EAAE,cAAc,MAAM,CAAC;;EAE/C,aAAa,OAAO,UAAiC;AACnD,SAAM,UAAU,MAAM,EAAE,gBAAgB,MAAM,CAAC;;EAElD;CAED,cAAc;EACZ,MAAM,YACH,MAAM,UAAU,MAAM,EAAE,kBAAkB,CAAC;EAC9C,KAAK,OAAO,SACT,MAAM,UAAU,MAAM,EAAE,gBAAgB,KAAK,CAAC;EAClD;CAED,IAAI,EACF,WAAW,EACT,UAAU,EACR,QAAQ,OAAO,YACZ,MAAM,UAAU,MAAM,EAAE,oBACvB,KAAK,UAAU,QAAQ,CACxB,CAAC,EACL,EACF,EACF;CAED,QAAQ,EACN,OAAO,YACJ,MAAM,UAAU,MAAM,EAAE,aAAa,CAAC,EAC1C;CAED,OAAO,EACL,OAAO,YACJ,MAAM,UAAU,MAAM,EAAE,YAAY,CAAC,EACzC;CAID,cAAc;EACZ,QAAQ,YACL,MAAM,UAAU,MAAM,EAAE,oBAAoB,CAAC;EAChD,aAAa,YACV,MAAM,UAAU,MAAM,EAAE,yBAAyB,CAAC;EACtD;CAED,YAAY;EACV,WAAW,YACR,MAAM,UAAU,MAAM,EAAE,qBAAqB,CAAC;EACjD,KAAK,OAAO,OACT,MAAM,UAAU,MAAM,EAAE,cAAc,GAAG,CAAC;EAC7C,aAAa,OAAO,OACjB,MAAM,UAAU,MAAM,EAAE,sBAAsB,GAAG,CAAC;EACrD,OAAO,OAAO,OACX,MAAM,UAAU,MAAM,EAAE,gBAAgB,GAAG,CAAC;EAChD;CAED,YAAY;EACV,YAAY,YACT,MAAM,UAAU,MAAM,EAAE,sBAAsB,CAAC;EAClD,iBAAiB,OACf,gBAEC,MAAM,UAAU,MAAM,EAAE,0BACvB,YACD,CAAC;EACL;CAED,WAAW;EACT,UAAU,YACP,MAAM,UAAU,MAAM,EAAE,mBAAmB,CAAC;EAC/C,SAAS,OAAO,OACb,MAAM,UAAU,MAAM,EAAE,iBAAiB,GAAG,CAAC;EAChD,UAAU,OAAO,YACd,MAAM,UAAU,MAAM,EAAE,kBACvB,KAAK,UAAU,QAAQ,CACxB,CAAC;EACJ,SAAS,OAAO,YACb,MAAM,UAAU,MAAM,EAAE,iBACvB,KAAK,UAAU,QAAQ,CACxB,CAAC;EACL;CAED,cAAc;EACZ,KAAK,OAAO,QACT,MAAM,UAAU,MAAM,EAAE,gBAAgB,IAAI,CAAC;EAChD,YAAY,OACV,KACA,UAEC,MAAM,UAAU,MAAM,EAAE,uBACvB,KACA,SAAS,OACV,CAAC;EACJ,WAAW,OAAO,QACf,MAAM,UAAU,MAAM,EAAE,sBAAsB,IAAI,CAAC;EACvD;CAED,QAAQ;EACN,MAAM,YACH,MAAM,UAAU,MAAM,EAAE,YAAY,CAAC;EACxC,oBAAoB,OAAO,aACxB,MAAM,UAAU,MAAM,EAAE,yBACvB,SACD,CAAC;EACJ,UAAU,OACR,UACA,kBACA,YAEC,MAAM,UAAU,MAAM,EAAE,eACvB,UACA,kBACA,KAAK,UAAU,QAAQ,CACxB,CAAC;EACL;CAED,IAAI;EACF,YAAY,YACT,MAAM,UAAU,MAAM,EAAE,cAAc,CAAC;EAC1C,YAAY,OAAO,UAChB,MAAM,UAAU,MAAM,EAAE,aACvB,SAAS,OACV,CAAC;EACJ,OAAO,OAAO,aACX,MAAM,UAAU,MAAM,EAAE,QAAQ,SAAS,CAAC;EAC9C;CAED,SAAS;EACP,QAAQ,YACL,MAAM,UAAU,MAAM,EAAE,eAAe,CAAC;EAC3C,SAAS,OAAO,cACb,MAAM,UAAU,MAAM,EAAE,eAAe,UAAU,CAAC;EACtD;CAID,OAAO,EACL,aAAa,OACX,MACA,WAEC,MAAM,UAAU,MAAM,EAAE,iBACvB,QAAQ,QACR,UAAU,OACX,CAAC,EACL;CAED,SAAS;EACP,SAAS,YACN,MAAM,UAAU,MAAM,EAAE,gBAAgB,CAAC;EAC5C,YAAY,YACT,MAAM,UAAU,MAAM,EAAE,mBAAmB,CAAC;EAC/C,WAAW,OAAO,WACf,MAAM,UAAU,MAAM,EAAE,iBAAiB,OAAO,CAAC;EACpD,aAAa,OAAO,WAAkC;AACpD,SAAM,UAAU,MAAM,EAAE,mBAAmB,OAAO,CAAC;;EAErD,aAAa,OAAO,iBAAwC;AAC1D,SAAM,UAAU,MAAM,EAAE,mBAAmB,aAAa,CAAC;;EAE5D;CAED,QAAQ;EACN,QAAQ,OAAO,WACZ,MAAM,UAAU,MAAM,EAAE,aAAa,KAAK,UAAU,OAAO,CAAC,CAAC;EAChE,KAAK,OAAO,OACT,MAAM,UAAU,MAAM,EAAE,UAAU,GAAG,CAAC;EACzC,QAAQ,OAAO,IAAY,UACxB,MAAM,UAAU,MAAM,EAAE,aAAa,IAAI,KAAK,UAAU,MAAM,CAAC,CAAC;EACnE,QAAQ,OAAO,OAA8B;AAC3C,SAAM,UAAU,MAAM,EAAE,aAAa,GAAG,CAAC;;EAE3C,YAAY,OAAO,OAChB,MAAM,UAAU,MAAM,EAAE,iBAAiB,GAAG,CAAC;EAChD,MAAM,OAAO,OACV,MAAM,UAAU,MAAM,EAAE,WAAW,GAAG,CAAC;EAC1C,OAAO,OAAO,OAA8B;AAC1C,SAAM,UAAU,MAAM,EAAE,YAAY,GAAG,CAAC;;EAE1C,QAAQ,OAAO,IAAY,WACxB,MAAM,UAAU,MAAM,EAAE,aAAa,IAAI,OAAO,CAAC;EACrD;CAED,WAAW;EACT,kBAAkB,YACf,MAAM,UAAU,MAAM,EAAE,2BAA2B,CAAC;EACvD,YAAY,OAAO,OAChB,MAAM,UAAU,MAAM,EAAE,oBAAoB,GAAG,CAAC;EACnD,aAAa,OAAO,YACjB,MAAM,UAAU,MAAM,EAAE,qBACvB,KAAK,UAAU,QAAQ,CACxB,CAAC;EACL;CAED,YAAY;EACV,YAAY,OAAO,YAChB,MAAM,UAAU,MAAM,EAAE,qBACvB,KAAK,UAAU,QAAQ,CACxB,CAAC;EACJ,eAAe,OAAO,YACnB,MAAM,UAAU,MAAM,EAAE,wBACvB,KAAK,UAAU,QAAQ,CACxB,CAAC;EACJ,iBAAiB,OAAO,OACrB,MAAM,UAAU,MAAM,EAAE,0BAA0B,GAAG,CAAC;EAC1D;CAED,SAAS;EACP,MAAM,OAAO,YAAoB,aAC9B,MAAM,UAAU,MAAM,EAAE,YAAY,YAAY,SAAS,CAAC;EAC7D,QAAQ,OAAO,WACZ,MAAM,UAAU,MAAM,EAAE,cAAc,KAAK,UAAU,OAAO,CAAC,CAAC;EACjE,QAAQ,OAAO,IAAY,UACxB,MAAM,UAAU,MAAM,EAAE,cAAc,IAAI,KAAK,UAAU,MAAM,CAAC,CAAC;EACpE,QAAQ,OAAO,OAA8B;AAC3C,SAAM,UAAU,MAAM,EAAE,cAAc,GAAG,CAAC;;EAE7C;CAED,OAAO;EACL,YAAY,YACT,MAAM,UAAU,MAAM,EAAE,iBAAiB,CAAC;EAC7C,eAAe,OAAO,eACnB,MAAM,UAAU,MAAM,EAAE,mBAAmB,WAAW,CAAC;EAC3D;CAED,WAAW;EACT,iBAAiB,YACd,MAAM,UAAU,MAAM,EAAE,0BAA0B,CAAC;EACtD,eAAe,OAAO,SACnB,MAAM,UAAU,MAAM,EAAE,uBAAuB,KAAK,CAAC;EACxD,QAAQ,OACN,MACA,YAEC,MAAM,UAAU,MAAM,EAAE,gBACvB,QAAQ,QACR,WAAW,OACZ,CAAC;EACL;CAID,SAAS,EACP,MAAM,YACH,MAAM,UAAU,MAAM,EAAE,aAAa,CAAC,EAC1C;CAED,SAAS;EAKP,UAAU,OACR,UAAkB,cAEjB,MAAM,UAAU,MAAM,EAAE,gBAAgB,QAAQ,CAAC;EAKpD,YAAY,OACV,UAAkB,WAClB,YAEC,MAAM,UAAU,MAAM,EAAE,kBACvB,SACA,SAAS,SAAS,QAClB,SAAS,UAAU,OACpB,CAAC;EACJ,SAAS,OAAO,OACb,MAAM,UAAU,MAAM,EAAE,eAAe,GAAG,CAAC;EAC9C,YAAY,OAAO,IAAY,UAC5B,MAAM,UAAU,MAAM,EAAE,kBACvB,IACA,KAAK,UAAU,MAAM,CACtB,CAAC;EACJ,YAAY,OACV,SACA,SAEC,MAAM,UAAU,MAAM,EAAE,kBACvB,SACA,KAAK,UAAU,KAAK,CACrB,CAAC;EACL;CAED,WAAW;EACT,KAAK,OAAO,cACT,MAAM,UAAU,MAAM,EAAE,aAAa,UAAU,CAAC;EACnD,QAAQ,OAAO,WACZ,MAAM,UAAU,MAAM,EAAE,gBAAgB,KAAK,UAAU,OAAO,CAAC,CAAC;EACpE;CAED,YAAY;EACV,WAAW,YACR,MAAM,UAAU,MAAM,EAAE,qBAAqB,CAAC;EACjD,UAAU,OAAO,YACd,MAAM,UAAU,MAAM,EAAE,mBACvB,KAAK,UAAU,QAAQ,CACxB,CAAC;EACJ,UAAU,YACP,MAAM,UAAU,MAAM,EAAE,oBAAoB,CAAC;EAChD,UAAU,YACP,MAAM,UAAU,MAAM,EAAE,oBAAoB,CAAC;EACjD;CACF;AAED,MAAa,cAAc"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["cachedStorage: AsyncStorageStatic | null","prefix: string","coreInstance: AmbaCoreWasmInstance | null"],"sources":["../src/async-storage-adapter.ts","../src/error.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 Rust core's persistence trait. Reads/writes go\n * through a per-prefix namespace so different amba projects can coexist\n * in the 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 Rust core gains a JS-side persistence bridge,\n // this will pre-load the identity record into memory so the WASM\n // core 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 (WASM JsError, native Error, plain objects) into a\n * 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, FFI, 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 | \"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. WASM JsError) → 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 WASM-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 * @layers/amba-react-native — React Native SDK for amba.\n *\n * Companion to `@layers/amba-web`. Same 25-namespace surface, but:\n * - Persists identity in `AsyncStorage` (peer-dep on\n * `@react-native-async-storage/async-storage`) so anonymous_id +\n * session_token survive app restarts.\n * - Push registration takes a native APNs/FCM token from the wrapper\n * layer (host app obtains it via `expo-notifications` or\n * `@react-native-firebase/messaging`).\n * - Sign-in flows expect identity tokens fetched by the host app via\n * `expo-apple-authentication` (Apple) or `expo-auth-session` /\n * `@react-native-google-signin/google-signin` (Google) — see README.\n *\n * Works in Expo Go AND bare React Native via the same WASM core.\n *\n * @example\n * ```tsx\n * import { Amba } from '@layers/amba-react-native';\n *\n * await Amba.configure({ apiKey: 'amba_pk_...' });\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\n// NOTE: `@layers/amba-core` is intentionally NOT statically imported.\n//\n// Reason (Task #69): this package ships both ESM (`dist/index.js`) and CJS\n// (`dist/index.cjs`) so Expo's autolinker — which `require()`s our entry\n// from a Node CJS context during `expo prebuild` — can resolve us. But\n// `@layers/amba-core` is ESM-only (no `require` export condition,\n// since it's `wasm-pack` ESM output). A top-level `import` of it would\n// be lowered to a top-level `require(\"@layers/amba-core\")` in our\n// CJS dist, and that `require()` would crash with\n// `ERR_PACKAGE_PATH_NOT_EXPORTED` the moment Expo autolinker loads us.\n//\n// Lazy-loading via dynamic `import()` (inside `configure()`) sidesteps\n// this: Expo's autolinker can `require()` our CJS entry and inspect\n// metadata without ever firing the WASM core load. Metro/RN at app\n// runtime still picks the ESM dist and the dynamic import resolves\n// normally.\ntype CoreWasmModule = typeof import(\"@layers/amba-core\");\n// `AmbaCoreWasm` declares a `private constructor()` (wasm-pack pattern),\n// so `InstanceType<typeof AmbaCoreWasm>` is rejected by TS as\n// \"Cannot assign a 'private' constructor type to a 'public' constructor\n// type\". Type the instance from the public static factory instead.\ntype AmbaCoreWasmInstance = ReturnType<CoreWasmModule[\"AmbaCoreWasm\"][\"init\"]>;\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 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 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\";\nimport { AmbaApiError, toAmbaApiError } from \"./error\";\nimport type { Session } from \"./types\";\n\nexport { AmbaApiError } from \"./error\";\nexport type { AmbaApiErrorCode } from \"./error\";\n\nlet coreInstance: AmbaCoreWasmInstance | null = null;\n\nfunction requireCore(): AmbaCoreWasmInstance {\n if (!coreInstance) {\n throw new AmbaApiError(\n \"NOT_INITIALIZED\",\n \"@layers/amba-react-native: SDK not configured. Call Amba.configure({ apiKey }) at app start.\",\n );\n }\n return coreInstance;\n}\n\n/**\n * Run a single WASM-core call and rewrap any thrown value into a\n * stable `AmbaApiError`. Mirrors the helper in `@layers/amba-web`.\n */\nasync function coreCall<T>(\n fn: (c: AmbaCoreWasmInstance) => Promise<T>,\n): Promise<T> {\n try {\n return await fn(requireCore());\n } catch (err) {\n throw toAmbaApiError(err);\n }\n}\n\n/**\n * In-SDK auth-state pub/sub. Mirrors the web SDK shape so\n * `Amba.auth.onAuthStateChange` works identically across packages.\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/**\n * Top-level SDK namespace for React Native.\n *\n * Differences from `@layers/amba-web`:\n * - `configure` is async (waits for WASM init AND AsyncStorage hydration).\n * - Persistence is AsyncStorage-backed — identity survives app restarts.\n */\nexport const Amba = {\n configure: async (config: AmbaConfig): Promise<void> => {\n if (!config.apiKey || config.apiKey.trim() === \"\") {\n throw new Error(\"Amba.configure: apiKey is required\");\n }\n // Lazy-load the WASM core. See the top-of-file note on Task #69:\n // a static `import` would lower to a top-level `require()` in the\n // CJS dist, which crashes Expo's autolinker because core-wasm is\n // ESM-only. Dynamic import works from both ESM and CJS contexts.\n const coreWasm = await import(\"@layers/amba-core\");\n const init = coreWasm.default;\n const AmbaCoreWasm = coreWasm.AmbaCoreWasm;\n\n await init();\n const persistence = new AsyncStoragePersistence(\n config.storagePrefix ?? \"amba\",\n );\n await persistence.hydrate();\n\n coreInstance = AmbaCoreWasm.init(\n JSON.stringify({\n api_key: config.apiKey,\n base_url: config.baseUrl,\n sdk_platform: \"react-native\",\n sdk_wrapper_version: `amba-react-native/${SDK_VERSION}`,\n consent_required: config.consentRequired,\n debug: config.debug,\n }),\n globalThis.fetch.bind(globalThis),\n );\n },\n\n get anonymousId(): string {\n return requireCore().anonymousId();\n },\n get appUserId(): string | undefined {\n return requireCore().appUserId() ?? undefined;\n },\n get isAuthenticated(): boolean {\n return requireCore().isAuthenticated();\n },\n setDebug: (enabled: boolean): void => {\n requireCore().setDebug(enabled);\n },\n\n events: {\n track: async (\n event: string,\n properties?: Record<string, unknown>,\n ): Promise<void> => {\n await coreCall((c) => c.track(\n event,\n properties ? JSON.stringify(properties) : undefined,\n ));\n },\n },\n\n auth: {\n signInAnonymously: async (): Promise<AuthResult> => {\n const r = (await coreCall((c) => c.signInAnonymously())) as AuthResult;\n await notifyFromAuthResult(r);\n return r;\n },\n signInWithEmail: async (\n email: string,\n password: string,\n ): Promise<AuthResult> => {\n const r = (await coreCall((c) =>\n c.signInWithEmail(email, password),\n )) as AuthResult;\n await notifyFromAuthResult(r);\n return r;\n },\n signUpWithEmail: async (\n email: string,\n password: string,\n ): Promise<AuthResult> => {\n const r = (await coreCall((c) =>\n c.signUpWithEmail(email, password),\n )) as AuthResult;\n await notifyFromAuthResult(r);\n return r;\n },\n /**\n * Sign in with an Apple / Google identity token. The host app obtains\n * the token via `expo-apple-authentication` or `expo-auth-session`.\n */\n signInWithSocial: async (\n provider: SocialProvider,\n idToken: string,\n ): Promise<AuthResult> => {\n const r = (await coreCall((c) =>\n c.signInWithSocial(provider, idToken),\n )) as AuthResult;\n await notifyFromAuthResult(r);\n return r;\n },\n signOut: async (rotateAnonymousId = false): Promise<void> => {\n await coreCall((c) => c.signOut(rotateAnonymousId));\n notifyAuthSubscribers(null);\n },\n refresh: async (): Promise<AuthResult> => {\n const r = (await coreCall((c) => c.refreshSession())) as AuthResult;\n await notifyFromAuthResult(r);\n return r;\n },\n me: async (): Promise<User> => (await coreCall((c) => c.me())) as User,\n\n /** Snapshot the current session, or null if not authenticated. */\n getSession: async (): Promise<Session | null> => {\n const core = requireCore();\n if (!core.isAuthenticated()) return null;\n const user = (await coreCall((c) => c.me())) as User;\n return snapshotSession(user);\n },\n\n /** Stable anonymous identifier. */\n getAnonymousId: async (): Promise<string> => {\n return requireCore().anonymousId();\n },\n\n /**\n * Subscribe to session changes. Fires after every signIn* / signUp* /\n * refresh / signOut. Returns an unsubscribe function.\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 (await coreCall((c) => c.collectionsFind(\n name,\n JSON.stringify(options),\n ))) as FindResponse<T>,\n findOne: async <T = unknown>(name: string, id: string): Promise<T> =>\n (await coreCall((c) => c.collectionsFindOne(name, id))) as T,\n insert: async <T = unknown>(\n name: string,\n row: Record<string, unknown>,\n ): Promise<T> =>\n (await coreCall((c) => c.collectionsInsert(name, JSON.stringify(row)))) as T,\n update: async <T = unknown>(\n name: string,\n id: string,\n set: Record<string, unknown>,\n ): Promise<T> =>\n (await coreCall((c) => c.collectionsUpdate(\n name,\n id,\n JSON.stringify(set),\n ))) as T,\n delete: async (\n name: string,\n id: string,\n ): Promise<{ data: { deleted: boolean } }> =>\n (await coreCall((c) => c.collectionsDelete(name, id))) as {\n data: { deleted: boolean };\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 (await coreCall((c) => c.storagePresign(\n params.bucket,\n params.filename,\n params.mimeType,\n params.sizeBytes,\n params.retentionDays,\n ))) as PresignData,\n commit: async (uploadId: string, assetId: string): Promise<MediaAsset> =>\n (await coreCall((c) => c.storageCommit(uploadId, assetId))) as MediaAsset,\n },\n\n push: {\n /**\n * Register a native push token. On iOS, pass the APNs token from\n * `expo-notifications` `getDevicePushTokenAsync()` with platform `'apns'`.\n * On Android, pass the FCM token with platform `'fcm'`.\n */\n register: async (\n token: string,\n platform: PushPlatform,\n bundleId?: string,\n ): Promise<PushToken> =>\n (await coreCall((c) => c.pushRegister(\n token,\n platform,\n bundleId,\n ))) as PushToken,\n unregister: async (token: string): Promise<void> => {\n await coreCall((c) => c.pushUnregister(token));\n },\n getTokens: async (): Promise<PushToken[]> =>\n (await coreCall((c) => c.pushGetTokens())) as PushToken[],\n subscribe: async (topic: string): Promise<void> => {\n await coreCall((c) => c.pushSubscribe(topic));\n },\n unsubscribe: async (topic: string): Promise<void> => {\n await coreCall((c) => c.pushUnsubscribe(topic));\n },\n },\n\n entitlements: {\n list: async (): Promise<UserEntitlement[]> =>\n (await coreCall((c) => c.entitlementsList())) as UserEntitlement[],\n has: async (name: string): Promise<boolean> =>\n (await coreCall((c) => c.entitlementsHas(name))) as boolean,\n },\n\n ai: {\n anthropic: {\n messages: {\n create: async (request: AiMessageRequest): Promise<AiMessageResponse> =>\n (await coreCall((c) => c.aiAnthropicMessages(\n JSON.stringify(request),\n ))) as AiMessageResponse,\n },\n },\n },\n\n config: {\n fetch: async (): Promise<ConfigBundle> =>\n (await coreCall((c) => c.configFetch())) as ConfigBundle,\n },\n\n flags: {\n fetch: async (): Promise<FlagAssignment[]> =>\n (await coreCall((c) => c.flagsFetch())) as FlagAssignment[],\n },\n\n // ── Gamification ──────────────────────────────────────────────────\n\n achievements: {\n getAll: async (): Promise<Achievement[]> =>\n (await coreCall((c) => c.achievementsGetAll())) as Achievement[],\n getProgress: async (): Promise<AchievementProgress[]> =>\n (await coreCall((c) => c.achievementsGetProgress())) as AchievementProgress[],\n },\n\n challenges: {\n getActive: async (): Promise<Challenge[]> =>\n (await coreCall((c) => c.challengesGetActive())) as Challenge[],\n get: async (id: string): Promise<Challenge> =>\n (await coreCall((c) => c.challengesGet(id))) as Challenge,\n getProgress: async (id: string): Promise<ChallengeProgress> =>\n (await coreCall((c) => c.challengesGetProgress(id))) as ChallengeProgress,\n claim: async (id: string): Promise<ChallengeProgress> =>\n (await coreCall((c) => c.challengesClaim(id))) as ChallengeProgress,\n },\n\n currencies: {\n getBalance: async (): Promise<CurrencyBalance[]> =>\n (await coreCall((c) => c.currenciesGetBalance())) as CurrencyBalance[],\n getTransactions: async (\n currencyKey: string,\n ): Promise<CurrencyTransaction[]> =>\n (await coreCall((c) => c.currenciesGetTransactions(\n currencyKey,\n ))) as CurrencyTransaction[],\n },\n\n inventory: {\n getItems: async (): Promise<InventoryItem[]> =>\n (await coreCall((c) => c.inventoryGetItems())) as InventoryItem[],\n getItem: async (id: string): Promise<InventoryItem> =>\n (await coreCall((c) => c.inventoryGetItem(id))) as InventoryItem,\n purchase: async (request: PurchaseRequest): Promise<InventoryItem> =>\n (await coreCall((c) => c.inventoryPurchase(\n JSON.stringify(request),\n ))) as InventoryItem,\n consume: async (request: ConsumeRequest): Promise<InventoryItem> =>\n (await coreCall((c) => c.inventoryConsume(\n JSON.stringify(request),\n ))) as InventoryItem,\n },\n\n leaderboards: {\n get: async (key: string): Promise<Leaderboard> =>\n (await coreCall((c) => c.leaderboardsGet(key))) as Leaderboard,\n getEntries: async (\n key: string,\n limit?: number,\n ): Promise<LeaderboardEntry[]> =>\n (await coreCall((c) => c.leaderboardsGetEntries(\n key,\n limit ?? undefined,\n ))) as LeaderboardEntry[],\n getMyRank: async (key: string): Promise<LeaderboardEntry> =>\n (await coreCall((c) => c.leaderboardsGetMyRank(key))) as LeaderboardEntry,\n },\n\n stores: {\n list: async (): Promise<Store[]> =>\n (await coreCall((c) => c.storesList())) as Store[],\n getPurchaseOptions: async (storeKey: string): Promise<PurchaseOption[]> =>\n (await coreCall((c) => c.storesGetPurchaseOptions(\n storeKey,\n ))) as PurchaseOption[],\n purchase: async (\n storeKey: string,\n purchaseOptionId: string,\n receipt: unknown,\n ): Promise<PurchaseResult> =>\n (await coreCall((c) => c.storesPurchase(\n storeKey,\n purchaseOptionId,\n JSON.stringify(receipt),\n ))) as PurchaseResult,\n },\n\n xp: {\n getBalance: async (): Promise<XpBalance> =>\n (await coreCall((c) => c.xpGetBalance())) as XpBalance,\n getHistory: async (limit?: number): Promise<XpTransaction[]> =>\n (await coreCall((c) => c.xpGetHistory(\n limit ?? undefined,\n ))) as XpTransaction[],\n claim: async (grantKey: string): Promise<XpTransaction> =>\n (await coreCall((c) => c.xpClaim(grantKey))) as XpTransaction,\n },\n\n streaks: {\n getAll: async (): Promise<Streak[]> =>\n (await coreCall((c) => c.streaksGetAll())) as Streak[],\n qualify: async (streakKey: string): Promise<Streak> =>\n (await coreCall((c) => c.streaksQualify(streakKey))) as Streak,\n },\n\n // ── Social ─────────────────────────────────────────────────────────\n\n feeds: {\n getActivity: async (\n feed?: string,\n cursor?: string,\n ): Promise<FeedResponse> =>\n (await coreCall((c) => c.feedsGetActivity(\n feed ?? undefined,\n cursor ?? undefined,\n ))) as FeedResponse,\n },\n\n friends: {\n getList: async (): Promise<Friendship[]> =>\n (await coreCall((c) => c.friendsGetList())) as Friendship[],\n getFriends: async (): Promise<Friendship[]> =>\n (await coreCall((c) => c.friendsGetFriends())) as Friendship[],\n blockUser: async (userId: string): Promise<Friendship> =>\n (await coreCall((c) => c.friendsBlockUser(userId))) as Friendship,\n unblockUser: async (userId: string): Promise<void> => {\n await coreCall((c) => c.friendsUnblockUser(userId));\n },\n removeBlock: async (friendshipId: string): Promise<void> => {\n await coreCall((c) => c.friendsRemoveBlock(friendshipId));\n },\n },\n\n groups: {\n create: async (params: GroupCreate): Promise<Group> =>\n (await coreCall((c) => c.groupsCreate(JSON.stringify(params)))) as Group,\n get: async (id: string): Promise<Group> =>\n (await coreCall((c) => c.groupsGet(id))) as Group,\n update: async (id: string, patch: GroupUpdate): Promise<Group> =>\n (await coreCall((c) => c.groupsUpdate(id, JSON.stringify(patch)))) as Group,\n delete: async (id: string): Promise<void> => {\n await coreCall((c) => c.groupsDelete(id));\n },\n getMembers: async (id: string): Promise<GroupMember[]> =>\n (await coreCall((c) => c.groupsGetMembers(id))) as GroupMember[],\n join: async (id: string): Promise<GroupMember> =>\n (await coreCall((c) => c.groupsJoin(id))) as GroupMember,\n leave: async (id: string): Promise<void> => {\n await coreCall((c) => c.groupsLeave(id));\n },\n invite: async (id: string, userId: string): Promise<GroupMember> =>\n (await coreCall((c) => c.groupsInvite(id, userId))) as GroupMember,\n },\n\n messaging: {\n getConversations: async (): Promise<Conversation[]> =>\n (await coreCall((c) => c.messagingGetConversations())) as Conversation[],\n getMessage: async (id: string): Promise<Message> =>\n (await coreCall((c) => c.messagingGetMessage(id))) as Message,\n sendMessage: async (request: SendMessageRequest): Promise<Message> =>\n (await coreCall((c) => c.messagingSendMessage(\n JSON.stringify(request),\n ))) as Message,\n },\n\n moderation: {\n reportUser: async (request: ReportRequest): Promise<Report> =>\n (await coreCall((c) => c.moderationReportUser(\n JSON.stringify(request),\n ))) as Report,\n reportContent: async (request: ReportRequest): Promise<Report> =>\n (await coreCall((c) => c.moderationReportContent(\n JSON.stringify(request),\n ))) as Report,\n getReportStatus: async (id: string): Promise<Report> =>\n (await coreCall((c) => c.moderationGetReportStatus(id))) as Report,\n },\n\n reviews: {\n list: async (targetType: string, targetId: string): Promise<Review[]> =>\n (await coreCall((c) => c.reviewsList(targetType, targetId))) as Review[],\n create: async (params: ReviewCreate): Promise<Review> =>\n (await coreCall((c) => c.reviewsCreate(JSON.stringify(params)))) as Review,\n update: async (id: string, patch: ReviewUpdate): Promise<Review> =>\n (await coreCall((c) => c.reviewsUpdate(id, JSON.stringify(patch)))) as Review,\n delete: async (id: string): Promise<void> => {\n await coreCall((c) => c.reviewsDelete(id));\n },\n },\n\n roles: {\n getMyRoles: async (): Promise<Role[]> =>\n (await coreCall((c) => c.rolesGetMyRoles())) as Role[],\n hasPermission: async (permission: string): Promise<boolean> =>\n (await coreCall((c) => c.rolesHasPermission(permission))) as boolean,\n },\n\n referrals: {\n getReferralCode: async (): Promise<ReferralCode> =>\n (await coreCall((c) => c.referralsGetReferralCode())) as ReferralCode,\n claimReferral: async (code: string): Promise<ReferralClaim> =>\n (await coreCall((c) => c.referralsClaimReferral(code))) as ReferralClaim,\n create: async (\n code?: string,\n maxUses?: number,\n ): Promise<ReferralCode> =>\n (await coreCall((c) => c.referralsCreate(\n code ?? undefined,\n maxUses ?? undefined,\n ))) as ReferralCode,\n },\n\n // ── Lifecycle ──────────────────────────────────────────────────────\n\n catalog: {\n list: async (): Promise<CatalogItem[]> =>\n (await coreCall((c) => c.catalogList())) as CatalogItem[],\n },\n\n content: {\n /**\n * Get today's published item for `channel`. Defaults to `\"default\"`\n * so single-channel apps can call `Amba.content.getToday()` bare.\n */\n getToday: async (\n channel: string = \"default\",\n ): Promise<ContentItem | null> =>\n (await coreCall((c) => c.contentGetToday(channel))) as ContentItem | null,\n /**\n * Paginated library list for `channel`. `options.limit` caps page size;\n * `options.cursor` is the opaque token returned by a prior page.\n */\n getLibrary: async (\n channel: string = \"default\",\n options?: { limit?: number; cursor?: string },\n ): Promise<ContentItem[]> =>\n (await coreCall((c) => c.contentGetLibrary(\n channel,\n options?.limit ?? undefined,\n options?.cursor ?? undefined,\n ))) as ContentItem[],\n getItem: async (id: string): Promise<ContentItem> =>\n (await coreCall((c) => c.contentGetItem(id))) as ContentItem,\n updateItem: async (id: string, state: unknown): Promise<ContentItem> =>\n (await coreCall((c) => c.contentUpdateItem(\n id,\n JSON.stringify(state),\n ))) as ContentItem,\n createItem: async (\n channel: string,\n item: unknown,\n ): Promise<ContentItem> =>\n (await coreCall((c) => c.contentCreateItem(\n channel,\n JSON.stringify(item),\n ))) as ContentItem,\n },\n\n deepLinks: {\n get: async (shortCode: string): Promise<DeepLink> =>\n (await coreCall((c) => c.deepLinksGet(shortCode))) as DeepLink,\n create: async (params: DeepLinkCreate): Promise<DeepLink> =>\n (await coreCall((c) => c.deepLinksCreate(JSON.stringify(params)))) as DeepLink,\n },\n\n onboarding: {\n getStatus: async (): Promise<OnboardingStatus> =>\n (await coreCall((c) => c.onboardingGetStatus())) as OnboardingStatus,\n nextStep: async (payload: unknown): Promise<OnboardingStatus> =>\n (await coreCall((c) => c.onboardingNextStep(\n JSON.stringify(payload),\n ))) as OnboardingStatus,\n skipStep: async (): Promise<OnboardingStatus> =>\n (await coreCall((c) => c.onboardingSkipStep())) as OnboardingStatus,\n complete: async (): Promise<OnboardingStatus> =>\n (await coreCall((c) => c.onboardingComplete())) as OnboardingStatus,\n },\n};\n\nexport const SDK_VERSION = \"0.1.0\";\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;;;;;;AC7BlD,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;;;;;;;;;;;;;AAcrD,SAAS,gBAAgB,SAAmC;AAE1D,KAAI,QAAQ,WAAW,eAAe,CAAE,QAAO;AAC/C,KAAI,QAAQ,WAAW,YAAY,CAAE,QAAO;AAC5C,KAAI,QAAQ,WAAW,YAAY,CAAE,QAAO;AAC5C,KAAI,QAAQ,WAAW,WAAW,CAAE,QAAO;AAC3C,KAAI,QAAQ,WAAW,eAAe,CAAE,QAAO;AAC/C,KAAI,QAAQ,WAAW,mBAAmB,CAAE,QAAO;AACnD,KAAI,QAAQ,WAAW,gBAAgB,CAAE,QAAO;AAChD,KAAI,QAAQ,WAAW,aAAa,CAAE,QAAO;AAC7C,KAAI,QAAQ,WAAW,kBAAkB,CAAE,QAAO;AAClD,KAAI,QAAQ,WAAW,sBAAsB,CAAE,QAAO;AACtD,KAAI,QAAQ,SAAS,kBAAkB,CAAE,QAAO;AAChD,KAAI,QAAQ,WAAW,wBAAwB,CAAE,QAAO;AACxD,KAAI,QAAQ,WAAW,mBAAmB,CAAE,QAAO;AACnD,QAAO;;;;;;;;;;;;;AAcT,SAAgB,eAAe,KAA4B;AACzD,KAAI,eAAe,aAAc,QAAO;AACxC,KAAI,OAAO,OAAO,QAAQ,UAAU;EAClC,MAAM,MAAM;AACZ,MAAI,OAAO,IAAI,SAAS,SACtB,QAAO,IAAI,aACT,IAAI,MACJ,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU,WAChD,IAAI,QACL;;AAGL,KAAI,eAAe,MACjB,QAAO,IAAI,aAAa,gBAAgB,IAAI,QAAQ,EAAE,IAAI,QAAQ;AAEpE,QAAO,IAAI,aAAa,iBAAiB,OAAO,IAAI,CAAC;;;;;ACYvD,IAAIC,eAA4C;AAEhD,SAAS,cAAoC;AAC3C,KAAI,CAAC,aACH,OAAM,IAAI,aACR,mBACA,+FACD;AAEH,QAAO;;;;;;AAOT,eAAe,SACb,IACY;AACZ,KAAI;AACF,SAAO,MAAM,GAAG,aAAa,CAAC;UACvB,KAAK;AACZ,QAAM,eAAe,IAAI;;;AAS7B,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;;;;;;;;;AAUrD,MAAa,OAAO;CAClB,WAAW,OAAO,WAAsC;AACtD,MAAI,CAAC,OAAO,UAAU,OAAO,OAAO,MAAM,KAAK,GAC7C,OAAM,IAAI,MAAM,qCAAqC;EAMvD,MAAM,WAAW,MAAM,OAAO;EAC9B,MAAM,OAAO,SAAS;EACtB,MAAM,eAAe,SAAS;AAE9B,QAAM,MAAM;AAIZ,QAHoB,IAAI,wBACtB,OAAO,iBAAiB,OACzB,CACiB,SAAS;AAE3B,iBAAe,aAAa,KAC1B,KAAK,UAAU;GACb,SAAS,OAAO;GAChB,UAAU,OAAO;GACjB,cAAc;GACd,qBAAqB,qBAAqB;GAC1C,kBAAkB,OAAO;GACzB,OAAO,OAAO;GACf,CAAC,EACF,WAAW,MAAM,KAAK,WAAW,CAClC;;CAGH,IAAI,cAAsB;AACxB,SAAO,aAAa,CAAC,aAAa;;CAEpC,IAAI,YAAgC;AAClC,SAAO,aAAa,CAAC,WAAW,IAAI;;CAEtC,IAAI,kBAA2B;AAC7B,SAAO,aAAa,CAAC,iBAAiB;;CAExC,WAAW,YAA2B;AACpC,eAAa,CAAC,SAAS,QAAQ;;CAGjC,QAAQ,EACN,OAAO,OACL,OACA,eACkB;AAClB,QAAM,UAAU,MAAM,EAAE,MACtB,OACA,aAAa,KAAK,UAAU,WAAW,GAAG,OAC3C,CAAC;IAEL;CAED,MAAM;EACJ,mBAAmB,YAAiC;GAClD,MAAM,IAAK,MAAM,UAAU,MAAM,EAAE,mBAAmB,CAAC;AACvD,SAAM,qBAAqB,EAAE;AAC7B,UAAO;;EAET,iBAAiB,OACf,OACA,aACwB;GACxB,MAAM,IAAK,MAAM,UAAU,MACzB,EAAE,gBAAgB,OAAO,SAAS,CACnC;AACD,SAAM,qBAAqB,EAAE;AAC7B,UAAO;;EAET,iBAAiB,OACf,OACA,aACwB;GACxB,MAAM,IAAK,MAAM,UAAU,MACzB,EAAE,gBAAgB,OAAO,SAAS,CACnC;AACD,SAAM,qBAAqB,EAAE;AAC7B,UAAO;;EAMT,kBAAkB,OAChB,UACA,YACwB;GACxB,MAAM,IAAK,MAAM,UAAU,MACzB,EAAE,iBAAiB,UAAU,QAAQ,CACtC;AACD,SAAM,qBAAqB,EAAE;AAC7B,UAAO;;EAET,SAAS,OAAO,oBAAoB,UAAyB;AAC3D,SAAM,UAAU,MAAM,EAAE,QAAQ,kBAAkB,CAAC;AACnD,yBAAsB,KAAK;;EAE7B,SAAS,YAAiC;GACxC,MAAM,IAAK,MAAM,UAAU,MAAM,EAAE,gBAAgB,CAAC;AACpD,SAAM,qBAAqB,EAAE;AAC7B,UAAO;;EAET,IAAI,YAA4B,MAAM,UAAU,MAAM,EAAE,IAAI,CAAC;EAG7D,YAAY,YAAqC;AAE/C,OAAI,CADS,aAAa,CAChB,iBAAiB,CAAE,QAAO;AAEpC,UAAO,gBADO,MAAM,UAAU,MAAM,EAAE,IAAI,CAAC,CACf;;EAI9B,gBAAgB,YAA6B;AAC3C,UAAO,aAAa,CAAC,aAAa;;EAOpC,oBACE,OACiB;AACjB,mBAAgB,IAAI,GAAG;AACvB,gBAAa;AACX,oBAAgB,OAAO,GAAG;;;EAG/B;CAED,aAAa;EACX,MAAM,OACJ,MACA,UAAuB,EAAE,KAExB,MAAM,UAAU,MAAM,EAAE,gBACvB,MACA,KAAK,UAAU,QAAQ,CACxB,CAAC;EACJ,SAAS,OAAoB,MAAc,OACxC,MAAM,UAAU,MAAM,EAAE,mBAAmB,MAAM,GAAG,CAAC;EACxD,QAAQ,OACN,MACA,QAEC,MAAM,UAAU,MAAM,EAAE,kBAAkB,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC;EACxE,QAAQ,OACN,MACA,IACA,QAEC,MAAM,UAAU,MAAM,EAAE,kBACvB,MACA,IACA,KAAK,UAAU,IAAI,CACpB,CAAC;EACJ,QAAQ,OACN,MACA,OAEC,MAAM,UAAU,MAAM,EAAE,kBAAkB,MAAM,GAAG,CAAC;EAGvD,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,WAOb,MAAM,UAAU,MAAM,EAAE,eACvB,OAAO,QACP,OAAO,UACP,OAAO,UACP,OAAO,WACP,OAAO,cACR,CAAC;EACJ,QAAQ,OAAO,UAAkB,YAC9B,MAAM,UAAU,MAAM,EAAE,cAAc,UAAU,QAAQ,CAAC;EAC7D;CAED,MAAM;EAMJ,UAAU,OACR,OACA,UACA,aAEC,MAAM,UAAU,MAAM,EAAE,aACvB,OACA,UACA,SACD,CAAC;EACJ,YAAY,OAAO,UAAiC;AAClD,SAAM,UAAU,MAAM,EAAE,eAAe,MAAM,CAAC;;EAEhD,WAAW,YACR,MAAM,UAAU,MAAM,EAAE,eAAe,CAAC;EAC3C,WAAW,OAAO,UAAiC;AACjD,SAAM,UAAU,MAAM,EAAE,cAAc,MAAM,CAAC;;EAE/C,aAAa,OAAO,UAAiC;AACnD,SAAM,UAAU,MAAM,EAAE,gBAAgB,MAAM,CAAC;;EAElD;CAED,cAAc;EACZ,MAAM,YACH,MAAM,UAAU,MAAM,EAAE,kBAAkB,CAAC;EAC9C,KAAK,OAAO,SACT,MAAM,UAAU,MAAM,EAAE,gBAAgB,KAAK,CAAC;EAClD;CAED,IAAI,EACF,WAAW,EACT,UAAU,EACR,QAAQ,OAAO,YACZ,MAAM,UAAU,MAAM,EAAE,oBACvB,KAAK,UAAU,QAAQ,CACxB,CAAC,EACL,EACF,EACF;CAED,QAAQ,EACN,OAAO,YACJ,MAAM,UAAU,MAAM,EAAE,aAAa,CAAC,EAC1C;CAED,OAAO,EACL,OAAO,YACJ,MAAM,UAAU,MAAM,EAAE,YAAY,CAAC,EACzC;CAID,cAAc;EACZ,QAAQ,YACL,MAAM,UAAU,MAAM,EAAE,oBAAoB,CAAC;EAChD,aAAa,YACV,MAAM,UAAU,MAAM,EAAE,yBAAyB,CAAC;EACtD;CAED,YAAY;EACV,WAAW,YACR,MAAM,UAAU,MAAM,EAAE,qBAAqB,CAAC;EACjD,KAAK,OAAO,OACT,MAAM,UAAU,MAAM,EAAE,cAAc,GAAG,CAAC;EAC7C,aAAa,OAAO,OACjB,MAAM,UAAU,MAAM,EAAE,sBAAsB,GAAG,CAAC;EACrD,OAAO,OAAO,OACX,MAAM,UAAU,MAAM,EAAE,gBAAgB,GAAG,CAAC;EAChD;CAED,YAAY;EACV,YAAY,YACT,MAAM,UAAU,MAAM,EAAE,sBAAsB,CAAC;EAClD,iBAAiB,OACf,gBAEC,MAAM,UAAU,MAAM,EAAE,0BACvB,YACD,CAAC;EACL;CAED,WAAW;EACT,UAAU,YACP,MAAM,UAAU,MAAM,EAAE,mBAAmB,CAAC;EAC/C,SAAS,OAAO,OACb,MAAM,UAAU,MAAM,EAAE,iBAAiB,GAAG,CAAC;EAChD,UAAU,OAAO,YACd,MAAM,UAAU,MAAM,EAAE,kBACvB,KAAK,UAAU,QAAQ,CACxB,CAAC;EACJ,SAAS,OAAO,YACb,MAAM,UAAU,MAAM,EAAE,iBACvB,KAAK,UAAU,QAAQ,CACxB,CAAC;EACL;CAED,cAAc;EACZ,KAAK,OAAO,QACT,MAAM,UAAU,MAAM,EAAE,gBAAgB,IAAI,CAAC;EAChD,YAAY,OACV,KACA,UAEC,MAAM,UAAU,MAAM,EAAE,uBACvB,KACA,SAAS,OACV,CAAC;EACJ,WAAW,OAAO,QACf,MAAM,UAAU,MAAM,EAAE,sBAAsB,IAAI,CAAC;EACvD;CAED,QAAQ;EACN,MAAM,YACH,MAAM,UAAU,MAAM,EAAE,YAAY,CAAC;EACxC,oBAAoB,OAAO,aACxB,MAAM,UAAU,MAAM,EAAE,yBACvB,SACD,CAAC;EACJ,UAAU,OACR,UACA,kBACA,YAEC,MAAM,UAAU,MAAM,EAAE,eACvB,UACA,kBACA,KAAK,UAAU,QAAQ,CACxB,CAAC;EACL;CAED,IAAI;EACF,YAAY,YACT,MAAM,UAAU,MAAM,EAAE,cAAc,CAAC;EAC1C,YAAY,OAAO,UAChB,MAAM,UAAU,MAAM,EAAE,aACvB,SAAS,OACV,CAAC;EACJ,OAAO,OAAO,aACX,MAAM,UAAU,MAAM,EAAE,QAAQ,SAAS,CAAC;EAC9C;CAED,SAAS;EACP,QAAQ,YACL,MAAM,UAAU,MAAM,EAAE,eAAe,CAAC;EAC3C,SAAS,OAAO,cACb,MAAM,UAAU,MAAM,EAAE,eAAe,UAAU,CAAC;EACtD;CAID,OAAO,EACL,aAAa,OACX,MACA,WAEC,MAAM,UAAU,MAAM,EAAE,iBACvB,QAAQ,QACR,UAAU,OACX,CAAC,EACL;CAED,SAAS;EACP,SAAS,YACN,MAAM,UAAU,MAAM,EAAE,gBAAgB,CAAC;EAC5C,YAAY,YACT,MAAM,UAAU,MAAM,EAAE,mBAAmB,CAAC;EAC/C,WAAW,OAAO,WACf,MAAM,UAAU,MAAM,EAAE,iBAAiB,OAAO,CAAC;EACpD,aAAa,OAAO,WAAkC;AACpD,SAAM,UAAU,MAAM,EAAE,mBAAmB,OAAO,CAAC;;EAErD,aAAa,OAAO,iBAAwC;AAC1D,SAAM,UAAU,MAAM,EAAE,mBAAmB,aAAa,CAAC;;EAE5D;CAED,QAAQ;EACN,QAAQ,OAAO,WACZ,MAAM,UAAU,MAAM,EAAE,aAAa,KAAK,UAAU,OAAO,CAAC,CAAC;EAChE,KAAK,OAAO,OACT,MAAM,UAAU,MAAM,EAAE,UAAU,GAAG,CAAC;EACzC,QAAQ,OAAO,IAAY,UACxB,MAAM,UAAU,MAAM,EAAE,aAAa,IAAI,KAAK,UAAU,MAAM,CAAC,CAAC;EACnE,QAAQ,OAAO,OAA8B;AAC3C,SAAM,UAAU,MAAM,EAAE,aAAa,GAAG,CAAC;;EAE3C,YAAY,OAAO,OAChB,MAAM,UAAU,MAAM,EAAE,iBAAiB,GAAG,CAAC;EAChD,MAAM,OAAO,OACV,MAAM,UAAU,MAAM,EAAE,WAAW,GAAG,CAAC;EAC1C,OAAO,OAAO,OAA8B;AAC1C,SAAM,UAAU,MAAM,EAAE,YAAY,GAAG,CAAC;;EAE1C,QAAQ,OAAO,IAAY,WACxB,MAAM,UAAU,MAAM,EAAE,aAAa,IAAI,OAAO,CAAC;EACrD;CAED,WAAW;EACT,kBAAkB,YACf,MAAM,UAAU,MAAM,EAAE,2BAA2B,CAAC;EACvD,YAAY,OAAO,OAChB,MAAM,UAAU,MAAM,EAAE,oBAAoB,GAAG,CAAC;EACnD,aAAa,OAAO,YACjB,MAAM,UAAU,MAAM,EAAE,qBACvB,KAAK,UAAU,QAAQ,CACxB,CAAC;EACL;CAED,YAAY;EACV,YAAY,OAAO,YAChB,MAAM,UAAU,MAAM,EAAE,qBACvB,KAAK,UAAU,QAAQ,CACxB,CAAC;EACJ,eAAe,OAAO,YACnB,MAAM,UAAU,MAAM,EAAE,wBACvB,KAAK,UAAU,QAAQ,CACxB,CAAC;EACJ,iBAAiB,OAAO,OACrB,MAAM,UAAU,MAAM,EAAE,0BAA0B,GAAG,CAAC;EAC1D;CAED,SAAS;EACP,MAAM,OAAO,YAAoB,aAC9B,MAAM,UAAU,MAAM,EAAE,YAAY,YAAY,SAAS,CAAC;EAC7D,QAAQ,OAAO,WACZ,MAAM,UAAU,MAAM,EAAE,cAAc,KAAK,UAAU,OAAO,CAAC,CAAC;EACjE,QAAQ,OAAO,IAAY,UACxB,MAAM,UAAU,MAAM,EAAE,cAAc,IAAI,KAAK,UAAU,MAAM,CAAC,CAAC;EACpE,QAAQ,OAAO,OAA8B;AAC3C,SAAM,UAAU,MAAM,EAAE,cAAc,GAAG,CAAC;;EAE7C;CAED,OAAO;EACL,YAAY,YACT,MAAM,UAAU,MAAM,EAAE,iBAAiB,CAAC;EAC7C,eAAe,OAAO,eACnB,MAAM,UAAU,MAAM,EAAE,mBAAmB,WAAW,CAAC;EAC3D;CAED,WAAW;EACT,iBAAiB,YACd,MAAM,UAAU,MAAM,EAAE,0BAA0B,CAAC;EACtD,eAAe,OAAO,SACnB,MAAM,UAAU,MAAM,EAAE,uBAAuB,KAAK,CAAC;EACxD,QAAQ,OACN,MACA,YAEC,MAAM,UAAU,MAAM,EAAE,gBACvB,QAAQ,QACR,WAAW,OACZ,CAAC;EACL;CAID,SAAS,EACP,MAAM,YACH,MAAM,UAAU,MAAM,EAAE,aAAa,CAAC,EAC1C;CAED,SAAS;EAKP,UAAU,OACR,UAAkB,cAEjB,MAAM,UAAU,MAAM,EAAE,gBAAgB,QAAQ,CAAC;EAKpD,YAAY,OACV,UAAkB,WAClB,YAEC,MAAM,UAAU,MAAM,EAAE,kBACvB,SACA,SAAS,SAAS,QAClB,SAAS,UAAU,OACpB,CAAC;EACJ,SAAS,OAAO,OACb,MAAM,UAAU,MAAM,EAAE,eAAe,GAAG,CAAC;EAC9C,YAAY,OAAO,IAAY,UAC5B,MAAM,UAAU,MAAM,EAAE,kBACvB,IACA,KAAK,UAAU,MAAM,CACtB,CAAC;EACJ,YAAY,OACV,SACA,SAEC,MAAM,UAAU,MAAM,EAAE,kBACvB,SACA,KAAK,UAAU,KAAK,CACrB,CAAC;EACL;CAED,WAAW;EACT,KAAK,OAAO,cACT,MAAM,UAAU,MAAM,EAAE,aAAa,UAAU,CAAC;EACnD,QAAQ,OAAO,WACZ,MAAM,UAAU,MAAM,EAAE,gBAAgB,KAAK,UAAU,OAAO,CAAC,CAAC;EACpE;CAED,YAAY;EACV,WAAW,YACR,MAAM,UAAU,MAAM,EAAE,qBAAqB,CAAC;EACjD,UAAU,OAAO,YACd,MAAM,UAAU,MAAM,EAAE,mBACvB,KAAK,UAAU,QAAQ,CACxB,CAAC;EACJ,UAAU,YACP,MAAM,UAAU,MAAM,EAAE,oBAAoB,CAAC;EAChD,UAAU,YACP,MAAM,UAAU,MAAM,EAAE,oBAAoB,CAAC;EACjD;CACF;AAED,MAAa,cAAc"}
|
package/dist/index.js
CHANGED
|
@@ -147,7 +147,7 @@ async function notifyFromAuthResult(result) {
|
|
|
147
147
|
const Amba = {
|
|
148
148
|
configure: async (config) => {
|
|
149
149
|
if (!config.apiKey || config.apiKey.trim() === "") throw new Error("Amba.configure: apiKey is required");
|
|
150
|
-
const coreWasm = await import("@layers/amba-core
|
|
150
|
+
const coreWasm = await import("@layers/amba-core");
|
|
151
151
|
const init = coreWasm.default;
|
|
152
152
|
const AmbaCoreWasm = coreWasm.AmbaCoreWasm;
|
|
153
153
|
await init();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["cachedStorage: AsyncStorageStatic | null","prefix: string","coreInstance: AmbaCoreWasmInstance | null"],"sources":["../src/async-storage-adapter.ts","../src/error.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 Rust core's persistence trait. Reads/writes go\n * through a per-prefix namespace so different amba projects can coexist\n * in the 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 Rust core gains a JS-side persistence bridge,\n // this will pre-load the identity record into memory so the WASM\n // core 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 (WASM JsError, native Error, plain objects) into a\n * 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, FFI, 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 | \"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. WASM JsError) → 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 WASM-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 * @layers/amba-react-native — React Native SDK for amba.\n *\n * Companion to `@layers/amba-web`. Same 25-namespace surface, but:\n * - Persists identity in `AsyncStorage` (peer-dep on\n * `@react-native-async-storage/async-storage`) so anonymous_id +\n * session_token survive app restarts.\n * - Push registration takes a native APNs/FCM token from the wrapper\n * layer (host app obtains it via `expo-notifications` or\n * `@react-native-firebase/messaging`).\n * - Sign-in flows expect identity tokens fetched by the host app via\n * `expo-apple-authentication` (Apple) or `expo-auth-session` /\n * `@react-native-google-signin/google-signin` (Google) — see README.\n *\n * Works in Expo Go AND bare React Native via the same WASM core.\n *\n * @example\n * ```tsx\n * import { Amba } from '@layers/amba-react-native';\n *\n * await Amba.configure({ apiKey: 'amba_pk_...' });\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\n// NOTE: `@layers/amba-core-wasm` is intentionally NOT statically imported.\n//\n// Reason (Task #69): this package ships both ESM (`dist/index.js`) and CJS\n// (`dist/index.cjs`) so Expo's autolinker — which `require()`s our entry\n// from a Node CJS context during `expo prebuild` — can resolve us. But\n// `@layers/amba-core-wasm` is ESM-only (no `require` export condition,\n// since it's `wasm-pack` ESM output). A top-level `import` of it would\n// be lowered to a top-level `require(\"@layers/amba-core-wasm\")` in our\n// CJS dist, and that `require()` would crash with\n// `ERR_PACKAGE_PATH_NOT_EXPORTED` the moment Expo autolinker loads us.\n//\n// Lazy-loading via dynamic `import()` (inside `configure()`) sidesteps\n// this: Expo's autolinker can `require()` our CJS entry and inspect\n// metadata without ever firing the WASM core load. Metro/RN at app\n// runtime still picks the ESM dist and the dynamic import resolves\n// normally.\ntype CoreWasmModule = typeof import(\"@layers/amba-core-wasm\");\n// `AmbaCoreWasm` declares a `private constructor()` (wasm-pack pattern),\n// so `InstanceType<typeof AmbaCoreWasm>` is rejected by TS as\n// \"Cannot assign a 'private' constructor type to a 'public' constructor\n// type\". Type the instance from the public static factory instead.\ntype AmbaCoreWasmInstance = ReturnType<CoreWasmModule[\"AmbaCoreWasm\"][\"init\"]>;\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 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 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\";\nimport { AmbaApiError, toAmbaApiError } from \"./error\";\nimport type { Session } from \"./types\";\n\nexport { AmbaApiError } from \"./error\";\nexport type { AmbaApiErrorCode } from \"./error\";\n\nlet coreInstance: AmbaCoreWasmInstance | null = null;\n\nfunction requireCore(): AmbaCoreWasmInstance {\n if (!coreInstance) {\n throw new AmbaApiError(\n \"NOT_INITIALIZED\",\n \"@layers/amba-react-native: SDK not configured. Call Amba.configure({ apiKey }) at app start.\",\n );\n }\n return coreInstance;\n}\n\n/**\n * Run a single WASM-core call and rewrap any thrown value into a\n * stable `AmbaApiError`. Mirrors the helper in `@layers/amba-web`.\n */\nasync function coreCall<T>(\n fn: (c: AmbaCoreWasmInstance) => Promise<T>,\n): Promise<T> {\n try {\n return await fn(requireCore());\n } catch (err) {\n throw toAmbaApiError(err);\n }\n}\n\n/**\n * In-SDK auth-state pub/sub. Mirrors the web SDK shape so\n * `Amba.auth.onAuthStateChange` works identically across packages.\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/**\n * Top-level SDK namespace for React Native.\n *\n * Differences from `@layers/amba-web`:\n * - `configure` is async (waits for WASM init AND AsyncStorage hydration).\n * - Persistence is AsyncStorage-backed — identity survives app restarts.\n */\nexport const Amba = {\n configure: async (config: AmbaConfig): Promise<void> => {\n if (!config.apiKey || config.apiKey.trim() === \"\") {\n throw new Error(\"Amba.configure: apiKey is required\");\n }\n // Lazy-load the WASM core. See the top-of-file note on Task #69:\n // a static `import` would lower to a top-level `require()` in the\n // CJS dist, which crashes Expo's autolinker because core-wasm is\n // ESM-only. Dynamic import works from both ESM and CJS contexts.\n const coreWasm = await import(\"@layers/amba-core-wasm\");\n const init = coreWasm.default;\n const AmbaCoreWasm = coreWasm.AmbaCoreWasm;\n\n await init();\n const persistence = new AsyncStoragePersistence(\n config.storagePrefix ?? \"amba\",\n );\n await persistence.hydrate();\n\n coreInstance = AmbaCoreWasm.init(\n JSON.stringify({\n api_key: config.apiKey,\n base_url: config.baseUrl,\n sdk_platform: \"react-native\",\n sdk_wrapper_version: `amba-react-native/${SDK_VERSION}`,\n consent_required: config.consentRequired,\n debug: config.debug,\n }),\n globalThis.fetch.bind(globalThis),\n );\n },\n\n get anonymousId(): string {\n return requireCore().anonymousId();\n },\n get appUserId(): string | undefined {\n return requireCore().appUserId() ?? undefined;\n },\n get isAuthenticated(): boolean {\n return requireCore().isAuthenticated();\n },\n setDebug: (enabled: boolean): void => {\n requireCore().setDebug(enabled);\n },\n\n events: {\n track: async (\n event: string,\n properties?: Record<string, unknown>,\n ): Promise<void> => {\n await coreCall((c) => c.track(\n event,\n properties ? JSON.stringify(properties) : undefined,\n ));\n },\n },\n\n auth: {\n signInAnonymously: async (): Promise<AuthResult> => {\n const r = (await coreCall((c) => c.signInAnonymously())) as AuthResult;\n await notifyFromAuthResult(r);\n return r;\n },\n signInWithEmail: async (\n email: string,\n password: string,\n ): Promise<AuthResult> => {\n const r = (await coreCall((c) =>\n c.signInWithEmail(email, password),\n )) as AuthResult;\n await notifyFromAuthResult(r);\n return r;\n },\n signUpWithEmail: async (\n email: string,\n password: string,\n ): Promise<AuthResult> => {\n const r = (await coreCall((c) =>\n c.signUpWithEmail(email, password),\n )) as AuthResult;\n await notifyFromAuthResult(r);\n return r;\n },\n /**\n * Sign in with an Apple / Google identity token. The host app obtains\n * the token via `expo-apple-authentication` or `expo-auth-session`.\n */\n signInWithSocial: async (\n provider: SocialProvider,\n idToken: string,\n ): Promise<AuthResult> => {\n const r = (await coreCall((c) =>\n c.signInWithSocial(provider, idToken),\n )) as AuthResult;\n await notifyFromAuthResult(r);\n return r;\n },\n signOut: async (rotateAnonymousId = false): Promise<void> => {\n await coreCall((c) => c.signOut(rotateAnonymousId));\n notifyAuthSubscribers(null);\n },\n refresh: async (): Promise<AuthResult> => {\n const r = (await coreCall((c) => c.refreshSession())) as AuthResult;\n await notifyFromAuthResult(r);\n return r;\n },\n me: async (): Promise<User> => (await coreCall((c) => c.me())) as User,\n\n /** Snapshot the current session, or null if not authenticated. */\n getSession: async (): Promise<Session | null> => {\n const core = requireCore();\n if (!core.isAuthenticated()) return null;\n const user = (await coreCall((c) => c.me())) as User;\n return snapshotSession(user);\n },\n\n /** Stable anonymous identifier. */\n getAnonymousId: async (): Promise<string> => {\n return requireCore().anonymousId();\n },\n\n /**\n * Subscribe to session changes. Fires after every signIn* / signUp* /\n * refresh / signOut. Returns an unsubscribe function.\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 (await coreCall((c) => c.collectionsFind(\n name,\n JSON.stringify(options),\n ))) as FindResponse<T>,\n findOne: async <T = unknown>(name: string, id: string): Promise<T> =>\n (await coreCall((c) => c.collectionsFindOne(name, id))) as T,\n insert: async <T = unknown>(\n name: string,\n row: Record<string, unknown>,\n ): Promise<T> =>\n (await coreCall((c) => c.collectionsInsert(name, JSON.stringify(row)))) as T,\n update: async <T = unknown>(\n name: string,\n id: string,\n set: Record<string, unknown>,\n ): Promise<T> =>\n (await coreCall((c) => c.collectionsUpdate(\n name,\n id,\n JSON.stringify(set),\n ))) as T,\n delete: async (\n name: string,\n id: string,\n ): Promise<{ data: { deleted: boolean } }> =>\n (await coreCall((c) => c.collectionsDelete(name, id))) as {\n data: { deleted: boolean };\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 (await coreCall((c) => c.storagePresign(\n params.bucket,\n params.filename,\n params.mimeType,\n params.sizeBytes,\n params.retentionDays,\n ))) as PresignData,\n commit: async (uploadId: string, assetId: string): Promise<MediaAsset> =>\n (await coreCall((c) => c.storageCommit(uploadId, assetId))) as MediaAsset,\n },\n\n push: {\n /**\n * Register a native push token. On iOS, pass the APNs token from\n * `expo-notifications` `getDevicePushTokenAsync()` with platform `'apns'`.\n * On Android, pass the FCM token with platform `'fcm'`.\n */\n register: async (\n token: string,\n platform: PushPlatform,\n bundleId?: string,\n ): Promise<PushToken> =>\n (await coreCall((c) => c.pushRegister(\n token,\n platform,\n bundleId,\n ))) as PushToken,\n unregister: async (token: string): Promise<void> => {\n await coreCall((c) => c.pushUnregister(token));\n },\n getTokens: async (): Promise<PushToken[]> =>\n (await coreCall((c) => c.pushGetTokens())) as PushToken[],\n subscribe: async (topic: string): Promise<void> => {\n await coreCall((c) => c.pushSubscribe(topic));\n },\n unsubscribe: async (topic: string): Promise<void> => {\n await coreCall((c) => c.pushUnsubscribe(topic));\n },\n },\n\n entitlements: {\n list: async (): Promise<UserEntitlement[]> =>\n (await coreCall((c) => c.entitlementsList())) as UserEntitlement[],\n has: async (name: string): Promise<boolean> =>\n (await coreCall((c) => c.entitlementsHas(name))) as boolean,\n },\n\n ai: {\n anthropic: {\n messages: {\n create: async (request: AiMessageRequest): Promise<AiMessageResponse> =>\n (await coreCall((c) => c.aiAnthropicMessages(\n JSON.stringify(request),\n ))) as AiMessageResponse,\n },\n },\n },\n\n config: {\n fetch: async (): Promise<ConfigBundle> =>\n (await coreCall((c) => c.configFetch())) as ConfigBundle,\n },\n\n flags: {\n fetch: async (): Promise<FlagAssignment[]> =>\n (await coreCall((c) => c.flagsFetch())) as FlagAssignment[],\n },\n\n // ── Gamification ──────────────────────────────────────────────────\n\n achievements: {\n getAll: async (): Promise<Achievement[]> =>\n (await coreCall((c) => c.achievementsGetAll())) as Achievement[],\n getProgress: async (): Promise<AchievementProgress[]> =>\n (await coreCall((c) => c.achievementsGetProgress())) as AchievementProgress[],\n },\n\n challenges: {\n getActive: async (): Promise<Challenge[]> =>\n (await coreCall((c) => c.challengesGetActive())) as Challenge[],\n get: async (id: string): Promise<Challenge> =>\n (await coreCall((c) => c.challengesGet(id))) as Challenge,\n getProgress: async (id: string): Promise<ChallengeProgress> =>\n (await coreCall((c) => c.challengesGetProgress(id))) as ChallengeProgress,\n claim: async (id: string): Promise<ChallengeProgress> =>\n (await coreCall((c) => c.challengesClaim(id))) as ChallengeProgress,\n },\n\n currencies: {\n getBalance: async (): Promise<CurrencyBalance[]> =>\n (await coreCall((c) => c.currenciesGetBalance())) as CurrencyBalance[],\n getTransactions: async (\n currencyKey: string,\n ): Promise<CurrencyTransaction[]> =>\n (await coreCall((c) => c.currenciesGetTransactions(\n currencyKey,\n ))) as CurrencyTransaction[],\n },\n\n inventory: {\n getItems: async (): Promise<InventoryItem[]> =>\n (await coreCall((c) => c.inventoryGetItems())) as InventoryItem[],\n getItem: async (id: string): Promise<InventoryItem> =>\n (await coreCall((c) => c.inventoryGetItem(id))) as InventoryItem,\n purchase: async (request: PurchaseRequest): Promise<InventoryItem> =>\n (await coreCall((c) => c.inventoryPurchase(\n JSON.stringify(request),\n ))) as InventoryItem,\n consume: async (request: ConsumeRequest): Promise<InventoryItem> =>\n (await coreCall((c) => c.inventoryConsume(\n JSON.stringify(request),\n ))) as InventoryItem,\n },\n\n leaderboards: {\n get: async (key: string): Promise<Leaderboard> =>\n (await coreCall((c) => c.leaderboardsGet(key))) as Leaderboard,\n getEntries: async (\n key: string,\n limit?: number,\n ): Promise<LeaderboardEntry[]> =>\n (await coreCall((c) => c.leaderboardsGetEntries(\n key,\n limit ?? undefined,\n ))) as LeaderboardEntry[],\n getMyRank: async (key: string): Promise<LeaderboardEntry> =>\n (await coreCall((c) => c.leaderboardsGetMyRank(key))) as LeaderboardEntry,\n },\n\n stores: {\n list: async (): Promise<Store[]> =>\n (await coreCall((c) => c.storesList())) as Store[],\n getPurchaseOptions: async (storeKey: string): Promise<PurchaseOption[]> =>\n (await coreCall((c) => c.storesGetPurchaseOptions(\n storeKey,\n ))) as PurchaseOption[],\n purchase: async (\n storeKey: string,\n purchaseOptionId: string,\n receipt: unknown,\n ): Promise<PurchaseResult> =>\n (await coreCall((c) => c.storesPurchase(\n storeKey,\n purchaseOptionId,\n JSON.stringify(receipt),\n ))) as PurchaseResult,\n },\n\n xp: {\n getBalance: async (): Promise<XpBalance> =>\n (await coreCall((c) => c.xpGetBalance())) as XpBalance,\n getHistory: async (limit?: number): Promise<XpTransaction[]> =>\n (await coreCall((c) => c.xpGetHistory(\n limit ?? undefined,\n ))) as XpTransaction[],\n claim: async (grantKey: string): Promise<XpTransaction> =>\n (await coreCall((c) => c.xpClaim(grantKey))) as XpTransaction,\n },\n\n streaks: {\n getAll: async (): Promise<Streak[]> =>\n (await coreCall((c) => c.streaksGetAll())) as Streak[],\n qualify: async (streakKey: string): Promise<Streak> =>\n (await coreCall((c) => c.streaksQualify(streakKey))) as Streak,\n },\n\n // ── Social ─────────────────────────────────────────────────────────\n\n feeds: {\n getActivity: async (\n feed?: string,\n cursor?: string,\n ): Promise<FeedResponse> =>\n (await coreCall((c) => c.feedsGetActivity(\n feed ?? undefined,\n cursor ?? undefined,\n ))) as FeedResponse,\n },\n\n friends: {\n getList: async (): Promise<Friendship[]> =>\n (await coreCall((c) => c.friendsGetList())) as Friendship[],\n getFriends: async (): Promise<Friendship[]> =>\n (await coreCall((c) => c.friendsGetFriends())) as Friendship[],\n blockUser: async (userId: string): Promise<Friendship> =>\n (await coreCall((c) => c.friendsBlockUser(userId))) as Friendship,\n unblockUser: async (userId: string): Promise<void> => {\n await coreCall((c) => c.friendsUnblockUser(userId));\n },\n removeBlock: async (friendshipId: string): Promise<void> => {\n await coreCall((c) => c.friendsRemoveBlock(friendshipId));\n },\n },\n\n groups: {\n create: async (params: GroupCreate): Promise<Group> =>\n (await coreCall((c) => c.groupsCreate(JSON.stringify(params)))) as Group,\n get: async (id: string): Promise<Group> =>\n (await coreCall((c) => c.groupsGet(id))) as Group,\n update: async (id: string, patch: GroupUpdate): Promise<Group> =>\n (await coreCall((c) => c.groupsUpdate(id, JSON.stringify(patch)))) as Group,\n delete: async (id: string): Promise<void> => {\n await coreCall((c) => c.groupsDelete(id));\n },\n getMembers: async (id: string): Promise<GroupMember[]> =>\n (await coreCall((c) => c.groupsGetMembers(id))) as GroupMember[],\n join: async (id: string): Promise<GroupMember> =>\n (await coreCall((c) => c.groupsJoin(id))) as GroupMember,\n leave: async (id: string): Promise<void> => {\n await coreCall((c) => c.groupsLeave(id));\n },\n invite: async (id: string, userId: string): Promise<GroupMember> =>\n (await coreCall((c) => c.groupsInvite(id, userId))) as GroupMember,\n },\n\n messaging: {\n getConversations: async (): Promise<Conversation[]> =>\n (await coreCall((c) => c.messagingGetConversations())) as Conversation[],\n getMessage: async (id: string): Promise<Message> =>\n (await coreCall((c) => c.messagingGetMessage(id))) as Message,\n sendMessage: async (request: SendMessageRequest): Promise<Message> =>\n (await coreCall((c) => c.messagingSendMessage(\n JSON.stringify(request),\n ))) as Message,\n },\n\n moderation: {\n reportUser: async (request: ReportRequest): Promise<Report> =>\n (await coreCall((c) => c.moderationReportUser(\n JSON.stringify(request),\n ))) as Report,\n reportContent: async (request: ReportRequest): Promise<Report> =>\n (await coreCall((c) => c.moderationReportContent(\n JSON.stringify(request),\n ))) as Report,\n getReportStatus: async (id: string): Promise<Report> =>\n (await coreCall((c) => c.moderationGetReportStatus(id))) as Report,\n },\n\n reviews: {\n list: async (targetType: string, targetId: string): Promise<Review[]> =>\n (await coreCall((c) => c.reviewsList(targetType, targetId))) as Review[],\n create: async (params: ReviewCreate): Promise<Review> =>\n (await coreCall((c) => c.reviewsCreate(JSON.stringify(params)))) as Review,\n update: async (id: string, patch: ReviewUpdate): Promise<Review> =>\n (await coreCall((c) => c.reviewsUpdate(id, JSON.stringify(patch)))) as Review,\n delete: async (id: string): Promise<void> => {\n await coreCall((c) => c.reviewsDelete(id));\n },\n },\n\n roles: {\n getMyRoles: async (): Promise<Role[]> =>\n (await coreCall((c) => c.rolesGetMyRoles())) as Role[],\n hasPermission: async (permission: string): Promise<boolean> =>\n (await coreCall((c) => c.rolesHasPermission(permission))) as boolean,\n },\n\n referrals: {\n getReferralCode: async (): Promise<ReferralCode> =>\n (await coreCall((c) => c.referralsGetReferralCode())) as ReferralCode,\n claimReferral: async (code: string): Promise<ReferralClaim> =>\n (await coreCall((c) => c.referralsClaimReferral(code))) as ReferralClaim,\n create: async (\n code?: string,\n maxUses?: number,\n ): Promise<ReferralCode> =>\n (await coreCall((c) => c.referralsCreate(\n code ?? undefined,\n maxUses ?? undefined,\n ))) as ReferralCode,\n },\n\n // ── Lifecycle ──────────────────────────────────────────────────────\n\n catalog: {\n list: async (): Promise<CatalogItem[]> =>\n (await coreCall((c) => c.catalogList())) as CatalogItem[],\n },\n\n content: {\n /**\n * Get today's published item for `channel`. Defaults to `\"default\"`\n * so single-channel apps can call `Amba.content.getToday()` bare.\n */\n getToday: async (\n channel: string = \"default\",\n ): Promise<ContentItem | null> =>\n (await coreCall((c) => c.contentGetToday(channel))) as ContentItem | null,\n /**\n * Paginated library list for `channel`. `options.limit` caps page size;\n * `options.cursor` is the opaque token returned by a prior page.\n */\n getLibrary: async (\n channel: string = \"default\",\n options?: { limit?: number; cursor?: string },\n ): Promise<ContentItem[]> =>\n (await coreCall((c) => c.contentGetLibrary(\n channel,\n options?.limit ?? undefined,\n options?.cursor ?? undefined,\n ))) as ContentItem[],\n getItem: async (id: string): Promise<ContentItem> =>\n (await coreCall((c) => c.contentGetItem(id))) as ContentItem,\n updateItem: async (id: string, state: unknown): Promise<ContentItem> =>\n (await coreCall((c) => c.contentUpdateItem(\n id,\n JSON.stringify(state),\n ))) as ContentItem,\n createItem: async (\n channel: string,\n item: unknown,\n ): Promise<ContentItem> =>\n (await coreCall((c) => c.contentCreateItem(\n channel,\n JSON.stringify(item),\n ))) as ContentItem,\n },\n\n deepLinks: {\n get: async (shortCode: string): Promise<DeepLink> =>\n (await coreCall((c) => c.deepLinksGet(shortCode))) as DeepLink,\n create: async (params: DeepLinkCreate): Promise<DeepLink> =>\n (await coreCall((c) => c.deepLinksCreate(JSON.stringify(params)))) as DeepLink,\n },\n\n onboarding: {\n getStatus: async (): Promise<OnboardingStatus> =>\n (await coreCall((c) => c.onboardingGetStatus())) as OnboardingStatus,\n nextStep: async (payload: unknown): Promise<OnboardingStatus> =>\n (await coreCall((c) => c.onboardingNextStep(\n JSON.stringify(payload),\n ))) as OnboardingStatus,\n skipStep: async (): Promise<OnboardingStatus> =>\n (await coreCall((c) => c.onboardingSkipStep())) as OnboardingStatus,\n complete: async (): Promise<OnboardingStatus> =>\n (await coreCall((c) => c.onboardingComplete())) as OnboardingStatus,\n },\n};\n\nexport const SDK_VERSION = \"0.1.0\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["cachedStorage: AsyncStorageStatic | null","prefix: string","coreInstance: AmbaCoreWasmInstance | null"],"sources":["../src/async-storage-adapter.ts","../src/error.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 Rust core's persistence trait. Reads/writes go\n * through a per-prefix namespace so different amba projects can coexist\n * in the 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 Rust core gains a JS-side persistence bridge,\n // this will pre-load the identity record into memory so the WASM\n // core 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 (WASM JsError, native Error, plain objects) into a\n * 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, FFI, 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 | \"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. WASM JsError) → 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 WASM-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 * @layers/amba-react-native — React Native SDK for amba.\n *\n * Companion to `@layers/amba-web`. Same 25-namespace surface, but:\n * - Persists identity in `AsyncStorage` (peer-dep on\n * `@react-native-async-storage/async-storage`) so anonymous_id +\n * session_token survive app restarts.\n * - Push registration takes a native APNs/FCM token from the wrapper\n * layer (host app obtains it via `expo-notifications` or\n * `@react-native-firebase/messaging`).\n * - Sign-in flows expect identity tokens fetched by the host app via\n * `expo-apple-authentication` (Apple) or `expo-auth-session` /\n * `@react-native-google-signin/google-signin` (Google) — see README.\n *\n * Works in Expo Go AND bare React Native via the same WASM core.\n *\n * @example\n * ```tsx\n * import { Amba } from '@layers/amba-react-native';\n *\n * await Amba.configure({ apiKey: 'amba_pk_...' });\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\n// NOTE: `@layers/amba-core` is intentionally NOT statically imported.\n//\n// Reason (Task #69): this package ships both ESM (`dist/index.js`) and CJS\n// (`dist/index.cjs`) so Expo's autolinker — which `require()`s our entry\n// from a Node CJS context during `expo prebuild` — can resolve us. But\n// `@layers/amba-core` is ESM-only (no `require` export condition,\n// since it's `wasm-pack` ESM output). A top-level `import` of it would\n// be lowered to a top-level `require(\"@layers/amba-core\")` in our\n// CJS dist, and that `require()` would crash with\n// `ERR_PACKAGE_PATH_NOT_EXPORTED` the moment Expo autolinker loads us.\n//\n// Lazy-loading via dynamic `import()` (inside `configure()`) sidesteps\n// this: Expo's autolinker can `require()` our CJS entry and inspect\n// metadata without ever firing the WASM core load. Metro/RN at app\n// runtime still picks the ESM dist and the dynamic import resolves\n// normally.\ntype CoreWasmModule = typeof import(\"@layers/amba-core\");\n// `AmbaCoreWasm` declares a `private constructor()` (wasm-pack pattern),\n// so `InstanceType<typeof AmbaCoreWasm>` is rejected by TS as\n// \"Cannot assign a 'private' constructor type to a 'public' constructor\n// type\". Type the instance from the public static factory instead.\ntype AmbaCoreWasmInstance = ReturnType<CoreWasmModule[\"AmbaCoreWasm\"][\"init\"]>;\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 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 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\";\nimport { AmbaApiError, toAmbaApiError } from \"./error\";\nimport type { Session } from \"./types\";\n\nexport { AmbaApiError } from \"./error\";\nexport type { AmbaApiErrorCode } from \"./error\";\n\nlet coreInstance: AmbaCoreWasmInstance | null = null;\n\nfunction requireCore(): AmbaCoreWasmInstance {\n if (!coreInstance) {\n throw new AmbaApiError(\n \"NOT_INITIALIZED\",\n \"@layers/amba-react-native: SDK not configured. Call Amba.configure({ apiKey }) at app start.\",\n );\n }\n return coreInstance;\n}\n\n/**\n * Run a single WASM-core call and rewrap any thrown value into a\n * stable `AmbaApiError`. Mirrors the helper in `@layers/amba-web`.\n */\nasync function coreCall<T>(\n fn: (c: AmbaCoreWasmInstance) => Promise<T>,\n): Promise<T> {\n try {\n return await fn(requireCore());\n } catch (err) {\n throw toAmbaApiError(err);\n }\n}\n\n/**\n * In-SDK auth-state pub/sub. Mirrors the web SDK shape so\n * `Amba.auth.onAuthStateChange` works identically across packages.\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/**\n * Top-level SDK namespace for React Native.\n *\n * Differences from `@layers/amba-web`:\n * - `configure` is async (waits for WASM init AND AsyncStorage hydration).\n * - Persistence is AsyncStorage-backed — identity survives app restarts.\n */\nexport const Amba = {\n configure: async (config: AmbaConfig): Promise<void> => {\n if (!config.apiKey || config.apiKey.trim() === \"\") {\n throw new Error(\"Amba.configure: apiKey is required\");\n }\n // Lazy-load the WASM core. See the top-of-file note on Task #69:\n // a static `import` would lower to a top-level `require()` in the\n // CJS dist, which crashes Expo's autolinker because core-wasm is\n // ESM-only. Dynamic import works from both ESM and CJS contexts.\n const coreWasm = await import(\"@layers/amba-core\");\n const init = coreWasm.default;\n const AmbaCoreWasm = coreWasm.AmbaCoreWasm;\n\n await init();\n const persistence = new AsyncStoragePersistence(\n config.storagePrefix ?? \"amba\",\n );\n await persistence.hydrate();\n\n coreInstance = AmbaCoreWasm.init(\n JSON.stringify({\n api_key: config.apiKey,\n base_url: config.baseUrl,\n sdk_platform: \"react-native\",\n sdk_wrapper_version: `amba-react-native/${SDK_VERSION}`,\n consent_required: config.consentRequired,\n debug: config.debug,\n }),\n globalThis.fetch.bind(globalThis),\n );\n },\n\n get anonymousId(): string {\n return requireCore().anonymousId();\n },\n get appUserId(): string | undefined {\n return requireCore().appUserId() ?? undefined;\n },\n get isAuthenticated(): boolean {\n return requireCore().isAuthenticated();\n },\n setDebug: (enabled: boolean): void => {\n requireCore().setDebug(enabled);\n },\n\n events: {\n track: async (\n event: string,\n properties?: Record<string, unknown>,\n ): Promise<void> => {\n await coreCall((c) => c.track(\n event,\n properties ? JSON.stringify(properties) : undefined,\n ));\n },\n },\n\n auth: {\n signInAnonymously: async (): Promise<AuthResult> => {\n const r = (await coreCall((c) => c.signInAnonymously())) as AuthResult;\n await notifyFromAuthResult(r);\n return r;\n },\n signInWithEmail: async (\n email: string,\n password: string,\n ): Promise<AuthResult> => {\n const r = (await coreCall((c) =>\n c.signInWithEmail(email, password),\n )) as AuthResult;\n await notifyFromAuthResult(r);\n return r;\n },\n signUpWithEmail: async (\n email: string,\n password: string,\n ): Promise<AuthResult> => {\n const r = (await coreCall((c) =>\n c.signUpWithEmail(email, password),\n )) as AuthResult;\n await notifyFromAuthResult(r);\n return r;\n },\n /**\n * Sign in with an Apple / Google identity token. The host app obtains\n * the token via `expo-apple-authentication` or `expo-auth-session`.\n */\n signInWithSocial: async (\n provider: SocialProvider,\n idToken: string,\n ): Promise<AuthResult> => {\n const r = (await coreCall((c) =>\n c.signInWithSocial(provider, idToken),\n )) as AuthResult;\n await notifyFromAuthResult(r);\n return r;\n },\n signOut: async (rotateAnonymousId = false): Promise<void> => {\n await coreCall((c) => c.signOut(rotateAnonymousId));\n notifyAuthSubscribers(null);\n },\n refresh: async (): Promise<AuthResult> => {\n const r = (await coreCall((c) => c.refreshSession())) as AuthResult;\n await notifyFromAuthResult(r);\n return r;\n },\n me: async (): Promise<User> => (await coreCall((c) => c.me())) as User,\n\n /** Snapshot the current session, or null if not authenticated. */\n getSession: async (): Promise<Session | null> => {\n const core = requireCore();\n if (!core.isAuthenticated()) return null;\n const user = (await coreCall((c) => c.me())) as User;\n return snapshotSession(user);\n },\n\n /** Stable anonymous identifier. */\n getAnonymousId: async (): Promise<string> => {\n return requireCore().anonymousId();\n },\n\n /**\n * Subscribe to session changes. Fires after every signIn* / signUp* /\n * refresh / signOut. Returns an unsubscribe function.\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 (await coreCall((c) => c.collectionsFind(\n name,\n JSON.stringify(options),\n ))) as FindResponse<T>,\n findOne: async <T = unknown>(name: string, id: string): Promise<T> =>\n (await coreCall((c) => c.collectionsFindOne(name, id))) as T,\n insert: async <T = unknown>(\n name: string,\n row: Record<string, unknown>,\n ): Promise<T> =>\n (await coreCall((c) => c.collectionsInsert(name, JSON.stringify(row)))) as T,\n update: async <T = unknown>(\n name: string,\n id: string,\n set: Record<string, unknown>,\n ): Promise<T> =>\n (await coreCall((c) => c.collectionsUpdate(\n name,\n id,\n JSON.stringify(set),\n ))) as T,\n delete: async (\n name: string,\n id: string,\n ): Promise<{ data: { deleted: boolean } }> =>\n (await coreCall((c) => c.collectionsDelete(name, id))) as {\n data: { deleted: boolean };\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 (await coreCall((c) => c.storagePresign(\n params.bucket,\n params.filename,\n params.mimeType,\n params.sizeBytes,\n params.retentionDays,\n ))) as PresignData,\n commit: async (uploadId: string, assetId: string): Promise<MediaAsset> =>\n (await coreCall((c) => c.storageCommit(uploadId, assetId))) as MediaAsset,\n },\n\n push: {\n /**\n * Register a native push token. On iOS, pass the APNs token from\n * `expo-notifications` `getDevicePushTokenAsync()` with platform `'apns'`.\n * On Android, pass the FCM token with platform `'fcm'`.\n */\n register: async (\n token: string,\n platform: PushPlatform,\n bundleId?: string,\n ): Promise<PushToken> =>\n (await coreCall((c) => c.pushRegister(\n token,\n platform,\n bundleId,\n ))) as PushToken,\n unregister: async (token: string): Promise<void> => {\n await coreCall((c) => c.pushUnregister(token));\n },\n getTokens: async (): Promise<PushToken[]> =>\n (await coreCall((c) => c.pushGetTokens())) as PushToken[],\n subscribe: async (topic: string): Promise<void> => {\n await coreCall((c) => c.pushSubscribe(topic));\n },\n unsubscribe: async (topic: string): Promise<void> => {\n await coreCall((c) => c.pushUnsubscribe(topic));\n },\n },\n\n entitlements: {\n list: async (): Promise<UserEntitlement[]> =>\n (await coreCall((c) => c.entitlementsList())) as UserEntitlement[],\n has: async (name: string): Promise<boolean> =>\n (await coreCall((c) => c.entitlementsHas(name))) as boolean,\n },\n\n ai: {\n anthropic: {\n messages: {\n create: async (request: AiMessageRequest): Promise<AiMessageResponse> =>\n (await coreCall((c) => c.aiAnthropicMessages(\n JSON.stringify(request),\n ))) as AiMessageResponse,\n },\n },\n },\n\n config: {\n fetch: async (): Promise<ConfigBundle> =>\n (await coreCall((c) => c.configFetch())) as ConfigBundle,\n },\n\n flags: {\n fetch: async (): Promise<FlagAssignment[]> =>\n (await coreCall((c) => c.flagsFetch())) as FlagAssignment[],\n },\n\n // ── Gamification ──────────────────────────────────────────────────\n\n achievements: {\n getAll: async (): Promise<Achievement[]> =>\n (await coreCall((c) => c.achievementsGetAll())) as Achievement[],\n getProgress: async (): Promise<AchievementProgress[]> =>\n (await coreCall((c) => c.achievementsGetProgress())) as AchievementProgress[],\n },\n\n challenges: {\n getActive: async (): Promise<Challenge[]> =>\n (await coreCall((c) => c.challengesGetActive())) as Challenge[],\n get: async (id: string): Promise<Challenge> =>\n (await coreCall((c) => c.challengesGet(id))) as Challenge,\n getProgress: async (id: string): Promise<ChallengeProgress> =>\n (await coreCall((c) => c.challengesGetProgress(id))) as ChallengeProgress,\n claim: async (id: string): Promise<ChallengeProgress> =>\n (await coreCall((c) => c.challengesClaim(id))) as ChallengeProgress,\n },\n\n currencies: {\n getBalance: async (): Promise<CurrencyBalance[]> =>\n (await coreCall((c) => c.currenciesGetBalance())) as CurrencyBalance[],\n getTransactions: async (\n currencyKey: string,\n ): Promise<CurrencyTransaction[]> =>\n (await coreCall((c) => c.currenciesGetTransactions(\n currencyKey,\n ))) as CurrencyTransaction[],\n },\n\n inventory: {\n getItems: async (): Promise<InventoryItem[]> =>\n (await coreCall((c) => c.inventoryGetItems())) as InventoryItem[],\n getItem: async (id: string): Promise<InventoryItem> =>\n (await coreCall((c) => c.inventoryGetItem(id))) as InventoryItem,\n purchase: async (request: PurchaseRequest): Promise<InventoryItem> =>\n (await coreCall((c) => c.inventoryPurchase(\n JSON.stringify(request),\n ))) as InventoryItem,\n consume: async (request: ConsumeRequest): Promise<InventoryItem> =>\n (await coreCall((c) => c.inventoryConsume(\n JSON.stringify(request),\n ))) as InventoryItem,\n },\n\n leaderboards: {\n get: async (key: string): Promise<Leaderboard> =>\n (await coreCall((c) => c.leaderboardsGet(key))) as Leaderboard,\n getEntries: async (\n key: string,\n limit?: number,\n ): Promise<LeaderboardEntry[]> =>\n (await coreCall((c) => c.leaderboardsGetEntries(\n key,\n limit ?? undefined,\n ))) as LeaderboardEntry[],\n getMyRank: async (key: string): Promise<LeaderboardEntry> =>\n (await coreCall((c) => c.leaderboardsGetMyRank(key))) as LeaderboardEntry,\n },\n\n stores: {\n list: async (): Promise<Store[]> =>\n (await coreCall((c) => c.storesList())) as Store[],\n getPurchaseOptions: async (storeKey: string): Promise<PurchaseOption[]> =>\n (await coreCall((c) => c.storesGetPurchaseOptions(\n storeKey,\n ))) as PurchaseOption[],\n purchase: async (\n storeKey: string,\n purchaseOptionId: string,\n receipt: unknown,\n ): Promise<PurchaseResult> =>\n (await coreCall((c) => c.storesPurchase(\n storeKey,\n purchaseOptionId,\n JSON.stringify(receipt),\n ))) as PurchaseResult,\n },\n\n xp: {\n getBalance: async (): Promise<XpBalance> =>\n (await coreCall((c) => c.xpGetBalance())) as XpBalance,\n getHistory: async (limit?: number): Promise<XpTransaction[]> =>\n (await coreCall((c) => c.xpGetHistory(\n limit ?? undefined,\n ))) as XpTransaction[],\n claim: async (grantKey: string): Promise<XpTransaction> =>\n (await coreCall((c) => c.xpClaim(grantKey))) as XpTransaction,\n },\n\n streaks: {\n getAll: async (): Promise<Streak[]> =>\n (await coreCall((c) => c.streaksGetAll())) as Streak[],\n qualify: async (streakKey: string): Promise<Streak> =>\n (await coreCall((c) => c.streaksQualify(streakKey))) as Streak,\n },\n\n // ── Social ─────────────────────────────────────────────────────────\n\n feeds: {\n getActivity: async (\n feed?: string,\n cursor?: string,\n ): Promise<FeedResponse> =>\n (await coreCall((c) => c.feedsGetActivity(\n feed ?? undefined,\n cursor ?? undefined,\n ))) as FeedResponse,\n },\n\n friends: {\n getList: async (): Promise<Friendship[]> =>\n (await coreCall((c) => c.friendsGetList())) as Friendship[],\n getFriends: async (): Promise<Friendship[]> =>\n (await coreCall((c) => c.friendsGetFriends())) as Friendship[],\n blockUser: async (userId: string): Promise<Friendship> =>\n (await coreCall((c) => c.friendsBlockUser(userId))) as Friendship,\n unblockUser: async (userId: string): Promise<void> => {\n await coreCall((c) => c.friendsUnblockUser(userId));\n },\n removeBlock: async (friendshipId: string): Promise<void> => {\n await coreCall((c) => c.friendsRemoveBlock(friendshipId));\n },\n },\n\n groups: {\n create: async (params: GroupCreate): Promise<Group> =>\n (await coreCall((c) => c.groupsCreate(JSON.stringify(params)))) as Group,\n get: async (id: string): Promise<Group> =>\n (await coreCall((c) => c.groupsGet(id))) as Group,\n update: async (id: string, patch: GroupUpdate): Promise<Group> =>\n (await coreCall((c) => c.groupsUpdate(id, JSON.stringify(patch)))) as Group,\n delete: async (id: string): Promise<void> => {\n await coreCall((c) => c.groupsDelete(id));\n },\n getMembers: async (id: string): Promise<GroupMember[]> =>\n (await coreCall((c) => c.groupsGetMembers(id))) as GroupMember[],\n join: async (id: string): Promise<GroupMember> =>\n (await coreCall((c) => c.groupsJoin(id))) as GroupMember,\n leave: async (id: string): Promise<void> => {\n await coreCall((c) => c.groupsLeave(id));\n },\n invite: async (id: string, userId: string): Promise<GroupMember> =>\n (await coreCall((c) => c.groupsInvite(id, userId))) as GroupMember,\n },\n\n messaging: {\n getConversations: async (): Promise<Conversation[]> =>\n (await coreCall((c) => c.messagingGetConversations())) as Conversation[],\n getMessage: async (id: string): Promise<Message> =>\n (await coreCall((c) => c.messagingGetMessage(id))) as Message,\n sendMessage: async (request: SendMessageRequest): Promise<Message> =>\n (await coreCall((c) => c.messagingSendMessage(\n JSON.stringify(request),\n ))) as Message,\n },\n\n moderation: {\n reportUser: async (request: ReportRequest): Promise<Report> =>\n (await coreCall((c) => c.moderationReportUser(\n JSON.stringify(request),\n ))) as Report,\n reportContent: async (request: ReportRequest): Promise<Report> =>\n (await coreCall((c) => c.moderationReportContent(\n JSON.stringify(request),\n ))) as Report,\n getReportStatus: async (id: string): Promise<Report> =>\n (await coreCall((c) => c.moderationGetReportStatus(id))) as Report,\n },\n\n reviews: {\n list: async (targetType: string, targetId: string): Promise<Review[]> =>\n (await coreCall((c) => c.reviewsList(targetType, targetId))) as Review[],\n create: async (params: ReviewCreate): Promise<Review> =>\n (await coreCall((c) => c.reviewsCreate(JSON.stringify(params)))) as Review,\n update: async (id: string, patch: ReviewUpdate): Promise<Review> =>\n (await coreCall((c) => c.reviewsUpdate(id, JSON.stringify(patch)))) as Review,\n delete: async (id: string): Promise<void> => {\n await coreCall((c) => c.reviewsDelete(id));\n },\n },\n\n roles: {\n getMyRoles: async (): Promise<Role[]> =>\n (await coreCall((c) => c.rolesGetMyRoles())) as Role[],\n hasPermission: async (permission: string): Promise<boolean> =>\n (await coreCall((c) => c.rolesHasPermission(permission))) as boolean,\n },\n\n referrals: {\n getReferralCode: async (): Promise<ReferralCode> =>\n (await coreCall((c) => c.referralsGetReferralCode())) as ReferralCode,\n claimReferral: async (code: string): Promise<ReferralClaim> =>\n (await coreCall((c) => c.referralsClaimReferral(code))) as ReferralClaim,\n create: async (\n code?: string,\n maxUses?: number,\n ): Promise<ReferralCode> =>\n (await coreCall((c) => c.referralsCreate(\n code ?? undefined,\n maxUses ?? undefined,\n ))) as ReferralCode,\n },\n\n // ── Lifecycle ──────────────────────────────────────────────────────\n\n catalog: {\n list: async (): Promise<CatalogItem[]> =>\n (await coreCall((c) => c.catalogList())) as CatalogItem[],\n },\n\n content: {\n /**\n * Get today's published item for `channel`. Defaults to `\"default\"`\n * so single-channel apps can call `Amba.content.getToday()` bare.\n */\n getToday: async (\n channel: string = \"default\",\n ): Promise<ContentItem | null> =>\n (await coreCall((c) => c.contentGetToday(channel))) as ContentItem | null,\n /**\n * Paginated library list for `channel`. `options.limit` caps page size;\n * `options.cursor` is the opaque token returned by a prior page.\n */\n getLibrary: async (\n channel: string = \"default\",\n options?: { limit?: number; cursor?: string },\n ): Promise<ContentItem[]> =>\n (await coreCall((c) => c.contentGetLibrary(\n channel,\n options?.limit ?? undefined,\n options?.cursor ?? undefined,\n ))) as ContentItem[],\n getItem: async (id: string): Promise<ContentItem> =>\n (await coreCall((c) => c.contentGetItem(id))) as ContentItem,\n updateItem: async (id: string, state: unknown): Promise<ContentItem> =>\n (await coreCall((c) => c.contentUpdateItem(\n id,\n JSON.stringify(state),\n ))) as ContentItem,\n createItem: async (\n channel: string,\n item: unknown,\n ): Promise<ContentItem> =>\n (await coreCall((c) => c.contentCreateItem(\n channel,\n JSON.stringify(item),\n ))) as ContentItem,\n },\n\n deepLinks: {\n get: async (shortCode: string): Promise<DeepLink> =>\n (await coreCall((c) => c.deepLinksGet(shortCode))) as DeepLink,\n create: async (params: DeepLinkCreate): Promise<DeepLink> =>\n (await coreCall((c) => c.deepLinksCreate(JSON.stringify(params)))) as DeepLink,\n },\n\n onboarding: {\n getStatus: async (): Promise<OnboardingStatus> =>\n (await coreCall((c) => c.onboardingGetStatus())) as OnboardingStatus,\n nextStep: async (payload: unknown): Promise<OnboardingStatus> =>\n (await coreCall((c) => c.onboardingNextStep(\n JSON.stringify(payload),\n ))) as OnboardingStatus,\n skipStep: async (): Promise<OnboardingStatus> =>\n (await coreCall((c) => c.onboardingSkipStep())) as OnboardingStatus,\n complete: async (): Promise<OnboardingStatus> =>\n (await coreCall((c) => c.onboardingComplete())) as OnboardingStatus,\n },\n};\n\nexport const SDK_VERSION = \"0.1.0\";\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@layers/amba-react-native",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "amba SDK for React Native — full 25-namespace surface,
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "amba SDK for React Native — full 25-namespace surface, secure on-device identity persistence, native push notifications.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
7
7
|
"module": "./dist/index.js",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"license": "MIT",
|
|
21
21
|
"repository": {
|
|
22
22
|
"type": "git",
|
|
23
|
-
"url": "https://github.com/layers/amba
|
|
23
|
+
"url": "https://github.com/layers/amba.git",
|
|
24
24
|
"directory": "packages/react-native"
|
|
25
25
|
},
|
|
26
26
|
"publishConfig": {
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
}
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@layers/amba-core
|
|
41
|
+
"@layers/amba-core": "^1.0.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@types/node": "^22.13.14",
|