@virex-tech/paywallo-sdk 2.2.1 → 2.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +99 -0
- package/dist/index.d.mts +609 -549
- package/dist/index.d.ts +609 -549
- package/dist/index.js +6425 -6132
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +6447 -6158
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors/PaywalloError.ts","../src/errors/ClientError.ts","../src/domains/iap/PurchaseError.ts","../src/domains/identity/IdentityError.ts","../src/utils/uuid.ts","../src/utils/NativeDeviceInfo.ts","../src/core/storage/NativeStorage.ts","../src/core/storage/SecureStorage.ts","../src/core/storage/StorageMigration.ts","../src/domains/identity/IdentityStorage.ts","../src/domains/identity/IdentityManager.ts","../src/domains/iap/NativeStoreKit.ts","../src/core/queue/deduplication.ts","../src/core/queue/QueueJournal.ts","../src/core/queue/OfflineQueueStorage.ts","../src/core/queue/types.ts","../src/core/queue/OfflineQueue.ts","../src/core/network/types.ts","../src/core/network/NetworkMonitor.ts","../src/core/network/index.ts","../src/core/queue/QueueProcessor.ts","../src/core/queue/index.ts","../src/domains/iap/IAPValidator.ts","../src/domains/iap/IAPTransactionEmitter.ts","../src/domains/iap/IAPService.ts","../src/domains/paywall/paywallCloseReason.ts","../src/domains/paywall/emitPaywallClosed.ts","../src/domains/paywall/paywallHeartbeat.ts","../src/domains/paywall/usePaywallTracking.ts","../src/domains/paywall/usePaywallActions.ts","../src/domains/paywall/PaywallError.ts","../src/domains/paywall/usePaywallLoader.ts","../src/utils/localization.ts","../src/domains/paywall/parseWebViewMessage.ts","../src/domains/paywall/paywallScripts.ts","../src/domains/paywall/PaywallWebView.tsx","../src/domains/paywall/PaywallModal.tsx","../src/domains/paywall/PaywallErrorBoundary.tsx","../src/domains/paywall/PaywallContext.ts","../src/domains/paywall/usePaywallSession.ts","../src/domains/paywall/usePaywallPresenter.ts","../src/domains/paywall/index.ts","../src/domains/campaign/CampaignError.ts","../src/domains/campaign/CampaignGateService.ts","../src/domains/campaign/index.ts","../src/domains/identity/AdvertisingIdManager.ts","../src/domains/session/distinctIdGuard.ts","../src/domains/session/SessionError.ts","../src/utils/deviceInfo.ts","../src/domains/session/sessionTracking.ts","../src/domains/session/SessionManager.ts","../src/domains/identity/AttributionTracker.ts","../src/domains/identity/InstallIdempotency.ts","../src/domains/identity/InstallReferrerManager.ts","../src/domains/identity/MetaBridge.ts","../src/domains/identity/InstallTracker.ts","../src/domains/identity/DeepLinkAttributionCapture.ts","../src/domains/identity/index.ts","../src/domains/notifications/bridges/NativePushBridge.ts","../src/domains/notifications/handlers/BackgroundHandler.ts","../src/domains/notifications/NotificationEventTracker.ts","../src/domains/notifications/DeepLinkResolver.ts","../src/domains/notifications/handlers/ForegroundHandler.ts","../src/domains/notifications/NotificationHandlerSetup.ts","../src/domains/notifications/PermissionManager.ts","../src/core/constants.ts","../src/domains/notifications/config.ts","../src/domains/notifications/NotificationsError.ts","../src/domains/notifications/utils.ts","../src/core/version.ts","../src/domains/notifications/TokenRegistration.ts","../src/domains/notifications/NotificationTokenOps.ts","../src/domains/notifications/NotificationsManager.ts","../src/domains/notifications/index.ts","../src/domains/session/index.ts","../src/core/PaywalloState.ts","../src/domains/plan/PlanCache.ts","../src/domains/plan/PlanError.ts","../src/domains/plan/PlanService.ts","../src/domains/plan/index.ts","../src/domains/onboarding/OnboardingError.ts","../src/domains/onboarding/OnboardingManager.ts","../src/domains/onboarding/index.ts","../src/domains/paywall/paywallHeartbeatRecovery.ts","../src/domains/subscription/SubscriptionCache.ts","../src/domains/subscription/SubscriptionManager.ts","../src/core/apiUrlUtils.ts","../src/core/FlagStorage.ts","../src/core/ApiClientFlags.ts","../src/domains/iap/apiPurchaseMethods.ts","../src/core/http/types.ts","../src/core/http/HttpClient.ts","../src/core/http/index.ts","../src/core/ApiCache.ts","../src/core/events/schemas.ts","../src/core/events/eventFamilies.ts","../src/core/events/index.ts","../src/core/eventEnvelopeV2.ts","../src/core/EventBatcher.ts","../src/core/ApiClientQueue.ts","../src/core/ApiClient.ts","../src/core/eventPipelineBridge.ts","../src/core/PaywalloInitHelpers.ts","../src/core/PaywalloInitializer.ts","../src/core/PaywalloLifecycle.ts","../src/domains/analytics/AnalyticsError.ts","../src/domains/analytics/index.ts","../src/core/PaywalloAnalytics.ts","../src/core/PaywalloSubscription.ts","../src/core/PaywalloFlags.ts","../src/core/PaywalloClient.ts","../src/index.ts","../src/context/PaywalloContext.ts","../src/domains/iap/index.ts","../src/domains/iap/errors.ts","../src/hooks/useOnboarding.ts","../src/errors/index.ts","../src/hooks/usePaywallo.ts","../src/hooks/usePlans.ts","../src/hooks/usePlanPurchase.ts","../src/hooks/useProducts.ts","../src/utils/productMappers.ts","../src/hooks/usePurchase.ts","../src/hooks/useSubscription.ts","../src/PaywalloProvider.tsx","../src/hooks/useAppAutoEvents.ts","../src/hooks/useCampaignPreload.ts","../src/utils/loadCampaignProducts.ts","../src/utils/serverProduct.ts","../src/utils/preloadCache.ts","../src/hooks/useProductLoader.ts","../src/hooks/usePurchaseOrchestrator.ts","../src/hooks/useSubscriptionSync.ts","../src/domains/subscription/index.ts","../src/utils/productVariableResolver.ts","../src/utils/variableResolver.ts"],"sourcesContent":["export class PaywalloError extends Error {\n readonly code: string;\n readonly domain: string;\n\n constructor(domain: string, code: string, message: string) {\n super(message);\n this.name = \"PaywalloError\";\n this.domain = domain;\n this.code = code;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { PaywalloError } from \"./PaywalloError\";\n\nexport class ClientError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"client\", code, message);\n this.name = \"ClientError\";\n }\n}\n\nexport const CLIENT_ERROR_CODES = {\n NOT_INITIALIZED: \"CLIENT_NOT_INITIALIZED\",\n MISSING_APP_KEY: \"CLIENT_MISSING_APP_KEY\",\n INVALID_EVENT_NAME: \"CLIENT_INVALID_EVENT_NAME\",\n PROVIDER_MISSING: \"CLIENT_PROVIDER_MISSING\",\n INSECURE_REQUEST: \"CLIENT_INSECURE_REQUEST\",\n UNKNOWN: \"CLIENT_UNKNOWN\",\n} as const;\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class PurchaseError extends PaywalloError {\n readonly userCancelled: boolean;\n /**\n * Populated when this error stems from an HTTP response (e.g. server\n * validation rejected the receipt). Lets callers distinguish a permanent\n * 4xx (drop + finishTransaction) from a transport-level failure that\n * should be retried via the offline queue.\n */\n readonly httpStatus?: number;\n\n constructor(code: string, message: string, userCancelled = false, httpStatus?: number) {\n super(\"purchase\", code, message);\n this.name = \"PurchaseError\";\n this.userCancelled = userCancelled;\n this.httpStatus = httpStatus;\n }\n}\n\nexport const PURCHASE_ERROR_CODES = {\n NOT_INITIALIZED: \"PURCHASE_NOT_INITIALIZED\",\n PRODUCT_NOT_FOUND: \"PRODUCT_NOT_FOUND\",\n PURCHASE_FAILED: \"PURCHASE_FAILED\",\n RESTORE_FAILED: \"RESTORE_FAILED\",\n VALIDATION_FAILED: \"VALIDATION_FAILED\",\n USER_CANCELLED: \"USER_CANCELLED\",\n NETWORK_ERROR: \"PURCHASE_NETWORK_ERROR\",\n STORE_ERROR: \"PURCHASE_STORE_ERROR\",\n PENDING_PURCHASE: \"PURCHASE_PENDING\",\n DEFERRED_PURCHASE: \"PURCHASE_DEFERRED\",\n STORE_NOT_AVAILABLE: \"PURCHASE_STORE_NOT_AVAILABLE\",\n} as const;\n\nconst DEFAULT_MESSAGES: Record<keyof typeof PURCHASE_ERROR_CODES, string> = {\n NOT_INITIALIZED: \"Purchase controller not initialized. Call init() first.\",\n PRODUCT_NOT_FOUND: \"Product not found in store.\",\n PURCHASE_FAILED: \"Purchase failed. Please try again.\",\n RESTORE_FAILED: \"Failed to restore purchases. Please try again.\",\n VALIDATION_FAILED: \"Failed to validate purchase with server.\",\n USER_CANCELLED: \"Purchase was cancelled.\",\n NETWORK_ERROR: \"Network error. Please check your connection.\",\n STORE_ERROR: \"Store error. Please try again later.\",\n PENDING_PURCHASE: \"Purchase is pending approval.\",\n DEFERRED_PURCHASE: \"Purchase is deferred (e.g., parental approval required).\",\n STORE_NOT_AVAILABLE: \"In-app purchases are not available on this device.\",\n};\n\nexport function createPurchaseError(\n code: keyof typeof PURCHASE_ERROR_CODES,\n message?: string\n): PurchaseError {\n return new PurchaseError(\n PURCHASE_ERROR_CODES[code],\n message ?? DEFAULT_MESSAGES[code] ?? \"Unknown purchase error\",\n code === \"USER_CANCELLED\"\n );\n}\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class IdentityError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"identity\", code, message);\n this.name = \"IdentityError\";\n }\n}\n\nexport const IDENTITY_ERROR_CODES = {\n NOT_INITIALIZED: \"IDENTITY_NOT_INITIALIZED\",\n DEVICE_ID_UNAVAILABLE: \"IDENTITY_DEVICE_ID_UNAVAILABLE\",\n STORAGE_READ_FAILED: \"IDENTITY_STORAGE_READ_FAILED\",\n STORAGE_WRITE_FAILED: \"IDENTITY_STORAGE_WRITE_FAILED\",\n IDENTIFY_FAILED: \"IDENTITY_IDENTIFY_FAILED\",\n} as const;\n","export function generateUUID(): string {\n const template = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\";\n return template.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n// RFC 4122 UUID v4: 8-4-4-4-12 with version nibble = 4 and variant = 8/9/a/b.\n// StoreKit2 `appAccountToken` requires strict UUID format — anything else is\n// silently rejected and the webhook arrives with `app_user_id=NULL`.\nconst UUID_V4_REGEX =\n /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nexport function isValidUUIDv4(value: string | null | undefined): boolean {\n if (!value) return false;\n return UUID_V4_REGEX.test(value);\n}\n","import { NativeModules } from \"react-native\";\n\nexport interface DeviceInfoResult {\n deviceId: string;\n model: string;\n modelId: string;\n systemVersion: string;\n appVersion: string;\n buildNumber: string;\n bundleId: string;\n brand: string;\n systemName: string;\n totalDisk: number;\n freeDisk: number;\n totalRam: number;\n carrier: string;\n installerPackage: string | null;\n idfv: string | null;\n darwinVersion?: string;\n webkitVersion?: string;\n}\n\ninterface PaywalloDeviceModule {\n // Native modules return unknown at runtime; Promise<unknown> forces explicit validation.\n getDeviceInfo(): Promise<unknown>;\n getInstallReferrer(): Promise<string | null>;\n}\n\nconst FALLBACK: DeviceInfoResult = {\n deviceId: \"unknown\", model: \"unknown\", modelId: \"unknown\",\n systemVersion: \"0.0.0\", appVersion: \"0.0.0\", buildNumber: \"0\",\n bundleId: \"unknown\", brand: \"unknown\", systemName: \"unknown\",\n totalDisk: 0, freeDisk: 0, totalRam: 0, carrier: \"unknown\",\n installerPackage: null, idfv: null,\n};\n\nlet _debug = false;\nlet warnedOnce = false;\nlet cachedDeviceInfo: DeviceInfoResult | null = null;\n\nexport function setNativeDeviceInfoDebug(debug: boolean): void {\n _debug = debug;\n}\n\nfunction isDeviceInfoResult(value: unknown): value is DeviceInfoResult {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n return (\n typeof v[\"deviceId\"] === \"string\" &&\n typeof v[\"model\"] === \"string\" &&\n typeof v[\"systemVersion\"] === \"string\" &&\n typeof v[\"appVersion\"] === \"string\" &&\n typeof v[\"bundleId\"] === \"string\"\n );\n}\n\nfunction getNativeModule(): PaywalloDeviceModule | null {\n const mod = NativeModules.PaywalloDevice as PaywalloDeviceModule | undefined;\n if (!mod) {\n if (!warnedOnce) {\n warnedOnce = true;\n if (_debug) console.log(\"[Paywallo] NativeModules.PaywalloDevice not found — falling back to defaults\");\n }\n return null;\n }\n return mod;\n}\n\nasync function getDeviceInfo(): Promise<DeviceInfoResult> {\n if (cachedDeviceInfo !== null) return cachedDeviceInfo;\n const mod = getNativeModule();\n if (!mod) return FALLBACK;\n const raw = await mod.getDeviceInfo();\n if (!isDeviceInfoResult(raw)) return FALLBACK;\n cachedDeviceInfo = raw;\n return raw;\n}\n\nasync function getInstallReferrer(): Promise<string | null> {\n const mod = getNativeModule();\n if (!mod) return null;\n try {\n return await mod.getInstallReferrer();\n } catch {\n return null;\n }\n}\n\nfunction isAvailable(): boolean {\n return NativeModules.PaywalloDevice != null;\n}\n\n/** Clears the cached device info. Call after an OTA update if needed. */\nfunction clearCache(): void {\n cachedDeviceInfo = null;\n}\n\n/** Sync accessor for the in-memory cache. Returns null until getDeviceInfo() resolves once. */\nfunction getCachedDeviceInfo(): DeviceInfoResult | null {\n return cachedDeviceInfo;\n}\n\nexport const nativeDeviceInfo = {\n getDeviceInfo,\n getCachedDeviceInfo,\n getInstallReferrer,\n isAvailable,\n clearCache,\n};\n","import { NativeModules } from \"react-native\";\n\ninterface PaywalloStorageModule {\n // Secure (Keychain iOS / EncryptedSharedPreferences Android)\n secureGet(key: string): Promise<string | null>;\n secureSet(key: string, value: string): Promise<boolean>;\n secureRemove(key: string): Promise<boolean>;\n // Regular (UserDefaults iOS / SharedPreferences Android)\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<boolean>;\n remove(key: string): Promise<boolean>;\n // Migration helper — reads legacy react-native-keychain format (iOS only, SDK ≤1.5.0)\n // Optional: only available on native builds that include the method.\n legacySecureGet?(key: string): Promise<string | null>;\n}\n\nconst NativeModule = NativeModules.PaywalloStorage as PaywalloStorageModule | undefined;\n\nlet _debug = false;\nlet _warnedUnavailable = false;\n\nexport function setNativeStorageDebug(debug: boolean): void {\n _debug = debug;\n}\n\nfunction isAvailable(): boolean {\n return NativeModule != null;\n}\n\nfunction warnIfUnavailable(): boolean {\n if (NativeModule != null) return true;\n if (!_warnedUnavailable) {\n _warnedUnavailable = true;\n if (_debug) console.log(\"[Paywallo] PaywalloStorage native module not available — storage will not persist\");\n }\n return false;\n}\n\nfunction getModule(): PaywalloStorageModule | null {\n if (!warnIfUnavailable()) return null;\n // NativeModule is captured once at module load — safe to assert here.\n return NativeModule as PaywalloStorageModule;\n}\n\nasync function get(key: string): Promise<string | null> {\n return getModule()?.get(key) ?? null;\n}\n\nasync function set(key: string, value: string): Promise<boolean> {\n return getModule()?.set(key, value) ?? false;\n}\n\nasync function remove(key: string): Promise<boolean> {\n return getModule()?.remove(key) ?? false;\n}\n\nasync function secureGet(key: string): Promise<string | null> {\n return getModule()?.secureGet(key) ?? null;\n}\n\nasync function secureSet(key: string, value: string): Promise<boolean> {\n return getModule()?.secureSet(key, value) ?? false;\n}\n\nasync function secureRemove(key: string): Promise<boolean> {\n return getModule()?.secureRemove(key) ?? false;\n}\n\n/**\n * Read a value stored by react-native-keychain (SDK ≤1.5.0) using the legacy\n * service-per-key layout: service=legacyService, account=\"panel\".\n * Only available on iOS builds that expose `legacySecureGet` on the native module.\n */\nasync function legacySecureGet(key: string): Promise<string | null> {\n const mod = getModule();\n if (!mod?.legacySecureGet) return null;\n return mod.legacySecureGet(key);\n}\n\nexport const nativeStorage = {\n isAvailable,\n get,\n set,\n remove,\n secureGet,\n secureSet,\n secureRemove,\n legacySecureGet,\n};\n","import { nativeStorage } from \"./NativeStorage\";\n\nconst KEYCHAIN_KEY_PREFIX = \"com.paywallo.sdk.\";\nconst REGULAR_KEY_PREFIX = \"@paywallo:\";\n\nexport class SecureStorage {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(_debug = false) {}\n\n async get(key: string): Promise<string | null> {\n const keychainValue = await this.getFromKeychain(key);\n if (keychainValue) {\n return keychainValue;\n }\n\n try {\n const value = await nativeStorage.get(`${REGULAR_KEY_PREFIX}${key}`);\n if (value) {\n await this.setToKeychain(key, value);\n // Remove the plaintext copy after promoting to keychain — prevents stale\n // reads if keychain is later cleared (e.g. Android reinstall, iOS biometric reset).\n nativeStorage.remove(`${REGULAR_KEY_PREFIX}${key}`).catch(() => undefined);\n }\n return value;\n } catch {\n return null;\n }\n }\n\n async set(key: string, value: string): Promise<boolean> {\n // Write only to Keychain — never to plaintext NativeStorage.\n // Sensitive values (email, properties, device IDs) must not land in UserDefaults/SharedPreferences.\n // The read() fallback below handles migration of pre-existing plaintext entries.\n return this.setToKeychain(key, value);\n }\n\n async remove(key: string): Promise<boolean> {\n try {\n await Promise.all([\n // Also remove the legacy plaintext copy if it exists (migration cleanup).\n nativeStorage.remove(`${REGULAR_KEY_PREFIX}${key}`).catch(() => undefined),\n this.removeFromKeychain(key),\n ]);\n return true;\n } catch {\n return false;\n }\n }\n\n hasKeychainSupport(): boolean {\n return nativeStorage.isAvailable();\n }\n\n private async getFromKeychain(key: string): Promise<string | null> {\n try {\n return await nativeStorage.secureGet(`${KEYCHAIN_KEY_PREFIX}${key}`);\n } catch {\n return null;\n }\n }\n\n private async setToKeychain(key: string, value: string): Promise<boolean> {\n try {\n return await nativeStorage.secureSet(`${KEYCHAIN_KEY_PREFIX}${key}`, value);\n } catch {\n return false;\n }\n }\n\n private async removeFromKeychain(key: string): Promise<boolean> {\n try {\n return await nativeStorage.secureRemove(`${KEYCHAIN_KEY_PREFIX}${key}`);\n } catch {\n return false;\n }\n }\n\n}\n\nexport const secureStorage = new SecureStorage();\n","/**\n * StorageMigration — upgrades data from SDK ≤1.5.0 to ≥1.5.2 storage layout.\n *\n * SDK ≤1.5.0 used:\n * - AsyncStorage (SQLite) → regular data with key \"@paywallo:{key}\"\n * - react-native-keychain → secure data with service=\"com.paywallo.sdk.{key}\", account=\"panel\"\n *\n * SDK ≥1.5.2 uses:\n * - UserDefaults / SharedPreferences → regular data with key \"@paywallo:{key}\"\n * - iOS Keychain / EncryptedSharedPreferences → secure data with\n * service=\"com.paywallo.sdk\", account=\"com.paywallo.sdk.{key}\"\n *\n * Migration is run once at init and guarded by a flag stored in NativeStorage.\n */\n\nimport { nativeStorage } from \"./NativeStorage\";\n\nconst MIGRATION_FLAG_KEY = \"@paywallo:_migration_v152_done\";\n\n// Keys that were stored in secure storage in ≤1.5.0.\n// Regular storage keys are migrated wholesale from AsyncStorage.\nconst LEGACY_SECURE_KEYS = [\n \"device_id\",\n \"device_id_fallback\",\n \"anon_id\",\n \"user_email\",\n \"user_properties\",\n];\n\nconst KEYCHAIN_KEY_PREFIX = \"com.paywallo.sdk.\";\n\nexport async function runStorageMigrationIfNeeded(): Promise<void> {\n if (!nativeStorage.isAvailable()) return;\n\n const alreadyDone = await nativeStorage.get(MIGRATION_FLAG_KEY);\n if (alreadyDone === \"1\") return;\n\n // Sequential — avoid concurrent NativeStorage writes on Android.\n await migrateAsyncStorage();\n await migrateKeychainLegacy();\n\n await nativeStorage.set(MIGRATION_FLAG_KEY, \"1\");\n}\n\n/**\n * Migrate regular data from AsyncStorage → UserDefaults/SharedPreferences.\n * Only writes keys that don't already exist in NativeStorage (safe to re-run).\n */\nasync function migrateAsyncStorage(): Promise<void> {\n try {\n // Dynamic import — AsyncStorage may not be installed in 1.5.2+ projects.\n const mod = await import(\"@react-native-async-storage/async-storage\") as {\n default: {\n getAllKeys(): Promise<readonly string[]>;\n multiGet(keys: readonly string[]): Promise<readonly [string, string | null][]>;\n };\n };\n const AsyncStorage = mod.default;\n\n const allKeys = await AsyncStorage.getAllKeys();\n const paywallo = allKeys.filter((k) => k.startsWith(\"@paywallo:\"));\n if (paywallo.length === 0) return;\n\n const pairs = await AsyncStorage.multiGet(paywallo);\n // Sequential writes — avoids concurrent NativeStorage access on Android\n // (SharedPreferences writes are not guaranteed safe under parallel JS calls).\n for (const [key, value] of pairs) {\n if (!value) continue;\n const existing = await nativeStorage.get(key);\n if (!existing) {\n await nativeStorage.set(key, value);\n }\n }\n } catch {\n // AsyncStorage not installed or no data — nothing to migrate.\n }\n}\n\n/**\n * Migrate secure data from legacy react-native-keychain layout →\n * new Keychain layout (via NativeStorage.secureSet).\n *\n * Legacy: service=\"com.paywallo.sdk.{key}\", account=\"panel\"\n * New: service=\"com.paywallo.sdk\", account=\"com.paywallo.sdk.{key}\"\n *\n * iOS: uses legacySecureGet (reads old service/account combo).\n * Android: EncryptedSharedPreferences was introduced in 1.5.2, no prior data.\n */\nasync function migrateKeychainLegacy(): Promise<void> {\n // Sequential writes — avoids concurrent NativeStorage access on Android.\n for (const key of LEGACY_SECURE_KEYS) {\n try {\n // legacySecureGet reads legacy Keychain slot (service=\"{prefix}{key}\", account=\"panel\")\n const legacyValue = await nativeStorage.legacySecureGet(`${KEYCHAIN_KEY_PREFIX}${key}`);\n if (!legacyValue) continue;\n\n // Only migrate if new slot is empty\n const newSlotKey = `${KEYCHAIN_KEY_PREFIX}${key}`;\n const existing = await nativeStorage.secureGet(newSlotKey);\n if (!existing) {\n await nativeStorage.secureSet(newSlotKey, legacyValue);\n }\n } catch {\n // Non-critical — skip this key.\n }\n }\n}\n","import type { SecureStorage } from \"../../core/storage/SecureStorage\";\nimport type { UserProperties } from \"../../types\";\n\n// Storage keys with @panel: prefix (CLAUDE.md convention)\nexport const DEVICE_ID_KEY = \"@panel:device_id\";\nexport const ANON_ID_KEY = \"@panel:anon_id\";\nexport const USER_EMAIL_KEY = \"@panel:user_email\";\nexport const USER_PROPERTIES_KEY = \"@panel:user_properties\";\nexport const USER_DISTINCT_ID_KEY = \"@panel:user_distinct_id\";\nexport const USER_NAME_KEY = \"@panel:user_name\";\nexport const USER_COUNTRY_KEY = \"@panel:user_country\";\nexport const USER_LOCALE_KEY = \"@panel:user_locale\";\nexport const USER_PHONE_KEY = \"@panel:user_phone\";\nexport const USER_FIRST_NAME_KEY = \"@panel:user_first_name\";\nexport const USER_LAST_NAME_KEY = \"@panel:user_last_name\";\nexport const USER_DOB_KEY = \"@panel:user_dob\";\nexport const USER_GENDER_KEY = \"@panel:user_gender\";\n\n// Legacy keys (SDK ≤1.5.x) — used only for silent migration\nconst LEGACY_DEVICE_ID_KEY = \"device_id\";\nconst LEGACY_ANON_ID_KEY = \"anon_id\";\nconst LEGACY_EMAIL_KEY = \"user_email\";\nconst LEGACY_PROPERTIES_KEY = \"user_properties\";\nconst LEGACY_DISTINCT_ID_KEY = \"user_distinct_id\";\nconst LEGACY_NAME_KEY = \"user_name\";\nconst LEGACY_COUNTRY_KEY = \"user_country\";\nconst LEGACY_LOCALE_KEY = \"user_locale\";\n\nexport interface PersistedIdentityState {\n deviceId: string | null;\n anonId: string | null;\n email: string | null;\n propertiesJson: string | null;\n distinctId: string | null;\n name: string | null;\n country: string | null;\n locale: string | null;\n}\n\n/**\n * Read a value from the new @panel:-prefixed key, falling back to the legacy\n * key if not found. Writes the value to the new key on migration so subsequent\n * reads skip the legacy path.\n */\nasync function readWithMigration(\n storage: SecureStorage,\n newKey: string,\n legacyKey: string\n): Promise<string | null> {\n const value = await storage.get(newKey);\n if (value) return value;\n\n const legacyValue = await storage.get(legacyKey);\n if (legacyValue) {\n await storage.set(newKey, legacyValue).catch(() => undefined);\n }\n return legacyValue;\n}\n\n/**\n * Load all persisted identity fields, migrating silently from legacy keys when\n * the new @panel:-prefixed keys are absent.\n */\nexport async function loadPersistedIdentity(\n storage: SecureStorage\n): Promise<PersistedIdentityState> {\n const [deviceId, anonId, email, propertiesJson, distinctId, name, country, locale] =\n await Promise.all([\n readWithMigration(storage, DEVICE_ID_KEY, LEGACY_DEVICE_ID_KEY),\n readWithMigration(storage, ANON_ID_KEY, LEGACY_ANON_ID_KEY),\n readWithMigration(storage, USER_EMAIL_KEY, LEGACY_EMAIL_KEY),\n readWithMigration(storage, USER_PROPERTIES_KEY, LEGACY_PROPERTIES_KEY),\n readWithMigration(storage, USER_DISTINCT_ID_KEY, LEGACY_DISTINCT_ID_KEY),\n readWithMigration(storage, USER_NAME_KEY, LEGACY_NAME_KEY),\n readWithMigration(storage, USER_COUNTRY_KEY, LEGACY_COUNTRY_KEY),\n readWithMigration(storage, USER_LOCALE_KEY, LEGACY_LOCALE_KEY),\n ]);\n\n return { deviceId, anonId, email, propertiesJson, distinctId, name, country, locale };\n}\n\n/**\n * Read device ID with fallback to `device_id_fallback` key (written by\n * IdentityManager when the primary set fails).\n */\nexport async function readDeviceIdWithFallback(\n storage: SecureStorage\n): Promise<string | null> {\n const value = await readWithMigration(storage, DEVICE_ID_KEY, LEGACY_DEVICE_ID_KEY);\n if (value) return value;\n\n return storage.get(\"device_id_fallback\");\n}\n\n/**\n * Persist user properties as serialised JSON. Returns the parsed object on\n * success or the previous value on parse failure (graceful degradation).\n */\nexport function parseProperties(json: string | null): UserProperties {\n if (!json) return {};\n try {\n return JSON.parse(json) as UserProperties;\n } catch {\n return {};\n }\n}\n","import { IDENTITY_ERROR_CODES, IdentityError } from \"./IdentityError\";\nimport type { IdentifyOptions, UserProperties } from \"../../types\";\nimport { generateUUID } from \"../../utils/uuid\";\nimport { nativeDeviceInfo } from \"../../utils/NativeDeviceInfo\";\n\nimport { ApiClient } from \"../../core/ApiClient\";\nimport { SecureStorage } from \"../../core/storage/SecureStorage\";\nimport { runStorageMigrationIfNeeded } from \"../../core/storage/StorageMigration\";\nimport {\n DEVICE_ID_KEY,\n ANON_ID_KEY,\n USER_EMAIL_KEY,\n USER_PROPERTIES_KEY,\n loadPersistedIdentity,\n readDeviceIdWithFallback,\n parseProperties,\n} from \"./IdentityStorage\";\n\n// PII storage keys — defined locally to avoid breaking existing test mocks\n// that partially mock IdentityStorage without these newer exports.\nconst USER_PHONE_KEY = \"@panel:user_phone\";\nconst USER_FIRST_NAME_KEY = \"@panel:user_first_name\";\nconst USER_LAST_NAME_KEY = \"@panel:user_last_name\";\nconst USER_DOB_KEY = \"@panel:user_dob\";\nconst USER_GENDER_KEY = \"@panel:user_gender\";\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\nexport interface IdentityState {\n deviceId: string;\n email: string | null;\n properties: UserProperties;\n phone: string | null;\n firstName: string | null;\n lastName: string | null;\n dateOfBirth: string | null;\n gender: string | null;\n}\n\nexport class IdentityManager {\n private deviceId: string | null = null;\n private anonId: string | null = null;\n private email: string | null = null;\n private properties: UserProperties = {};\n private phone: string | null = null;\n private firstName: string | null = null;\n private lastName: string | null = null;\n private dateOfBirth: string | null = null;\n private gender: string | null = null;\n private apiClient: ApiClient | null = null;\n private secureStorage: SecureStorage | null = null;\n private debug = false;\n private initialized = false;\n private initPromise: Promise<string> | null = null;\n // Caller-controlled stable identifier, hydrated from persisted state only\n // (write path — `identifyV2` — was removed; kept for backward compat on\n // installs upgrading from SDKs that wrote it).\n private distinctId: string | null = null;\n\n async initialize(apiClient: ApiClient, debug = false): Promise<string> {\n if (this.initialized) {\n return this.deviceId ?? \"\";\n }\n // Concurrent calls: return the in-flight promise so only one execution runs\n if (this.initPromise) {\n return this.initPromise;\n }\n this.initPromise = this._doInitialize(apiClient, debug).finally(() => {\n this.initPromise = null;\n });\n return this.initPromise;\n }\n\n private async _doInitialize(apiClient: ApiClient, debug: boolean): Promise<string> {\n this.apiClient = apiClient;\n this.debug = debug;\n this.secureStorage = new SecureStorage(debug);\n\n // Migrate data from SDK ≤1.5.0 (AsyncStorage + react-native-keychain) to\n // NativeStorage (UserDefaults/SharedPreferences + native Keychain) before\n // reading persisted state so no device_id is lost on upgrade.\n await runStorageMigrationIfNeeded();\n\n await this.loadPersistedState();\n\n if (!this.deviceId) {\n try {\n const info = await nativeDeviceInfo.getDeviceInfo();\n const deviceId = info.deviceId;\n this.deviceId = (!deviceId || deviceId === \"unknown\") ? generateUUID() : deviceId;\n } catch {\n this.deviceId = generateUUID();\n }\n const stored = await this.secureStorage.set(DEVICE_ID_KEY, this.deviceId);\n if (!stored) {\n await this.secureStorage.set(\"device_id_fallback\", this.deviceId).catch(() => { /* non-critical */ });\n }\n }\n\n if (!this.anonId) {\n this.anonId = generateUUID();\n await this.secureStorage.set(ANON_ID_KEY, this.anonId).catch(() => { /* non-critical */ });\n }\n\n this.initialized = true;\n return this.deviceId ?? \"\";\n }\n\n async identify(options?: IdentifyOptions | UserProperties): Promise<void> {\n this.ensureInitialized();\n\n let email: string | undefined;\n let properties: UserProperties | undefined;\n\n if (options) {\n if (\"email\" in options || \"properties\" in options || \"phone\" in options || \"firstName\" in options || \"lastName\" in options || \"dateOfBirth\" in options || \"gender\" in options) {\n email = (options as IdentifyOptions).email;\n properties = (options as IdentifyOptions).properties;\n } else {\n properties = options as UserProperties;\n }\n }\n\n if (email) {\n if (!EMAIL_REGEX.test(email)) {\n if (this.debug) console.log(\"[Paywallo] identify: invalid email format, skipping email field\");\n email = undefined;\n } else {\n this.email = email;\n await this.secureStorage!.set(USER_EMAIL_KEY, email);\n }\n }\n\n if (properties) {\n this.properties = { ...this.properties, ...properties };\n await this.secureStorage!.set(USER_PROPERTIES_KEY, JSON.stringify(this.properties));\n }\n\n const opts = options as IdentifyOptions | undefined;\n if (opts?.phone) {\n this.phone = opts.phone;\n await this.secureStorage!.set(USER_PHONE_KEY, this.phone);\n }\n if (opts?.firstName) {\n this.firstName = opts.firstName;\n await this.secureStorage!.set(USER_FIRST_NAME_KEY, this.firstName);\n }\n if (opts?.lastName) {\n this.lastName = opts.lastName;\n await this.secureStorage!.set(USER_LAST_NAME_KEY, this.lastName);\n }\n if (opts?.dateOfBirth) {\n this.dateOfBirth = opts.dateOfBirth;\n await this.secureStorage!.set(USER_DOB_KEY, this.dateOfBirth);\n }\n if (opts?.gender) {\n this.gender = opts.gender;\n await this.secureStorage!.set(USER_GENDER_KEY, this.gender);\n }\n\n if (this.apiClient && this.anonId) {\n try {\n await this.apiClient.identify(this.anonId, properties, email, this.deviceId ?? undefined, {\n phone: this.phone ?? undefined,\n firstName: this.firstName ?? undefined,\n lastName: this.lastName ?? undefined,\n dateOfBirth: this.dateOfBirth ?? undefined,\n gender: this.gender ?? undefined,\n });\n } catch { /* non-critical */ }\n }\n }\n\n getDistinctId(): string {\n if (!this.initialized) return \"\";\n return this.distinctId ?? this.anonId ?? \"\";\n }\n\n getDeviceId(): string | null {\n return this.deviceId;\n }\n\n getEmail(): string | null {\n return this.email;\n }\n\n getProperties(): UserProperties {\n return { ...this.properties };\n }\n\n async updateProperties(properties: UserProperties): Promise<void> {\n this.ensureInitialized();\n\n this.properties = { ...this.properties, ...properties };\n await this.secureStorage!.set(USER_PROPERTIES_KEY, JSON.stringify(this.properties));\n\n if (this.apiClient && this.anonId) {\n try {\n await this.apiClient.identify(this.anonId, this.properties, this.email ?? undefined, this.deviceId ?? undefined);\n } catch { /* non-critical */ }\n }\n }\n\n async reset(): Promise<void> {\n const newAnonId = generateUUID();\n this.anonId = newAnonId;\n this.distinctId = null;\n this.email = null;\n this.properties = {};\n\n this.phone = null;\n this.firstName = null;\n this.lastName = null;\n this.dateOfBirth = null;\n this.gender = null;\n\n await Promise.all([\n this.secureStorage?.set(ANON_ID_KEY, newAnonId) ?? Promise.resolve(false),\n this.secureStorage?.remove(USER_EMAIL_KEY) ?? Promise.resolve(false),\n this.secureStorage?.remove(USER_PROPERTIES_KEY) ?? Promise.resolve(false),\n this.secureStorage?.remove(USER_PHONE_KEY) ?? Promise.resolve(false),\n this.secureStorage?.remove(USER_FIRST_NAME_KEY) ?? Promise.resolve(false),\n this.secureStorage?.remove(USER_LAST_NAME_KEY) ?? Promise.resolve(false),\n this.secureStorage?.remove(USER_DOB_KEY) ?? Promise.resolve(false),\n this.secureStorage?.remove(USER_GENDER_KEY) ?? Promise.resolve(false),\n ]);\n }\n\n getState(): IdentityState {\n return {\n deviceId: this.deviceId ?? \"\",\n email: this.email,\n properties: this.getProperties(),\n phone: this.phone,\n firstName: this.firstName,\n lastName: this.lastName,\n dateOfBirth: this.dateOfBirth,\n gender: this.gender,\n };\n }\n\n isSecureStorageAvailable(): boolean {\n return this.secureStorage !== null;\n }\n\n private async loadPersistedState(): Promise<void> {\n if (!this.secureStorage) return;\n\n const state = await loadPersistedIdentity(this.secureStorage);\n const deviceId = state.deviceId ?? await readDeviceIdWithFallback(this.secureStorage);\n\n if (deviceId) this.deviceId = deviceId;\n if (state.anonId) {\n // Transparent migration: SDK ≤0.x stored anon_id prefixed with\n // \"$paywallo_anon:\" — StoreKit2 `appAccountToken` requires a pure UUID,\n // so strip the prefix here and rewrite storage.\n const legacyPrefix = \"$paywallo_anon:\";\n if (state.anonId.startsWith(legacyPrefix)) {\n const stripped = state.anonId.slice(legacyPrefix.length);\n this.anonId = stripped;\n await this.secureStorage\n .set(ANON_ID_KEY, stripped)\n .catch(() => { /* non-critical */ });\n } else {\n this.anonId = state.anonId;\n }\n }\n if (state.email) this.email = state.email;\n if (state.propertiesJson) this.properties = parseProperties(state.propertiesJson);\n if (state.distinctId) this.distinctId = state.distinctId;\n\n const [phone, firstName, lastName, dateOfBirth, gender] = await Promise.all([\n this.secureStorage!.get(USER_PHONE_KEY),\n this.secureStorage!.get(USER_FIRST_NAME_KEY),\n this.secureStorage!.get(USER_LAST_NAME_KEY),\n this.secureStorage!.get(USER_DOB_KEY),\n this.secureStorage!.get(USER_GENDER_KEY),\n ]);\n if (phone) this.phone = phone;\n if (firstName) this.firstName = firstName;\n if (lastName) this.lastName = lastName;\n if (dateOfBirth) this.dateOfBirth = dateOfBirth;\n if (gender) this.gender = gender;\n }\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new IdentityError(\n IDENTITY_ERROR_CODES.NOT_INITIALIZED,\n \"IdentityManager not initialized. Call initialize() first\"\n );\n }\n }\n}\n\nexport const identityManager = new IdentityManager();\n","import { NativeEventEmitter, NativeModules, Platform } from \"react-native\";\n\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"./PurchaseError\";\nimport { identityManager } from \"../identity/IdentityManager\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport type { Product, Purchase } from \"../../types/purchase\";\nimport { isValidUUIDv4 } from \"../../utils/uuid\";\n\ninterface NativeStoreKitModule {\n getProducts(productIds: string[]): Promise<NativeProduct[]>;\n purchase(productId: string, appAccountToken: string | null): Promise<NativePurchaseResult | null>;\n finishTransaction(transactionId: string): Promise<void>;\n getActiveTransactions(): Promise<NativePurchaseResult[]>;\n // NativeEventEmitter handshake — iOS uses RCTEventEmitter, Android exposes\n // no-op stubs. Optional on the TS side so mocks don't need them.\n addListener?(eventName: string): void;\n removeListeners?(count: number): void;\n}\n\n/**\n * Event payload emitted by the native module whenever StoreKit 2\n * (`Transaction.updates`) or Google Play Billing (`onPurchasesUpdated` +\n * refund diff) detects a renewal, refund, or cancellation.\n */\nexport interface NativeTransactionUpdate {\n type: \"renewed\" | \"refunded\" | \"canceled\";\n transactionId: string;\n productId: string;\n amount?: number;\n currency?: string;\n}\n\nexport type TransactionUpdateListener = (update: NativeTransactionUpdate) => void;\n\nexport interface TransactionUpdateSubscription {\n remove(): void;\n}\n\nconst TRANSACTION_UPDATE_EVENT = \"PaywalloTransactionUpdate\";\n\ninterface NativeProduct {\n productId: string;\n title: string;\n description: string;\n price: string;\n priceValue: number;\n currency: string;\n localizedPrice: string;\n type: string;\n subscriptionPeriod?: string;\n introductoryPrice?: string;\n introductoryPriceValue?: number;\n freeTrialPeriod?: string;\n}\n\ninterface NativePurchaseResult {\n transactionId: string;\n productId: string;\n receipt: string;\n transactionDate: number;\n pending?: boolean;\n}\n\nconst PaywalloStoreKitNative: NativeStoreKitModule | null =\n (NativeModules.PaywalloStoreKit as NativeStoreKitModule | undefined) ?? null;\n\nfunction isAvailable(): boolean {\n return PaywalloStoreKitNative != null;\n}\n\nfunction mapNativeProduct(native: NativeProduct): Product {\n const product: Product = {\n productId: native.productId,\n title: native.title,\n description: native.description,\n price: native.price,\n priceValue: native.priceValue,\n currency: native.currency ?? \"USD\",\n localizedPrice: native.localizedPrice,\n type: mapProductType(native.type),\n subscriptionPeriod: native.subscriptionPeriod,\n introductoryPrice: native.introductoryPrice,\n introductoryPriceValue: native.introductoryPriceValue,\n freeTrialPeriod: native.freeTrialPeriod,\n };\n\n if (native.subscriptionPeriod) {\n const prices = calculatePerPeriodPrices(native.priceValue, native.subscriptionPeriod);\n product.pricePerMonth = prices.perMonth;\n product.pricePerWeek = prices.perWeek;\n product.pricePerDay = prices.perDay;\n }\n\n return product;\n}\n\nfunction mapProductType(type: string): Product[\"type\"] {\n switch (type) {\n case \"subscription\":\n case \"autoRenewable\":\n return \"subscription\";\n case \"consumable\":\n return \"consumable\";\n default:\n return \"non_consumable\";\n }\n}\n\nfunction calculatePerPeriodPrices(\n priceValue: number,\n period: string\n): { perMonth?: string; perWeek?: string; perDay?: string } {\n const totalDays = periodToDays(period);\n if (totalDays <= 0) return {};\n\n const perDay = priceValue / totalDays;\n const perWeek = perDay * 7;\n const perMonth = perDay * 30;\n\n return {\n perDay: perDay.toFixed(2),\n perWeek: perWeek.toFixed(2),\n perMonth: perMonth.toFixed(2),\n };\n}\n\nfunction periodToDays(period: string): number {\n const match = period.match(/^P(\\d+)([DWMY])$/);\n if (!match) return 0;\n\n const value = parseInt(match[1], 10);\n switch (match[2]) {\n case \"D\":\n return value;\n case \"W\":\n return value * 7;\n case \"M\":\n return value * 30;\n case \"Y\":\n return value * 365;\n default:\n return 0;\n }\n}\n\nfunction mapNativePurchase(native: NativePurchaseResult): Purchase {\n return {\n productId: native.productId,\n transactionId: native.transactionId,\n transactionDate: native.transactionDate,\n receipt: native.receipt,\n platform: Platform.OS as \"ios\" | \"android\",\n };\n}\n\nexport const nativeStoreKit = {\n isAvailable,\n\n async getProducts(productIds: string[]): Promise<Product[]> {\n if (!PaywalloStoreKitNative) {\n return [];\n }\n const nativeProducts = await PaywalloStoreKitNative.getProducts(productIds);\n return nativeProducts.map(mapNativeProduct);\n },\n\n async purchase(productId: string): Promise<Purchase | null> {\n if (!PaywalloStoreKitNative) {\n throw new PurchaseError(\n PURCHASE_ERROR_CODES.STORE_NOT_AVAILABLE,\n \"StoreKit native module not available\"\n );\n }\n const distinctId = identityManager.getDistinctId();\n // StoreKit2 silently rejects `appAccountToken` that isn't a strict UUID v4\n // (root cause of orphan subscriptions with `app_user_id=NULL`). Pass null\n // when invalid — backend deduplicates by transaction_id + device_id.\n // Android V2 prefixes distinctId with `$paywallo_anon:` — strip before validating.\n const rawUuid = distinctId?.startsWith('$paywallo_anon:') ? distinctId.slice('$paywallo_anon:'.length) : distinctId;\n const appAccountToken = isValidUUIDv4(rawUuid) ? rawUuid : null;\n if (distinctId && appAccountToken === null) {\n if (PaywalloClient.getConfig()?.debug) console.log(\"[Paywallo] distinctId is not a valid UUID v4 — passing null to appAccountToken:\", distinctId);\n }\n try {\n const result = await PaywalloStoreKitNative.purchase(productId, appAccountToken);\n if (!result || result.pending) {\n return null;\n }\n return mapNativePurchase(result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (message.toLowerCase().includes(\"cancel\")) {\n throw new PurchaseError(PURCHASE_ERROR_CODES.USER_CANCELLED, message, true);\n }\n throw new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, message);\n }\n },\n\n async finishTransaction(transactionId: string): Promise<void> {\n if (!PaywalloStoreKitNative) return;\n try {\n await PaywalloStoreKitNative.finishTransaction(transactionId);\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] finishTransaction native error\", err);\n }\n },\n\n async getActiveTransactions(): Promise<Purchase[]> {\n if (!PaywalloStoreKitNative) return [];\n try {\n const results = await PaywalloStoreKitNative.getActiveTransactions();\n return results.map(mapNativePurchase);\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] getActiveTransactions failed\", err);\n return [];\n }\n },\n\n /**\n * Subscribes to native transaction update events (renewals, refunds,\n * cancellations) from StoreKit 2 (`Transaction.updates`) on iOS or\n * `PurchasesUpdatedListener` + refund diff on Android.\n *\n * Returns a subscription with a `remove()` method. The caller is\n * responsible for cleanup (typically on `Paywallo.reset()`).\n *\n * Returns `null` when the native module isn't available (non-mobile env,\n * native module not linked) — callers should treat null as a no-op.\n */\n subscribeToTransactionUpdates(\n listener: TransactionUpdateListener\n ): TransactionUpdateSubscription | null {\n if (!PaywalloStoreKitNative) return null;\n try {\n // React Native's NativeEventEmitter constructor accepts the native\n // module instance on iOS (required) and undefined on Android. We\n // always pass it when available — the native module implements the\n // required `addListener`/`removeListeners` stubs on both platforms.\n const EmitterCtor = NativeEventEmitter as unknown as new (\n nativeModule?: unknown\n ) => { addListener: (eventType: string, cb: (payload: unknown) => void) => { remove: () => void } };\n const emitter = new EmitterCtor(PaywalloStoreKitNative);\n const sub = emitter.addListener(TRANSACTION_UPDATE_EVENT, (payload: unknown) => {\n const update = normalizeTransactionUpdate(payload);\n if (update) listener(update);\n });\n return { remove: () => sub.remove() };\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.log(\"[Paywallo] subscribeToTransactionUpdates failed\", err);\n return null;\n }\n },\n};\n\nfunction normalizeTransactionUpdate(raw: unknown): NativeTransactionUpdate | null {\n if (!raw || typeof raw !== \"object\") return null;\n const r = raw as Record<string, unknown>;\n const type = r.type;\n if (type !== \"renewed\" && type !== \"refunded\" && type !== \"canceled\") return null;\n const transactionId = typeof r.transactionId === \"string\" ? r.transactionId : null;\n const productId = typeof r.productId === \"string\" ? r.productId : null;\n if (!transactionId) return null;\n const update: NativeTransactionUpdate = {\n type,\n transactionId,\n productId: productId ?? \"\",\n };\n if (typeof r.amount === \"number\") update.amount = r.amount;\n if (typeof r.currency === \"string\") update.currency = r.currency;\n return update;\n}\n\n/** @deprecated Use `nativeStoreKit` (camelCase) */\nexport const NativeStoreKit = nativeStoreKit;\n","import type { QueueItem } from \"./types\";\n\nexport function normalizeForComparison(obj: unknown): string {\n if (obj === null || obj === undefined) {\n return String(obj);\n }\n\n if (typeof obj !== \"object\") {\n return JSON.stringify(obj);\n }\n\n if (Array.isArray(obj)) {\n return \"[\" + obj.map((item) => normalizeForComparison(item)).join(\",\") + \"]\";\n }\n\n const sortedKeys = Object.keys(obj as Record<string, unknown>).sort();\n const pairs = sortedKeys.map((key) => {\n const value = (obj as Record<string, unknown>)[key];\n return `${JSON.stringify(key)}:${normalizeForComparison(value)}`;\n });\n return \"{\" + pairs.join(\",\") + \"}\";\n}\n\nexport function findDuplicateIndex(queue: QueueItem[], item: QueueItem): number {\n const byId = queue.findIndex((existing) => existing.id === item.id);\n if (byId !== -1) return byId;\n\n const normalizedBody = normalizeForComparison(item.body);\n return queue.findIndex(\n (existing) =>\n existing.url === item.url && normalizeForComparison(existing.body) === normalizedBody\n );\n}\n","import { nativeStorage } from \"../storage/NativeStorage\";\n\nimport type { QueueItem } from \"./types\";\n\n/**\n * Read an array of `QueueItem` from a storage key. Returns an empty array\n * for missing keys, malformed JSON, or non-array payloads — callers never\n * see a parse exception, just an empty fallback.\n */\nexport async function readQueueItems(key: string): Promise<QueueItem[]> {\n try {\n const stored = await nativeStorage.get(key);\n if (!stored) return [];\n const parsed = JSON.parse(stored);\n if (!Array.isArray(parsed)) return [];\n return parsed as QueueItem[];\n } catch {\n return [];\n }\n}\n\n/**\n * Append an item to the pre-write journal. Deduplicates by `id` so repeated\n * enqueues of the same stable id don't bloat the journal between snapshots.\n *\n * This is the durable write that MUST precede any network attempt — the\n * in-memory queue mutation and the main snapshot write both happen AFTER\n * this resolves. A crash anywhere after this call returns leaves the item\n * recoverable on the next cold start via {@link mergeJournalIntoMain}.\n *\n * Errors are swallowed (not thrown) — the caller is already mid-enqueue and\n * should proceed with the in-memory mutation even if the journal write\n * couldn't be persisted. The main snapshot is still attempted on the\n * subsequent save, so durability is best-effort when storage is flaky.\n */\nexport async function appendToJournal(\n journalKey: string,\n item: QueueItem,\n onError?: (err: unknown) => void,\n): Promise<void> {\n try {\n const existing = await readQueueItems(journalKey);\n const next = existing.filter((e) => e.id !== item.id);\n next.push(item);\n await nativeStorage.set(journalKey, JSON.stringify(next));\n } catch (error) {\n onError?.(error);\n }\n}\n\nexport interface RecoveryResult {\n merged: QueueItem[];\n recovered: number;\n hadJournal: boolean;\n}\n\n/**\n * Boot-time recovery: read the main snapshot + the journal, merge them\n * (dedup by id), and return the union.\n *\n * The journal is authoritative for \"items that were enqueued but may not\n * have made it into a successful snapshot\" — merging it on boot is what\n * makes the pre-write durability guarantee hold across crashes. Callers\n * are expected to persist the merged set and clear the journal afterwards\n * (via a normal snapshot save with `preserveJournal=false`).\n */\nexport async function mergeJournalIntoMain(\n mainKey: string,\n journalKey: string,\n): Promise<RecoveryResult> {\n const main = await readQueueItems(mainKey);\n const journal = await readQueueItems(journalKey);\n\n if (journal.length === 0) {\n return { merged: main, recovered: 0, hadJournal: false };\n }\n\n const merged: QueueItem[] = [...main];\n let recovered = 0;\n for (const item of journal) {\n const existing = merged.findIndex((q) => q.id === item.id);\n if (existing === -1) {\n merged.push(item);\n recovered++;\n }\n }\n\n return { merged, recovered, hadJournal: true };\n}\n\n/**\n * Split a queue into \"kept\" (not yet expired) and \"expired\" (past `maxAge`)\n * buckets based on each item's `timestamp`. Pure function — the caller\n * decides what to emit and when to persist.\n */\nexport function partitionExpired(\n queue: QueueItem[],\n maxAge: number,\n now: number = Date.now(),\n): { kept: QueueItem[]; expired: QueueItem[] } {\n const kept: QueueItem[] = [];\n const expired: QueueItem[] = [];\n for (const item of queue) {\n if (now - item.timestamp < maxAge) kept.push(item);\n else expired.push(item);\n }\n return { kept, expired };\n}\n\n/**\n * Pick the index of the queue entry to evict when the queue hits capacity.\n *\n * Rules, in order:\n * 1. Prefer non-critical items. Critical entries are only evicted when\n * every item in the queue is critical.\n * 2. Within the preferred pool, evict the item with the most attempts\n * (closest to permanent failure).\n * 3. Tiebreak by oldest timestamp (FIFO-ish retention).\n */\nexport function pickEvictionIndex(queue: QueueItem[]): number {\n const normal: number[] = [];\n const critical: number[] = [];\n for (let i = 0; i < queue.length; i++) {\n if (queue[i].priority === \"critical\") critical.push(i);\n else normal.push(i);\n }\n const pool = normal.length > 0 ? normal : critical;\n\n let evictIndex = pool[0];\n for (let k = 1; k < pool.length; k++) {\n const i = pool[k];\n const candidate = queue[i];\n const current = queue[evictIndex];\n if (\n candidate.attempts > current.attempts ||\n (candidate.attempts === current.attempts && candidate.timestamp < current.timestamp)\n ) {\n evictIndex = i;\n }\n }\n return evictIndex;\n}\n","import { nativeStorage } from \"../storage/NativeStorage\";\nimport { CLIENT_ERROR_CODES, ClientError } from \"../../errors/ClientError\";\nimport {\n appendToJournal,\n mergeJournalIntoMain,\n partitionExpired,\n pickEvictionIndex,\n} from \"./QueueJournal\";\nimport type { OfflineQueueConfig, QueueEvent, QueueItem, QueueListener } from \"./types\";\n\n/**\n * Handles persistence (load, save, journal recovery, expiry cleanup) for the\n * offline queue. Emits queue events via the provided `emit` callback so the\n * parent OfflineQueue can relay them to its listeners.\n */\nexport class OfflineQueueStorage {\n constructor(\n private readonly config: OfflineQueueConfig,\n private readonly emit: (event: QueueEvent) => void,\n private readonly log: (...args: unknown[]) => void,\n ) {}\n\n async loadFromStorage(queue: QueueItem[]): Promise<QueueItem[]> {\n const { merged, recovered, hadJournal } = await mergeJournalIntoMain(\n this.config.storageKey,\n this.config.journalKey,\n );\n const result = merged;\n\n if (!hadJournal) return result;\n\n if (recovered > 0) {\n this.log(\"Recovered items from journal on cold start\", {\n recovered,\n totalSize: result.length,\n });\n }\n\n // Persist the merged snapshot + wipe the journal.\n await this.saveToStorage(result);\n this.emit({ type: \"recovery:complete\", queueSize: result.length, count: recovered });\n return result;\n }\n\n async saveToStorage(queue: QueueItem[], preserveJournal = false): Promise<boolean> {\n try {\n await nativeStorage.set(this.config.storageKey, JSON.stringify(queue));\n if (!preserveJournal) {\n await nativeStorage.set(this.config.journalKey, \"[]\");\n }\n return true;\n } catch (error) {\n this.log(\"Failed to save queue to storage\", error);\n this.emit({\n type: \"item:failed\",\n error: new ClientError(\n CLIENT_ERROR_CODES.UNKNOWN,\n \"Storage save failed - journal retained for next boot\",\n ),\n queueSize: queue.length,\n });\n return false;\n }\n }\n\n cleanupExpired(queue: QueueItem[]): QueueItem[] {\n const { kept, expired } = partitionExpired(queue, this.config.maxAge);\n if (expired.length === 0) return queue;\n\n this.log(\"Expired items dropped from queue\", {\n count: expired.length,\n reason: \"max_age\",\n maxAgeMs: this.config.maxAge,\n remaining: kept.length,\n });\n\n for (const item of expired) {\n this.emit({\n type: \"item:expired\",\n item,\n queueSize: kept.length,\n count: expired.length,\n reason: \"max_age\",\n });\n }\n\n void this.saveToStorage(kept);\n return kept;\n }\n\n async appendToJournal(item: QueueItem): Promise<void> {\n await appendToJournal(this.config.journalKey, item, (err) =>\n this.log(\"Failed to append to journal\", err),\n );\n }\n\n pickEvictionIndex(queue: QueueItem[]): number {\n return pickEvictionIndex(queue);\n }\n\n get maxItems(): number {\n return this.config.maxItems;\n }\n}\n","export type QueuePriority = \"critical\" | \"normal\";\n\nexport interface QueueItem {\n id: string;\n method: \"POST\" | \"PUT\";\n url: string;\n body: unknown;\n headers?: Record<string, string>;\n timestamp: number;\n attempts: number;\n maxAttempts: number;\n /**\n * Priority for this queue item. `\"critical\"` items are journaled to disk\n * immediately and trigger an out-of-band flush via listeners; `\"normal\"`\n * items are still journaled pre-network but coalesce into batch snapshots.\n * Optional so pre-existing serialized items (SDK ≤0.10) still load.\n */\n priority?: QueuePriority;\n /**\n * Epoch ms timestamp before which this item should NOT be retried.\n * Computed via exponential backoff after each failed attempt.\n * Absent on first attempt (item eligible immediately).\n */\n nextRetryAt?: number;\n}\n\nexport interface OfflineQueueConfig {\n maxItems: number;\n maxAge: number;\n maxAttempts: number;\n storageKey: string;\n /**\n * Storage key for the pre-write journal. New items are written here first\n * (append-only) BEFORE any network attempt so a kernel panic between\n * `enqueue` and the main snapshot save still lets us recover the item on\n * the next cold start.\n */\n journalKey: string;\n /**\n * Storage key for the dead-letter queue. Items that exhaust `maxAttempts`\n * are moved here instead of being silently dropped, enabling diagnostics\n * and manual replay.\n */\n dlqKey: string;\n /**\n * Maximum number of items retained in the DLQ. Oldest items are evicted\n * when the limit is reached (FIFO).\n */\n dlqMaxItems: number;\n /**\n * Base delay (ms) for exponential backoff on retry.\n * Delay = min(baseRetryDelayMs * 2^(attempts-1), maxRetryDelayMs).\n */\n baseRetryDelayMs: number;\n /**\n * Maximum delay cap (ms) for exponential backoff.\n */\n maxRetryDelayMs: number;\n debug: boolean;\n}\n\nexport type QueueEventType =\n | \"item:added\"\n | \"item:removed\"\n | \"item:success\"\n | \"item:failed\"\n | \"item:evicted\"\n | \"item:expired\"\n | \"processing:start\"\n | \"processing:end\"\n | \"recovery:complete\"\n | \"flush:requested\";\n\nexport interface QueueEvent {\n type: QueueEventType;\n item?: QueueItem;\n error?: Error;\n queueSize: number;\n /**\n * Populated on `item:expired` and `recovery:complete` events to surface\n * counts without forcing listeners to snapshot the queue.\n */\n count?: number;\n /**\n * Populated on `item:expired` so observability can report WHY items were\n * dropped (currently always `\"max_age\"`). Never a silent drop.\n */\n reason?: \"max_age\";\n}\n\nexport type QueueListener = (event: QueueEvent) => void;\n\nexport const DEFAULT_QUEUE_CONFIG: OfflineQueueConfig = {\n maxItems: 100,\n // 7 days — aligned with server-side analytics ingest window. Items that\n // don't make it off-device in a week are almost certainly orphaned (app\n // reinstalled, user lost network for 7+ days, etc).\n maxAge: 7 * 24 * 60 * 60 * 1000,\n maxAttempts: 5,\n storageKey: \"@paywallo:offline_queue\",\n journalKey: \"@paywallo:offline_queue:journal\",\n dlqKey: \"@paywallo:offline_queue:dlq\",\n dlqMaxItems: 50,\n // Backoff: 30s, 60s, 120s, 240s, 480s (capped)\n baseRetryDelayMs: 30_000,\n maxRetryDelayMs: 8 * 60 * 1000,\n debug: false,\n};\n","import { CLIENT_ERROR_CODES, ClientError } from \"../../errors/ClientError\";\nimport { generateUUID } from \"../../utils/uuid\";\nimport { nativeStorage } from \"../storage/NativeStorage\";\n\nimport { findDuplicateIndex } from \"./deduplication\";\nimport { OfflineQueueStorage } from \"./OfflineQueueStorage\";\nimport type {\n OfflineQueueConfig,\n QueueEvent,\n QueueItem,\n QueueListener,\n QueuePriority,\n} from \"./types\";\nimport { DEFAULT_QUEUE_CONFIG } from \"./types\";\n\n/**\n * Durable offline queue with a pre-write journal.\n *\n * Durability contract:\n * 1. `enqueue()` writes the new item to a dedicated journal key in storage\n * BEFORE any network attempt and before the item is added to the\n * in-memory queue.\n * 2. The main snapshot is written after the in-memory mutation.\n * 3. On boot, `initialize()` merges main+journal (dedup by id) and persists\n * the union.\n *\n * Persistence logic is delegated to `OfflineQueueStorage`.\n * Retention: items older than `maxAge` (default 7 days) are dropped.\n */\nclass OfflineQueueClass {\n private config: OfflineQueueConfig = DEFAULT_QUEUE_CONFIG;\n private queue: QueueItem[] = [];\n private listeners: Set<QueueListener> = new Set();\n private initialized = false;\n private processing = false;\n private processingLock = false;\n private cleanupTimer: ReturnType<typeof setInterval> | null = null;\n private storage: OfflineQueueStorage | null = null;\n\n async initialize(config?: Partial<OfflineQueueConfig>): Promise<void> {\n if (this.initialized) return;\n\n this.config = { ...DEFAULT_QUEUE_CONFIG, ...config };\n this.storage = new OfflineQueueStorage(\n this.config,\n (event) => this.emit(event),\n (...args) => this.log(...args),\n );\n\n this.queue = await this.storage.loadFromStorage(this.queue);\n this.queue = this.storage.cleanupExpired(this.queue);\n\n this.cleanupTimer = setInterval(() => {\n this.queue = this.storage!.cleanupExpired(this.queue);\n }, 60 * 60 * 1000);\n this.initialized = true;\n }\n\n async enqueue(\n method: \"POST\" | \"PUT\",\n url: string,\n body: unknown,\n headers?: Record<string, string>,\n id?: string,\n priority?: QueuePriority,\n ): Promise<QueueItem> {\n const item: QueueItem = {\n id: id ?? generateUUID(),\n method,\n url,\n body,\n headers,\n timestamp: Date.now(),\n attempts: 0,\n maxAttempts: this.config.maxAttempts,\n priority: priority ?? \"normal\",\n };\n\n await this.storage!.appendToJournal(item);\n\n const dupIndex = findDuplicateIndex(this.queue, item);\n if (dupIndex !== -1) {\n return this.mergeDuplicate(dupIndex, item);\n }\n\n if (this.queue.length >= this.storage!.maxItems) {\n const evictIndex = this.storage!.pickEvictionIndex(this.queue);\n const [removed] = this.queue.splice(evictIndex, 1);\n this.emit({ type: \"item:evicted\", item: removed, queueSize: this.queue.length });\n }\n\n this.queue.push(item);\n await this.storage!.saveToStorage(this.queue);\n this.emit({ type: \"item:added\", item, queueSize: this.queue.length });\n\n if (item.priority === \"critical\") {\n this.emit({ type: \"flush:requested\", item, queueSize: this.queue.length });\n }\n\n return item;\n }\n\n private async mergeDuplicate(existingIndex: number, item: QueueItem): Promise<QueueItem> {\n this.queue[existingIndex].timestamp = Date.now();\n if (item.priority === \"critical\") {\n this.queue[existingIndex].priority = \"critical\";\n }\n await this.storage!.saveToStorage(this.queue);\n if (this.queue[existingIndex].priority === \"critical\") {\n this.emit({\n type: \"flush:requested\",\n item: this.queue[existingIndex],\n queueSize: this.queue.length,\n });\n }\n return this.queue[existingIndex];\n }\n\n async dequeue(): Promise<QueueItem | null> {\n const item = this.queue.shift() ?? null;\n if (item) {\n await this.storage!.saveToStorage(this.queue);\n this.emit({ type: \"item:removed\", item, queueSize: this.queue.length });\n }\n return item;\n }\n\n async removeItem(id: string): Promise<boolean> {\n const index = this.queue.findIndex((item) => item.id === id);\n if (index === -1) return false;\n const [item] = this.queue.splice(index, 1);\n await this.storage!.saveToStorage(this.queue);\n this.emit({ type: \"item:removed\", item, queueSize: this.queue.length });\n return true;\n }\n\n async processQueue(\n processor: (item: QueueItem) => Promise<boolean | { success: boolean; permanent?: boolean }>,\n options?: { delayBetweenItems?: number },\n ): Promise<{ processed: number; failed: number }> {\n if (this.processingLock || this.queue.length === 0) {\n return { processed: 0, failed: 0 };\n }\n\n this.processingLock = true;\n this.processing = true;\n this.emit({ type: \"processing:start\", queueSize: this.queue.length });\n\n let processed = 0;\n let failed = 0;\n const delayMs = options?.delayBetweenItems ?? 100;\n\n const now = Date.now();\n const sortedIds = [...this.queue]\n .filter((item) => !item.nextRetryAt || item.nextRetryAt <= now)\n .sort((a, b) => (a.priority === \"critical\" ? 0 : 1) - (b.priority === \"critical\" ? 0 : 1))\n .map((item) => item.id);\n\n for (let i = 0; i < sortedIds.length; i++) {\n const item = this.queue.find((q) => q.id === sortedIds[i]);\n if (!item) continue;\n\n item.attempts++;\n try {\n const result = await processor(item);\n const success = typeof result === \"boolean\" ? result : result.success;\n const permanent = typeof result === \"object\" ? (result.permanent ?? false) : false;\n\n if (success) {\n await this.removeItem(item.id);\n processed++;\n this.emit({ type: \"item:success\", item, queueSize: this.queue.length });\n } else if (await this.handleItemFailure(item, undefined, permanent)) {\n failed++;\n }\n } catch (error) {\n const err = error instanceof Error ? error : new ClientError(CLIENT_ERROR_CODES.UNKNOWN, String(error));\n if (await this.handleItemFailure(item, err, false)) failed++;\n }\n\n if (i < sortedIds.length - 1 && delayMs > 0) await this.sleep(delayMs);\n }\n\n this.processing = false;\n this.processingLock = false;\n this.emit({ type: \"processing:end\", queueSize: this.queue.length });\n return { processed, failed };\n }\n\n private async handleItemFailure(item: QueueItem, error?: Error, permanent = false): Promise<boolean> {\n if (permanent || item.attempts >= item.maxAttempts) {\n await this.removeItem(item.id);\n await this.moveToDlq(item);\n this.emit({\n type: \"item:failed\",\n item,\n error: error ?? new ClientError(CLIENT_ERROR_CODES.UNKNOWN, permanent ? \"Permanent failure\" : \"Max attempts reached\"),\n queueSize: this.queue.length,\n });\n return true;\n }\n // Exponential backoff: delay = min(base * 2^(attempts-1), max)\n const delay = Math.min(\n this.config.baseRetryDelayMs * Math.pow(2, item.attempts - 1),\n this.config.maxRetryDelayMs,\n );\n item.nextRetryAt = Date.now() + delay;\n await this.storage!.saveToStorage(this.queue);\n return false;\n }\n\n private async moveToDlq(item: QueueItem): Promise<void> {\n try {\n const raw = await nativeStorage.get(this.config.dlqKey);\n const dlq: QueueItem[] = raw ? (JSON.parse(raw) as QueueItem[]) : [];\n dlq.push(item);\n // Evict oldest if over limit\n while (dlq.length > this.config.dlqMaxItems) {\n dlq.shift();\n }\n await nativeStorage.set(this.config.dlqKey, JSON.stringify(dlq));\n } catch {\n // DLQ persistence is best-effort — never crash the main queue\n }\n }\n\n async getDlq(): Promise<QueueItem[]> {\n try {\n const raw = await nativeStorage.get(this.config.dlqKey);\n return raw ? (JSON.parse(raw) as QueueItem[]) : [];\n } catch {\n return [];\n }\n }\n\n async clearDlq(): Promise<void> {\n try {\n await nativeStorage.set(this.config.dlqKey, \"[]\");\n } catch {\n // best-effort\n }\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n getQueue(): ReadonlyArray<QueueItem> { return [...this.queue]; }\n getSize(): number { return this.queue.length; }\n isEmpty(): boolean { return this.queue.length === 0; }\n isProcessing(): boolean { return this.processing; }\n\n async clear(): Promise<void> {\n this.queue = [];\n await this.storage!.saveToStorage(this.queue);\n }\n\n async clearItemsWithInvalidAppKey(validAppKey: string): Promise<number> {\n const before = this.queue.length;\n this.queue = this.queue.filter((item) => {\n const itemAppKey = item.headers?.[\"X-App-Key\"];\n return itemAppKey === validAppKey || !itemAppKey;\n });\n const removed = before - this.queue.length;\n if (removed > 0) await this.storage!.saveToStorage(this.queue);\n return removed;\n }\n\n addListener(listener: QueueListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n removeListener(listener: QueueListener): void {\n this.listeners.delete(listener);\n }\n\n private emit(event: QueueEvent): void {\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch (error) {\n this.log(\"Listener error\", error);\n }\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) console.log(\"[Paywallo:Queue]\", ...args);\n }\n\n setDebug(debug: boolean): void { this.config.debug = debug; }\n\n dispose(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n this.listeners.clear();\n this.queue = [];\n this.initialized = false;\n this.processing = false;\n this.processingLock = false;\n }\n}\n\nexport const offlineQueue = new OfflineQueueClass();\n/** @deprecated Use `offlineQueue` (camelCase) */\nexport const OfflineQueue = offlineQueue;\n","export type NetworkState = \"online\" | \"offline\" | \"unknown\";\n\nexport type NetworkListener = (state: NetworkState) => void;\n\nexport interface NetworkMonitorConfig {\n debug: boolean;\n checkInterval: number;\n checkUrl: string;\n}\n\nexport const DEFAULT_NETWORK_CONFIG: NetworkMonitorConfig = {\n debug: false,\n checkInterval: 30000,\n checkUrl: \"https://clients3.google.com/generate_204\",\n};\n","import { AppState, AppStateStatus } from \"react-native\";\n\nimport type { NetworkListener, NetworkMonitorConfig, NetworkState } from \"./types\";\nimport { DEFAULT_NETWORK_CONFIG } from \"./types\";\n\nclass NetworkMonitorClass {\n private config: NetworkMonitorConfig = DEFAULT_NETWORK_CONFIG;\n private listeners: Set<NetworkListener> = new Set();\n private currentState: NetworkState = \"unknown\";\n private appStateSubscription: ReturnType<typeof AppState.addEventListener> | null = null;\n private initialized = false;\n private checkIntervalId: ReturnType<typeof setInterval> | null = null;\n\n async initialize(config?: Partial<NetworkMonitorConfig>): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n this.config = { ...DEFAULT_NETWORK_CONFIG, ...config };\n\n this.currentState = \"unknown\";\n this.initialized = true;\n\n this.log(\"Initialized (state: unknown, awaiting first connectivity check)\");\n\n void this.setupFallbackDetection();\n this.setupAppStateListener();\n }\n\n private async setupFallbackDetection(): Promise<void> {\n await this.checkConnectivity();\n\n this.checkIntervalId = setInterval(() => {\n void this.checkConnectivity();\n }, this.config.checkInterval);\n }\n\n private setupAppStateListener(): void {\n this.appStateSubscription = AppState.addEventListener(\"change\", (state: AppStateStatus) => {\n if (state === \"active\") {\n // Resume polling and check immediately on foreground.\n if (!this.checkIntervalId) {\n this.checkIntervalId = setInterval(() => {\n void this.checkConnectivity();\n }, this.config.checkInterval);\n }\n void this.checkConnectivity();\n } else if (state === \"background\" || state === \"inactive\") {\n // Pause polling to avoid background battery drain.\n if (this.checkIntervalId) {\n clearInterval(this.checkIntervalId);\n this.checkIntervalId = null;\n }\n }\n });\n }\n\n private async checkConnectivity(): Promise<void> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000);\n\n const response = await fetch(this.config.checkUrl, {\n method: \"HEAD\",\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n this.updateState(response.ok ? \"online\" : \"offline\");\n } catch {\n this.updateState(\"offline\");\n }\n }\n\n private updateState(newState: NetworkState): void {\n const previousState = this.currentState;\n if (previousState === newState) {\n return;\n }\n\n this.currentState = newState;\n this.log(\"Network state changed\", { from: previousState, to: newState });\n this.notifyListeners(newState);\n }\n\n private notifyListeners(state: NetworkState): void {\n for (const listener of this.listeners) {\n try {\n listener(state);\n } catch (error) {\n this.log(\"Listener error\", error);\n }\n }\n }\n\n isOnline(): boolean {\n if (!this.initialized || this.currentState === \"unknown\") {\n return true;\n }\n return this.currentState === \"online\";\n }\n\n getState(): NetworkState {\n return this.currentState;\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n addListener(listener: NetworkListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n removeListener(listener: NetworkListener): void {\n this.listeners.delete(listener);\n }\n\n async forceCheck(): Promise<NetworkState> {\n await this.checkConnectivity();\n return this.currentState;\n }\n\n dispose(): void {\n if (this.appStateSubscription) {\n this.appStateSubscription.remove();\n this.appStateSubscription = null;\n }\n\n if (this.checkIntervalId) {\n clearInterval(this.checkIntervalId);\n this.checkIntervalId = null;\n }\n\n this.listeners.clear();\n this.initialized = false;\n this.currentState = \"unknown\";\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) console.log(\"[Paywallo:Network]\", ...args);\n }\n\n setDebug(debug: boolean): void {\n this.config.debug = debug;\n }\n}\n\nexport const networkMonitor = new NetworkMonitorClass();\n/** @deprecated Use `networkMonitor` (camelCase) */\nexport const NetworkMonitor = networkMonitor;\n","export { NetworkMonitor,networkMonitor } from \"./NetworkMonitor\";\nexport type { NetworkListener, NetworkMonitorConfig, NetworkState } from \"./types\";\nexport { DEFAULT_NETWORK_CONFIG } from \"./types\";\n","import { HttpClient } from \"../http\";\nimport { networkMonitor, type NetworkState } from \"../network\";\n\nimport { offlineQueue } from \"./OfflineQueue\";\nimport type { QueueItem } from \"./types\";\n\ninterface QueueItemResult {\n success: boolean;\n permanent?: boolean;\n status?: number;\n}\n\nexport interface QueueProcessorConfig {\n debounceMs: number;\n debug: boolean;\n /**\n * Lazy getter for headers that must be fresh at flush time (e.g. `X-App-Key`).\n * Called just before each batch/item HTTP request — not at enqueue time.\n * Avoids stale headers when the app key changes after the item was queued.\n */\n getFreshHeaders?: () => Record<string, string>;\n}\n\nconst DEFAULT_PROCESSOR_CONFIG: QueueProcessorConfig = {\n debounceMs: 2000,\n debug: false,\n};\n\nclass QueueProcessorClass {\n private config: QueueProcessorConfig = DEFAULT_PROCESSOR_CONFIG;\n private httpClient: HttpClient | null = null;\n private networkUnsubscribe: (() => void) | null = null;\n private queueUnsubscribe: (() => void) | null = null;\n private debounceTimeout: ReturnType<typeof setTimeout> | null = null;\n private retryIntervalId: ReturnType<typeof setInterval> | null = null;\n private initialized = false;\n\n initialize(httpClient: HttpClient, config?: Partial<QueueProcessorConfig>): void {\n if (this.initialized) {\n return;\n }\n\n this.httpClient = httpClient;\n this.config = { ...DEFAULT_PROCESSOR_CONFIG, ...config };\n\n this.networkUnsubscribe = networkMonitor.addListener((state: NetworkState) => {\n if (state === \"online\") {\n this.scheduleProcessing();\n }\n });\n\n // Critical items emit `flush:requested` from OfflineQueue. Bypass the\n // debounce window and drain immediately if we're online — matches the\n // EventBatcher \"critical → next microtask flush\" contract for items\n // that had to fall through to the offline queue.\n this.queueUnsubscribe = offlineQueue.addListener((event) => {\n if (event.type === \"flush:requested\" && networkMonitor.isOnline()) {\n void this.processQueue();\n }\n });\n\n if (networkMonitor.isOnline() && !offlineQueue.isEmpty()) {\n this.scheduleProcessing();\n }\n\n this.retryIntervalId = setInterval(() => {\n if (networkMonitor.isOnline() && !offlineQueue.isEmpty()) {\n this.scheduleProcessing();\n }\n }, 60000);\n\n this.initialized = true;\n this.log(\"QueueProcessor initialized\");\n }\n\n private scheduleProcessing(): void {\n if (this.debounceTimeout) {\n clearTimeout(this.debounceTimeout);\n }\n\n this.debounceTimeout = setTimeout(() => {\n void this.processQueue();\n }, this.config.debounceMs);\n }\n\n async processQueue(): Promise<{ processed: number; failed: number }> {\n if (!this.httpClient) {\n this.log(\"HttpClient not initialized\");\n return { processed: 0, failed: 0 };\n }\n\n if (!networkMonitor.isOnline()) {\n this.log(\"Offline, skipping queue processing\");\n return { processed: 0, failed: 0 };\n }\n\n const allItems = offlineQueue.getQueue();\n const eventItems = allItems.filter(\n (i) => (i.url.includes(\"/events\") || i.url.includes(\"/ingest\")) && !i.url.includes(\"/batch\")\n );\n const eventItemIds = new Set(eventItems.map((i) => i.id));\n\n const { processed: batchProcessed, failed: batchFailed, retryIds } =\n await this.processEventBatches(eventItems);\n\n const batchResult = { processed: batchProcessed, failed: batchFailed };\n\n const individualResult = await offlineQueue.processQueue(async (item: QueueItem) => {\n if (eventItemIds.has(item.id)) {\n // This event item was handled by batch processing.\n // If it's in retryIds, it failed with 5xx and should stay in queue for next cycle.\n // Return success=false, permanent=false to keep it and increment attempts.\n // If it was already removed (success/4xx), processQueue won't see it — so this\n // branch only executes for 5xx items still in the queue.\n if (retryIds.has(item.id)) {\n return { success: false, permanent: false };\n }\n // Already removed externally (shouldn't reach here, but guard anyway)\n return { success: true, permanent: false };\n }\n return this.processItem(item);\n });\n\n this.log(\"Queue processing complete\", {\n batchProcessed: batchResult.processed,\n batchFailed: batchResult.failed,\n individualProcessed: individualResult.processed,\n individualFailed: individualResult.failed,\n });\n\n return {\n processed: batchResult.processed + individualResult.processed,\n failed: batchResult.failed + individualResult.failed,\n };\n }\n\n private async processEventBatches(\n eventItems: QueueItem[]\n ): Promise<{ processed: number; failed: number; retryIds: Set<string> }> {\n if (eventItems.length === 0 || !this.httpClient) {\n return { processed: 0, failed: 0, retryIds: new Set() };\n }\n\n const BATCH_SIZE = 50;\n let processed = 0;\n let failed = 0;\n const retryIds = new Set<string>();\n\n for (let i = 0; i < eventItems.length; i += BATCH_SIZE) {\n const batch = eventItems.slice(i, i + BATCH_SIZE);\n const bodies = batch.map((item) => item.body);\n // Merge persisted headers with fresh headers captured at flush time so\n // rotated app keys and SDK telemetry headers (x-sdk-version, x-sdk-environment)\n // are always current — never stale from when the item was enqueued.\n const persistedHeaders = batch[0].headers ?? {};\n const freshHeaders = this.config.getFreshHeaders?.() ?? {};\n const headers = { ...persistedHeaders, ...freshHeaders };\n\n this.log(\"Sending event batch\", { size: batch.length, batchIndex: Math.floor(i / BATCH_SIZE) });\n\n const response = await this.httpClient.request(\"/sdk/events/batch\", {\n method: \"POST\",\n body: { events: bodies },\n headers,\n skipRetry: false,\n });\n\n if (response.ok) {\n for (const item of batch) {\n await offlineQueue.removeItem(item.id);\n processed++;\n }\n this.log(\"Event batch processed successfully\", { size: batch.length });\n } else if (response.status >= 400 && response.status < 500) {\n for (const item of batch) {\n await offlineQueue.removeItem(item.id);\n failed++;\n }\n this.log(\"Event batch failed permanently (4xx) - removing from queue\", {\n status: response.status,\n size: batch.length,\n });\n } else {\n for (const item of batch) {\n retryIds.add(item.id);\n }\n this.log(\"Event batch failed with server error - will retry\", {\n status: response.status,\n size: batch.length,\n });\n }\n }\n\n return { processed, failed, retryIds };\n }\n\n private async processItem(item: QueueItem): Promise<QueueItemResult> {\n if (!this.httpClient) {\n return { success: false, permanent: false };\n }\n\n this.log(\"Processing queue item\", {\n id: item.id,\n url: item.url,\n method: item.method,\n attempts: item.attempts,\n });\n\n const persistedHeaders = item.headers ?? {};\n const freshHeaders = this.config.getFreshHeaders?.() ?? {};\n const response = await this.httpClient.request(item.url, {\n method: item.method,\n body: item.body,\n headers: { ...persistedHeaders, ...freshHeaders },\n skipRetry: false,\n });\n\n if (response.ok) {\n this.log(\"Queue item processed successfully\", { id: item.id });\n return { success: true, permanent: false };\n }\n\n if (response.status >= 400 && response.status < 500) {\n this.log(\"Request failed with permanent client error - removing from queue\", {\n id: item.id,\n url: item.url,\n status: response.status,\n hasAppKey: item.headers?.[\"X-App-Key\"] != null,\n });\n return { success: false, permanent: true, status: response.status };\n }\n\n this.log(\"Request failed with server error - will retry\", {\n id: item.id,\n status: response.status,\n });\n return { success: false, permanent: false, status: response.status };\n }\n\n async enqueueIfOffline(\n method: \"POST\" | \"PUT\",\n url: string,\n body: unknown,\n headers?: Record<string, string>\n ): Promise<{ queued: boolean; item?: QueueItem }> {\n if (networkMonitor.isOnline()) {\n return { queued: false };\n }\n\n const item = await offlineQueue.enqueue(method, url, body, headers);\n this.log(\"Request queued for offline\", { id: item.id, url });\n return { queued: true, item };\n }\n\n getQueueSize(): number {\n return offlineQueue.getSize();\n }\n\n async clearQueue(): Promise<void> {\n await offlineQueue.clear();\n }\n\n dispose(): void {\n if (this.debounceTimeout) {\n clearTimeout(this.debounceTimeout);\n this.debounceTimeout = null;\n }\n\n if (this.retryIntervalId) {\n clearInterval(this.retryIntervalId);\n this.retryIntervalId = null;\n }\n\n if (this.networkUnsubscribe) {\n this.networkUnsubscribe();\n this.networkUnsubscribe = null;\n }\n\n if (this.queueUnsubscribe) {\n this.queueUnsubscribe();\n this.queueUnsubscribe = null;\n }\n\n this.httpClient = null;\n this.initialized = false;\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) console.log(\"[Paywallo:QueueProcessor]\", ...args);\n }\n\n setDebug(debug: boolean): void {\n this.config.debug = debug;\n }\n}\n\nexport const queueProcessor = new QueueProcessorClass();\n/** @deprecated Use `queueProcessor` (camelCase) */\nexport const QueueProcessor = queueProcessor;\n","export { OfflineQueue,offlineQueue } from \"./OfflineQueue\";\nexport { QueueProcessor, queueProcessor, type QueueProcessorConfig } from \"./QueueProcessor\";\nexport type {\n OfflineQueueConfig,\n QueueEvent,\n QueueEventType,\n QueueItem,\n QueueListener,\n QueuePriority,\n} from \"./types\";\nexport { DEFAULT_QUEUE_CONFIG } from \"./types\";\n","import { Platform } from \"react-native\";\n\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"./PurchaseError\";\nimport type { Product, Purchase, ValidatePurchaseResponse } from \"../../types/purchase\";\nimport { ApiClient } from \"../../core/ApiClient\";\nimport { offlineQueue } from \"../../core/queue\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\n\n/**\n * Classification of a validateWithServer() failure.\n * - `network`: transport/timeout/5xx → keep the StoreKit transaction + enqueue retry.\n * - `server4xx`: permanent server rejection → finish the transaction.\n */\nexport type ValidationFailureKind = \"network\" | \"server4xx\";\n\nexport interface ValidateOptions {\n paywallPlacement?: string;\n variantKey?: string;\n paywallId?: string;\n variantId?: string;\n}\n\n/**\n * Encapsulates server-validation logic, retry strategy, and offline-queue\n * durable retry for IAP purchases.\n */\nexport class IAPValidator {\n constructor(\n private readonly getProductFromCache: (id: string) => Product | undefined,\n private readonly getApiClientFn: () => ApiClient,\n private readonly getDebug: () => boolean,\n private readonly getDeviceCountry: () => string,\n ) {}\n\n private async validateWithRetry(\n attempt: () => Promise<ValidatePurchaseResponse>,\n maxRetries = 2,\n delayMs = 3000,\n ): Promise<ValidatePurchaseResponse> {\n let lastError: unknown;\n for (let i = 0; i <= maxRetries; i++) {\n try {\n return await attempt();\n } catch (error) {\n lastError = error;\n if (i < maxRetries) await new Promise<void>((resolve) => setTimeout(resolve, delayMs));\n }\n }\n throw lastError;\n }\n\n async validateWithServer(purchase: Purchase, productId: string, options?: ValidateOptions): Promise<ValidatePurchaseResponse> {\n const apiClient = this.getApiClientFn();\n const product = this.getProductFromCache(productId);\n const platform = Platform.OS as \"ios\" | \"android\";\n const distinctId = PaywalloClient.getDistinctId();\n\n return this.validateWithRetry(\n () => apiClient.validatePurchase(\n platform,\n purchase.receipt,\n purchase.productId,\n purchase.transactionId,\n product?.priceValue ?? 0,\n product?.currency ?? \"USD\",\n this.getDeviceCountry(),\n distinctId,\n options?.paywallPlacement,\n options?.variantKey,\n ),\n );\n }\n\n /**\n * Bucketizes a validation failure into `server4xx` (permanent) vs `network` (transient).\n */\n classifyValidationError(error: unknown): ValidationFailureKind {\n if (error instanceof PurchaseError && typeof error.httpStatus === \"number\") {\n const status = error.httpStatus;\n if (status >= 400 && status < 500) return \"server4xx\";\n }\n return \"network\";\n }\n\n /**\n * Pushes the validation payload into the offline queue for durable retry.\n * The StoreKit transaction is intentionally left un-finished.\n */\n async enqueueValidationRetry(\n purchase: Purchase,\n productId: string,\n options?: Pick<ValidateOptions, \"paywallPlacement\" | \"variantKey\">,\n ): Promise<void> {\n try {\n const apiClient = this.getApiClientFn();\n const product = this.getProductFromCache(productId);\n const platform = Platform.OS as \"ios\" | \"android\";\n const distinctId = PaywalloClient.getDistinctId();\n const appKey = apiClient.getAppKey();\n\n const body: Record<string, unknown> = {\n platform,\n receipt: purchase.receipt,\n productId: purchase.productId,\n transactionId: purchase.transactionId,\n priceLocal: product?.priceValue ?? 0,\n currency: product?.currency ?? \"USD\",\n country: this.getDeviceCountry(),\n distinctId,\n };\n if (options?.paywallPlacement !== undefined) body.paywallPlacement = options.paywallPlacement;\n if (options?.variantKey !== undefined) body.variantKey = options.variantKey;\n\n await offlineQueue.enqueue(\n \"POST\",\n `/purchases/validate`,\n body,\n { \"X-App-Key\": appKey },\n `validate:${purchase.transactionId}`,\n \"critical\",\n );\n if (this.getDebug()) console.log(\"[Paywallo PURCHASE] validation retry enqueued\", purchase.transactionId);\n } catch (err) {\n if (this.getDebug()) console.error(\"[Paywallo PURCHASE] failed to enqueue validation retry\", err);\n }\n }\n}\n","import { ApiClient } from \"../../core/ApiClient\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport {\n nativeStoreKit as NativeStoreKit,\n type NativeTransactionUpdate,\n type TransactionUpdateSubscription,\n} from \"./NativeStoreKit\";\nimport type { Product, Purchase } from \"../../types/purchase\";\n\n/**\n * Handles emitting transaction events to the analytics pipeline and manages\n * the native transaction update listener lifecycle.\n */\nexport class IAPTransactionEmitter {\n private transactionUpdateSubscription: TransactionUpdateSubscription | null = null;\n\n constructor(\n private readonly getProductFromCache: (productId: string) => Product | undefined,\n private readonly getApiClientFn: () => ApiClient | null,\n private readonly getDebug: () => boolean,\n ) {}\n\n /**\n * Emits `transaction {type: \"completed\"}` after a server-validated purchase.\n * Fire-and-forget — a tracking failure must never poison the purchase flow.\n */\n async emitTransactionCompleted(\n purchase: Purchase,\n productId: string,\n options?: { paywallId?: string; variantId?: string },\n ): Promise<void> {\n try {\n const apiClient = this.getApiClientFn();\n if (!apiClient) return;\n const distinctId = PaywalloClient.getDistinctId();\n if (!distinctId) return;\n\n const product = this.getProductFromCache(productId);\n const properties: Record<string, string | number | boolean | null> = {\n type: \"completed\",\n tx_id: purchase.transactionId,\n product_id: purchase.productId,\n };\n if (product?.priceValue !== undefined && product.priceValue > 0) {\n properties.amount = product.priceValue;\n }\n if (product?.currency) {\n properties.currency = product.currency;\n }\n if (options?.paywallId) properties.paywall_id = options.paywallId;\n if (options?.variantId) properties.variant_id = options.variantId;\n\n await apiClient.trackEvent(\"transaction\", distinctId, properties, undefined, { priority: \"critical\" });\n } catch (err) {\n if (this.getDebug()) console.log(\"[Paywallo PURCHASE] transaction event emission failed\", err);\n }\n }\n\n /**\n * Forwards a native transaction update to the EventBatcher.\n * Public so tests can exercise the wiring without a fake NativeEventEmitter.\n */\n async emitTransactionUpdate(update: NativeTransactionUpdate): Promise<void> {\n try {\n const apiClient = this.getApiClientFn() ?? PaywalloClient.getApiClient();\n if (!apiClient) {\n if (this.getDebug()) console.log(\"[Paywallo IAP] transaction update dropped (no apiClient)\", update.type);\n return;\n }\n const distinctId = PaywalloClient.getDistinctId();\n if (!distinctId) {\n if (this.getDebug()) console.log(\"[Paywallo IAP] transaction update dropped (no distinctId)\", update.type);\n return;\n }\n\n const properties: Record<string, string | number | boolean | null> = {\n type: update.type,\n tx_id: update.transactionId,\n product_id: update.productId,\n };\n\n if (update.type !== \"canceled\") {\n const cached = this.getProductFromCache(update.productId);\n const amount = update.amount ?? cached?.priceValue;\n const currency = update.currency ?? cached?.currency;\n if (typeof amount === \"number\" && amount > 0) properties.amount = amount;\n if (currency) properties.currency = currency;\n }\n\n await apiClient.trackEvent(\"transaction\", distinctId, properties, undefined, { priority: \"critical\" });\n if (this.getDebug()) console.log(`[Paywallo IAP] emitted transaction {${update.type}}`, update.transactionId);\n } catch (err) {\n if (this.getDebug()) console.log(\"[Paywallo IAP] transaction update emission failed\", err);\n }\n }\n\n /**\n * Starts listening to native Transaction.updates. Idempotent.\n */\n startListener(): void {\n if (this.transactionUpdateSubscription) return;\n this.transactionUpdateSubscription = NativeStoreKit.subscribeToTransactionUpdates(\n (update) => { void this.emitTransactionUpdate(update); },\n );\n if (this.getDebug() && this.transactionUpdateSubscription) {\n console.log(\"[Paywallo IAP] transaction update listener started\");\n }\n }\n\n /**\n * Removes the native listener. Safe to call multiple times.\n */\n stopListener(): void {\n if (!this.transactionUpdateSubscription) return;\n try {\n this.transactionUpdateSubscription.remove();\n } catch (err) {\n if (this.getDebug()) console.log(\"[Paywallo IAP] transaction listener removal failed\", err);\n }\n this.transactionUpdateSubscription = null;\n if (this.getDebug()) console.log(\"[Paywallo IAP] transaction update listener stopped\");\n }\n}\n","import { Platform } from \"react-native\";\n\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"./PurchaseError\";\nimport type { Product, Purchase, PurchaseResult } from \"../../types/purchase\";\n\nimport { ApiClient } from \"../../core/ApiClient\";\nimport {\n nativeStoreKit as NativeStoreKit,\n type NativeTransactionUpdate,\n} from \"./NativeStoreKit\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport { IAPValidator, type ValidateOptions } from \"./IAPValidator\";\nimport { IAPTransactionEmitter } from \"./IAPTransactionEmitter\";\n\nexport class IAPService {\n private productsCache: Map<string, Product> = new Map();\n private apiClient: ApiClient | null = null;\n private purchaseInFlight: string | null = null;\n /**\n * Idempotency guard against double-finish. Populated with transaction IDs\n * that have already been forwarded to `NativeStoreKit.finishTransaction`.\n */\n private finishedTransactions: Set<string> = new Set();\n\n private validator: IAPValidator;\n private emitter: IAPTransactionEmitter;\n\n constructor(apiClient?: ApiClient) {\n this.apiClient = apiClient ?? null;\n\n this.validator = new IAPValidator(\n (id) => this.productsCache.get(id),\n () => this.getApiClient(),\n () => this.debug,\n () => this.getDeviceCountry(),\n );\n\n this.emitter = new IAPTransactionEmitter(\n (id) => this.productsCache.get(id),\n () => this.apiClient ?? PaywalloClient.getApiClient(),\n () => this.debug,\n );\n }\n\n private get debug(): boolean {\n return PaywalloClient.getConfig()?.debug ?? false;\n }\n\n private getDeviceCountry(): string {\n try {\n const locale = Intl.DateTimeFormat().resolvedOptions().locale;\n const parts = locale.split(\"-\");\n return parts[parts.length - 1]?.toUpperCase() || \"US\";\n } catch {\n return \"US\";\n }\n }\n\n private getApiClient(): ApiClient {\n if (this.apiClient) return this.apiClient;\n const client = PaywalloClient.getApiClient();\n if (!client)\n throw new PurchaseError(PURCHASE_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized\");\n return client;\n }\n\n isAvailable(): boolean {\n return NativeStoreKit.isAvailable();\n }\n\n async loadProducts(productIds: string[]): Promise<Product[]> {\n if (!NativeStoreKit.isAvailable()) return [];\n try {\n const products = await NativeStoreKit.getProducts(productIds);\n for (const product of products) {\n this.productsCache.set(product.productId, product);\n }\n return products;\n } catch (err) {\n if (this.debug) console.error(\"[Paywallo] loadProducts failed\", err);\n return [];\n }\n }\n\n getProduct(productId: string): Product | undefined {\n return this.productsCache.get(productId);\n }\n\n getCachedProducts(): Map<string, Product> {\n return new Map(this.productsCache);\n }\n\n private async finishTransaction(transactionId: string): Promise<void> {\n if (this.finishedTransactions.has(transactionId)) {\n if (this.debug) console.log(\"[Paywallo PURCHASE] finishTransaction skipped (already finished)\", transactionId);\n return;\n }\n try {\n await NativeStoreKit.finishTransaction(transactionId);\n this.finishedTransactions.add(transactionId);\n } catch (err) {\n if (this.debug) console.error(\"[Paywallo] finishTransaction failed\", err);\n }\n }\n\n startTransactionListener(): void {\n this.emitter.startListener();\n }\n\n stopTransactionListener(): void {\n this.emitter.stopListener();\n }\n\n async emitTransactionUpdate(update: NativeTransactionUpdate): Promise<void> {\n return this.emitter.emitTransactionUpdate(update);\n }\n\n async purchase(productId: string, options?: ValidateOptions): Promise<PurchaseResult> {\n if (!NativeStoreKit.isAvailable()) {\n return {\n success: false,\n error: new PurchaseError(PURCHASE_ERROR_CODES.STORE_NOT_AVAILABLE, \"In-app purchases are not available on this device\"),\n };\n }\n\n if (this.purchaseInFlight) {\n return {\n success: false,\n error: new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, \"A purchase is already in progress\"),\n };\n }\n this.purchaseInFlight = productId;\n\n if (this.debug) console.log(`[Paywallo PURCHASE] starting ${productId}`);\n try {\n const purchase = await NativeStoreKit.purchase(productId);\n\n if (!purchase) {\n if (this.debug) console.log(`[Paywallo PURCHASE] ${productId} cancelled`);\n return { success: false };\n }\n\n if (this.debug) console.log(`[Paywallo PURCHASE] ${productId} approved`, { transactionId: purchase.transactionId });\n\n this.validator.validateWithServer(purchase, productId, options)\n .then(async () => {\n if (this.debug) console.log(`[Paywallo PURCHASE] ${productId} server validated`);\n await this.finishTransaction(purchase.transactionId);\n if (this.debug) console.log(`[Paywallo PURCHASE] ${productId} finished`);\n await this.emitter.emitTransactionCompleted(purchase, productId, {\n paywallId: options?.paywallId,\n variantId: options?.variantId,\n });\n })\n .catch(async (err) => {\n const kind = this.validator.classifyValidationError(err);\n if (kind === \"server4xx\") {\n if (this.debug) console.log(`[Paywallo PURCHASE] ${productId} validation rejected (4xx) — dropping`, err);\n await this.finishTransaction(purchase.transactionId);\n return;\n }\n if (this.debug) console.error(\"[Paywallo PURCHASE] background validation failed (network) — queued for retry\", err);\n await this.validator.enqueueValidationRetry(purchase, productId, {\n paywallPlacement: options?.paywallPlacement,\n variantKey: options?.variantKey,\n });\n });\n\n return { success: true, purchase };\n } catch (error) {\n if (this.debug) console.error(`[Paywallo PURCHASE] ${productId} failed`, error);\n const e = error instanceof PurchaseError\n ? error\n : new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, error instanceof Error ? error.message : String(error));\n return { success: false, error: e };\n } finally {\n this.purchaseInFlight = null;\n }\n }\n\n async restore(): Promise<Purchase[]> {\n if (!NativeStoreKit.isAvailable()) return [];\n\n try {\n const transactions = await NativeStoreKit.getActiveTransactions();\n const apiClient = this.getApiClient();\n const distinctId = PaywalloClient.getDistinctId();\n const platform = Platform.OS as \"ios\" | \"android\";\n\n const results = await Promise.allSettled(\n transactions.map((tx) => {\n const product = this.productsCache.get(tx.productId);\n return apiClient.validatePurchase(\n platform,\n tx.receipt,\n tx.productId,\n tx.transactionId,\n product?.priceValue ?? 0,\n product?.currency ?? \"USD\",\n this.getDeviceCountry(),\n distinctId,\n );\n }),\n );\n\n const validated: Purchase[] = [];\n for (let i = 0; i < results.length; i++) {\n const r = results[i];\n const tx = transactions[i];\n if (r.status === \"fulfilled\" && r.value.success) {\n await this.finishTransaction(tx.transactionId);\n validated.push(tx);\n continue;\n }\n\n if (r.status === \"rejected\") {\n const kind = this.validator.classifyValidationError(r.reason);\n if (kind === \"server4xx\") {\n if (this.debug) console.log(\"[Paywallo RESTORE] validation rejected (4xx) — dropping\", tx.transactionId);\n await this.finishTransaction(tx.transactionId);\n } else {\n if (this.debug) console.error(\"[Paywallo RESTORE] validation failed (network) — queued for retry\", r.reason);\n await this.validator.enqueueValidationRetry(tx, tx.productId);\n }\n } else if (r.status === \"fulfilled\" && !r.value.success) {\n if (this.debug) console.log(\"[Paywallo RESTORE] server returned success=false — dropping\", tx.transactionId);\n await this.finishTransaction(tx.transactionId);\n }\n }\n\n return validated;\n } catch (err) {\n if (this.debug) console.error(\"[Paywallo] restore failed\", err);\n return [];\n }\n }\n\n reset(): void {\n this.stopTransactionListener();\n this.productsCache.clear();\n this.finishedTransactions.clear();\n this.purchaseInFlight = null;\n }\n}\n\nlet _instance: IAPService | null = null;\n\nexport function getIAPService(): IAPService {\n if (!_instance) {\n _instance = new IAPService();\n _instance.startTransactionListener();\n }\n return _instance;\n}\n","/**\n * Enum legado aceito pelo SDK nos callers (`usePaywallActions`,\n * `usePurchaseOrchestrator`). Mantido só pra retrocompat — mapeado para\n * `PaywallCanonicalCloseReason` antes do emit canônico.\n */\nexport type PaywallCloseReason = \"dismissed\" | \"purchased\" | \"backgrounded\" | \"timeout\";\n\n/**\n * Enum do schema canônico `paywall {type: \"closed\"}` (sub-fase 2.10).\n * Qualquer emissão fora desse set é rejeitada pelo Zod em `EventBatcher`.\n */\nexport type PaywallCanonicalCloseReason = \"dismiss\" | \"cta\" | \"purchase\" | \"error\" | \"timeout\";\n\nconst CLOSE_REASON_MAP: Record<PaywallCloseReason, PaywallCanonicalCloseReason> = {\n dismissed: \"dismiss\",\n purchased: \"purchase\",\n backgrounded: \"dismiss\",\n timeout: \"timeout\",\n};\n\nexport function toCanonicalReason(\n reason: PaywallCloseReason | PaywallCanonicalCloseReason,\n): PaywallCanonicalCloseReason {\n if (reason in CLOSE_REASON_MAP) return CLOSE_REASON_MAP[reason as PaywallCloseReason];\n return reason as PaywallCanonicalCloseReason;\n}\n","import { PaywalloClient } from \"../../core/PaywalloClient\";\n\nimport {\n type PaywallCanonicalCloseReason,\n type PaywallCloseReason,\n toCanonicalReason,\n} from \"./paywallCloseReason\";\n\nexport interface EmitPaywallClosedOptions {\n placement: string;\n paywallId: string;\n presentedAt: number;\n reason: PaywallCloseReason | PaywallCanonicalCloseReason;\n variantKey?: string;\n campaignId?: string;\n /** UUID de `paywall_variants` (sub-fase 2.14). */\n variantId?: string;\n scrollDepth?: number;\n}\n\n/**\n * Emissor canônico único do `paywall {type: \"closed\"}` (sub-fase 2.10).\n *\n * Todo caller (modal via `usePaywallActions`, preloaded via\n * `usePaywallPresenter`, purchase/restore via `usePurchaseOrchestrator`,\n * unmount cleanup em `usePaywallSession`) passa por aqui — zero duplicação\n * do emit que causaria NULLs em `paywall_interactions.closedAt/durationS/variantId`.\n *\n * `closed_at` é ISO 8601, `duration_s` é segundos (não ms), `close_reason`\n * é sempre o enum canônico e `variant_id` é UUID quando o CampaignGate\n * (sub-fase 2.14) entrega.\n */\nexport async function emitPaywallClosed(opts: EmitPaywallClosedOptions): Promise<void> {\n try {\n const api = PaywalloClient.getApiClient();\n if (!api) return;\n const sessionId = PaywalloClient.getSessionId();\n const closedAt = new Date();\n const durationS = Math.max(0, Math.round((closedAt.getTime() - opts.presentedAt) / 1000));\n await api.trackEvent(\"paywall\", PaywalloClient.getDistinctId(), {\n type: \"closed\",\n paywall_id: opts.paywallId,\n placement: opts.placement,\n closed_at: closedAt.toISOString(),\n duration_s: durationS,\n close_reason: toCanonicalReason(opts.reason),\n ...(opts.variantId && { variant_id: opts.variantId }),\n ...(opts.variantKey && { variant_key: opts.variantKey }),\n ...(opts.campaignId && { campaign_id: opts.campaignId }),\n ...(typeof opts.scrollDepth === \"number\" && { scroll_depth: opts.scrollDepth }),\n ...(sessionId && { sessionId }),\n });\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.log(\"[Paywallo] emitPaywallClosed failed\", err);\n }\n}\n","import { secureStorage } from \"../../core/storage/SecureStorage\";\n\n/**\n * Crash-safe heartbeat para o paywall {closed} canônico (sub-fase 2.10).\n *\n * Enquanto um paywall está presente na tela o SDK escreve um snapshot a cada\n * HEARTBEAT_INTERVAL_MS no SecureStorage. Se o processo morre (kill do sistema,\n * OOM, crash nativo) a função de unmount/cleanup do React nunca roda — o evento\n * `paywall {closed}` nunca é emitido e as colunas `closedAt`/`durationS`\n * ficariam NULL em `paywall_interactions`.\n *\n * Na próxima inicialização do SDK, `recoverHeartbeat()` detecta o snapshot\n * órfão e sinta um evento `closed` com `close_reason: \"error\"` usando\n * `lastSeen - presentedAt` como `duration_s`. Isso fecha o row no server com\n * precisão de ±5s, eliminando o hole de observabilidade.\n */\n\nconst HEARTBEAT_STORAGE_KEY = \"@panel:paywall_heartbeat\";\n\nexport const HEARTBEAT_INTERVAL_MS = 5000;\n\nexport interface HeartbeatSnapshot {\n paywallId: string;\n variantId?: string;\n variantKey?: string;\n campaignId?: string;\n placement: string;\n presentedAt: number;\n lastSeen: number;\n}\n\ninterface ActiveHeartbeat {\n timer: ReturnType<typeof setInterval> | null;\n snapshot: HeartbeatSnapshot;\n}\n\nlet active: ActiveHeartbeat | null = null;\n\nfunction persist(snapshot: HeartbeatSnapshot): void {\n void secureStorage.set(HEARTBEAT_STORAGE_KEY, JSON.stringify(snapshot)).catch(() => undefined);\n}\n\n/**\n * Inicia o heartbeat para a sessão de paywall atual. Escreve imediatamente\n * e depois a cada 5s. Se já houver heartbeat ativo (re-open sem cleanup)\n * ele é substituído.\n */\nexport function startHeartbeat(snapshot: Omit<HeartbeatSnapshot, \"lastSeen\">): void {\n if (active?.timer) clearInterval(active.timer);\n const initial: HeartbeatSnapshot = { ...snapshot, lastSeen: Date.now() };\n persist(initial);\n const timer = setInterval(() => {\n if (!active) return;\n active.snapshot = { ...active.snapshot, lastSeen: Date.now() };\n persist(active.snapshot);\n }, HEARTBEAT_INTERVAL_MS);\n active = { timer, snapshot: initial };\n}\n\n/**\n * Interrompe o heartbeat ativo e remove o snapshot do storage — chamado\n * no cleanup do `useEffect` quando o paywall desmonta normalmente (incluindo\n * close por dismiss, cta, purchase, timeout).\n */\nexport async function stopHeartbeat(): Promise<void> {\n if (active?.timer) clearInterval(active.timer);\n active = null;\n try {\n await secureStorage.remove(HEARTBEAT_STORAGE_KEY);\n } catch {\n /* best-effort — storage pode estar indisponível em ambientes sem native module */\n }\n}\n\n/**\n * Snapshot atual em memória — exposto para testes e para o path de\n * trackClosed calcular `duration_s` consistente mesmo sem clock fresh.\n */\nexport function getActiveSnapshot(): HeartbeatSnapshot | null {\n return active ? active.snapshot : null;\n}\n\n/**\n * Lê o último snapshot persistido (ou null). Usado pela rotina de recovery\n * em `PaywalloInitializer.doInit` e pelos testes de crash.\n */\nexport async function readPersistedHeartbeat(): Promise<HeartbeatSnapshot | null> {\n try {\n const raw = await secureStorage.get(HEARTBEAT_STORAGE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as HeartbeatSnapshot;\n if (!parsed.paywallId || typeof parsed.presentedAt !== \"number\" || typeof parsed.lastSeen !== \"number\") {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\n/**\n * Remove o snapshot persistido (usado após recovery bem-sucedido ou reset\n * manual). Não mexe no heartbeat in-memory — esse é isolado em `stopHeartbeat`.\n */\nexport async function clearPersistedHeartbeat(): Promise<void> {\n try {\n await secureStorage.remove(HEARTBEAT_STORAGE_KEY);\n } catch {\n /* best-effort */\n }\n}\n","import { useCallback } from \"react\";\n\nimport { emitPaywallClosed } from \"./emitPaywallClosed\";\nimport { stopHeartbeat } from \"./paywallHeartbeat\";\nimport type { PaywallCanonicalCloseReason, PaywallCloseReason } from \"./paywallCloseReason\";\n\ninterface TrackClosedOptions {\n placement: string;\n paywallId: string;\n presentedAt: number;\n reason: PaywallCloseReason | PaywallCanonicalCloseReason;\n variantKey?: string;\n campaignId?: string;\n /** UUID de `paywall_variants` (sub-fase 2.14). */\n variantId?: string;\n scrollDepth?: number;\n}\n\ninterface TrackDismissedOptions {\n placement: string;\n paywallId: string;\n duration_ms: number;\n reason: PaywallCloseReason;\n variantKey?: string;\n campaignId?: string;\n variantId?: string;\n}\n\ninterface TrackProductSelectedOptions {\n placement: string;\n paywallId: string;\n productId: string;\n variantKey?: string;\n campaignId?: string;\n variantId?: string;\n}\n\ninterface TrackPurchasedOptions {\n placement: string;\n paywallId: string;\n productId: string;\n variantKey?: string;\n campaignId?: string;\n variantId?: string;\n}\n\nexport interface UsePaywallTrackingResult {\n trackClosed: (opts: TrackClosedOptions) => Promise<void>;\n trackDismissed: (opts: TrackDismissedOptions) => Promise<void>;\n trackProductSelected: (opts: TrackProductSelectedOptions) => void;\n trackPurchased: (opts: TrackPurchasedOptions) => Promise<void>;\n}\n\n/**\n * Hook de tracking do paywall — única porta pro emit canônico\n * `paywall {type: \"closed\"}`.\n *\n * - `trackClosed` é o caminho canônico novo (sub-fase 2.10).\n * - `trackDismissed` é o wrapper legado (duration_ms + reason antigo)\n * mantido só pra não quebrar `usePaywallActions` e\n * `usePurchaseOrchestrator` — internamente roteia pro canonical.\n * - `trackProductSelected` e `trackPurchased` são no-ops (V2 taxonomy\n * droppou os eventos do server).\n */\nexport function usePaywallTracking(): UsePaywallTrackingResult {\n const trackClosed = useCallback(async (opts: TrackClosedOptions): Promise<void> => {\n await emitPaywallClosed(opts);\n await stopHeartbeat();\n }, []);\n\n const trackDismissed = useCallback(async (opts: TrackDismissedOptions): Promise<void> => {\n const presentedAt = Date.now() - Math.max(0, opts.duration_ms);\n await trackClosed({\n placement: opts.placement,\n paywallId: opts.paywallId,\n presentedAt,\n reason: opts.reason,\n ...(opts.variantKey && { variantKey: opts.variantKey }),\n ...(opts.campaignId && { campaignId: opts.campaignId }),\n ...(opts.variantId && { variantId: opts.variantId }),\n });\n }, [trackClosed]);\n\n const trackProductSelected = useCallback((_opts: TrackProductSelectedOptions): void => {\n // V2 taxonomy: dropped (no server consumer).\n }, []);\n\n const trackPurchased = useCallback(async (_opts: TrackPurchasedOptions): Promise<void> => {\n // V2 taxonomy: superseded by `transaction {type: \"completed\"}` from IAPService.\n }, []);\n\n return { trackClosed, trackDismissed, trackProductSelected, trackPurchased };\n}\n\n// Re-export pra não quebrar callers que importavam tipos do hook diretamente.\nexport type { PaywallCanonicalCloseReason, PaywallCloseReason } from \"./paywallCloseReason\";\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Animated, AppState, Dimensions } from \"react-native\";\n\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport { getIAPService } from \"../iap/IAPService\";\nimport type { PaywallConfig, PaywallResult } from \"../../types\";\n\nimport { usePaywallTracking } from \"./usePaywallTracking\";\nimport type { PaywallCloseReason } from \"./usePaywallTracking\";\n\nconst PAYWALL_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes\n\nexport interface UsePaywallActionsResult {\n isPurchasing: boolean;\n slideAnim: Animated.Value;\n handleClose: () => void;\n handlePurchase: (productId: string) => Promise<void>;\n handleRestore: () => Promise<void>;\n}\n\nexport function usePaywallActions(\n placement: string,\n paywallConfig: PaywallConfig | null,\n onResult: (result: PaywallResult) => void,\n variantKey?: string,\n campaignId?: string,\n openAnim?: Animated.Value,\n /** UUID de `paywall_variants` (sub-fase 2.14). */\n variantId?: string,\n): UsePaywallActionsResult {\n const [isPurchasing, setIsPurchasing] = useState(false);\n const isPurchasingRef = useRef(false);\n const [isClosing, setIsClosing] = useState(false);\n const slideAnim = useRef(new Animated.Value(0)).current;\n const presentedAtRef = useRef<number>(Date.now());\n const closedRef = useRef(false);\n const { trackDismissed, trackProductSelected, trackPurchased } = usePaywallTracking();\n\n const closeWithReason = useCallback((reason: PaywallCloseReason, resultOverride?: PaywallResult) => {\n if (closedRef.current) return;\n closedRef.current = true;\n const animTarget = openAnim ?? slideAnim;\n Animated.timing(animTarget, {\n toValue: Dimensions.get(\"window\").height,\n duration: 350,\n useNativeDriver: true,\n }).start(() => {\n if (paywallConfig) {\n const duration_ms = Date.now() - presentedAtRef.current;\n void trackDismissed({ placement, paywallId: paywallConfig.id, duration_ms, reason, variantKey, campaignId, variantId });\n }\n slideAnim.setValue(0);\n closedRef.current = false;\n setIsClosing(false);\n onResult(resultOverride ?? { presented: true, purchased: false, cancelled: true, restored: false });\n });\n }, [openAnim, slideAnim, paywallConfig, placement, trackDismissed, variantKey, campaignId, variantId, onResult]);\n\n const handleClose = useCallback(() => {\n if (isClosing) return;\n setIsClosing(true);\n closeWithReason(\"dismissed\");\n }, [isClosing, closeWithReason]);\n\n // AppState listener: background → emit \"backgrounded\"\n // Skip during purchase — StoreKit payment sheet triggers \"inactive\" on iOS\n useEffect(() => {\n const sub = AppState.addEventListener(\"change\", (nextState) => {\n if (isPurchasingRef.current) return;\n if (nextState === \"background\" || nextState === \"inactive\") {\n closeWithReason(\"backgrounded\");\n }\n });\n return () => sub.remove();\n }, [closeWithReason]);\n\n // Timeout: auto-close after 30 minutes\n useEffect(() => {\n const timer = setTimeout(() => {\n closeWithReason(\"timeout\");\n }, PAYWALL_TIMEOUT_MS);\n return () => clearTimeout(timer);\n }, [closeWithReason]);\n\n const handlePurchase = useCallback(async (productId: string) => {\n if (isPurchasing) return;\n setIsPurchasing(true);\n isPurchasingRef.current = true;\n try {\n if (paywallConfig) trackProductSelected({ placement, paywallId: paywallConfig.id, productId, variantKey, campaignId, variantId });\n const result = await getIAPService().purchase(productId, {\n paywallPlacement: placement,\n variantKey,\n ...(paywallConfig && { paywallId: paywallConfig.id }),\n ...(variantId && { variantId }),\n });\n if (result.success) {\n if (paywallConfig) {\n const duration_ms = Date.now() - presentedAtRef.current;\n await trackDismissed({ placement, paywallId: paywallConfig.id, duration_ms, reason: \"purchased\", variantKey, campaignId, variantId });\n await trackPurchased({ placement, paywallId: paywallConfig.id, productId, variantKey, campaignId, variantId });\n }\n closedRef.current = true;\n onResult({ presented: true, purchased: true, cancelled: false, restored: false });\n } else if (result.error) {\n onResult({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n } catch (error) {\n onResult({ presented: true, purchased: false, cancelled: false, restored: false });\n } finally {\n isPurchasingRef.current = false;\n setIsPurchasing(false);\n }\n }, [isPurchasing, onResult, paywallConfig, placement, trackDismissed, trackProductSelected, trackPurchased, variantKey, campaignId, variantId]);\n\n const handleRestore = useCallback(async () => {\n if (isPurchasing) return;\n setIsPurchasing(true);\n isPurchasingRef.current = true;\n try {\n const transactions = await getIAPService().restore();\n if (transactions.length > 0) {\n if (paywallConfig) {\n const duration_ms = Date.now() - presentedAtRef.current;\n await trackDismissed({ placement, paywallId: paywallConfig.id, duration_ms, reason: \"dismissed\", variantKey, campaignId, variantId });\n }\n onResult({ presented: true, purchased: false, cancelled: false, restored: true });\n } else {\n onResult({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n } catch (error) {\n onResult({ presented: true, purchased: false, cancelled: false, restored: false });\n } finally {\n isPurchasingRef.current = false;\n setIsPurchasing(false);\n }\n }, [isPurchasing, onResult, paywallConfig, placement, trackDismissed, variantKey, campaignId, variantId]);\n\n return { isPurchasing, slideAnim, handleClose, handlePurchase, handleRestore };\n}\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class PaywallError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"paywall\", code, message);\n this.name = \"PaywallError\";\n }\n}\n\nexport const PAYWALL_ERROR_CODES = {\n NOT_INITIALIZED: \"PAYWALL_NOT_INITIALIZED\",\n NOT_FOUND: \"PAYWALL_NOT_FOUND\",\n RENDER_FAILED: \"PAYWALL_RENDER_FAILED\",\n LOAD_FAILED: \"PAYWALL_LOAD_FAILED\",\n DISMISS_FAILED: \"PAYWALL_DISMISS_FAILED\",\n INVALID_CONFIG: \"PAYWALL_INVALID_CONFIG\",\n} as const;\n","import { useEffect, useRef, useState } from \"react\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport { getIAPService } from \"../iap/IAPService\";\nimport { PAYWALL_ERROR_CODES, PaywallError } from \"./PaywallError\";\nimport type { PaywallConfig } from \"../../types\";\nimport type { Product } from \"../../types/purchase\";\n\ninterface PreloadedConfig {\n id: string;\n placement: string;\n config: Record<string, unknown>;\n primaryProductId?: string;\n secondaryProductId?: string;\n}\n\ninterface UsePaywallLoaderResult {\n paywallConfig: PaywallConfig | null;\n products: Map<string, Product>;\n error: Error | null;\n}\n\nexport function usePaywallLoader(\n placement: string,\n visible: boolean,\n preloadedConfig?: PreloadedConfig,\n preloadedProducts?: Map<string, Product>,\n variantKey?: string,\n campaignId?: string,\n /** UUID de `paywall_variants` (sub-fase 2.14). */\n variantId?: string,\n): UsePaywallLoaderResult {\n const [error, setError] = useState<Error | null>(null);\n const [paywallConfig, setPaywallConfig] = useState<PaywallConfig | null>(null);\n const [products, setProducts] = useState<Map<string, Product>>(new Map());\n const preloadedConfigRef = useRef(preloadedConfig);\n preloadedConfigRef.current = preloadedConfig;\n const preloadedProductsRef = useRef(preloadedProducts);\n preloadedProductsRef.current = preloadedProducts;\n const trackingDoneRef = useRef(false);\n\n useEffect(() => {\n if (!visible) { trackingDoneRef.current = false; return; }\n\n let cancelled = false;\n\n const load = async () => {\n setError(null);\n try {\n const apiClient = PaywalloClient.getApiClient();\n if (!apiClient) throw new PaywallError(PAYWALL_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized\");\n\n let config: PaywallConfig;\n const snap = preloadedConfigRef.current;\n if (snap) {\n config = { id: snap.id, placement: snap.placement, config: snap.config as { craftData: string },\n primaryProductId: snap.primaryProductId, secondaryProductId: snap.secondaryProductId };\n } else {\n const fetched = await apiClient.getPaywall(placement);\n if (!fetched) throw new PaywallError(PAYWALL_ERROR_CODES.NOT_FOUND, `Paywall not found for placement: ${placement}`);\n config = fetched;\n }\n if (cancelled) return;\n setPaywallConfig(config);\n\n const productIds: string[] = [];\n if (config.primaryProductId) productIds.push(config.primaryProductId);\n if (config.secondaryProductId) productIds.push(config.secondaryProductId);\n\n const snapProducts = preloadedProductsRef.current;\n if (snapProducts && snapProducts.size > 0) {\n if (!cancelled) setProducts(snapProducts);\n } else if (productIds.length > 0) {\n try {\n const storeProducts = await getIAPService().loadProducts(productIds);\n if (!cancelled) {\n const map = new Map<string, Product>();\n for (const p of storeProducts) map.set(p.productId, p);\n setProducts(map);\n }\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] loadProducts in paywall failed\", err);\n if (!cancelled) setProducts(new Map());\n }\n } else {\n if (!cancelled) setProducts(new Map());\n }\n\n if (!trackingDoneRef.current && !cancelled) {\n trackingDoneRef.current = true;\n const sessionId = PaywalloClient.getSessionId();\n const distinctId = PaywalloClient.getDistinctId();\n await apiClient.trackEvent(\"$paywall_viewed\", distinctId, {\n placement, paywallId: config.id,\n ...(sessionId && { sessionId }),\n ...(variantKey && { variantKey }),\n ...(campaignId && { campaignId }),\n ...(variantId && { variant_id: variantId }),\n });\n await apiClient.trackEvent(\"paywall\", distinctId, {\n type: \"open\",\n paywall_id: config.id,\n placement,\n opened_at: new Date().toISOString(),\n ...(sessionId && { sessionId }),\n ...(variantKey && { variant_key: variantKey }),\n ...(campaignId && { campaign_id: campaignId }),\n ...(variantId && { variant_id: variantId }),\n });\n }\n } catch (err) {\n if (cancelled) return;\n const e = err instanceof Error ? err : new PaywallError(PAYWALL_ERROR_CODES.LOAD_FAILED, String(err));\n setError(e);\n }\n };\n\n void load();\n return () => { cancelled = true; };\n }, [placement, visible, variantKey, campaignId, variantId]);\n\n return { paywallConfig, products, error };\n}\n","import { NativeModules, Platform } from \"react-native\";\n\nimport type { LocalizedText } from \"../types/blocks\";\n\nlet currentLanguage = \"pt-BR\";\nlet defaultLanguage = \"pt-BR\";\n\nexport function setCurrentLanguage(language: string): void {\n currentLanguage = language;\n}\n\nexport function setDefaultLanguage(language: string): void {\n defaultLanguage = language;\n}\n\nexport function getCurrentLanguage(): string {\n return currentLanguage;\n}\n\nexport function getDefaultLanguage(): string {\n return defaultLanguage;\n}\n\nexport function getLocalizedString(text: string | LocalizedText | undefined): string {\n if (!text) return \"\";\n if (typeof text === \"string\") return text;\n\n return text[currentLanguage] ?? text[defaultLanguage] ?? Object.values(text)[0] ?? \"\";\n}\n\nexport function detectDeviceLanguage(): string {\n try {\n if (Platform.OS === \"ios\") {\n const settings = (\n NativeModules as {\n SettingsManager?: { settings?: { AppleLocale?: string; AppleLanguages?: string[] } };\n }\n ).SettingsManager?.settings;\n return settings?.AppleLocale ?? settings?.AppleLanguages?.[0] ?? \"en-US\";\n }\n\n return (\n (NativeModules as { I18nManager?: { localeIdentifier?: string } }).I18nManager\n ?.localeIdentifier ?? \"en-US\"\n );\n } catch {\n return \"en-US\";\n }\n}\n\nconst SDK_STRINGS = {\n paywallErrorTitle: {\n \"pt-BR\": \"Algo deu errado\",\n \"pt\": \"Algo deu errado\",\n \"en\": \"Something went wrong\",\n \"en-US\": \"Something went wrong\",\n \"en-GB\": \"Something went wrong\",\n \"es\": \"Algo salió mal\",\n \"es-419\": \"Algo salió mal\",\n },\n paywallRetryButton: {\n \"pt-BR\": \"Tentar novamente\",\n \"pt\": \"Tentar novamente\",\n \"en\": \"Try again\",\n \"en-US\": \"Try again\",\n \"en-GB\": \"Try again\",\n \"es\": \"Reintentar\",\n \"es-419\": \"Reintentar\",\n },\n paywallCloseButton: {\n \"pt-BR\": \"Fechar\",\n \"pt\": \"Fechar\",\n \"en\": \"Close\",\n \"en-US\": \"Close\",\n \"en-GB\": \"Close\",\n \"es\": \"Cerrar\",\n \"es-419\": \"Cerrar\",\n },\n} as const;\n\ntype SdkStringKey = keyof typeof SDK_STRINGS;\n\nexport function getSdkString(key: SdkStringKey): string {\n const map: Record<string, string> = SDK_STRINGS[key];\n if (currentLanguage in map) return map[currentLanguage]!;\n const base = currentLanguage.split(\"-\")[0];\n if (base && base in map) return map[base]!;\n if (defaultLanguage in map) return map[defaultLanguage]!;\n return Object.values(map)[0];\n}\n\nexport function initLocalization(options?: {\n defaultLanguage?: string;\n detectDevice?: boolean;\n}): void {\n if (options?.defaultLanguage) {\n defaultLanguage = options.defaultLanguage;\n }\n\n if (options?.detectDevice !== false) {\n const deviceLanguage = detectDeviceLanguage();\n currentLanguage = deviceLanguage;\n }\n}\n","export interface WebViewMessage {\n type: \"purchase\" | \"close\" | \"restore\" | \"select-product\" | \"open-url\" | \"ready\";\n id?: string;\n payload?: {\n productId?: string;\n url?: string;\n timestamp?: number;\n };\n}\n\nconst ALLOWED_MESSAGE_TYPES: ReadonlySet<string> = new Set([\n \"purchase\",\n \"close\",\n \"restore\",\n \"select-product\",\n \"open-url\",\n \"ready\",\n]);\n\nexport function deriveMessageId(message: WebViewMessage): string {\n if (message.id) return message.id;\n\n const payloadKey =\n message.payload?.productId ??\n message.payload?.url ??\n (message.payload?.timestamp != null ? String(message.payload.timestamp) : \"\");\n\n return `${message.type}:${payloadKey}`;\n}\n\nexport function parseWebViewMessage(raw: string): WebViewMessage | null {\n try {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n if (typeof parsed?.type !== \"string\" || !ALLOWED_MESSAGE_TYPES.has(parsed.type)) {\n return null;\n }\n\n const payload = parsed.payload;\n const safePayload: WebViewMessage[\"payload\"] =\n payload !== null && typeof payload === \"object\"\n ? {\n productId: typeof (payload as Record<string, unknown>).productId === \"string\"\n ? String((payload as Record<string, unknown>).productId)\n : undefined,\n url: typeof (payload as Record<string, unknown>).url === \"string\"\n ? String((payload as Record<string, unknown>).url)\n : undefined,\n timestamp: typeof (payload as Record<string, unknown>).timestamp === \"number\"\n ? Number((payload as Record<string, unknown>).timestamp)\n : undefined,\n }\n : undefined;\n\n return {\n type: parsed.type as WebViewMessage[\"type\"],\n id: typeof parsed.id === \"string\" ? parsed.id : undefined,\n payload: safePayload,\n };\n } catch {\n return null;\n }\n}\n","import type { Product } from \"../../types/purchase\";\n\ninterface PaywallInjectionData {\n craftData: string;\n products: Product[];\n primaryProductId?: string;\n secondaryProductId?: string;\n}\n\nexport function buildPaywallInjectionScript(data: PaywallInjectionData): string {\n const paywallData = {\n type: \"paywall\",\n data: {\n craftData: data.craftData,\n products: data.products,\n primaryProductId: data.primaryProductId,\n secondaryProductId: data.secondaryProductId,\n },\n };\n\n return `(function(){var d=${JSON.stringify(paywallData)},a=0,m=50;function t(){a++;if(window.receiveNativeMessage){window.receiveNativeMessage(d);return;}if(a<m){setTimeout(t,100);}}t();})();true;`;\n}\n\nexport function buildPurchaseStateScript(isPurchasing: boolean): string {\n return `if(window.receiveNativeMessage){window.receiveNativeMessage({type:\"purchaseState\",data:{isPurchasing:${isPurchasing}}});}true;`;\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n Linking,\n NativeEventEmitter,\n NativeModules,\n requireNativeComponent,\n StyleProp,\n StyleSheet,\n View,\n ViewStyle,\n} from \"react-native\";\n\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport type { Product } from \"../../types/purchase\";\nimport { deriveMessageId, parseWebViewMessage, WebViewMessage } from \"./parseWebViewMessage\";\nimport { buildPaywallInjectionScript, buildPurchaseStateScript } from \"./paywallScripts\";\n\ninterface NativeWebViewProps {\n sourceUrl: string;\n injectedJavaScript?: string;\n onMessage?: (event: { nativeEvent: { data: string } }) => void;\n onLoadEnd?: () => void;\n onError?: (event: { nativeEvent: Record<string, unknown> }) => void;\n style?: StyleProp<ViewStyle>;\n ref?: React.Ref<View>;\n}\n\ninterface WebViewError {\n code: number;\n description: string;\n url?: string;\n}\n\nlet NativeWebViewComponent: ReturnType<typeof requireNativeComponent<NativeWebViewProps>> | null =\n null;\nlet nativeWebViewLookupFailed = false;\n\nfunction getNativeWebView(): ReturnType<typeof requireNativeComponent<NativeWebViewProps>> | null {\n if (NativeWebViewComponent) return NativeWebViewComponent;\n if (nativeWebViewLookupFailed) return null;\n try {\n NativeWebViewComponent = requireNativeComponent<NativeWebViewProps>(\"PaywalloWebView\");\n return NativeWebViewComponent;\n } catch {\n nativeWebViewLookupFailed = true;\n return null;\n }\n}\n\nlet webViewEmitter: NativeEventEmitter | null = null;\nfunction getWebViewEmitter(): NativeEventEmitter | null {\n if (webViewEmitter) return webViewEmitter;\n const mod = NativeModules.PaywalloWebViewModule;\n if (!mod) return null;\n webViewEmitter = new NativeEventEmitter(mod);\n return webViewEmitter;\n}\n\nfunction parseErrorEvent(raw: Record<string, unknown>): WebViewError {\n return {\n code: typeof raw[\"code\"] === \"number\" ? raw[\"code\"] : -1,\n description: typeof raw[\"description\"] === \"string\" ? raw[\"description\"] : \"WebView error\",\n url: typeof raw[\"url\"] === \"string\" ? raw[\"url\"] : undefined,\n };\n}\n\ninterface PaywallWebViewProps {\n paywallId: string;\n craftData: string;\n products: Map<string, Product>;\n primaryProductId?: string;\n secondaryProductId?: string;\n isPurchasing: boolean;\n webUrl?: string | null;\n onPurchase: (productId: string) => void;\n onClose: () => void;\n onRestore: () => void;\n onReady?: () => void;\n onError?: (error: WebViewError) => void;\n}\n\nexport function PaywallWebView({\n paywallId,\n craftData,\n products,\n primaryProductId,\n secondaryProductId,\n isPurchasing,\n webUrl: webUrlProp,\n onPurchase,\n onClose,\n onRestore,\n onReady,\n onError,\n}: PaywallWebViewProps): React.ReactElement | null {\n const paywallDataSent = useRef(false);\n const loadEndReceived = useRef(false);\n const [scriptToInject, setScriptToInject] = useState<string | undefined>(undefined);\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const onReadyRef = useRef(onReady);\n onReadyRef.current = onReady;\n\n const NativeWebView = useMemo(() => getNativeWebView(), []);\n\n useEffect(() => {\n if (!NativeWebView) {\n onErrorRef.current?.({\n code: -1,\n description:\n \"Paywallo native module not linked. Run `pod install` (iOS) or rebuild the Android app.\",\n });\n }\n }, [NativeWebView]);\n\n const [resolvedWebUrl, setResolvedWebUrl] = useState<string | null>(\n () => webUrlProp ?? PaywalloClient.getWebUrl()\n );\n\n useEffect(() => {\n if (webUrlProp !== undefined) {\n setResolvedWebUrl(webUrlProp ?? null);\n return;\n }\n const url = PaywalloClient.getWebUrl();\n if (url) { setResolvedWebUrl(url); return; }\n const interval = setInterval(() => {\n const u = PaywalloClient.getWebUrl();\n if (u) { setResolvedWebUrl(u); clearInterval(interval); }\n }, 200);\n return () => clearInterval(interval);\n }, [webUrlProp]);\n\n useEffect(() => {\n if (!resolvedWebUrl) {\n onErrorRef.current?.({\n code: -1,\n description: \"Paywall URL not configured. SDK may not be initialized.\",\n });\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const buildAndSetInjectionScript = useCallback(() => {\n if (!craftData || paywallDataSent.current) return;\n paywallDataSent.current = true;\n const script = buildPaywallInjectionScript({\n craftData,\n products: Array.from(products.values()),\n primaryProductId,\n secondaryProductId,\n });\n setScriptToInject(script);\n }, [craftData, products, primaryProductId, secondaryProductId]);\n\n const processedIdsRef = useRef<Set<string>>(new Set());\n const dedupeTimersRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n\n useEffect(() => {\n return () => {\n for (const timerId of dedupeTimersRef.current.values()) clearTimeout(timerId);\n dedupeTimersRef.current.clear();\n processedIdsRef.current.clear();\n };\n }, []);\n\n const handleParsedMessage = useCallback(\n (message: WebViewMessage) => {\n const msgId = deriveMessageId(message);\n if (processedIdsRef.current.has(msgId)) return;\n processedIdsRef.current.add(msgId);\n const timerId = setTimeout(() => {\n processedIdsRef.current.delete(msgId);\n dedupeTimersRef.current.delete(msgId);\n }, 5_000);\n dedupeTimersRef.current.set(msgId, timerId);\n\n switch (message.type) {\n case \"ready\":\n if (!paywallDataSent.current) {\n buildAndSetInjectionScript();\n } else {\n onReadyRef.current?.();\n }\n break;\n case \"purchase\":\n if (message.payload?.productId) onPurchase(message.payload.productId);\n break;\n case \"close\":\n onClose();\n break;\n case \"restore\":\n onRestore();\n break;\n case \"open-url\":\n if (message.payload?.url) {\n const url = message.payload.url;\n // Allow safe external schemes — https/http for web links, mailto for contact\n // links in paywall content, and platform store deep-links (itms-apps on iOS,\n // market: on Android). Everything else is dropped.\n if (\n /^https?:\\/\\//i.test(url) ||\n /^mailto:/i.test(url) ||\n /^itms-apps:/i.test(url) ||\n /^market:/i.test(url)\n ) {\n void Linking.openURL(url);\n }\n }\n break;\n }\n },\n [buildAndSetInjectionScript, onPurchase, onClose, onRestore]\n );\n\n useEffect(() => {\n const emitter = getWebViewEmitter();\n if (!emitter) return;\n\n const loadEndSub = emitter.addListener(\"PaywalloWebViewLoadEnd\", () => {\n if (!loadEndReceived.current) {\n loadEndReceived.current = true;\n buildAndSetInjectionScript();\n }\n });\n\n const messageSub = emitter.addListener(\"PaywalloWebViewMessage\", (event: { data: string }) => {\n const message = parseWebViewMessage(event.data);\n if (message) handleParsedMessage(message);\n });\n\n const errorSub = emitter.addListener(\n \"PaywalloWebViewError\",\n (event: Record<string, unknown>) => {\n onErrorRef.current?.(parseErrorEvent(event));\n }\n );\n\n return () => {\n loadEndSub.remove();\n messageSub.remove();\n errorSub.remove();\n };\n }, [buildAndSetInjectionScript, handleParsedMessage]);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n if (!paywallDataSent.current) {\n onErrorRef.current?.({\n code: -1001,\n description: \"Paywall load timed out after 10 seconds\",\n });\n }\n }, 10_000);\n\n return () => clearTimeout(timer);\n }, []);\n\n const handleLoadEnd = useCallback(() => {\n if (!loadEndReceived.current) {\n loadEndReceived.current = true;\n buildAndSetInjectionScript();\n }\n }, [buildAndSetInjectionScript]);\n\n const handleNativeError = useCallback((event: { nativeEvent: Record<string, unknown> }) => {\n const ne = event.nativeEvent;\n let errorData: Record<string, unknown>;\n if (ne[\"payload\"] && typeof ne[\"payload\"] === \"object\") {\n errorData = ne[\"payload\"] as Record<string, unknown>;\n } else if (typeof ne[\"data\"] === \"string\") {\n try {\n errorData = JSON.parse(ne[\"data\"]) as Record<string, unknown>;\n } catch {\n errorData = {};\n }\n } else {\n errorData = {};\n }\n onErrorRef.current?.(parseErrorEvent(errorData));\n }, []);\n\n const handleMessage = useCallback(\n (event: { nativeEvent: { data: string } }) => {\n const message = parseWebViewMessage(event.nativeEvent.data);\n if (message) handleParsedMessage(message);\n },\n [handleParsedMessage]\n );\n\n useEffect(() => {\n if (!paywallDataSent.current) return;\n setScriptToInject(buildPurchaseStateScript(isPurchasing));\n }, [isPurchasing]);\n\n if (!resolvedWebUrl || !NativeWebView) return null;\n\n const paywallUrl = `${resolvedWebUrl}/paywall/${paywallId}`;\n\n return (\n <View style={styles.container}>\n <NativeWebView\n sourceUrl={paywallUrl}\n injectedJavaScript={scriptToInject}\n onMessage={handleMessage}\n onLoadEnd={handleLoadEnd}\n onError={handleNativeError}\n style={styles.webview}\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: { flex: 1 },\n webview: { flex: 1, backgroundColor: \"transparent\" },\n});\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n Animated,\n Dimensions,\n Easing,\n Modal,\n Pressable,\n StyleSheet,\n Text,\n View,\n} from \"react-native\";\n\nimport { usePaywallActions } from \"./usePaywallActions\";\nimport { usePaywallLoader } from \"./usePaywallLoader\";\nimport type { PaywallResult } from \"../../types\";\nimport type { Product } from \"../../types/purchase\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport { getSdkString } from \"../../utils/localization\";\n\nimport { PaywallWebView } from \"./PaywallWebView\";\n\ninterface ErrorFallbackProps {\n description: string;\n onRetry: () => void;\n onClose: () => void;\n}\n\nfunction ErrorFallback({ description, onRetry, onClose }: ErrorFallbackProps): React.ReactElement {\n const overrides = PaywalloClient.getConfig()?.errorStrings;\n const title = overrides?.title ?? getSdkString(\"paywallErrorTitle\");\n const retryLabel = overrides?.retry ?? getSdkString(\"paywallRetryButton\");\n const closeLabel = overrides?.close ?? getSdkString(\"paywallCloseButton\");\n\n return (\n <View style={styles.fallbackContainer}>\n <View style={styles.fallbackCard}>\n <Text style={styles.fallbackTitle}>{title}</Text>\n <Text style={styles.fallbackDescription}>{description}</Text>\n <Pressable style={styles.retryButton} onPress={onRetry}>\n <Text style={styles.retryButtonText}>{retryLabel}</Text>\n </Pressable>\n <Pressable style={styles.closeButton} onPress={onClose}>\n <Text style={styles.closeButtonText}>{closeLabel}</Text>\n </Pressable>\n </View>\n </View>\n );\n}\n\ninterface PaywallModalProps {\n placement: string;\n visible: boolean;\n onResult: (result: PaywallResult) => void;\n paywallConfig?: {\n id: string;\n placement: string;\n config: Record<string, unknown>;\n primaryProductId?: string;\n secondaryProductId?: string;\n };\n preloadedProducts?: Map<string, Product>;\n variantKey?: string;\n campaignId?: string;\n /** UUID de `paywall_variants` (sub-fase 2.14). */\n variantId?: string;\n}\n\nexport function PaywallModal({\n placement,\n visible,\n onResult,\n paywallConfig: preloadedConfig,\n preloadedProducts,\n variantKey,\n campaignId,\n variantId,\n}: PaywallModalProps): React.ReactElement | null {\n const { paywallConfig, products, error } = usePaywallLoader(\n placement,\n visible,\n preloadedConfig,\n preloadedProducts,\n variantKey,\n campaignId,\n variantId,\n );\n\n const screenHeight = Dimensions.get(\"window\").height;\n const openAnim = useRef(new Animated.Value(screenHeight)).current;\n const [modalVisible, setModalVisible] = useState(false);\n\n const handleResult = useCallback((result: PaywallResult) => {\n setModalVisible(false);\n onResult(result);\n }, [onResult]);\n\n const { isPurchasing, slideAnim, handleClose, handlePurchase, handleRestore } =\n usePaywallActions(placement, paywallConfig, handleResult, variantKey, campaignId, openAnim, variantId);\n\n const [webViewError, setWebViewError] = useState<{\n code: number;\n description: string;\n } | null>(null);\n const [retryCount, setRetryCount] = useState(0);\n\n const retryCountRef = useRef(0);\n\n const handleWebViewError = useCallback(\n (err: { code: number; description: string; url?: string }) => {\n if (retryCountRef.current >= 1) {\n setWebViewError({ code: err.code, description: err.description });\n } else {\n retryCountRef.current += 1;\n setRetryCount(retryCountRef.current);\n }\n },\n []\n );\n\n const handleRetry = useCallback(() => {\n retryCountRef.current = 0;\n setWebViewError(null);\n setRetryCount(0);\n }, []);\n\n useEffect(() => {\n if (visible) {\n setModalVisible(true);\n openAnim.setValue(Dimensions.get(\"window\").height);\n Animated.timing(openAnim, {\n toValue: 0,\n duration: 550,\n easing: Easing.out(Easing.cubic),\n useNativeDriver: true,\n }).start();\n }\n }, [visible, openAnim]);\n\n if (!modalVisible && !visible) return null;\n\n return (\n <Modal\n visible={modalVisible}\n animationType=\"none\"\n presentationStyle=\"overFullScreen\"\n onRequestClose={handleClose}\n transparent\n statusBarTranslucent\n >\n <View style={styles.overlay}>\n <Animated.View style={[styles.animatedContainer, { transform: [{ translateY: openAnim }] }]}>\n <View style={styles.container}>\n {error && (\n <View style={styles.errorContainer}>\n <Text style={styles.errorText}>{error.message}</Text>\n </View>\n )}\n\n {!error && paywallConfig && \"craftData\" in paywallConfig.config && (\n <>\n {webViewError ? (\n <ErrorFallback\n description={webViewError.description}\n onRetry={handleRetry}\n onClose={handleClose}\n />\n ) : (\n <PaywallWebView\n key={retryCount}\n paywallId={paywallConfig.id}\n craftData={paywallConfig.config.craftData}\n products={products}\n primaryProductId={paywallConfig.primaryProductId}\n secondaryProductId={paywallConfig.secondaryProductId}\n isPurchasing={isPurchasing}\n onClose={handleClose}\n onPurchase={handlePurchase}\n onRestore={handleRestore}\n onError={handleWebViewError}\n />\n )}\n </>\n )}\n </View>\n </Animated.View>\n </View>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: { flex: 1, backgroundColor: \"rgba(0,0,0,0.3)\" },\n animatedContainer: { flex: 1, backgroundColor: \"#fff\" },\n container: { flex: 1, backgroundColor: \"#fff\" },\n errorContainer: { flex: 1, justifyContent: \"center\", alignItems: \"center\", padding: 20 },\n errorText: { fontSize: 16, color: \"#ef4444\", textAlign: \"center\" },\n fallbackContainer: {\n flex: 1, justifyContent: \"center\", alignItems: \"center\",\n backgroundColor: \"#111010\", padding: 24,\n },\n fallbackCard: {\n width: \"100%\", maxWidth: 360, alignItems: \"center\",\n backgroundColor: \"rgba(255,255,255,0.07)\", borderRadius: 16, padding: 28,\n },\n fallbackTitle: {\n fontSize: 18, fontWeight: \"600\", color: \"#f5f5f5\",\n marginBottom: 10, textAlign: \"center\",\n },\n fallbackDescription: {\n fontSize: 14, color: \"rgba(255,255,255,0.55)\",\n textAlign: \"center\", marginBottom: 28, lineHeight: 20,\n },\n retryButton: {\n width: \"100%\", backgroundColor: \"#ffffff\", borderRadius: 10,\n paddingVertical: 14, alignItems: \"center\", marginBottom: 12,\n },\n retryButtonText: { fontSize: 15, fontWeight: \"600\", color: \"#111010\" },\n closeButton: {\n width: \"100%\", borderRadius: 10, paddingVertical: 14,\n alignItems: \"center\", backgroundColor: \"rgba(255,255,255,0.1)\",\n },\n closeButtonText: { fontSize: 15, fontWeight: \"500\", color: \"rgba(255,255,255,0.7)\" },\n});\n","import React, { Component } from \"react\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\n\nexport class PaywallErrorBoundary extends Component<{ children: React.ReactNode }, { hasError: boolean }> {\n state = { hasError: false };\n static getDerivedStateFromError(): { hasError: boolean } { return { hasError: true }; }\n componentDidCatch(error: Error): void {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] Paywall render error:\", error);\n try { PaywalloClient.getApiClient()?.reportError(\"PAYWALL_RENDER_ERROR\", error.message); } catch {}\n }\n render(): React.ReactNode { return this.state.hasError ? null : this.props.children; }\n}\n","import { createContext, useContext } from \"react\";\n\nimport { PAYWALL_ERROR_CODES, PaywallError } from \"./PaywallError\";\nimport type { PaywallNode, TapBehavior } from \"../../types/blocks\";\nimport type { Product } from \"../../types/purchase\";\n\nexport interface PaywallContextValue {\n nodes: Record<string, PaywallNode>;\n rootId: string;\n language: string;\n defaultLanguage: string;\n products: Map<string, Product>;\n selectedProductId: string | null;\n primaryProductId: string | null;\n secondaryProductId: string | null;\n currentNavigationIndex: number;\n currentTabIndex: number;\n trialEnabled: boolean;\n selectedPeriod: string | null;\n isPurchasing: boolean;\n exitOfferVisible: boolean;\n exitOfferTriggeredByBackButton: boolean;\n\n onClose: () => void;\n onTryClose: () => void;\n onSelectProduct: (productId: string) => void;\n onPurchase: (productId: string) => void;\n onRestore: () => void;\n onNavigate: (target: \"next\" | \"previous\" | \"first\" | \"last\" | number) => void;\n onSetTab: (index: number) => void;\n onSetVariable: (name: string, value: string) => void;\n onToggleTrial: (enabled: boolean) => void;\n onSelectPeriod: (value: string) => void;\n onOpenUrl: (url: string, inBrowser?: boolean) => void;\n onTapBehavior: (behavior: TapBehavior) => void;\n onShowExitOffer: () => void;\n onDismissExitOffer: () => void;\n onTriggerBackButton: () => void;\n}\n\nexport const PaywallContext = createContext<PaywallContextValue | null>(null);\n\nexport function usePaywallContext(): PaywallContextValue {\n const context = useContext(PaywallContext);\n if (!context) {\n throw new PaywallError(\n PAYWALL_ERROR_CODES.NOT_INITIALIZED,\n \"usePaywallContext must be used within a Paywall component\"\n );\n }\n return context;\n}\n","import { useCallback, useEffect, useRef } from \"react\";\n\nimport { emitPaywallClosed } from \"./emitPaywallClosed\";\nimport { startHeartbeat, stopHeartbeat } from \"./paywallHeartbeat\";\n\nexport interface PaywallSessionOptions {\n placement: string;\n paywallId: string;\n presentedAt: number;\n variantId?: string;\n variantKey?: string;\n campaignId?: string;\n}\n\n/**\n * Hook do ciclo de vida de um paywall apresentado (sub-fase 2.10).\n *\n * - Em mount: inicia heartbeat 5s (crash-safe) persistindo o snapshot no\n * SecureStorage. Se o processo morre antes do close, o próximo boot\n * detecta o snapshot órfão e emite `paywall {closed, close_reason:\"error\"}`.\n * - Em unmount: emite `paywall {closed, close_reason:\"dismiss\"}` se o caller\n * não chamou `markClosed()` antes — garante que `closedAt`, `durationS`\n * e `variantId` nunca sejam NULL em `paywall_interactions`.\n *\n * Callers que já emitem via `trackClosed`/`emitPaywallClosed` explícito\n * devem chamar `markClosed()` pra não emitir duplicado.\n */\nexport function usePaywallSession(options: PaywallSessionOptions | null): { markClosed: () => void } {\n const closedRef = useRef<boolean>(false);\n const optsRef = useRef<PaywallSessionOptions | null>(options);\n optsRef.current = options;\n\n useEffect(() => {\n if (!options) return;\n closedRef.current = false;\n startHeartbeat({\n paywallId: options.paywallId,\n placement: options.placement,\n presentedAt: options.presentedAt,\n ...(options.variantId && { variantId: options.variantId }),\n ...(options.variantKey && { variantKey: options.variantKey }),\n ...(options.campaignId && { campaignId: options.campaignId }),\n });\n return () => {\n const snap = optsRef.current;\n if (closedRef.current || !snap) {\n void stopHeartbeat();\n return;\n }\n void emitPaywallClosed({\n placement: snap.placement,\n paywallId: snap.paywallId,\n presentedAt: snap.presentedAt,\n reason: \"dismiss\",\n ...(snap.variantId && { variantId: snap.variantId }),\n ...(snap.variantKey && { variantKey: snap.variantKey }),\n ...(snap.campaignId && { campaignId: snap.campaignId }),\n }).finally(() => { void stopHeartbeat(); });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [options?.paywallId, options?.placement]);\n\n const markClosed = useCallback((): void => {\n closedRef.current = true;\n }, []);\n\n return { markClosed };\n}\n","import type { Dispatch, MutableRefObject, SetStateAction } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport type { PaywallResult } from \"../../types\";\n\nimport type { PreloadedWebView } from \"../../hooks/useCampaignPreload\";\nimport { emitPaywallClosed } from \"./emitPaywallClosed\";\nimport { usePaywallSession } from \"./usePaywallSession\";\n\ntype SetPreloadedWebView = Dispatch<SetStateAction<PreloadedWebView | null>>;\n\ninterface UsePaywallPresenterReturn {\n showingPreloadedWebView: boolean;\n presentPreloadedWebView: () => Promise<PaywallResult>;\n resolvePreloadedPaywall: (result: PaywallResult) => void;\n handlePreloadedWebViewReady: () => void;\n handlePreloadedClose: () => void;\n setShowingPreloadedWebView: Dispatch<SetStateAction<boolean>>;\n presentedAtRef: MutableRefObject<number>;\n}\n\nexport function usePaywallPresenter(\n preloadedWebView: PreloadedWebView | null,\n setPreloadedWebView: SetPreloadedWebView\n): UsePaywallPresenterReturn {\n const [showingPreloadedWebView, setShowingPreloadedWebView] = useState(false);\n const resolverRef = useRef<((result: PaywallResult) => void) | null>(null);\n const presentedAtRef = useRef<number>(Date.now());\n\n // Sessão canônica de paywall — heartbeat 5s + emit `closed` em unmount se\n // o caller não marcar explicitamente. Só ativa quando o preloaded está\n // realmente sendo apresentado (showing + preloadedWebView válido).\n const sessionOpts = showingPreloadedWebView && preloadedWebView\n ? {\n placement: preloadedWebView.placement,\n paywallId: preloadedWebView.paywallId,\n presentedAt: presentedAtRef.current,\n ...(preloadedWebView.variantId && { variantId: preloadedWebView.variantId }),\n ...(preloadedWebView.variantKey && { variantKey: preloadedWebView.variantKey }),\n ...(preloadedWebView.campaignId && { campaignId: preloadedWebView.campaignId }),\n }\n : null;\n const { markClosed } = usePaywallSession(sessionOpts);\n\n useEffect(() => {\n return () => {\n if (resolverRef.current) {\n resolverRef.current({ presented: false, purchased: false, cancelled: true, restored: false });\n resolverRef.current = null;\n }\n setShowingPreloadedWebView(false);\n };\n }, []);\n\n const presentPreloadedWebView = useCallback((): Promise<PaywallResult> => {\n return new Promise<PaywallResult>((resolve) => {\n resolverRef.current = resolve;\n presentedAtRef.current = Date.now();\n setShowingPreloadedWebView(true);\n\n // Emit $paywall_viewed for the preloaded-webview path. This is the single\n // canonical emission point for this code path — the modal path emits it\n // from `usePaywallLoader` at real render time.\n const apiClient = PaywalloClient.getApiClient();\n if (apiClient && preloadedWebView) {\n const sessionId = PaywalloClient.getSessionId();\n const distinctId = PaywalloClient.getDistinctId();\n void apiClient.trackEvent(\"$paywall_viewed\", distinctId, {\n placement: preloadedWebView.placement,\n paywallId: preloadedWebView.paywallId,\n preloaded: true,\n variantKey: preloadedWebView.variantKey ?? \"\",\n campaignId: preloadedWebView.campaignId ?? \"\",\n ...(preloadedWebView.variantId && { variant_id: preloadedWebView.variantId }),\n ...(sessionId && { sessionId }),\n }).catch(() => { /* non-critical */ });\n void apiClient.trackEvent(\"paywall\", distinctId, {\n type: \"open\",\n paywall_id: preloadedWebView.paywallId,\n placement: preloadedWebView.placement,\n opened_at: new Date().toISOString(),\n preloaded: true,\n ...(preloadedWebView.variantKey && { variant_key: preloadedWebView.variantKey }),\n ...(preloadedWebView.campaignId && { campaign_id: preloadedWebView.campaignId }),\n ...(preloadedWebView.variantId && { variant_id: preloadedWebView.variantId }),\n ...(sessionId && { sessionId }),\n }).catch(() => { /* non-critical */ });\n }\n });\n }, [preloadedWebView]);\n\n const resolvePreloadedPaywall = useCallback((result: PaywallResult): void => {\n if (resolverRef.current) { resolverRef.current(result); resolverRef.current = null; }\n }, []);\n\n const handlePreloadedWebViewReady = useCallback((): void => {\n setPreloadedWebView((prev) => (prev ? { ...prev, loaded: true } : null));\n }, [setPreloadedWebView]);\n\n const handlePreloadedClose = useCallback((): void => {\n // Sub-fase 2.10: path canonical único — `paywall {type: \"closed\"}` via\n // `emitPaywallClosed`. O path legado `$paywall_dismissed` inline foi\n // removido (duplicava o emit do `usePaywallTracking`).\n if (preloadedWebView) {\n markClosed();\n void emitPaywallClosed({\n placement: preloadedWebView.placement,\n paywallId: preloadedWebView.paywallId,\n presentedAt: presentedAtRef.current,\n reason: \"dismiss\",\n ...(preloadedWebView.variantKey && { variantKey: preloadedWebView.variantKey }),\n ...(preloadedWebView.campaignId && { campaignId: preloadedWebView.campaignId }),\n ...(preloadedWebView.variantId && { variantId: preloadedWebView.variantId }),\n });\n }\n setShowingPreloadedWebView(false);\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: true, restored: false });\n }, [preloadedWebView, markClosed, resolvePreloadedPaywall]);\n\n return { showingPreloadedWebView, presentPreloadedWebView, resolvePreloadedPaywall, handlePreloadedWebViewReady, handlePreloadedClose, setShowingPreloadedWebView, presentedAtRef };\n}\n","export { PaywallModal } from \"./PaywallModal\";\nexport { PaywallWebView } from \"./PaywallWebView\";\nexport { PaywallErrorBoundary } from \"./PaywallErrorBoundary\";\nexport { PaywallContext, usePaywallContext } from \"./PaywallContext\";\nexport type { PaywallContextValue } from \"./PaywallContext\";\nexport { usePaywallActions } from \"./usePaywallActions\";\nexport type { UsePaywallActionsResult } from \"./usePaywallActions\";\nexport { usePaywallLoader } from \"./usePaywallLoader\";\nexport { usePaywallPresenter } from \"./usePaywallPresenter\";\nexport { usePaywallTracking } from \"./usePaywallTracking\";\nexport type { UsePaywallTrackingResult, PaywallCloseReason, PaywallCanonicalCloseReason } from \"./usePaywallTracking\";\nexport { usePaywallSession } from \"./usePaywallSession\";\nexport type { PaywallSessionOptions } from \"./usePaywallSession\";\nexport { emitPaywallClosed } from \"./emitPaywallClosed\";\nexport type { EmitPaywallClosedOptions } from \"./emitPaywallClosed\";\nexport {\n startHeartbeat,\n stopHeartbeat,\n readPersistedHeartbeat,\n clearPersistedHeartbeat,\n HEARTBEAT_INTERVAL_MS,\n} from \"./paywallHeartbeat\";\nexport type { HeartbeatSnapshot } from \"./paywallHeartbeat\";\nexport { PaywallError, PAYWALL_ERROR_CODES } from \"./PaywallError\";\nexport { buildPaywallInjectionScript, buildPurchaseStateScript } from \"./paywallScripts\";\nexport { parseWebViewMessage } from \"./parseWebViewMessage\";\nexport type { WebViewMessage } from \"./parseWebViewMessage\";\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class CampaignError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"campaign\", code, message);\n this.name = \"CampaignError\";\n }\n}\n\nexport const CAMPAIGN_ERROR_CODES = {\n NOT_INITIALIZED: \"CAMPAIGN_NOT_INITIALIZED\",\n FETCH_FAILED: \"CAMPAIGN_FETCH_FAILED\",\n PRELOAD_FAILED: \"CAMPAIGN_PRELOAD_FAILED\",\n NOT_FOUND: \"CAMPAIGN_NOT_FOUND\",\n PRESENT_FAILED: \"CAMPAIGN_PRESENT_FAILED\",\n} as const;\n","import { CAMPAIGN_ERROR_CODES, CampaignError } from \"./CampaignError\";\nimport { PaywalloError } from \"../../errors/PaywalloError\";\nimport { PAYWALL_ERROR_CODES, PaywallError } from \"../paywall/PaywallError\";\nimport type { CampaignResponse, CampaignResult, PaywallResult } from \"../../types\";\n\nimport type { ApiClient } from \"../../core/ApiClient\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport { identityManager } from \"../identity/IdentityManager\";\nimport type { PreloadCampaignResult } from \"../../core/types\";\n\ntype PaywallPresenter = (placement: string) => Promise<PaywallResult>;\ntype CampaignPresenter = (campaign: CampaignResponse) => Promise<CampaignResult>;\n\nconst PRELOAD_CACHE_TTL_MS = 5 * 60 * 1000;\nconst PRELOAD_WAIT_MAX_MS = 2000;\nconst PRELOAD_WAIT_INTERVAL_MS = 100;\ninterface PreloadedCampaignCache { campaign: CampaignResponse; preloadedAt: number }\n\nexport class CampaignGateService {\n private readonly preloadedCampaigns: Map<string, PreloadedCampaignCache> = new Map();\n private readonly pendingPreloads: Set<string> = new Set();\n private apiClientRef: ApiClient | null = null;\n private readonly STALE_THRESHOLD = 0.8;\n\n async getCampaign(apiClient: ApiClient, placement: string, context?: Record<string, unknown>): Promise<CampaignResponse | null> {\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) return null;\n return apiClient.getCampaign(placement, distinctId, context);\n }\n\n private async waitForPreload(placement: string): Promise<void> {\n if (!this.pendingPreloads.has(placement)) return;\n const deadline = Date.now() + PRELOAD_WAIT_MAX_MS;\n await new Promise<void>((resolve) => {\n const check = () => {\n if (!this.pendingPreloads.has(placement) || Date.now() >= deadline) { resolve(); return; }\n setTimeout(check, PRELOAD_WAIT_INTERVAL_MS);\n };\n check();\n });\n }\n\n async presentCampaign(\n apiClient: ApiClient,\n placement: string,\n hasActive: () => Promise<boolean>,\n paywallPresenter: PaywallPresenter | null,\n campaignPresenter: CampaignPresenter | null,\n context?: Record<string, unknown>,\n ): Promise<CampaignResult> {\n await this.waitForPreload(placement);\n const preloaded = this.getPreloadedCampaign(placement);\n const campaign = preloaded ?? await this.getCampaign(apiClient, placement, context);\n if (!campaign) {\n return { presented: false, purchased: false, cancelled: false, restored: false, error: new CampaignError(CAMPAIGN_ERROR_CODES.NOT_FOUND, \"No campaign found\") };\n }\n if (!context?.forceShow) {\n const isActive = await hasActive();\n if (isActive) {\n return { presented: false, purchased: false, cancelled: false, restored: false, skippedReason: \"subscriber\" };\n }\n }\n if (campaignPresenter) return campaignPresenter(campaign);\n if (!paywallPresenter) throw new PaywallError(PAYWALL_ERROR_CODES.NOT_INITIALIZED, \"PaywalloProvider not mounted. Wrap your app with <PaywalloProvider>\");\n return {\n ...(await paywallPresenter(placement)),\n campaignId: campaign.campaignId,\n variantKey: campaign.variantKey,\n ...(campaign.variantId && { variantId: campaign.variantId }),\n };\n }\n\n async requireSubscriptionWithCampaign(\n apiClient: ApiClient,\n placement: string,\n hasActive: () => Promise<boolean>,\n paywallPresenter: PaywallPresenter | null,\n campaignPresenter: CampaignPresenter | null,\n context?: Record<string, unknown>,\n ): Promise<boolean> {\n const isActive = await hasActive();\n if (PaywalloClient.getConfig()?.debug) console.log(`[Paywallo] requireSubscription — hasActive: ${isActive}`);\n if (isActive) return true;\n const r = await this.presentCampaign(apiClient, placement, hasActive, paywallPresenter, campaignPresenter, { ...context, forceShow: true });\n return r.purchased || r.restored;\n }\n\n private readonly activePreloadPromises: Map<string, Promise<PreloadCampaignResult>> = new Map();\n\n async preloadCampaign(apiClient: ApiClient, placement: string, context?: Record<string, unknown>): Promise<PreloadCampaignResult> {\n // Return the in-flight promise if a preload for this placement is already running\n const existing = this.activePreloadPromises.get(placement);\n if (existing) return existing;\n\n const promise = this._doPreload(apiClient, placement, context);\n this.activePreloadPromises.set(placement, promise);\n try {\n return await promise;\n } finally {\n this.activePreloadPromises.delete(placement);\n }\n }\n\n private async _doPreload(apiClient: ApiClient, placement: string, context?: Record<string, unknown>): Promise<PreloadCampaignResult> {\n this.pendingPreloads.add(placement);\n try {\n const campaign = await this.getCampaign(apiClient, placement, context);\n if (!campaign?.paywall) {\n return { success: false, error: new CampaignError(CAMPAIGN_ERROR_CODES.NOT_FOUND, `Campaign or paywall not found: ${placement}`) };\n }\n this.preloadedCampaigns.set(placement, { campaign, preloadedAt: Date.now() });\n if (PaywalloClient.getConfig()?.debug) { console.log(`[Paywallo PRELOAD] data cached — placement: ${placement}`); }\n return { success: true };\n } catch (error) {\n return { success: false, error: error instanceof Error ? error : new PaywalloError(\"panel\", \"PANEL_UNKNOWN\", String(error)) };\n } finally {\n this.pendingPreloads.delete(placement);\n }\n }\n\n getPreloadedCampaign(placement: string): CampaignResponse | null {\n const cached = this.preloadedCampaigns.get(placement);\n if (!cached) return null;\n const age = Date.now() - cached.preloadedAt;\n if (age >= PRELOAD_CACHE_TTL_MS) { this.preloadedCampaigns.delete(placement); return null; }\n if (age >= PRELOAD_CACHE_TTL_MS * this.STALE_THRESHOLD && this.apiClientRef) {\n void this.preloadCampaign(this.apiClientRef, placement).catch(() => {});\n }\n return cached.campaign;\n }\n\n async preloadAllActive(apiClient: ApiClient, debug?: boolean): Promise<void> {\n this.apiClientRef = apiClient;\n const placements = await apiClient.getActivePlacements();\n if (placements.length === 0) return;\n if (debug) console.log(`[Paywallo PRELOAD] auto-preloading ${placements.length} placements`);\n for (let i = 0; i < placements.length; i++) {\n if (i > 0) await new Promise<void>((r) => setTimeout(r, 500));\n void this.preloadCampaign(apiClient, placements[i]).catch((err) => {\n if (debug) console.log(`[Paywallo PRELOAD] failed ${placements[i]}:`, err);\n });\n }\n }\n\n clearPreloaded(): void { this.preloadedCampaigns.clear(); this.pendingPreloads.clear(); }\n}\n\nexport const campaignGateService = new CampaignGateService();\n","export { CampaignGateService, campaignGateService } from \"./CampaignGateService\";\nexport { CampaignError, CAMPAIGN_ERROR_CODES } from \"./CampaignError\";\nexport type { CampaignResponse, CampaignResult, CampaignPresentOptions, ServerProductInfo } from \"../../types\";\n","import { Platform } from \"react-native\";\n\nimport { nativeDeviceInfo } from \"../../utils/NativeDeviceInfo\";\n\nconst ZERO_IDFA = \"00000000-0000-0000-0000-000000000000\";\n\nexport type AttStatus = \"granted\" | \"denied\" | \"restricted\" | \"undetermined\" | \"unavailable\";\n\nexport interface AdvertisingIdResult {\n idfv: string | null;\n idfa: string | null;\n gaid: string | null;\n attStatus: AttStatus;\n}\n\nexport class AdvertisingIdManager {\n private cached: AdvertisingIdResult | null = null;\n\n /**\n * Synchronous accessor for the cached collect() result. Returns null until\n * `collect()` resolves at least once. Used by the V2 envelope context\n * provider — which is sync — to populate `context.ids` without awaiting.\n */\n getCached(): AdvertisingIdResult | null {\n return this.cached;\n }\n\n async collect(requestATT = false): Promise<AdvertisingIdResult> {\n if (this.cached) return this.cached;\n\n const fallback: AdvertisingIdResult = { idfv: null, idfa: null, gaid: null, attStatus: \"unavailable\" };\n\n try {\n const tracking = await import(\"expo-tracking-transparency\");\n\n if (Platform.OS === \"ios\") {\n if (!tracking.isAvailable()) {\n const idfv = await this.collectIdfv();\n this.cached = { ...fallback, idfv };\n return this.cached;\n }\n\n const current = await tracking.getTrackingPermissionsAsync();\n let status = current.status as AttStatus;\n let granted = current.granted;\n\n if (status === \"undetermined\" && requestATT) {\n const result = await tracking.requestTrackingPermissionsAsync();\n status = result.status as AttStatus;\n granted = result.granted;\n }\n\n const idfv = await this.collectIdfv();\n const idfa = granted ? this.sanitizeId(tracking.getAdvertisingId()) : null;\n this.cached = { idfv, idfa, gaid: null, attStatus: status };\n return this.cached;\n }\n\n if (Platform.OS === \"android\") {\n // On Android, getTrackingPermissionsAsync() is a no-op shim — always granted.\n // Actual opt-out is signaled by getAdvertisingId() returning the all-zeros UUID,\n // which sanitizeId() correctly normalizes to null.\n const rawGaid = tracking.getAdvertisingId();\n const gaid = this.sanitizeId(rawGaid);\n this.cached = { idfv: null, idfa: null, gaid, attStatus: \"unavailable\" };\n return this.cached;\n }\n\n this.cached = fallback;\n return this.cached;\n } catch {\n this.cached = fallback;\n return this.cached;\n }\n }\n\n private async collectIdfv(): Promise<string | null> {\n try {\n const info = await nativeDeviceInfo.getDeviceInfo();\n return this.sanitizeId(info.idfv);\n } catch {\n return null;\n }\n }\n\n private sanitizeId(id: string | null | undefined): string | null {\n if (!id || id === ZERO_IDFA) return null;\n return id;\n }\n}\n\nexport const advertisingIdManager = new AdvertisingIdManager();\n","/**\n * Guard usado pelo SessionManager.startSession() — aguarda distinctId ficar\n * disponível antes de criar a sessão. Raiz dos 55% users com total_sessions=0\n * era session.startSession rodando em paralelo com identity.initialize() e\n * batendo em distinctId vazio. Agora sessão só inicia depois da identity\n * estar pronta; este guard é uma defesa extra caso alguém chame startSession\n * manualmente antes do init terminar.\n */\nexport type DistinctIdProvider = () => string;\n\nexport const DISTINCT_ID_WAIT_RETRIES = 10;\nexport const DISTINCT_ID_WAIT_INTERVAL_MS = 100;\n\nexport async function waitForDistinctId(\n provider: DistinctIdProvider | null,\n retries: number = DISTINCT_ID_WAIT_RETRIES,\n intervalMs: number = DISTINCT_ID_WAIT_INTERVAL_MS,\n): Promise<boolean> {\n if (!provider) return true;\n if (provider()) return true;\n for (let attempt = 0; attempt < retries; attempt++) {\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n if (provider()) return true;\n }\n return false;\n}\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class SessionError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"session\", code, message);\n this.name = \"SessionError\";\n }\n}\n\nexport const SESSION_ERROR_CODES = {\n NOT_INITIALIZED: \"SESSION_NOT_INITIALIZED\",\n START_FAILED: \"SESSION_START_FAILED\",\n END_FAILED: \"SESSION_END_FAILED\",\n RESTORE_FAILED: \"SESSION_RESTORE_FAILED\",\n} as const;\n","import { nativeDeviceInfo } from \"./NativeDeviceInfo\";\n\nexport interface DeviceInfo {\n appVersion: string;\n deviceModel: string;\n osVersion: string;\n darwinVersion?: string;\n webkitVersion?: string;\n}\n\nexport async function collectDeviceInfo(): Promise<DeviceInfo> {\n const result = await nativeDeviceInfo.getDeviceInfo();\n\n return {\n appVersion: result.appVersion,\n deviceModel: result.model,\n osVersion: result.systemVersion,\n darwinVersion: result.darwinVersion,\n webkitVersion: result.webkitVersion,\n };\n}\n","import type { ApiClient } from \"../../core/ApiClient\";\nimport { identityManager } from \"../identity/IdentityManager\";\nimport { collectDeviceInfo } from \"../../utils/deviceInfo\";\n\nexport async function trackSessionStart(\n apiClient: ApiClient,\n sessionId: string,\n sessionStartedAt: Date | null\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n const deviceInfo = await collectDeviceInfo().catch(() => ({\n appVersion: \"unknown\",\n deviceModel: \"unknown\",\n osVersion: \"unknown\",\n }));\n\n // Single canonical emission: `$session_start` event through the unified\n // EventBatcher. The legacy `/api/v1/sessions/start` endpoint has been dropped —\n // the server derives session bookkeeping from this event.\n await apiClient\n .trackEvent(\"$session_start\", distinctId, {\n sessionId,\n timestamp: sessionStartedAt?.toISOString() ?? null,\n appVersion: deviceInfo.appVersion,\n deviceModel: deviceInfo.deviceModel,\n osVersion: deviceInfo.osVersion,\n })\n .catch(() => {});\n}\n\nexport async function trackSessionEnd(\n apiClient: ApiClient,\n sessionId: string,\n durationSeconds: number,\n sessionStartedAt: Date | null\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n const endedAt = new Date();\n const duration_s = Math.max(0, durationSeconds);\n // V2 taxonomy: `session.end` (sem `$`) renomeado para canonical\n // `lifecycle {type:\"session_end\"}`.\n const payload: Record<string, string | number | boolean | null> = {\n type: \"session_end\",\n session_id: sessionId,\n duration_s,\n ended_at: endedAt.toISOString(),\n };\n if (sessionStartedAt) payload.started_at = sessionStartedAt.toISOString();\n await apiClient\n .trackEvent(\"lifecycle\", distinctId, payload)\n .catch(() => {});\n}\n\nexport async function trackAppOpen(\n apiClient: ApiClient,\n sessionId: string | null\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n // V2 taxonomy: `$app_open` solto foi removido. O cold_start canonical é\n // emitido por `useAppAutoEvents` no mount do Provider; aqui emitimos\n // `lifecycle {type:\"foreground\"}` porque este helper roda em todo\n // AppState=active (incluindo retorno de background).\n await apiClient\n .trackEvent(\"lifecycle\", distinctId, {\n type: \"foreground\" as const,\n ...(sessionId ? { session_id: sessionId } : {}),\n })\n .catch(() => {});\n}\n\nexport async function trackAppBackground(\n apiClient: ApiClient,\n sessionId: string | null,\n durationSeconds: number\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n // V2 taxonomy: `$app_background` foi removido. Emite canonical\n // `lifecycle {type:\"background\", duration_s}`.\n const duration_s = Math.max(0, durationSeconds);\n await apiClient\n .trackEvent(\"lifecycle\", distinctId, {\n type: \"background\" as const,\n duration_s,\n ...(sessionId ? { session_id: sessionId } : {}),\n })\n .catch(() => {});\n}\n","import { AppState, AppStateStatus } from \"react-native\";\n\nimport { SESSION_ERROR_CODES, SessionError } from \"./SessionError\";\nimport { EmergencyPaywallHandler, SessionConfig, SessionState } from \"./types\";\nimport { generateUUID } from \"../../utils/uuid\";\nimport { DistinctIdProvider, waitForDistinctId } from \"./distinctIdGuard\";\n\nimport { ApiClient } from \"../../core/ApiClient\";\nimport {\n trackAppBackground,\n trackAppOpen,\n trackSessionEnd,\n trackSessionStart,\n} from \"./sessionTracking\";\nimport { SecureStorage } from \"../../core/storage/SecureStorage\";\n\nconst SESSION_ID_KEY = \"@panel:current_session_id\";\nconst SESSION_START_KEY = \"@panel:session_start\";\nconst EMERGENCY_PAYWALL_SHOWN_KEY = \"@panel:emergency_paywall_shown\";\n\n// Legacy keys (SDK ≤1.5.x) for silent migration\nconst LEGACY_SESSION_ID_KEY = \"current_session_id\";\nconst LEGACY_SESSION_START_KEY = \"session_start\";\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000;\nconst BACKGROUND_FLUSH_TIMEOUT_MS = 2_000;\n\nexport class SessionManager {\n private sessionId: string | null = null;\n private sessionStartedAt: Date | null = null;\n private appState: AppStateStatus = \"active\";\n private apiClient: ApiClient | null = null;\n private debug = false;\n private initialized = false;\n private config: SessionConfig = {};\n private backgroundTimestamp: number | null = null;\n private appStateSubscription: { remove: () => void } | null = null;\n private emergencyPaywallHandler: EmergencyPaywallHandler | null = null;\n private emergencyPaywallShownInSession = false;\n private secureStorage: SecureStorage | null = null;\n private distinctIdProvider: DistinctIdProvider | null = null;\n\n async initialize(\n apiClient: ApiClient,\n config: SessionConfig = {},\n debug = false,\n distinctIdProvider: DistinctIdProvider | null = null,\n ): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n this.apiClient = apiClient;\n this.debug = debug;\n this.secureStorage = new SecureStorage(debug);\n this.distinctIdProvider = distinctIdProvider;\n this.config = {\n sessionTimeoutMs: config.sessionTimeoutMs ?? SESSION_TIMEOUT_MS,\n trackAppState: config.trackAppState ?? true,\n };\n\n await this.restoreSession();\n\n if (this.config.trackAppState) {\n this.setupAppStateListener();\n }\n\n this.initialized = true;\n }\n\n async startSession(): Promise<string> {\n this.ensureInitialized();\n\n const distinctIdReady = await waitForDistinctId(this.distinctIdProvider);\n if (!distinctIdReady) {\n if (this.debug) console.log(\"[Paywallo:Session] startSession aborted — distinctId unavailable after retry\");\n throw new SessionError(\n SESSION_ERROR_CODES.START_FAILED,\n \"startSession aborted: distinctId unavailable after retry window\",\n );\n }\n\n if (this.sessionId) {\n await this.endSession();\n }\n\n this.sessionId = generateUUID();\n this.sessionStartedAt = new Date();\n this.emergencyPaywallShownInSession = false;\n\n await Promise.all([\n this.secureStorage!.set(SESSION_ID_KEY, this.sessionId),\n this.secureStorage!.set(SESSION_START_KEY, this.sessionStartedAt.toISOString()),\n this.secureStorage!.remove(EMERGENCY_PAYWALL_SHOWN_KEY),\n ]);\n\n await this.trackSessionStart();\n\n return this.sessionId;\n }\n\n async endSession(): Promise<void> {\n this.ensureInitialized();\n\n if (!this.sessionId || !this.sessionStartedAt) {\n return;\n }\n\n if (this.apiClient) {\n await this.apiClient.flushEventBatch();\n }\n\n await this.trackSessionEnd();\n\n this.sessionId = null;\n this.sessionStartedAt = null;\n\n await Promise.all([\n this.secureStorage!.remove(SESSION_ID_KEY),\n this.secureStorage!.remove(SESSION_START_KEY),\n ]);\n }\n\n getSessionId(): string | null {\n return this.sessionId;\n }\n\n getSessionDuration(): number {\n if (!this.sessionStartedAt) {\n return 0;\n }\n return Math.floor((Date.now() - this.sessionStartedAt.getTime()) / 1000);\n }\n\n isSessionActive(): boolean {\n return this.sessionId !== null;\n }\n\n getState(): SessionState {\n return {\n sessionId: this.sessionId,\n startedAt: this.sessionStartedAt,\n isActive: this.isSessionActive(),\n duration: this.getSessionDuration(),\n };\n }\n\n destroy(): void {\n if (this.appStateSubscription) {\n this.appStateSubscription.remove();\n this.appStateSubscription = null;\n }\n this.initialized = false;\n }\n\n registerEmergencyPaywallHandler(handler: EmergencyPaywallHandler | null): void {\n this.emergencyPaywallHandler = handler;\n }\n\n private async readSessionKey(key: string, legacyKey: string): Promise<string | null> {\n const value = await this.secureStorage!.get(key);\n if (value) return value;\n const legacyValue = await this.secureStorage!.get(legacyKey);\n if (legacyValue) {\n await this.secureStorage!.set(key, legacyValue).catch(() => undefined);\n }\n return legacyValue;\n }\n\n private async restoreSession(): Promise<void> {\n const [sessionId, sessionStart] = await Promise.all([\n this.readSessionKey(SESSION_ID_KEY, LEGACY_SESSION_ID_KEY),\n this.readSessionKey(SESSION_START_KEY, LEGACY_SESSION_START_KEY),\n ]).catch(() => [null, null]);\n\n if (sessionId && sessionStart) {\n const startedAt = new Date(sessionStart);\n const elapsed = Date.now() - startedAt.getTime();\n\n if (elapsed < (this.config.sessionTimeoutMs ?? SESSION_TIMEOUT_MS)) {\n this.sessionId = sessionId;\n this.sessionStartedAt = startedAt;\n return;\n }\n\n await Promise.all([\n this.secureStorage!.remove(SESSION_ID_KEY),\n this.secureStorage!.remove(SESSION_START_KEY),\n ]).catch(() => {});\n }\n }\n\n private setupAppStateListener(): void {\n if (this.appStateSubscription) {\n this.appStateSubscription.remove();\n }\n\n this.appStateSubscription = AppState.addEventListener(\"change\", this.handleAppStateChange);\n }\n\n private handleAppStateChange = async (nextAppState: AppStateStatus): Promise<void> => {\n const previousState = this.appState;\n this.appState = nextAppState;\n\n if (nextAppState === \"active\" && previousState !== \"active\") {\n await this.handleForeground();\n } else if (nextAppState === \"background\" && previousState === \"active\") {\n await this.handleBackground();\n }\n };\n\n private async handleForeground(): Promise<void> {\n const elapsed = this.backgroundTimestamp ? Date.now() - this.backgroundTimestamp : null;\n this.backgroundTimestamp = null;\n\n // After auto-end on background, or after timeout, always start fresh\n if (!this.sessionId || (elapsed !== null && elapsed > (this.config.sessionTimeoutMs ?? SESSION_TIMEOUT_MS))) {\n await this.startSession();\n }\n\n await this.trackAppOpen();\n await this.checkEmergencyPaywall();\n }\n\n private async handleBackground(): Promise<void> {\n this.backgroundTimestamp = Date.now();\n await this.trackAppBackground();\n // Drain pending events before the app suspends. Bounded by a short\n // timeout so a slow network can't hang the AppState transition — any\n // events still in flight remain in the batcher / OfflineQueue and get\n // replayed on next foreground.\n await this.flushEventsWithTimeout(BACKGROUND_FLUSH_TIMEOUT_MS);\n // Auto-end session when app goes to background\n await this.endSession();\n }\n\n private async flushEventsWithTimeout(timeoutMs: number): Promise<void> {\n if (!this.apiClient) return;\n const flush = this.apiClient.flushEventBatch().catch(() => undefined);\n const timeout = new Promise<void>((resolve) => setTimeout(resolve, timeoutMs));\n await Promise.race([flush, timeout]);\n }\n\n private async checkEmergencyPaywall(): Promise<void> {\n if (!this.apiClient || !this.emergencyPaywallHandler) {\n return;\n }\n\n if (this.emergencyPaywallShownInSession) {\n return;\n }\n\n const response = await this.apiClient.getEmergencyPaywall().catch(() => null);\n\n if (response?.enabled && response.paywallId) {\n this.emergencyPaywallShownInSession = true;\n await this.secureStorage!.set(EMERGENCY_PAYWALL_SHOWN_KEY, \"true\");\n await this.emergencyPaywallHandler(response.paywallId);\n }\n }\n\n private async trackSessionStart(): Promise<void> {\n if (!this.apiClient || !this.sessionId) return;\n await trackSessionStart(this.apiClient, this.sessionId, this.sessionStartedAt);\n }\n\n private async trackSessionEnd(): Promise<void> {\n if (!this.apiClient || !this.sessionId) return;\n await trackSessionEnd(this.apiClient, this.sessionId, this.getSessionDuration(), this.sessionStartedAt);\n }\n\n private async trackAppOpen(): Promise<void> {\n if (!this.apiClient) return;\n await trackAppOpen(this.apiClient, this.sessionId);\n }\n\n private async trackAppBackground(): Promise<void> {\n if (!this.apiClient) return;\n await trackAppBackground(this.apiClient, this.sessionId, this.getSessionDuration());\n }\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new SessionError(\n SESSION_ERROR_CODES.NOT_INITIALIZED,\n \"SessionManager not initialized. Call initialize() first\"\n );\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) console.log(\"[Paywallo:Session]\", ...args);\n }\n}\n\nexport const sessionManager = new SessionManager();\n","import { SecureStorage } from \"../../core/storage/SecureStorage\";\n\nconst ATTRIBUTION_STORAGE_KEY = \"@panel:attribution_v2\";\n\n/**\n * Attribution data captured at first touch (UTM params, click IDs, referrer).\n * `capturedAt` is ISO 8601 UTC — generated automatically by `capture()`.\n */\nexport interface AttributionCapture {\n readonly utmSource?: string;\n readonly utmMedium?: string;\n readonly utmCampaign?: string;\n readonly utmContent?: string;\n readonly utmTerm?: string;\n readonly fbclid?: string;\n readonly gclid?: string;\n readonly ttclid?: string;\n readonly referrer?: string;\n readonly capturedAt: string;\n}\n\ntype AttributionInput = Omit<AttributionCapture, \"capturedAt\">;\n\nfunction hasAnyField(data: AttributionInput): boolean {\n return Object.values(data).some((v) => v !== undefined && v !== null && v !== \"\");\n}\n\n/**\n * Attribution module — first-write-wins persistence of UTM / click-ID data.\n *\n * Once a capture is stored, subsequent `capture()` calls are silently ignored.\n * Use `clear()` to reset (e.g. on logout or in tests).\n *\n * @example\n * await attributionTracker.capture({ utmSource: \"google\", gclid: \"Cj0KCQ...\" });\n * const attr = attributionTracker.get(); // { utmSource: \"google\", capturedAt: \"...\" }\n */\nexport class AttributionTracker {\n private cache: AttributionCapture | null = null;\n private captureInProgress = false;\n private readonly storage: SecureStorage;\n\n constructor(debug = false) {\n this.storage = new SecureStorage(debug);\n }\n\n /**\n * Load persisted attribution from storage into in-memory cache.\n * Called once on SDK init. Subsequent `get()` reads are synchronous.\n */\n async loadFromStorage(): Promise<void> {\n const raw = await this.storage.get(ATTRIBUTION_STORAGE_KEY);\n if (raw) {\n try {\n this.cache = JSON.parse(raw) as AttributionCapture;\n } catch { /* malformed — treat as empty */ }\n }\n }\n\n /**\n * Persist attribution data. First-write wins — ignores if already captured\n * or if all fields are absent (empty capture).\n *\n * @param data - Attribution fields without `capturedAt` (generated internally).\n */\n async capture(data: AttributionInput): Promise<void> {\n if (this.cache !== null) return;\n if (!hasAnyField(data)) return;\n if (this.captureInProgress) return;\n\n this.captureInProgress = true;\n try {\n const capture: AttributionCapture = {\n ...data,\n capturedAt: new Date().toISOString(),\n };\n await this.storage.set(ATTRIBUTION_STORAGE_KEY, JSON.stringify(capture));\n this.cache = capture;\n } finally {\n this.captureInProgress = false;\n }\n }\n\n /**\n * Returns the persisted attribution capture, or `null` if none exists.\n * Synchronous — reads from in-memory cache (populated via `loadFromStorage()`).\n */\n get(): AttributionCapture | null {\n return this.cache;\n }\n\n /**\n * Clears the persisted attribution from storage and in-memory cache.\n * After `clear()`, `get()` returns `null` and the next `capture()` writes normally.\n */\n async clear(): Promise<void> {\n this.cache = null;\n await this.storage.remove(ATTRIBUTION_STORAGE_KEY);\n }\n}\n\nexport const attributionTracker = new AttributionTracker();\n","import { nativeStorage } from \"../../core/storage/NativeStorage\";\nimport { SecureStorage } from \"../../core/storage/SecureStorage\";\n\n/**\n * Storage keys used across install idempotency checks.\n * Centralised here so both InstallTracker and tests can reference them.\n */\nexport const INSTALL_KEYS = {\n /** Primary flag — set AFTER a successful $app_installed dispatch. */\n INSTALL_TRACKED: \"@panel:install_tracked\",\n /** Legacy fallback flag written by older SDK versions. */\n LEGACY_INSTALL_TRACKED: \"@paywallo:install_tracked\",\n /** Pre-send guard — set BEFORE dispatching to survive concurrent cold-starts. */\n INSTALL_SENT: \"@paywallo:app_installed_sent\",\n /** Stable event ID for backend dedup — generated once, reused on retries. */\n INSTALL_EVENT_ID: \"@panel:install_event_id\",\n /** Deferred match flag — set once iOS fingerprint match succeeds. */\n DEFERRED_MATCH_DONE: \"@panel:deferred_match_done\",\n /** Anonymous ID fallback when FB SDK not available. */\n ANON_ID: \"@panel:anon_id\",\n} as const;\n\n/**\n * Checks whether the install event was already tracked or is already in-flight.\n *\n * Returns `true` when the caller should bail out early (already handled),\n * or `false` when it should proceed with tracking.\n *\n * Side-effect when returning `false`: the pre-send guard\n * (`@paywallo:app_installed_sent`) is written to storage so that concurrent\n * cold-starts within the same process launch cannot both slip past these checks.\n *\n * Race condition fix (F2.18): `INSTALL_SENT` is only a valid \"in-flight\" guard\n * when the HTTP response was never received (network failure). On the next boot,\n * if `INSTALL_TRACKED` is absent but `INSTALL_SENT` is present, the previous\n * attempt failed before the server confirmed receipt — we clear the stale guard\n * and retry instead of permanently losing the event.\n */\nexport async function checkAndArmInstallGuard(\n storage: SecureStorage,\n): Promise<boolean> {\n const alreadyTracked = await storage.get(INSTALL_KEYS.INSTALL_TRACKED);\n if (alreadyTracked) return true;\n\n let fallbackTracked: string | null = null;\n try {\n fallbackTracked = await nativeStorage.get(INSTALL_KEYS.LEGACY_INSTALL_TRACKED);\n } catch { /* NativeStorage not available */ }\n if (fallbackTracked) return true;\n\n // Arm (or re-arm) the pre-send guard so concurrent cold-starts in the same\n // process launch can't both slip past this check.\n //\n // If INSTALL_SENT was already set from a prior boot where the HTTP response\n // never arrived (network failure / app killed mid-flight), we intentionally\n // fall through and re-arm it — INSTALL_TRACKED being absent is the proof that\n // the server never confirmed receipt, so we must retry.\n await nativeStorage.set(INSTALL_KEYS.INSTALL_SENT, \"1\");\n return false;\n}\n\n/**\n * Persists the install-tracked flag in both storage layers after a successful\n * `$app_installed` dispatch.\n */\nexport async function markInstallTracked(\n storage: SecureStorage,\n installedAt: number,\n): Promise<void> {\n await storage.set(INSTALL_KEYS.INSTALL_TRACKED, String(installedAt));\n try {\n await nativeStorage.set(INSTALL_KEYS.LEGACY_INSTALL_TRACKED, String(installedAt));\n } catch { /* non-critical */ }\n}\n\n/**\n * Returns a stable UUID for the `$app_installed` event, creating and persisting\n * one if it does not yet exist.\n *\n * The same ID is reused on every retry so the backend can deduplicate\n * concurrent or repeated dispatches (e.g. background flush + foreground init).\n */\nexport async function getOrCreateInstallEventId(): Promise<string> {\n const existing = await nativeStorage.get(INSTALL_KEYS.INSTALL_EVENT_ID);\n if (existing) return existing;\n\n const { generateUUID } = await import(\"../../utils/uuid\");\n const id = generateUUID();\n await nativeStorage.set(INSTALL_KEYS.INSTALL_EVENT_ID, id).catch(() => {});\n return id;\n}\n","import { Platform } from \"react-native\";\nimport { nativeDeviceInfo } from \"../../utils/NativeDeviceInfo\";\n\nconst REFERRER_TIMEOUT_MS = 5000;\n\ninterface ReferrerResult {\n rawReferrer: string | null;\n trackingId: string | null;\n fbclid: string | null;\n utmSource: string | null;\n utmMedium: string | null;\n utmCampaign: string | null;\n}\n\nexport class InstallReferrerManager {\n async getReferrer(): Promise<ReferrerResult> {\n if (Platform.OS !== \"android\") {\n return this.emptyResult();\n }\n\n let timerId: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<ReferrerResult>((resolve) => {\n timerId = setTimeout(() => resolve(this.emptyResult()), REFERRER_TIMEOUT_MS);\n });\n\n const fetchPromise = this.fetchReferrer();\n\n const result = await Promise.race([fetchPromise, timeoutPromise]);\n clearTimeout(timerId);\n return result;\n }\n\n private async fetchReferrer(): Promise<ReferrerResult> {\n try {\n const referrer = await nativeDeviceInfo.getInstallReferrer();\n\n if (!referrer) return this.emptyResult();\n\n const capped = referrer.slice(0, 2048);\n const params = this.parseReferrer(capped);\n return {\n rawReferrer: capped,\n trackingId: params[\"tracking_id\"] || null,\n fbclid: params[\"fbclid\"] || null,\n utmSource: params[\"utm_source\"] || null,\n utmMedium: params[\"utm_medium\"] || null,\n utmCampaign: params[\"utm_campaign\"] || null,\n };\n } catch {\n return this.emptyResult();\n }\n }\n\n private parseReferrer(referrer: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const pair of referrer.split(\"&\")) {\n const eqIndex = pair.indexOf(\"=\");\n if (eqIndex === -1) continue;\n try {\n const key = decodeURIComponent(pair.slice(0, eqIndex).replace(/\\+/g, \" \"));\n const raw = pair.slice(eqIndex + 1).replace(/\\+/g, \" \");\n const value = decodeURIComponent(raw);\n if (key) result[key] = value;\n } catch {\n }\n }\n return result;\n }\n\n private emptyResult(): ReferrerResult {\n return {\n rawReferrer: null,\n trackingId: null,\n fbclid: null,\n utmSource: null,\n utmMedium: null,\n utmCampaign: null,\n };\n }\n}\n\nexport const installReferrerManager = new InstallReferrerManager();\n","import { NativeModules } from \"react-native\";\n\nconst TIMEOUT_MS = 2000;\n\ninterface PaywalloFBBridgeModule {\n getAnonymousID(): Promise<string | null>;\n logEvent(name: string, params: Record<string, unknown>): Promise<void>;\n logPurchase(amount: number, currency: string, params: Record<string, unknown>): Promise<void>;\n setUserID(userId: string): void;\n flush(): void;\n}\n\nconst NativeBridge: PaywalloFBBridgeModule | null =\n NativeModules.PaywalloFBBridge ?? null;\n\nexport class MetaBridge {\n private cachedAnonId: string | null = null;\n\n /** Sync read of the cached anonymous ID. Returns null until `getAnonymousID()` resolves once. */\n getCachedAnonymousID(): string | null {\n return this.cachedAnonId;\n }\n\n async getAnonymousID(): Promise<string | null> {\n if (this.cachedAnonId) return this.cachedAnonId;\n if (!NativeBridge) return null;\n try {\n let timerId: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<null>((resolve) => {\n timerId = setTimeout(() => resolve(null), TIMEOUT_MS);\n });\n const result = await Promise.race([NativeBridge.getAnonymousID(), timeout]);\n clearTimeout(timerId);\n if (result) this.cachedAnonId = result;\n return result;\n } catch {\n return null;\n }\n }\n\n async logEvent(name: string, params: Record<string, unknown> = {}): Promise<void> {\n if (!NativeBridge) return;\n try {\n await NativeBridge.logEvent(name, params);\n } catch (error) {\n console.warn(\"[Paywallo:MetaBridge] logEvent failed\", { name, error });\n }\n }\n\n async logPurchase(amount: number, currency: string, params: Record<string, unknown> = {}): Promise<void> {\n if (!NativeBridge) return;\n try {\n await NativeBridge.logPurchase(amount, currency, params);\n } catch (error) {\n console.warn(\"[Paywallo:MetaBridge] logPurchase failed\", { amount, currency, error });\n }\n }\n\n setUserID(userId: string): void {\n if (!NativeBridge) return;\n try {\n NativeBridge.setUserID(userId);\n } catch (error) {\n console.warn(\"[Paywallo:MetaBridge] setUserID failed\", { error });\n }\n }\n\n flush(): void {\n if (!NativeBridge) return;\n try {\n NativeBridge.flush();\n } catch (error) {\n console.warn(\"[Paywallo:MetaBridge] flush failed\", { error });\n }\n }\n}\n\nexport const metaBridge = new MetaBridge();\n","import { Dimensions, Platform, PixelRatio } from \"react-native\";\n\nimport type { ApiClient } from \"../../core/ApiClient\";\nimport { SecureStorage } from \"../../core/storage/SecureStorage\";\nimport { nativeDeviceInfo } from \"../../utils/NativeDeviceInfo\";\nimport { DistinctIdProvider, waitForDistinctId } from \"../session/distinctIdGuard\";\nimport { sessionManager } from \"../session/SessionManager\";\n\nimport { AdvertisingIdManager, advertisingIdManager } from \"./AdvertisingIdManager\";\nimport { attributionTracker } from \"./AttributionTracker\";\nimport { identityManager } from \"./IdentityManager\";\nimport { checkAndArmInstallGuard, getOrCreateInstallEventId, INSTALL_KEYS,markInstallTracked } from \"./InstallIdempotency\";\nimport { installReferrerManager } from \"./InstallReferrerManager\";\nimport { metaBridge } from \"./MetaBridge\";\n\nexport type { AttributionCapture } from \"./AttributionTracker\";\nexport { AttributionTracker, attributionTracker } from \"./AttributionTracker\";\n\n// ── Install tracking ──────────────────────────────────────────────────────────\n\nexport interface InstallTrackerOptions {\n readonly advertisingIdManager?: AdvertisingIdManager;\n readonly distinctIdProvider?: DistinctIdProvider;\n}\n\nexport class InstallTracker {\n private readonly debug: boolean;\n private readonly advertisingIdManager: AdvertisingIdManager;\n private readonly distinctIdProvider: DistinctIdProvider;\n private _trackingInProgress = false;\n\n constructor(debug = false, optionsOrManager?: InstallTrackerOptions | AdvertisingIdManager) {\n this.debug = debug;\n // Backward compat: the legacy signature accepted an AdvertisingIdManager\n // as the second positional arg. Detect it by checking `collect` method.\n if (optionsOrManager && \"collect\" in optionsOrManager && typeof optionsOrManager.collect === \"function\") {\n this.advertisingIdManager = optionsOrManager;\n this.distinctIdProvider = () => identityManager.getDistinctId();\n } else {\n const opts = (optionsOrManager as InstallTrackerOptions | undefined) ?? {};\n // Default to the shared singleton so the cache populated here is\n // visible to the V2 envelope context provider (which reads sync).\n this.advertisingIdManager = opts.advertisingIdManager ?? advertisingIdManager;\n this.distinctIdProvider = opts.distinctIdProvider ?? (() => identityManager.getDistinctId());\n }\n }\n\n async trackIfNeeded(apiClient: ApiClient, requestATT = false): Promise<void> {\n if (this._trackingInProgress) return;\n this._trackingInProgress = true;\n try {\n await this._doTrack(apiClient, requestATT);\n } finally {\n this._trackingInProgress = false;\n }\n }\n\n private async _doTrack(apiClient: ApiClient, requestATT: boolean): Promise<void> {\n const storage = new SecureStorage(this.debug);\n\n // Idempotency guard: arms pre-send flag BEFORE dispatching so concurrent\n // cold-starts (Linking race + network) can't both fire $app_installed twice.\n const shouldSkip = await checkAndArmInstallGuard(storage);\n if (shouldSkip) return;\n\n // Race condition guard (F2.18): se identityManager.initialize ainda está\n // in-flight quando trackIfNeeded roda, distinctId vem \"\". Antes o early\n // return deixava `alreadyTracked` nunca ser setada — tudo bem por acaso,\n // mas dependia de o próximo boot retentar. Agora aguardamos o distinctId\n // explicitamente via waitForDistinctId (mesmo helper do SessionManager).\n // Se o timeout estourar, NÃO setamos a flag — próximo boot retenta.\n const distinctIdReady = await waitForDistinctId(this.distinctIdProvider);\n if (!distinctIdReady) {\n if (this.debug) {\n console.log(\"[Paywallo:Install] trackIfNeeded skipped — distinctId unavailable after retry; will retry next boot\");\n }\n return;\n }\n\n const distinctId = this.distinctIdProvider();\n const sessionId = sessionManager.getSessionId();\n const installedAt = Date.now();\n\n // Defensive: waitForDistinctId returned true but provider now empty (e.g.\n // reset() race) — skip without setting flag so next boot retries.\n if (!distinctId) {\n if (this.debug) {\n console.log(\"[Paywallo:Install] trackIfNeeded skipped — distinctId empty post-wait; will retry next boot\");\n }\n return;\n }\n\n let deviceData: Record<string, string | number> = {};\n try {\n const screen = Dimensions.get(\"screen\");\n const screenWidth = Math.round(screen.width ?? 0);\n const screenHeight = Math.round(screen.height ?? 0);\n const screenDensity = PixelRatio.get();\n const locale = Intl.DateTimeFormat().resolvedOptions().locale ?? \"unknown\";\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone ?? \"unknown\";\n\n const info = await nativeDeviceInfo.getDeviceInfo();\n\n const deviceModel = info.modelId || info.model || \"unknown\";\n const osVersion = info.systemVersion || \"unknown\";\n const appVersion = info.appVersion || \"unknown\";\n const buildNumber = info.buildNumber || \"0\";\n\n let carrier = \"unknown\";\n try { carrier = info.carrier ?? \"unknown\"; } catch { /* non-critical */ }\n\n let totalDisk = 0;\n try { totalDisk = Number(info.totalDisk) || 0; } catch { /* non-critical */ }\n\n let freeDisk = 0;\n try { freeDisk = Number(info.freeDisk) || 0; } catch { /* non-critical */ }\n\n let totalRam = 0;\n try { totalRam = Number(info.totalRam) || 0; } catch { /* non-critical */ }\n\n let brand = \"unknown\";\n try { brand = info.brand ?? \"unknown\"; } catch { /* non-critical */ }\n\n let installerPackage: string | null = null;\n try {\n if (Platform.OS === \"android\") {\n installerPackage = info.installerPackage ?? null;\n }\n } catch { /* non-critical */ }\n\n deviceData = {\n deviceModel,\n osVersion,\n appVersion,\n buildNumber,\n ...(screenWidth > 0 && { screenWidth }),\n ...(screenHeight > 0 && { screenHeight }),\n ...(screenDensity > 0 && { screenDensity }),\n timezone,\n locale,\n ...(carrier !== \"unknown\" && { carrier }),\n ...(totalDisk > 0 && { totalDisk }),\n ...(freeDisk > 0 && { freeDisk }),\n ...(totalRam > 0 && { totalRam }),\n ...(brand !== \"unknown\" && { brand }),\n ...(installerPackage && { installerPackage }),\n };\n } catch { /* non-critical */ }\n\n const [fbAnonId, referrer, adIds, installEventId] = await Promise.all([\n metaBridge.getAnonymousID(),\n installReferrerManager.getReferrer(),\n this.advertisingIdManager.collect(requestATT),\n getOrCreateInstallEventId(),\n ]);\n\n // Promove fbclid/utm_* do Play Install Referrer (Android) pro\n // attributionTracker. Sem isso, eventos pós-install não levam\n // `context.attribution.fbclid` no envelope V2 e o servidor não\n // consegue popular `app_users.fbclid` (PurchaseHandler.resolveSource\n // retorna source=null → CAPI Purchase fica sem network attribution).\n // First-write-wins do tracker garante que deep link ainda vence se\n // tiver capturado antes via DeepLinkAttributionCapture.\n if (referrer.fbclid || referrer.utmSource || referrer.utmMedium || referrer.utmCampaign) {\n attributionTracker.capture({\n ...(referrer.fbclid && { fbclid: referrer.fbclid }),\n ...(referrer.utmSource && { utmSource: referrer.utmSource }),\n ...(referrer.utmMedium && { utmMedium: referrer.utmMedium }),\n ...(referrer.utmCampaign && { utmCampaign: referrer.utmCampaign }),\n ...(referrer.rawReferrer && { referrer: referrer.rawReferrer }),\n }).catch(() => { /* non-critical */ });\n }\n\n let effectiveAnonId = fbAnonId;\n if (!effectiveAnonId) {\n const stored = await storage.get(INSTALL_KEYS.ANON_ID);\n if (stored) {\n effectiveAnonId = stored;\n } else {\n const { generateUUID } = await import(\"../../utils/uuid\");\n effectiveAnonId = `PW_${generateUUID()}`;\n await storage.set(INSTALL_KEYS.ANON_ID, effectiveAnonId).catch(() => {});\n }\n }\n\n // Install is a one-shot, non-recoverable event — flush as critical so it\n // can't get stuck behind 24 other normal events on the 10s window.\n // `installEventId` is stable across retries so the backend can deduplicate\n // duplicate dispatches (e.g. background flush + foreground init race).\n await apiClient.trackEvent(\"$app_installed\", distinctId, {\n installedAt,\n platform: Platform.OS,\n installEventId,\n ...(sessionId && { sessionId }),\n ...deviceData,\n ...(effectiveAnonId && { fbAnonId: effectiveAnonId }),\n ...(referrer.rawReferrer && { installReferrer: referrer.rawReferrer }),\n ...(referrer.trackingId && { referrerTrackingId: referrer.trackingId }),\n ...(referrer.fbclid && { referrerFbclid: referrer.fbclid }),\n ...(referrer.utmSource && { referrerUtmSource: referrer.utmSource }),\n ...(referrer.utmMedium && { referrerUtmMedium: referrer.utmMedium }),\n ...(referrer.utmCampaign && { referrerUtmCampaign: referrer.utmCampaign }),\n ...(adIds.idfa && { idfa: adIds.idfa }),\n ...(adIds.idfv && { idfv: adIds.idfv }),\n ...(adIds.gaid && { gaid: adIds.gaid }),\n attStatus: adIds.attStatus,\n }, undefined, { priority: \"critical\" });\n\n void this.callDeferredMatch(apiClient, deviceData, adIds, effectiveAnonId, installedAt).catch(() => {});\n\n await markInstallTracked(storage, installedAt);\n }\n\n private async callDeferredMatch(\n apiClient: ApiClient,\n deviceData: Record<string, string | number>,\n adIds: { idfv: string | null; gaid: string | null },\n anonId: string | null,\n installedAt: number,\n ): Promise<void> {\n const storage = new SecureStorage(this.debug);\n const alreadyMatched = await storage.get(INSTALL_KEYS.DEFERRED_MATCH_DONE);\n if (alreadyMatched) return;\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 5000);\n\n try {\n const baseUrl = apiClient.getBaseUrl();\n const appKey = apiClient.getAppKey();\n\n const referrer = await installReferrerManager.getReferrer();\n\n await fetch(`${baseUrl}/sdk/attribution/deferred-match/${appKey}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-App-Key\": appKey },\n body: JSON.stringify({\n platform: Platform.OS,\n ...(adIds.idfv && { idfv: adIds.idfv }),\n ...(adIds.gaid && { gaid: adIds.gaid }),\n ...(referrer.rawReferrer && { installReferrer: referrer.rawReferrer }),\n deviceModel: deviceData.deviceModel,\n osVersion: deviceData.osVersion,\n screenWidth: deviceData.screenWidth,\n screenHeight: deviceData.screenHeight,\n timezone: deviceData.timezone,\n locale: deviceData.locale,\n fbAnonId: anonId,\n installTimestamp: new Date(installedAt).toISOString(),\n }),\n signal: controller.signal,\n });\n\n await storage.set(INSTALL_KEYS.DEFERRED_MATCH_DONE, \"1\").catch(() => {});\n } catch {\n // Non-critical — deferred match is best-effort\n } finally {\n clearTimeout(timer);\n }\n }\n}\n","import { Linking } from \"react-native\";\n\nimport { attributionTracker } from \"./InstallTracker\";\nimport type { AttributionCapture } from \"./InstallTracker\";\n\ntype AttributionInput = Omit<AttributionCapture, \"capturedAt\">;\n\ninterface LinkingEventSubscription {\n remove: () => void;\n}\n\ntype UrlListener = (event: { url: string }) => void;\n\n/**\n * Parses a deep link URL into attribution input (utm/click IDs).\n * Returns an empty object if the URL has no query params or is malformed.\n *\n * Exported for testing — callers should use `capture`/`startListening`.\n */\nexport function parseAttributionFromUrl(url: string | null): AttributionInput {\n if (!url) return {};\n try {\n const queryIdx = url.indexOf(\"?\");\n if (queryIdx === -1) return {};\n const query = url.slice(queryIdx + 1).split(\"#\")[0] ?? \"\";\n if (!query) return {};\n\n const params: Record<string, string> = {};\n for (const pair of query.split(\"&\")) {\n const eqIdx = pair.indexOf(\"=\");\n if (eqIdx === -1) continue;\n try {\n const rawKey = pair.slice(0, eqIdx).replace(/\\+/g, \" \");\n const rawVal = pair.slice(eqIdx + 1).replace(/\\+/g, \" \");\n const key = decodeURIComponent(rawKey);\n const value = decodeURIComponent(rawVal);\n if (key) params[key] = value;\n } catch { /* malformed pair — skip */ }\n }\n\n const result: AttributionInput = {};\n if (params[\"fbclid\"]) (result as { fbclid?: string }).fbclid = params[\"fbclid\"];\n if (params[\"gclid\"]) (result as { gclid?: string }).gclid = params[\"gclid\"];\n if (params[\"ttclid\"]) (result as { ttclid?: string }).ttclid = params[\"ttclid\"];\n if (params[\"utm_source\"]) (result as { utmSource?: string }).utmSource = params[\"utm_source\"];\n if (params[\"utm_medium\"]) (result as { utmMedium?: string }).utmMedium = params[\"utm_medium\"];\n if (params[\"utm_campaign\"]) (result as { utmCampaign?: string }).utmCampaign = params[\"utm_campaign\"];\n if (params[\"utm_content\"]) (result as { utmContent?: string }).utmContent = params[\"utm_content\"];\n if (params[\"utm_term\"]) (result as { utmTerm?: string }).utmTerm = params[\"utm_term\"];\n return result;\n } catch {\n return {};\n }\n}\n\n/**\n * Captures attribution from cold-start deep link + subsequent `url` events.\n *\n * Behaviour:\n * - On init: reads `Linking.getInitialURL()` and forwards parsed attribution\n * to `attributionTracker.capture()` (first-write-wins — ignored if already set).\n * - Registers `Linking.addEventListener('url', handler)` to catch warm-start\n * deep links while the app is running.\n * - Returns a cleanup function to unsubscribe (used by `reset`).\n *\n * All failures are swallowed — attribution is best-effort and must never\n * break SDK init.\n */\nexport class DeepLinkAttributionCapture {\n private subscription: LinkingEventSubscription | null = null;\n private readonly debug: boolean;\n\n constructor(debug = false) {\n this.debug = debug;\n }\n\n async start(): Promise<void> {\n try {\n const initialUrl = await Linking.getInitialURL();\n const parsed = parseAttributionFromUrl(initialUrl);\n await attributionTracker.capture(parsed).catch(() => {});\n } catch (err) {\n if (this.debug) console.log(\"[Paywallo ATTR] getInitialURL error\", err);\n }\n\n try {\n const handler: UrlListener = (event) => {\n const parsed = parseAttributionFromUrl(event.url);\n void attributionTracker.capture(parsed).catch(() => {});\n };\n // `addEventListener` returns `EmitterSubscription` in modern RN; older\n // versions returned void. We defensively normalise both shapes.\n const maybeSub = (Linking as unknown as {\n addEventListener: (\n event: \"url\",\n listener: UrlListener,\n ) => LinkingEventSubscription | undefined;\n }).addEventListener(\"url\", handler);\n if (maybeSub && typeof maybeSub.remove === \"function\") {\n this.subscription = maybeSub;\n } else {\n this.subscription = {\n remove: () => {\n const legacy = Linking as unknown as {\n removeEventListener?: (event: \"url\", listener: UrlListener) => void;\n };\n legacy.removeEventListener?.(\"url\", handler);\n },\n };\n }\n } catch (err) {\n if (this.debug) console.log(\"[Paywallo ATTR] addEventListener error\", err);\n }\n }\n\n stop(): void {\n try {\n this.subscription?.remove();\n } catch (err) {\n if (this.debug) console.log(\"[Paywallo ATTR] listener remove error\", err);\n }\n this.subscription = null;\n }\n}\n\nexport const deepLinkAttributionCapture = new DeepLinkAttributionCapture();\n","export { IdentityManager, identityManager } from \"./IdentityManager\";\nexport type { IdentityState } from \"./IdentityManager\";\n\nexport { AdvertisingIdManager, advertisingIdManager } from \"./AdvertisingIdManager\";\nexport type { AdvertisingIdResult, AttStatus } from \"./AdvertisingIdManager\";\n\nexport { InstallTracker, AttributionTracker, attributionTracker } from \"./InstallTracker\";\nexport type { AttributionCapture } from \"./InstallTracker\";\n\nexport {\n DeepLinkAttributionCapture,\n deepLinkAttributionCapture,\n parseAttributionFromUrl,\n} from \"./DeepLinkAttributionCapture\";\n\nexport { InstallReferrerManager, installReferrerManager } from \"./InstallReferrerManager\";\n\nexport { IdentityError, IDENTITY_ERROR_CODES } from \"./IdentityError\";\n\nexport type { UserProperties, IdentifyOptions } from \"./types\";\n\nexport { MetaBridge, metaBridge } from \"./MetaBridge\";\n","import { NativeModules, NativeEventEmitter, Platform } from \"react-native\";\nimport type { FcmRemoteMessage, IPushBridge } from \"./types\";\n\nexport type { FcmRemoteMessage };\n\nexport function isNativePushAvailable(): boolean {\n return !!NativeModules.PaywalloNotifications;\n}\n\nfunction mapStatusToNumber(status: string | null): number {\n switch (status) {\n case \"granted\": return 1; // AUTHORIZED\n case \"denied\": return 0; // DENIED\n case \"provisional\": return 2; // PROVISIONAL\n case \"ephemeral\": return 1; // treat as authorized\n default: return -1; // NOT_DETERMINED\n }\n}\n\nlet _emitter: NativeEventEmitter | null = null;\nfunction getEmitter(): NativeEventEmitter | null {\n if (_emitter) return _emitter;\n const mod = NativeModules.PaywalloNotifications;\n if (!mod) return null;\n _emitter = new NativeEventEmitter(mod);\n return _emitter;\n}\n\nexport class NativePushBridge implements IPushBridge {\n async getToken(): Promise<string | null> {\n try {\n const mod = NativeModules.PaywalloNotifications;\n if (!mod) return null;\n return await mod.getToken();\n } catch {\n return null;\n }\n }\n\n async getAPNSToken(): Promise<string | null> {\n if (Platform.OS !== \"ios\") return null;\n return this.getToken();\n }\n\n async requestPermission(options?: { provisional?: boolean }): Promise<number> {\n try {\n const mod = NativeModules.PaywalloNotifications;\n if (!mod) return -1;\n const status: string | null = await mod.requestPermission(options ?? {});\n // After permission granted, register for remote notifications to get APNS token\n if (status === \"granted\" || status === \"provisional\") {\n try { await mod.registerForPush(); } catch { /* best effort */ }\n }\n return mapStatusToNumber(status);\n } catch (err) {\n console.warn(\"[NativePushBridge] requestPermission error:\", err instanceof Error ? err.message : String(err));\n return -1;\n }\n }\n\n async hasPermission(): Promise<number> {\n try {\n const mod = NativeModules.PaywalloNotifications;\n if (!mod) return -1;\n const status: string | null = await mod.hasPermission();\n return mapStatusToNumber(status);\n } catch {\n return -1;\n }\n }\n\n onTokenRefresh(cb: (token: string) => void): () => void {\n const emitter = getEmitter();\n if (!emitter) return () => undefined;\n const sub = emitter.addListener(\"PaywalloTokenRefresh\", (event: { token: string }) => {\n if (typeof event?.token === \"string\") cb(event.token);\n });\n return () => sub.remove();\n }\n\n onMessage(cb: (message: FcmRemoteMessage) => Promise<void>): () => void {\n const emitter = getEmitter();\n if (!emitter) return () => undefined;\n const sub = emitter.addListener(\"PaywalloMessageReceived\", (event: FcmRemoteMessage) => {\n cb(event).catch(() => undefined);\n });\n return () => sub.remove();\n }\n\n // No-op: native module handles background delivery via service/extension.\n setBackgroundMessageHandler(_cb: (message: FcmRemoteMessage) => Promise<void>): void {\n return;\n }\n\n async getInitialNotification(): Promise<FcmRemoteMessage | null> {\n try {\n const mod = NativeModules.PaywalloNotifications;\n if (!mod) return null;\n const raw: unknown = await mod.getInitialNotification();\n if (!raw || typeof raw !== \"object\") return null;\n const r = raw as Record<string, unknown>;\n const notification = r[\"notification\"];\n return {\n messageId: typeof r[\"messageId\"] === \"string\" ? r[\"messageId\"] : undefined,\n data: typeof r[\"data\"] === \"object\" && r[\"data\"] !== null\n ? (r[\"data\"] as Record<string, string>)\n : undefined,\n notification: notification && typeof notification === \"object\"\n ? {\n title: typeof (notification as Record<string, unknown>)[\"title\"] === \"string\"\n ? (notification as Record<string, string>)[\"title\"]\n : undefined,\n body: typeof (notification as Record<string, unknown>)[\"body\"] === \"string\"\n ? (notification as Record<string, string>)[\"body\"]\n : undefined,\n }\n : undefined,\n sentTime: typeof r[\"sentTime\"] === \"number\" ? r[\"sentTime\"] : undefined,\n };\n } catch {\n return null;\n }\n }\n}\n","import type { FcmRemoteMessage } from \"../bridges/types\";\n\nexport type { FcmRemoteMessage };\n\n/**\n * Registers a background message handler.\n *\n * IMPORTANT: Call in the client's `index.js` BEFORE `AppRegistry.registerComponent()`.\n * Background handlers run in a headless JS environment and must be registered at module\n * level, not inside a React component or hook.\n *\n * Note: With NativePushBridge, background delivery is handled by the native\n * service/extension. This function is kept for API compatibility.\n *\n * @example\n * // index.js\n * import { registerBackgroundMessageHandler } from '@paywallo/sdk';\n * registerBackgroundMessageHandler(async (message) => {\n * // handle background message\n * });\n * AppRegistry.registerComponent(appName, () => App);\n */\nexport function registerBackgroundMessageHandler(\n _cb: (message: FcmRemoteMessage) => Promise<void>\n): void {\n // No-op: native module handles background delivery via service/extension.\n}\n","import { Platform } from \"react-native\";\nimport type { NotificationEventType } from \"./types\";\n\n/**\n * Thin facade over the unified EventBatcher pipeline.\n *\n * Tracks notification lifecycle events (`delivered`, `opened`, `dismissed`,\n * `failed`) by routing through `ApiClient.trackEvent` → `EventBatcher`\n * (family `notification`) → `/api/v1/events/batch`.\n *\n * Deduplication by `messageId` + `eventType` (1 hour TTL, LRU 1000 entries)\n * prevents duplicate analytics rows caused by FCM/APNs re-delivery.\n *\n * @example\n * ```ts\n * await notificationEventTracker.track(\"opened\", {\n * notificationId: \"notif_123\",\n * campaignId: \"camp_abc\",\n * messageId: \"fcm_xyz\",\n * });\n * ```\n */\n\nconst SEEN_MESSAGES_KEY = \"seen_messages\";\nconst SEEN_TTL_MS = 60 * 60 * 1000; // 1 hour\nconst MAX_SEEN_SIZE = 1000;\n\ninterface SeenEntry {\n ts: number;\n}\n\ninterface TrackPayload {\n notificationId: string;\n campaignId: string;\n variantKey?: string;\n messageId: string;\n appUserId?: string;\n failureReason?: string;\n properties?: Record<string, unknown>;\n}\n\n/**\n * Minimal surface the facade needs from the SDK's unified event pipeline.\n * `PaywalloClient` implements it (forwarding to `ApiClient.trackEvent`\n * which ends up in the `EventBatcher`).\n */\nexport interface EventBatcherLike {\n trackEvent(\n eventName: string,\n distinctId: string,\n properties?: Record<string, unknown>,\n timestamp?: number\n ): Promise<void>;\n getDistinctId(): string;\n}\n\ninterface SecureStorageLike {\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<boolean>;\n}\n\ninterface TrackerConfig {\n getDeviceId?: () => string | null;\n getAppUserId?: () => string | null;\n debug?: boolean;\n}\n\nfunction getTimezone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone ?? \"UTC\";\n } catch {\n return \"UTC\";\n }\n}\n\nfunction detectPlatform(): \"ios\" | \"android\" {\n return Platform.OS === \"ios\" ? \"ios\" : \"android\";\n}\n\nexport class NotificationEventTracker {\n private seenMessages: Map<string, SeenEntry> = new Map();\n private seenLoaded = false;\n\n constructor(\n private readonly batcher: EventBatcherLike,\n private readonly config: TrackerConfig,\n private readonly secureStorage?: SecureStorageLike\n ) {}\n\n async track(eventType: NotificationEventType, payload: TrackPayload): Promise<void> {\n const { notificationId, campaignId, variantKey, messageId } = payload;\n\n if (await this.isDuplicate(messageId, eventType)) {\n if (this.config.debug) console.log(\"[Paywallo PUSH] duplicate event skipped:\", messageId, eventType);\n return;\n }\n\n await this.markSeen(messageId, eventType);\n\n const distinctId = this.batcher.getDistinctId();\n if (!distinctId) {\n if (this.config.debug) console.log(\"[Paywallo PUSH] skipped (no distinctId):\", eventType);\n return;\n }\n\n const properties: Record<string, unknown> = {\n family: \"notification\",\n type: eventType,\n notification_id: notificationId,\n campaign_id: campaignId,\n variant_key: variantKey ?? null,\n message_id: messageId,\n device_id: this.config.getDeviceId?.() ?? \"\",\n push_platform: detectPlatform(),\n timezone: getTimezone(),\n };\n\n if (payload.failureReason) properties.failure_reason = payload.failureReason;\n if (payload.appUserId) properties.app_user_id = payload.appUserId;\n if (payload.properties) Object.assign(properties, payload.properties);\n\n if (this.config.debug) console.log(\"[Paywallo PUSH] tracking event:\", eventType, notificationId);\n\n await this.batcher.trackEvent(\"notification\", distinctId, properties);\n }\n\n async isDuplicate(messageId: string, eventType: NotificationEventType): Promise<boolean> {\n await this.ensureSeenLoaded();\n const key = `${messageId}:${eventType}`;\n const entry = this.seenMessages.get(key);\n if (!entry) return false;\n if (Date.now() - entry.ts > SEEN_TTL_MS) {\n this.seenMessages.delete(key);\n return false;\n }\n return true;\n }\n\n async flush(): Promise<void> {\n // Flush is a no-op here — the underlying EventBatcher handles buffering.\n // Callers can still invoke `ApiClient.flushEventBatch()` directly if they need\n // to force a flush (e.g. before app termination).\n if (this.config.debug) console.log(\"[Paywallo PUSH] flush requested (delegated to EventBatcher)\");\n }\n\n private async markSeen(messageId: string, eventType: NotificationEventType): Promise<void> {\n await this.ensureSeenLoaded();\n const key = `${messageId}:${eventType}`;\n this.seenMessages.set(key, { ts: Date.now() });\n this.evictExpired();\n await this.persistSeen();\n }\n\n private evictExpired(): void {\n const now = Date.now();\n // Remove expired entries first\n for (const [k, v] of this.seenMessages) {\n if (now - v.ts > SEEN_TTL_MS) {\n this.seenMessages.delete(k);\n }\n }\n // LRU eviction if still over limit\n if (this.seenMessages.size > MAX_SEEN_SIZE) {\n const sorted = [...this.seenMessages.entries()].sort((a, b) => a[1].ts - b[1].ts);\n const toRemove = sorted.slice(0, this.seenMessages.size - MAX_SEEN_SIZE);\n for (const [k] of toRemove) {\n this.seenMessages.delete(k);\n }\n }\n }\n\n private async ensureSeenLoaded(): Promise<void> {\n if (this.seenLoaded || !this.secureStorage) {\n this.seenLoaded = true;\n return;\n }\n try {\n const raw = await this.secureStorage.get(SEEN_MESSAGES_KEY);\n if (raw) {\n const parsed = JSON.parse(raw) as Record<string, SeenEntry>;\n const now = Date.now();\n for (const [k, v] of Object.entries(parsed)) {\n if (now - v.ts <= SEEN_TTL_MS) {\n this.seenMessages.set(k, v);\n }\n }\n }\n } catch {\n // non-fatal — start fresh\n }\n this.seenLoaded = true;\n }\n\n private async persistSeen(): Promise<void> {\n if (!this.secureStorage) return;\n try {\n const obj: Record<string, SeenEntry> = {};\n for (const [k, v] of this.seenMessages) {\n obj[k] = v;\n }\n await this.secureStorage.set(SEEN_MESSAGES_KEY, JSON.stringify(obj));\n } catch {\n // non-fatal\n }\n }\n}\n","/**\n * DeepLinkResolver — extracts and sanitizes deep links from push payloads.\n *\n * Security: blocks javascript:, file:, data:, vbscript:, and protocol-relative\n * URLs (case-insensitive, whitespace-tolerant). Returns null for anything\n * suspicious — never throws.\n */\n\nconst BLOCKED_SCHEME_PREFIXES = [\n \"javascript:\",\n \"file:\",\n \"data:\",\n \"vbscript:\",\n];\n\nconst SCHEME_REGEX = /^[a-zA-Z][a-zA-Z0-9+\\-.]*:\\/\\//;\n\nfunction extractRaw(data: unknown): string | null {\n if (!data || typeof data !== \"object\") return null;\n const record = data as Record<string, unknown>;\n const candidates = [record[\"deeplink\"], record[\"deepLink\"], record[\"deep_link\"]];\n for (const candidate of candidates) {\n if (typeof candidate === \"string\" && candidate.length > 0) return candidate;\n }\n return null;\n}\n\nfunction isBlockedScheme(lower: string): boolean {\n return BLOCKED_SCHEME_PREFIXES.some((scheme) => lower.startsWith(scheme));\n}\n\n/**\n * Resolves and sanitizes a deep link from a notification data payload.\n * Returns the URL string if safe, or null otherwise.\n */\nexport function resolveDeepLink(data: unknown): string | null {\n const raw = extractRaw(data);\n if (!raw) return null;\n\n const trimmed = raw.trim();\n if (trimmed.length === 0) return null;\n\n const lower = trimmed.toLowerCase();\n if (isBlockedScheme(lower)) return null;\n if (!SCHEME_REGEX.test(trimmed)) return null;\n\n try {\n // eslint-disable-next-line no-new\n new URL(trimmed);\n } catch {\n return null;\n }\n\n return trimmed;\n}\n","import type { IPushBridge } from \"../bridges/types\";\nimport type { NotificationPayload } from \"../types\";\nimport type { NotificationEventTracker } from \"../NotificationEventTracker\";\nimport { resolveDeepLink } from \"../DeepLinkResolver\";\n\nfunction extractPayload(data: Record<string, unknown>): NotificationPayload {\n return {\n notificationId: String(data[\"notificationId\"] ?? data[\"notification_id\"] ?? \"\"),\n campaignId: String(data[\"campaignId\"] ?? data[\"campaign_id\"] ?? \"\"),\n variantKey: data[\"variantKey\"] != null ? String(data[\"variantKey\"]) : undefined,\n title: String(data[\"title\"] ?? \"\"),\n body: String(data[\"body\"] ?? \"\"),\n imageUrl: data[\"imageUrl\"] != null ? String(data[\"imageUrl\"]) : undefined,\n deepLink: resolveDeepLink(data) ?? undefined,\n data,\n };\n}\n\ninterface FcmMessage {\n messageId?: string;\n data?: Record<string, string>;\n notification?: { title?: string; body?: string };\n}\n\ninterface ForegroundHandlerDeps {\n bridge: IPushBridge;\n tracker: NotificationEventTracker;\n debug?: boolean;\n}\n\nexport function setupForegroundHandler(\n deps: ForegroundHandlerDeps,\n onReceive: (payload: NotificationPayload) => void\n): () => void {\n const { bridge, tracker, debug } = deps;\n\n const unsubscribe = bridge.onMessage(async (message: FcmMessage) => {\n const data = (message.data ?? {}) as Record<string, unknown>;\n const payload = extractPayload({\n ...data,\n title: data[\"title\"] ?? message.notification?.title ?? \"\",\n body: data[\"body\"] ?? message.notification?.body ?? \"\",\n });\n\n if (debug) console.warn(\"[Paywallo PUSH] foreground message received:\", payload.notificationId);\n\n onReceive(payload);\n\n const messageId = message.messageId ?? payload.notificationId;\n await tracker.track(\"notification_delivered\", {\n notificationId: payload.notificationId,\n campaignId: payload.campaignId,\n variantKey: payload.variantKey,\n messageId,\n });\n });\n\n return unsubscribe;\n}\n","/**\n * Handler wiring and initial-notification utilities extracted from\n * NotificationsManager to keep that class within the 300-line limit.\n */\nimport type { NotificationPayload } from \"./types\";\nimport type { IPushBridge } from \"./bridges/types\";\nimport type { NotificationEventTracker } from \"./NotificationEventTracker\";\nimport type { SecureStorage } from \"../../core/storage/SecureStorage\";\nimport type { EventBatcherLike } from \"./NotificationEventTracker\";\nimport { NotificationEventTracker as Tracker } from \"./NotificationEventTracker\";\nimport { setupForegroundHandler } from \"./handlers/ForegroundHandler\";\nimport type { PermissionManager } from \"./PermissionManager\";\n\nexport interface HandlersSetupConfig {\n appKey: string | null;\n apiBaseUrl: string | null;\n debug: boolean;\n bridge: IPushBridge;\n secureStorage: SecureStorage | null;\n getDeviceId: (() => string | null) | null;\n permissionManager: PermissionManager;\n receivedCallbacks: Array<(payload: NotificationPayload) => void>;\n openedCallbacks: Array<(payload: NotificationPayload) => void>;\n dismissedCallbacks: Array<(payload: NotificationPayload) => void>;\n eventBatcher: EventBatcherLike;\n}\n\nexport interface HandlersSetupResult {\n tracker: NotificationEventTracker;\n foregroundCleanup: () => void;\n}\n\nexport function buildHandlers(config: HandlersSetupConfig): HandlersSetupResult | null {\n if (!config.appKey || !config.apiBaseUrl) {\n if (config.debug) console.log(\"[Paywallo PUSH] setupHandlers called before initialize()\");\n return null;\n }\n\n const tracker = new Tracker(\n config.eventBatcher,\n { getDeviceId: config.getDeviceId ?? undefined, debug: config.debug },\n config.secureStorage ?? undefined,\n );\n config.permissionManager.setTracker(tracker);\n\n const foregroundCleanup = setupForegroundHandler(\n { bridge: config.bridge, tracker, debug: config.debug },\n (payload) => { config.receivedCallbacks.forEach((cb) => cb(payload)); },\n );\n\n if (config.debug) console.log(\"[Paywallo PUSH] handlers registered\");\n return { tracker, foregroundCleanup };\n}\n\nexport async function getInitialNotificationPayload(\n bridge: IPushBridge,\n): Promise<NotificationPayload | null> {\n const message = await bridge.getInitialNotification();\n if (!message) return null;\n const data = (message.data ?? {}) as Record<string, unknown>;\n return {\n notificationId: String(data[\"notificationId\"] ?? data[\"notification_id\"] ?? \"\"),\n campaignId: String(data[\"campaignId\"] ?? data[\"campaign_id\"] ?? \"\"),\n variantKey: data[\"variantKey\"] != null ? String(data[\"variantKey\"]) : undefined,\n title: String(data[\"title\"] ?? message.notification?.title ?? \"\"),\n body: String(data[\"body\"] ?? message.notification?.body ?? \"\"),\n data,\n };\n}\n","import { Platform } from \"react-native\";\nimport type { IPushBridge } from \"./bridges/types\";\nimport type { PushPermissionStatus } from \"./types\";\nimport type { NotificationEventTracker } from \"./NotificationEventTracker\";\n\n// AuthorizationStatus from Firebase Messaging\nconst AUTH_STATUS = {\n NOT_DETERMINED: -1,\n DENIED: 0,\n AUTHORIZED: 1,\n PROVISIONAL: 2,\n} as const;\n\n// Android API level where POST_NOTIFICATIONS runtime permission was introduced (Android 13).\nconst ANDROID_TIRAMISU_API = 33;\n\nexport type PromptEventType =\n | \"prompt_shown\"\n | \"soft_accepted\"\n | \"soft_rejected\"\n | \"os_granted\"\n | \"os_denied\";\n\nexport interface PrePromptTracker {\n trackPromptEvent(event: PromptEventType): void;\n}\n\nexport interface PrePromptOptions {\n title: string;\n body: string;\n acceptLabel?: string;\n rejectLabel?: string;\n provisional?: boolean;\n}\n\nexport interface PrePromptHandle {\n title: string;\n body: string;\n acceptLabel?: string;\n rejectLabel?: string;\n /** Consumer invokes after user taps accept in custom UI. */\n accept(): Promise<PushPermissionStatus>;\n /** Consumer invokes after user taps reject in custom UI. */\n reject(): PushPermissionStatus;\n}\n\nfunction mapPermissionStatus(status: number): PushPermissionStatus {\n switch (status) {\n case AUTH_STATUS.AUTHORIZED:\n return \"granted\";\n case AUTH_STATUS.DENIED:\n return \"denied\";\n case AUTH_STATUS.PROVISIONAL:\n return \"provisional\";\n default:\n return \"notDetermined\";\n }\n}\n\nexport interface RNPlatform {\n OS: string;\n Version?: number | string;\n}\n\nfunction getPlatform(): RNPlatform {\n return Platform;\n}\n\nfunction needsAndroidRuntimePermission(platform: RNPlatform): boolean {\n if (platform.OS !== \"android\") return false;\n const v = typeof platform.Version === \"string\"\n ? parseInt(platform.Version, 10)\n : platform.Version ?? 0;\n return Number.isFinite(v) && v >= ANDROID_TIRAMISU_API;\n}\n\nexport class PermissionManager {\n private tracker: PrePromptTracker | null = null;\n private debug: boolean;\n private readonly platformOverride: RNPlatform | undefined;\n\n constructor(\n private readonly bridge: IPushBridge,\n opts: { debug?: boolean; tracker?: PrePromptTracker | NotificationEventTracker; platform?: RNPlatform } = {}\n ) {\n this.debug = opts.debug ?? false;\n this.tracker = this.coerceTracker(opts.tracker);\n this.platformOverride = opts.platform;\n }\n\n setTracker(tracker: PrePromptTracker | NotificationEventTracker | null): void {\n this.tracker = this.coerceTracker(tracker);\n }\n\n setDebug(debug: boolean): void {\n this.debug = debug;\n }\n\n async requestPermission(options?: { provisional?: boolean }): Promise<PushPermissionStatus> {\n const platform = this.platformOverride ?? getPlatform();\n if (this.debug) console.warn(\"[paywallo-push] platform detected:\", platform.OS, \"version:\", String(platform.Version ?? \"n/a\"));\n\n if (platform.OS === \"ios\") {\n if (this.debug) console.warn(\"[paywallo-push] requestPermission iOS — calling bridge...\");\n try {\n const raw = await this.bridge.requestPermission(options);\n if (this.debug) console.warn(\"[paywallo-push] bridge returned raw:\", raw);\n const status = mapPermissionStatus(raw);\n if (this.debug) console.warn(\"[paywallo-push] mapped status:\", status);\n this.emitOsEvent(status);\n return status;\n } catch (err) {\n console.warn(\"[paywallo-push] requestPermission iOS CRASHED:\", err instanceof Error ? err.message : String(err));\n throw err;\n }\n }\n\n if (!needsAndroidRuntimePermission(platform)) {\n // Pre-Android 13: POST_NOTIFICATIONS is auto-granted at install time.\n if (this.debug) console.log(\"[paywallo-push] Android <13: auto-granted\");\n const status = await this.getStatus();\n this.emitOsEvent(status);\n return status;\n }\n\n // Android 13+: FCM requestPermission triggers POST_NOTIFICATIONS runtime dialog.\n if (this.debug) console.log(\"[paywallo-push] requestPermission Android 13+\");\n const raw = await this.bridge.requestPermission();\n const status = mapPermissionStatus(raw);\n this.emitOsEvent(status);\n return status;\n }\n\n async getStatus(): Promise<PushPermissionStatus> {\n const raw = await this.bridge.hasPermission();\n const status = mapPermissionStatus(raw);\n if (this.debug) console.log(\"[paywallo-push] getStatus:\", status);\n return status;\n }\n\n /**\n * Soft prompt flow — SDK never renders UI. Returns a handle with accept/reject\n * the consumer calls from its own bottom sheet / modal. Emits prompt events\n * via the injected tracker.\n */\n requestPermissionWithPrePrompt(opts: PrePromptOptions): PrePromptHandle {\n if (this.debug) console.log(\"[paywallo-push] pre-prompt shown\");\n this.emitPromptEvent(\"prompt_shown\");\n\n let settled = false;\n\n const accept = async (): Promise<PushPermissionStatus> => {\n if (settled) return this.getStatus();\n settled = true;\n this.emitPromptEvent(\"soft_accepted\");\n if (this.debug) console.log(\"[paywallo-push] pre-prompt accepted\");\n return this.requestPermission({ provisional: opts.provisional });\n };\n\n const reject = (): PushPermissionStatus => {\n if (settled) return \"notDetermined\";\n settled = true;\n this.emitPromptEvent(\"soft_rejected\");\n if (this.debug) console.log(\"[paywallo-push] pre-prompt rejected\");\n return \"notDetermined\";\n };\n\n return {\n title: opts.title,\n body: opts.body,\n acceptLabel: opts.acceptLabel,\n rejectLabel: opts.rejectLabel,\n accept,\n reject,\n };\n }\n\n private emitPromptEvent(event: PromptEventType): void {\n try {\n this.tracker?.trackPromptEvent(event);\n } catch (err) {\n if (this.debug) console.log(\"[paywallo-push] prompt tracker error:\", err);\n }\n }\n\n private emitOsEvent(status: PushPermissionStatus): void {\n if (status === \"granted\" || status === \"provisional\") {\n this.emitPromptEvent(\"os_granted\");\n } else if (status === \"denied\") {\n this.emitPromptEvent(\"os_denied\");\n }\n }\n\n private coerceTracker(\n tracker: PrePromptTracker | NotificationEventTracker | null | undefined\n ): PrePromptTracker | null {\n if (!tracker) return null;\n if (typeof (tracker as PrePromptTracker).trackPromptEvent === \"function\") {\n return tracker as PrePromptTracker;\n }\n // NotificationEventTracker has no prompt channel — wrap as no-op so DI stays optional.\n return null;\n }\n}\n\nexport const createPermissionManager = (\n bridge: IPushBridge,\n opts: { debug?: boolean; tracker?: PrePromptTracker | NotificationEventTracker; platform?: RNPlatform } = {}\n): PermissionManager => new PermissionManager(bridge, opts);\n","export const DEFAULT_API_URL = \"https://panel.lucasqueiroga.shop\";\nexport const DEFAULT_WEB_URL = \"https://paywallo.com.br\";\n","export type NotificationsEnvironment = \"sandbox\" | \"production\";\n\nexport interface NotificationsConfig {\n debug?: boolean;\n environment?: NotificationsEnvironment;\n apiBaseUrl?: string;\n}\n\nimport { DEFAULT_API_URL } from \"../../core/constants\";\n\nexport const DEFAULT_API_BASE_URL = DEFAULT_API_URL;\nexport const SANDBOX_API_BASE_URL = DEFAULT_API_URL;\n\nexport function resolveApiBaseUrl(config: NotificationsConfig): string {\n if (config.apiBaseUrl) return config.apiBaseUrl;\n if (config.environment === \"sandbox\") return SANDBOX_API_BASE_URL;\n return DEFAULT_API_BASE_URL;\n}\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nconst DOMAIN = \"notifications\";\n\nexport const NOTIFICATIONS_ERROR_CODES = {\n TOKEN_UNAVAILABLE: \"TOKEN_UNAVAILABLE\",\n PERMISSION_DENIED: \"PERMISSION_DENIED\",\n REGISTRATION_FAILED: \"REGISTRATION_FAILED\",\n NOT_INITIALIZED: \"NOT_INITIALIZED\",\n ABORTED: \"ABORTED\",\n} as const;\n\nexport type NotificationsErrorCode =\n (typeof NOTIFICATIONS_ERROR_CODES)[keyof typeof NOTIFICATIONS_ERROR_CODES];\n\nexport class NotificationsError extends PaywalloError {\n readonly details?: unknown;\n\n constructor(code: NotificationsErrorCode, message: string, details?: unknown) {\n super(DOMAIN, code, message);\n this.name = \"NotificationsError\";\n this.details = details;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class TokenUnavailableError extends NotificationsError {\n constructor(message = \"FCM token not available\") {\n super(NOTIFICATIONS_ERROR_CODES.TOKEN_UNAVAILABLE, message);\n this.name = \"TokenUnavailableError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class PermissionDeniedError extends NotificationsError {\n constructor(message = \"Push notification permission denied\") {\n super(NOTIFICATIONS_ERROR_CODES.PERMISSION_DENIED, message);\n this.name = \"PermissionDeniedError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class RegistrationFailedError extends NotificationsError {\n constructor(message = \"Token registration failed\", details?: unknown) {\n super(NOTIFICATIONS_ERROR_CODES.REGISTRATION_FAILED, message, details);\n this.name = \"RegistrationFailedError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { Platform } from \"react-native\";\nimport { NotificationsError, NOTIFICATIONS_ERROR_CODES } from \"./NotificationsError\";\nimport type { PushPermissionStatus } from \"./types\";\n\n// AuthorizationStatus from Firebase Messaging\nexport const AUTH_STATUS = {\n NOT_DETERMINED: -1,\n DENIED: 0,\n AUTHORIZED: 1,\n PROVISIONAL: 2,\n} as const;\n\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new NotificationsError(NOTIFICATIONS_ERROR_CODES.ABORTED, \"aborted\"));\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = (): void => {\n clearTimeout(timer);\n reject(new NotificationsError(NOTIFICATIONS_ERROR_CODES.ABORTED, \"aborted\"));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nconst LOCALE_WHITELIST = [\"pt\", \"en\", \"es\"] as const;\ntype SupportedLocale = (typeof LOCALE_WHITELIST)[number];\n\nfunction clampLocale(raw: string): SupportedLocale {\n const code = raw.slice(0, 2).toLowerCase();\n return (LOCALE_WHITELIST as readonly string[]).includes(code) ? (code as SupportedLocale) : \"en\";\n}\n\nexport function getLocale(): SupportedLocale {\n try {\n const raw = Intl.DateTimeFormat().resolvedOptions().locale ?? \"en\";\n return clampLocale(raw);\n } catch {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { getLocales } = require(\"expo-localization\") as { getLocales: () => Array<{ languageCode: string | null }> };\n const code = getLocales()[0]?.languageCode ?? \"en\";\n return clampLocale(code);\n } catch {\n return \"en\";\n }\n }\n}\n\nexport function getTimezone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone ?? \"UTC\";\n } catch {\n return \"UTC\";\n }\n}\n\nexport function mapPermissionStatus(status: number): PushPermissionStatus {\n switch (status) {\n case AUTH_STATUS.AUTHORIZED:\n return \"granted\";\n case AUTH_STATUS.DENIED:\n return \"denied\";\n case AUTH_STATUS.PROVISIONAL:\n return \"provisional\";\n default:\n return \"notDetermined\";\n }\n}\n\nexport function detectPlatform(): \"ios\" | \"android\" {\n return Platform.OS === \"ios\" ? \"ios\" : \"android\";\n}\n\nexport function detectEnvironment(): \"sandbox\" | \"production\" {\n return typeof __DEV__ !== \"undefined\" && __DEV__ ? \"sandbox\" : \"production\";\n}\n\n/**\n * Returns the host app's version string (\"1.2.3\") via the native device-info\n * bridge, best-effort. Returns \"unknown\" if the bridge or module is\n * unavailable — never throws.\n */\nexport async function getAppVersion(): Promise<string> {\n try {\n const { collectDeviceInfo } = await import(\"../../utils/deviceInfo\");\n const info = await collectDeviceInfo();\n return info.appVersion && info.appVersion !== \"0.0.0\" ? info.appVersion : \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n","/**\n * Build-time constant injected by tsup (and vitest for tests) from\n * `package.json.version`. Keeps the SDK version in a single source of truth —\n * bumping `package.json` automatically updates every `x-sdk-version` header\n * without code changes.\n *\n * Declared as a global so bundlers can replace it textually at build time.\n * Fallback to \"0.0.0-dev\" if the bundler did not perform the replacement\n * (e.g. running directly via ts-node without the define step).\n */\ndeclare const __PAYWALLO_SDK_VERSION__: string | undefined;\n\nfunction resolveVersion(): string {\n try {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (typeof __PAYWALLO_SDK_VERSION__ !== \"undefined\" && __PAYWALLO_SDK_VERSION__) {\n return __PAYWALLO_SDK_VERSION__;\n }\n } catch {\n // ReferenceError: identifier not defined — fall through\n }\n return \"0.0.0-dev\";\n}\n\nexport const SDK_VERSION: string = resolveVersion();\n","import type { HttpClient } from \"../../core/http/HttpClient\";\nimport type { SecureStorage } from \"../../core/storage/SecureStorage\";\nimport type { DeviceTokenRegistration } from \"./types\";\nimport { RegistrationFailedError } from \"./NotificationsError\";\nimport { getLocale, getTimezone, detectPlatform, getAppVersion, detectEnvironment } from \"./utils\";\nimport { SDK_VERSION } from \"../../core/version\";\n\nexport const FCM_TOKEN_KEY = \"@panel:push_token\";\nexport const TOKEN_ENDPOINT = \"/sdk/push-tokens\";\n\ninterface TokenRegistrationDeps {\n httpClient: HttpClient | null;\n secureStorage: SecureStorage | null;\n appKey: string | null;\n getDeviceId: (() => string | null) | null;\n getDistinctId: (() => string) | null;\n debug: boolean;\n}\n\nexport async function persistToken(\n secureStorage: SecureStorage | null,\n token: string\n): Promise<void> {\n try {\n if (secureStorage) {\n await secureStorage.set(FCM_TOKEN_KEY, token);\n }\n } catch {\n // non-fatal\n }\n}\n\nexport async function clearPersistedToken(\n secureStorage: SecureStorage | null\n): Promise<void> {\n try {\n await secureStorage?.remove(FCM_TOKEN_KEY);\n } catch {\n // non-fatal\n }\n}\n\nasync function buildRegistration(\n token: string,\n getDeviceId: (() => string | null) | null,\n getDistinctId: (() => string) | null\n): Promise<DeviceTokenRegistration> {\n const appVersion = await getAppVersion();\n return {\n token,\n platform: detectPlatform(),\n distinct_id: getDistinctId?.() ?? \"\",\n app_version: appVersion,\n sdk_version: SDK_VERSION,\n deviceId: getDeviceId?.() ?? undefined,\n locale: getLocale(),\n timezone: getTimezone(),\n environment: detectEnvironment(),\n };\n}\n\nexport async function registerToken(\n deps: TokenRegistrationDeps,\n token: string\n): Promise<void> {\n const { httpClient, appKey, getDeviceId, getDistinctId, debug } = deps;\n if (!httpClient || !appKey) {\n if (debug) console.warn(\"[Paywallo PUSH] httpClient not ready, skipping token registration\");\n return;\n }\n\n const registration = await buildRegistration(token, getDeviceId, getDistinctId);\n\n try {\n // Sent direct via HTTP (not through EventBatcher) — token registration is\n // critical and must not wait in a batch window. HttpClient already has\n // its own retry/backoff for network errors.\n await httpClient.post(\n TOKEN_ENDPOINT,\n registration,\n { headers: { \"X-App-Key\": appKey } }\n );\n if (debug) console.warn(\"[Paywallo PUSH] token registered successfully\");\n } catch (err) {\n if (debug) console.warn(\"[Paywallo PUSH] token registration failed:\", err);\n throw new RegistrationFailedError(\"Token registration failed\", err);\n }\n}\n\nexport async function unregisterToken(\n httpClient: HttpClient | null,\n appKey: string | null,\n debug: boolean\n): Promise<void> {\n if (!httpClient || !appKey) return;\n try {\n await httpClient.request(TOKEN_ENDPOINT, {\n method: \"DELETE\",\n headers: { \"X-App-Key\": appKey },\n timeout: 10000,\n });\n } catch (err) {\n if (debug) console.warn(\"[Paywallo PUSH] optOut error:\", err);\n }\n}\n","/**\n * Token capture/register/unregister helpers extracted from NotificationsManager\n * to keep that class within the 300-line limit.\n */\nimport type { HttpClient } from \"../../core/http/HttpClient\";\nimport type { SecureStorage } from \"../../core/storage/SecureStorage\";\nimport type { IPushBridge } from \"./bridges/types\";\nimport { sleep } from \"./utils\";\nimport {\n clearPersistedToken,\n persistToken,\n registerToken,\n unregisterToken,\n} from \"./TokenRegistration\";\n\nconst APNS_RETRY_COUNT = 3;\nconst APNS_RETRY_DELAY_MS = 500;\n\nexport interface TokenOpsDeps {\n httpClient: HttpClient | null;\n secureStorage: SecureStorage | null;\n appKey: string | null;\n getDeviceId: (() => string | null) | null;\n getDistinctId: (() => string) | null;\n debug: boolean;\n}\n\nexport async function registerAndPersistToken(\n deps: TokenOpsDeps,\n token: string,\n): Promise<void> {\n await persistToken(deps.secureStorage, token);\n await registerToken(\n {\n httpClient: deps.httpClient,\n secureStorage: deps.secureStorage,\n appKey: deps.appKey,\n getDeviceId: deps.getDeviceId,\n getDistinctId: deps.getDistinctId,\n debug: deps.debug,\n },\n token,\n );\n}\n\ninterface TokenRefreshBridge {\n onTokenRefresh(cb: (token: string) => void): () => void;\n}\n\nexport function subscribeTokenRefresh(\n bridge: TokenRefreshBridge,\n deps: TokenOpsDeps,\n onToken: (token: string) => void,\n): () => void {\n return bridge.onTokenRefresh((newToken) => {\n if (deps.debug) console.warn(\"[Paywallo PUSH] token refreshed\");\n onToken(newToken);\n persistToken(deps.secureStorage, newToken).catch(() => undefined);\n registerToken(\n {\n httpClient: deps.httpClient,\n secureStorage: deps.secureStorage,\n appKey: deps.appKey,\n getDeviceId: deps.getDeviceId,\n getDistinctId: deps.getDistinctId,\n debug: deps.debug,\n },\n newToken,\n ).catch(() => undefined);\n });\n}\n\nexport async function optOutToken(\n httpClient: HttpClient | null,\n secureStorage: SecureStorage | null,\n appKey: string | null,\n debug: boolean,\n): Promise<void> {\n await unregisterToken(httpClient, appKey, debug);\n await clearPersistedToken(secureStorage);\n}\n\nexport async function invalidateLocalTokenStorage(\n secureStorage: SecureStorage | null,\n debug: boolean,\n): Promise<void> {\n await clearPersistedToken(secureStorage);\n if (debug) console.log(\"[Paywallo PUSH] local token invalidated\");\n}\n\nexport async function waitForApnsToken(bridge: IPushBridge, debug: boolean): Promise<void> {\n let apnsToken: string | null = null;\n for (let i = 0; i < APNS_RETRY_COUNT; i++) {\n apnsToken = await bridge.getAPNSToken();\n if (apnsToken) break;\n if (i < APNS_RETRY_COUNT - 1) await sleep(APNS_RETRY_DELAY_MS);\n }\n if (debug) console.log(\"[Paywallo PUSH] APNS token available:\", !!apnsToken);\n}\n\nexport async function captureAndRegisterToken(\n bridge: IPushBridge,\n deps: TokenOpsDeps,\n onTokenCaptured: (token: string) => void,\n subscribeRefresh: () => void,\n): Promise<void> {\n await waitForApnsToken(bridge, deps.debug);\n const token = await bridge.getToken();\n if (!token) {\n if (deps.debug) console.warn(\"[Paywallo PUSH] token unavailable after grant\");\n return;\n }\n onTokenCaptured(token);\n await registerAndPersistToken(deps, token);\n subscribeRefresh();\n}\n","import type { HttpClient } from \"../../core/http/HttpClient\";\nimport type { SecureStorage } from \"../../core/storage/SecureStorage\";\nimport type { PushPermissionStatus, NotificationPayload } from \"./types\";\nimport { NativePushBridge } from \"./bridges/NativePushBridge\";\nimport type { IPushBridge } from \"./bridges/types\";\nimport { NotificationEventTracker, type EventBatcherLike } from \"./NotificationEventTracker\";\nimport { registerBackgroundMessageHandler } from \"./handlers/BackgroundHandler\";\nimport {\n buildHandlers,\n getInitialNotificationPayload,\n} from \"./NotificationHandlerSetup\";\nimport type { FcmRemoteMessage } from \"./bridges/types\";\nimport { PermissionManager } from \"./PermissionManager\";\nimport type { PrePromptHandle, PrePromptOptions, RNPlatform } from \"./PermissionManager\";\nimport type { NotificationsConfig } from \"./config\";\nimport { resolveApiBaseUrl } from \"./config\";\nimport { mapPermissionStatus } from \"./utils\";\nimport {\n registerAndPersistToken,\n subscribeTokenRefresh as subscribeTokenRefreshOp,\n optOutToken,\n invalidateLocalTokenStorage,\n waitForApnsToken,\n captureAndRegisterToken,\n type TokenOpsDeps,\n} from \"./NotificationTokenOps\";\n\nexport type { IPushBridge };\n\ninterface HandlersConfig {\n eventBatcher: EventBatcherLike;\n}\n\ninterface NotificationsManagerConfig {\n appKey: string;\n apiBaseUrl?: string;\n debug?: boolean;\n environment?: NotificationsConfig[\"environment\"];\n}\n\ninterface NotificationsManagerDeps {\n httpClient?: HttpClient;\n secureStorage?: SecureStorage;\n /** Generic bridge — takes precedence over fcmBridge if both are provided. */\n bridge?: IPushBridge;\n /** Kept for backwards compatibility — use bridge instead. */\n fcmBridge?: IPushBridge;\n getDeviceId?: () => string | null;\n getDistinctId?: () => string;\n platform?: RNPlatform;\n}\n\nclass NotificationsManager {\n private isInitialized = false;\n private permissionStatus: PushPermissionStatus = \"notDetermined\";\n private currentToken: string | null = null;\n private debug = false;\n\n private httpClient: HttpClient | null = null;\n private secureStorage: SecureStorage | null = null;\n private bridge: IPushBridge;\n private getDeviceId: (() => string | null) | null = null;\n private getDistinctId: (() => string) | null = null;\n private appKey: string | null = null;\n private apiBaseUrl: string | null = null;\n\n private tokenRefreshCleanup: (() => void) | null = null;\n private foregroundCleanup: (() => void) | null = null;\n private pendingHandlersConfig: HandlersConfig | null = null;\n private tracker: NotificationEventTracker | null = null;\n private permissionManager: PermissionManager;\n\n private receivedCallbacks: Array<(payload: NotificationPayload) => void> = [];\n private openedCallbacks: Array<(payload: NotificationPayload) => void> = [];\n private dismissedCallbacks: Array<(payload: NotificationPayload) => void> = [];\n\n constructor(deps: NotificationsManagerDeps = {}) {\n this.bridge = deps.bridge ?? deps.fcmBridge ?? new NativePushBridge();\n if (deps.httpClient) this.httpClient = deps.httpClient;\n if (deps.secureStorage) this.secureStorage = deps.secureStorage;\n if (deps.getDeviceId) this.getDeviceId = deps.getDeviceId;\n if (deps.getDistinctId) this.getDistinctId = deps.getDistinctId;\n this.permissionManager = new PermissionManager(this.bridge, { platform: deps.platform });\n }\n\n injectDeps(deps: {\n httpClient: HttpClient;\n secureStorage: SecureStorage;\n getDeviceId: () => string | null;\n getDistinctId?: () => string;\n }): void {\n this.httpClient = deps.httpClient;\n this.secureStorage = deps.secureStorage;\n this.getDeviceId = deps.getDeviceId;\n if (deps.getDistinctId) this.getDistinctId = deps.getDistinctId;\n }\n\n async initialize(config: NotificationsManagerConfig): Promise<void> {\n this.applyConfig(config);\n\n // Apply deferred handlers if setupHandlers was called before initialize\n if (this.pendingHandlersConfig) {\n this.setupHandlers(this.pendingHandlersConfig);\n this.pendingHandlersConfig = null;\n }\n\n await this.refreshPermissionStatus();\n await waitForApnsToken(this.bridge, this.debug);\n\n const token = await this.bridge.getToken();\n if (!token) {\n if (this.debug) console.warn(\"[Paywallo PUSH] token unavailable, skipping registration\");\n this.isInitialized = true;\n return;\n }\n if (this.debug) console.warn(\"[Paywallo PUSH] token acquired:\", token);\n this.currentToken = token;\n await this.doRegisterToken(token);\n this.subscribeTokenRefresh();\n this.isInitialized = true;\n }\n\n private applyConfig(config: NotificationsManagerConfig): void {\n this.appKey = config.appKey;\n this.apiBaseUrl = resolveApiBaseUrl({\n apiBaseUrl: config.apiBaseUrl,\n environment: config.environment,\n });\n this.debug = config.debug ?? false;\n this.permissionManager.setDebug(this.debug);\n }\n\n private async refreshPermissionStatus(): Promise<void> {\n const permStatus = await this.bridge.hasPermission();\n this.permissionStatus = mapPermissionStatus(permStatus);\n if (this.debug) console.warn(\"[Paywallo PUSH] permission status:\", this.permissionStatus);\n }\n\n private tokenDeps(): TokenOpsDeps {\n return {\n httpClient: this.httpClient,\n secureStorage: this.secureStorage,\n appKey: this.appKey,\n getDeviceId: this.getDeviceId,\n getDistinctId: this.getDistinctId,\n debug: this.debug,\n };\n }\n\n private async doRegisterToken(token: string): Promise<void> {\n await registerAndPersistToken(this.tokenDeps(), token);\n }\n\n private subscribeTokenRefresh(): void {\n this.tokenRefreshCleanup = subscribeTokenRefreshOp(\n this.bridge,\n this.tokenDeps(),\n (newToken) => { this.currentToken = newToken; },\n );\n }\n\n /** Deletes token on server + locally (explicit user opt-out). */\n async optOut(): Promise<void> {\n await optOutToken(this.httpClient, this.secureStorage, this.appKey, this.debug);\n this.currentToken = null;\n if (this.debug) console.warn(\"[Paywallo PUSH] opted out\");\n }\n\n /** Clears token locally without server call (used on sign-out/reset). */\n async invalidateLocalToken(): Promise<void> {\n await invalidateLocalTokenStorage(this.secureStorage, this.debug);\n this.currentToken = null;\n }\n\n async getPermissionStatus(): Promise<PushPermissionStatus> {\n const status = await this.permissionManager.getStatus();\n this.permissionStatus = status;\n return status;\n }\n\n async requestPermission(options?: { provisional?: boolean }): Promise<PushPermissionStatus> {\n return this.permissionManager.requestPermission(options);\n }\n\n /** Requests OS permission and, on success, captures + registers the push token. */\n async requestPushPermission(options?: { provisional?: boolean }): Promise<PushPermissionStatus> {\n if (this.debug) console.warn(\"[Paywallo PUSH] requestPushPermission called\");\n try {\n const status = await this.permissionManager.requestPermission(options);\n if (this.debug) console.warn(\"[Paywallo PUSH] permissionManager returned:\", status);\n this.permissionStatus = status;\n if (status === \"granted\" || status === \"provisional\") {\n if (this.debug) console.warn(\"[Paywallo PUSH] permission granted — capturing token...\");\n await this.captureAndRegisterToken();\n if (this.debug) console.warn(\"[Paywallo PUSH] token capture complete\");\n } else {\n if (this.debug) console.warn(\"[Paywallo PUSH] permission not granted, skipping token register:\", status);\n }\n return status;\n } catch (err) {\n console.warn(\"[Paywallo PUSH] requestPushPermission CRASHED:\", err instanceof Error ? err.message : String(err));\n throw err;\n }\n }\n\n private async captureAndRegisterToken(): Promise<void> {\n await captureAndRegisterToken(\n this.bridge,\n this.tokenDeps(),\n (token) => { this.currentToken = token; },\n () => { if (!this.tokenRefreshCleanup) this.subscribeTokenRefresh(); },\n );\n }\n\n requestPermissionWithPrePrompt(opts: PrePromptOptions): PrePromptHandle {\n return this.permissionManager.requestPermissionWithPrePrompt(opts);\n }\n\n isReady(): boolean {\n return this.isInitialized;\n }\n\n markInitialized(): void {\n this.isInitialized = true;\n }\n\n getCurrentToken(): string | null {\n return this.currentToken;\n }\n\n setupHandlers(config: HandlersConfig): void {\n // If called before initialize (appKey not set yet), defer until applyConfig runs\n if (!this.appKey) {\n this.pendingHandlersConfig = config;\n return;\n }\n const result = buildHandlers({\n appKey: this.appKey,\n apiBaseUrl: this.apiBaseUrl,\n debug: this.debug,\n bridge: this.bridge,\n secureStorage: this.secureStorage,\n getDeviceId: this.getDeviceId,\n permissionManager: this.permissionManager,\n receivedCallbacks: this.receivedCallbacks,\n openedCallbacks: this.openedCallbacks,\n dismissedCallbacks: this.dismissedCallbacks,\n eventBatcher: config.eventBatcher,\n });\n if (!result) return;\n this.tracker = result.tracker;\n this.foregroundCleanup = result.foregroundCleanup;\n }\n\n onReceived(cb: (payload: NotificationPayload) => void): void {\n this.receivedCallbacks.push(cb);\n }\n\n onOpened(cb: (payload: NotificationPayload) => void): void {\n this.openedCallbacks.push(cb);\n }\n\n onDismissed(cb: (payload: NotificationPayload) => void): void {\n this.dismissedCallbacks.push(cb);\n }\n\n async getInitialNotification(): Promise<NotificationPayload | null> {\n return getInitialNotificationPayload(this.bridge);\n }\n\n async flushEvents(): Promise<void> {\n await this.tracker?.flush();\n }\n\n registerBackgroundHandler(cb: (message: FcmRemoteMessage) => Promise<void>): void {\n registerBackgroundMessageHandler(cb);\n }\n\n destroy(): void {\n this.tokenRefreshCleanup?.(); this.tokenRefreshCleanup = null;\n this.foregroundCleanup?.(); this.foregroundCleanup = null;\n this.tracker = null;\n this.receivedCallbacks = []; this.openedCallbacks = []; this.dismissedCallbacks = [];\n this.isInitialized = false; this.currentToken = null;\n }\n}\n\nexport { NotificationsManager };\nexport type { NotificationsManagerConfig, NotificationsManagerDeps };\nexport const notificationsManager = new NotificationsManager();\n","export { notificationsManager, NotificationsManager } from \"./NotificationsManager\";\nexport type { NotificationsManagerConfig } from \"./NotificationsManager\";\nexport { NativePushBridge } from \"./bridges/NativePushBridge\";\nexport type { IPushBridge } from \"./bridges/types\";\nexport { PermissionManager, createPermissionManager } from \"./PermissionManager\";\nexport type { PrePromptOptions, PrePromptHandle } from \"./PermissionManager\";\nexport {\n DEFAULT_API_BASE_URL,\n SANDBOX_API_BASE_URL,\n resolveApiBaseUrl,\n} from \"./config\";\nexport type { NotificationsEnvironment } from \"./config\";\nexport {\n NotificationsError,\n TokenUnavailableError,\n PermissionDeniedError,\n RegistrationFailedError,\n NOTIFICATIONS_ERROR_CODES,\n} from \"./NotificationsError\";\nexport type { NotificationsErrorCode } from \"./NotificationsError\";\nexport type {\n PushPlatform,\n PushPermissionStatus,\n NotificationEventType,\n DeviceTokenRegistration,\n NotificationPayload,\n NotificationListener,\n} from \"./types\";\n","export { SessionManager, sessionManager } from \"./SessionManager\";\nexport { SessionError, SESSION_ERROR_CODES } from \"./SessionError\";\nexport type { SessionState, SessionConfig, EmergencyPaywallHandler } from \"./types\";\nexport { waitForDistinctId } from \"./distinctIdGuard\";\nexport type { DistinctIdProvider } from \"./distinctIdGuard\";\nexport {\n trackSessionStart,\n trackSessionEnd,\n trackAppOpen,\n trackAppBackground,\n} from \"./sessionTracking\";\n","import type {\n CampaignResponse,\n CampaignResult,\n IdentifyOptions,\n PaywallResult,\n RestoreResult,\n Subscription,\n UserProperties,\n} from \"../types\";\n\nimport type { ApiClient } from \"./ApiClient\";\nimport type { PaywalloInitConfig } from \"./types\";\n\nexport type PendingIdentify = IdentifyOptions | UserProperties | undefined;\n\nexport type PaywallPresenter = (placement: string) => Promise<PaywallResult>;\nexport type CampaignPresenter = (campaign: CampaignResponse) => Promise<CampaignResult>;\nexport type SubscriptionGetter = () => Promise<Subscription | null>;\nexport type ActiveChecker = () => Promise<boolean>;\nexport type RestoreHandler = () => Promise<RestoreResult>;\n\n/**\n * Mutable state shared between `PaywalloClient`, `PaywalloInitializer` and\n * `PaywalloLifecycle`. Kept intentionally as a plain interface so helper\n * modules can mutate fields without coupling to the facade class.\n */\nexport interface PaywalloState {\n config: import(\"../types\").PaywalloConfig | null;\n apiClient: ApiClient | null;\n initPromise: Promise<void> | null;\n readyPromise: Promise<void> | null;\n resolveReady: (() => void) | null;\n\n paywallPresenter: PaywallPresenter | null;\n campaignPresenter: CampaignPresenter | null;\n subscriptionGetter: SubscriptionGetter | null;\n activeChecker: ActiveChecker | null;\n restoreHandler: RestoreHandler | null;\n\n lastOnboardingStepTimestamp: number | null;\n pendingConfig: PaywalloInitConfig | null;\n networkCleanup: (() => void) | null;\n initAttempts: number;\n autoPreloadedPlacement: string | null;\n autoPreloadPlacementPromise: Promise<string | null> | null;\n sessionFlagsMap: Map<string, string | null>;\n // Identify calls that arrived before init completed — replayed inside\n // `doInit` after identity.initialize(), before session.initialize().\n pendingIdentifies: PendingIdentify[];\n}\n\nexport const MAX_INIT_RETRIES = 3;\nexport const RETRY_DELAYS = [2000, 5000, 10000];\n\nexport function createPaywalloState(): PaywalloState {\n return {\n config: null,\n apiClient: null,\n initPromise: null,\n readyPromise: null,\n resolveReady: null,\n paywallPresenter: null,\n campaignPresenter: null,\n subscriptionGetter: null,\n activeChecker: null,\n restoreHandler: null,\n lastOnboardingStepTimestamp: null,\n pendingConfig: null,\n networkCleanup: null,\n initAttempts: 0,\n autoPreloadedPlacement: null,\n autoPreloadPlacementPromise: null,\n sessionFlagsMap: new Map<string, string | null>(),\n pendingIdentifies: [],\n };\n}\n","import type { AllPlansResponse, CachedPlans } from \"./types\";\n\nconst DEFAULT_TTL = 5 * 60 * 1000; // 5 minutes\n\nexport class PlanCache {\n private cache: CachedPlans | null = null;\n private ttl: number = DEFAULT_TTL;\n\n get(): CachedPlans | null {\n if (!this.cache) return null;\n const isStale = Date.now() - this.cache.cachedAt > this.ttl;\n return { ...this.cache, isStale };\n }\n\n set(data: AllPlansResponse): void {\n this.cache = { data, cachedAt: Date.now(), isStale: false };\n }\n\n invalidate(): void {\n this.cache = null;\n }\n\n setTTL(ttl: number): void {\n this.ttl = ttl;\n }\n}\n\nexport const planCache = new PlanCache();\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class PlanError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"plan\", code, message);\n this.name = \"PlanError\";\n }\n}\n\nexport const PLAN_ERROR_CODES = {\n NOT_INITIALIZED: \"PLAN_NOT_INITIALIZED\",\n FETCH_FAILED: \"PLAN_FETCH_FAILED\",\n} as const;\n","import type { ApiClient } from \"../../core/ApiClient\";\nimport { planCache } from \"./PlanCache\";\nimport { PLAN_ERROR_CODES, PlanError } from \"./PlanError\";\nimport type { AllPlansResponse, Plan, PlanServiceConfig } from \"./types\";\n\ninterface RawPlanProduct {\n id: string;\n name: string;\n description: string | null;\n type: string;\n apple_product_id: string | null;\n google_product_id: string | null;\n billing_period: string | null;\n trial_days: number | null;\n price_usd: number | null;\n regional_prices: unknown;\n display_order: number;\n is_active: boolean;\n}\n\ninterface RawPlan {\n id: string;\n identifier: string;\n name: string;\n description: string | null;\n metadata: unknown;\n products: RawPlanProduct[];\n}\n\ninterface RawCurrentPlanResponse {\n data: { plan: RawPlan | null };\n}\n\ninterface RawAllPlansResponse {\n data: { plans: RawPlan[]; current_identifier: string | null };\n}\n\nfunction mapProduct(raw: RawPlanProduct): Plan[\"products\"][number] {\n return {\n id: raw.id,\n name: raw.name,\n description: raw.description,\n type: raw.type,\n appleProductId: raw.apple_product_id,\n googleProductId: raw.google_product_id,\n billingPeriod: raw.billing_period,\n trialDays: raw.trial_days,\n priceUsd: raw.price_usd,\n regionalPrices: raw.regional_prices,\n displayOrder: raw.display_order,\n isActive: raw.is_active,\n };\n}\n\nfunction mapPlan(raw: RawPlan): Plan {\n return {\n id: raw.id,\n identifier: raw.identifier,\n name: raw.name,\n description: raw.description,\n metadata: raw.metadata,\n products: raw.products.map(mapProduct),\n };\n}\n\nexport class PlanService {\n private config: PlanServiceConfig | null = null;\n private cache = planCache;\n\n init(config: PlanServiceConfig): void {\n this.config = config;\n }\n\n async getCurrentPlan(forceRefresh = false): Promise<Plan | null> {\n if (!forceRefresh) {\n const cached = this.cache.get();\n if (cached && !cached.isStale) {\n const current = cached.data.plans.find(\n (p) => p.identifier === cached.data.currentIdentifier\n );\n return current ?? null;\n }\n }\n return this.fetchCurrentPlan();\n }\n\n async getAllPlans(forceRefresh = false): Promise<AllPlansResponse> {\n if (!forceRefresh) {\n const cached = this.cache.get();\n if (cached && !cached.isStale) return cached.data;\n }\n return this.fetchAllPlans();\n }\n\n invalidateCache(): void {\n this.cache.invalidate();\n }\n\n private getApiClient(): ApiClient {\n if (!this.config) {\n throw new PlanError(PLAN_ERROR_CODES.NOT_INITIALIZED, \"PlanService not initialized. Call Paywallo.init() first\");\n }\n return this.config.apiClient;\n }\n\n private async fetchCurrentPlan(): Promise<Plan | null> {\n try {\n const res = await this.getApiClient().get<RawCurrentPlanResponse>(\"/sdk/plans\");\n if (!res.ok) {\n this.log(\"fetchCurrentPlan failed\", res.status);\n return null;\n }\n const raw = res.data.data.plan;\n return raw ? mapPlan(raw) : null;\n } catch (err) {\n this.log(\"fetchCurrentPlan error\", err);\n return null;\n }\n }\n\n private async fetchAllPlans(): Promise<AllPlansResponse> {\n try {\n const res = await this.getApiClient().get<RawAllPlansResponse>(\"/sdk/plans/all\");\n if (!res.ok) {\n this.log(\"fetchAllPlans failed\", res.status);\n return { plans: [], currentIdentifier: null };\n }\n const result: AllPlansResponse = {\n plans: res.data.data.plans.map(mapPlan),\n currentIdentifier: res.data.data.current_identifier,\n };\n this.cache.set(result);\n return result;\n } catch (err) {\n this.log(\"fetchAllPlans error\", err);\n return { plans: [], currentIdentifier: null };\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config?.debug) console.log(\"[Paywallo Plans]\", ...args);\n }\n}\n\nexport const planService = new PlanService();\n","export type {\n AllPlansResponse,\n CachedPlans,\n Plan,\n PlanProduct,\n PlanServiceConfig,\n PlansResponse,\n} from \"./types\";\nexport { PlanCache, planCache } from \"./PlanCache\";\nexport { PlanService, planService } from \"./PlanService\";\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class OnboardingError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"onboarding\", code, message);\n this.name = \"OnboardingError\";\n }\n}\n\nexport const ONBOARDING_ERROR_CODES = {\n NOT_INITIALIZED: \"ONBOARDING_NOT_INITIALIZED\",\n INVALID_STEP_NAME: \"ONBOARDING_INVALID_STEP_NAME\",\n} as const;\n","import { OnboardingError, ONBOARDING_ERROR_CODES } from \"./OnboardingError\";\nimport { OnboardingDropPayload, OnboardingStepPayload } from \"./types\";\n\n/**\n * Minimal surface the OnboardingManager needs from the unified event pipeline.\n * `PaywalloClient` satisfies this interface (forwarding to\n * `ApiClient.trackEvent` → `EventBatcher` → `/api/v1/events/batch`).\n */\nexport interface OnboardingEventPipeline {\n trackEvent(\n eventName: string,\n distinctId: string,\n properties?: Record<string, unknown>,\n timestamp?: number\n ): Promise<void>;\n getDistinctId(): string;\n}\n\ninterface OnboardingDepsConfig {\n pipeline: OnboardingEventPipeline;\n debug?: boolean;\n}\n\nexport class OnboardingManager {\n private pipeline: OnboardingEventPipeline | null = null;\n private debug = false;\n private lastStep: string | null = null;\n private finished = false;\n\n /**\n * Injects runtime dependencies. Called by PaywalloClient during init.\n */\n injectDeps(config: OnboardingDepsConfig): void {\n this.pipeline = config.pipeline;\n this.debug = config.debug ?? false;\n }\n\n /**\n * Tracks an onboarding step view.\n * Saves the step name internally for implicit drop detection on the backend.\n *\n * @param stepName - Unique name for this onboarding step.\n */\n async step(stepName: string): Promise<void> {\n this.assertConfig();\n this.validateStepName(stepName, \"step\");\n this.lastStep = stepName;\n const payload: Record<string, unknown> = {\n family: \"onboarding\",\n type: \"step\",\n ...(({ step_name: stepName } satisfies OnboardingStepPayload) as Record<string, unknown>),\n };\n return this.emit(\"onboarding\", payload, \"step\");\n }\n\n /**\n * Tracks successful completion of the onboarding flow.\n * Marks the flow as finished.\n */\n async complete(): Promise<void> {\n this.assertConfig();\n this.finished = true;\n return this.emit(\"onboarding\", { family: \"onboarding\", type: \"complete\" }, \"complete\");\n }\n\n /**\n * Tracks an explicit drop (abandonment) at the given step.\n * Marks the flow as finished.\n *\n * @param stepName - The step name where the user dropped off.\n */\n async drop(stepName: string): Promise<void> {\n this.assertConfig();\n this.validateStepName(stepName, \"drop\");\n this.finished = true;\n const payload: Record<string, unknown> = {\n family: \"onboarding\",\n type: \"drop\",\n ...(({ step_name: stepName } satisfies OnboardingDropPayload) as Record<string, unknown>),\n };\n return this.emit(\"onboarding\", payload, \"drop\");\n }\n\n /** Returns the last step name seen, or null if no step was tracked yet. */\n getLastStep(): string | null {\n return this.lastStep;\n }\n\n /** Returns whether the flow has been marked as finished (complete or drop). */\n isFinished(): boolean {\n return this.finished;\n }\n\n private async emit(\n eventName: string,\n properties: Record<string, unknown>,\n logLabel: string\n ): Promise<void> {\n const pipeline = this.pipeline!;\n const distinctId = pipeline.getDistinctId();\n if (!distinctId) {\n if (this.debug) console.log(`[Paywallo:Onboarding] skipped (no distinctId): ${logLabel}`);\n return;\n }\n await pipeline.trackEvent(eventName, distinctId, properties);\n if (this.debug) {\n console.log(`[Paywallo:Onboarding] event emitted: ${eventName}.${logLabel}`, properties);\n }\n }\n\n private assertConfig(): void {\n if (!this.pipeline) {\n throw new OnboardingError(\n ONBOARDING_ERROR_CODES.NOT_INITIALIZED,\n \"OnboardingManager not initialized. Call Paywallo.init() first.\"\n );\n }\n }\n\n private validateStepName(stepName: string, method: string): void {\n if (typeof stepName !== \"string\" || stepName.trim().length === 0) {\n throw new OnboardingError(\n ONBOARDING_ERROR_CODES.INVALID_STEP_NAME,\n `OnboardingManager.${method}(): stepName must be a non-empty string.`\n );\n }\n }\n}\n\nexport const onboardingManager = new OnboardingManager();\n","export { OnboardingManager, onboardingManager } from \"./OnboardingManager\";\nexport { OnboardingError, ONBOARDING_ERROR_CODES } from \"./OnboardingError\";\nexport type { OnboardingStepPayload, OnboardingDropPayload } from \"./types\";\n","import type { ApiClient } from \"../../core/ApiClient\";\n\nimport { clearPersistedHeartbeat, readPersistedHeartbeat } from \"./paywallHeartbeat\";\n\n/**\n * Recovery do heartbeat crash-safe (sub-fase 2.10).\n *\n * Chamada uma vez por boot do SDK (dentro de `PaywalloInitializer.doInit`),\n * DEPOIS do `apiClient` estar pronto mas ANTES de qualquer outra emissão de\n * paywall. Se existir um snapshot órfão no SecureStorage, significa que na\n * sessão anterior o processo morreu com um paywall aberto — emite o evento\n * canônico `paywall {type: \"closed\", close_reason: \"error\"}` com\n * `duration_s = lastSeen - presentedAt` (±5s dado o intervalo de heartbeat).\n *\n * Isso garante que `paywall_interactions.closedAt/durationS/variantId` nunca\n * ficam NULL mesmo em OOM, kill do sistema ou crash nativo.\n */\nexport async function recoverPaywallHeartbeat(\n apiClient: ApiClient,\n distinctId: string,\n sessionId: string | null,\n debug?: boolean,\n): Promise<boolean> {\n const snapshot = await readPersistedHeartbeat();\n if (!snapshot) return false;\n try {\n const closedAt = new Date(snapshot.lastSeen);\n const durationS = Math.max(0, Math.round((snapshot.lastSeen - snapshot.presentedAt) / 1000));\n await apiClient.trackEvent(\"paywall\", distinctId, {\n type: \"closed\",\n paywall_id: snapshot.paywallId,\n placement: snapshot.placement,\n closed_at: closedAt.toISOString(),\n duration_s: durationS,\n close_reason: \"error\",\n ...(snapshot.variantId && { variant_id: snapshot.variantId }),\n ...(snapshot.variantKey && { variant_key: snapshot.variantKey }),\n ...(snapshot.campaignId && { campaign_id: snapshot.campaignId }),\n ...(sessionId && { sessionId }),\n });\n if (debug) console.log(\"[Paywallo HEARTBEAT] recovered orphan paywall close\", {\n paywallId: snapshot.paywallId,\n durationS,\n });\n return true;\n } catch (err) {\n if (debug) console.log(\"[Paywallo HEARTBEAT] recovery failed\", err);\n return false;\n } finally {\n await clearPersistedHeartbeat();\n }\n}\n","import { SecureStorage } from \"../../core/storage/SecureStorage\";\n\nimport type { CachedSubscription, SubscriptionStatusResponse } from \"./types\";\n\nconst LEGACY_CACHE_KEY = \"@panel:subscription_cache\";\nconst CACHE_KEY_PREFIX = \"subscription_cache:\";\nconst CACHE_INDEX_KEY = \"subscription_cache:__index__\";\nconst DEFAULT_TTL = 24 * 60 * 60 * 1000;\n\nfunction keyFor(distinctId: string): string {\n return `${CACHE_KEY_PREFIX}${distinctId}`;\n}\n\nexport class SubscriptionCache {\n private ttl: number;\n private memoryCache: Map<string, CachedSubscription> = new Map();\n private storage: SecureStorage;\n private legacyCleanupDone = false;\n\n constructor(ttl: number = DEFAULT_TTL) {\n this.ttl = ttl;\n this.storage = new SecureStorage();\n }\n\n private async cleanupLegacyCache(): Promise<void> {\n if (this.legacyCleanupDone) return;\n this.legacyCleanupDone = true;\n try {\n await this.storage.remove(LEGACY_CACHE_KEY);\n } catch {\n }\n }\n\n async get(distinctId: string): Promise<CachedSubscription | null> {\n await this.cleanupLegacyCache();\n if (!distinctId) return null;\n\n const memEntry = this.memoryCache.get(distinctId);\n if (memEntry && !this.isExpired(memEntry)) {\n return memEntry;\n }\n\n try {\n const stored = await this.storage.get(keyFor(distinctId));\n if (!stored) {\n return null;\n }\n\n const parsed: unknown = JSON.parse(stored);\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n !(\"data\" in parsed) ||\n typeof (parsed as Record<string, unknown>).data !== \"object\" ||\n (parsed as Record<string, unknown>).data === null ||\n !(\"cachedAt\" in parsed) ||\n typeof (parsed as Record<string, unknown>).cachedAt !== \"number\"\n ) {\n await this.storage.remove(keyFor(distinctId));\n return null;\n }\n const cached = parsed as CachedSubscription;\n\n if (cached.data.subscription?.expiresAt) {\n cached.data.subscription.expiresAt = new Date(cached.data.subscription.expiresAt);\n }\n if (cached.data.subscription?.originalPurchaseDate) {\n cached.data.subscription.originalPurchaseDate = new Date(\n cached.data.subscription.originalPurchaseDate\n );\n }\n if (cached.data.subscription?.latestPurchaseDate) {\n cached.data.subscription.latestPurchaseDate = new Date(\n cached.data.subscription.latestPurchaseDate\n );\n }\n if (cached.data.subscription?.cancellationDate) {\n cached.data.subscription.cancellationDate = new Date(\n cached.data.subscription.cancellationDate\n );\n }\n if (cached.data.subscription?.gracePeriodExpiresAt) {\n cached.data.subscription.gracePeriodExpiresAt = new Date(\n cached.data.subscription.gracePeriodExpiresAt\n );\n }\n\n cached.isStale = this.isExpired(cached);\n if (!cached.isStale) {\n this.memoryCache.set(distinctId, cached);\n }\n\n return cached;\n } catch {\n return null;\n }\n }\n\n async set(distinctId: string, data: SubscriptionStatusResponse): Promise<void> {\n if (!distinctId) return;\n const cached: CachedSubscription = {\n data,\n cachedAt: Date.now(),\n isStale: false,\n };\n\n this.memoryCache.set(distinctId, cached);\n\n try {\n await this.storage.set(keyFor(distinctId), JSON.stringify(cached));\n await this.addToIndex(distinctId);\n } catch {\n }\n }\n\n private async addToIndex(distinctId: string): Promise<void> {\n try {\n const raw = await this.storage.get(CACHE_INDEX_KEY);\n const ids: string[] = raw ? (JSON.parse(raw) as string[]) : [];\n if (!ids.includes(distinctId)) {\n ids.push(distinctId);\n await this.storage.set(CACHE_INDEX_KEY, JSON.stringify(ids));\n }\n } catch {\n }\n }\n\n private async readIndex(): Promise<string[]> {\n try {\n const raw = await this.storage.get(CACHE_INDEX_KEY);\n if (!raw) return [];\n return JSON.parse(raw) as string[];\n } catch {\n return [];\n }\n }\n\n async invalidate(distinctId: string): Promise<void> {\n if (!distinctId) return;\n this.memoryCache.delete(distinctId);\n\n try {\n await this.storage.remove(keyFor(distinctId));\n } catch {\n }\n }\n\n async invalidateAll(): Promise<void> {\n // Collect keys from memory AND from the persisted index (survives restarts)\n const memKeys = Array.from(this.memoryCache.keys());\n const indexKeys = await this.readIndex();\n const allKeys = Array.from(new Set([...memKeys, ...indexKeys]));\n\n this.memoryCache.clear();\n\n await Promise.allSettled([\n this.storage.remove(LEGACY_CACHE_KEY),\n this.storage.remove(CACHE_INDEX_KEY),\n ...allKeys.map((k) => this.storage.remove(keyFor(k))),\n ]);\n }\n\n private isExpired(cached: CachedSubscription): boolean {\n return Date.now() - cached.cachedAt > this.ttl;\n }\n\n setTTL(ttl: number): void {\n this.ttl = ttl;\n }\n}\n\nexport const subscriptionCache = new SubscriptionCache();\n","import { SESSION_ERROR_CODES, SessionError } from \"../session/SessionError\";\n\nimport { SubscriptionCache } from \"./SubscriptionCache\";\nimport type {\n SubscriptionInfo,\n SubscriptionManagerConfig,\n SubscriptionStatusResponse,\n} from \"./types\";\n\ntype SubscriptionListener = (subscription: SubscriptionStatusResponse) => void;\n\nclass SubscriptionManagerClass {\n private config: SubscriptionManagerConfig | null = null;\n private cache: SubscriptionCache;\n private listeners: Set<SubscriptionListener> = new Set();\n private userId: string | null = null;\n\n constructor() {\n this.cache = new SubscriptionCache();\n }\n\n private cacheKey(): string {\n return this.userId ?? \"__anonymous__\";\n }\n\n init(config: SubscriptionManagerConfig): void {\n this.config = config;\n if (config.cacheTTL) {\n this.cache.setTTL(config.cacheTTL);\n }\n }\n\n setUserId(userId: string | null): void {\n if (this.userId !== userId) {\n this.userId = userId;\n void this.cache.invalidateAll();\n }\n }\n\n async hasActiveSubscription(forceRefresh = false): Promise<boolean> {\n const status = await this.getSubscriptionStatus(forceRefresh);\n return status.hasActiveSubscription;\n }\n\n async getSubscription(forceRefresh = false): Promise<SubscriptionInfo | null> {\n const status = await this.getSubscriptionStatus(forceRefresh);\n return status.subscription;\n }\n\n async getEntitlements(forceRefresh = false): Promise<string[]> {\n const status = await this.getSubscriptionStatus(forceRefresh);\n return status.entitlements;\n }\n\n async getSubscriptionStatus(forceRefresh = false): Promise<SubscriptionStatusResponse> {\n if (!this.config) {\n return this.getEmptyStatus();\n }\n\n if (!forceRefresh) {\n const cached = await this.cache.get(this.cacheKey());\n if (cached && !cached.isStale) {\n return cached.data;\n }\n }\n\n try {\n const status = await this.fetchSubscriptionStatus();\n await this.cache.set(this.cacheKey(), status);\n this.notifyListeners(status);\n return status;\n } catch (error) {\n this.log(\"Failed to fetch subscription status\", error);\n\n const cached = await this.cache.get(this.cacheKey());\n if (cached) {\n return cached.data;\n }\n\n return this.getEmptyStatus();\n }\n }\n\n async restorePurchases(): Promise<SubscriptionStatusResponse> {\n if (!this.config) {\n throw new SessionError(\n SESSION_ERROR_CODES.NOT_INITIALIZED,\n \"SubscriptionManager not initialized\"\n );\n }\n\n await this.cache.invalidate(this.cacheKey());\n return this.getSubscriptionStatus(true);\n }\n\n private async fetchSubscriptionStatus(): Promise<SubscriptionStatusResponse> {\n if (!this.config) {\n return this.getEmptyStatus();\n }\n\n const url = new URL(`${this.config.serverUrl}/sdk/purchases/status/${this.config.appKey}`);\n if (this.userId) {\n url.searchParams.set(\"distinctId\", this.userId);\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-App-Key\": this.config.appKey,\n },\n });\n\n if (!response.ok) {\n throw new SessionError(\n SESSION_ERROR_CODES.RESTORE_FAILED,\n `Failed to fetch subscription status: ${response.status}`\n );\n }\n\n const data = (await response.json()) as SubscriptionStatusResponse;\n\n if (data.subscription) {\n data.subscription.expiresAt = new Date(data.subscription.expiresAt);\n data.subscription.originalPurchaseDate = new Date(data.subscription.originalPurchaseDate);\n data.subscription.latestPurchaseDate = new Date(data.subscription.latestPurchaseDate);\n if (data.subscription.cancellationDate) {\n data.subscription.cancellationDate = new Date(data.subscription.cancellationDate);\n }\n if (data.subscription.gracePeriodExpiresAt) {\n data.subscription.gracePeriodExpiresAt = new Date(data.subscription.gracePeriodExpiresAt);\n }\n }\n\n return data;\n }\n\n private getEmptyStatus(): SubscriptionStatusResponse {\n return {\n hasActiveSubscription: false,\n subscription: null,\n entitlements: [],\n };\n }\n\n addListener(listener: SubscriptionListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notifyListeners(status: SubscriptionStatusResponse): void {\n for (const listener of this.listeners) {\n listener(status);\n }\n }\n\n async onPurchaseComplete(): Promise<void> {\n await this.cache.invalidate(this.cacheKey());\n await this.getSubscriptionStatus(true);\n }\n\n private log(...args: unknown[]): void {\n if (this.config?.debug) console.log(\"[Paywallo:Subscription]\", ...args);\n }\n}\n\nexport const subscriptionManager = new SubscriptionManagerClass();\n","import type { ConditionalFlagContext } from \"../types\";\nimport { DEFAULT_WEB_URL } from \"./constants\";\n\n/**\n * Derives the web (dashboard) URL from the API base URL.\n * - Local dev (192.168.x or localhost): same host, port 3000\n * - Production: uses DEFAULT_WEB_URL (paywallo.com.br)\n * - api.* → app.*\n */\nexport function deriveWebUrl(baseUrl: string): string {\n try {\n const url = new URL(baseUrl);\n if (url.hostname.startsWith(\"192.168\") || url.hostname === \"localhost\") {\n url.port = \"3000\";\n return url.toString().replace(/\\/$/, \"\");\n }\n if (url.hostname.startsWith(\"api.\")) {\n url.hostname = url.hostname.replace(\"api.\", \"app.\");\n return url.toString().replace(/\\/$/, \"\");\n }\n return DEFAULT_WEB_URL;\n } catch {\n return DEFAULT_WEB_URL;\n }\n}\n\n/** Builds a URL with optional query params appended. */\nexport function buildUrl(base: string, params?: Record<string, unknown>): string {\n if (!params) return base;\n const entries = Object.entries(params).filter(([, v]) => v !== undefined && v !== null);\n if (entries.length === 0) return base;\n const query = entries\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join(\"&\");\n return `${base}?${query}`;\n}\n\n/** Builds the URL for the conditional-flags endpoint including context query params. */\nexport function buildConditionalFlagUrl(\n baseUrl: string,\n flagKey: string,\n context: ConditionalFlagContext\n): string {\n const url = new URL(`${baseUrl}/sdk/conditional-flags/${flagKey}`);\n if (context.platform) url.searchParams.set(\"platform\", context.platform);\n if (context.appVersion) url.searchParams.set(\"appVersion\", context.appVersion);\n if (context.country) url.searchParams.set(\"country\", context.country);\n if (context.distinctId) url.searchParams.set(\"distinctId\", context.distinctId);\n return url.toString();\n}\n","import type { FlagVariant } from \"../types\";\nimport { secureStorage } from \"./storage/SecureStorage\";\n\nconst FLAG_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport async function readFlagFromStorage(flagKey: string, distinctId: string): Promise<FlagVariant | null> {\n try {\n const raw = await secureStorage.get(`flag:${flagKey}:${distinctId}`);\n if (!raw) return null;\n const parsed: unknown = JSON.parse(raw);\n if (\n typeof parsed !== \"object\" || parsed === null ||\n !(\"variant\" in parsed) || !(\"cachedAt\" in parsed) ||\n typeof (parsed as Record<string, unknown>).cachedAt !== \"number\"\n ) return null;\n const { variant, payload, cachedAt } = parsed as { variant: string | null; payload?: Record<string, unknown>; cachedAt: number };\n if (Date.now() - cachedAt > FLAG_MAX_AGE_MS) return null;\n return { variant, payload };\n } catch {\n return null;\n }\n}\n\nexport async function writeFlagToStorage(flagKey: string, distinctId: string, flag: FlagVariant): Promise<void> {\n try {\n const value = JSON.stringify({ variant: flag.variant, payload: flag.payload, cachedAt: Date.now() });\n await secureStorage.set(`flag:${flagKey}:${distinctId}`, value);\n } catch {\n // storage failures are non-critical\n }\n}\n","import type { ConditionalFlagContext, ConditionalFlagResult, FlagVariant } from \"../types\";\nimport { buildConditionalFlagUrl } from \"./apiUrlUtils\";\nimport { ApiCache } from \"./ApiCache\";\nimport { readFlagFromStorage, writeFlagToStorage } from \"./FlagStorage\";\nimport type { HttpClient } from \"./http\";\n\nexport interface FlagClientDeps {\n get<T>(path: string): Promise<{ ok: boolean; status: number; data: T }>;\n httpClient: HttpClient;\n cache: ApiCache;\n appKey: string;\n baseUrl: string;\n}\n\nexport async function getVariant(\n deps: FlagClientDeps,\n flagKey: string,\n distinctId: string,\n): Promise<FlagVariant> {\n const key = `${flagKey}:${distinctId}`;\n const hit = deps.cache.getVariant(key);\n if (hit !== undefined) return hit;\n\n const persisted = await readFlagFromStorage(flagKey, distinctId);\n if (persisted !== null) { deps.cache.setVariant(key, persisted); return persisted; }\n\n try {\n const res = await deps.get<FlagVariant>(`/sdk/flags/${flagKey}?distinctId=${encodeURIComponent(distinctId)}`);\n if (res.status === 404) {\n const v: FlagVariant = { variant: null };\n deps.cache.setVariant(key, v, deps.cache.nullTTL);\n return v;\n }\n if (!res.ok) {\n const stale = deps.cache.getStaleVariant(key);\n return stale !== undefined ? stale : { variant: null };\n }\n deps.cache.setVariant(key, res.data);\n await writeFlagToStorage(flagKey, distinctId, res.data);\n return res.data;\n } catch {\n const stale = deps.cache.getStaleVariant(key);\n return stale !== undefined ? stale : { variant: null };\n }\n}\n\nexport async function evaluateFlags(\n deps: FlagClientDeps,\n keys: string[],\n distinctId: string,\n): Promise<Record<string, string | null>> {\n const query = keys.map(encodeURIComponent).join(\",\");\n try {\n const res = await deps.httpClient.get<unknown>(`/sdk/flags/evaluate?keys=${query}`, {\n headers: { \"X-App-Key\": deps.appKey, \"x-distinct-id\": distinctId },\n });\n if (!res.ok || typeof res.data !== \"object\" || res.data === null || Array.isArray(res.data)) return {};\n const record = res.data as Record<string, unknown>;\n const result: Record<string, string | null> = {};\n for (const key of Object.keys(record)) {\n const value = record[key];\n const variant: string | null =\n typeof value === \"boolean\" ? String(value) : typeof value === \"string\" ? value : null;\n result[key] = variant;\n const flagVariant: FlagVariant = { variant };\n deps.cache.setVariant(`${key}:${distinctId}`, flagVariant);\n await writeFlagToStorage(key, distinctId, flagVariant);\n }\n return result;\n } catch {\n return {};\n }\n}\n\nexport async function getConditionalFlag(\n deps: FlagClientDeps,\n flagKey: string,\n context: ConditionalFlagContext,\n): Promise<ConditionalFlagResult> {\n try {\n const url = buildConditionalFlagUrl(deps.baseUrl, flagKey, context);\n const response = await deps.get<{ value: boolean }>(url);\n if (response.status === 404 || !response.ok) return { value: false, flagKey };\n return { value: response.data.value, flagKey };\n } catch {\n return { value: false, flagKey };\n }\n}\n\nexport async function getVariantFromCache(\n deps: FlagClientDeps,\n flagKey: string,\n distinctId: string,\n): Promise<FlagVariant | null> {\n const key = `${flagKey}:${distinctId}`;\n const hit = deps.cache.getVariant(key);\n if (hit !== undefined) return hit;\n const persisted = await readFlagFromStorage(flagKey, distinctId);\n if (persisted !== null) { deps.cache.setVariant(key, persisted); return persisted; }\n return null;\n}\n","import type {\n CampaignResponse,\n EmergencyPaywallResponse,\n SubscriptionStatusResponse,\n ValidatePurchaseResponse,\n} from \"../../types\";\n\nimport type { ApiClient } from \"../../core/ApiClient\";\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"./PurchaseError\";\n\nexport async function validatePurchase(\n client: ApiClient,\n appKey: string,\n platform: \"ios\" | \"android\",\n receipt: string,\n productId: string,\n transactionId: string,\n priceLocal: number,\n currency: string,\n country: string,\n distinctId?: string,\n paywallPlacement?: string,\n variantKey?: string\n): Promise<ValidatePurchaseResponse> {\n const response = await client.post<ValidatePurchaseResponse>(\n `/sdk/purchases/validate`,\n {\n platform, receipt, productId, transactionId, priceLocal, currency, country, distinctId,\n ...(paywallPlacement !== undefined && { paywallPlacement }),\n ...(variantKey !== undefined && { variantKey }),\n },\n false\n );\n if (!response.ok) {\n throw new PurchaseError(\n PURCHASE_ERROR_CODES.VALIDATION_FAILED,\n `Server validation failed: HTTP ${response.status}`,\n false,\n response.status\n );\n }\n return response.data;\n}\n\nexport async function getSubscriptionStatus(\n client: ApiClient,\n baseUrl: string,\n appKey: string,\n distinctId: string\n): Promise<SubscriptionStatusResponse> {\n const url = new URL(`${baseUrl}/sdk/purchases/status`);\n url.searchParams.set(\"distinctId\", distinctId);\n const response = await client.get<SubscriptionStatusResponse>(url.toString());\n if (!response.ok) {\n throw new PurchaseError(PURCHASE_ERROR_CODES.NETWORK_ERROR, `Subscription status check failed: HTTP ${response.status}`);\n }\n return response.data;\n}\n\nexport async function getEmergencyPaywall(\n client: ApiClient\n): Promise<EmergencyPaywallResponse> {\n try {\n const response = await client.get<EmergencyPaywallResponse>(\"/sdk/emergency-paywall\");\n if (response.status === 404) return { enabled: false };\n return response.data;\n } catch {\n return { enabled: false };\n }\n}\n\nexport async function getCampaignData(\n client: ApiClient,\n baseUrl: string,\n placement: string,\n distinctId: string,\n context?: Record<string, unknown>\n): Promise<CampaignResponse | null> {\n const url = new URL(`${baseUrl}/sdk/campaigns/${placement}`);\n url.searchParams.set(\"distinctId\", distinctId);\n if (context) url.searchParams.set(\"context\", JSON.stringify(context));\n\n const response = await client.get<CampaignResponse | { paywall: null }>(url.toString());\n if (response.status === 404) return null;\n\n const data = response.data;\n if (\"paywall\" in data && data.paywall === null && !(\"campaignId\" in data)) return null;\n return data as CampaignResponse;\n}\n","export interface RetryConfig {\n maxRetries: number;\n baseDelay: number;\n maxDelay: number;\n retryableStatusCodes: number[];\n}\n\nexport interface HttpClientConfig {\n baseUrl: string;\n timeout: number;\n retry: RetryConfig;\n debug: boolean;\n /**\n * Headers injected into every outgoing request (e.g. `x-sdk-version`,\n * `x-sdk-platform`). Per-request headers take precedence on conflict.\n */\n globalHeaders: Record<string, string>;\n}\n\nexport interface RequestOptions {\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n headers?: Record<string, string>;\n body?: unknown;\n skipRetry?: boolean;\n timeout?: number;\n}\n\nexport interface HttpResponse<T = unknown> {\n ok: boolean;\n status: number;\n data: T;\n headers: Record<string, string>;\n}\n\nexport interface RetryState {\n attempt: number;\n lastError: Error | null;\n}\n\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: 2,\n baseDelay: 500,\n maxDelay: 4000,\n retryableStatusCodes: [408, 429, 500, 502, 503, 504],\n};\n\nexport const DEFAULT_HTTP_CONFIG: Partial<HttpClientConfig> = {\n timeout: 10000,\n retry: DEFAULT_RETRY_CONFIG,\n debug: false,\n globalHeaders: {},\n};\n","import { CLIENT_ERROR_CODES, ClientError } from \"../../errors/ClientError\";\nimport type {\n HttpClientConfig,\n HttpResponse,\n RequestOptions,\n RetryConfig,\n RetryState,\n} from \"./types\";\nimport { DEFAULT_HTTP_CONFIG, DEFAULT_RETRY_CONFIG } from \"./types\";\n\nexport class HttpClient {\n private config: HttpClientConfig;\n\n constructor(baseUrl: string, config?: Partial<Omit<HttpClientConfig, \"baseUrl\">>) {\n this.config = {\n baseUrl,\n timeout: config?.timeout ?? DEFAULT_HTTP_CONFIG.timeout ?? 10000,\n retry: { ...DEFAULT_RETRY_CONFIG, ...config?.retry },\n debug: config?.debug ?? false,\n globalHeaders: { ...(config?.globalHeaders ?? {}) },\n };\n }\n\n /**\n * Merge additional headers into every subsequent request. Call sites\n * (e.g. `ApiClient`) use this to update `x-sdk-environment` when the\n * environment flips from Sandbox to Production at runtime.\n */\n setGlobalHeaders(headers: Record<string, string>): void {\n this.config.globalHeaders = { ...this.config.globalHeaders, ...headers };\n }\n\n async get<T>(path: string, options?: Partial<RequestOptions>): Promise<HttpResponse<T>> {\n return this.request<T>(path, { ...options, method: \"GET\" });\n }\n\n async post<T>(\n path: string,\n body?: unknown,\n options?: Partial<RequestOptions>\n ): Promise<HttpResponse<T>> {\n return this.request<T>(path, { ...options, method: \"POST\", body });\n }\n\n async request<T>(path: string, options: RequestOptions): Promise<HttpResponse<T>> {\n const url = this.buildUrl(path);\n const fetchOptions = this.buildFetchOptions(options);\n const timeout = options.timeout ?? this.config.timeout;\n\n if (options.skipRetry) {\n return this.executeRequest<T>(url, fetchOptions, timeout);\n }\n\n return this.executeWithRetry<T>(url, fetchOptions, options);\n }\n\n private async executeWithRetry<T>(\n url: string,\n fetchOptions: RequestInit,\n options: RequestOptions\n ): Promise<HttpResponse<T>> {\n const retryConfig = this.config.retry;\n const timeout = options.timeout ?? this.config.timeout;\n const state: RetryState = { attempt: 0, lastError: null };\n\n while (state.attempt <= retryConfig.maxRetries) {\n try {\n const response = await this.executeRequest<T>(url, fetchOptions, timeout);\n\n if (this.shouldRetry(response.status, retryConfig)) {\n if (state.attempt < retryConfig.maxRetries) {\n state.attempt++;\n const delay = this.calculateDelayForResponse(state.attempt, response.headers, retryConfig);\n await this.sleep(delay);\n continue;\n }\n }\n\n return response;\n } catch (error) {\n state.lastError = error instanceof Error ? error : new ClientError(CLIENT_ERROR_CODES.UNKNOWN, String(error));\n\n if (this.isNetworkError(state.lastError) && state.attempt < retryConfig.maxRetries) {\n state.attempt++;\n const delay = this.calculateDelay(state.attempt, retryConfig);\n await this.sleep(delay);\n continue;\n }\n\n throw state.lastError;\n }\n }\n\n throw state.lastError ?? new ClientError(CLIENT_ERROR_CODES.UNKNOWN, \"Max retries exceeded\");\n }\n\n private async executeRequest<T>(\n url: string,\n options: RequestInit,\n timeout: number\n ): Promise<HttpResponse<T>> {\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let isCompleted = false;\n\n timeoutId = setTimeout(() => {\n if (!isCompleted) {\n controller.abort();\n }\n }, timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n\n isCompleted = true;\n\n let data: T;\n const contentType = response.headers.get(\"content-type\");\n\n if (contentType?.includes(\"application/json\")) {\n data = (await response.json()) as T;\n } else {\n const textData = await response.text();\n data = textData as unknown as T;\n }\n\n const headers: Record<string, string> = {};\n response.headers.forEach((value: string, key: string) => {\n headers[key] = value;\n });\n\n return {\n ok: response.ok,\n status: response.status,\n data,\n headers,\n };\n } catch (error) {\n // Redact URL path segments that may contain the app key (e.g. /validate/{key}, /status/{key})\n // to avoid leaking credentials in debug logs.\n this.log(\"Request failed\", {\n url: this.redactUrl(url),\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n isCompleted = true;\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n }\n\n private buildUrl(path: string): string {\n if (path.startsWith(\"http://\") || path.startsWith(\"https://\")) {\n // Warn and block plain-HTTP absolute URLs to prevent credential leakage.\n // Exception: localhost / 192.168.x dev servers are allowed for local dev.\n if (path.startsWith(\"http://\")) {\n const isLocalDev = /^http:\\/\\/(localhost|127\\.0\\.0\\.1|192\\.168\\.\\d{1,3}\\.\\d{1,3})/.test(path);\n if (!isLocalDev) {\n const sanitizedPath = path.split(\"?\")[0];\n this.log(\"Blocked http:// request — only HTTPS is allowed in production:\", sanitizedPath);\n throw new ClientError(CLIENT_ERROR_CODES.INSECURE_REQUEST, `Insecure HTTP request blocked: ${sanitizedPath}`);\n }\n }\n return path;\n }\n return `${this.config.baseUrl}${path}`;\n }\n\n private buildFetchOptions(options: RequestOptions): RequestInit {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...this.config.globalHeaders,\n ...options.headers,\n };\n\n const fetchOptions: RequestInit = {\n method: options.method,\n headers,\n };\n\n if (options.body !== undefined) {\n fetchOptions.body = JSON.stringify(options.body);\n }\n\n return fetchOptions;\n }\n\n private shouldRetry(status: number, config: RetryConfig): boolean {\n return config.retryableStatusCodes.includes(status);\n }\n\n private isNetworkError(error: Error): boolean {\n const networkErrorPatterns = [\n \"network\",\n \"fetch\",\n \"ECONNREFUSED\",\n \"ETIMEDOUT\",\n \"ENOTFOUND\",\n \"aborted\",\n \"timeout\",\n ];\n\n const message = error.message.toLowerCase();\n return networkErrorPatterns.some((pattern) => message.includes(pattern.toLowerCase()));\n }\n\n private calculateDelay(attempt: number, config: RetryConfig): number {\n const exponentialDelay = config.baseDelay * Math.pow(2, attempt - 1);\n const jitter = Math.random() * 0.3 * exponentialDelay;\n return Math.min(exponentialDelay + jitter, config.maxDelay);\n }\n\n private calculateDelayForResponse(\n attempt: number,\n headers: Record<string, string>,\n config: RetryConfig\n ): number {\n // Honour Retry-After header (seconds or HTTP-date) to avoid 429 storms.\n const retryAfter = headers[\"retry-after\"];\n if (retryAfter) {\n const seconds = Number(retryAfter);\n if (!Number.isNaN(seconds) && seconds > 0) {\n return Math.min(seconds * 1000, config.maxDelay);\n }\n // HTTP-date format\n const date = new Date(retryAfter);\n if (!Number.isNaN(date.getTime())) {\n const ms = date.getTime() - Date.now();\n if (ms > 0) return Math.min(ms, config.maxDelay);\n }\n }\n return this.calculateDelay(attempt, config);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /** Strips path segments that look like app keys (alphanumeric, 20–64 chars) from URLs before logging. */\n private redactUrl(url: string): string {\n return url.replace(/\\/([a-zA-Z0-9_-]{20,64})(\\?|$|\\/)/g, \"/[REDACTED]$2\");\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) console.log(\"[Paywallo:Http]\", ...args);\n }\n\n setDebug(debug: boolean): void {\n this.config.debug = debug;\n }\n\n getConfig(): Readonly<HttpClientConfig> {\n return { ...this.config };\n }\n}\n","export { HttpClient } from \"./HttpClient\";\nexport type {\n HttpClientConfig,\n HttpResponse,\n RequestOptions,\n RetryConfig,\n RetryState,\n} from \"./types\";\nexport { DEFAULT_HTTP_CONFIG, DEFAULT_RETRY_CONFIG } from \"./types\";\n","import type { CampaignResponse, FlagVariant, PaywallConfig } from \"../types\";\n\ntype CacheEntry<T> = { value: T; ts: number; ttl?: number };\n\nexport class ApiCache {\n private readonly CACHE_TTL = 300_000;\n private readonly CACHE_NULL_TTL = 30_000;\n private readonly MAX_SIZE = 200;\n private readonly STALE_WINDOW_MS = 86_400_000;\n\n private variantCache = new Map<string, CacheEntry<FlagVariant>>();\n private paywallCache = new Map<string, CacheEntry<PaywallConfig | null>>();\n private campaignCache = new Map<string, CacheEntry<CampaignResponse | null>>();\n\n getCached<T>(cache: Map<string, CacheEntry<T>>, key: string): T | undefined {\n const entry = cache.get(key);\n if (!entry) return undefined;\n const ttl = entry.ttl ?? this.CACHE_TTL;\n if (Date.now() - entry.ts < ttl) return entry.value;\n cache.delete(key);\n return undefined;\n }\n\n setCached<T>(\n cache: Map<string, CacheEntry<T>>,\n key: string,\n value: T,\n ttlOverride?: number\n ): void {\n const entry: CacheEntry<T> = { value, ts: Date.now() };\n if (ttlOverride !== undefined) entry.ttl = ttlOverride;\n cache.set(key, entry);\n }\n\n evictExpiredEntries<T>(cache: Map<string, CacheEntry<T>>): void {\n if (cache.size <= this.MAX_SIZE) return;\n const now = Date.now();\n for (const [key, entry] of cache) {\n const ttl = entry.ttl ?? this.CACHE_TTL;\n if (now - entry.ts > ttl) cache.delete(key);\n }\n }\n\n getVariant(key: string): FlagVariant | undefined {\n return this.getCached(this.variantCache, key);\n }\n\n setVariant(key: string, value: FlagVariant, ttlOverride?: number): void {\n this.setCached(this.variantCache, key, value, ttlOverride);\n this.evictExpiredEntries(this.variantCache);\n }\n\n get nullTTL(): number {\n return this.CACHE_NULL_TTL;\n }\n\n getStaleVariant(key: string): FlagVariant | undefined {\n const entry = this.variantCache.get(key);\n if (entry && Date.now() - entry.ts < this.STALE_WINDOW_MS) return entry.value;\n return undefined;\n }\n\n getPaywall(key: string): PaywallConfig | null | undefined {\n return this.getCached(this.paywallCache, key);\n }\n\n setPaywall(key: string, value: PaywallConfig | null, ttlOverride?: number): void {\n this.setCached(this.paywallCache, key, value, ttlOverride);\n this.evictExpiredEntries(this.paywallCache);\n }\n\n getStalePaywall(key: string): PaywallConfig | null | undefined {\n const entry = this.paywallCache.get(key);\n if (entry && Date.now() - entry.ts < this.STALE_WINDOW_MS) return entry.value;\n return undefined;\n }\n\n getCampaign(key: string): CampaignResponse | null | undefined {\n return this.getCached(this.campaignCache, key);\n }\n\n setCampaign(key: string, value: CampaignResponse | null, ttlOverride?: number): void {\n this.setCached(this.campaignCache, key, value, ttlOverride);\n this.evictExpiredEntries(this.campaignCache);\n }\n\n getStaleCampaign(key: string): CampaignResponse | null | undefined {\n const entry = this.campaignCache.get(key);\n if (entry && Date.now() - entry.ts < this.STALE_WINDOW_MS) return entry.value;\n return undefined;\n }\n}\n","import { z } from \"zod\";\n\n/**\n * 7 famílias canônicas de evento do Paywallo SDK V2.\n *\n * Cada schema é strict — campos não declarados são rejeitados pelo parse.\n * Isso força callers a emitir eventos no shape canônico e elimina eventos\n * \"lixo\" (payloads inconsistentes que o server descarta).\n *\n * A superfície pública (`paywallo.track(name, props)`) não muda — os\n * schemas rodam no EventBatcher antes do enqueue e falham loud em debug.\n */\n\n// ─── lifecycle ───────────────────────────────────────────────────────────\n// install | cold_start | foreground | background | session_start | session_end\nexport const lifecycleEventSchema = z\n .object({\n type: z.enum([\n \"install\",\n \"cold_start\",\n \"foreground\",\n \"background\",\n \"session_start\",\n \"session_end\",\n ]),\n session_id: z.string().optional(),\n duration_s: z.number().nonnegative().optional(),\n first_ever: z.boolean().optional(),\n // Contexto leve transportado em lifecycle (útil pra cold_start/install)\n app_version: z.string().optional(),\n device_type: z.enum([\"ios\", \"android\"]).optional(),\n os_version: z.string().optional(),\n // Timestamps opcionais — o EventBatcher injeta `timestamp` no envelope\n started_at: z.string().optional(),\n ended_at: z.string().optional(),\n })\n .strict();\n\n// ─── identify ────────────────────────────────────────────────────────────\nexport const identifyEventSchema = z\n .object({\n distinct_id: z.string().min(1),\n email: z.email().optional(),\n traits: z.record(z.string(), z.unknown()).optional(),\n attribution: z.record(z.string(), z.unknown()).optional(),\n device: z.record(z.string(), z.unknown()).optional(),\n })\n .strict();\n\n// ─── paywall ─────────────────────────────────────────────────────────────\n// viewed | closed | purchased (apenas 3 types canônicos)\nexport const paywallEventSchema = z\n .object({\n type: z.enum([\"viewed\", \"closed\", \"purchased\"]),\n paywall_id: z.string().min(1),\n placement: z.string().optional(),\n variant_id: z.string().optional(),\n variant_key: z.string().optional(),\n campaign_id: z.string().optional(),\n // `closed`-specific\n closed_at: z.string().optional(),\n duration_s: z.number().nonnegative().optional(),\n close_reason: z\n .enum([\"dismiss\", \"cta\", \"purchase\", \"error\", \"timeout\"])\n .optional(),\n scroll_depth: z.number().min(0).max(1).optional(),\n // `purchased`-specific (mínimo — transaction canônica leva detalhes)\n product_id: z.string().optional(),\n })\n .strict();\n\n// ─── transaction ─────────────────────────────────────────────────────────\n// completed | failed | refunded | renewed | canceled | expired\nexport const transactionEventSchema = z\n .object({\n type: z.enum([\n \"completed\",\n \"failed\",\n \"refunded\",\n \"renewed\",\n \"canceled\",\n \"expired\",\n ]),\n tx_id: z.string().min(1),\n amount: z.number().optional(),\n currency: z.string().length(3).optional(),\n product_id: z.string().optional(),\n subscription_id: z.string().optional(),\n paywall_id: z.string().optional(),\n variant_id: z.string().optional(),\n reason: z.string().optional(),\n })\n .strict();\n\n// ─── onboarding ──────────────────────────────────────────────────────────\n// step | complete | drop\nexport const onboardingEventSchema = z\n .object({\n type: z.enum([\"step\", \"complete\", \"drop\"]),\n step_index: z.number().int().nonnegative().optional(),\n step_name: z.string().optional(),\n variant_key: z.string().optional(),\n time_on_prev_s: z.number().nonnegative().optional(),\n })\n .strict();\n\n// ─── notification ────────────────────────────────────────────────────────\n// delivered | displayed | clicked | dismissed\nexport const notificationEventSchema = z\n .object({\n type: z.enum([\"delivered\", \"displayed\", \"clicked\", \"dismissed\"]),\n notification_id: z.string().optional(),\n campaign_id: z.string().optional(),\n variant_key: z.string().nullable().optional(),\n message_id: z.string().optional(),\n device_id: z.string().optional(),\n push_platform: z.enum([\"ios\", \"android\"]).optional(),\n timezone: z.string().optional(),\n failure_reason: z.string().optional(),\n app_user_id: z.string().optional(),\n })\n .strict();\n\n// ─── custom ──────────────────────────────────────────────────────────────\n// Usuários emitem events próprios (`paywallo.track(\"my_event\", {...})`).\n// `name` é o event name (snake_case, ou `$reserved` para internal events\n// como `$session_start` que não casam com nenhuma família canônica mas\n// continuam válidos no pipeline).\n// `props` é bag aberta — validação strict só no envelope.\nexport const customEventSchema = z\n .object({\n name: z\n .string()\n .min(1)\n .regex(\n /^(\\$[a-zA-Z0-9_]+|[a-z][a-z0-9_]*)$/,\n \"custom event name must be snake_case or $reserved\",\n ),\n props: z.record(z.string(), z.unknown()).optional(),\n })\n .strict();\n\n// ─── types inferidos ─────────────────────────────────────────────────────\nexport type LifecycleEvent = z.infer<typeof lifecycleEventSchema>;\nexport type IdentifyEvent = z.infer<typeof identifyEventSchema>;\nexport type PaywallEvent = z.infer<typeof paywallEventSchema>;\nexport type TransactionEvent = z.infer<typeof transactionEventSchema>;\nexport type OnboardingEvent = z.infer<typeof onboardingEventSchema>;\nexport type NotificationEvent = z.infer<typeof notificationEventSchema>;\nexport type CustomEvent = z.infer<typeof customEventSchema>;\n\nexport type EventFamily =\n | \"lifecycle\"\n | \"identify\"\n | \"paywall\"\n | \"transaction\"\n | \"onboarding\"\n | \"notification\"\n | \"custom\";\n\nexport const EVENT_SCHEMAS = {\n lifecycle: lifecycleEventSchema,\n identify: identifyEventSchema,\n paywall: paywallEventSchema,\n transaction: transactionEventSchema,\n onboarding: onboardingEventSchema,\n notification: notificationEventSchema,\n custom: customEventSchema,\n} as const;\n","import type { ZodError } from \"zod\";\n\nimport { EVENT_SCHEMAS, type EventFamily } from \"./schemas\";\n\n/**\n * Lista explícita das famílias canônicas. Qualquer `eventName` que NÃO\n * esteja aqui cai em `custom` (após passar pelo regex de nomes).\n */\nconst CANONICAL_FAMILIES: readonly EventFamily[] = [\n \"lifecycle\",\n \"identify\",\n \"paywall\",\n \"transaction\",\n \"onboarding\",\n \"notification\",\n \"custom\",\n] as const;\n\n/**\n * Eventos legacy que foram REMOVIDOS em V2. Chamá-los vira no-op (com\n * warning em debug). Ficam aqui só pra detecção — nunca são emitidos.\n *\n * Migrations:\n * `$paywall_purchased` → transaction {type:\"completed\"} (via IAPService)\n * `$paywall_product_selected` → REMOVIDO (sem consumer no server)\n * `$core_action` → REMOVIDO (sem consumer no server)\n * `$campaign_impression` → paywall {type:\"viewed\", campaign_id}\n * `$app_open` → lifecycle {type:\"cold_start\"|\"foreground\"}\n * `$app_background` → lifecycle {type:\"background\"}\n * `$app_foreground` → lifecycle {type:\"foreground\"}\n * `session.end` (sem `$`) → lifecycle {type:\"session_end\"}\n */\nexport const DEPRECATED_EVENT_NAMES: readonly string[] = [\n \"$paywall_purchased\",\n \"$paywall_product_selected\",\n \"$core_action\",\n \"$campaign_impression\",\n \"$app_open\",\n \"$app_background\",\n \"$app_foreground\",\n \"session.end\",\n] as const;\n\nexport function isDeprecatedEvent(eventName: string): boolean {\n return DEPRECATED_EVENT_NAMES.includes(eventName);\n}\n\nexport function isCanonicalFamily(name: string): name is EventFamily {\n return (CANONICAL_FAMILIES as readonly string[]).includes(name);\n}\n\n/**\n * Detecta a família canônica a partir do `eventName` que chega ao batcher.\n *\n * - `lifecycle | identify | paywall | transaction | onboarding | notification`\n * casam direto quando o caller usa `track(\"lifecycle\", { type: \"install\" })`.\n * - Qualquer outro nome (snake_case custom ou `$reserved`) vira `custom`.\n */\nexport function detectFamily(eventName: string): EventFamily {\n if (isCanonicalFamily(eventName) && eventName !== \"custom\") {\n return eventName;\n }\n return \"custom\";\n}\n\nexport interface ValidationResult {\n ok: boolean;\n family: EventFamily;\n /** Payload normalizado (shape do schema). Pode ter dropado campos extras. */\n data?: Record<string, unknown>;\n error?: ZodError;\n}\n\n/**\n * Valida o `properties` do event contra o schema da família detectada.\n *\n * Para `custom`: embrulha como `{ name, props }` antes de validar, já que\n * o schema custom espera esse shape (e o EventBatcher externaliza `name`).\n */\nexport function validateEvent(\n eventName: string,\n properties: Record<string, unknown> | undefined\n): ValidationResult {\n const family = detectFamily(eventName);\n const schema = EVENT_SCHEMAS[family];\n\n const input =\n family === \"custom\"\n ? { name: eventName, ...(properties ? { props: properties } : {}) }\n : (properties ?? {});\n\n const parsed = schema.safeParse(input);\n if (parsed.success) {\n return { ok: true, family, data: parsed.data as Record<string, unknown> };\n }\n return { ok: false, family, error: parsed.error };\n}\n\n/**\n * Formata erro do Zod pra log de debug (curto, útil pra dev console).\n */\nexport function formatValidationError(error: ZodError): string {\n return error.issues\n .map((i) => `${i.path.join(\".\") || \"(root)\"}: ${i.message}`)\n .join(\"; \");\n}\n","export {\n DEPRECATED_EVENT_NAMES,\n detectFamily,\n formatValidationError,\n isCanonicalFamily,\n isDeprecatedEvent,\n validateEvent,\n type ValidationResult,\n} from \"./eventFamilies\";\nexport {\n type CustomEvent,\n customEventSchema,\n EVENT_SCHEMAS,\n type EventFamily,\n type IdentifyEvent,\n identifyEventSchema,\n type LifecycleEvent,\n lifecycleEventSchema,\n type NotificationEvent,\n notificationEventSchema,\n type OnboardingEvent,\n onboardingEventSchema,\n type PaywallEvent,\n paywallEventSchema,\n type TransactionEvent,\n transactionEventSchema,\n} from \"./schemas\";\n","import { z } from \"zod\";\nimport { Platform } from \"react-native\";\n\nimport { SDK_VERSION } from \"./version\";\nimport { generateUUID } from \"../utils/uuid\";\nimport { detectFamily } from \"./events/eventFamilies\";\n\n// ─── V2 Envelope Zod Schema ─────────────────────────────────────────────────\n\nconst v2EventSchema = z.object({\n id: z.string().min(1),\n ts: z.number().int().positive(),\n name: z.string().min(1),\n payload: z.record(z.string(), z.unknown()),\n});\n\nconst v2ContextSchema = z.object({\n distinct_id: z.string().optional(),\n session_id: z.string().optional(),\n device_id: z.string().optional(),\n app_version: z.string().optional(),\n sdk_version: z.string().optional(),\n platform: z.string().optional(),\n os_version: z.string().optional(),\n device_model: z.string().optional(),\n timezone: z.string().optional(),\n locale: z.string().optional(),\n attribution: z.record(z.string(), z.unknown()).optional(),\n ids: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const v2EnvelopeSchema = z.object({\n context: v2ContextSchema,\n events: z.array(v2EventSchema).min(1),\n});\n\n// ─── Shared context ──────────────────────────────────────────────────────────\n\n/**\n * Shared context resolved once per batch and hoisted out of every individual\n * event in the V2 ingest envelope. The provider is called at flush time so\n * each field reflects the most recent SDK state.\n *\n * The shape mirrors the server-side `/api/v2/ingest/batch` contract (Phase\n * 3.1). Fields declared here are deduplicated across the batch — they exist\n * once on the envelope instead of `N` times on each `events[]` entry.\n */\nexport interface EventContext {\n distinct_id?: string;\n session_id?: string;\n device_id?: string;\n app_version?: string;\n sdk_version?: string;\n platform?: string;\n os_version?: string;\n device_model?: string;\n timezone?: string;\n locale?: string;\n attribution?: Record<string, unknown>;\n ids?: Record<string, unknown>;\n}\n\nexport type ContextProvider = () => EventContext | null;\n\nexport interface EventInput {\n eventName: string;\n distinctId: string;\n properties: Record<string, unknown>;\n timestamp: number;\n}\n\nexport interface V2Event {\n id: string;\n ts: number;\n name: string;\n payload: Record<string, unknown>;\n}\n\nexport interface V2Envelope {\n context: EventContext;\n events: V2Event[];\n}\n\n/**\n * Keys promoted to the shared `context` when they appear in an event's\n * `properties`. Each promoted field is stripped from the per-event payload\n * so the envelope stays V2-compliant: no duplication between `context` and\n * `events[i].payload`.\n *\n * Both snake_case and the camelCase legacy shape shipped by some callers\n * are recognized — the server receives the canonical snake_case key.\n */\nconst CONTEXT_KEY_ALIASES: Record<keyof EventContext, readonly string[]> = {\n distinct_id: [\"distinct_id\", \"distinctId\"],\n session_id: [\"session_id\", \"sessionId\"],\n device_id: [\"device_id\", \"deviceId\"],\n app_version: [\"app_version\", \"appVersion\"],\n sdk_version: [\"sdk_version\", \"sdkVersion\"],\n platform: [\"platform\"],\n os_version: [\"os_version\", \"osVersion\", \"systemVersion\"],\n device_model: [\"device_model\", \"deviceModel\", \"model\"],\n timezone: [\"timezone\", \"timeZone\"],\n locale: [\"locale\"],\n attribution: [\"attribution\"],\n ids: [\"ids\"],\n};\n\n/**\n * Construct the V2 envelope `{context: {...}, events: [{id, ts, name,\n * payload}]}`. Context fields are pulled from the provider AND from any\n * promotion-eligible keys present on the events themselves — this keeps\n * per-event payloads minimal (~130 bytes for `app_installed` vs the legacy\n * ~1.2 KB duplicated shape, ~80% reduction per batch).\n */\nexport function buildV2Envelope(\n events: EventInput[],\n providerContext: EventContext,\n): V2Envelope {\n const context: EventContext = { ...providerContext };\n\n const v2Events: V2Event[] = events.map((event) => {\n const { payload, promoted } = splitPayloadAndContext(event.properties);\n for (const [key, value] of Object.entries(promoted)) {\n const typedKey = key as keyof EventContext;\n if (context[typedKey] === undefined && value !== undefined) {\n // Types at this point are narrow enough: each promoted key matches\n // its context slot shape (object for attribution/ids, string\n // otherwise). Cast is narrow and local to preserve strict types.\n (context as Record<string, unknown>)[typedKey] = value;\n }\n }\n const family = detectFamily(event.eventName);\n if (family === \"custom\") {\n payload.event_name = event.eventName;\n }\n return {\n id: generateUUID(),\n ts: event.timestamp,\n name: family,\n payload,\n };\n });\n\n // Baseline fields the SDK always knows synchronously. Provider values\n // win so app-specific overrides (e.g. custom sdk_version) are honored.\n if (context.sdk_version === undefined) context.sdk_version = SDK_VERSION;\n if (context.platform === undefined) context.platform = Platform.OS;\n if (context.distinct_id === undefined && events.length > 0) {\n context.distinct_id = events[0].distinctId;\n }\n\n return { context, events: v2Events };\n}\n\n/**\n * Resolve the provider-supplied context, swallowing errors and skipping\n * null/undefined fields so downstream consumers never have to guard.\n */\nexport function resolveProviderContext(provider: ContextProvider | null): EventContext {\n if (!provider) return {};\n try {\n const ctx = provider();\n if (!ctx) return {};\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(ctx)) {\n if (v !== undefined && v !== null) out[k] = v;\n }\n return out as EventContext;\n } catch {\n return {};\n }\n}\n\n/**\n * Split raw event properties into:\n * - `payload`: the slim per-event body (everything not promoted)\n * - `promoted`: the subset that will be hoisted to envelope context\n */\nfunction splitPayloadAndContext(\n properties: Record<string, unknown>,\n): { payload: Record<string, unknown>; promoted: Partial<EventContext> } {\n const payload: Record<string, unknown> = { ...properties };\n const promoted: Record<string, unknown> = {};\n\n for (const canonical of Object.keys(CONTEXT_KEY_ALIASES) as Array<keyof EventContext>) {\n const aliases = CONTEXT_KEY_ALIASES[canonical];\n for (const alias of aliases) {\n if (alias in payload) {\n const value = payload[alias];\n if (value !== undefined && value !== null && promoted[canonical] === undefined) {\n promoted[canonical] = value;\n }\n delete payload[alias];\n }\n }\n }\n\n return { payload, promoted: promoted as Partial<EventContext> };\n}\n","import { Platform } from \"react-native\";\n\nimport type { UserProperties } from \"../types\";\n\nimport {\n formatValidationError,\n isDeprecatedEvent,\n validateEvent,\n} from \"./events\";\nimport {\n buildV2Envelope,\n resolveProviderContext,\n v2EnvelopeSchema,\n type ContextProvider,\n type EventContext,\n type EventInput,\n} from \"./eventEnvelopeV2\";\n\nexport type { ContextProvider, EventContext } from \"./eventEnvelopeV2\";\n\ninterface EventPayload {\n eventName: string;\n distinctId: string;\n properties: Record<string, unknown>;\n timestamp: number;\n environment: string;\n}\n\ntype PostFn = (\n url: string,\n payload: unknown,\n label: string,\n priority?: EventPriority,\n) => Promise<void>;\n\n/**\n * Event priority controls flush semantics:\n *\n * - `\"critical\"` → flushed as a batch-of-1 on the next microtask (via\n * `queueMicrotask`). Used for events where loss is unacceptable:\n * `transaction`, `identify`, `lifecycle {type: \"install\"}`,\n * `subscription_*`, `refund`, `checkout_started`.\n * - `\"normal\"` → buffered and flushed on a rolling window (whichever fires\n * first): `BATCH_MAX_SIZE` events OR `BATCH_FLUSH_MS`. Used for events\n * where batching amortizes network cost: `paywall`, non-install\n * `lifecycle` (foreground/background/session), `onboarding`,\n * `notification`, `custom`.\n *\n * Both priorities post to `/sdk/ingest/batch` (Phase 3.1 envelope) with\n * automatic fallback to `/sdk/events/batch` when the V2 endpoint is\n * absent (old server) or rejects the request. `OfflineQueue` handles\n * network-failure durability for both queues via the `PostFn` injected by\n * `ApiClient.postWithQueue`.\n */\nexport type EventPriority = \"critical\" | \"normal\";\n\nexport interface TrackOptions {\n priority?: EventPriority;\n}\n\nconst BATCH_MAX_SIZE = 25;\nconst BATCH_FLUSH_MS = 10_000;\nconst EVENT_NAME_REGEX = /^(\\$[a-zA-Z0-9_]+|[a-z][a-z0-9_]*)$/;\n\nexport const V2_BATCH_ENDPOINT = \"/sdk/ingest/batch\";\nexport const V1_BATCH_ENDPOINT = \"/sdk/events/batch\";\nexport const V1_SINGLE_ENDPOINT = \"/sdk/events\";\n\nexport class EventBatcher {\n private criticalQueue: EventPayload[] = [];\n private normalQueue: EventPayload[] = [];\n private normalTimer: ReturnType<typeof setTimeout> | null = null;\n private criticalScheduled = false;\n private readonly post: PostFn;\n private readonly debug: boolean;\n private readonly contextProvider: ContextProvider | null;\n private v2Disabled = false;\n\n constructor(post: PostFn, debug = false, contextProvider: ContextProvider | null = null) {\n this.post = post;\n this.debug = debug;\n this.contextProvider = contextProvider;\n }\n\n /**\n * Enqueue an event for eventual dispatch.\n *\n * `options.priority` defaults to `\"normal\"` — callers that care about\n * critical semantics must opt in explicitly. The public signature is\n * backwards compatible: pre-existing callers that omit `options` retain\n * today's batched behavior (now on a 25/10s window instead of 10/5s).\n */\n async track(\n eventName: string,\n distinctId: string,\n environment: string,\n properties?: UserProperties,\n timestamp?: number,\n options?: TrackOptions,\n ): Promise<void> {\n if (!EVENT_NAME_REGEX.test(eventName)) {\n if (this.debug) console.log(`[Paywallo] Invalid event name \"${eventName}\". Must be snake_case or start with $`);\n }\n\n // V2 taxonomy: drop deprecated events at the source. Callers that still\n // emit them become a no-op so we never leak lixo to the server.\n if (isDeprecatedEvent(eventName)) {\n if (this.debug) {\n console.log(\n `[Paywallo EVENTS] dropped deprecated event \"${eventName}\" (V2 taxonomy). Migrate to canonical family.`,\n );\n }\n return;\n }\n\n // V2 taxonomy: validate against the canonical family schema. Strict\n // parsing rejects unknown fields — this catches bugs early in dev.\n // The event still flows to the batch even on failure so prod analytics\n // don't go silent; the warning is the signal for the developer.\n const validation = validateEvent(\n eventName,\n properties as Record<string, unknown> | undefined,\n );\n if (!validation.ok && validation.error && this.debug) {\n console.log(\n `[Paywallo EVENTS] schema validation failed for \"${eventName}\" (family=${validation.family}): ${formatValidationError(validation.error)}`,\n );\n }\n\n const event: EventPayload = {\n eventName,\n distinctId,\n properties: { ...(properties as Record<string, unknown>), platform: Platform.OS },\n timestamp: timestamp ?? Date.now(),\n environment: environment.toLowerCase(),\n };\n\n const priority: EventPriority = options?.priority ?? \"normal\";\n\n if (priority === \"critical\") {\n this.criticalQueue.push(event);\n this.scheduleCriticalFlush();\n return;\n }\n\n this.normalQueue.push(event);\n\n if (this.normalQueue.length >= BATCH_MAX_SIZE) {\n if (this.normalTimer !== null) { clearTimeout(this.normalTimer); this.normalTimer = null; }\n await this.flushNormal();\n return;\n }\n\n if (this.normalTimer === null) {\n this.normalTimer = setTimeout(() => { this.normalTimer = null; void this.flushNormal(); }, BATCH_FLUSH_MS);\n }\n }\n\n /**\n * Force flush of the normal queue. Critical events are never held in the\n * normal queue, so this does not affect them (they flush on their own\n * microtask). Exposed so callers (e.g. `AppState=background` listener in\n * phase 2.4) can drain pending events before the app is suspended.\n */\n async flush(): Promise<void> {\n await this.flushNormal();\n }\n\n dispose(): void {\n if (this.normalTimer !== null) { clearTimeout(this.normalTimer); this.normalTimer = null; }\n this.criticalQueue = [];\n this.normalQueue = [];\n this.criticalScheduled = false;\n }\n\n private scheduleCriticalFlush(): void {\n if (this.criticalScheduled) return;\n this.criticalScheduled = true;\n queueMicrotask(() => {\n this.criticalScheduled = false;\n void this.flushCritical();\n });\n }\n\n private async flushCritical(): Promise<void> {\n if (this.criticalQueue.length === 0) return;\n // Drain under a local snapshot so new critical events enqueued during\n // the post don't get mixed in with this batch (they'll schedule their\n // own microtask).\n const drained = this.criticalQueue.splice(0, this.criticalQueue.length);\n // Post each critical event as a batch-of-1 so a single 4xx on one event\n // can't poison an entire critical batch.\n for (const event of drained) {\n try {\n await this.postBatch([event], `event_critical:${event.eventName}`, \"critical\");\n } catch {\n try {\n await this.post(V1_SINGLE_ENDPOINT, event, `event:${event.eventName}`, \"critical\");\n } catch {\n // PostFn is expected to enqueue to OfflineQueue on failure; if it\n // still throws, there's nothing useful to do here beyond logging.\n if (this.debug) console.log(`[Paywallo] critical event ${event.eventName} post failed`);\n }\n }\n }\n }\n\n private async flushNormal(): Promise<void> {\n if (this.normalQueue.length === 0) return;\n const batch = this.normalQueue.splice(0, this.normalQueue.length);\n if (this.normalTimer !== null) { clearTimeout(this.normalTimer); this.normalTimer = null; }\n\n try {\n await this.postBatch(batch, `event_batch:${batch.length}`);\n } catch {\n for (const event of batch) {\n await this.post(V1_SINGLE_ENDPOINT, event, `event:${event.eventName}`);\n }\n }\n }\n\n /**\n * POST the batch with V2 envelope semantics. Tries `/ingest/batch`\n * first; on failure (404/network) falls back to `/events/batch`\n * with the legacy per-event shape for retrocompat.\n *\n * After a single V2 failure we flip `v2Disabled` and stop trying V2 for\n * the lifetime of this EventBatcher — avoids N retries per batch on old\n * servers that will never have the endpoint. A fresh `new EventBatcher()`\n * (e.g. after `Paywallo.init` on a new server URL) resets the flag.\n */\n private async postBatch(\n events: EventPayload[],\n label: string,\n priority: EventPriority = \"normal\",\n ): Promise<void> {\n if (!this.v2Disabled) {\n try {\n const providerContext = resolveProviderContext(this.contextProvider);\n const inputs: EventInput[] = events.map((e) => ({\n eventName: e.eventName,\n distinctId: e.distinctId,\n properties: e.properties,\n timestamp: e.timestamp,\n }));\n const envelope = buildV2Envelope(inputs, providerContext);\n const parsed = v2EnvelopeSchema.safeParse(envelope);\n if (!parsed.success) {\n if (this.debug) console.log(`[Paywallo EVENTS] V2 envelope schema validation failed:`, parsed.error.issues);\n throw parsed.error;\n }\n await this.post(V2_BATCH_ENDPOINT, parsed.data, label, priority);\n return;\n } catch (error) {\n this.v2Disabled = true;\n if (this.debug) {\n console.log(\n `[Paywallo EVENTS] V2 ingest unavailable, falling back to /events/batch:`,\n error,\n );\n }\n // fall through to V1 legacy path below\n }\n }\n await this.post(V1_BATCH_ENDPOINT, { events }, label, priority);\n }\n}\n\nexport type { EventInput, V2Envelope, V2Event } from \"./eventEnvelopeV2\";\n","import { offlineQueue } from \"./queue\";\nimport { networkMonitor } from \"./network\";\n\nexport interface QueueDeps {\n isOfflineQueueEnabled: () => boolean;\n getAppKey: () => string;\n isDebug: () => boolean;\n post: (path: string, body: unknown, skipRetry?: boolean) => Promise<unknown>;\n}\n\nexport async function postWithQueue(\n deps: QueueDeps,\n url: string,\n payload: unknown,\n label: string,\n priority?: \"critical\" | \"normal\",\n): Promise<void> {\n if (deps.isOfflineQueueEnabled() && !networkMonitor.isOnline()) {\n await offlineQueue.enqueue(\n \"POST\",\n url,\n payload as Record<string, unknown>,\n { \"X-App-Key\": deps.getAppKey() },\n undefined,\n priority,\n );\n if (deps.isDebug()) console.log(\"[Paywallo:ApiClient] Queued for offline:\", label, priority ?? \"normal\");\n return;\n }\n try {\n await deps.post(url, payload);\n } catch (error) {\n if (deps.isDebug()) console.log(\"[Paywallo:ApiClient] Request failed:\", label, error);\n if (deps.isOfflineQueueEnabled()) {\n await offlineQueue.enqueue(\n \"POST\",\n url,\n payload,\n { \"X-App-Key\": deps.getAppKey() },\n undefined,\n priority,\n );\n return;\n }\n throw error;\n }\n}\n","import { Platform } from \"react-native\";\n\nimport { SDK_VERSION } from \"./version\";\n\nimport type {\n ApiClientConfig,\n CampaignResponse,\n ConditionalFlagContext,\n ConditionalFlagResult,\n EmergencyPaywallResponse,\n Environment,\n FlagVariant,\n PaywallConfig,\n SubscriptionStatusResponse,\n UserProperties,\n ValidatePurchaseResponse,\n} from \"../types\";\n\nimport { deriveWebUrl } from \"./apiUrlUtils\";\nimport {\n getVariant as _getVariant,\n evaluateFlags as _evaluateFlags,\n getConditionalFlag as _getConditionalFlag,\n getVariantFromCache as _getVariantFromCache,\n} from \"./ApiClientFlags\";\nimport {\n getCampaignData,\n getEmergencyPaywall,\n getSubscriptionStatus,\n validatePurchase,\n} from \"../domains/iap/apiPurchaseMethods\";\nimport { HttpClient, type HttpResponse } from \"./http\";\nimport { offlineQueue } from \"./queue\";\nimport { ApiCache } from \"./ApiCache\";\nimport { EventBatcher, type EventContext, type TrackOptions as EventTrackOptions } from \"./EventBatcher\";\nimport { postWithQueue } from \"./ApiClientQueue\";\n\nexport type { ApiClientConfig };\n\nexport class ApiClient {\n private baseUrl: string;\n private webUrl: string;\n private appKey: string;\n private debug: boolean;\n private environment: Environment;\n private offlineQueueEnabled: boolean;\n private httpClient: HttpClient;\n private readonly cache = new ApiCache();\n private readonly batcher: EventBatcher;\n private eventContextProvider: (() => EventContext | null) | null = null;\n private onError: ((error: unknown) => void) | null = null;\n\n constructor(\n appKey: string,\n apiUrl: string,\n debug = false,\n environment: Environment = \"Production\",\n offlineQueueEnabled = true,\n timeout = 30000,\n ) {\n this.appKey = appKey;\n this.baseUrl = apiUrl;\n this.webUrl = deriveWebUrl(this.baseUrl);\n this.debug = debug;\n this.environment = environment;\n this.offlineQueueEnabled = offlineQueueEnabled;\n this.httpClient = new HttpClient(this.baseUrl, {\n timeout,\n debug,\n globalHeaders: this.buildSdkHeaders(),\n });\n this.batcher = new EventBatcher(\n (url, payload, label, priority) =>\n postWithQueue(\n {\n isOfflineQueueEnabled: () => this.offlineQueueEnabled,\n getAppKey: () => this.appKey,\n isDebug: () => this.debug,\n post: (path, body, skipRetry) => this.post(path, body, skipRetry),\n },\n url,\n payload as Record<string, unknown>,\n label,\n priority,\n ),\n debug,\n () => this.resolveEventContext(),\n );\n }\n\n /**\n * Inject a context provider so the EventBatcher can hoist global fields\n * (sdk/platform/version/locale/attribution/ids) out of each event into\n * the V2 envelope. Allows PaywalloClient to wire in identity/session\n * state lazily without the batcher depending on those singletons.\n */\n setEventContextProvider(provider: () => EventContext | null): void {\n this.eventContextProvider = provider;\n }\n\n private resolveEventContext(): EventContext | null {\n if (!this.eventContextProvider) return null;\n try {\n return this.eventContextProvider();\n } catch {\n return null;\n }\n }\n\n getHttpClient(): HttpClient { return this.httpClient; }\n getBaseUrl(): string { return this.baseUrl; }\n getWebUrl(): string { return this.webUrl; }\n getAppKey(): string { return this.appKey; }\n getEnvironment(): Environment { return this.environment; }\n getQueueSize(): number { return offlineQueue.getSize(); }\n setofflineQueueEnabled(enabled: boolean): void { this.offlineQueueEnabled = enabled; }\n isofflineQueueEnabled(): boolean { return this.offlineQueueEnabled; }\n\n setOnError(callback: ((error: unknown) => void) | null): void { this.onError = callback; }\n\n setEnvironment(environment: Environment): void {\n this.environment = environment;\n // Keep the global `x-sdk-environment` header in sync so server-side\n // analytics/routing observe the new env on the very next request.\n this.httpClient.setGlobalHeaders({ \"x-sdk-environment\": this.environment });\n }\n setDebug(debug: boolean): void { this.debug = debug; this.httpClient.setDebug(debug); }\n\n /**\n * Build the baseline SDK telemetry headers that every outgoing request\n * should carry. Keep this tiny — it runs once per ApiClient instance.\n */\n private buildSdkHeaders(): Record<string, string> {\n return {\n \"x-sdk-version\": SDK_VERSION,\n \"x-sdk-platform\": Platform.OS,\n \"x-sdk-environment\": this.environment,\n };\n }\n async clearQueue(): Promise<void> { await offlineQueue.clear(); }\n async get<T>(path: string): Promise<HttpResponse<T>> {\n try {\n return await this.httpClient.get<T>(path, { headers: { \"X-App-Key\": this.appKey } });\n } catch (error) {\n this.onError?.(error);\n throw error;\n }\n }\n async post<T>(path: string, body: unknown, skipRetry = false): Promise<HttpResponse<T>> {\n try {\n return await this.httpClient.post<T>(path, body, { headers: { \"X-App-Key\": this.appKey }, skipRetry });\n } catch (error) {\n this.onError?.(error);\n throw error;\n }\n }\n\n async reportError(errorType: string, message: string, context?: Record<string, unknown>): Promise<void> {\n try {\n await this.post(\"/sdk/errors\", {\n errorType, message, context,\n sdkVersion: SDK_VERSION,\n platform: Platform.OS,\n }, true);\n } catch (err) {\n if (this.debug) console.log(\"[Paywallo:ApiClient] reportError failed\", err);\n }\n }\n\n async trackEvent(\n eventName: string,\n distinctId: string,\n properties?: UserProperties,\n timestamp?: number,\n options?: EventTrackOptions,\n ): Promise<void> {\n await this.batcher.track(eventName, distinctId, this.environment, properties, timestamp, options);\n }\n async flushEventBatch(): Promise<void> { await this.batcher.flush(); }\n dispose(): void { this.batcher.dispose(); }\n\n async identify(\n distinctId: string,\n properties?: UserProperties,\n email?: string,\n deviceId?: string,\n pii?: { phone?: string; firstName?: string; lastName?: string; dateOfBirth?: string; gender?: string },\n ): Promise<void> {\n await postWithQueue(\n {\n isOfflineQueueEnabled: () => this.offlineQueueEnabled,\n getAppKey: () => this.appKey,\n isDebug: () => this.debug,\n post: (path, body, skipRetry) => this.post(path, body, skipRetry),\n },\n \"/sdk/identify\",\n {\n distinctId,\n properties: properties ?? {},\n email,\n platform: Platform.OS,\n ...(deviceId && { deviceId }),\n ...(pii?.phone && { phone: pii.phone }),\n ...(pii?.firstName && { firstName: pii.firstName }),\n ...(pii?.lastName && { lastName: pii.lastName }),\n ...(pii?.dateOfBirth && { dateOfBirth: pii.dateOfBirth }),\n ...(pii?.gender && { gender: pii.gender }),\n },\n \"identify\",\n );\n }\n\n // Session lifecycle endpoints (`/api/v1/sessions/start` and `/api/v1/sessions/end`)\n // have been dropped. All session bookkeeping is now derived on the server from\n // the `$session_start` and `session.end` events that flow through the unified\n // EventBatcher pipeline.\n\n async getVariant(flagKey: string, distinctId: string): Promise<FlagVariant> {\n return _getVariant(this.flagDeps(), flagKey, distinctId);\n }\n\n async getPaywall(placement: string): Promise<PaywallConfig | null> {\n const hit = this.cache.getPaywall(placement);\n if (hit !== undefined) return hit;\n try {\n const res = await this.get<PaywallConfig>(`/sdk/paywalls/${placement}`);\n if (res.status === 404) { this.cache.setPaywall(placement, null, this.cache.nullTTL); return null; }\n if (!res.ok) {\n const stale = this.cache.getStalePaywall(placement);\n return stale !== undefined ? stale : null;\n }\n this.cache.setPaywall(placement, res.data);\n return res.data;\n } catch {\n const stale = this.cache.getStalePaywall(placement);\n return stale !== undefined ? stale : null;\n }\n }\n\n async getEmergencyPaywall(): Promise<EmergencyPaywallResponse> {\n return getEmergencyPaywall(this);\n }\n\n async getCampaign(placement: string, distinctId: string, context?: Record<string, unknown>): Promise<CampaignResponse | null> {\n const key = `${placement}:${distinctId}`;\n const hit = this.cache.getCampaign(key);\n if (hit !== undefined) return hit;\n try {\n const result = await getCampaignData(this, this.baseUrl, placement, distinctId, context);\n if (!result) { this.cache.setCampaign(key, null, this.cache.nullTTL); return null; }\n this.cache.setCampaign(key, result);\n return result;\n } catch {\n const stale = this.cache.getStaleCampaign(key);\n return stale !== undefined ? stale : null;\n }\n }\n\n async getActivePlacements(): Promise<string[]> {\n try {\n const res = await this.get<{ data: string[] }>(\"/sdk/campaigns/placements\");\n if (!res.ok || !Array.isArray(res.data?.data)) return [];\n return res.data.data;\n } catch {\n return [];\n }\n }\n\n async getPrimaryCampaign(distinctId: string): Promise<CampaignResponse | null> {\n const key = `primary:${distinctId}`;\n const hit = this.cache.getCampaign(key);\n if (hit !== undefined) return hit;\n try {\n const res = await this.get<CampaignResponse>(`/sdk/campaigns/public/primary?distinctId=${encodeURIComponent(distinctId)}`);\n if (res.status === 404) { this.cache.setCampaign(key, null, this.cache.nullTTL); return null; }\n if (!res.ok) {\n const stale = this.cache.getStaleCampaign(key);\n return stale !== undefined ? stale : null;\n }\n this.cache.setCampaign(key, res.data);\n return res.data;\n } catch {\n const stale = this.cache.getStaleCampaign(key);\n return stale !== undefined ? stale : null;\n }\n }\n\n async validatePurchase(\n platform: \"ios\" | \"android\",\n receipt: string,\n productId: string,\n transactionId: string,\n priceLocal: number,\n currency: string,\n country: string,\n distinctId?: string,\n paywallPlacement?: string,\n variantKey?: string,\n ): Promise<ValidatePurchaseResponse> {\n return validatePurchase(this, this.appKey, platform, receipt, productId, transactionId, priceLocal, currency, country, distinctId, paywallPlacement, variantKey);\n }\n\n async getSubscriptionStatus(distinctId: string): Promise<SubscriptionStatusResponse> {\n return getSubscriptionStatus(this, this.baseUrl, this.appKey, distinctId);\n }\n\n async evaluateFlags(keys: string[], distinctId: string): Promise<Record<string, string | null>> {\n return _evaluateFlags(this.flagDeps(), keys, distinctId);\n }\n\n async getConditionalFlag(flagKey: string, context: ConditionalFlagContext): Promise<ConditionalFlagResult> {\n return _getConditionalFlag(this.flagDeps(), flagKey, context);\n }\n\n async getVariantFromCache(flagKey: string, distinctId: string): Promise<FlagVariant | null> {\n return _getVariantFromCache(this.flagDeps(), flagKey, distinctId);\n }\n\n private flagDeps() {\n return {\n get: <T>(path: string) => this.get<T>(path),\n httpClient: this.httpClient,\n cache: this.cache,\n appKey: this.appKey,\n baseUrl: this.baseUrl,\n };\n }\n}\n","import type { ApiClient } from \"./ApiClient\";\nimport type { TrackOptions as EventTrackOptions } from \"./EventBatcher\";\nimport type { UserProperties } from \"../types\";\nimport { identityManager } from \"../domains/identity\";\n\n/**\n * Thin adapter that exposes the unified EventBatcher pipeline to domain\n * singletons (OnboardingManager, NotificationEventTracker, lifecycle hook)\n * without leaking ApiClient / identityManager into those modules.\n *\n * All consumers of this bridge ultimately emit events through\n * `ApiClient.trackEvent` → `EventBatcher` → `/api/v1/events/batch`, which is\n * the single event pipeline in the SDK.\n */\nexport interface EventPipelineBridge {\n trackEvent(\n eventName: string,\n distinctId: string,\n properties?: Record<string, unknown>,\n timestamp?: number,\n options?: EventTrackOptions,\n ): Promise<void>;\n getDistinctId(): string;\n}\n\nfunction coerceProps(properties: Record<string, unknown> | undefined): UserProperties | undefined {\n if (!properties) return undefined;\n const out: UserProperties = {};\n for (const [key, value] of Object.entries(properties)) {\n if (value === null || value === undefined) {\n out[key] = null;\n continue;\n }\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n out[key] = value;\n continue;\n }\n // Fallback: stringify anything else (objects, arrays) so nothing gets dropped.\n try { out[key] = JSON.stringify(value); } catch { out[key] = String(value); }\n }\n return out;\n}\n\nexport function createEventPipelineBridge(apiClient: ApiClient): EventPipelineBridge {\n return {\n trackEvent(eventName, distinctId, properties, timestamp, options) {\n return apiClient.trackEvent(eventName, distinctId, coerceProps(properties), timestamp, options);\n },\n getDistinctId() {\n return identityManager.getDistinctId();\n },\n };\n}\n","import { ApiClient } from \"./ApiClient\";\nimport { campaignGateService } from \"../domains/campaign\";\nimport { identityManager } from \"../domains/identity\";\nimport { notificationsManager } from \"../domains/notifications\";\nimport { SecureStorage } from \"./storage/SecureStorage\";\nimport { createEventPipelineBridge } from \"./eventPipelineBridge\";\nimport { isNativePushAvailable } from \"../domains/notifications/bridges/NativePushBridge\";\nimport type { PaywalloInitConfig } from \"./types\";\nimport type { PaywalloState } from \"./PaywalloState\";\n\nimport { DEFAULT_API_URL } from \"./constants\";\n\nexport function setupNotifications(\n apiClient: ApiClient,\n config: PaywalloInitConfig,\n environment: import(\"../types\").Environment,\n eventPipeline: ReturnType<typeof createEventPipelineBridge>,\n): void {\n // Explicit opt-out via config\n if (config.notifications === false) return;\n\n // Auto-detect: skip if native module not available\n if (config.notifications === undefined && !isNativePushAvailable()) return;\n\n try {\n notificationsManager.injectDeps({\n httpClient: apiClient.getHttpClient(),\n secureStorage: new SecureStorage(config.debug),\n getDeviceId: () => identityManager.getDeviceId(),\n getDistinctId: () => identityManager.getDistinctId(),\n });\n notificationsManager.setupHandlers({ eventBatcher: eventPipeline });\n notificationsManager.initialize({\n appKey: config.appKey,\n apiBaseUrl: config.apiUrl ?? DEFAULT_API_URL,\n debug: config.debug,\n environment: environment === \"Sandbox\" ? \"sandbox\" : \"production\",\n }).catch((err: unknown) => {\n if (config.debug) console.warn(\"[Paywallo PUSH] initialization warning:\", err instanceof Error ? err.message : String(err));\n });\n } catch (err) {\n if (config.debug) console.warn(\"[Paywallo PUSH] setup warning:\", err instanceof Error ? err.message : String(err));\n }\n}\n\nexport function setupAutoPreload(\n state: PaywalloState,\n apiClient: ApiClient,\n config: PaywalloInitConfig,\n distinctId: string,\n): void {\n if (config.autoPreloadCampaign) {\n state.autoPreloadedPlacement = config.autoPreloadCampaign;\n state.autoPreloadPlacementPromise = Promise.resolve(config.autoPreloadCampaign);\n if (config.debug) console.log(`[Paywallo PRELOAD] started — placement: ${config.autoPreloadCampaign}`);\n void campaignGateService.preloadCampaign(apiClient, config.autoPreloadCampaign).catch(() => {});\n return;\n }\n state.autoPreloadPlacementPromise = apiClient.getPrimaryCampaign(distinctId).then((primary) => {\n const placement = primary?.placement ?? primary?.paywall?.placement;\n if (placement) {\n state.autoPreloadedPlacement = placement;\n if (config.debug) console.log(`[Paywallo PRELOAD] started — placement: ${placement}`);\n void campaignGateService.preloadCampaign(apiClient, placement).catch(() => {});\n return placement;\n }\n return null;\n }).catch(() => null);\n}\n\nexport function startBatchPreload(\n apiClient: ApiClient,\n debug?: boolean,\n): void {\n void campaignGateService.preloadAllActive(apiClient, debug).catch(() => {});\n}\n","import { identityManager, InstallTracker } from \"../domains/identity\";\nimport { planService } from \"../domains/plan\";\nimport { advertisingIdManager } from \"../domains/identity/AdvertisingIdManager\";\nimport { deepLinkAttributionCapture } from \"../domains/identity/DeepLinkAttributionCapture\";\nimport { attributionTracker } from \"../domains/identity/InstallTracker\";\nimport { metaBridge } from \"../domains/identity/MetaBridge\";\nimport { onboardingManager } from \"../domains/onboarding\";\nimport { recoverPaywallHeartbeat } from \"../domains/paywall/paywallHeartbeatRecovery\";\nimport { sessionManager } from \"../domains/session\";\nimport { subscriptionManager } from \"../domains/subscription/SubscriptionManager\";\nimport { nativeDeviceInfo,setNativeDeviceInfoDebug } from \"../utils/NativeDeviceInfo\";\n\nimport { ApiClient } from \"./ApiClient\";\nimport { DEFAULT_API_URL } from \"./constants\";\nimport { createEventPipelineBridge } from \"./eventPipelineBridge\";\nimport { networkMonitor } from \"./network\";\nimport { setupAutoPreload, setupNotifications, startBatchPreload } from \"./PaywalloInitHelpers\";\nimport {\n MAX_INIT_RETRIES,\n type PaywalloState,\n RETRY_DELAYS,\n} from \"./PaywalloState\";\nimport { offlineQueue, queueProcessor } from \"./queue\";\nimport { setNativeStorageDebug } from \"./storage/NativeStorage\";\nimport type { PaywalloInitConfig } from \"./types\";\n\n/**\n * Runs init with retry/backoff. Resolves on first successful `doInit`, throws\n * after exhausting retries.\n */\nexport async function initWithRetry(\n state: PaywalloState,\n config: PaywalloInitConfig,\n): Promise<void> {\n while (state.initAttempts <= MAX_INIT_RETRIES) {\n try {\n await doInit(state, config);\n if (state.initAttempts > 0) {\n reportInitSuccess(state, config, state.initAttempts);\n }\n cleanupNetworkRecovery(state);\n state.pendingConfig = null;\n return;\n } catch (error) {\n state.initAttempts++;\n if (state.initAttempts > MAX_INIT_RETRIES) throw error;\n const delay = RETRY_DELAYS[state.initAttempts - 1] ?? 10000;\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n}\n\nexport function setupNetworkRecovery(\n state: PaywalloState,\n config: PaywalloInitConfig,\n): void {\n if (state.networkCleanup) return;\n if (!networkMonitor.isInitialized()) return;\n state.networkCleanup = networkMonitor.addListener((netState) => {\n if (netState !== \"online\") return;\n if (state.config && state.apiClient) return;\n if (state.initPromise) return;\n state.initPromise = initWithRetry(state, config);\n state.initPromise\n .catch(() => { reportInitFailure(state, config, null, \"NETWORK_RECOVERY_FAILED\"); })\n .finally(() => {\n const ready = state.config !== null && state.apiClient !== null;\n if (!ready) state.initPromise = null;\n });\n });\n}\n\nexport function cleanupNetworkRecovery(state: PaywalloState): void {\n if (state.networkCleanup) {\n state.networkCleanup();\n state.networkCleanup = null;\n }\n}\n\nexport function reportInitFailure(\n state: PaywalloState,\n config: PaywalloInitConfig,\n error: unknown,\n reason: string,\n): void {\n try {\n const tempClient = new ApiClient(\n config.appKey,\n config.apiUrl ?? DEFAULT_API_URL,\n config.debug,\n );\n void tempClient.reportError(\"INIT_FAILED\", reason, {\n attempts: state.initAttempts,\n error: error instanceof Error ? error.message : String(error),\n });\n } catch (err) {\n if (config.debug) console.error(\"[Paywallo] reportInitFailure error\", err);\n }\n}\n\nexport function reportInitSuccess(\n state: PaywalloState,\n config: PaywalloInitConfig,\n attempts: number,\n): void {\n try {\n if (state.apiClient) {\n void state.apiClient.reportError(\"INIT_RECOVERED\", `Succeeded after ${attempts} retries`, { attempts });\n }\n } catch (err) {\n if (config.debug) console.error(\"[Paywallo] reportInitSuccess error\", err);\n }\n}\n\nexport async function resolveSessionFlags(\n state: PaywalloState,\n keys: string[],\n apiClient: ApiClient,\n distinctId: string,\n): Promise<void> {\n try {\n const results = await apiClient.evaluateFlags(keys, distinctId);\n state.sessionFlagsMap.clear();\n for (const key of keys) {\n state.sessionFlagsMap.set(key, key in results ? results[key] : null);\n }\n } catch {\n for (const key of keys) {\n state.sessionFlagsMap.set(key, null);\n }\n }\n}\n\nexport async function doInit(\n state: PaywalloState,\n config: PaywalloInitConfig,\n): Promise<void> {\n const environment = config.environment\n ?? (typeof __DEV__ !== \"undefined\" && __DEV__ ? \"Sandbox\" : \"Production\");\n const offlineQueueEnabled = config.offlineQueueEnabled !== false;\n\n await Promise.all([\n networkMonitor.initialize({ debug: config.debug }),\n offlineQueue.initialize({ debug: config.debug }).then(() =>\n offlineQueue.clearItemsWithInvalidAppKey(config.appKey),\n ),\n ]);\n\n const apiClient = new ApiClient(\n config.appKey,\n config.apiUrl ?? DEFAULT_API_URL,\n config.debug,\n environment,\n offlineQueueEnabled,\n config.timeout,\n );\n if (config.onError) apiClient.setOnError(config.onError);\n state.apiClient = apiClient;\n queueProcessor.initialize(apiClient.getHttpClient(), {\n debug: config.debug,\n // Capture app key at flush time, not at enqueue time, so rotated keys\n // and SDK telemetry headers are always current.\n getFreshHeaders: () => ({ \"X-App-Key\": apiClient.getAppKey() }),\n });\n subscriptionManager.init({\n serverUrl: apiClient.getBaseUrl(),\n appKey: config.appKey,\n cacheTTL: config.subscriptionCacheTTL,\n debug: config.debug,\n });\n planService.init({ apiClient, debug: config.debug ?? false });\n\n await identityManager.initialize(apiClient, config.debug);\n\n // Replay de identify() chamado ANTES de init terminar (fica enfileirado\n // em state.pendingIdentifies). Processado aqui, depois da identity estar\n // pronta e ANTES de session.initialize, pra garantir que distinctId já\n // reflete o usuário correto antes da primeira sessão.\n if (state.pendingIdentifies.length > 0) {\n for (const pending of state.pendingIdentifies) {\n try {\n await identityManager.identify(pending);\n } catch (err) {\n if (config.debug) console.warn(\"[Paywallo INIT] pending identify replay failed\", err);\n }\n }\n state.pendingIdentifies = [];\n }\n\n const distinctId = identityManager.getDistinctId();\n\n // Sub-fase 2.8: hidrata attribution a partir do storage + captura cold-start\n // deep link (fbclid/gclid/ttclid/utm_*) via `Linking.getInitialURL()` e\n // registra listener pra warm-start. Best-effort — nunca bloqueia init.\n try {\n await attributionTracker.loadFromStorage();\n } catch (err) {\n if (config.debug) console.log(\"[Paywallo ATTR] loadFromStorage error\", err);\n }\n try {\n await deepLinkAttributionCapture.start();\n } catch (err) {\n if (config.debug) console.log(\"[Paywallo ATTR] start error\", err);\n }\n\n // Pre-warm async caches so the (sync) context provider has data on the\n // first flush. Each is fire-and-forget — first events may go without these\n // fields if a flush races the cache, but every subsequent event picks them\n // up from the populated cache.\n void nativeDeviceInfo.getDeviceInfo().catch(() => null);\n void advertisingIdManager.collect(false).catch(() => null);\n void metaBridge.getAnonymousID().catch(() => null);\n\n // Wire the event context provider so EVERY event envelope (V2) carries\n // attribution (fbclid, ttclid, utm_*, referrer) from the persisted store,\n // device fingerprint (locale, timezone, os_version, device_model, app_version)\n // and ad ids (idfa, idfv, gaid, fb_anon_id) — all required by the server's\n // probabilistic install matcher and CAPI dispatch. Called lazily at flush\n // time so each field reflects the latest state.\n apiClient.setEventContextProvider(() => {\n const attr = attributionTracker.get();\n const attrEntries: Array<[string, string]> = attr\n ? (\n [\n [\"fbclid\", attr.fbclid],\n [\"gclid\", attr.gclid],\n [\"ttclid\", attr.ttclid],\n [\"utm_source\", attr.utmSource],\n [\"utm_medium\", attr.utmMedium],\n [\"utm_campaign\", attr.utmCampaign],\n [\"utm_content\", attr.utmContent],\n [\"utm_term\", attr.utmTerm],\n [\"referrer\", attr.referrer],\n ] as Array<[string, string | undefined]>\n )\n .filter((pair): pair is [string, string] => pair[1] !== undefined && pair[1] !== \"\")\n : [];\n const attribution: Record<string, string> | undefined =\n attrEntries.length > 0 ? Object.fromEntries(attrEntries) : undefined;\n\n const adIds = advertisingIdManager.getCached();\n const fbAnonId = metaBridge.getCachedAnonymousID();\n const idsEntries: Array<[string, string]> = (\n [\n [\"idfa\", adIds?.idfa ?? null],\n [\"idfv\", adIds?.idfv ?? null],\n [\"gaid\", adIds?.gaid ?? null],\n [\"fb_anon_id\", fbAnonId],\n ] as Array<[string, string | null]>\n ).filter((pair): pair is [string, string] => pair[1] !== null && pair[1] !== \"\");\n const ids: Record<string, string> | undefined =\n idsEntries.length > 0 ? Object.fromEntries(idsEntries) : undefined;\n\n const device = nativeDeviceInfo.getCachedDeviceInfo();\n let locale: string | undefined;\n let timezone: string | undefined;\n try {\n const opts = Intl.DateTimeFormat().resolvedOptions();\n locale = opts.locale || undefined;\n timezone = opts.timeZone || undefined;\n } catch { /* non-critical */ }\n\n return {\n distinct_id: identityManager.getDistinctId() || undefined,\n device_id: identityManager.getDeviceId() ?? undefined,\n session_id: sessionManager.getSessionId() ?? undefined,\n app_version: device?.appVersion && device.appVersion !== \"0.0.0\" ? device.appVersion : undefined,\n os_version: device?.systemVersion && device.systemVersion !== \"0.0.0\" ? device.systemVersion : undefined,\n device_model: device?.modelId || device?.model || undefined,\n timezone,\n locale,\n ...(attribution && Object.keys(attribution).length > 0 && { attribution }),\n ...(ids && Object.keys(ids).length > 0 && { ids }),\n };\n });\n\n await sessionManager.initialize(\n apiClient,\n config.sessionConfig,\n config.debug,\n () => identityManager.getDistinctId(),\n );\n\n const eventPipeline = createEventPipelineBridge(apiClient);\n onboardingManager.injectDeps({\n pipeline: eventPipeline,\n debug: config.debug,\n });\n\n setupNotifications(apiClient, config, environment, eventPipeline);\n\n if (config.autoStartSession !== false) {\n sessionManager.startSession().catch((err) => {\n if (config.debug) console.warn(\"[Paywallo INIT] autoStart session error\", err);\n });\n }\n new InstallTracker(config.debug, {\n distinctIdProvider: () => identityManager.getDistinctId(),\n }).trackIfNeeded(apiClient, config.requestATT === true).catch(() => {});\n\n if (config.sessionFlags && config.sessionFlags.length > 0) {\n await resolveSessionFlags(state, config.sessionFlags, apiClient, distinctId);\n }\n\n setNativeStorageDebug(config.debug ?? false);\n setNativeDeviceInfoDebug(config.debug ?? false);\n state.config = config;\n if (state.resolveReady) {\n state.resolveReady();\n state.resolveReady = null;\n }\n console.warn(\"[Paywallo] initialized successfully\");\n\n if (distinctId) {\n apiClient.getSubscriptionStatus(distinctId)\n .then(() => { if (config.debug) console.log(\"[Paywallo SUB] preloaded on boot\"); })\n .catch(() => {});\n\n // Sub-fase 2.10: recupera snapshot de heartbeat órfão (crash/kill com\n // paywall aberto) emitindo um `paywall {closed}` com\n // `close_reason: \"error\"`. Best-effort — nunca bloqueia o boot.\n void recoverPaywallHeartbeat(apiClient, distinctId, sessionManager.getSessionId(), config.debug)\n .catch((err) => { if (config.debug) console.log(\"[Paywallo HEARTBEAT] recovery error\", err); });\n }\n\n setupAutoPreload(state, apiClient, config, distinctId);\n startBatchPreload(apiClient, config.debug);\n}\n","import { campaignGateService } from \"../domains/campaign\";\nimport { getIAPService } from \"../domains/iap/IAPService\";\nimport { identityManager } from \"../domains/identity\";\nimport { deepLinkAttributionCapture } from \"../domains/identity/DeepLinkAttributionCapture\";\nimport { networkMonitor } from \"./network\";\nimport { notificationsManager } from \"../domains/notifications\";\nimport { offlineQueue, queueProcessor } from \"./queue\";\nimport { sessionManager } from \"../domains/session\";\nimport { subscriptionCache } from \"../domains/subscription/SubscriptionCache\";\nimport { cleanupNetworkRecovery } from \"./PaywalloInitializer\";\nimport type { PaywalloState } from \"./PaywalloState\";\n\n/**\n * Soft reset: clears identity + subscription cache but keeps the SDK running.\n * Also tears down the native StoreKit/Billing `Transaction.updates` listener\n * so the post-reset user doesn't receive transaction events attributed to\n * the previous identity. The listener is re-armed on the next\n * `getIAPService()` call.\n */\nexport async function doReset(): Promise<void> {\n await identityManager.reset();\n await subscriptionCache.invalidateAll();\n // Push token belongs to the previous identity — invalidate locally so the\n // next user doesn't re-register the same mapping. We do NOT call the\n // server: opt-out is an explicit user action, not a side-effect of reset.\n await notificationsManager.invalidateLocalToken().catch(() => undefined);\n try {\n getIAPService().stopTransactionListener();\n } catch {\n // getIAPService can throw in edge cases — never block reset on cleanup.\n }\n}\n\n/**\n * Hard reset: tears down every subsystem and resets state to the pre-`init`\n * defaults. Used by tests and on explicit user sign-out flows.\n */\nexport async function doFullReset(state: PaywalloState): Promise<void> {\n await sessionManager.endSession();\n sessionManager.destroy();\n await identityManager.reset();\n await subscriptionCache.invalidateAll();\n queueProcessor.dispose();\n offlineQueue.dispose();\n networkMonitor.dispose();\n campaignGateService.clearPreloaded();\n // Wipe the local token before tearing the manager down — `destroy()`\n // clears the in-memory token but not the secure-storage copy.\n await notificationsManager.invalidateLocalToken().catch(() => undefined);\n notificationsManager.destroy();\n deepLinkAttributionCapture.stop();\n try {\n getIAPService().stopTransactionListener();\n } catch { /* ignore — tests may not have IAPService wired */ }\n cleanupNetworkRecovery(state);\n state.sessionFlagsMap.clear();\n state.apiClient?.dispose();\n\n state.apiClient = null;\n state.config = null;\n state.initPromise = null;\n state.readyPromise = null;\n state.resolveReady = null;\n state.pendingConfig = null;\n state.initAttempts = 0;\n state.paywallPresenter = null;\n state.campaignPresenter = null;\n state.subscriptionGetter = null;\n state.activeChecker = null;\n state.restoreHandler = null;\n state.lastOnboardingStepTimestamp = null;\n state.autoPreloadedPlacement = null;\n state.autoPreloadPlacementPromise = null;\n}\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class AnalyticsError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"analytics\", code, message);\n this.name = \"AnalyticsError\";\n }\n}\n\nexport const ANALYTICS_ERROR_CODES = {\n NOT_INITIALIZED: \"ANALYTICS_NOT_INITIALIZED\",\n INVALID_STEP_INDEX: \"ANALYTICS_INVALID_STEP_INDEX\",\n INVALID_ACTION_NAME: \"ANALYTICS_INVALID_ACTION_NAME\",\n VALIDATION_ERROR: \"ANALYTICS_VALIDATION_ERROR\",\n} as const;\n","export { AnalyticsError, ANALYTICS_ERROR_CODES } from \"./AnalyticsError\";\n","import { ANALYTICS_ERROR_CODES, AnalyticsError } from \"../domains/analytics\";\nimport { CLIENT_ERROR_CODES, ClientError } from \"../errors/ClientError\";\nimport type { TrackEventOptions } from \"../types\";\nimport type { ApiClient } from \"./ApiClient\";\nimport { identityManager } from \"../domains/identity\";\nimport { sessionManager } from \"../domains/session\";\nimport type { PaywalloState } from \"./PaywalloState\";\n\nexport function isValidEventName(name: string): boolean {\n if (name.startsWith(\"$\")) return /^\\$[a-z][a-z0-9]*(_[a-z0-9]+)*$/.test(name);\n return /^[a-z][a-z0-9]*(_[a-z0-9]+)*$/.test(name);\n}\n\nexport async function trackEvent(\n apiClient: ApiClient,\n state: PaywalloState,\n eventName: string,\n options?: TrackEventOptions,\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) {\n if (state.config?.debug) console.log(`[Paywallo TRACK] ${eventName} skipped (no distinctId)`);\n return;\n }\n if (!isValidEventName(eventName)) {\n const msg = `Invalid event name: \"${eventName}\". Use snake_case or $reserved_name.`;\n throw new ClientError(CLIENT_ERROR_CODES.INVALID_EVENT_NAME, msg);\n }\n if (state.config?.debug && eventName.startsWith(\"$purchase\")) console.log(`[Paywallo TRACK] ${eventName}`, options?.properties ?? {});\n const sessionId = sessionManager.getSessionId();\n await apiClient.trackEvent(\n eventName,\n distinctId,\n { ...identityManager.getProperties(), ...options?.properties, ...(sessionId && { sessionId }) },\n options?.timestamp,\n options?.priority ? { priority: options.priority } : undefined,\n );\n}\n\nexport async function trackOnboardingStep(\n apiClient: ApiClient,\n state: PaywalloState,\n index: number,\n name: string,\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) return;\n if (!Number.isInteger(index) || index < 0) {\n const msg = `Invalid stepIndex: \"${index}\". Must be a non-negative integer.`;\n throw new AnalyticsError(ANALYTICS_ERROR_CODES.INVALID_STEP_INDEX, msg);\n }\n const now = Date.now();\n const timeOnPreviousStep = state.lastOnboardingStepTimestamp !== null\n ? Math.round((now - state.lastOnboardingStepTimestamp) / 1000) : 0;\n state.lastOnboardingStepTimestamp = now;\n await apiClient.trackEvent(\"$onboarding_step\", distinctId, { stepIndex: index, stepName: name, timeOnPreviousStep });\n}\n\nexport function validateCoreAction(actionName: string): void {\n if (!actionName || typeof actionName !== \"string\") {\n const msg = `Invalid actionName: \"${actionName}\". Must be a non-empty string.`;\n throw new AnalyticsError(ANALYTICS_ERROR_CODES.INVALID_ACTION_NAME, msg);\n }\n}\n","import type { Subscription } from \"../types\";\nimport { identityManager } from \"../domains/identity\";\nimport type { PaywalloState } from \"./PaywalloState\";\n\nexport async function checkActiveSubscription(state: PaywalloState): Promise<boolean> {\n try {\n if (state.activeChecker) {\n const isActive = (await state.activeChecker()) === true;\n if (state.config?.debug) console.log(\"[Paywallo SUB] hasActiveSubscription (checker):\", isActive);\n return isActive;\n }\n const distinctId = identityManager.getDistinctId();\n if (!distinctId || !state.apiClient) {\n if (state.config?.debug) console.log(\"[Paywallo SUB] hasActiveSubscription: false (no distinctId/apiClient)\");\n return false;\n }\n const status = await state.apiClient.getSubscriptionStatus(distinctId);\n const isActive = status.hasActiveSubscription === true;\n if (state.config?.debug) console.log(\"[Paywallo SUB] hasActiveSubscription (server):\", isActive);\n return isActive;\n } catch (error) {\n if (state.config?.debug) console.error(\"[Paywallo SUB] hasActiveSubscription error\", error);\n if (state.apiClient) void state.apiClient.reportError(\"SUBSCRIPTION_CHECK_FAILED\", error instanceof Error ? error.message : \"hasActiveSubscription failed\");\n return false;\n }\n}\n\nexport async function fetchSubscription(state: PaywalloState): Promise<Subscription | null> {\n try {\n if (state.subscriptionGetter) return await state.subscriptionGetter();\n const distinctId = identityManager.getDistinctId();\n if (!distinctId || !state.apiClient) return null;\n const status = await state.apiClient.getSubscriptionStatus(distinctId);\n if (!status.subscription) return null;\n return { ...status.subscription, expiresAt: status.subscription.expiresAt ? new Date(status.subscription.expiresAt) : null };\n } catch {\n return null;\n }\n}\n","import type { ConditionalFlagContext, FlagVariant } from \"../types\";\nimport { identityManager } from \"../domains/identity\";\nimport type { ApiClient } from \"./ApiClient\";\nimport type { PaywalloState } from \"./PaywalloState\";\n\nexport async function getVariantCached(apiClient: ApiClient, flagKey: string, defaultValue?: string): Promise<FlagVariant> {\n const distinctId = identityManager.getDistinctId();\n const result = await apiClient.getVariantFromCache(flagKey, distinctId);\n if (result) return result;\n void apiClient.getVariant(flagKey, distinctId).catch(() => {});\n return { variant: defaultValue ?? null, payload: undefined };\n}\n\nexport async function getVariant(apiClient: ApiClient, state: PaywalloState, flagKey: string): Promise<FlagVariant> {\n try {\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) {\n if (state.config?.debug) console.log(`[Paywallo FLAG] ${flagKey} → null (no distinctId)`);\n return { variant: null };\n }\n const result = await apiClient.getVariant(flagKey, distinctId);\n if (state.config?.debug) console.log(`[Paywallo FLAG] ${flagKey} →`, result.variant);\n return result;\n } catch (error) {\n if (state.config?.debug) console.log(`[Paywallo FLAG] ${flagKey} → error`, error);\n if (state.apiClient) void state.apiClient.reportError(\"GET_VARIANT_FAILED\", error instanceof Error ? error.message : String(error));\n return { variant: null };\n }\n}\n\nexport function evaluateFlags(apiClient: ApiClient, keys: string[]): Promise<Record<string, string | null>> {\n return apiClient.evaluateFlags(keys, identityManager.getDistinctId());\n}\n\nexport async function getConditionalFlag(apiClient: ApiClient, state: PaywalloState, flagKey: string, context?: Partial<ConditionalFlagContext>): Promise<boolean> {\n try {\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) return false;\n const result = await apiClient.getConditionalFlag(flagKey, { distinctId, ...context });\n return result.value;\n } catch (error) {\n if (state.apiClient) void state.apiClient.reportError(\"GET_CONDITIONAL_FLAG_FAILED\", error instanceof Error ? error.message : String(error));\n return false;\n }\n}\n","import { CLIENT_ERROR_CODES, ClientError } from \"../errors/ClientError\";\nimport { PAYWALL_ERROR_CODES, PaywallError } from \"../domains/paywall\";\nimport type {\n CampaignResponse, CampaignResult, ConditionalFlagContext, IdentifyOptions,\n PaywallResult, RestoreResult, Subscription, TrackEventOptions, UserProperties,\n} from \"../types\";\nimport { ApiClient } from \"./ApiClient\";\nimport { campaignGateService } from \"../domains/campaign\";\nimport { identityManager } from \"../domains/identity\";\nimport { notificationsManager } from \"../domains/notifications\";\nimport type { PushPermissionStatus } from \"../domains/notifications\";\nimport { sessionManager } from \"../domains/session\";\nimport type { EmergencyPaywallHandler } from \"../domains/session/types\";\nimport type { EmergencyPaywallResponse } from \"../types/paywall\";\nimport { networkMonitor } from \"./network\";\nimport { offlineQueue, queueProcessor } from \"./queue\";\nimport type { IPaywalloClient, PaywalloInitConfig, PreloadCampaignResult } from \"./types\";\nimport {\n createPaywalloState, type ActiveChecker, type CampaignPresenter, type PaywallPresenter,\n type PaywalloState, type RestoreHandler, type SubscriptionGetter,\n} from \"./PaywalloState\";\nimport { initWithRetry, reportInitFailure, setupNetworkRecovery } from \"./PaywalloInitializer\";\nimport { doFullReset, doReset } from \"./PaywalloLifecycle\";\nimport { trackEvent, trackOnboardingStep, validateCoreAction } from \"./PaywalloAnalytics\";\nimport { checkActiveSubscription, fetchSubscription } from \"./PaywalloSubscription\";\nimport { getVariantCached, getVariant, evaluateFlags, getConditionalFlag } from \"./PaywalloFlags\";\nimport { planService } from \"../domains/plan\";\nimport type { Plan, AllPlansResponse } from \"../domains/plan\";\n\nexport type { IPaywalloClient, PaywalloInitConfig, PreloadCampaignResult } from \"./types\";\n\nclass PaywalloClientClass {\n private readonly state: PaywalloState = createPaywalloState();\n\n async init(config: PaywalloInitConfig): Promise<void> {\n const s = this.state;\n if (!s.readyPromise) s.readyPromise = new Promise<void>((resolve) => { s.resolveReady = resolve; });\n if (s.config && s.apiClient) { return; }\n if (s.initPromise) { await s.initPromise; return; }\n if (!config.appKey) throw new ClientError(CLIENT_ERROR_CODES.MISSING_APP_KEY, \"appKey is required\");\n s.pendingConfig = config;\n s.initAttempts = 0;\n s.initPromise = initWithRetry(s, config);\n try {\n await s.initPromise;\n } catch (error) {\n s.initPromise = null; s.config = null; s.apiClient = null;\n reportInitFailure(s, config, error, \"ALL_RETRIES_EXHAUSTED\");\n setupNetworkRecovery(s, config);\n throw error;\n }\n }\n isReady(): boolean { return this.state.config !== null && this.state.apiClient !== null; }\n waitUntilReady(): Promise<void> {\n const s = this.state;\n if (this.isReady()) return Promise.resolve();\n if (!s.readyPromise) s.readyPromise = new Promise<void>((resolve) => { s.resolveReady = resolve; });\n return s.readyPromise;\n }\n\n async identify(options?: IdentifyOptions | UserProperties): Promise<void> {\n // identify() chamado ANTES de init(): enfileira para replay durante\n // doInit (depois de identity.initialize, antes de session.initialize).\n // Evita throw e race conditions onde session começa antes do identify.\n if (!this.state.config || !this.state.apiClient) {\n if (this.state.initPromise) {\n this.state.pendingIdentifies.push(options);\n if (this.state.config?.debug) console.log(\"[Paywallo IDENTIFY] queued — init in progress\");\n return;\n }\n if (this.state.pendingConfig) {\n this.state.pendingIdentifies.push(options);\n return;\n }\n throw new ClientError(CLIENT_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized. Call Paywallo.init() first\");\n }\n if (this.state.config?.debug) console.log(\"[Paywallo IDENTIFY]\", options ? { hasEmail: \"email\" in options && !!(options as { email?: unknown }).email, hasProperties: \"properties\" in options } : undefined);\n await identityManager.identify(options);\n }\n async track(eventName: string, options?: TrackEventOptions): Promise<void> {\n return trackEvent(this.getApiClientOrThrow(), this.state, eventName, options);\n }\n\n async onboardingStep(index: number, name: string): Promise<void> {\n return trackOnboardingStep(this.getApiClientOrThrow(), this.state, index, name);\n }\n async coreAction(actionName: string): Promise<void> {\n // V2 taxonomy: `$core_action` has zero consumers on the server and was\n // dropped. Callers that want to track arbitrary actions should use the\n // `custom` family via `track(\"my_action\", { ...props })` directly.\n // Kept as validated no-op to preserve the public API shape.\n this.ensureInitialized();\n validateCoreAction(actionName);\n }\n\n async getVariantCached(flagKey: string, defaultValue?: string): Promise<import(\"../types\").FlagVariant> {\n this.ensureInitialized();\n return getVariantCached(this.getApiClientOrThrow(), flagKey, defaultValue);\n }\n\n async getVariant(flagKey: string): Promise<import(\"../types\").FlagVariant> {\n if (!this.state.apiClient) return { variant: null };\n return getVariant(this.state.apiClient, this.state, flagKey);\n }\n\n async evaluateFlags(keys: string[]): Promise<Record<string, string | null>> {\n this.ensureInitialized();\n return evaluateFlags(this.getApiClientOrThrow(), keys);\n }\n\n async getConditionalFlag(flagKey: string, context?: Partial<ConditionalFlagContext>): Promise<boolean> {\n if (!this.state.apiClient) return false;\n return getConditionalFlag(this.state.apiClient, this.state, flagKey, context);\n }\n async getPaywall(placement: string): Promise<import(\"../types\").PaywallConfig | null> {\n return this.getApiClientOrThrow().getPaywall(placement);\n }\n async presentPaywall(placement: string): Promise<PaywallResult> {\n this.ensureInitialized();\n if (!this.state.paywallPresenter) throw new PaywallError(PAYWALL_ERROR_CODES.NOT_INITIALIZED, \"PaywalloProvider not mounted. Wrap your app with <PaywalloProvider>\");\n return this.state.paywallPresenter(placement);\n }\n async getCampaign(placement: string, context?: Record<string, unknown>): Promise<CampaignResponse | null> {\n return campaignGateService.getCampaign(this.getApiClientOrThrow(), placement, context);\n }\n async presentCampaign(placement: string, context?: Record<string, unknown>): Promise<CampaignResult> {\n this.ensureInitialized();\n if (this.state.config?.debug) console.log(`[Paywallo CAMPAIGN] presenting ${placement}`);\n const result = await campaignGateService.presentCampaign(this.getApiClientOrThrow(), placement, () => this.hasActiveSubscription(), this.state.paywallPresenter, this.state.campaignPresenter, context);\n if (this.state.config?.debug) {\n if (result.error) console.log(`[Paywallo CAMPAIGN] ${placement} error:`, result.error.message);\n else console.log(`[Paywallo CAMPAIGN] ${placement} result:`, { purchased: result.purchased, cancelled: result.cancelled, restored: result.restored, skippedReason: result.skippedReason });\n }\n return result;\n }\n async hasActiveSubscription(): Promise<boolean> {\n this.ensureInitialized();\n return checkActiveSubscription(this.state);\n }\n async getSubscription(): Promise<Subscription | null> {\n this.ensureInitialized();\n return fetchSubscription(this.state);\n }\n async restorePurchases(): Promise<RestoreResult> {\n this.ensureInitialized();\n if (!this.state.restoreHandler) throw new PaywallError(PAYWALL_ERROR_CODES.NOT_INITIALIZED, \"PaywalloProvider not mounted. Wrap your app with <PaywalloProvider>\");\n if (this.state.config?.debug) console.log(\"[Paywallo RESTORE] starting\");\n const result = await this.state.restoreHandler();\n if (this.state.config?.debug) console.log(\"[Paywallo RESTORE] result:\", { success: result.success, restoredProducts: result.restoredProducts?.length ?? 0 });\n return result;\n }\n async reset(): Promise<void> { await doReset(); }\n async fullReset(): Promise<void> { await doFullReset(this.state); }\n\n /**\n * Request OS push permission (iOS/Android 13+) and, on grant, register\n * the FCM/APNS token with the Paywallo backend. Returns the final\n * permission status — no-op safe to call before init (returns\n * `notDetermined`). Token renewal via `onTokenRefresh` re-registers\n * automatically.\n */\n async requestPushPermission(options?: { provisional?: boolean }): Promise<PushPermissionStatus> {\n if (!this.state.config || !this.state.apiClient) {\n if (this.state.config?.debug) console.log(\"[Paywallo PUSH] requestPushPermission called before init\");\n return \"notDetermined\";\n }\n return notificationsManager.requestPushPermission(options);\n }\n\n getSessionFlag(key: string): string | null {\n if (!this.state.config || !this.state.apiClient) return null;\n const value = this.state.sessionFlagsMap.get(key);\n return value !== undefined ? value : null;\n }\n\n getConfig(): import(\"../types\").PaywalloConfig | null { return this.state.config; }\n getDistinctId(): string { return identityManager.getDistinctId(); }\n getDeviceId(): string | null { return identityManager.getDeviceId(); }\n getEmail(): string | null { return identityManager.getEmail(); }\n getEnvironment(): import(\"../types\").Environment { return this.state.apiClient?.getEnvironment() ?? \"Production\"; }\n setEnvironment(environment: import(\"../types\").Environment): void { this.state.apiClient?.setEnvironment(environment); }\n getApiClient(): ApiClient | null { return this.state.apiClient; }\n getWebUrl(): string | null { return this.state.apiClient?.getWebUrl() ?? null; }\n getIdentityState(): import(\"../domains/identity/IdentityManager\").IdentityState { return identityManager.getState(); }\n getSessionState(): import(\"../domains/session/types\").SessionState { return sessionManager.getState(); }\n getSessionId(): string | null { return sessionManager.getSessionId(); }\n async startSession(): Promise<string> { return sessionManager.startSession(); }\n async endSession(): Promise<void> { return sessionManager.endSession(); }\n registerPaywallPresenter(p: PaywallPresenter | null): void { this.state.paywallPresenter = p; }\n registerCampaignPresenter(p: CampaignPresenter | null): void { this.state.campaignPresenter = p; }\n registerSubscriptionGetter(g: SubscriptionGetter | null): void { this.state.subscriptionGetter = g; }\n registerActiveChecker(c: ActiveChecker | null): void { this.state.activeChecker = c; }\n registerRestoreHandler(h: RestoreHandler | null): void { this.state.restoreHandler = h; }\n registerEmergencyPaywallHandler(h: EmergencyPaywallHandler | null): void { sessionManager.registerEmergencyPaywallHandler(h); }\n\n async getEmergencyPaywall(): Promise<EmergencyPaywallResponse> {\n if (!this.state.apiClient) throw new ClientError(CLIENT_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized\");\n return this.state.apiClient.getEmergencyPaywall();\n }\n async requireSubscription(paywallPlacement?: string): Promise<boolean> {\n this.ensureInitialized();\n if (await this.hasActiveSubscription()) return true;\n if (!paywallPlacement) return false;\n const r = await this.presentPaywall(paywallPlacement);\n return r.purchased || r.restored;\n }\n async requireSubscriptionWithCampaign(placement: string, context?: Record<string, unknown>): Promise<boolean> {\n this.ensureInitialized();\n return campaignGateService.requireSubscriptionWithCampaign(this.getApiClientOrThrow(), placement, () => this.hasActiveSubscription(), this.state.paywallPresenter, this.state.campaignPresenter, context);\n }\n async gateContent<T>(content: () => T | Promise<T>, paywallPlacement?: string): Promise<T | null> {\n return (await this.requireSubscription(paywallPlacement)) ? content() : null;\n }\n async gateContentWithCampaign<T>(content: () => T | Promise<T>, placement: string, context?: Record<string, unknown>): Promise<T | null> {\n return (await this.requireSubscriptionWithCampaign(placement, context)) ? content() : null;\n }\n async preloadCampaign(placement: string, context?: Record<string, unknown>): Promise<PreloadCampaignResult> {\n return campaignGateService.preloadCampaign(this.getApiClientOrThrow(), placement, context);\n }\n getPreloadedCampaign(placement: string): CampaignResponse | null { return campaignGateService.getPreloadedCampaign(placement); }\n isPreloaded(placement: string): boolean { return campaignGateService.getPreloadedCampaign(placement) !== null; }\n getAutoPreloadedPlacement(): string | null { return this.state.autoPreloadedPlacement; }\n waitForAutoPreloadedPlacement(): Promise<string | null> { return this.state.autoPreloadPlacementPromise ?? Promise.resolve(null); }\n isOnline(): boolean { return networkMonitor.isOnline(); }\n getOfflineQueueSize(): number { return offlineQueue.getSize(); }\n async clearOfflineQueue(): Promise<void> { await offlineQueue.clear(); }\n async processOfflineQueue(): Promise<{ processed: number; failed: number }> { return queueProcessor.processQueue(); }\n\n async getPlans(): Promise<AllPlansResponse> {\n this.ensureInitialized();\n return planService.getAllPlans();\n }\n\n async getCurrentPlan(): Promise<Plan | null> {\n this.ensureInitialized();\n return planService.getCurrentPlan();\n }\n\n private getApiClientOrThrow(): ApiClient {\n if (!this.state.config || !this.state.apiClient) throw new ClientError(CLIENT_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized. Call Paywallo.init() first\");\n return this.state.apiClient;\n }\n private ensureInitialized(): void {\n if (!this.state.config || !this.state.apiClient) throw new ClientError(CLIENT_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized. Call Paywallo.init() first\");\n }\n}\n\nexport const PaywalloClient: IPaywalloClient = new PaywalloClientClass();\n","import { PaywalloClient } from \"./core/PaywalloClient\";\n\nexport { PaywallModal } from \"./domains/paywall\";\nexport { PaywalloContext, type PreloadResult } from \"./context/PaywalloContext\";\nexport { PaywallContext, usePaywallContext } from \"./domains/paywall\";\nexport { ApiClient, type ApiClientConfig } from \"./core/ApiClient\";\nexport {\n HttpClient,\n type HttpClientConfig,\n type HttpResponse,\n type RequestOptions,\n type RetryConfig,\n} from \"./core/http\";\nexport { getIAPService, IAPService } from \"./domains/iap\";\nexport { IdentityManager, identityManager, type IdentityState } from \"./domains/identity\";\nexport { MetaBridge, metaBridge } from \"./domains/identity\";\nexport { nativeStoreKit } from \"./domains/iap\";\nexport {\n type NetworkListener,\n networkMonitor,\n type NetworkMonitorConfig,\n type NetworkState,\n} from \"./core/network\";\nexport {\n type IPaywalloClient,\n PaywalloClient,\n type PaywalloInitConfig,\n type PreloadCampaignResult,\n} from \"./core/PaywalloClient\";\nexport {\n offlineQueue,\n type OfflineQueueConfig,\n type QueueEvent,\n type QueueItem,\n type QueueListener,\n queueProcessor,\n type QueueProcessorConfig,\n} from \"./core/queue\";\nexport {\n type SessionConfig,\n SessionManager,\n sessionManager,\n type SessionState,\n} from \"./domains/session\";\nexport {\n OnboardingManager,\n onboardingManager,\n OnboardingError,\n ONBOARDING_ERROR_CODES,\n type OnboardingStepPayload,\n type OnboardingDropPayload,\n} from \"./domains/onboarding\";\nexport { useOnboarding } from \"./hooks/useOnboarding\";\nexport {\n CAMPAIGN_ERROR_CODES,\n CampaignError,\n createPurchaseError,\n IDENTITY_ERROR_CODES,\n IdentityError,\n PaywalloError,\n PAYWALL_ERROR_CODES,\n PaywallError,\n PURCHASE_ERROR_CODES,\n PurchaseError,\n SESSION_ERROR_CODES,\n SessionError,\n} from \"./errors\";\nexport {\n notificationsManager,\n NotificationsManager,\n NativePushBridge,\n NotificationsError,\n NOTIFICATIONS_ERROR_CODES,\n type IPushBridge,\n type PushPermissionStatus,\n type NotificationEventType,\n type NotificationPayload,\n type NotificationListener,\n type DeviceTokenRegistration,\n type PushPlatform,\n type PrePromptOptions,\n type PrePromptHandle,\n} from \"./domains/notifications\";\nexport { usePaywallo } from \"./hooks/usePaywallo\";\nexport { usePlans } from \"./hooks/usePlans\";\nexport { usePlanPurchase } from \"./hooks/usePlanPurchase\";\nexport { useProducts } from \"./hooks/useProducts\";\nexport { usePurchase } from \"./hooks/usePurchase\";\nexport { useSubscription } from \"./hooks/useSubscription\";\nexport { planService, PlanService, PlanCache, planCache } from \"./domains/plan\";\nexport type { Plan, PlanProduct, PlansResponse, AllPlansResponse, CachedPlans, PlanServiceConfig } from \"./domains/plan\";\nexport { PaywalloProvider, type PaywalloProviderProps } from \"./PaywalloProvider\";\nexport type {\n IAPProduct,\n IAPPurchase,\n ProductPriceInfo,\n PurchaseControllerConfig,\n PurchaseState,\n} from \"./domains/iap\";\nexport { ERROR_CODES } from \"./domains/iap\";\nexport type {\n CachedSubscription,\n SubscriptionInfo,\n SubscriptionManagerConfig,\n} from \"./domains/subscription\";\nexport { SubscriptionCache, subscriptionManager } from \"./domains/subscription\";\nexport type {\n PaywallErrorStrings,\n BlockType,\n EmergencyPaywallResponse,\n BoxSpacing,\n CampaignPresentOptions,\n CampaignResponse,\n CampaignResult,\n ConditionalFlagContext,\n ConditionalFlagResult,\n Environment,\n FlagVariant,\n IdentifyOptions,\n LocalizedText,\n PaywalloConfig,\n PaywallBlockConfig,\n PaywallConfig,\n PaywallNode,\n PaywallPresentOptions,\n PaywallResult,\n PaywallState,\n Product,\n Purchase,\n PurchaseResult,\n RestoreResult,\n Subscription,\n SubscriptionPlatform,\n SubscriptionStatus,\n SubscriptionStatusResponse,\n TapBehavior,\n TrackEventOptions,\n UserProperties,\n ValidatePurchaseResponse,\n} from \"./types\";\nexport {\n detectDeviceLanguage,\n getCurrentLanguage,\n getDefaultLanguage,\n getLocalizedString,\n initLocalization,\n setCurrentLanguage,\n setDefaultLanguage,\n} from \"./utils/localization\";\nexport type { VariableContext } from \"./utils/variableResolver\";\nexport { hasVariables, parseVariables, resolveText } from \"./utils/variableResolver\";\n\nexport const Paywallo = PaywalloClient;\nexport default Paywallo;\n","import { createContext } from \"react\";\n\nimport type {\n CampaignResult,\n PaywalloConfig,\n PaywallConfig,\n PaywallResult,\n Subscription,\n} from \"../types\";\nimport type { Product } from \"../types/purchase\";\n\nexport interface PreloadResult {\n success: boolean;\n error?: Error;\n}\n\nexport interface PaywalloContextValue {\n config: PaywalloConfig | null;\n isInitialized: boolean;\n isReady: boolean;\n initError: Error | null;\n distinctId: string | null;\n subscription: Subscription | null;\n products: Map<string, Product>;\n isLoadingProducts: boolean;\n presentPaywall: (placement: string) => Promise<PaywallResult>;\n presentCampaign: (\n placement: string,\n context?: Record<string, unknown>\n ) => Promise<CampaignResult>;\n preloadCampaign: (placement: string, context?: Record<string, unknown>) => Promise<PreloadResult>;\n hasActiveSubscription: () => Promise<boolean>;\n getSubscription: () => Promise<Subscription | null>;\n restorePurchases: () => Promise<{ success: boolean; error?: Error }>;\n getPaywallConfig: (placement: string) => Promise<PaywallConfig | null>;\n refreshProducts: (productIds: string[]) => Promise<void>;\n}\n\nexport const PaywalloContext = createContext<PaywalloContextValue | null>(null);\n","export { IAPService, getIAPService } from \"./IAPService\";\nexport { nativeStoreKit, NativeStoreKit } from \"./NativeStoreKit\";\nexport {\n validatePurchase,\n getSubscriptionStatus,\n getEmergencyPaywall,\n getCampaignData,\n} from \"./apiPurchaseMethods\";\nexport {\n parsePrice,\n getSubscriptionPeriodDays,\n calculatePricePerPeriod,\n} from \"./priceFormatter\";\nexport { formatProductForSDK } from \"./productFormatter\";\nexport { PurchaseError, PURCHASE_ERROR_CODES, createPurchaseError } from \"./PurchaseError\";\nexport { ERROR_CODES } from \"./errors\";\nexport type {\n PurchaseState,\n IAPProduct,\n IAPPurchase,\n PurchaseControllerConfig,\n ProductPriceInfo,\n} from \"./types\";\n","export {\n createPurchaseError,\n PURCHASE_ERROR_CODES as ERROR_CODES,\n PurchaseError,\n} from \"./PurchaseError\";\n","import { useCallback } from \"react\";\n\nimport { onboardingManager } from \"../domains/onboarding\";\n\nexport interface UseOnboardingResult {\n step: (stepName: string) => Promise<void>;\n complete: () => Promise<void>;\n drop: (stepName: string) => Promise<void>;\n}\n\n/**\n * React hook that exposes bound onboarding tracking methods.\n * Wraps `onboardingManager` with stable `useCallback` references.\n */\nexport function useOnboarding(): UseOnboardingResult {\n const step = useCallback(\n (stepName: string) => onboardingManager.step(stepName),\n []\n );\n\n const complete = useCallback(\n () => onboardingManager.complete(),\n []\n );\n\n const drop = useCallback(\n (stepName: string) => onboardingManager.drop(stepName),\n []\n );\n\n return { step, complete, drop };\n}\n","export { ANALYTICS_ERROR_CODES, AnalyticsError } from \"../domains/analytics\";\nexport { CAMPAIGN_ERROR_CODES, CampaignError } from \"../domains/campaign\";\nexport { CLIENT_ERROR_CODES, ClientError } from \"./ClientError\";\nexport { IDENTITY_ERROR_CODES, IdentityError } from \"../domains/identity\";\nexport { PaywalloError } from \"./PaywalloError\";\nexport { PAYWALL_ERROR_CODES, PaywallError } from \"../domains/paywall\";\nexport { createPurchaseError, PURCHASE_ERROR_CODES, PurchaseError } from \"../domains/iap\";\nexport { SESSION_ERROR_CODES, SessionError } from \"../domains/session\";\n","import { useContext } from \"react\";\n\nimport { PaywalloContext, PaywalloContextValue } from \"../context/PaywalloContext\";\nimport { CLIENT_ERROR_CODES,ClientError } from \"../errors/ClientError\";\n\nexport function usePaywallo(): PaywalloContextValue {\n const context = useContext(PaywalloContext);\n\n if (!context) {\n throw new ClientError(CLIENT_ERROR_CODES.PROVIDER_MISSING, \"usePaywallo must be used within a PaywalloProvider\");\n }\n\n return context;\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"../domains/iap\";\nimport type { Plan } from \"../domains/plan/types\";\n\n// planService will be wired when PlanService is created.\n// Using dynamic import to avoid hard compile error while domain is in-progress.\nasync function getPlanService(): Promise<{\n getAllPlans(forceRefresh?: boolean): Promise<{ plans: Plan[]; currentIdentifier: string | null }>;\n} | null> {\n try {\n const mod = await import(\"../domains/plan/PlanService\");\n return (mod as { planService: typeof mod.planService }).planService ?? null;\n } catch {\n return null;\n }\n}\n\nexport interface UsePlansResult {\n currentPlan: Plan | null;\n allPlans: Plan[];\n isLoading: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n}\n\nexport function usePlans(): UsePlansResult {\n const [allPlans, setAllPlans] = useState<Plan[]>([]);\n const [currentPlan, setCurrentPlan] = useState<Plan | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchPlans = useCallback(async (forceRefresh = false): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const service = await getPlanService();\n if (!service) {\n throw new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, \"PlanService not available\");\n }\n\n const response = await service.getAllPlans(forceRefresh);\n const { plans, currentIdentifier } = response;\n\n setAllPlans(plans);\n setCurrentPlan(\n currentIdentifier != null\n ? (plans.find((p) => p.identifier === currentIdentifier) ?? null)\n : null\n );\n } catch (err) {\n const e =\n err instanceof PurchaseError\n ? err\n : new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, String(err));\n setError(e);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n const refresh = useCallback((): Promise<void> => {\n return fetchPlans(true);\n }, [fetchPlans]);\n\n useEffect(() => {\n void fetchPlans(false);\n }, [fetchPlans]);\n\n return { currentPlan, allPlans, isLoading, error, refresh };\n}\n","import { useCallback, useState } from \"react\";\n\nimport { getIAPService, createPurchaseError, PURCHASE_ERROR_CODES, PurchaseError } from \"../domains/iap\";\nimport type { PurchaseState } from \"../domains/iap/types\";\nimport type { PurchaseResult } from \"../types/purchase\";\n\n// planService will be wired when PlanService is created.\nasync function invalidatePlanCache(): Promise<void> {\n try {\n const mod = await import(\"../domains/plan/PlanService\");\n (mod as { planService: { invalidateCache(): void } }).planService?.invalidateCache();\n } catch {\n // PlanService not yet available — no-op\n }\n}\n\nexport interface RestoreResult {\n restoredCount: number;\n productIds: string[];\n}\n\nexport interface UsePlanPurchaseResult {\n purchase: (productId: string) => Promise<PurchaseResult | null>;\n restore: () => Promise<RestoreResult | null>;\n isPurchasing: boolean;\n isRestoring: boolean;\n error: Error | null;\n}\n\nexport function usePlanPurchase(): UsePlanPurchaseResult {\n const [state, setState] = useState<PurchaseState>(\"idle\");\n const [error, setError] = useState<PurchaseError | null>(null);\n\n const purchase = useCallback(async (productId: string): Promise<PurchaseResult | null> => {\n setState(\"purchasing\");\n setError(null);\n\n try {\n const iapService = getIAPService();\n const result = await iapService.purchase(productId);\n\n setState(\"idle\");\n\n if (result.success) {\n await invalidatePlanCache();\n }\n\n return result.success\n ? {\n success: true,\n purchase: result.purchase\n ? {\n productId: result.purchase.productId,\n transactionId: result.purchase.transactionId ?? \"\",\n transactionDate: result.purchase.transactionDate,\n receipt: result.purchase.receipt,\n platform: \"ios\",\n }\n : undefined,\n }\n : { success: false, error: result.error };\n } catch (err) {\n const purchaseError =\n err instanceof PurchaseError\n ? err\n : createPurchaseError(\"PURCHASE_FAILED\", err instanceof Error ? err.message : String(err));\n\n if (purchaseError.userCancelled) {\n setState(\"idle\");\n return null;\n }\n\n setError(purchaseError);\n setState(\"error\");\n return { success: false, error: purchaseError };\n }\n }, []);\n\n const restore = useCallback(async (): Promise<RestoreResult | null> => {\n setState(\"restoring\");\n setError(null);\n\n try {\n const iapService = getIAPService();\n const transactions = await iapService.restore();\n\n setState(\"idle\");\n await invalidatePlanCache();\n\n return {\n restoredCount: transactions.length,\n productIds: transactions.map((tx) => tx.productId),\n };\n } catch (err) {\n const e =\n err instanceof PurchaseError\n ? err\n : createPurchaseError(\"RESTORE_FAILED\", String(err));\n\n setError(e);\n setState(\"error\");\n return null;\n }\n }, []);\n\n return {\n purchase,\n restore,\n isPurchasing: state === \"purchasing\",\n isRestoring: state === \"restoring\",\n error,\n };\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"../domains/iap\";\nimport { getIAPService } from \"../domains/iap\";\nimport type { IAPProduct, ProductPriceInfo } from \"../domains/iap/types\";\nimport { mapToFormattedProduct, mapToIAPProduct } from \"../utils/productMappers\";\nimport type { FormattedProduct } from \"../utils/productMappers\";\n\ninterface UseProductsResult {\n products: IAPProduct[];\n formattedProducts: FormattedProduct[];\n isLoading: boolean;\n error: Error | null;\n loadProducts: (productIds: string[]) => Promise<void>;\n getProduct: (productId: string) => IAPProduct | undefined;\n getFormattedProduct: (productId: string) => FormattedProduct | undefined;\n getPriceInfo: (productId: string) => ProductPriceInfo | undefined;\n}\n\nexport function useProducts(initialProductIds?: string[]): UseProductsResult {\n const [products, setProducts] = useState<IAPProduct[]>([]);\n const [formattedProducts, setFormattedProducts] = useState<FormattedProduct[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const loadProducts = useCallback(async (productIds: string[]): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const iapService = getIAPService();\n const storeProducts = await iapService.loadProducts(productIds);\n\n setProducts(storeProducts.map(mapToIAPProduct));\n setFormattedProducts(storeProducts.map(mapToFormattedProduct));\n } catch (err) {\n setError(err instanceof PurchaseError ? err : new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, String(err)));\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n useEffect(() => {\n if (initialProductIds && initialProductIds.length > 0) {\n void loadProducts(initialProductIds);\n }\n // Intentionally runs once on mount — initialProductIds is a seed value, not a reactive dep.\n // Callers that need reactive reloads should call loadProducts() directly.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const getProduct = useCallback(\n (productId: string): IAPProduct | undefined => {\n return products.find((p) => p.productId === productId);\n },\n [products]\n );\n\n const getFormattedProduct = useCallback(\n (productId: string): FormattedProduct | undefined => {\n return formattedProducts.find((p) => p.productId === productId);\n },\n [formattedProducts]\n );\n\n const getPriceInfo = useCallback(\n (productId: string): ProductPriceInfo | undefined => {\n const p = formattedProducts.find((fp) => fp.productId === productId);\n if (!p) return undefined;\n return {\n price: p.price,\n priceValue: p.priceValue,\n currency: p.currency,\n localizedPrice: p.localizedPrice,\n pricePerMonth: p.pricePerMonth,\n pricePerWeek: p.pricePerWeek,\n pricePerDay: p.pricePerDay,\n };\n },\n [formattedProducts]\n );\n\n return {\n products,\n formattedProducts,\n isLoading,\n error,\n loadProducts,\n getProduct,\n getFormattedProduct,\n getPriceInfo,\n };\n}\n","import type { IAPProduct, ProductPriceInfo } from \"../domains/iap/types\";\n\ntype RawStoreProduct = {\n productId: string;\n title: string;\n description: string;\n price: string;\n priceValue: number;\n currency: string;\n localizedPrice: string;\n type: string;\n subscriptionPeriod?: string;\n introductoryPrice?: string;\n freeTrialPeriod?: string;\n trialDays?: number;\n pricePerMonth?: string;\n pricePerWeek?: string;\n pricePerDay?: string;\n};\n\nexport interface FormattedProduct extends ProductPriceInfo {\n productId: string;\n title: string;\n description: string;\n subscriptionPeriod?: string;\n introductoryPrice?: string;\n freeTrialPeriod?: string;\n trialDays: number;\n}\n\nexport function mapToIAPProduct(product: RawStoreProduct): IAPProduct {\n return {\n productId: product.productId,\n price: product.price,\n currency: product.currency,\n localizedPrice: product.localizedPrice,\n title: product.title,\n description: product.description,\n type: product.type === \"subscription\" ? \"subs\" : \"inapp\",\n subscriptionPeriodAndroid: product.subscriptionPeriod,\n introductoryPrice: product.introductoryPrice,\n freeTrialPeriodAndroid: product.freeTrialPeriod,\n trialDays: product.trialDays ?? 0,\n };\n}\n\nexport function mapToFormattedProduct(product: RawStoreProduct): FormattedProduct {\n return {\n productId: product.productId,\n title: product.title,\n description: product.description,\n price: product.price,\n priceValue: product.priceValue,\n currency: product.currency,\n localizedPrice: product.localizedPrice,\n subscriptionPeriod: product.subscriptionPeriod,\n introductoryPrice: product.introductoryPrice,\n freeTrialPeriod: product.freeTrialPeriod,\n trialDays: product.trialDays ?? 0,\n pricePerMonth: product.pricePerMonth,\n pricePerWeek: product.pricePerWeek,\n pricePerDay: product.pricePerDay,\n };\n}\n","import { useCallback, useState } from \"react\";\n\nimport { getIAPService } from \"../domains/iap\";\nimport { createPurchaseError, PURCHASE_ERROR_CODES, PurchaseError } from \"../domains/iap\";\nimport type { IAPPurchase, PurchaseState } from \"../domains/iap/types\";\n\nexport interface PurchaseOutcome {\n status: \"success\" | \"cancelled\" | \"failed\";\n purchase?: IAPPurchase;\n error?: PurchaseError;\n}\n\ninterface UsePurchaseResult {\n state: PurchaseState;\n purchase: (productId: string) => Promise<PurchaseOutcome>;\n restore: () => Promise<IAPPurchase[]>;\n error: PurchaseError | null;\n isPurchasing: boolean;\n isRestoring: boolean;\n}\n\nexport function usePurchase(): UsePurchaseResult {\n const [state, setState] = useState<PurchaseState>(\"idle\");\n const [error, setError] = useState<PurchaseError | null>(null);\n\n const purchase = useCallback(async (productId: string): Promise<PurchaseOutcome> => {\n setState(\"purchasing\");\n setError(null);\n\n try {\n const iapService = getIAPService();\n const result = await iapService.purchase(productId);\n\n if (result.success && result.purchase) {\n setState(\"idle\");\n return {\n status: \"success\",\n purchase: {\n productId: result.purchase.productId,\n transactionId: result.purchase.transactionId,\n transactionDate: result.purchase.transactionDate,\n transactionReceipt: result.purchase.receipt,\n },\n };\n }\n\n if (result.error) {\n setError(result.error);\n setState(\"error\");\n return { status: \"failed\", error: result.error };\n }\n\n setState(\"idle\");\n return { status: \"cancelled\" };\n } catch (err) {\n const purchaseError = err instanceof PurchaseError\n ? err\n : createPurchaseError(\"PURCHASE_FAILED\", err instanceof Error ? err.message : String(err));\n\n if (purchaseError.userCancelled) {\n setState(\"idle\");\n return { status: \"cancelled\" };\n }\n\n setError(purchaseError);\n setState(\"error\");\n return { status: \"failed\", error: purchaseError };\n }\n }, []);\n\n const restore = useCallback(async (): Promise<IAPPurchase[]> => {\n setState(\"restoring\");\n setError(null);\n\n try {\n const iapService = getIAPService();\n const transactions = await iapService.restore();\n\n setState(\"idle\");\n return transactions.map((tx) => ({\n productId: tx.productId,\n transactionId: tx.transactionId,\n transactionDate: tx.transactionDate,\n transactionReceipt: tx.receipt,\n }));\n } catch (err) {\n const e = err instanceof PurchaseError ? err : createPurchaseError(\"RESTORE_FAILED\", String(err));\n setError(e);\n setState(\"error\");\n throw e;\n }\n }, []);\n\n return {\n state,\n purchase,\n restore,\n error,\n isPurchasing: state === \"purchasing\",\n isRestoring: state === \"restoring\",\n };\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"../domains/iap\";\nimport { subscriptionManager } from \"../domains/subscription/SubscriptionManager\";\nimport type { SubscriptionInfo, SubscriptionStatusResponse } from \"../domains/subscription/types\";\n\nconst EMPTY_ENTITLEMENTS: string[] = [];\n\ninterface UseSubscriptionResult {\n subscription: SubscriptionInfo | null;\n isActive: boolean;\n isLoading: boolean;\n error: Error | null;\n entitlements: string[];\n refresh: () => Promise<void>;\n restore: () => Promise<void>;\n}\n\nexport function useSubscription(): UseSubscriptionResult {\n const [status, setStatus] = useState<SubscriptionStatusResponse | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const refresh = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const newStatus = await subscriptionManager.getSubscriptionStatus(true);\n setStatus(newStatus);\n } catch (err) {\n const e = err instanceof PurchaseError ? err : new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, String(err));\n setError(e);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n const restore = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const newStatus = await subscriptionManager.restorePurchases();\n setStatus(newStatus);\n } catch (err) {\n const e = err instanceof PurchaseError ? err : new PurchaseError(PURCHASE_ERROR_CODES.RESTORE_FAILED, String(err));\n setError(e);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n useEffect(() => {\n void subscriptionManager.getSubscriptionStatus()\n .then((s) => {\n setStatus(s);\n setIsLoading(false);\n })\n .catch((err) => {\n const e = err instanceof PurchaseError ? err : new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, String(err));\n setError(e);\n setIsLoading(false);\n });\n\n const removeListener = subscriptionManager.addListener((newStatus) => {\n setStatus(newStatus);\n });\n\n return () => {\n removeListener();\n };\n }, []);\n\n return {\n subscription: status?.subscription ?? null,\n isActive: status?.hasActiveSubscription ?? false,\n isLoading,\n error,\n entitlements: status?.entitlements ?? EMPTY_ENTITLEMENTS,\n refresh,\n restore,\n };\n}\n","import React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { Animated, Dimensions, Easing, StyleSheet } from \"react-native\";\nimport { PaywallErrorBoundary } from \"./domains/paywall\";\nimport { PaywallModal } from \"./domains/paywall\";\nimport { PaywallWebView } from \"./domains/paywall\";\nimport { PaywalloContext, PaywalloContextValue } from \"./context/PaywalloContext\";\nimport { getIAPService } from \"./domains/iap\";\nimport { PaywalloClient } from \"./core/PaywalloClient\";\nimport { useAppAutoEvents } from \"./hooks/useAppAutoEvents\";\nimport { useCampaignPreload } from \"./hooks/useCampaignPreload\";\nimport { sessionManager } from \"./domains/session\";\nimport { SecureStorage } from \"./core/storage/SecureStorage\";\nimport { usePaywallPresenter } from \"./domains/paywall\";\nimport { useProductLoader } from \"./hooks/useProductLoader\";\nimport { usePurchaseOrchestrator } from \"./hooks/usePurchaseOrchestrator\";\nimport { useSubscriptionSync } from \"./hooks/useSubscriptionSync\";\nimport { CAMPAIGN_ERROR_CODES, CampaignError } from \"./domains/campaign\";\nimport { CLIENT_ERROR_CODES, ClientError } from \"./errors/ClientError\";\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"./domains/iap\";\nimport type { CampaignResult, PaywalloConfig, PaywallConfig, PaywallResult, RestoreResult } from \"./types\";\nimport type { Product } from \"./types/purchase\";\nimport { initLocalization } from \"./utils/localization\";\n\nexport interface PaywalloProviderProps { children: React.ReactNode; config: PaywalloConfig; }\ninterface ActivePaywall {\n placement: string;\n resolver: (result: PaywallResult) => void;\n paywallConfig?: { id: string; placement: string; config: Record<string, unknown>; primaryProductId?: string; secondaryProductId?: string };\n preloadedProducts?: Map<string, Product>;\n variantKey?: string;\n campaignId?: string;\n /** UUID de `paywall_variants` (sub-fase 2.14). */\n variantId?: string;\n}\nexport function PaywalloProvider({ children, config }: PaywalloProviderProps): React.ReactElement {\n const [isInitialized, setIsInitialized] = useState(false);\n const [initError, setInitError] = useState<Error | null>(null);\n const [distinctId, setDistinctId] = useState<string | null>(null);\n const [activePaywall, setActivePaywall] = useState<ActivePaywall | null>(null);\n\n const { products, isLoadingProducts, refreshProducts } = useProductLoader();\n const { subscription, hasActiveSubscription, getSubscription, invalidateCache } = useSubscriptionSync();\n const { preloadedWebView, setPreloadedWebView, preloadCampaign, consumePreloadedCampaign, isPreloadValid } = useCampaignPreload();\n const clearPreloadedWebView = useCallback((): void => setPreloadedWebView(null), [setPreloadedWebView]);\n const autoPreloadTriggeredRef = useRef(false);\n const preloadedWebViewRef = useRef(preloadedWebView);\n const pollTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pollCancelledRef = useRef(false);\n const secureStorageRef = useRef(new SecureStorage(config.debug));\n\n useEffect(() => { preloadedWebViewRef.current = preloadedWebView; }, [preloadedWebView]);\n\n useAppAutoEvents({\n isInitialized,\n getAppVersion: () => (config as unknown as { appVersion?: string }).appVersion ?? \"unknown\",\n getSessionId: () => sessionManager.getSessionId(),\n emitLifecycle: (props, priority) => {\n // UserProperties has a string index signature — spread into a fresh object\n // so the compile-time shape matches without leaking `undefined` fields.\n const flat: Record<string, string | number | boolean | null> = {};\n for (const [k, v] of Object.entries(props)) if (v !== undefined) flat[k] = v as string | number | boolean | null;\n return PaywalloClient.track(\"lifecycle\", { properties: flat, priority });\n },\n storageGet: (key) => secureStorageRef.current.get(key),\n storageSet: (key, value) => secureStorageRef.current.set(key, value),\n debug: config.debug,\n });\n\n const triggerRepreload = useCallback((placement: string): void => {\n void PaywalloClient.preloadCampaign(placement).catch(() => {});\n }, []);\n\n const { showingPreloadedWebView, presentPreloadedWebView, resolvePreloadedPaywall, handlePreloadedWebViewReady: baseHandlePreloadedWebViewReady, handlePreloadedClose: baseHandlePreloadedClose, setShowingPreloadedWebView, presentedAtRef } =\n usePaywallPresenter(preloadedWebView, setPreloadedWebView);\n\n const SCREEN_HEIGHT = useMemo(() => Dimensions.get(\"window\").height, []);\n const slideAnim = useRef(new Animated.Value(SCREEN_HEIGHT)).current;\n\n const handlePreloadedWebViewReady = useCallback((): void => {\n if (PaywalloClient.getConfig()?.debug) { console.log(`[Paywallo WEBVIEW] loaded — placement: ${preloadedWebView?.placement}`); }\n baseHandlePreloadedWebViewReady();\n }, [preloadedWebView?.placement, baseHandlePreloadedWebViewReady]);\n\n const handlePreloadedClose = useCallback((): void => {\n const placement = preloadedWebView?.placement;\n Animated.timing(slideAnim, { toValue: SCREEN_HEIGHT, duration: 200, easing: Easing.in(Easing.cubic), useNativeDriver: true }).start(() => {\n baseHandlePreloadedClose();\n if (placement) triggerRepreload(placement);\n });\n }, [baseHandlePreloadedClose, preloadedWebView, triggerRepreload, slideAnim, SCREEN_HEIGHT]);\n\n const { handlePreloadedPurchase: rawPreloadedPurchase, handlePreloadedRestore } = usePurchaseOrchestrator(\n preloadedWebView, resolvePreloadedPaywall, clearPreloadedWebView, setShowingPreloadedWebView, presentedAtRef, invalidateCache\n );\n const [isPreloadPurchasing, setIsPreloadPurchasing] = useState(false);\n const handlePreloadedPurchase = useCallback(async (productId: string) => {\n setIsPreloadPurchasing(true);\n try { await rawPreloadedPurchase(productId); } finally { setIsPreloadPurchasing(false); }\n }, [rawPreloadedPurchase]);\n\n const configRef = useRef(config);\n\n useEffect(() => {\n let mounted = true;\n initLocalization({ detectDevice: true });\n PaywalloClient.init(configRef.current)\n .then(async () => {\n if (!mounted) return;\n setDistinctId(PaywalloClient.getDistinctId());\n setIsInitialized(true);\n if (!autoPreloadTriggeredRef.current) {\n autoPreloadTriggeredRef.current = true;\n const placement = await PaywalloClient.waitForAutoPreloadedPlacement();\n if (mounted && placement) void preloadCampaign(placement).catch(() => {});\n }\n })\n .catch((err: unknown) => {\n if (!mounted) return;\n setInitError(err instanceof Error ? err : new ClientError(CLIENT_ERROR_CODES.NOT_INITIALIZED, String(err)));\n });\n return () => { mounted = false; };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [preloadCampaign]); // config is captured via ref — re-init on config change is intentional no-op\n\n const getPaywallConfig = useCallback(async (p: string): Promise<PaywallConfig | null> => {\n const api = PaywalloClient.getApiClient(); return api ? api.getPaywall(p) : null;\n }, []);\n\n const presentPaywall = useCallback((placement: string): Promise<PaywallResult> => {\n return new Promise<PaywallResult>((resolve) => setActivePaywall({ placement, resolver: resolve }));\n }, []);\n\n // V2 taxonomy: `$campaign_impression` merged into canonical\n // `paywall {type:\"viewed\", campaign_id}`. Single source of truth for\n // impression counts on the server.\n const trackCampaignImpression = useCallback((placement: string, variantKey: string, campaignId: string): void => {\n const api = PaywalloClient.getApiClient();\n if (!api) return;\n const sessionId = PaywalloClient.getSessionId();\n void api.trackEvent(\"paywall\", PaywalloClient.getDistinctId(), {\n type: \"viewed\",\n paywall_id: placement,\n placement,\n variant_key: variantKey,\n campaign_id: campaignId,\n ...(sessionId && { sessionId }),\n }).catch(() => {});\n }, []);\n\n const presentCampaign = useCallback(\n async (placement: string, context?: Record<string, unknown>): Promise<CampaignResult> => {\n try {\n if (preloadedWebView?.placement === placement && preloadedWebView.loaded && isPreloadValid(placement)) {\n consumePreloadedCampaign(placement);\n trackCampaignImpression(placement, preloadedWebView.variantKey ?? \"\", preloadedWebView.campaignId ?? \"\");\n // $paywall_viewed is now emitted from `usePaywallPresenter.presentPreloadedWebView`\n // so the event fires from a single canonical point for the preloaded path.\n const r = await presentPreloadedWebView();\n return {\n ...r,\n campaignId: preloadedWebView.campaignId ?? \"\",\n variantKey: preloadedWebView.variantKey ?? \"\",\n ...(preloadedWebView.variantId && { variantId: preloadedWebView.variantId }),\n };\n }\n const preloaded = consumePreloadedCampaign(placement);\n if (preloaded) {\n trackCampaignImpression(placement, preloaded.variantKey, preloaded.campaignId);\n const r = await new Promise<PaywallResult>((resolve) => setActivePaywall({\n placement: preloaded.paywall.placement, resolver: resolve,\n paywallConfig: preloaded.paywall, preloadedProducts: preloaded.products,\n variantKey: preloaded.variantKey, campaignId: preloaded.campaignId,\n variantId: preloaded.variantId,\n }));\n return {\n ...r,\n campaignId: preloaded.campaignId,\n variantKey: preloaded.variantKey,\n ...(preloaded.variantId && { variantId: preloaded.variantId }),\n };\n }\n const campaign = PaywalloClient.getPreloadedCampaign(placement) ?? await PaywalloClient.getCampaign(placement, context);\n if (!campaign?.paywall) return { presented: false, purchased: false, cancelled: false, restored: false,\n error: new CampaignError(campaign ? CAMPAIGN_ERROR_CODES.PRELOAD_FAILED : CAMPAIGN_ERROR_CODES.NOT_FOUND, campaign ? `No paywall: ${placement}` : `Campaign not found: ${placement}`) };\n trackCampaignImpression(placement, campaign.variantKey, campaign.campaignId);\n const r = await new Promise<PaywallResult>((resolve) => setActivePaywall({\n placement: campaign.paywall.placement, resolver: resolve,\n paywallConfig: { id: campaign.paywall.id, placement: campaign.paywall.placement, config: campaign.paywall.config,\n primaryProductId: campaign.paywall.primaryProductId, secondaryProductId: campaign.paywall.secondaryProductId },\n variantKey: campaign.variantKey, campaignId: campaign.campaignId,\n variantId: campaign.variantId,\n }));\n return {\n ...r,\n campaignId: campaign.campaignId,\n variantKey: campaign.variantKey,\n ...(campaign.variantId && { variantId: campaign.variantId }),\n };\n } catch (error) {\n return { presented: false, purchased: false, cancelled: false, restored: false,\n error: error instanceof Error ? error : new CampaignError(CAMPAIGN_ERROR_CODES.PRESENT_FAILED, String(error)) };\n }\n },\n [preloadedWebView, isPreloadValid, consumePreloadedCampaign, presentPreloadedWebView, trackCampaignImpression]\n );\n\n const restorePurchases = useCallback(async (): Promise<RestoreResult> => {\n invalidateCache();\n try {\n const txs = await getIAPService().restore();\n return txs.length > 0 ? { success: true, restoredProducts: txs.map((tx) => tx.productId) } : { success: false, restoredProducts: [] };\n } catch (error) {\n return { success: false, restoredProducts: [], error: error instanceof Error ? error : new PurchaseError(PURCHASE_ERROR_CODES.RESTORE_FAILED, String(error)) };\n }\n }, [invalidateCache]);\n\n const handlePaywallResult = useCallback((result: PaywallResult): void => {\n if (activePaywall) { activePaywall.resolver(result); setActivePaywall(null); }\n }, [activePaywall]);\n\n const bridgePaywallPresenter = useCallback((placement: string): Promise<PaywallResult> => {\n if (PaywalloClient.getConfig()?.debug) { console.log(`[Paywallo PRESENT] called — preloaded: ${preloadedWebViewRef.current?.loaded === true} placement: ${placement}`); }\n if (preloadedWebViewRef.current?.placement === placement) {\n if (preloadedWebViewRef.current.loaded) {\n return presentPreloadedWebView();\n }\n pollCancelledRef.current = false;\n return new Promise<PaywallResult>((resolve) => {\n let elapsed = 0;\n const poll = (): void => {\n if (pollCancelledRef.current) return;\n if (preloadedWebViewRef.current?.loaded) { resolve(presentPreloadedWebView()); return; }\n elapsed += 100;\n if (elapsed >= 500) { resolve(presentCampaign(placement)); return; }\n pollTimerRef.current = setTimeout(poll, 100);\n };\n pollTimerRef.current = setTimeout(poll, 100);\n });\n }\n return presentCampaign(placement);\n }, [presentPreloadedWebView, presentCampaign]);\n\n useEffect(() => {\n if (!isInitialized) return;\n const onEmergency = async (id: string): Promise<void> => { try { await bridgePaywallPresenter(id); } catch { /* non-critical */ } };\n PaywalloClient.registerPaywallPresenter(bridgePaywallPresenter);\n PaywalloClient.registerSubscriptionGetter(getSubscription);\n PaywalloClient.registerActiveChecker(hasActiveSubscription);\n PaywalloClient.registerRestoreHandler(restorePurchases);\n PaywalloClient.registerEmergencyPaywallHandler(onEmergency);\n return () => {\n pollCancelledRef.current = true;\n if (pollTimerRef.current !== null) { clearTimeout(pollTimerRef.current); pollTimerRef.current = null; }\n PaywalloClient.registerPaywallPresenter(null);\n PaywalloClient.registerSubscriptionGetter(null);\n PaywalloClient.registerActiveChecker(null);\n PaywalloClient.registerRestoreHandler(null);\n PaywalloClient.registerEmergencyPaywallHandler(null);\n };\n }, [isInitialized, bridgePaywallPresenter, getSubscription, hasActiveSubscription, restorePurchases]);\n\n\n const isReady = isInitialized && !isLoadingProducts;\n\n const noOp = useCallback(() => {}, []);\n const contextValue: PaywalloContextValue = useMemo(() => ({\n config: PaywalloClient.getConfig(), isInitialized, isReady, initError, distinctId, subscription, products, isLoadingProducts,\n presentPaywall, presentCampaign, preloadCampaign, hasActiveSubscription, getSubscription, restorePurchases, getPaywallConfig, refreshProducts,\n }), [isInitialized, isReady, initError, distinctId, subscription, products, isLoadingProducts,\n presentPaywall, presentCampaign, preloadCampaign, hasActiveSubscription, getSubscription, restorePurchases, getPaywallConfig, refreshProducts]);\n\n useLayoutEffect(() => {\n if (showingPreloadedWebView) {\n slideAnim.setValue(SCREEN_HEIGHT);\n Animated.timing(slideAnim, { toValue: 0, duration: 200, easing: Easing.out(Easing.cubic), useNativeDriver: true }).start();\n }\n }, [showingPreloadedWebView, slideAnim, SCREEN_HEIGHT]);\n\n const preloadStyle = [\n styles.preloadOverlay,\n showingPreloadedWebView ? styles.visible : styles.hidden,\n showingPreloadedWebView ? { transform: [{ translateY: slideAnim }] } : undefined,\n ];\n\n return (\n <PaywalloContext.Provider value={contextValue}>\n {children}\n <PaywallErrorBoundary>\n {!!preloadedWebView?.craftData && (\n <Animated.View style={preloadStyle} pointerEvents={showingPreloadedWebView ? \"auto\" : \"none\"}>\n <PaywallWebView\n paywallId={preloadedWebView.paywallId} craftData={preloadedWebView.craftData}\n products={preloadedWebView.products} primaryProductId={preloadedWebView.primaryProductId}\n secondaryProductId={preloadedWebView.secondaryProductId} isPurchasing={isPreloadPurchasing}\n webUrl={isInitialized ? PaywalloClient.getWebUrl() : null}\n onReady={handlePreloadedWebViewReady} onClose={showingPreloadedWebView ? handlePreloadedClose : noOp}\n onPurchase={showingPreloadedWebView ? handlePreloadedPurchase : noOp}\n onRestore={showingPreloadedWebView ? handlePreloadedRestore : noOp}\n />\n </Animated.View>\n )}\n </PaywallErrorBoundary>\n <PaywallErrorBoundary>\n {activePaywall && (\n <PaywallModal placement={activePaywall.placement} visible={true} onResult={handlePaywallResult}\n paywallConfig={activePaywall.paywallConfig} preloadedProducts={activePaywall.preloadedProducts}\n variantKey={activePaywall.variantKey} campaignId={activePaywall.campaignId}\n variantId={activePaywall.variantId} />\n )}\n </PaywallErrorBoundary>\n </PaywalloContext.Provider>\n );\n}\n\nconst styles = StyleSheet.create({\n preloadOverlay: { position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0, backgroundColor: \"#ffffff\" },\n hidden: { zIndex: -1, opacity: 0, width: 1, height: 1, overflow: \"hidden\" },\n visible: { zIndex: 9999, opacity: 1 },\n});\n","import { useEffect, useRef } from \"react\";\n\nconst FIRST_SEEN_KEY = \"@panel:firstSeen\";\nconst DEBOUNCE_MS = 1000;\n\nexport type LifecycleType = \"install\" | \"cold_start\" | \"foreground\" | \"background\";\n\nexport type LifecyclePriority = \"critical\" | \"normal\";\n\nexport interface LifecycleProperties {\n type: LifecycleType;\n session_id?: string;\n app_version?: string;\n device_type?: \"ios\" | \"android\";\n os_version?: string;\n}\n\ninterface AutoEventsConfig {\n isInitialized: boolean;\n getAppVersion: () => string;\n getSessionId: () => string | null;\n /**\n * Emits a `lifecycle` event through the unified EventBatcher pipeline\n * (`PaywalloClient.track`). Consumers should forward to\n * `PaywalloClient.track(\"lifecycle\", { properties, priority })`.\n *\n * `priority` is `\"critical\"` for `install` (one-shot, can't be lost) and\n * `\"normal\"` for recurring lifecycle events (`cold_start`, `foreground`,\n * `background`, session start/end).\n */\n emitLifecycle: (props: LifecycleProperties, priority: LifecyclePriority) => Promise<void>;\n storageGet: (key: string) => Promise<string | null>;\n storageSet: (key: string, value: string) => Promise<boolean>;\n debug?: boolean;\n}\n\nasync function detectPlatform(): Promise<\"ios\" | \"android\"> {\n try {\n const rn = await import(\"react-native\");\n return (rn as { Platform?: { OS?: string } }).Platform?.OS === \"ios\" ? \"ios\" : \"android\";\n } catch {\n return \"android\";\n }\n}\n\nasync function detectOsVersion(): Promise<string> {\n try {\n const rn = await import(\"react-native\");\n const version = (rn as { Platform?: { Version?: string | number } }).Platform?.Version;\n return version != null ? String(version) : \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n\n/**\n * Auto-emits `lifecycle` events into the unified EventBatcher pipeline.\n *\n * Emits `install` (critical, once per device, `@panel:firstSeen` guard) and\n * `cold_start` (normal, every fresh launch, debounced 1 s) via\n * `config.emitLifecycle` → `EventBatcher` → `/api/v1/events/batch`.\n *\n * Must be called from inside `PaywalloProvider` after SDK initialization.\n * The effect fires once when `isInitialized` flips to `true`; subsequent\n * re-renders are no-ops.\n */\nexport function useAppAutoEvents(config: AutoEventsConfig): void {\n const {\n isInitialized,\n getAppVersion,\n getSessionId,\n emitLifecycle,\n storageGet,\n storageSet,\n debug,\n } = config;\n\n const didRunRef = useRef(false);\n\n useEffect(() => {\n if (!isInitialized || didRunRef.current) return;\n\n const timer = setTimeout(() => {\n if (didRunRef.current) return;\n didRunRef.current = true;\n\n void (async () => {\n const sessionId = getSessionId();\n const appVersion = getAppVersion();\n const deviceType = await detectPlatform();\n const osVersion = await detectOsVersion();\n\n // ── install (first-ever boot on this device) ────────────────────────\n try {\n const firstSeen = await storageGet(FIRST_SEEN_KEY);\n if (!firstSeen) {\n await emitLifecycle({\n type: \"install\",\n device_type: deviceType,\n os_version: osVersion,\n app_version: appVersion,\n ...(sessionId ? { session_id: sessionId } : {}),\n }, \"critical\");\n await storageSet(FIRST_SEEN_KEY, new Date().toISOString());\n if (debug) console.log(\"[Paywallo EVENTS] lifecycle install emitted\");\n }\n } catch (err) {\n if (debug) console.log(\"[Paywallo EVENTS] lifecycle install check failed\", err);\n }\n\n // ── cold_start (every fresh launch) ─────────────────────────────────\n try {\n await emitLifecycle({\n type: \"cold_start\",\n app_version: appVersion,\n device_type: deviceType,\n os_version: osVersion,\n ...(sessionId ? { session_id: sessionId } : {}),\n }, \"normal\");\n if (debug) console.log(\"[Paywallo EVENTS] lifecycle cold_start emitted\");\n } catch (err) {\n if (debug) console.log(\"[Paywallo EVENTS] lifecycle cold_start failed\", err);\n }\n })();\n }, DEBOUNCE_MS);\n\n return () => clearTimeout(timer);\n // intentionally run only once after isInitialized flips to true\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isInitialized]);\n}\n","import { useCallback, useRef, useState } from \"react\";\n\nimport type { PreloadResult } from \"../context/PaywalloContext\";\nimport { PaywalloClient } from \"../core/PaywalloClient\";\nimport { CAMPAIGN_ERROR_CODES, CampaignError } from \"../domains/campaign/CampaignError\";\nimport { loadCampaignProducts } from \"../utils/loadCampaignProducts\";\nimport {\n getCacheEntry,\n isCacheEntryValid,\n type PreloadedCampaign,\n type PreloadedWebView,\n} from \"../utils/preloadCache\";\n\nexport type { PreloadedCampaign, PreloadedWebView };\n\nexport function useCampaignPreload() {\n const [preloadedWebView, setPreloadedWebView] = useState<PreloadedWebView | null>(null);\n const preloadedCampaignsRef = useRef<Map<string, PreloadedCampaign>>(new Map());\n\n const isPreloadValid = useCallback(\n (placement: string): boolean => isCacheEntryValid(preloadedCampaignsRef.current.get(placement)),\n []\n );\n\n const consumePreloadedCampaign = useCallback(\n (placement: string): PreloadedCampaign | null =>\n getCacheEntry(preloadedCampaignsRef.current, placement),\n []\n );\n\n const preloadCampaign = useCallback(\n async (placement: string, context?: Record<string, unknown>): Promise<PreloadResult> => {\n try {\n const campaign = await PaywalloClient.getCampaign(placement, context);\n if (!campaign?.paywall) {\n return {\n success: false,\n error: new CampaignError(\n CAMPAIGN_ERROR_CODES.NOT_FOUND,\n `Campaign or paywall not found: ${placement}`\n ),\n };\n }\n\n const { paywall } = campaign;\n const serverProducts = [paywall.primaryProduct, paywall.secondaryProduct].filter(Boolean);\n const storeProductIds = serverProducts.map((p) => p!.storeProductId).filter(Boolean);\n const productsMap = await loadCampaignProducts(\n serverProducts.map((p) => p!),\n storeProductIds\n );\n\n preloadedCampaignsRef.current.set(placement, {\n campaignId: campaign.campaignId,\n variantKey: campaign.variantKey,\n ...(campaign.variantId && { variantId: campaign.variantId }),\n paywall: {\n id: paywall.id,\n placement: paywall.placement,\n config: paywall.config,\n primaryProductId: paywall.primaryProductId,\n secondaryProductId: paywall.secondaryProductId,\n },\n products: productsMap,\n preloadedAt: Date.now(),\n });\n\n const craftData = (paywall.config as { craftData?: string })?.craftData ?? \"\";\n setPreloadedWebView({\n placement, paywallId: paywall.id, craftData, products: productsMap,\n primaryProductId: paywall.primaryProductId,\n secondaryProductId: paywall.secondaryProductId,\n loaded: false, campaignId: campaign.campaignId, variantKey: campaign.variantKey,\n ...(campaign.variantId && { variantId: campaign.variantId }),\n });\n if (PaywalloClient.getConfig()?.debug) console.log(`[Paywallo WEBVIEW] mounting hidden — placement: ${placement}`);\n\n return { success: true };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error\n ? error\n : new CampaignError(CAMPAIGN_ERROR_CODES.FETCH_FAILED, String(error)),\n };\n }\n },\n []\n );\n\n return {\n preloadedCampaignsRef,\n preloadedWebView,\n setPreloadedWebView,\n preloadCampaign,\n consumePreloadedCampaign,\n isPreloadValid,\n };\n}\n","import { getIAPService } from \"../domains/iap/IAPService\";\nimport { buildProductFromServerInfo } from \"./serverProduct\";\nimport type { ServerProductInfo } from \"../types/campaign\";\nimport type { Product } from \"../types/purchase\";\n\nexport async function loadCampaignProducts(\n serverProducts: ServerProductInfo[],\n storeProductIds: string[]\n): Promise<Map<string, Product>> {\n const productsMap = new Map<string, Product>();\n\n if (storeProductIds.length > 0) {\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n const storeProducts = await getIAPService().loadProducts(storeProductIds);\n if (storeProducts.length > 0) {\n for (const p of storeProducts) productsMap.set(p.productId, p);\n }\n if (productsMap.size >= storeProductIds.length) break;\n if (attempt < 3) await new Promise(r => setTimeout(r, 250 * Math.pow(2, attempt)));\n } catch { if (attempt < 3) await new Promise(r => setTimeout(r, 250 * Math.pow(2, attempt))); }\n }\n }\n\n for (const sp of serverProducts) {\n if (!productsMap.has(sp.storeProductId)) {\n const prod = buildProductFromServerInfo(sp);\n productsMap.set(prod.productId, prod);\n }\n }\n\n return productsMap;\n}\n","import type { ServerProductInfo } from \"../types/campaign\";\nimport type { Product } from \"../types/purchase\";\n\nconst PERIOD_MAP: Record<string, string> = {\n P1Y: \"ano\",\n P1M: \"mês\",\n P1W: \"semana\",\n P3M: \"trimestre\",\n P6M: \"semestre\",\n};\n\nexport function buildProductFromServerInfo(info: ServerProductInfo): Product {\n const period = PERIOD_MAP[info.billingPeriod ?? \"\"] ?? \"\";\n const priceStr = info.price != null ? `R$ ${info.price.toFixed(2).replace(\".\", \",\")}` : \"\";\n return {\n productId: info.storeProductId,\n title: info.name,\n description: \"\",\n price: priceStr,\n priceValue: info.price ?? 0,\n currency: \"BRL\",\n localizedPrice: priceStr,\n type: \"subscription\",\n subscriptionPeriod: period,\n freeTrialPeriod: info.trialDays ? `${info.trialDays} dias` : undefined,\n };\n}\n","import type { Product } from \"../types/purchase\";\n\nexport interface PreloadedCampaign {\n campaignId: string;\n variantKey: string;\n /** UUID de `paywall_variants` (sub-fase 2.14). Opcional pra retrocompat. */\n variantId?: string;\n paywall: {\n id: string;\n placement: string;\n config: Record<string, unknown>;\n primaryProductId?: string;\n secondaryProductId?: string;\n };\n products: Map<string, Product>;\n preloadedAt: number;\n}\n\nexport interface PreloadedWebView {\n placement: string;\n paywallId: string;\n craftData: string;\n products: Map<string, Product>;\n primaryProductId?: string;\n secondaryProductId?: string;\n loaded: boolean;\n campaignId?: string;\n variantKey?: string;\n /** UUID de `paywall_variants` (sub-fase 2.14). */\n variantId?: string;\n}\n\nconst CACHE_TTL_MS = 5 * 60 * 1000;\n\nexport function isCacheEntryValid(entry: PreloadedCampaign | undefined): boolean {\n return !!entry && Date.now() - entry.preloadedAt < CACHE_TTL_MS;\n}\n\nexport function getCacheEntry(\n cache: Map<string, PreloadedCampaign>,\n placement: string\n): PreloadedCampaign | null {\n const entry = cache.get(placement);\n if (!isCacheEntryValid(entry)) return null;\n return entry ?? null;\n}\n","import { useCallback, useState } from \"react\";\n\nimport { getIAPService } from \"../domains/iap\";\nimport { PaywalloClient } from \"../core/PaywalloClient\";\nimport type { Product } from \"../types/purchase\";\n\ninterface UseProductLoaderReturn {\n products: Map<string, Product>;\n isLoadingProducts: boolean;\n refreshProducts: (productIds: string[]) => Promise<void>;\n}\n\nexport function useProductLoader(): UseProductLoaderReturn {\n const [products, setProducts] = useState<Map<string, Product>>(new Map());\n const [isLoadingProducts, setIsLoadingProducts] = useState(false);\n\n const refreshProducts = useCallback(async (productIds: string[]): Promise<void> => {\n setIsLoadingProducts(true);\n try {\n const iapService = getIAPService();\n const loaded = await iapService.loadProducts(productIds);\n const map = new Map<string, Product>();\n for (const p of loaded) map.set(p.productId, p);\n setProducts(map);\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] refreshProducts failed\", err);\n } finally {\n setIsLoadingProducts(false);\n }\n }, []);\n\n return { products, isLoadingProducts, refreshProducts };\n}\n","import { useCallback } from \"react\";\nimport type React from \"react\";\n\nimport { getIAPService } from \"../domains/iap\";\nimport { PaywalloClient } from \"../core/PaywalloClient\";\nimport type { PaywallResult } from \"../types\";\n\nimport type { PreloadedWebView } from \"./useCampaignPreload\";\nimport { usePaywallTracking } from \"../domains/paywall\";\n\ninterface UsePurchaseOrchestratorReturn {\n handlePreloadedPurchase: (productId: string) => Promise<void>;\n handlePreloadedRestore: () => Promise<void>;\n}\n\nexport function usePurchaseOrchestrator(\n preloadedWebView: PreloadedWebView | null,\n resolvePreloadedPaywall: (result: PaywallResult) => void,\n clearPreloadedWebView: () => void,\n setShowingPreloadedWebView: React.Dispatch<React.SetStateAction<boolean>>,\n presentedAtRef: React.MutableRefObject<number>,\n invalidateSubscriptionCache: () => void\n): UsePurchaseOrchestratorReturn {\n const { trackDismissed, trackProductSelected, trackPurchased } = usePaywallTracking();\n\n const handlePreloadedPurchase = useCallback(\n async (productId: string): Promise<void> => {\n try {\n if (preloadedWebView) {\n trackProductSelected({ placement: preloadedWebView.placement, paywallId: preloadedWebView.paywallId, productId, variantKey: preloadedWebView.variantKey, campaignId: preloadedWebView.campaignId });\n }\n\n const result = await getIAPService().purchase(productId, {\n paywallPlacement: preloadedWebView?.placement,\n variantKey: preloadedWebView?.variantKey,\n ...(preloadedWebView?.paywallId && { paywallId: preloadedWebView.paywallId }),\n ...(preloadedWebView?.variantId && { variantId: preloadedWebView.variantId }),\n });\n if (!result.success) {\n if (result.error) {\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n return;\n }\n\n if (preloadedWebView) {\n const duration_ms = Date.now() - presentedAtRef.current;\n await trackDismissed({ placement: preloadedWebView.placement, paywallId: preloadedWebView.paywallId, duration_ms, reason: \"purchased\", variantKey: preloadedWebView.variantKey, campaignId: preloadedWebView.campaignId });\n await trackPurchased({ placement: preloadedWebView.placement, paywallId: preloadedWebView.paywallId, productId, variantKey: preloadedWebView.variantKey, campaignId: preloadedWebView.campaignId });\n }\n\n invalidateSubscriptionCache();\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: true, cancelled: false, restored: false });\n } catch (error) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] preloaded purchase failed\", error);\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n },\n [preloadedWebView, resolvePreloadedPaywall, clearPreloadedWebView, setShowingPreloadedWebView, presentedAtRef, trackDismissed, trackProductSelected, trackPurchased, invalidateSubscriptionCache]\n );\n\n const handlePreloadedRestore = useCallback(async (): Promise<void> => {\n try {\n const transactions = await getIAPService().restore();\n if (transactions.length === 0) return;\n\n if (preloadedWebView) {\n const duration_ms = Date.now() - presentedAtRef.current;\n await trackDismissed({ placement: preloadedWebView.placement, paywallId: preloadedWebView.paywallId, duration_ms, reason: \"dismissed\", variantKey: preloadedWebView.variantKey, campaignId: preloadedWebView.campaignId });\n }\n\n invalidateSubscriptionCache();\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: true });\n } catch (error) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] preloaded restore failed\", error);\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n }, [preloadedWebView, resolvePreloadedPaywall, clearPreloadedWebView, setShowingPreloadedWebView, presentedAtRef, trackDismissed, invalidateSubscriptionCache]);\n\n return { handlePreloadedPurchase, handlePreloadedRestore };\n}\n","import { useCallback, useRef, useState } from \"react\";\n\nimport { PaywalloClient } from \"../core/PaywalloClient\";\nimport { subscriptionCache } from \"../domains/subscription/SubscriptionCache\";\nimport type {\n SubscriptionInfo,\n SubscriptionStatus as DomainSubscriptionStatus,\n SubscriptionStatusResponse as DomainStatusResponse,\n} from \"../domains/subscription/types\";\nimport type { Subscription, SubscriptionStatusResponse, SubscriptionStatus } from \"../types\";\n\nconst CACHE_TTL_MS = 5 * 60 * 1000;\n\ninterface CacheEntry {\n data: Subscription | null;\n expiresAt: number;\n}\n\nconst ACTIVE_STATUSES = [\"active\", \"in_grace_period\"];\n\nconst PUBLIC_TO_DOMAIN_STATUS: Record<string, DomainSubscriptionStatus> = {\n active: \"active\",\n expired: \"expired\",\n in_billing_retry: \"billing_retry\",\n in_grace_period: \"grace_period\",\n revoked: \"unknown\",\n cancelled: \"canceled\",\n};\n\nconst DOMAIN_TO_PUBLIC_STATUS: Record<string, SubscriptionStatus> = {\n active: \"active\",\n expired: \"expired\",\n billing_retry: \"in_billing_retry\",\n grace_period: \"in_grace_period\",\n canceled: \"cancelled\",\n paused: \"expired\",\n unknown: \"expired\",\n};\n\ninterface UseSubscriptionSyncReturn {\n subscription: Subscription | null;\n hasActiveSubscription: () => Promise<boolean>;\n getSubscription: () => Promise<Subscription | null>;\n invalidateCache: () => void;\n}\n\nfunction toDomainSubscriptionInfo(sub: Subscription): SubscriptionInfo {\n return {\n id: \"\",\n productId: sub.productId,\n status: PUBLIC_TO_DOMAIN_STATUS[sub.status] ?? \"unknown\",\n expiresAt: sub.expiresAt ?? new Date(0),\n originalPurchaseDate: new Date(0),\n latestPurchaseDate: new Date(0),\n willRenew: sub.autoRenewEnabled,\n isTrial: false,\n isIntroductoryPeriod: false,\n platform: sub.platform,\n };\n}\n\nfunction toDomainResponse(status: SubscriptionStatusResponse): DomainStatusResponse {\n return {\n hasActiveSubscription: status.hasActiveSubscription,\n subscription: status.subscription\n ? toDomainSubscriptionInfo(status.subscription)\n : null,\n entitlements: status.entitlements ?? [],\n };\n}\n\nfunction isSubscriptionStillActive(sub: { status: string; expiresAt: Date | null } | null): boolean {\n if (!sub) return false;\n if (!ACTIVE_STATUSES.includes(sub.status)) return false;\n if (sub.expiresAt && sub.expiresAt.getTime() !== 0 && sub.expiresAt < new Date()) return false;\n return true;\n}\n\nfunction subscriptionInfoToSub(s: SubscriptionInfo): Subscription {\n const status: SubscriptionStatus = DOMAIN_TO_PUBLIC_STATUS[s.status] ?? \"expired\";\n return { productId: s.productId, status, expiresAt: s.expiresAt ?? null, platform: s.platform, autoRenewEnabled: s.willRenew, inGracePeriod: status === \"in_grace_period\" };\n}\n\nasync function resolveOfflineFromCache(distinctId: string): Promise<boolean> {\n try {\n const cached = await subscriptionCache.get(distinctId);\n if (!cached) return false;\n const sub = cached.data.subscription;\n return isSubscriptionStillActive(sub ? { status: sub.status, expiresAt: sub.expiresAt ?? null } : null);\n } catch { return false; }\n}\n\nfunction isActiveCacheEntry(entry: CacheEntry): boolean {\n return isSubscriptionStillActive(entry.data);\n}\n\nexport function useSubscriptionSync(): UseSubscriptionSyncReturn {\n const [subscription, setSubscription] = useState<Subscription | null>(null);\n const cacheRef = useRef<CacheEntry | null>(null);\n\n const invalidateCache = useCallback((): void => {\n cacheRef.current = null;\n const distinctId = PaywalloClient.getDistinctId();\n if (distinctId) void subscriptionCache.invalidate(distinctId);\n }, []);\n\n const fetchAndCache = useCallback(async (): Promise<Subscription | null> => {\n const apiClient = PaywalloClient.getApiClient();\n const distinctId = PaywalloClient.getDistinctId();\n if (!apiClient || !distinctId) return null;\n\n const status = await apiClient.getSubscriptionStatus(distinctId);\n const sub = status.subscription\n ? {\n ...status.subscription,\n expiresAt: status.subscription.expiresAt\n ? new Date(status.subscription.expiresAt)\n : null,\n }\n : null;\n\n cacheRef.current = { data: sub, expiresAt: Date.now() + CACHE_TTL_MS };\n setSubscription(sub);\n void subscriptionCache.set(distinctId, toDomainResponse(status));\n return sub;\n }, []);\n\n const hasActiveSubscription = useCallback(async (): Promise<boolean> => {\n const apiClient = PaywalloClient.getApiClient();\n const distinctId = PaywalloClient.getDistinctId();\n if (!apiClient || !distinctId) return false;\n\n try {\n const { nativeStoreKit } = await import(\"../domains/iap/NativeStoreKit\");\n if (nativeStoreKit.isAvailable()) {\n const activeTransactions = await nativeStoreKit.getActiveTransactions();\n if (activeTransactions.length > 0) {\n if (PaywalloClient.getConfig()?.debug) console.log(\"[Paywallo SUB] StoreKit: active entitlement found\", activeTransactions[0].productId);\n return true;\n }\n if (PaywalloClient.getConfig()?.debug) console.log(\"[Paywallo SUB] StoreKit: no active entitlements → showing paywall\");\n return false;\n }\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.log(\"[Paywallo SUB] StoreKit check failed, falling through to server\", err);\n }\n\n const cached = cacheRef.current;\n if (cached && cached.expiresAt > Date.now()) return isActiveCacheEntry(cached);\n\n try {\n const persisted = await subscriptionCache.get(distinctId);\n if (persisted && !persisted.isStale) {\n const sub = persisted.data.subscription ? subscriptionInfoToSub(persisted.data.subscription) : null;\n if (isSubscriptionStillActive(sub)) {\n cacheRef.current = { data: sub, expiresAt: Date.now() + CACHE_TTL_MS };\n setSubscription(sub);\n return true;\n }\n }\n } catch {}\n\n try {\n const apiStatus = await apiClient.getSubscriptionStatus(distinctId);\n const sub = apiStatus.subscription ? { ...apiStatus.subscription, expiresAt: apiStatus.subscription.expiresAt ? new Date(apiStatus.subscription.expiresAt) : null } : null;\n cacheRef.current = { data: sub, expiresAt: Date.now() + CACHE_TTL_MS };\n setSubscription(sub);\n void subscriptionCache.set(distinctId, toDomainResponse(apiStatus));\n return apiStatus.hasActiveSubscription === true;\n } catch {\n return resolveOfflineFromCache(distinctId);\n }\n }, []);\n\n const getSubscription = useCallback(async (): Promise<Subscription | null> => {\n const apiClient = PaywalloClient.getApiClient();\n const distinctId = PaywalloClient.getDistinctId();\n if (!apiClient || !distinctId) return null;\n\n const cached = cacheRef.current;\n if (cached && cached.expiresAt > Date.now()) return cached.data;\n\n try {\n return await fetchAndCache();\n } catch {\n try {\n const persisted = await subscriptionCache.get(distinctId);\n if (!persisted?.data.subscription) return null;\n return subscriptionInfoToSub(persisted.data.subscription);\n } catch {\n return null;\n }\n }\n }, [fetchAndCache]);\n\n return { subscription, hasActiveSubscription, getSubscription, invalidateCache };\n}\n","export { SubscriptionCache } from \"./SubscriptionCache\";\nexport { subscriptionManager } from \"./SubscriptionManager\";\nexport type {\n CachedSubscription,\n SubscriptionInfo,\n SubscriptionManagerConfig,\n} from \"./types\";\n","import type { Product } from \"../types/purchase\";\nimport type { VariableContext } from \"./variableResolver\";\n\nexport function getProductVariable(product: Product | undefined, property: string): string {\n if (!product) return \"\";\n\n switch (property) {\n case \"id\": return product.productId;\n case \"name\": return product.title;\n case \"price\": return product.localizedPrice;\n case \"pricePerMonth\": return product.pricePerMonth ?? product.localizedPrice;\n case \"pricePerWeek\": return product.pricePerWeek ?? \"\";\n case \"pricePerDay\": return product.pricePerDay ?? \"\";\n case \"period\": return product.subscriptionPeriod ?? \"\";\n case \"trialPeriod\": return product.freeTrialPeriod ?? \"\";\n case \"introPrice\": return product.introductoryPrice ?? \"\";\n case \"savings\": return product.savings ?? \"\";\n case \"savingsPercent\": return product.savingsPercent ?? \"\";\n case \"hasFreeTrial\": return product.freeTrialPeriod ? \"true\" : \"false\";\n case \"hasIntroOffer\": return product.introductoryPrice ? \"true\" : \"false\";\n case \"renewalPeriod\": return product.subscriptionPeriod ?? \"\";\n default: return \"\";\n }\n}\n\nexport function resolveProductsVariable(parts: string[], context: VariableContext): string | null {\n if (parts[0] !== \"products\") return null;\n\n if (parts[1] === \"selected\" && context.selectedProductId) {\n return getProductVariable(context.products.get(context.selectedProductId), parts[2]);\n }\n if (parts[1] === \"primary\" && context.primaryProductId) {\n return getProductVariable(context.products.get(context.primaryProductId), parts[2]);\n }\n if (parts[1] === \"secondary\" && context.secondaryProductId) {\n return getProductVariable(context.products.get(context.secondaryProductId), parts[2]);\n }\n if (parts[1] === \"hasIntroductoryOffer\") {\n return Array.from(context.products.values()).some((p) => p.introductoryPrice) ? \"true\" : \"false\";\n }\n\n return null;\n}\n\nexport function resolveLegacyVariable(variableName: string, context: VariableContext): string | null {\n if (variableName === \"device_name\") return context.deviceInfo?.name ?? \"\";\n if (variableName === \"product_price\" && context.selectedProductId) {\n return context.products.get(context.selectedProductId)?.localizedPrice ?? \"\";\n }\n if (variableName === \"trial_period\" && context.selectedProductId) {\n return context.products.get(context.selectedProductId)?.freeTrialPeriod ?? \"\";\n }\n return null;\n}\n","import type { Product } from \"../types/purchase\";\nimport { resolveProductsVariable, resolveLegacyVariable } from \"./productVariableResolver\";\n\nexport interface VariableContext {\n selectedProductId?: string;\n primaryProductId?: string;\n secondaryProductId?: string;\n products: Map<string, Product>;\n customVariables?: Record<string, string>;\n deviceInfo?: {\n name?: string;\n model?: string;\n os?: string;\n osVersion?: string;\n locale?: string;\n };\n userInfo?: {\n id?: string;\n name?: string;\n email?: string;\n };\n}\n\nfunction resolveVariable(variableName: string, context: VariableContext): string {\n const parts = variableName.split(\".\");\n\n if (parts[0] === \"device\" && context.deviceInfo) {\n switch (parts[1]) {\n case \"name\": return context.deviceInfo.name ?? \"\";\n case \"model\": return context.deviceInfo.model ?? \"\";\n case \"os\": return context.deviceInfo.os ?? \"\";\n case \"osVersion\": return context.deviceInfo.osVersion ?? \"\";\n case \"locale\": return context.deviceInfo.locale ?? \"\";\n default: return \"\";\n }\n }\n\n if (parts[0] === \"user\" && context.userInfo) {\n switch (parts[1]) {\n case \"id\": return context.userInfo.id ?? \"\";\n case \"name\": return context.userInfo.name ?? \"\";\n case \"email\": return context.userInfo.email ?? \"\";\n default: return \"\";\n }\n }\n\n if (parts[0] === \"products\") {\n return resolveProductsVariable(parts, context) ?? \"\";\n }\n\n return resolveLegacyVariable(variableName, context) ?? context.customVariables?.[variableName] ?? \"\";\n}\n\nexport function resolveText(text: string, context: VariableContext): string {\n const regex = /\\{\\{([^}]+)\\}\\}/g;\n return text.replace(regex, (_, variableName: string) => {\n return resolveVariable(variableName.trim(), context);\n });\n}\n\nexport function parseVariables(text: string): string[] {\n const regex = /\\{\\{([^}]+)\\}\\}/g;\n const variables: string[] = [];\n let match;\n while ((match = regex.exec(text)) !== null) {\n variables.push(match[1].trim());\n }\n return variables;\n}\n\nexport function hasVariables(text: string): boolean {\n return /\\{\\{[^}]+\\}\\}/.test(text);\n}\n"],"mappings":"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","names":["_debug","isAvailable","import_react_native","_debug","KEYCHAIN_KEY_PREFIX","isAvailable","import_react_native","item","init_types","import_react_native","init_types","import_react_native","import_react_native","import_react","import_react_native","import_react","import_react_native","import_react","import_react_native","styles","import_react","import_react_native","import_jsx_runtime","import_react","import_react","import_react","import_react","import_react_native","idfv","import_react_native","generateUUID","import_react_native","import_react_native","import_react_native","generateUUID","import_react_native","import_react_native","import_react_native","secureStorage","import_react_native","raw","status","getTimezone","mapPermissionStatus","AUTH_STATUS","detectPlatform","collectDeviceInfo","import_react_native","secureStorage","detectPlatform","getTimezone","secureStorage","mapPermissionStatus","DEFAULT_TTL","init_types","init_types","import_zod","import_react_native","import_react_native","import_react_native","isActive","getVariant","evaluateFlags","getConditionalFlag","getVariant","evaluateFlags","getConditionalFlag","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_react_native","import_react","detectPlatform","getAppVersion","import_react","import_react","import_react","import_react","CACHE_TTL_MS","nativeStoreKit","import_jsx_runtime","r","styles"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors/PaywalloError.ts","../src/domains/campaign/CampaignError.ts","../src/core/storage/NativeStorage.ts","../src/core/storage/SecureStorage.ts","../src/core/storage/StorageMigration.ts","../src/utils/NativeDeviceInfo.ts","../src/utils/uuid.ts","../src/domains/identity/IdentityError.ts","../src/domains/identity/IdentityStorage.ts","../src/domains/identity/IdentityManager.ts","../src/domains/paywall/PaywallError.ts","../src/domains/campaign/CampaignGateService.ts","../src/domains/campaign/index.ts","../src/domains/identity/AdvertisingIdManager.ts","../src/domains/session/distinctIdGuard.ts","../src/domains/session/SessionError.ts","../src/utils/deviceInfo.ts","../src/domains/session/sessionTracking.ts","../src/domains/session/SessionManager.ts","../src/domains/identity/AttributionTracker.ts","../src/domains/identity/InstallIdempotency.ts","../src/domains/identity/InstallReferrerManager.ts","../src/domains/identity/MetaBridge.ts","../src/domains/identity/InstallTracker.ts","../src/domains/identity/DeepLinkAttributionCapture.ts","../src/domains/identity/index.ts","../src/domains/notifications/bridges/NativePushBridge.ts","../src/core/constants.ts","../src/domains/notifications/config.ts","../src/domains/notifications/NotificationsError.ts","../src/domains/notifications/handlers/BackgroundHandler.ts","../src/domains/notifications/DeepLinkResolver.ts","../src/domains/notifications/handlers/ForegroundHandler.ts","../src/domains/notifications/NotificationEventTracker.ts","../src/domains/notifications/NotificationHandlerSetup.ts","../src/core/version.ts","../src/domains/notifications/utils.ts","../src/domains/notifications/TokenRegistration.ts","../src/domains/notifications/NotificationTokenOps.ts","../src/domains/notifications/PermissionManager.ts","../src/domains/notifications/NotificationsManager.ts","../src/domains/notifications/index.ts","../src/domains/paywall/paywallCloseReason.ts","../src/domains/paywall/emitPaywallClosed.ts","../src/domains/paywall/parseWebViewMessage.ts","../src/domains/paywall/PaywallContext.ts","../src/domains/paywall/PaywallErrorBoundary.tsx","../src/domains/paywall/paywallHeartbeat.ts","../src/utils/localization.ts","../src/domains/paywall/paywallScripts.ts","../src/domains/paywall/PaywallWebView.tsx","../src/domains/iap/PurchaseError.ts","../src/domains/iap/NativeStoreKit.ts","../src/domains/iap/IAPTransactionEmitter.ts","../src/errors/ClientError.ts","../src/core/queue/deduplication.ts","../src/core/queue/QueueJournal.ts","../src/core/queue/OfflineQueueStorage.ts","../src/core/queue/types.ts","../src/core/queue/OfflineQueue.ts","../src/core/network/types.ts","../src/core/network/NetworkMonitor.ts","../src/core/network/index.ts","../src/core/queue/QueueProcessor.ts","../src/core/queue/index.ts","../src/domains/iap/IAPValidator.ts","../src/domains/iap/IAPService.ts","../src/domains/paywall/usePaywallTracking.ts","../src/domains/paywall/usePaywallActions.ts","../src/domains/paywall/usePaywallLoader.ts","../src/domains/paywall/PaywallModal.tsx","../src/domains/paywall/usePaywallSession.ts","../src/domains/paywall/usePaywallPresenter.ts","../src/domains/paywall/index.ts","../src/domains/plan/PlanCache.ts","../src/domains/plan/PlanError.ts","../src/domains/plan/PlanService.ts","../src/domains/plan/index.ts","../src/domains/session/index.ts","../src/domains/analytics/AnalyticsError.ts","../src/domains/analytics/index.ts","../src/core/PaywalloAnalytics.ts","../src/core/PaywalloFlags.ts","../src/domains/onboarding/OnboardingError.ts","../src/domains/onboarding/OnboardingManager.ts","../src/domains/onboarding/index.ts","../src/domains/paywall/paywallHeartbeatRecovery.ts","../src/domains/subscription/SubscriptionCache.ts","../src/domains/subscription/SubscriptionManager.ts","../src/domains/iap/apiPurchaseMethods.ts","../src/core/ApiCache.ts","../src/core/apiUrlUtils.ts","../src/core/FlagStorage.ts","../src/core/ApiClientFlags.ts","../src/core/ApiClientQueue.ts","../src/core/events/schemas.ts","../src/core/events/eventFamilies.ts","../src/core/eventEnvelopeV2.ts","../src/core/events/index.ts","../src/core/EventBatcher.ts","../src/core/http/types.ts","../src/core/http/HttpClient.ts","../src/core/http/index.ts","../src/core/ApiClient.ts","../src/core/eventPipelineBridge.ts","../src/core/PaywalloInitHelpers.ts","../src/core/PaywalloState.ts","../src/core/PaywalloInitializer.ts","../src/core/PaywalloLifecycle.ts","../src/core/PaywalloSubscription.ts","../src/core/PaywalloClient.ts","../src/domains/offering/OfferingService.ts","../src/index.ts","../src/context/PaywalloContext.ts","../src/domains/iap/errors.ts","../src/domains/iap/index.ts","../src/domains/offering/index.ts","../src/domains/subscription/index.ts","../src/errors/index.ts","../src/hooks/useOfferingPurchase.ts","../src/domains/plan/invalidateCache.ts","../src/hooks/useOfferings.ts","../src/hooks/useOnboarding.ts","../src/hooks/usePaywallo.ts","../src/hooks/usePlanPurchase.ts","../src/hooks/usePlans.ts","../src/hooks/useProducts.ts","../src/utils/productMappers.ts","../src/hooks/usePurchase.ts","../src/hooks/useSubscription.ts","../src/PaywalloProvider.tsx","../src/hooks/useAppAutoEvents.ts","../src/utils/platformDetection.ts","../src/hooks/useCampaignPreload.ts","../src/utils/loadCampaignProducts.ts","../src/utils/serverProduct.ts","../src/utils/preloadCache.ts","../src/hooks/useProductLoader.ts","../src/hooks/usePurchaseOrchestrator.ts","../src/hooks/useSubscriptionSync.ts","../src/hooks/subscriptionSyncHelpers.ts","../src/utils/productVariableResolver.ts","../src/utils/variableResolver.ts"],"sourcesContent":["export class PaywalloError extends Error {\n readonly code: string;\n readonly domain: string;\n\n constructor(domain: string, code: string, message: string) {\n super(message);\n this.name = \"PaywalloError\";\n this.domain = domain;\n this.code = code;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class CampaignError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"campaign\", code, message);\n this.name = \"CampaignError\";\n }\n}\n\nexport const CAMPAIGN_ERROR_CODES = {\n NOT_INITIALIZED: \"CAMPAIGN_NOT_INITIALIZED\",\n FETCH_FAILED: \"CAMPAIGN_FETCH_FAILED\",\n PRELOAD_FAILED: \"CAMPAIGN_PRELOAD_FAILED\",\n NOT_FOUND: \"CAMPAIGN_NOT_FOUND\",\n PRESENT_FAILED: \"CAMPAIGN_PRESENT_FAILED\",\n} as const;\n","import { NativeModules } from \"react-native\";\n\ninterface PaywalloStorageModule {\n // Secure (Keychain iOS / EncryptedSharedPreferences Android)\n secureGet(key: string): Promise<string | null>;\n secureSet(key: string, value: string): Promise<boolean>;\n secureRemove(key: string): Promise<boolean>;\n // Regular (UserDefaults iOS / SharedPreferences Android)\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<boolean>;\n remove(key: string): Promise<boolean>;\n // Migration helper — reads legacy react-native-keychain format (iOS only, SDK ≤1.5.0)\n // Optional: only available on native builds that include the method.\n legacySecureGet?(key: string): Promise<string | null>;\n}\n\nconst NativeModule = NativeModules.PaywalloStorage as PaywalloStorageModule | undefined;\n\nlet _debug = false;\nlet _warnedUnavailable = false;\n\nexport function setNativeStorageDebug(debug: boolean): void {\n _debug = debug;\n}\n\nfunction isAvailable(): boolean {\n return NativeModule != null;\n}\n\nfunction warnIfUnavailable(): boolean {\n if (NativeModule != null) return true;\n if (!_warnedUnavailable) {\n _warnedUnavailable = true;\n if (_debug) console.log(\"[Paywallo] PaywalloStorage native module not available — storage will not persist\");\n }\n return false;\n}\n\nfunction getModule(): PaywalloStorageModule | null {\n if (!warnIfUnavailable()) return null;\n // NativeModule is captured once at module load — safe to assert here.\n return NativeModule as PaywalloStorageModule;\n}\n\nasync function get(key: string): Promise<string | null> {\n return getModule()?.get(key) ?? null;\n}\n\nasync function set(key: string, value: string): Promise<boolean> {\n return getModule()?.set(key, value) ?? false;\n}\n\nasync function remove(key: string): Promise<boolean> {\n return getModule()?.remove(key) ?? false;\n}\n\nasync function secureGet(key: string): Promise<string | null> {\n return getModule()?.secureGet(key) ?? null;\n}\n\nasync function secureSet(key: string, value: string): Promise<boolean> {\n return getModule()?.secureSet(key, value) ?? false;\n}\n\nasync function secureRemove(key: string): Promise<boolean> {\n return getModule()?.secureRemove(key) ?? false;\n}\n\n/**\n * Read a value stored by react-native-keychain (SDK ≤1.5.0) using the legacy\n * service-per-key layout: service=legacyService, account=\"panel\".\n * Only available on iOS builds that expose `legacySecureGet` on the native module.\n */\nasync function legacySecureGet(key: string): Promise<string | null> {\n const mod = getModule();\n if (!mod?.legacySecureGet) return null;\n return mod.legacySecureGet(key);\n}\n\nexport const nativeStorage = {\n isAvailable,\n get,\n set,\n remove,\n secureGet,\n secureSet,\n secureRemove,\n legacySecureGet,\n};\n","import { nativeStorage } from \"./NativeStorage\";\n\nconst KEYCHAIN_KEY_PREFIX = \"com.paywallo.sdk.\";\nconst REGULAR_KEY_PREFIX = \"@paywallo:\";\n\nexport class SecureStorage {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(_debug = false) {}\n\n async get(key: string): Promise<string | null> {\n const keychainValue = await this.getFromKeychain(key);\n if (keychainValue) {\n return keychainValue;\n }\n\n try {\n const value = await nativeStorage.get(`${REGULAR_KEY_PREFIX}${key}`);\n if (value) {\n await this.setToKeychain(key, value);\n // Remove the plaintext copy after promoting to keychain — prevents stale\n // reads if keychain is later cleared (e.g. Android reinstall, iOS biometric reset).\n nativeStorage.remove(`${REGULAR_KEY_PREFIX}${key}`).catch(() => undefined);\n }\n return value;\n } catch {\n return null;\n }\n }\n\n async set(key: string, value: string): Promise<boolean> {\n // Write only to Keychain — never to plaintext NativeStorage.\n // Sensitive values (email, properties, device IDs) must not land in UserDefaults/SharedPreferences.\n // The read() fallback below handles migration of pre-existing plaintext entries.\n return this.setToKeychain(key, value);\n }\n\n async remove(key: string): Promise<boolean> {\n try {\n await Promise.all([\n // Also remove the legacy plaintext copy if it exists (migration cleanup).\n nativeStorage.remove(`${REGULAR_KEY_PREFIX}${key}`).catch(() => undefined),\n this.removeFromKeychain(key),\n ]);\n return true;\n } catch {\n return false;\n }\n }\n\n hasKeychainSupport(): boolean {\n return nativeStorage.isAvailable();\n }\n\n private async getFromKeychain(key: string): Promise<string | null> {\n try {\n return await nativeStorage.secureGet(`${KEYCHAIN_KEY_PREFIX}${key}`);\n } catch {\n return null;\n }\n }\n\n private async setToKeychain(key: string, value: string): Promise<boolean> {\n try {\n return await nativeStorage.secureSet(`${KEYCHAIN_KEY_PREFIX}${key}`, value);\n } catch {\n return false;\n }\n }\n\n private async removeFromKeychain(key: string): Promise<boolean> {\n try {\n return await nativeStorage.secureRemove(`${KEYCHAIN_KEY_PREFIX}${key}`);\n } catch {\n return false;\n }\n }\n\n}\n\nexport const secureStorage = new SecureStorage();\n","/**\n * StorageMigration — upgrades data from SDK ≤1.5.0 to ≥1.5.2 storage layout.\n *\n * SDK ≤1.5.0 used:\n * - AsyncStorage (SQLite) → regular data with key \"@paywallo:{key}\"\n * - react-native-keychain → secure data with service=\"com.paywallo.sdk.{key}\", account=\"panel\"\n *\n * SDK ≥1.5.2 uses:\n * - UserDefaults / SharedPreferences → regular data with key \"@paywallo:{key}\"\n * - iOS Keychain / EncryptedSharedPreferences → secure data with\n * service=\"com.paywallo.sdk\", account=\"com.paywallo.sdk.{key}\"\n *\n * Migration is run once at init and guarded by a flag stored in NativeStorage.\n */\n\nimport { nativeStorage } from \"./NativeStorage\";\n\nconst MIGRATION_FLAG_KEY = \"@paywallo:_migration_v152_done\";\n\n// Keys that were stored in secure storage in ≤1.5.0.\n// Regular storage keys are migrated wholesale from AsyncStorage.\nconst LEGACY_SECURE_KEYS = [\n \"device_id\",\n \"device_id_fallback\",\n \"anon_id\",\n \"user_email\",\n \"user_properties\",\n];\n\nconst KEYCHAIN_KEY_PREFIX = \"com.paywallo.sdk.\";\n\nexport async function runStorageMigrationIfNeeded(): Promise<void> {\n if (!nativeStorage.isAvailable()) return;\n\n const alreadyDone = await nativeStorage.get(MIGRATION_FLAG_KEY);\n if (alreadyDone === \"1\") return;\n\n // Sequential — avoid concurrent NativeStorage writes on Android.\n await migrateAsyncStorage();\n await migrateKeychainLegacy();\n\n await nativeStorage.set(MIGRATION_FLAG_KEY, \"1\");\n}\n\n/**\n * Migrate regular data from AsyncStorage → UserDefaults/SharedPreferences.\n * Only writes keys that don't already exist in NativeStorage (safe to re-run).\n */\nasync function migrateAsyncStorage(): Promise<void> {\n try {\n // Dynamic import — AsyncStorage may not be installed in 1.5.2+ projects.\n const mod = await import(\"@react-native-async-storage/async-storage\") as {\n default: {\n getAllKeys(): Promise<readonly string[]>;\n multiGet(keys: readonly string[]): Promise<readonly [string, string | null][]>;\n };\n };\n const AsyncStorage = mod.default;\n\n const allKeys = await AsyncStorage.getAllKeys();\n const paywallo = allKeys.filter((k) => k.startsWith(\"@paywallo:\"));\n if (paywallo.length === 0) return;\n\n const pairs = await AsyncStorage.multiGet(paywallo);\n // Sequential writes — avoids concurrent NativeStorage access on Android\n // (SharedPreferences writes are not guaranteed safe under parallel JS calls).\n for (const [key, value] of pairs) {\n if (!value) continue;\n const existing = await nativeStorage.get(key);\n if (!existing) {\n await nativeStorage.set(key, value);\n }\n }\n } catch {\n // AsyncStorage not installed or no data — nothing to migrate.\n }\n}\n\n/**\n * Migrate secure data from legacy react-native-keychain layout →\n * new Keychain layout (via NativeStorage.secureSet).\n *\n * Legacy: service=\"com.paywallo.sdk.{key}\", account=\"panel\"\n * New: service=\"com.paywallo.sdk\", account=\"com.paywallo.sdk.{key}\"\n *\n * iOS: uses legacySecureGet (reads old service/account combo).\n * Android: EncryptedSharedPreferences was introduced in 1.5.2, no prior data.\n */\nasync function migrateKeychainLegacy(): Promise<void> {\n // Sequential writes — avoids concurrent NativeStorage access on Android.\n for (const key of LEGACY_SECURE_KEYS) {\n try {\n // legacySecureGet reads legacy Keychain slot (service=\"{prefix}{key}\", account=\"panel\")\n const legacyValue = await nativeStorage.legacySecureGet(`${KEYCHAIN_KEY_PREFIX}${key}`);\n if (!legacyValue) continue;\n\n // Only migrate if new slot is empty\n const newSlotKey = `${KEYCHAIN_KEY_PREFIX}${key}`;\n const existing = await nativeStorage.secureGet(newSlotKey);\n if (!existing) {\n await nativeStorage.secureSet(newSlotKey, legacyValue);\n }\n } catch {\n // Non-critical — skip this key.\n }\n }\n}\n","import { NativeModules } from \"react-native\";\n\nexport interface DeviceInfoResult {\n deviceId: string;\n model: string;\n modelId: string;\n systemVersion: string;\n appVersion: string;\n buildNumber: string;\n bundleId: string;\n brand: string;\n systemName: string;\n totalDisk: number;\n freeDisk: number;\n totalRam: number;\n carrier: string;\n installerPackage: string | null;\n idfv: string | null;\n darwinVersion?: string;\n webkitVersion?: string;\n}\n\ninterface PaywalloDeviceModule {\n // Native modules return unknown at runtime; Promise<unknown> forces explicit validation.\n getDeviceInfo(): Promise<unknown>;\n getInstallReferrer(): Promise<string | null>;\n}\n\nconst FALLBACK: DeviceInfoResult = {\n deviceId: \"unknown\", model: \"unknown\", modelId: \"unknown\",\n systemVersion: \"0.0.0\", appVersion: \"0.0.0\", buildNumber: \"0\",\n bundleId: \"unknown\", brand: \"unknown\", systemName: \"unknown\",\n totalDisk: 0, freeDisk: 0, totalRam: 0, carrier: \"unknown\",\n installerPackage: null, idfv: null,\n};\n\nlet _debug = false;\nlet warnedOnce = false;\nlet cachedDeviceInfo: DeviceInfoResult | null = null;\n\nexport function setNativeDeviceInfoDebug(debug: boolean): void {\n _debug = debug;\n}\n\nfunction isDeviceInfoResult(value: unknown): value is DeviceInfoResult {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n return (\n typeof v[\"deviceId\"] === \"string\" &&\n typeof v[\"model\"] === \"string\" &&\n typeof v[\"systemVersion\"] === \"string\" &&\n typeof v[\"appVersion\"] === \"string\" &&\n typeof v[\"bundleId\"] === \"string\"\n );\n}\n\nfunction getNativeModule(): PaywalloDeviceModule | null {\n const mod = NativeModules.PaywalloDevice as PaywalloDeviceModule | undefined;\n if (!mod) {\n if (!warnedOnce) {\n warnedOnce = true;\n if (_debug) console.log(\"[Paywallo] NativeModules.PaywalloDevice not found — falling back to defaults\");\n }\n return null;\n }\n return mod;\n}\n\nasync function getDeviceInfo(): Promise<DeviceInfoResult> {\n if (cachedDeviceInfo !== null) return cachedDeviceInfo;\n const mod = getNativeModule();\n if (!mod) return FALLBACK;\n const raw = await mod.getDeviceInfo();\n if (!isDeviceInfoResult(raw)) return FALLBACK;\n cachedDeviceInfo = raw;\n return raw;\n}\n\nasync function getInstallReferrer(): Promise<string | null> {\n const mod = getNativeModule();\n if (!mod) return null;\n try {\n return await mod.getInstallReferrer();\n } catch {\n return null;\n }\n}\n\nfunction isAvailable(): boolean {\n return NativeModules.PaywalloDevice != null;\n}\n\n/** Clears the cached device info. Call after an OTA update if needed. */\nfunction clearCache(): void {\n cachedDeviceInfo = null;\n}\n\n/** Sync accessor for the in-memory cache. Returns null until getDeviceInfo() resolves once. */\nfunction getCachedDeviceInfo(): DeviceInfoResult | null {\n return cachedDeviceInfo;\n}\n\nexport const nativeDeviceInfo = {\n getDeviceInfo,\n getCachedDeviceInfo,\n getInstallReferrer,\n isAvailable,\n clearCache,\n};\n","export function generateUUID(): string {\n const template = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\";\n return template.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n// RFC 4122 UUID v4: 8-4-4-4-12 with version nibble = 4 and variant = 8/9/a/b.\n// StoreKit2 `appAccountToken` requires strict UUID format — anything else is\n// silently rejected and the webhook arrives with `app_user_id=NULL`.\nconst UUID_V4_REGEX =\n /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nexport function isValidUUIDv4(value: string | null | undefined): boolean {\n if (!value) return false;\n return UUID_V4_REGEX.test(value);\n}\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class IdentityError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"identity\", code, message);\n this.name = \"IdentityError\";\n }\n}\n\nexport const IDENTITY_ERROR_CODES = {\n NOT_INITIALIZED: \"IDENTITY_NOT_INITIALIZED\",\n DEVICE_ID_UNAVAILABLE: \"IDENTITY_DEVICE_ID_UNAVAILABLE\",\n STORAGE_READ_FAILED: \"IDENTITY_STORAGE_READ_FAILED\",\n STORAGE_WRITE_FAILED: \"IDENTITY_STORAGE_WRITE_FAILED\",\n IDENTIFY_FAILED: \"IDENTITY_IDENTIFY_FAILED\",\n} as const;\n","import type { SecureStorage } from \"../../core/storage/SecureStorage\";\nimport type { UserProperties } from \"../../types\";\n\n// Storage keys with @paywallo: prefix\nexport const DEVICE_ID_KEY = \"@paywallo:device_id\";\nexport const ANON_ID_KEY = \"@paywallo:anon_id\";\nexport const USER_EMAIL_KEY = \"@paywallo:user_email\";\nexport const USER_PROPERTIES_KEY = \"@paywallo:user_properties\";\nexport const USER_DISTINCT_ID_KEY = \"@paywallo:user_distinct_id\";\nexport const USER_NAME_KEY = \"@paywallo:user_name\";\nexport const USER_COUNTRY_KEY = \"@paywallo:user_country\";\nexport const USER_LOCALE_KEY = \"@paywallo:user_locale\";\nexport const USER_PHONE_KEY = \"@paywallo:user_phone\";\nexport const USER_FIRST_NAME_KEY = \"@paywallo:user_first_name\";\nexport const USER_LAST_NAME_KEY = \"@paywallo:user_last_name\";\nexport const USER_DOB_KEY = \"@paywallo:user_dob\";\nexport const USER_GENDER_KEY = \"@paywallo:user_gender\";\n\n// Legacy keys (SDK ≤2.x used @panel: prefix) — used only for silent migration\nexport const LEGACY_USER_PHONE_KEY = \"@panel:user_phone\";\nexport const LEGACY_USER_FIRST_NAME_KEY = \"@panel:user_first_name\";\nexport const LEGACY_USER_LAST_NAME_KEY = \"@panel:user_last_name\";\nexport const LEGACY_USER_DOB_KEY = \"@panel:user_dob\";\nexport const LEGACY_USER_GENDER_KEY = \"@panel:user_gender\";\n\n// Legacy keys (SDK ≤1.5.x) — used only for silent migration\nconst LEGACY_DEVICE_ID_KEY = \"device_id\";\nconst LEGACY_ANON_ID_KEY = \"anon_id\";\nconst LEGACY_EMAIL_KEY = \"user_email\";\nconst LEGACY_PROPERTIES_KEY = \"user_properties\";\nconst LEGACY_DISTINCT_ID_KEY = \"user_distinct_id\";\nconst LEGACY_NAME_KEY = \"user_name\";\nconst LEGACY_COUNTRY_KEY = \"user_country\";\nconst LEGACY_LOCALE_KEY = \"user_locale\";\n\nexport interface PersistedIdentityState {\n deviceId: string | null;\n anonId: string | null;\n email: string | null;\n propertiesJson: string | null;\n distinctId: string | null;\n name: string | null;\n country: string | null;\n locale: string | null;\n}\n\n/**\n * Read a value from the new @paywallo:-prefixed key, falling back to the legacy\n * key if not found. Writes the value to the new key on migration so subsequent\n * reads skip the legacy path.\n */\nasync function readWithMigration(\n storage: SecureStorage,\n newKey: string,\n legacyKey: string\n): Promise<string | null> {\n const value = await storage.get(newKey);\n if (value) return value;\n\n const legacyValue = await storage.get(legacyKey);\n if (legacyValue) {\n await storage.set(newKey, legacyValue).catch(() => undefined);\n }\n return legacyValue;\n}\n\n/**\n * Load all persisted identity fields, migrating silently from legacy keys when\n * the new @paywallo:-prefixed keys are absent.\n */\nexport async function loadPersistedIdentity(\n storage: SecureStorage\n): Promise<PersistedIdentityState> {\n const [deviceId, anonId, email, propertiesJson, distinctId, name, country, locale] =\n await Promise.all([\n readWithMigration(storage, DEVICE_ID_KEY, LEGACY_DEVICE_ID_KEY),\n readWithMigration(storage, ANON_ID_KEY, LEGACY_ANON_ID_KEY),\n readWithMigration(storage, USER_EMAIL_KEY, LEGACY_EMAIL_KEY),\n readWithMigration(storage, USER_PROPERTIES_KEY, LEGACY_PROPERTIES_KEY),\n readWithMigration(storage, USER_DISTINCT_ID_KEY, LEGACY_DISTINCT_ID_KEY),\n readWithMigration(storage, USER_NAME_KEY, LEGACY_NAME_KEY),\n readWithMigration(storage, USER_COUNTRY_KEY, LEGACY_COUNTRY_KEY),\n readWithMigration(storage, USER_LOCALE_KEY, LEGACY_LOCALE_KEY),\n ]);\n\n return { deviceId, anonId, email, propertiesJson, distinctId, name, country, locale };\n}\n\n/**\n * Read device ID with fallback to `device_id_fallback` key (written by\n * IdentityManager when the primary set fails).\n */\nexport async function readDeviceIdWithFallback(\n storage: SecureStorage\n): Promise<string | null> {\n const value = await readWithMigration(storage, DEVICE_ID_KEY, LEGACY_DEVICE_ID_KEY);\n if (value) return value;\n\n return storage.get(\"device_id_fallback\");\n}\n\n/**\n * Persist user properties as serialised JSON. Returns the parsed object on\n * success or the previous value on parse failure (graceful degradation).\n */\nexport function parseProperties(json: string | null): UserProperties {\n if (!json) return {};\n try {\n return JSON.parse(json) as UserProperties;\n } catch {\n return {};\n }\n}\n","import { ApiClient } from \"../../core/ApiClient\";\nimport { SecureStorage } from \"../../core/storage/SecureStorage\";\nimport { runStorageMigrationIfNeeded } from \"../../core/storage/StorageMigration\";\nimport type { IdentifyOptions, UserProperties } from \"../../types\";\nimport { nativeDeviceInfo } from \"../../utils/NativeDeviceInfo\";\nimport { generateUUID } from \"../../utils/uuid\";\n\nimport { IDENTITY_ERROR_CODES, IdentityError } from \"./IdentityError\";\nimport {\n ANON_ID_KEY,\n DEVICE_ID_KEY,\n LEGACY_USER_DOB_KEY,\n LEGACY_USER_FIRST_NAME_KEY,\n LEGACY_USER_GENDER_KEY,\n LEGACY_USER_LAST_NAME_KEY,\n LEGACY_USER_PHONE_KEY,\n loadPersistedIdentity,\n parseProperties,\n readDeviceIdWithFallback,\n USER_DOB_KEY,\n USER_EMAIL_KEY,\n USER_FIRST_NAME_KEY,\n USER_GENDER_KEY,\n USER_LAST_NAME_KEY,\n USER_PHONE_KEY,\n USER_PROPERTIES_KEY,\n} from \"./IdentityStorage\";\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\nasync function readWithPiiMigration(\n storage: SecureStorage,\n newKey: string,\n legacyKey: string,\n): Promise<string | null> {\n const value = await storage.get(newKey);\n if (value) return value;\n const legacyValue = await storage.get(legacyKey);\n if (legacyValue) {\n await storage.set(newKey, legacyValue).catch(() => undefined);\n }\n return legacyValue;\n}\n\nexport interface IdentityState {\n deviceId: string;\n email: string | null;\n properties: UserProperties;\n phone: string | null;\n firstName: string | null;\n lastName: string | null;\n dateOfBirth: string | null;\n gender: string | null;\n}\n\nexport class IdentityManager {\n private deviceId: string | null = null;\n private anonId: string | null = null;\n private email: string | null = null;\n private properties: UserProperties = {};\n private phone: string | null = null;\n private firstName: string | null = null;\n private lastName: string | null = null;\n private dateOfBirth: string | null = null;\n private gender: string | null = null;\n private apiClient: ApiClient | null = null;\n private secureStorage: SecureStorage | null = null;\n private debug = false;\n private initialized = false;\n private initPromise: Promise<string> | null = null;\n // Caller-controlled stable identifier, hydrated from persisted state only\n // (write path — `identifyV2` — was removed; kept for backward compat on\n // installs upgrading from SDKs that wrote it).\n private distinctId: string | null = null;\n\n async initialize(apiClient: ApiClient, debug = false): Promise<string> {\n if (this.initialized) {\n return this.deviceId ?? \"\";\n }\n // Concurrent calls: return the in-flight promise so only one execution runs\n if (this.initPromise) {\n return this.initPromise;\n }\n this.initPromise = this._doInitialize(apiClient, debug).finally(() => {\n this.initPromise = null;\n });\n return this.initPromise;\n }\n\n private async _doInitialize(apiClient: ApiClient, debug: boolean): Promise<string> {\n this.apiClient = apiClient;\n this.debug = debug;\n this.secureStorage = new SecureStorage(debug);\n\n // Migrate data from SDK ≤1.5.0 (AsyncStorage + react-native-keychain) to\n // NativeStorage (UserDefaults/SharedPreferences + native Keychain) before\n // reading persisted state so no device_id is lost on upgrade.\n await runStorageMigrationIfNeeded();\n\n await this.loadPersistedState();\n\n if (!this.deviceId) {\n try {\n const info = await nativeDeviceInfo.getDeviceInfo();\n const deviceId = info.deviceId;\n this.deviceId = (!deviceId || deviceId === \"unknown\") ? generateUUID() : deviceId;\n } catch {\n this.deviceId = generateUUID();\n }\n const stored = await this.secureStorage.set(DEVICE_ID_KEY, this.deviceId);\n if (!stored) {\n await this.secureStorage.set(\"device_id_fallback\", this.deviceId).catch(() => { /* non-critical */ });\n }\n }\n\n if (!this.anonId) {\n this.anonId = generateUUID();\n await this.secureStorage.set(ANON_ID_KEY, this.anonId).catch(() => { /* non-critical */ });\n }\n\n this.initialized = true;\n return this.deviceId ?? \"\";\n }\n\n async identify(options?: IdentifyOptions | UserProperties): Promise<void> {\n this.ensureInitialized();\n\n let email: string | undefined;\n let properties: UserProperties | undefined;\n\n if (options) {\n if (\"email\" in options || \"properties\" in options || \"phone\" in options || \"firstName\" in options || \"lastName\" in options || \"dateOfBirth\" in options || \"gender\" in options) {\n email = (options as IdentifyOptions).email;\n properties = (options as IdentifyOptions).properties;\n } else {\n properties = options as UserProperties;\n }\n }\n\n if (email) {\n if (!EMAIL_REGEX.test(email)) {\n if (this.debug) console.log(\"[Paywallo] identify: invalid email format, skipping email field\");\n email = undefined;\n } else {\n this.email = email;\n await this.secureStorage!.set(USER_EMAIL_KEY, email);\n }\n }\n\n if (properties) {\n this.properties = { ...this.properties, ...properties };\n await this.secureStorage!.set(USER_PROPERTIES_KEY, JSON.stringify(this.properties));\n }\n\n const opts = options as IdentifyOptions | undefined;\n if (opts?.phone) {\n this.phone = opts.phone;\n await this.secureStorage!.set(USER_PHONE_KEY, this.phone);\n }\n if (opts?.firstName) {\n this.firstName = opts.firstName;\n await this.secureStorage!.set(USER_FIRST_NAME_KEY, this.firstName);\n }\n if (opts?.lastName) {\n this.lastName = opts.lastName;\n await this.secureStorage!.set(USER_LAST_NAME_KEY, this.lastName);\n }\n if (opts?.dateOfBirth) {\n this.dateOfBirth = opts.dateOfBirth;\n await this.secureStorage!.set(USER_DOB_KEY, this.dateOfBirth);\n }\n if (opts?.gender) {\n this.gender = opts.gender;\n await this.secureStorage!.set(USER_GENDER_KEY, this.gender);\n }\n\n if (this.apiClient && this.anonId) {\n try {\n await this.apiClient.identify(this.anonId, properties, email, this.deviceId ?? undefined, {\n phone: this.phone ?? undefined,\n firstName: this.firstName ?? undefined,\n lastName: this.lastName ?? undefined,\n dateOfBirth: this.dateOfBirth ?? undefined,\n gender: this.gender ?? undefined,\n });\n } catch { /* non-critical */ }\n }\n }\n\n getDistinctId(): string {\n if (!this.initialized) return \"\";\n return this.distinctId ?? this.anonId ?? \"\";\n }\n\n getDeviceId(): string | null {\n return this.deviceId;\n }\n\n getEmail(): string | null {\n return this.email;\n }\n\n getProperties(): UserProperties {\n return { ...this.properties };\n }\n\n async updateProperties(properties: UserProperties): Promise<void> {\n this.ensureInitialized();\n\n this.properties = { ...this.properties, ...properties };\n await this.secureStorage!.set(USER_PROPERTIES_KEY, JSON.stringify(this.properties));\n\n if (this.apiClient && this.anonId) {\n try {\n await this.apiClient.identify(this.anonId, this.properties, this.email ?? undefined, this.deviceId ?? undefined);\n } catch { /* non-critical */ }\n }\n }\n\n async reset(): Promise<void> {\n const newAnonId = generateUUID();\n this.anonId = newAnonId;\n this.distinctId = null;\n this.email = null;\n this.properties = {};\n\n this.phone = null;\n this.firstName = null;\n this.lastName = null;\n this.dateOfBirth = null;\n this.gender = null;\n\n await Promise.all([\n this.secureStorage?.set(ANON_ID_KEY, newAnonId) ?? Promise.resolve(false),\n this.secureStorage?.remove(USER_EMAIL_KEY) ?? Promise.resolve(false),\n this.secureStorage?.remove(USER_PROPERTIES_KEY) ?? Promise.resolve(false),\n this.secureStorage?.remove(USER_PHONE_KEY) ?? Promise.resolve(false),\n this.secureStorage?.remove(USER_FIRST_NAME_KEY) ?? Promise.resolve(false),\n this.secureStorage?.remove(USER_LAST_NAME_KEY) ?? Promise.resolve(false),\n this.secureStorage?.remove(USER_DOB_KEY) ?? Promise.resolve(false),\n this.secureStorage?.remove(USER_GENDER_KEY) ?? Promise.resolve(false),\n ]);\n }\n\n getState(): IdentityState {\n return {\n deviceId: this.deviceId ?? \"\",\n email: this.email,\n properties: this.getProperties(),\n phone: this.phone,\n firstName: this.firstName,\n lastName: this.lastName,\n dateOfBirth: this.dateOfBirth,\n gender: this.gender,\n };\n }\n\n isSecureStorageAvailable(): boolean {\n return this.secureStorage !== null;\n }\n\n private async loadPersistedState(): Promise<void> {\n if (!this.secureStorage) return;\n\n const state = await loadPersistedIdentity(this.secureStorage);\n const deviceId = state.deviceId ?? await readDeviceIdWithFallback(this.secureStorage);\n\n if (deviceId) this.deviceId = deviceId;\n if (state.anonId) {\n // Transparent migration: SDK ≤0.x stored anon_id prefixed with\n // \"$paywallo_anon:\" — StoreKit2 `appAccountToken` requires a pure UUID,\n // so strip the prefix here and rewrite storage.\n const legacyPrefix = \"$paywallo_anon:\";\n if (state.anonId.startsWith(legacyPrefix)) {\n const stripped = state.anonId.slice(legacyPrefix.length);\n this.anonId = stripped;\n await this.secureStorage\n .set(ANON_ID_KEY, stripped)\n .catch(() => { /* non-critical */ });\n } else {\n this.anonId = state.anonId;\n }\n }\n if (state.email) this.email = state.email;\n if (state.propertiesJson) this.properties = parseProperties(state.propertiesJson);\n if (state.distinctId) this.distinctId = state.distinctId;\n\n const [phone, firstName, lastName, dateOfBirth, gender] = await Promise.all([\n readWithPiiMigration(this.secureStorage, USER_PHONE_KEY, LEGACY_USER_PHONE_KEY),\n readWithPiiMigration(this.secureStorage, USER_FIRST_NAME_KEY, LEGACY_USER_FIRST_NAME_KEY),\n readWithPiiMigration(this.secureStorage, USER_LAST_NAME_KEY, LEGACY_USER_LAST_NAME_KEY),\n readWithPiiMigration(this.secureStorage, USER_DOB_KEY, LEGACY_USER_DOB_KEY),\n readWithPiiMigration(this.secureStorage, USER_GENDER_KEY, LEGACY_USER_GENDER_KEY),\n ]);\n if (phone) this.phone = phone;\n if (firstName) this.firstName = firstName;\n if (lastName) this.lastName = lastName;\n if (dateOfBirth) this.dateOfBirth = dateOfBirth;\n if (gender) this.gender = gender;\n }\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new IdentityError(\n IDENTITY_ERROR_CODES.NOT_INITIALIZED,\n \"IdentityManager not initialized. Call initialize() first\"\n );\n }\n }\n}\n\nexport const identityManager = new IdentityManager();\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class PaywallError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"paywall\", code, message);\n this.name = \"PaywallError\";\n }\n}\n\nexport const PAYWALL_ERROR_CODES = {\n NOT_INITIALIZED: \"PAYWALL_NOT_INITIALIZED\",\n NOT_FOUND: \"PAYWALL_NOT_FOUND\",\n RENDER_FAILED: \"PAYWALL_RENDER_FAILED\",\n LOAD_FAILED: \"PAYWALL_LOAD_FAILED\",\n DISMISS_FAILED: \"PAYWALL_DISMISS_FAILED\",\n INVALID_CONFIG: \"PAYWALL_INVALID_CONFIG\",\n} as const;\n","import type { ApiClient } from \"../../core/ApiClient\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport type { PreloadCampaignResult } from \"../../core/types\";\nimport { PaywalloError } from \"../../errors/PaywalloError\";\nimport type { CampaignResponse, CampaignResult, PaywallResult } from \"../../types\";\nimport { identityManager } from \"../identity/IdentityManager\";\nimport { PAYWALL_ERROR_CODES, PaywallError } from \"../paywall/PaywallError\";\n\nimport { CAMPAIGN_ERROR_CODES, CampaignError } from \"./CampaignError\";\n\ntype PaywallPresenter = (placement: string) => Promise<PaywallResult>;\ntype CampaignPresenter = (campaign: CampaignResponse) => Promise<CampaignResult>;\n\nconst PRELOAD_CACHE_TTL_MS = 5 * 60 * 1000;\nconst PRELOAD_WAIT_MAX_MS = 2000;\nconst PRELOAD_WAIT_INTERVAL_MS = 100;\ninterface PreloadedCampaignCache { campaign: CampaignResponse; preloadedAt: number }\n\nexport class CampaignGateService {\n private readonly preloadedCampaigns: Map<string, PreloadedCampaignCache> = new Map();\n private readonly pendingPreloads: Set<string> = new Set();\n private apiClientRef: ApiClient | null = null;\n private readonly STALE_THRESHOLD = 0.8;\n\n async getCampaign(apiClient: ApiClient, placement: string, context?: Record<string, unknown>): Promise<CampaignResponse | null> {\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) return null;\n return apiClient.getCampaign(placement, distinctId, context);\n }\n\n private async waitForPreload(placement: string): Promise<void> {\n if (!this.pendingPreloads.has(placement)) return;\n const deadline = Date.now() + PRELOAD_WAIT_MAX_MS;\n await new Promise<void>((resolve) => {\n const check = () => {\n if (!this.pendingPreloads.has(placement) || Date.now() >= deadline) { resolve(); return; }\n setTimeout(check, PRELOAD_WAIT_INTERVAL_MS);\n };\n check();\n });\n }\n\n async presentCampaign(\n apiClient: ApiClient,\n placement: string,\n hasActive: () => Promise<boolean>,\n paywallPresenter: PaywallPresenter | null,\n campaignPresenter: CampaignPresenter | null,\n context?: Record<string, unknown>,\n ): Promise<CampaignResult> {\n await this.waitForPreload(placement);\n const preloaded = this.getPreloadedCampaign(placement);\n const campaign = preloaded ?? await this.getCampaign(apiClient, placement, context);\n if (!campaign) {\n return { presented: false, purchased: false, cancelled: false, restored: false, error: new CampaignError(CAMPAIGN_ERROR_CODES.NOT_FOUND, \"No campaign found\") };\n }\n if (!context?.forceShow) {\n const isActive = await hasActive();\n if (isActive) {\n return { presented: false, purchased: false, cancelled: false, restored: false, skippedReason: \"subscriber\" };\n }\n }\n if (campaignPresenter) return campaignPresenter(campaign);\n if (!paywallPresenter) throw new PaywallError(PAYWALL_ERROR_CODES.NOT_INITIALIZED, \"PaywalloProvider not mounted. Wrap your app with <PaywalloProvider>\");\n return {\n ...(await paywallPresenter(placement)),\n campaignId: campaign.campaignId,\n variantKey: campaign.variantKey,\n ...(campaign.variantId && { variantId: campaign.variantId }),\n };\n }\n\n async requireSubscriptionWithCampaign(\n apiClient: ApiClient,\n placement: string,\n hasActive: () => Promise<boolean>,\n paywallPresenter: PaywallPresenter | null,\n campaignPresenter: CampaignPresenter | null,\n context?: Record<string, unknown>,\n ): Promise<boolean> {\n const isActive = await hasActive();\n if (PaywalloClient.getConfig()?.debug) console.log(`[Paywallo] requireSubscription — hasActive: ${isActive}`);\n if (isActive) return true;\n const r = await this.presentCampaign(apiClient, placement, hasActive, paywallPresenter, campaignPresenter, { ...context, forceShow: true });\n return r.purchased || r.restored;\n }\n\n private readonly activePreloadPromises: Map<string, Promise<PreloadCampaignResult>> = new Map();\n\n async preloadCampaign(apiClient: ApiClient, placement: string, context?: Record<string, unknown>): Promise<PreloadCampaignResult> {\n // Return the in-flight promise if a preload for this placement is already running\n const existing = this.activePreloadPromises.get(placement);\n if (existing) return existing;\n\n const promise = this._doPreload(apiClient, placement, context);\n this.activePreloadPromises.set(placement, promise);\n try {\n return await promise;\n } finally {\n this.activePreloadPromises.delete(placement);\n }\n }\n\n private async _doPreload(apiClient: ApiClient, placement: string, context?: Record<string, unknown>): Promise<PreloadCampaignResult> {\n this.pendingPreloads.add(placement);\n try {\n const campaign = await this.getCampaign(apiClient, placement, context);\n if (!campaign?.paywall) {\n return { success: false, error: new CampaignError(CAMPAIGN_ERROR_CODES.NOT_FOUND, `Campaign or paywall not found: ${placement}`) };\n }\n this.preloadedCampaigns.set(placement, { campaign, preloadedAt: Date.now() });\n if (PaywalloClient.getConfig()?.debug) { console.log(`[Paywallo PRELOAD] data cached — placement: ${placement}`); }\n return { success: true };\n } catch (error) {\n return { success: false, error: error instanceof Error ? error : new PaywalloError(\"panel\", \"PANEL_UNKNOWN\", String(error)) };\n } finally {\n this.pendingPreloads.delete(placement);\n }\n }\n\n getPreloadedCampaign(placement: string): CampaignResponse | null {\n const cached = this.preloadedCampaigns.get(placement);\n if (!cached) return null;\n const age = Date.now() - cached.preloadedAt;\n if (age >= PRELOAD_CACHE_TTL_MS) { this.preloadedCampaigns.delete(placement); return null; }\n if (age >= PRELOAD_CACHE_TTL_MS * this.STALE_THRESHOLD && this.apiClientRef) {\n void this.preloadCampaign(this.apiClientRef, placement).catch(() => {});\n }\n return cached.campaign;\n }\n\n async preloadAllActive(apiClient: ApiClient, debug?: boolean): Promise<void> {\n this.apiClientRef = apiClient;\n const placements = await apiClient.getActivePlacements();\n if (placements.length === 0) return;\n if (debug) console.log(`[Paywallo PRELOAD] auto-preloading ${placements.length} placements`);\n for (let i = 0; i < placements.length; i++) {\n if (i > 0) await new Promise<void>((r) => setTimeout(r, 500));\n void this.preloadCampaign(apiClient, placements[i]).catch((err) => {\n if (debug) console.log(`[Paywallo PRELOAD] failed ${placements[i]}:`, err);\n });\n }\n }\n\n clearPreloaded(): void { this.preloadedCampaigns.clear(); this.pendingPreloads.clear(); }\n}\n\nexport const campaignGateService = new CampaignGateService();\n","export type { CampaignPresentOptions, CampaignResponse, CampaignResult, ServerProductInfo } from \"../../types\";\nexport { CAMPAIGN_ERROR_CODES,CampaignError } from \"./CampaignError\";\nexport { CampaignGateService, campaignGateService } from \"./CampaignGateService\";\n","import { Platform } from \"react-native\";\n\nimport { nativeDeviceInfo } from \"../../utils/NativeDeviceInfo\";\n\nconst ZERO_IDFA = \"00000000-0000-0000-0000-000000000000\";\n\nexport type AttStatus = \"granted\" | \"denied\" | \"restricted\" | \"undetermined\" | \"unavailable\";\n\nexport interface AdvertisingIdResult {\n idfv: string | null;\n idfa: string | null;\n gaid: string | null;\n attStatus: AttStatus;\n}\n\nexport class AdvertisingIdManager {\n private cached: AdvertisingIdResult | null = null;\n\n /**\n * Synchronous accessor for the cached collect() result. Returns null until\n * `collect()` resolves at least once. Used by the V2 envelope context\n * provider — which is sync — to populate `context.ids` without awaiting.\n */\n getCached(): AdvertisingIdResult | null {\n return this.cached;\n }\n\n async collect(requestATT = false): Promise<AdvertisingIdResult> {\n if (this.cached) return this.cached;\n\n const fallback: AdvertisingIdResult = { idfv: null, idfa: null, gaid: null, attStatus: \"unavailable\" };\n\n try {\n const tracking = await import(\"expo-tracking-transparency\");\n\n if (Platform.OS === \"ios\") {\n if (!tracking.isAvailable()) {\n const idfv = await this.collectIdfv();\n this.cached = { ...fallback, idfv };\n return this.cached;\n }\n\n const current = await tracking.getTrackingPermissionsAsync();\n let status = current.status as AttStatus;\n let granted = current.granted;\n\n if (status === \"undetermined\" && requestATT) {\n const result = await tracking.requestTrackingPermissionsAsync();\n status = result.status as AttStatus;\n granted = result.granted;\n }\n\n const idfv = await this.collectIdfv();\n const idfa = granted ? this.sanitizeId(tracking.getAdvertisingId()) : null;\n this.cached = { idfv, idfa, gaid: null, attStatus: status };\n return this.cached;\n }\n\n if (Platform.OS === \"android\") {\n // On Android, getTrackingPermissionsAsync() is a no-op shim — always granted.\n // Actual opt-out is signaled by getAdvertisingId() returning the all-zeros UUID,\n // which sanitizeId() correctly normalizes to null.\n const rawGaid = tracking.getAdvertisingId();\n const gaid = this.sanitizeId(rawGaid);\n this.cached = { idfv: null, idfa: null, gaid, attStatus: \"unavailable\" };\n return this.cached;\n }\n\n this.cached = fallback;\n return this.cached;\n } catch {\n this.cached = fallback;\n return this.cached;\n }\n }\n\n private async collectIdfv(): Promise<string | null> {\n try {\n const info = await nativeDeviceInfo.getDeviceInfo();\n return this.sanitizeId(info.idfv);\n } catch {\n return null;\n }\n }\n\n private sanitizeId(id: string | null | undefined): string | null {\n if (!id || id === ZERO_IDFA) return null;\n return id;\n }\n}\n\nexport const advertisingIdManager = new AdvertisingIdManager();\n","/**\n * Guard usado pelo SessionManager.startSession() — aguarda distinctId ficar\n * disponível antes de criar a sessão. Raiz dos 55% users com total_sessions=0\n * era session.startSession rodando em paralelo com identity.initialize() e\n * batendo em distinctId vazio. Agora sessão só inicia depois da identity\n * estar pronta; este guard é uma defesa extra caso alguém chame startSession\n * manualmente antes do init terminar.\n */\nexport type DistinctIdProvider = () => string;\n\nexport const DISTINCT_ID_WAIT_RETRIES = 10;\nexport const DISTINCT_ID_WAIT_INTERVAL_MS = 100;\n\nexport async function waitForDistinctId(\n provider: DistinctIdProvider | null,\n retries: number = DISTINCT_ID_WAIT_RETRIES,\n intervalMs: number = DISTINCT_ID_WAIT_INTERVAL_MS,\n): Promise<boolean> {\n if (!provider) return true;\n if (provider()) return true;\n for (let attempt = 0; attempt < retries; attempt++) {\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n if (provider()) return true;\n }\n return false;\n}\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class SessionError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"session\", code, message);\n this.name = \"SessionError\";\n }\n}\n\nexport const SESSION_ERROR_CODES = {\n NOT_INITIALIZED: \"SESSION_NOT_INITIALIZED\",\n START_FAILED: \"SESSION_START_FAILED\",\n END_FAILED: \"SESSION_END_FAILED\",\n RESTORE_FAILED: \"SESSION_RESTORE_FAILED\",\n} as const;\n","import { nativeDeviceInfo } from \"./NativeDeviceInfo\";\n\nexport interface DeviceInfo {\n appVersion: string;\n deviceModel: string;\n osVersion: string;\n darwinVersion?: string;\n webkitVersion?: string;\n}\n\nexport async function collectDeviceInfo(): Promise<DeviceInfo> {\n const result = await nativeDeviceInfo.getDeviceInfo();\n\n return {\n appVersion: result.appVersion,\n deviceModel: result.model,\n osVersion: result.systemVersion,\n darwinVersion: result.darwinVersion,\n webkitVersion: result.webkitVersion,\n };\n}\n","import type { ApiClient } from \"../../core/ApiClient\";\nimport { collectDeviceInfo } from \"../../utils/deviceInfo\";\nimport { identityManager } from \"../identity/IdentityManager\";\n\nexport async function trackSessionStart(\n apiClient: ApiClient,\n sessionId: string,\n sessionStartedAt: Date | null\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n const deviceInfo = await collectDeviceInfo().catch(() => ({\n appVersion: \"unknown\",\n deviceModel: \"unknown\",\n osVersion: \"unknown\",\n }));\n\n // Single canonical emission: `$session_start` event through the unified\n // EventBatcher. The legacy `/api/v1/sessions/start` endpoint has been dropped —\n // the server derives session bookkeeping from this event.\n await apiClient\n .trackEvent(\"$session_start\", distinctId, {\n sessionId,\n timestamp: sessionStartedAt?.toISOString() ?? null,\n appVersion: deviceInfo.appVersion,\n deviceModel: deviceInfo.deviceModel,\n osVersion: deviceInfo.osVersion,\n })\n .catch(() => {});\n}\n\nexport async function trackSessionEnd(\n apiClient: ApiClient,\n sessionId: string,\n durationSeconds: number,\n sessionStartedAt: Date | null\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n const endedAt = new Date();\n const duration_s = Math.max(0, durationSeconds);\n // V2 taxonomy: `session.end` (sem `$`) renomeado para canonical\n // `lifecycle {type:\"session_end\"}`.\n const payload: Record<string, string | number | boolean | null> = {\n type: \"session_end\",\n session_id: sessionId,\n duration_s,\n ended_at: endedAt.toISOString(),\n };\n if (sessionStartedAt) payload.started_at = sessionStartedAt.toISOString();\n await apiClient\n .trackEvent(\"lifecycle\", distinctId, payload)\n .catch(() => {});\n}\n\nexport async function trackAppOpen(\n apiClient: ApiClient,\n sessionId: string | null\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n // V2 taxonomy: `$app_open` solto foi removido. O cold_start canonical é\n // emitido por `useAppAutoEvents` no mount do Provider; aqui emitimos\n // `lifecycle {type:\"foreground\"}` porque este helper roda em todo\n // AppState=active (incluindo retorno de background).\n await apiClient\n .trackEvent(\"lifecycle\", distinctId, {\n type: \"foreground\" as const,\n ...(sessionId ? { session_id: sessionId } : {}),\n })\n .catch(() => {});\n}\n\nexport async function trackAppBackground(\n apiClient: ApiClient,\n sessionId: string | null,\n durationSeconds: number\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n // V2 taxonomy: `$app_background` foi removido. Emite canonical\n // `lifecycle {type:\"background\", duration_s}`.\n const duration_s = Math.max(0, durationSeconds);\n await apiClient\n .trackEvent(\"lifecycle\", distinctId, {\n type: \"background\" as const,\n duration_s,\n ...(sessionId ? { session_id: sessionId } : {}),\n })\n .catch(() => {});\n}\n","import { AppState, AppStateStatus } from \"react-native\";\n\nimport { ApiClient } from \"../../core/ApiClient\";\nimport { SecureStorage } from \"../../core/storage/SecureStorage\";\nimport { generateUUID } from \"../../utils/uuid\";\n\nimport { DistinctIdProvider, waitForDistinctId } from \"./distinctIdGuard\";\nimport { SESSION_ERROR_CODES, SessionError } from \"./SessionError\";\nimport {\n trackAppBackground,\n trackAppOpen,\n trackSessionEnd,\n trackSessionStart,\n} from \"./sessionTracking\";\nimport { EmergencyPaywallHandler, SessionConfig, SessionState } from \"./types\";\n\nconst SESSION_ID_KEY = \"@paywallo:current_session_id\";\nconst SESSION_START_KEY = \"@paywallo:session_start\";\nconst EMERGENCY_PAYWALL_SHOWN_KEY = \"@paywallo:emergency_paywall_shown\";\n\n// Legacy keys for silent migration\nconst LEGACY_SESSION_ID_KEY = \"current_session_id\";\nconst LEGACY_SESSION_START_KEY = \"session_start\";\nconst LEGACY_EMERGENCY_PAYWALL_SHOWN_KEY = \"@panel:emergency_paywall_shown\";\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000;\nconst BACKGROUND_FLUSH_TIMEOUT_MS = 2_000;\n\nexport class SessionManager {\n private sessionId: string | null = null;\n private sessionStartedAt: Date | null = null;\n private appState: AppStateStatus = \"active\";\n private apiClient: ApiClient | null = null;\n private debug = false;\n private initialized = false;\n private config: SessionConfig = {};\n private backgroundTimestamp: number | null = null;\n private appStateSubscription: { remove: () => void } | null = null;\n private emergencyPaywallHandler: EmergencyPaywallHandler | null = null;\n private emergencyPaywallShownInSession = false;\n private secureStorage: SecureStorage | null = null;\n private distinctIdProvider: DistinctIdProvider | null = null;\n\n async initialize(\n apiClient: ApiClient,\n config: SessionConfig = {},\n debug = false,\n distinctIdProvider: DistinctIdProvider | null = null,\n ): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n this.apiClient = apiClient;\n this.debug = debug;\n this.secureStorage = new SecureStorage(debug);\n this.distinctIdProvider = distinctIdProvider;\n this.config = {\n sessionTimeoutMs: config.sessionTimeoutMs ?? SESSION_TIMEOUT_MS,\n trackAppState: config.trackAppState ?? true,\n };\n\n await this.restoreSession();\n\n if (this.config.trackAppState) {\n this.setupAppStateListener();\n }\n\n this.initialized = true;\n }\n\n async startSession(): Promise<string> {\n this.ensureInitialized();\n\n const distinctIdReady = await waitForDistinctId(this.distinctIdProvider);\n if (!distinctIdReady) {\n if (this.debug) console.log(\"[Paywallo:Session] startSession aborted — distinctId unavailable after retry\");\n throw new SessionError(\n SESSION_ERROR_CODES.START_FAILED,\n \"startSession aborted: distinctId unavailable after retry window\",\n );\n }\n\n if (this.sessionId) {\n await this.endSession();\n }\n\n this.sessionId = generateUUID();\n this.sessionStartedAt = new Date();\n this.emergencyPaywallShownInSession = false;\n\n await Promise.all([\n this.secureStorage!.set(SESSION_ID_KEY, this.sessionId),\n this.secureStorage!.set(SESSION_START_KEY, this.sessionStartedAt.toISOString()),\n this.secureStorage!.remove(EMERGENCY_PAYWALL_SHOWN_KEY),\n ]);\n\n await this.trackSessionStart();\n\n return this.sessionId;\n }\n\n async endSession(): Promise<void> {\n this.ensureInitialized();\n\n if (!this.sessionId || !this.sessionStartedAt) {\n return;\n }\n\n if (this.apiClient) {\n await this.apiClient.flushEventBatch();\n }\n\n await this.trackSessionEnd();\n\n this.sessionId = null;\n this.sessionStartedAt = null;\n\n await Promise.all([\n this.secureStorage!.remove(SESSION_ID_KEY),\n this.secureStorage!.remove(SESSION_START_KEY),\n ]);\n }\n\n getSessionId(): string | null {\n return this.sessionId;\n }\n\n getSessionDuration(): number {\n if (!this.sessionStartedAt) {\n return 0;\n }\n return Math.floor((Date.now() - this.sessionStartedAt.getTime()) / 1000);\n }\n\n isSessionActive(): boolean {\n return this.sessionId !== null;\n }\n\n getState(): SessionState {\n return {\n sessionId: this.sessionId,\n startedAt: this.sessionStartedAt,\n isActive: this.isSessionActive(),\n duration: this.getSessionDuration(),\n };\n }\n\n destroy(): void {\n if (this.appStateSubscription) {\n this.appStateSubscription.remove();\n this.appStateSubscription = null;\n }\n this.initialized = false;\n }\n\n registerEmergencyPaywallHandler(handler: EmergencyPaywallHandler | null): void {\n this.emergencyPaywallHandler = handler;\n }\n\n private async readSessionKey(key: string, legacyKey: string): Promise<string | null> {\n const value = await this.secureStorage!.get(key);\n if (value) return value;\n const legacyValue = await this.secureStorage!.get(legacyKey);\n if (legacyValue) {\n await this.secureStorage!.set(key, legacyValue).catch(() => undefined);\n }\n return legacyValue;\n }\n\n private async restoreSession(): Promise<void> {\n const [sessionId, sessionStart] = await Promise.all([\n this.readSessionKey(SESSION_ID_KEY, LEGACY_SESSION_ID_KEY),\n this.readSessionKey(SESSION_START_KEY, LEGACY_SESSION_START_KEY),\n ]).catch(() => [null, null]);\n\n if (sessionId && sessionStart) {\n const startedAt = new Date(sessionStart);\n const elapsed = Date.now() - startedAt.getTime();\n\n if (elapsed < (this.config.sessionTimeoutMs ?? SESSION_TIMEOUT_MS)) {\n this.sessionId = sessionId;\n this.sessionStartedAt = startedAt;\n return;\n }\n\n await Promise.all([\n this.secureStorage!.remove(SESSION_ID_KEY),\n this.secureStorage!.remove(SESSION_START_KEY),\n ]).catch(() => {});\n }\n }\n\n private setupAppStateListener(): void {\n if (this.appStateSubscription) {\n this.appStateSubscription.remove();\n }\n\n this.appStateSubscription = AppState.addEventListener(\"change\", this.handleAppStateChange);\n }\n\n private handleAppStateChange = async (nextAppState: AppStateStatus): Promise<void> => {\n const previousState = this.appState;\n this.appState = nextAppState;\n\n if (nextAppState === \"active\" && previousState !== \"active\") {\n await this.handleForeground();\n } else if (nextAppState === \"background\" && previousState === \"active\") {\n await this.handleBackground();\n }\n };\n\n private async handleForeground(): Promise<void> {\n const elapsed = this.backgroundTimestamp ? Date.now() - this.backgroundTimestamp : null;\n this.backgroundTimestamp = null;\n\n // After auto-end on background, or after timeout, always start fresh\n if (!this.sessionId || (elapsed !== null && elapsed > (this.config.sessionTimeoutMs ?? SESSION_TIMEOUT_MS))) {\n await this.startSession();\n }\n\n await this.trackAppOpen();\n await this.checkEmergencyPaywall();\n }\n\n private async handleBackground(): Promise<void> {\n this.backgroundTimestamp = Date.now();\n await this.trackAppBackground();\n // Drain pending events before the app suspends. Bounded by a short\n // timeout so a slow network can't hang the AppState transition — any\n // events still in flight remain in the batcher / OfflineQueue and get\n // replayed on next foreground.\n await this.flushEventsWithTimeout(BACKGROUND_FLUSH_TIMEOUT_MS);\n // Auto-end session when app goes to background\n await this.endSession();\n }\n\n private async flushEventsWithTimeout(timeoutMs: number): Promise<void> {\n if (!this.apiClient) return;\n const flush = this.apiClient.flushEventBatch().catch(() => undefined);\n const timeout = new Promise<void>((resolve) => setTimeout(resolve, timeoutMs));\n await Promise.race([flush, timeout]);\n }\n\n private async checkEmergencyPaywall(): Promise<void> {\n if (!this.apiClient || !this.emergencyPaywallHandler) {\n return;\n }\n\n if (this.emergencyPaywallShownInSession) {\n return;\n }\n\n const response = await this.apiClient.getEmergencyPaywall().catch(() => null);\n\n if (response?.enabled && response.paywallId) {\n this.emergencyPaywallShownInSession = true;\n await this.secureStorage!.set(EMERGENCY_PAYWALL_SHOWN_KEY, \"true\");\n await this.emergencyPaywallHandler(response.paywallId);\n }\n }\n\n private async trackSessionStart(): Promise<void> {\n if (!this.apiClient || !this.sessionId) return;\n await trackSessionStart(this.apiClient, this.sessionId, this.sessionStartedAt);\n }\n\n private async trackSessionEnd(): Promise<void> {\n if (!this.apiClient || !this.sessionId) return;\n await trackSessionEnd(this.apiClient, this.sessionId, this.getSessionDuration(), this.sessionStartedAt);\n }\n\n private async trackAppOpen(): Promise<void> {\n if (!this.apiClient) return;\n await trackAppOpen(this.apiClient, this.sessionId);\n }\n\n private async trackAppBackground(): Promise<void> {\n if (!this.apiClient) return;\n await trackAppBackground(this.apiClient, this.sessionId, this.getSessionDuration());\n }\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new SessionError(\n SESSION_ERROR_CODES.NOT_INITIALIZED,\n \"SessionManager not initialized. Call initialize() first\"\n );\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) console.log(\"[Paywallo:Session]\", ...args);\n }\n}\n\nexport const sessionManager = new SessionManager();\n","import { SecureStorage } from \"../../core/storage/SecureStorage\";\n\nconst ATTRIBUTION_STORAGE_KEY = \"@paywallo:attribution_v2\";\nconst LEGACY_ATTRIBUTION_STORAGE_KEY = \"@panel:attribution_v2\";\n\n/**\n * Attribution data captured at first touch (UTM params, click IDs, referrer).\n * `capturedAt` is ISO 8601 UTC — generated automatically by `capture()`.\n */\nexport interface AttributionCapture {\n readonly utmSource?: string;\n readonly utmMedium?: string;\n readonly utmCampaign?: string;\n readonly utmContent?: string;\n readonly utmTerm?: string;\n readonly fbclid?: string;\n readonly gclid?: string;\n readonly ttclid?: string;\n readonly tiktokCampaignId?: string;\n readonly tiktokAdgroupId?: string;\n readonly tiktokAdId?: string;\n readonly installReferrerRaw?: string;\n readonly installReferrerSource?: string;\n readonly referrer?: string;\n readonly capturedAt: string;\n}\n\ntype AttributionInput = Omit<AttributionCapture, \"capturedAt\">;\n\nfunction hasAnyField(data: AttributionInput): boolean {\n return Object.values(data).some((v) => v !== undefined && v !== null && v !== \"\");\n}\n\n/**\n * Attribution module — first-write-wins persistence of UTM / click-ID data.\n *\n * Once a capture is stored, subsequent `capture()` calls are silently ignored.\n * Use `clear()` to reset (e.g. on logout or in tests).\n *\n * @example\n * await attributionTracker.capture({ utmSource: \"google\", gclid: \"Cj0KCQ...\" });\n * const attr = attributionTracker.get(); // { utmSource: \"google\", capturedAt: \"...\" }\n */\nexport class AttributionTracker {\n private cache: AttributionCapture | null = null;\n private captureInProgress = false;\n private readonly storage: SecureStorage;\n\n constructor(debug = false) {\n this.storage = new SecureStorage(debug);\n }\n\n /**\n * Load persisted attribution from storage into in-memory cache.\n * Called once on SDK init. Subsequent `get()` reads are synchronous.\n */\n async loadFromStorage(): Promise<void> {\n let raw = await this.storage.get(ATTRIBUTION_STORAGE_KEY);\n if (!raw) {\n // Silent migration from legacy @panel: key\n raw = await this.storage.get(LEGACY_ATTRIBUTION_STORAGE_KEY).catch(() => null);\n if (raw) {\n await this.storage.set(ATTRIBUTION_STORAGE_KEY, raw).catch(() => undefined);\n }\n }\n if (raw) {\n try {\n this.cache = JSON.parse(raw) as AttributionCapture;\n } catch { /* malformed — treat as empty */ }\n }\n }\n\n /**\n * Persist attribution data. First-write wins — ignores if already captured\n * or if all fields are absent (empty capture).\n *\n * @param data - Attribution fields without `capturedAt` (generated internally).\n */\n async capture(data: AttributionInput): Promise<void> {\n if (this.cache !== null) return;\n if (!hasAnyField(data)) return;\n if (this.captureInProgress) return;\n\n this.captureInProgress = true;\n try {\n const capture: AttributionCapture = {\n ...data,\n capturedAt: new Date().toISOString(),\n };\n await this.storage.set(ATTRIBUTION_STORAGE_KEY, JSON.stringify(capture));\n this.cache = capture;\n } finally {\n this.captureInProgress = false;\n }\n }\n\n /**\n * Returns the persisted attribution capture, or `null` if none exists.\n * Synchronous — reads from in-memory cache (populated via `loadFromStorage()`).\n */\n get(): AttributionCapture | null {\n return this.cache;\n }\n\n /**\n * Clears the persisted attribution from storage and in-memory cache.\n * After `clear()`, `get()` returns `null` and the next `capture()` writes normally.\n */\n async clear(): Promise<void> {\n this.cache = null;\n await this.storage.remove(ATTRIBUTION_STORAGE_KEY);\n }\n}\n\nexport const attributionTracker = new AttributionTracker();\n","import { nativeStorage } from \"../../core/storage/NativeStorage\";\nimport { SecureStorage } from \"../../core/storage/SecureStorage\";\n\n/**\n * Storage keys used across install idempotency checks.\n * Centralised here so both InstallTracker and tests can reference them.\n */\nexport const INSTALL_KEYS = {\n /** Primary flag — set AFTER a successful $app_installed dispatch. */\n INSTALL_TRACKED: \"@paywallo:install_tracked\",\n /** Legacy fallback flag written by SDK versions that used @panel: prefix. */\n LEGACY_INSTALL_TRACKED: \"@panel:install_tracked\",\n /** Pre-send guard — set BEFORE dispatching to survive concurrent cold-starts. */\n INSTALL_SENT: \"@paywallo:app_installed_sent\",\n /** Stable event ID for backend dedup — generated once, reused on retries. */\n INSTALL_EVENT_ID: \"@paywallo:install_event_id\",\n /** Legacy event ID key written by SDK versions that used @panel: prefix. */\n LEGACY_INSTALL_EVENT_ID: \"@panel:install_event_id\",\n /** Deferred match flag — set once iOS fingerprint match succeeds. */\n DEFERRED_MATCH_DONE: \"@paywallo:deferred_match_done\",\n /** Legacy deferred match key written by SDK versions that used @panel: prefix. */\n LEGACY_DEFERRED_MATCH_DONE: \"@panel:deferred_match_done\",\n /** Anonymous ID fallback when FB SDK not available. */\n ANON_ID: \"@paywallo:anon_id\",\n /** Legacy anon ID key written by SDK versions that used @panel: prefix. */\n LEGACY_ANON_ID: \"@panel:anon_id\",\n} as const;\n\n/**\n * Checks whether the install event was already tracked or is already in-flight.\n *\n * Returns `true` when the caller should bail out early (already handled),\n * or `false` when it should proceed with tracking.\n *\n * Side-effect when returning `false`: the pre-send guard\n * (`@paywallo:app_installed_sent`) is written to storage so that concurrent\n * cold-starts within the same process launch cannot both slip past these checks.\n *\n * Race condition fix (F2.18): `INSTALL_SENT` is only a valid \"in-flight\" guard\n * when the HTTP response was never received (network failure). On the next boot,\n * if `INSTALL_TRACKED` is absent but `INSTALL_SENT` is present, the previous\n * attempt failed before the server confirmed receipt — we clear the stale guard\n * and retry instead of permanently losing the event.\n */\nexport async function checkAndArmInstallGuard(\n storage: SecureStorage,\n): Promise<boolean> {\n const alreadyTracked = await storage.get(INSTALL_KEYS.INSTALL_TRACKED);\n if (alreadyTracked) return true;\n\n let fallbackTracked: string | null = null;\n try {\n fallbackTracked = await nativeStorage.get(INSTALL_KEYS.LEGACY_INSTALL_TRACKED);\n } catch { /* NativeStorage not available */ }\n if (fallbackTracked) return true;\n\n // Arm (or re-arm) the pre-send guard so concurrent cold-starts in the same\n // process launch can't both slip past this check.\n //\n // If INSTALL_SENT was already set from a prior boot where the HTTP response\n // never arrived (network failure / app killed mid-flight), we intentionally\n // fall through and re-arm it — INSTALL_TRACKED being absent is the proof that\n // the server never confirmed receipt, so we must retry.\n await nativeStorage.set(INSTALL_KEYS.INSTALL_SENT, \"1\");\n return false;\n}\n\n/**\n * Persists the install-tracked flag in both storage layers after a successful\n * `$app_installed` dispatch.\n */\nexport async function markInstallTracked(\n storage: SecureStorage,\n installedAt: number,\n): Promise<void> {\n await storage.set(INSTALL_KEYS.INSTALL_TRACKED, String(installedAt));\n try {\n await nativeStorage.set(INSTALL_KEYS.LEGACY_INSTALL_TRACKED, String(installedAt));\n } catch { /* non-critical */ }\n}\n\n/**\n * Returns a stable UUID for the `$app_installed` event, creating and persisting\n * one if it does not yet exist.\n *\n * The same ID is reused on every retry so the backend can deduplicate\n * concurrent or repeated dispatches (e.g. background flush + foreground init).\n */\nexport async function getOrCreateInstallEventId(): Promise<string> {\n const existing = await nativeStorage.get(INSTALL_KEYS.INSTALL_EVENT_ID);\n if (existing) return existing;\n\n // Silent migration from legacy @panel: key\n const legacy = await nativeStorage.get(INSTALL_KEYS.LEGACY_INSTALL_EVENT_ID).catch(() => null);\n if (legacy) {\n await nativeStorage.set(INSTALL_KEYS.INSTALL_EVENT_ID, legacy).catch(() => {});\n return legacy;\n }\n\n const { generateUUID } = await import(\"../../utils/uuid\");\n const id = generateUUID();\n await nativeStorage.set(INSTALL_KEYS.INSTALL_EVENT_ID, id).catch(() => {});\n return id;\n}\n","import { Platform } from \"react-native\";\n\nimport { nativeDeviceInfo } from \"../../utils/NativeDeviceInfo\";\n\nconst REFERRER_TIMEOUT_MS = 5000;\n\ninterface ReferrerResult {\n rawReferrer: string | null;\n trackingId: string | null;\n fbclid: string | null;\n utmSource: string | null;\n utmMedium: string | null;\n utmCampaign: string | null;\n ttclid: string | null;\n tiktokCampaignId: string | null;\n tiktokAdgroupId: string | null;\n tiktokAdId: string | null;\n installReferrerRaw: string | null;\n installReferrerSource: string | null;\n}\n\nexport class InstallReferrerManager {\n async getReferrer(): Promise<ReferrerResult> {\n if (Platform.OS !== \"android\") {\n return this.emptyResult();\n }\n\n let timerId: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<ReferrerResult>((resolve) => {\n timerId = setTimeout(() => resolve(this.emptyResult()), REFERRER_TIMEOUT_MS);\n });\n\n const fetchPromise = this.fetchReferrer();\n\n const result = await Promise.race([fetchPromise, timeoutPromise]);\n clearTimeout(timerId);\n return result;\n }\n\n private async fetchReferrer(): Promise<ReferrerResult> {\n try {\n const referrer = await nativeDeviceInfo.getInstallReferrer();\n\n if (!referrer) return this.emptyResult();\n\n const capped = referrer.slice(0, 2048);\n const params = this.parseReferrer(capped);\n return {\n rawReferrer: capped,\n trackingId: params[\"tracking_id\"] || null,\n fbclid: params[\"fbclid\"] || null,\n utmSource: params[\"utm_source\"] || null,\n utmMedium: params[\"utm_medium\"] || null,\n utmCampaign: params[\"utm_campaign\"] || null,\n ttclid: params[\"ttclid\"] || null,\n tiktokCampaignId: params[\"campaign_id\"] || null,\n tiktokAdgroupId: params[\"adgroup_id\"] || null,\n tiktokAdId: params[\"ad_id\"] || null,\n installReferrerRaw: capped || null,\n installReferrerSource: \"play_store\",\n };\n } catch {\n return this.emptyResult();\n }\n }\n\n private parseReferrer(referrer: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const pair of referrer.split(\"&\")) {\n const eqIndex = pair.indexOf(\"=\");\n if (eqIndex === -1) continue;\n try {\n const key = decodeURIComponent(pair.slice(0, eqIndex).replace(/\\+/g, \" \"));\n const raw = pair.slice(eqIndex + 1).replace(/\\+/g, \" \");\n const value = decodeURIComponent(raw);\n if (key) result[key] = value;\n } catch {\n }\n }\n return result;\n }\n\n private emptyResult(): ReferrerResult {\n return {\n rawReferrer: null,\n trackingId: null,\n fbclid: null,\n utmSource: null,\n utmMedium: null,\n utmCampaign: null,\n ttclid: null,\n tiktokCampaignId: null,\n tiktokAdgroupId: null,\n tiktokAdId: null,\n installReferrerRaw: null,\n installReferrerSource: null,\n };\n }\n}\n\nexport const installReferrerManager = new InstallReferrerManager();\n","import { NativeModules } from \"react-native\";\n\nconst TIMEOUT_MS = 2000;\n\ninterface PaywalloFBBridgeModule {\n getAnonymousID(): Promise<string | null>;\n logEvent(name: string, params: Record<string, unknown>): Promise<void>;\n logPurchase(amount: number, currency: string, params: Record<string, unknown>): Promise<void>;\n setUserID(userId: string): void;\n flush(): void;\n}\n\nconst NativeBridge: PaywalloFBBridgeModule | null =\n (NativeModules.PaywalloFBBridge as PaywalloFBBridgeModule | undefined) ?? null;\n\nexport class MetaBridge {\n private cachedAnonId: string | null = null;\n private debug: boolean = false;\n\n setDebug(debug: boolean): void {\n this.debug = debug;\n }\n\n /** Sync read of the cached anonymous ID. Returns null until `getAnonymousID()` resolves once. */\n getCachedAnonymousID(): string | null {\n return this.cachedAnonId;\n }\n\n async getAnonymousID(): Promise<string | null> {\n if (this.cachedAnonId) return this.cachedAnonId;\n if (!NativeBridge) return null;\n try {\n let timerId: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<null>((resolve) => {\n timerId = setTimeout(() => resolve(null), TIMEOUT_MS);\n });\n const result = await Promise.race([NativeBridge.getAnonymousID(), timeout]);\n clearTimeout(timerId);\n if (result) this.cachedAnonId = result;\n return result;\n } catch {\n return null;\n }\n }\n\n async logEvent(name: string, params: Record<string, unknown> = {}): Promise<void> {\n if (!NativeBridge) return;\n try {\n await NativeBridge.logEvent(name, params);\n } catch (error) {\n if (this.debug) console.warn(\"[Paywallo:MetaBridge] logEvent failed\", { name, error });\n }\n }\n\n async logPurchase(amount: number, currency: string, params: Record<string, unknown> = {}): Promise<void> {\n if (!NativeBridge) return;\n try {\n await NativeBridge.logPurchase(amount, currency, params);\n } catch (error) {\n if (this.debug) console.warn(\"[Paywallo:MetaBridge] logPurchase failed\", { amount, currency, error });\n }\n }\n\n setUserID(userId: string): void {\n if (!NativeBridge) return;\n try {\n NativeBridge.setUserID(userId);\n } catch (error) {\n if (this.debug) console.warn(\"[Paywallo:MetaBridge] setUserID failed\", { error });\n }\n }\n\n flush(): void {\n if (!NativeBridge) return;\n try {\n NativeBridge.flush();\n } catch (error) {\n if (this.debug) console.warn(\"[Paywallo:MetaBridge] flush failed\", { error });\n }\n }\n}\n\nexport const metaBridge = new MetaBridge();\n","import { Dimensions, PixelRatio,Platform } from \"react-native\";\n\nimport type { ApiClient } from \"../../core/ApiClient\";\nimport { SecureStorage } from \"../../core/storage/SecureStorage\";\nimport { nativeDeviceInfo } from \"../../utils/NativeDeviceInfo\";\nimport { DistinctIdProvider, waitForDistinctId } from \"../session/distinctIdGuard\";\nimport { sessionManager } from \"../session/SessionManager\";\n\nimport { AdvertisingIdManager, advertisingIdManager } from \"./AdvertisingIdManager\";\nimport { attributionTracker } from \"./AttributionTracker\";\nimport { identityManager } from \"./IdentityManager\";\nimport { checkAndArmInstallGuard, getOrCreateInstallEventId, INSTALL_KEYS,markInstallTracked } from \"./InstallIdempotency\";\nimport { installReferrerManager } from \"./InstallReferrerManager\";\nimport { metaBridge } from \"./MetaBridge\";\n\nexport type { AttributionCapture } from \"./AttributionTracker\";\nexport { AttributionTracker, attributionTracker } from \"./AttributionTracker\";\n\n// ── Install tracking ──────────────────────────────────────────────────────────\n\nexport interface InstallTrackerOptions {\n readonly advertisingIdManager?: AdvertisingIdManager;\n readonly distinctIdProvider?: DistinctIdProvider;\n}\n\nexport class InstallTracker {\n private readonly debug: boolean;\n private readonly advertisingIdManager: AdvertisingIdManager;\n private readonly distinctIdProvider: DistinctIdProvider;\n private _trackingInProgress = false;\n\n constructor(debug = false, optionsOrManager?: InstallTrackerOptions | AdvertisingIdManager) {\n this.debug = debug;\n // Backward compat: the legacy signature accepted an AdvertisingIdManager\n // as the second positional arg. Detect it by checking `collect` method.\n if (optionsOrManager && \"collect\" in optionsOrManager && typeof optionsOrManager.collect === \"function\") {\n this.advertisingIdManager = optionsOrManager;\n this.distinctIdProvider = () => identityManager.getDistinctId();\n } else {\n const opts = (optionsOrManager as InstallTrackerOptions | undefined) ?? {};\n // Default to the shared singleton so the cache populated here is\n // visible to the V2 envelope context provider (which reads sync).\n this.advertisingIdManager = opts.advertisingIdManager ?? advertisingIdManager;\n this.distinctIdProvider = opts.distinctIdProvider ?? (() => identityManager.getDistinctId());\n }\n }\n\n async trackIfNeeded(apiClient: ApiClient, requestATT = false): Promise<void> {\n if (this._trackingInProgress) return;\n this._trackingInProgress = true;\n try {\n await this._doTrack(apiClient, requestATT);\n } finally {\n this._trackingInProgress = false;\n }\n }\n\n private async _doTrack(apiClient: ApiClient, requestATT: boolean): Promise<void> {\n const storage = new SecureStorage(this.debug);\n\n // Idempotency guard: arms pre-send flag BEFORE dispatching so concurrent\n // cold-starts (Linking race + network) can't both fire $app_installed twice.\n const shouldSkip = await checkAndArmInstallGuard(storage);\n if (shouldSkip) return;\n\n // Race condition guard (F2.18): se identityManager.initialize ainda está\n // in-flight quando trackIfNeeded roda, distinctId vem \"\". Antes o early\n // return deixava `alreadyTracked` nunca ser setada — tudo bem por acaso,\n // mas dependia de o próximo boot retentar. Agora aguardamos o distinctId\n // explicitamente via waitForDistinctId (mesmo helper do SessionManager).\n // Se o timeout estourar, NÃO setamos a flag — próximo boot retenta.\n const distinctIdReady = await waitForDistinctId(this.distinctIdProvider);\n if (!distinctIdReady) {\n if (this.debug) {\n console.log(\"[Paywallo:Install] trackIfNeeded skipped — distinctId unavailable after retry; will retry next boot\");\n }\n return;\n }\n\n const distinctId = this.distinctIdProvider();\n const sessionId = sessionManager.getSessionId();\n const installedAt = Date.now();\n\n // Defensive: waitForDistinctId returned true but provider now empty (e.g.\n // reset() race) — skip without setting flag so next boot retries.\n if (!distinctId) {\n if (this.debug) {\n console.log(\"[Paywallo:Install] trackIfNeeded skipped — distinctId empty post-wait; will retry next boot\");\n }\n return;\n }\n\n let deviceData: Record<string, string | number> = {};\n try {\n const screen = Dimensions.get(\"screen\");\n const screenWidth = Math.round(screen.width ?? 0);\n const screenHeight = Math.round(screen.height ?? 0);\n const screenDensity = PixelRatio.get();\n const locale = Intl.DateTimeFormat().resolvedOptions().locale ?? \"unknown\";\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone ?? \"unknown\";\n\n const info = await nativeDeviceInfo.getDeviceInfo();\n\n const deviceModel = info.modelId || info.model || \"unknown\";\n const osVersion = info.systemVersion || \"unknown\";\n const appVersion = info.appVersion || \"unknown\";\n const buildNumber = info.buildNumber || \"0\";\n\n let carrier = \"unknown\";\n try { carrier = info.carrier ?? \"unknown\"; } catch { /* non-critical */ }\n\n let totalDisk = 0;\n try { totalDisk = Number(info.totalDisk) || 0; } catch { /* non-critical */ }\n\n let freeDisk = 0;\n try { freeDisk = Number(info.freeDisk) || 0; } catch { /* non-critical */ }\n\n let totalRam = 0;\n try { totalRam = Number(info.totalRam) || 0; } catch { /* non-critical */ }\n\n let brand = \"unknown\";\n try { brand = info.brand ?? \"unknown\"; } catch { /* non-critical */ }\n\n let installerPackage: string | null = null;\n try {\n if (Platform.OS === \"android\") {\n installerPackage = info.installerPackage ?? null;\n }\n } catch { /* non-critical */ }\n\n deviceData = {\n deviceModel,\n osVersion,\n appVersion,\n buildNumber,\n ...(screenWidth > 0 && { screenWidth }),\n ...(screenHeight > 0 && { screenHeight }),\n ...(screenDensity > 0 && { screenDensity }),\n timezone,\n locale,\n ...(carrier !== \"unknown\" && { carrier }),\n ...(totalDisk > 0 && { totalDisk }),\n ...(freeDisk > 0 && { freeDisk }),\n ...(totalRam > 0 && { totalRam }),\n ...(brand !== \"unknown\" && { brand }),\n ...(installerPackage && { installerPackage }),\n };\n } catch { /* non-critical */ }\n\n const [fbAnonId, referrer, adIds, installEventId] = await Promise.all([\n metaBridge.getAnonymousID(),\n installReferrerManager.getReferrer(),\n this.advertisingIdManager.collect(requestATT),\n getOrCreateInstallEventId(),\n ]);\n\n // Promove fbclid/utm_* do Play Install Referrer (Android) pro\n // attributionTracker. Sem isso, eventos pós-install não levam\n // `context.attribution.fbclid` no envelope V2 e o servidor não\n // consegue popular `app_users.fbclid` (PurchaseHandler.resolveSource\n // retorna source=null → CAPI Purchase fica sem network attribution).\n // First-write-wins do tracker garante que deep link ainda vence se\n // tiver capturado antes via DeepLinkAttributionCapture.\n if (\n referrer.fbclid || referrer.utmSource || referrer.utmMedium || referrer.utmCampaign ||\n referrer.ttclid || referrer.tiktokCampaignId || referrer.tiktokAdgroupId || referrer.tiktokAdId\n ) {\n attributionTracker.capture({\n ...(referrer.fbclid && { fbclid: referrer.fbclid }),\n ...(referrer.utmSource && { utmSource: referrer.utmSource }),\n ...(referrer.utmMedium && { utmMedium: referrer.utmMedium }),\n ...(referrer.utmCampaign && { utmCampaign: referrer.utmCampaign }),\n ...(referrer.rawReferrer && { referrer: referrer.rawReferrer }),\n ...(referrer.ttclid && { ttclid: referrer.ttclid }),\n ...(referrer.tiktokCampaignId && { tiktokCampaignId: referrer.tiktokCampaignId }),\n ...(referrer.tiktokAdgroupId && { tiktokAdgroupId: referrer.tiktokAdgroupId }),\n ...(referrer.tiktokAdId && { tiktokAdId: referrer.tiktokAdId }),\n ...(referrer.installReferrerRaw && { installReferrerRaw: referrer.installReferrerRaw }),\n ...(referrer.installReferrerSource && { installReferrerSource: referrer.installReferrerSource }),\n }).catch(() => { /* non-critical */ });\n }\n\n let effectiveAnonId = fbAnonId;\n if (!effectiveAnonId) {\n const stored = await storage.get(INSTALL_KEYS.ANON_ID);\n if (stored) {\n effectiveAnonId = stored;\n } else {\n const { generateUUID } = await import(\"../../utils/uuid\");\n effectiveAnonId = `PW_${generateUUID()}`;\n await storage.set(INSTALL_KEYS.ANON_ID, effectiveAnonId).catch(() => {});\n }\n }\n\n // Install is a one-shot, non-recoverable event — flush as critical so it\n // can't get stuck behind 24 other normal events on the 10s window.\n // `installEventId` is stable across retries so the backend can deduplicate\n // duplicate dispatches (e.g. background flush + foreground init race).\n await apiClient.trackEvent(\"$app_installed\", distinctId, {\n installedAt,\n platform: Platform.OS,\n installEventId,\n ...(sessionId && { sessionId }),\n ...deviceData,\n ...(effectiveAnonId && { fbAnonId: effectiveAnonId }),\n ...(referrer.rawReferrer && { installReferrer: referrer.rawReferrer }),\n ...(referrer.trackingId && { referrerTrackingId: referrer.trackingId }),\n ...(referrer.fbclid && { referrerFbclid: referrer.fbclid }),\n ...(referrer.utmSource && { referrerUtmSource: referrer.utmSource }),\n ...(referrer.utmMedium && { referrerUtmMedium: referrer.utmMedium }),\n ...(referrer.utmCampaign && { referrerUtmCampaign: referrer.utmCampaign }),\n ...(referrer.ttclid && { ttclid: referrer.ttclid }),\n ...(referrer.tiktokCampaignId && { tiktok_campaign_id: referrer.tiktokCampaignId }),\n ...(referrer.tiktokAdgroupId && { tiktok_adgroup_id: referrer.tiktokAdgroupId }),\n ...(referrer.tiktokAdId && { tiktok_ad_id: referrer.tiktokAdId }),\n ...(referrer.installReferrerRaw && { install_referrer_raw: referrer.installReferrerRaw }),\n ...(referrer.installReferrerSource && { install_referrer_source: referrer.installReferrerSource }),\n ...(adIds.idfa && { idfa: adIds.idfa }),\n ...(adIds.idfv && { idfv: adIds.idfv }),\n ...(adIds.gaid && { gaid: adIds.gaid }),\n attStatus: adIds.attStatus,\n }, undefined, { priority: \"critical\" });\n\n void this.callDeferredMatch(apiClient, deviceData, adIds, effectiveAnonId, installedAt).catch(() => {});\n\n await markInstallTracked(storage, installedAt);\n }\n\n private async callDeferredMatch(\n apiClient: ApiClient,\n deviceData: Record<string, string | number>,\n adIds: { idfv: string | null; gaid: string | null },\n anonId: string | null,\n installedAt: number,\n ): Promise<void> {\n const storage = new SecureStorage(this.debug);\n const alreadyMatched = await storage.get(INSTALL_KEYS.DEFERRED_MATCH_DONE);\n if (alreadyMatched) return;\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 5000);\n\n try {\n const baseUrl = apiClient.getBaseUrl();\n const appKey = apiClient.getAppKey();\n\n const referrer = await installReferrerManager.getReferrer();\n\n await fetch(`${baseUrl}/sdk/attribution/deferred-match/${appKey}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-App-Key\": appKey },\n body: JSON.stringify({\n platform: Platform.OS,\n ...(adIds.idfv && { idfv: adIds.idfv }),\n ...(adIds.gaid && { gaid: adIds.gaid }),\n ...(referrer.rawReferrer && { installReferrer: referrer.rawReferrer }),\n deviceModel: deviceData.deviceModel,\n osVersion: deviceData.osVersion,\n screenWidth: deviceData.screenWidth,\n screenHeight: deviceData.screenHeight,\n timezone: deviceData.timezone,\n locale: deviceData.locale,\n fbAnonId: anonId,\n installTimestamp: new Date(installedAt).toISOString(),\n }),\n signal: controller.signal,\n });\n\n await storage.set(INSTALL_KEYS.DEFERRED_MATCH_DONE, \"1\").catch(() => {});\n } catch {\n // Non-critical — deferred match is best-effort\n } finally {\n clearTimeout(timer);\n }\n }\n}\n","import { Linking } from \"react-native\";\n\nimport type { AttributionCapture } from \"./InstallTracker\";\nimport { attributionTracker } from \"./InstallTracker\";\n\ntype AttributionInput = Omit<AttributionCapture, \"capturedAt\">;\n\ninterface LinkingEventSubscription {\n remove: () => void;\n}\n\ntype UrlListener = (event: { url: string }) => void;\n\n/**\n * Parses a deep link URL into attribution input (utm/click IDs).\n * Returns an empty object if the URL has no query params or is malformed.\n *\n * Exported for testing — callers should use `capture`/`startListening`.\n */\nexport function parseAttributionFromUrl(url: string | null): AttributionInput {\n if (!url) return {};\n try {\n const queryIdx = url.indexOf(\"?\");\n if (queryIdx === -1) return {};\n const query = url.slice(queryIdx + 1).split(\"#\")[0] ?? \"\";\n if (!query) return {};\n\n const params: Record<string, string> = {};\n for (const pair of query.split(\"&\")) {\n const eqIdx = pair.indexOf(\"=\");\n if (eqIdx === -1) continue;\n try {\n const rawKey = pair.slice(0, eqIdx).replace(/\\+/g, \" \");\n const rawVal = pair.slice(eqIdx + 1).replace(/\\+/g, \" \");\n const key = decodeURIComponent(rawKey);\n const value = decodeURIComponent(rawVal);\n if (key) params[key] = value;\n } catch { /* malformed pair — skip */ }\n }\n\n const result: AttributionInput = {};\n if (params[\"fbclid\"]) (result as { fbclid?: string }).fbclid = params[\"fbclid\"];\n if (params[\"gclid\"]) (result as { gclid?: string }).gclid = params[\"gclid\"];\n if (params[\"ttclid\"]) (result as { ttclid?: string }).ttclid = params[\"ttclid\"];\n if (params[\"campaign_id\"]) (result as { tiktokCampaignId?: string }).tiktokCampaignId = params[\"campaign_id\"];\n if (params[\"adgroup_id\"]) (result as { tiktokAdgroupId?: string }).tiktokAdgroupId = params[\"adgroup_id\"];\n if (params[\"ad_id\"]) (result as { tiktokAdId?: string }).tiktokAdId = params[\"ad_id\"];\n if (params[\"utm_source\"]) (result as { utmSource?: string }).utmSource = params[\"utm_source\"];\n if (params[\"utm_medium\"]) (result as { utmMedium?: string }).utmMedium = params[\"utm_medium\"];\n if (params[\"utm_campaign\"]) (result as { utmCampaign?: string }).utmCampaign = params[\"utm_campaign\"];\n if (params[\"utm_content\"]) (result as { utmContent?: string }).utmContent = params[\"utm_content\"];\n if (params[\"utm_term\"]) (result as { utmTerm?: string }).utmTerm = params[\"utm_term\"];\n return result;\n } catch {\n return {};\n }\n}\n\n/**\n * Captures attribution from cold-start deep link + subsequent `url` events.\n *\n * Behaviour:\n * - On init: reads `Linking.getInitialURL()` and forwards parsed attribution\n * to `attributionTracker.capture()` (first-write-wins — ignored if already set).\n * - Registers `Linking.addEventListener('url', handler)` to catch warm-start\n * deep links while the app is running.\n * - Returns a cleanup function to unsubscribe (used by `reset`).\n *\n * All failures are swallowed — attribution is best-effort and must never\n * break SDK init.\n */\nexport class DeepLinkAttributionCapture {\n private subscription: LinkingEventSubscription | null = null;\n private readonly debug: boolean;\n\n constructor(debug = false) {\n this.debug = debug;\n }\n\n async start(): Promise<void> {\n try {\n const initialUrl = await Linking.getInitialURL();\n const parsed = parseAttributionFromUrl(initialUrl);\n await attributionTracker.capture(parsed).catch(() => {});\n } catch (err) {\n if (this.debug) console.log(\"[Paywallo ATTR] getInitialURL error\", err);\n }\n\n try {\n const handler: UrlListener = (event) => {\n const parsed = parseAttributionFromUrl(event.url);\n void attributionTracker.capture(parsed).catch(() => {});\n };\n // `addEventListener` returns `EmitterSubscription` in modern RN; older\n // versions returned void. We defensively normalise both shapes.\n const maybeSub = (Linking as unknown as {\n addEventListener: (\n event: \"url\",\n listener: UrlListener,\n ) => LinkingEventSubscription | undefined;\n }).addEventListener(\"url\", handler);\n if (maybeSub && typeof maybeSub.remove === \"function\") {\n this.subscription = maybeSub;\n } else {\n this.subscription = {\n remove: () => {\n const legacy = Linking as unknown as {\n removeEventListener?: (event: \"url\", listener: UrlListener) => void;\n };\n legacy.removeEventListener?.(\"url\", handler);\n },\n };\n }\n } catch (err) {\n if (this.debug) console.log(\"[Paywallo ATTR] addEventListener error\", err);\n }\n }\n\n stop(): void {\n try {\n this.subscription?.remove();\n } catch (err) {\n if (this.debug) console.log(\"[Paywallo ATTR] listener remove error\", err);\n }\n this.subscription = null;\n }\n}\n\nexport const deepLinkAttributionCapture = new DeepLinkAttributionCapture();\n","export type { AdvertisingIdResult, AttStatus } from \"./AdvertisingIdManager\";\nexport { AdvertisingIdManager, advertisingIdManager } from \"./AdvertisingIdManager\";\nexport {\n DeepLinkAttributionCapture,\n deepLinkAttributionCapture,\n parseAttributionFromUrl,\n} from \"./DeepLinkAttributionCapture\";\nexport { IDENTITY_ERROR_CODES,IdentityError } from \"./IdentityError\";\nexport type { IdentityState } from \"./IdentityManager\";\nexport { IdentityManager, identityManager } from \"./IdentityManager\";\nexport { InstallReferrerManager, installReferrerManager } from \"./InstallReferrerManager\";\nexport type { AttributionCapture } from \"./InstallTracker\";\nexport { AttributionTracker, attributionTracker,InstallTracker } from \"./InstallTracker\";\nexport { MetaBridge, metaBridge } from \"./MetaBridge\";\nexport type { IdentifyOptions,UserProperties } from \"./types\";\n","import { NativeEventEmitter, NativeModules, Platform } from \"react-native\";\n\nimport type { FcmRemoteMessage, IPushBridge } from \"./types\";\n\nexport type { FcmRemoteMessage };\n\ninterface PaywalloNotificationsModule {\n getToken(): Promise<string | null>;\n requestPermission(options: { provisional?: boolean }): Promise<string | null>;\n registerForPush(): Promise<void>;\n hasPermission(): Promise<string | null>;\n getInitialNotification(): Promise<unknown>;\n}\n\nfunction getPaywalloNotifications(): PaywalloNotificationsModule | null {\n \n return (NativeModules.PaywalloNotifications as PaywalloNotificationsModule) ?? null;\n}\n\nexport function isNativePushAvailable(): boolean {\n return !!NativeModules.PaywalloNotifications;\n}\n\nfunction mapStatusToNumber(status: string | null): number {\n switch (status) {\n case \"granted\": return 1; // AUTHORIZED\n case \"denied\": return 0; // DENIED\n case \"provisional\": return 2; // PROVISIONAL\n case \"ephemeral\": return 1; // treat as authorized\n default: return -1; // NOT_DETERMINED\n }\n}\n\nlet _emitter: NativeEventEmitter | null = null;\nfunction getEmitter(): NativeEventEmitter | null {\n if (_emitter) return _emitter;\n // NativeModules entries are typed as `any` by react-native; cast via unknown\n const nativeMod = NativeModules.PaywalloNotifications as ConstructorParameters<typeof NativeEventEmitter>[0] | undefined;\n if (!nativeMod) return null;\n _emitter = new NativeEventEmitter(nativeMod);\n return _emitter;\n}\n\nexport class NativePushBridge implements IPushBridge {\n async getToken(): Promise<string | null> {\n try {\n const mod = getPaywalloNotifications();\n if (!mod) return null;\n return await mod.getToken();\n } catch {\n return null;\n }\n }\n\n async getAPNSToken(): Promise<string | null> {\n if (Platform.OS !== \"ios\") return null;\n return this.getToken();\n }\n\n async requestPermission(options?: { provisional?: boolean }): Promise<number> {\n try {\n const mod = getPaywalloNotifications();\n if (!mod) return -1;\n const status: string | null = await mod.requestPermission(options ?? {});\n // After permission granted, register for remote notifications to get APNS token\n if (status === \"granted\" || status === \"provisional\") {\n try { await mod.registerForPush(); } catch { /* best effort */ }\n }\n return mapStatusToNumber(status);\n } catch {\n return -1;\n }\n }\n\n async hasPermission(): Promise<number> {\n try {\n const mod = getPaywalloNotifications();\n if (!mod) return -1;\n const status: string | null = await mod.hasPermission();\n return mapStatusToNumber(status);\n } catch {\n return -1;\n }\n }\n\n onTokenRefresh(cb: (token: string) => void): () => void {\n const emitter = getEmitter();\n if (!emitter) return () => undefined;\n const sub = emitter.addListener(\"PaywalloTokenRefresh\", (event: { token: string }) => {\n if (typeof event?.token === \"string\") cb(event.token);\n });\n return () => sub.remove();\n }\n\n onMessage(cb: (message: FcmRemoteMessage) => Promise<void>): () => void {\n const emitter = getEmitter();\n if (!emitter) return () => undefined;\n const sub = emitter.addListener(\"PaywalloMessageReceived\", (event: FcmRemoteMessage) => {\n cb(event).catch(() => undefined);\n });\n return () => sub.remove();\n }\n\n // No-op: native module handles background delivery via service/extension.\n setBackgroundMessageHandler(_cb: (message: FcmRemoteMessage) => Promise<void>): void {\n return;\n }\n\n async getInitialNotification(): Promise<FcmRemoteMessage | null> {\n try {\n const mod = getPaywalloNotifications();\n if (!mod) return null;\n const raw: unknown = await mod.getInitialNotification();\n if (!raw || typeof raw !== \"object\") return null;\n const r = raw as Record<string, unknown>;\n const notification = r[\"notification\"];\n return {\n messageId: typeof r[\"messageId\"] === \"string\" ? r[\"messageId\"] : undefined,\n data: typeof r[\"data\"] === \"object\" && r[\"data\"] !== null\n ? (r[\"data\"] as Record<string, string>)\n : undefined,\n notification: notification && typeof notification === \"object\"\n ? {\n title: typeof (notification as Record<string, unknown>)[\"title\"] === \"string\"\n ? (notification as Record<string, string>)[\"title\"]\n : undefined,\n body: typeof (notification as Record<string, unknown>)[\"body\"] === \"string\"\n ? (notification as Record<string, string>)[\"body\"]\n : undefined,\n }\n : undefined,\n sentTime: typeof r[\"sentTime\"] === \"number\" ? r[\"sentTime\"] : undefined,\n };\n } catch {\n return null;\n }\n }\n}\n","export const DEFAULT_API_URL = \"https://panel.lucasqueiroga.shop\";\nexport const DEFAULT_WEB_URL = \"https://paywallo.com.br\";\n","export type NotificationsEnvironment = \"sandbox\" | \"production\";\n\nexport interface NotificationsConfig {\n debug?: boolean;\n environment?: NotificationsEnvironment;\n apiBaseUrl?: string;\n}\n\nimport { DEFAULT_API_URL } from \"../../core/constants\";\n\nexport const DEFAULT_API_BASE_URL = DEFAULT_API_URL;\nexport const SANDBOX_API_BASE_URL = DEFAULT_API_URL;\n\nexport function resolveApiBaseUrl(config: NotificationsConfig): string {\n if (config.apiBaseUrl) return config.apiBaseUrl;\n if (config.environment === \"sandbox\") return SANDBOX_API_BASE_URL;\n return DEFAULT_API_BASE_URL;\n}\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nconst DOMAIN = \"notifications\";\n\nexport const NOTIFICATIONS_ERROR_CODES = {\n TOKEN_UNAVAILABLE: \"TOKEN_UNAVAILABLE\",\n PERMISSION_DENIED: \"PERMISSION_DENIED\",\n REGISTRATION_FAILED: \"REGISTRATION_FAILED\",\n NOT_INITIALIZED: \"NOT_INITIALIZED\",\n ABORTED: \"ABORTED\",\n} as const;\n\nexport type NotificationsErrorCode =\n (typeof NOTIFICATIONS_ERROR_CODES)[keyof typeof NOTIFICATIONS_ERROR_CODES];\n\nexport class NotificationsError extends PaywalloError {\n readonly details?: unknown;\n\n constructor(code: NotificationsErrorCode, message: string, details?: unknown) {\n super(DOMAIN, code, message);\n this.name = \"NotificationsError\";\n this.details = details;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class TokenUnavailableError extends NotificationsError {\n constructor(message = \"FCM token not available\") {\n super(NOTIFICATIONS_ERROR_CODES.TOKEN_UNAVAILABLE, message);\n this.name = \"TokenUnavailableError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class PermissionDeniedError extends NotificationsError {\n constructor(message = \"Push notification permission denied\") {\n super(NOTIFICATIONS_ERROR_CODES.PERMISSION_DENIED, message);\n this.name = \"PermissionDeniedError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class RegistrationFailedError extends NotificationsError {\n constructor(message = \"Token registration failed\", details?: unknown) {\n super(NOTIFICATIONS_ERROR_CODES.REGISTRATION_FAILED, message, details);\n this.name = \"RegistrationFailedError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import type { FcmRemoteMessage } from \"../bridges/types\";\n\nexport type { FcmRemoteMessage };\n\n/**\n * Registers a background message handler.\n *\n * IMPORTANT: Call in the client's `index.js` BEFORE `AppRegistry.registerComponent()`.\n * Background handlers run in a headless JS environment and must be registered at module\n * level, not inside a React component or hook.\n *\n * Note: With NativePushBridge, background delivery is handled by the native\n * service/extension. This function is kept for API compatibility.\n *\n * @example\n * // index.js\n * import { registerBackgroundMessageHandler } from '@paywallo/sdk';\n * registerBackgroundMessageHandler(async (message) => {\n * // handle background message\n * });\n * AppRegistry.registerComponent(appName, () => App);\n */\nexport function registerBackgroundMessageHandler(\n _cb: (message: FcmRemoteMessage) => Promise<void>\n): void {\n // No-op: native module handles background delivery via service/extension.\n}\n","/**\n * DeepLinkResolver — extracts and sanitizes deep links from push payloads.\n *\n * Security: blocks javascript:, file:, data:, vbscript:, and protocol-relative\n * URLs (case-insensitive, whitespace-tolerant). Returns null for anything\n * suspicious — never throws.\n */\n\nconst BLOCKED_SCHEME_PREFIXES = [\n \"javascript:\",\n \"file:\",\n \"data:\",\n \"vbscript:\",\n];\n\nconst SCHEME_REGEX = /^[a-zA-Z][a-zA-Z0-9+\\-.]*:\\/\\//;\n\nfunction extractRaw(data: unknown): string | null {\n if (!data || typeof data !== \"object\") return null;\n const record = data as Record<string, unknown>;\n const candidates = [record[\"deeplink\"], record[\"deepLink\"], record[\"deep_link\"]];\n for (const candidate of candidates) {\n if (typeof candidate === \"string\" && candidate.length > 0) return candidate;\n }\n return null;\n}\n\nfunction isBlockedScheme(lower: string): boolean {\n return BLOCKED_SCHEME_PREFIXES.some((scheme) => lower.startsWith(scheme));\n}\n\n/**\n * Resolves and sanitizes a deep link from a notification data payload.\n * Returns the URL string if safe, or null otherwise.\n */\nexport function resolveDeepLink(data: unknown): string | null {\n const raw = extractRaw(data);\n if (!raw) return null;\n\n const trimmed = raw.trim();\n if (trimmed.length === 0) return null;\n\n const lower = trimmed.toLowerCase();\n if (isBlockedScheme(lower)) return null;\n if (!SCHEME_REGEX.test(trimmed)) return null;\n\n try {\n \n new URL(trimmed);\n } catch {\n return null;\n }\n\n return trimmed;\n}\n","import type { IPushBridge } from \"../bridges/types\";\nimport { resolveDeepLink } from \"../DeepLinkResolver\";\nimport type { NotificationEventTracker } from \"../NotificationEventTracker\";\nimport type { NotificationPayload } from \"../types\";\n\nfunction extractPayload(data: Record<string, unknown>): NotificationPayload {\n return {\n notificationId: String(data[\"notificationId\"] ?? data[\"notification_id\"] ?? \"\"),\n campaignId: String(data[\"campaignId\"] ?? data[\"campaign_id\"] ?? \"\"),\n variantKey: data[\"variantKey\"] != null ? String(data[\"variantKey\"]) : undefined,\n title: String(data[\"title\"] ?? \"\"),\n body: String(data[\"body\"] ?? \"\"),\n imageUrl: data[\"imageUrl\"] != null ? String(data[\"imageUrl\"]) : undefined,\n deepLink: resolveDeepLink(data) ?? undefined,\n data,\n };\n}\n\ninterface FcmMessage {\n messageId?: string;\n data?: Record<string, string>;\n notification?: { title?: string; body?: string };\n}\n\ninterface ForegroundHandlerDeps {\n bridge: IPushBridge;\n tracker: NotificationEventTracker;\n debug?: boolean;\n}\n\nexport function setupForegroundHandler(\n deps: ForegroundHandlerDeps,\n onReceive: (payload: NotificationPayload) => void\n): () => void {\n const { bridge, tracker, debug } = deps;\n\n const unsubscribe = bridge.onMessage(async (message: FcmMessage) => {\n const data = (message.data ?? {}) as Record<string, unknown>;\n const payload = extractPayload({\n ...data,\n title: data[\"title\"] ?? message.notification?.title ?? \"\",\n body: data[\"body\"] ?? message.notification?.body ?? \"\",\n });\n\n if (debug) console.warn(\"[Paywallo PUSH] foreground message received:\", payload.notificationId);\n\n onReceive(payload);\n\n const messageId = message.messageId ?? payload.notificationId;\n await tracker.track(\"notification_delivered\", {\n notificationId: payload.notificationId,\n campaignId: payload.campaignId,\n variantKey: payload.variantKey,\n messageId,\n });\n });\n\n return unsubscribe;\n}\n","import { Platform } from \"react-native\";\n\nimport type { NotificationEventType } from \"./types\";\n\n/**\n * Thin facade over the unified EventBatcher pipeline.\n *\n * Tracks notification lifecycle events (`delivered`, `opened`, `dismissed`,\n * `failed`) by routing through `ApiClient.trackEvent` → `EventBatcher`\n * (family `notification`) → `/api/v1/events/batch`.\n *\n * Deduplication by `messageId` + `eventType` (1 hour TTL, LRU 1000 entries)\n * prevents duplicate analytics rows caused by FCM/APNs re-delivery.\n *\n * @example\n * ```ts\n * await notificationEventTracker.track(\"opened\", {\n * notificationId: \"notif_123\",\n * campaignId: \"camp_abc\",\n * messageId: \"fcm_xyz\",\n * });\n * ```\n */\n\nconst SEEN_MESSAGES_KEY = \"seen_messages\";\nconst SEEN_TTL_MS = 60 * 60 * 1000; // 1 hour\nconst MAX_SEEN_SIZE = 1000;\n\ninterface SeenEntry {\n ts: number;\n}\n\ninterface TrackPayload {\n notificationId: string;\n campaignId: string;\n variantKey?: string;\n messageId: string;\n appUserId?: string;\n failureReason?: string;\n properties?: Record<string, unknown>;\n}\n\n/**\n * Minimal surface the facade needs from the SDK's unified event pipeline.\n * `PaywalloClient` implements it (forwarding to `ApiClient.trackEvent`\n * which ends up in the `EventBatcher`).\n */\nexport interface EventBatcherLike {\n trackEvent(\n eventName: string,\n distinctId: string,\n properties?: Record<string, unknown>,\n timestamp?: number\n ): Promise<void>;\n getDistinctId(): string;\n}\n\ninterface SecureStorageLike {\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<boolean>;\n}\n\ninterface TrackerConfig {\n getDeviceId?: () => string | null;\n getAppUserId?: () => string | null;\n debug?: boolean;\n}\n\nfunction getTimezone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone ?? \"UTC\";\n } catch {\n return \"UTC\";\n }\n}\n\nfunction detectPlatform(): \"ios\" | \"android\" {\n return Platform.OS === \"ios\" ? \"ios\" : \"android\";\n}\n\nexport class NotificationEventTracker {\n private seenMessages: Map<string, SeenEntry> = new Map();\n private seenLoaded = false;\n\n constructor(\n private readonly batcher: EventBatcherLike,\n private readonly config: TrackerConfig,\n private readonly secureStorage?: SecureStorageLike\n ) {}\n\n async track(eventType: NotificationEventType, payload: TrackPayload): Promise<void> {\n const { notificationId, campaignId, variantKey, messageId } = payload;\n\n if (await this.isDuplicate(messageId, eventType)) {\n if (this.config.debug) console.log(\"[Paywallo PUSH] duplicate event skipped:\", messageId, eventType);\n return;\n }\n\n await this.markSeen(messageId, eventType);\n\n const distinctId = this.batcher.getDistinctId();\n if (!distinctId) {\n if (this.config.debug) console.log(\"[Paywallo PUSH] skipped (no distinctId):\", eventType);\n return;\n }\n\n const properties: Record<string, unknown> = {\n family: \"notification\",\n type: eventType,\n notification_id: notificationId,\n campaign_id: campaignId,\n variant_key: variantKey ?? null,\n message_id: messageId,\n device_id: this.config.getDeviceId?.() ?? \"\",\n push_platform: detectPlatform(),\n timezone: getTimezone(),\n };\n\n if (payload.failureReason) properties.failure_reason = payload.failureReason;\n if (payload.appUserId) properties.app_user_id = payload.appUserId;\n if (payload.properties) Object.assign(properties, payload.properties);\n\n if (this.config.debug) console.log(\"[Paywallo PUSH] tracking event:\", eventType, notificationId);\n\n await this.batcher.trackEvent(\"notification\", distinctId, properties);\n }\n\n async isDuplicate(messageId: string, eventType: NotificationEventType): Promise<boolean> {\n await this.ensureSeenLoaded();\n const key = `${messageId}:${eventType}`;\n const entry = this.seenMessages.get(key);\n if (!entry) return false;\n if (Date.now() - entry.ts > SEEN_TTL_MS) {\n this.seenMessages.delete(key);\n return false;\n }\n return true;\n }\n\n async flush(): Promise<void> {\n // Flush is a no-op here — the underlying EventBatcher handles buffering.\n // Callers can still invoke `ApiClient.flushEventBatch()` directly if they need\n // to force a flush (e.g. before app termination).\n if (this.config.debug) console.log(\"[Paywallo PUSH] flush requested (delegated to EventBatcher)\");\n }\n\n private async markSeen(messageId: string, eventType: NotificationEventType): Promise<void> {\n await this.ensureSeenLoaded();\n const key = `${messageId}:${eventType}`;\n this.seenMessages.set(key, { ts: Date.now() });\n this.evictExpired();\n await this.persistSeen();\n }\n\n private evictExpired(): void {\n const now = Date.now();\n // Remove expired entries first\n for (const [k, v] of this.seenMessages) {\n if (now - v.ts > SEEN_TTL_MS) {\n this.seenMessages.delete(k);\n }\n }\n // LRU eviction if still over limit\n if (this.seenMessages.size > MAX_SEEN_SIZE) {\n const sorted = [...this.seenMessages.entries()].sort((a, b) => a[1].ts - b[1].ts);\n const toRemove = sorted.slice(0, this.seenMessages.size - MAX_SEEN_SIZE);\n for (const [k] of toRemove) {\n this.seenMessages.delete(k);\n }\n }\n }\n\n private async ensureSeenLoaded(): Promise<void> {\n if (this.seenLoaded || !this.secureStorage) {\n this.seenLoaded = true;\n return;\n }\n try {\n const raw = await this.secureStorage.get(SEEN_MESSAGES_KEY);\n if (raw) {\n const parsed = JSON.parse(raw) as Record<string, SeenEntry>;\n const now = Date.now();\n for (const [k, v] of Object.entries(parsed)) {\n if (now - v.ts <= SEEN_TTL_MS) {\n this.seenMessages.set(k, v);\n }\n }\n }\n } catch {\n // non-fatal — start fresh\n }\n this.seenLoaded = true;\n }\n\n private async persistSeen(): Promise<void> {\n if (!this.secureStorage) return;\n try {\n const obj: Record<string, SeenEntry> = {};\n for (const [k, v] of this.seenMessages) {\n obj[k] = v;\n }\n await this.secureStorage.set(SEEN_MESSAGES_KEY, JSON.stringify(obj));\n } catch {\n // non-fatal\n }\n }\n}\n","/**\n * Handler wiring and initial-notification utilities extracted from\n * NotificationsManager to keep that class within the 300-line limit.\n */\nimport type { SecureStorage } from \"../../core/storage/SecureStorage\";\n\nimport type { IPushBridge } from \"./bridges/types\";\nimport { setupForegroundHandler } from \"./handlers/ForegroundHandler\";\nimport type { NotificationEventTracker } from \"./NotificationEventTracker\";\nimport type { EventBatcherLike } from \"./NotificationEventTracker\";\nimport { NotificationEventTracker as Tracker } from \"./NotificationEventTracker\";\nimport type { PermissionManager } from \"./PermissionManager\";\nimport type { NotificationPayload } from \"./types\";\n\nexport interface HandlersSetupConfig {\n appKey: string | null;\n apiBaseUrl: string | null;\n debug: boolean;\n bridge: IPushBridge;\n secureStorage: SecureStorage | null;\n getDeviceId: (() => string | null) | null;\n permissionManager: PermissionManager;\n receivedCallbacks: Array<(payload: NotificationPayload) => void>;\n openedCallbacks: Array<(payload: NotificationPayload) => void>;\n dismissedCallbacks: Array<(payload: NotificationPayload) => void>;\n eventBatcher: EventBatcherLike;\n}\n\nexport interface HandlersSetupResult {\n tracker: NotificationEventTracker;\n foregroundCleanup: () => void;\n}\n\nexport function buildHandlers(config: HandlersSetupConfig): HandlersSetupResult | null {\n if (!config.appKey || !config.apiBaseUrl) {\n if (config.debug) console.log(\"[Paywallo PUSH] setupHandlers called before initialize()\");\n return null;\n }\n\n const tracker = new Tracker(\n config.eventBatcher,\n { getDeviceId: config.getDeviceId ?? undefined, debug: config.debug },\n config.secureStorage ?? undefined,\n );\n config.permissionManager.setTracker(tracker);\n\n const foregroundCleanup = setupForegroundHandler(\n { bridge: config.bridge, tracker, debug: config.debug },\n (payload) => { config.receivedCallbacks.forEach((cb) => cb(payload)); },\n );\n\n if (config.debug) console.log(\"[Paywallo PUSH] handlers registered\");\n return { tracker, foregroundCleanup };\n}\n\nexport async function getInitialNotificationPayload(\n bridge: IPushBridge,\n): Promise<NotificationPayload | null> {\n const message = await bridge.getInitialNotification();\n if (!message) return null;\n const data = (message.data ?? {}) as Record<string, unknown>;\n return {\n notificationId: String(data[\"notificationId\"] ?? data[\"notification_id\"] ?? \"\"),\n campaignId: String(data[\"campaignId\"] ?? data[\"campaign_id\"] ?? \"\"),\n variantKey: data[\"variantKey\"] != null ? String(data[\"variantKey\"]) : undefined,\n title: String(data[\"title\"] ?? message.notification?.title ?? \"\"),\n body: String(data[\"body\"] ?? message.notification?.body ?? \"\"),\n data,\n };\n}\n","/**\n * Build-time constant injected by tsup (and vitest for tests) from\n * `package.json.version`. Keeps the SDK version in a single source of truth —\n * bumping `package.json` automatically updates every `x-sdk-version` header\n * without code changes.\n *\n * Declared as a global so bundlers can replace it textually at build time.\n * Fallback to \"0.0.0-dev\" if the bundler did not perform the replacement\n * (e.g. running directly via ts-node without the define step).\n */\ndeclare const __PAYWALLO_SDK_VERSION__: string | undefined;\n\nfunction resolveVersion(): string {\n try {\n \n if (typeof __PAYWALLO_SDK_VERSION__ !== \"undefined\" && __PAYWALLO_SDK_VERSION__) {\n return __PAYWALLO_SDK_VERSION__;\n }\n } catch {\n // ReferenceError: identifier not defined — fall through\n }\n return \"0.0.0-dev\";\n}\n\nexport const SDK_VERSION: string = resolveVersion();\n","import { Platform } from \"react-native\";\n\nimport { NOTIFICATIONS_ERROR_CODES,NotificationsError } from \"./NotificationsError\";\nimport type { PushPermissionStatus } from \"./types\";\n\n// AuthorizationStatus from Firebase Messaging\nexport const AUTH_STATUS = {\n NOT_DETERMINED: -1,\n DENIED: 0,\n AUTHORIZED: 1,\n PROVISIONAL: 2,\n} as const;\n\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new NotificationsError(NOTIFICATIONS_ERROR_CODES.ABORTED, \"aborted\"));\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = (): void => {\n clearTimeout(timer);\n reject(new NotificationsError(NOTIFICATIONS_ERROR_CODES.ABORTED, \"aborted\"));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nconst LOCALE_WHITELIST = [\"pt\", \"en\", \"es\"] as const;\ntype SupportedLocale = (typeof LOCALE_WHITELIST)[number];\n\nfunction clampLocale(raw: string): SupportedLocale {\n const code = raw.slice(0, 2).toLowerCase();\n return (LOCALE_WHITELIST as readonly string[]).includes(code) ? (code as SupportedLocale) : \"en\";\n}\n\nexport async function getLocale(): Promise<SupportedLocale> {\n try {\n const raw = Intl.DateTimeFormat().resolvedOptions().locale ?? \"en\";\n return clampLocale(raw);\n } catch {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { getLocales } = require(\"expo-localization\") as { getLocales: () => Array<{ languageCode: string | null }> };\n const code = getLocales()[0]?.languageCode ?? \"en\";\n return clampLocale(code);\n } catch {\n return \"en\";\n }\n }\n}\n\nexport function getTimezone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone ?? \"UTC\";\n } catch {\n return \"UTC\";\n }\n}\n\nexport function mapPermissionStatus(status: number): PushPermissionStatus {\n switch (status) {\n case AUTH_STATUS.AUTHORIZED:\n return \"granted\";\n case AUTH_STATUS.DENIED:\n return \"denied\";\n case AUTH_STATUS.PROVISIONAL:\n return \"provisional\";\n default:\n return \"notDetermined\";\n }\n}\n\nexport function detectPlatform(): \"ios\" | \"android\" {\n return Platform.OS === \"ios\" ? \"ios\" : \"android\";\n}\n\nexport function detectEnvironment(): \"sandbox\" | \"production\" {\n return typeof __DEV__ !== \"undefined\" && __DEV__ ? \"sandbox\" : \"production\";\n}\n\n/**\n * Returns the host app's version string (\"1.2.3\") via the native device-info\n * bridge, best-effort. Returns \"unknown\" if the bridge or module is\n * unavailable — never throws.\n */\nexport async function getAppVersion(): Promise<string> {\n try {\n const { collectDeviceInfo } = await import(\"../../utils/deviceInfo\");\n const info = await collectDeviceInfo();\n return info.appVersion && info.appVersion !== \"0.0.0\" ? info.appVersion : \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n","import type { HttpClient } from \"../../core/http/HttpClient\";\nimport type { SecureStorage } from \"../../core/storage/SecureStorage\";\nimport { SDK_VERSION } from \"../../core/version\";\n\nimport { RegistrationFailedError } from \"./NotificationsError\";\nimport type { DeviceTokenRegistration } from \"./types\";\nimport { detectEnvironment,detectPlatform, getAppVersion, getLocale, getTimezone } from \"./utils\";\n\nexport const FCM_TOKEN_KEY = \"@paywallo:push_token\";\nexport const LEGACY_FCM_TOKEN_KEY = \"@panel:push_token\";\nexport const TOKEN_ENDPOINT = \"/sdk/push-tokens\";\n\ninterface TokenRegistrationDeps {\n httpClient: HttpClient | null;\n secureStorage: SecureStorage | null;\n appKey: string | null;\n getDeviceId: (() => string | null) | null;\n getDistinctId: (() => string) | null;\n debug: boolean;\n}\n\nexport async function persistToken(\n secureStorage: SecureStorage | null,\n token: string\n): Promise<void> {\n try {\n if (secureStorage) {\n await secureStorage.set(FCM_TOKEN_KEY, token);\n }\n } catch {\n // non-fatal\n }\n}\n\nexport async function clearPersistedToken(\n secureStorage: SecureStorage | null\n): Promise<void> {\n try {\n await secureStorage?.remove(FCM_TOKEN_KEY);\n } catch {\n // non-fatal\n }\n}\n\nasync function buildRegistration(\n token: string,\n getDeviceId: (() => string | null) | null,\n getDistinctId: (() => string) | null\n): Promise<DeviceTokenRegistration> {\n const appVersion = await getAppVersion();\n return {\n token,\n platform: detectPlatform(),\n distinct_id: getDistinctId?.() ?? \"\",\n app_version: appVersion,\n sdk_version: SDK_VERSION,\n deviceId: getDeviceId?.() ?? undefined,\n locale: await getLocale(),\n timezone: getTimezone(),\n environment: detectEnvironment(),\n };\n}\n\nexport async function registerToken(\n deps: TokenRegistrationDeps,\n token: string\n): Promise<void> {\n const { httpClient, appKey, getDeviceId, getDistinctId, debug } = deps;\n if (!httpClient || !appKey) {\n if (debug) console.warn(\"[Paywallo PUSH] httpClient not ready, skipping token registration\");\n return;\n }\n\n const registration = await buildRegistration(token, getDeviceId, getDistinctId);\n\n try {\n // Sent direct via HTTP (not through EventBatcher) — token registration is\n // critical and must not wait in a batch window. HttpClient already has\n // its own retry/backoff for network errors.\n await httpClient.post(\n TOKEN_ENDPOINT,\n registration,\n { headers: { \"X-App-Key\": appKey } }\n );\n if (debug) console.warn(\"[Paywallo PUSH] token registered successfully\");\n } catch (err) {\n if (debug) console.warn(\"[Paywallo PUSH] token registration failed:\", err);\n throw new RegistrationFailedError(\"Token registration failed\", err);\n }\n}\n\nexport async function unregisterToken(\n httpClient: HttpClient | null,\n appKey: string | null,\n debug: boolean\n): Promise<void> {\n if (!httpClient || !appKey) return;\n try {\n await httpClient.request(TOKEN_ENDPOINT, {\n method: \"DELETE\",\n headers: { \"X-App-Key\": appKey },\n timeout: 10000,\n });\n } catch (err) {\n if (debug) console.warn(\"[Paywallo PUSH] optOut error:\", err);\n }\n}\n","/**\n * Token capture/register/unregister helpers extracted from NotificationsManager\n * to keep that class within the 300-line limit.\n */\nimport type { HttpClient } from \"../../core/http/HttpClient\";\nimport type { SecureStorage } from \"../../core/storage/SecureStorage\";\n\nimport type { IPushBridge } from \"./bridges/types\";\nimport {\n clearPersistedToken,\n persistToken,\n registerToken,\n unregisterToken,\n} from \"./TokenRegistration\";\nimport { sleep } from \"./utils\";\n\nconst APNS_RETRY_COUNT = 3;\nconst APNS_RETRY_DELAY_MS = 500;\n\nexport interface TokenOpsDeps {\n httpClient: HttpClient | null;\n secureStorage: SecureStorage | null;\n appKey: string | null;\n getDeviceId: (() => string | null) | null;\n getDistinctId: (() => string) | null;\n debug: boolean;\n}\n\nexport async function registerAndPersistToken(\n deps: TokenOpsDeps,\n token: string,\n): Promise<void> {\n await persistToken(deps.secureStorage, token);\n await registerToken(\n {\n httpClient: deps.httpClient,\n secureStorage: deps.secureStorage,\n appKey: deps.appKey,\n getDeviceId: deps.getDeviceId,\n getDistinctId: deps.getDistinctId,\n debug: deps.debug,\n },\n token,\n );\n}\n\ninterface TokenRefreshBridge {\n onTokenRefresh(cb: (token: string) => void): () => void;\n}\n\nexport function subscribeTokenRefresh(\n bridge: TokenRefreshBridge,\n deps: TokenOpsDeps,\n onToken: (token: string) => void,\n): () => void {\n return bridge.onTokenRefresh((newToken) => {\n if (deps.debug) console.warn(\"[Paywallo PUSH] token refreshed\");\n onToken(newToken);\n persistToken(deps.secureStorage, newToken).catch(() => undefined);\n registerToken(\n {\n httpClient: deps.httpClient,\n secureStorage: deps.secureStorage,\n appKey: deps.appKey,\n getDeviceId: deps.getDeviceId,\n getDistinctId: deps.getDistinctId,\n debug: deps.debug,\n },\n newToken,\n ).catch(() => undefined);\n });\n}\n\nexport async function optOutToken(\n httpClient: HttpClient | null,\n secureStorage: SecureStorage | null,\n appKey: string | null,\n debug: boolean,\n): Promise<void> {\n await unregisterToken(httpClient, appKey, debug);\n await clearPersistedToken(secureStorage);\n}\n\nexport async function invalidateLocalTokenStorage(\n secureStorage: SecureStorage | null,\n debug: boolean,\n): Promise<void> {\n await clearPersistedToken(secureStorage);\n if (debug) console.log(\"[Paywallo PUSH] local token invalidated\");\n}\n\nexport async function waitForApnsToken(bridge: IPushBridge, debug: boolean): Promise<void> {\n let apnsToken: string | null = null;\n for (let i = 0; i < APNS_RETRY_COUNT; i++) {\n apnsToken = await bridge.getAPNSToken();\n if (apnsToken) break;\n if (i < APNS_RETRY_COUNT - 1) await sleep(APNS_RETRY_DELAY_MS);\n }\n if (debug) console.log(\"[Paywallo PUSH] APNS token available:\", !!apnsToken);\n}\n\nexport async function captureAndRegisterToken(\n bridge: IPushBridge,\n deps: TokenOpsDeps,\n onTokenCaptured: (token: string) => void,\n subscribeRefresh: () => void,\n): Promise<void> {\n await waitForApnsToken(bridge, deps.debug);\n const token = await bridge.getToken();\n if (!token) {\n if (deps.debug) console.warn(\"[Paywallo PUSH] token unavailable after grant\");\n return;\n }\n onTokenCaptured(token);\n await registerAndPersistToken(deps, token);\n subscribeRefresh();\n}\n","import { Platform } from \"react-native\";\n\nimport type { IPushBridge } from \"./bridges/types\";\nimport type { NotificationEventTracker } from \"./NotificationEventTracker\";\nimport type { PushPermissionStatus } from \"./types\";\n\n// AuthorizationStatus from Firebase Messaging\nconst AUTH_STATUS = {\n NOT_DETERMINED: -1,\n DENIED: 0,\n AUTHORIZED: 1,\n PROVISIONAL: 2,\n} as const;\n\n// Android API level where POST_NOTIFICATIONS runtime permission was introduced (Android 13).\nconst ANDROID_TIRAMISU_API = 33;\n\nexport type PromptEventType =\n | \"prompt_shown\"\n | \"soft_accepted\"\n | \"soft_rejected\"\n | \"os_granted\"\n | \"os_denied\";\n\nexport interface PrePromptTracker {\n trackPromptEvent(event: PromptEventType): void;\n}\n\nexport interface PrePromptOptions {\n title: string;\n body: string;\n acceptLabel?: string;\n rejectLabel?: string;\n provisional?: boolean;\n}\n\nexport interface PrePromptHandle {\n title: string;\n body: string;\n acceptLabel?: string;\n rejectLabel?: string;\n /** Consumer invokes after user taps accept in custom UI. */\n accept(): Promise<PushPermissionStatus>;\n /** Consumer invokes after user taps reject in custom UI. */\n reject(): PushPermissionStatus;\n}\n\nfunction mapPermissionStatus(status: number): PushPermissionStatus {\n switch (status) {\n case AUTH_STATUS.AUTHORIZED:\n return \"granted\";\n case AUTH_STATUS.DENIED:\n return \"denied\";\n case AUTH_STATUS.PROVISIONAL:\n return \"provisional\";\n default:\n return \"notDetermined\";\n }\n}\n\nexport interface RNPlatform {\n OS: string;\n Version?: number | string;\n}\n\nfunction getPlatform(): RNPlatform {\n return Platform;\n}\n\nfunction needsAndroidRuntimePermission(platform: RNPlatform): boolean {\n if (platform.OS !== \"android\") return false;\n const v = typeof platform.Version === \"string\"\n ? parseInt(platform.Version, 10)\n : platform.Version ?? 0;\n return Number.isFinite(v) && v >= ANDROID_TIRAMISU_API;\n}\n\nexport class PermissionManager {\n private tracker: PrePromptTracker | null = null;\n private debug: boolean;\n private readonly platformOverride: RNPlatform | undefined;\n\n constructor(\n private readonly bridge: IPushBridge,\n opts: { debug?: boolean; tracker?: PrePromptTracker | NotificationEventTracker; platform?: RNPlatform } = {}\n ) {\n this.debug = opts.debug ?? false;\n this.tracker = this.coerceTracker(opts.tracker);\n this.platformOverride = opts.platform;\n }\n\n setTracker(tracker: PrePromptTracker | NotificationEventTracker | null): void {\n this.tracker = this.coerceTracker(tracker);\n }\n\n setDebug(debug: boolean): void {\n this.debug = debug;\n }\n\n async requestPermission(options?: { provisional?: boolean }): Promise<PushPermissionStatus> {\n const platform = this.platformOverride ?? getPlatform();\n if (this.debug) console.warn(\"[paywallo-push] platform detected:\", platform.OS, \"version:\", String(platform.Version ?? \"n/a\"));\n\n if (platform.OS === \"ios\") {\n if (this.debug) console.warn(\"[paywallo-push] requestPermission iOS — calling bridge...\");\n try {\n const raw = await this.bridge.requestPermission(options);\n if (this.debug) console.warn(\"[paywallo-push] bridge returned raw:\", raw);\n const status = mapPermissionStatus(raw);\n if (this.debug) console.warn(\"[paywallo-push] mapped status:\", status);\n this.emitOsEvent(status);\n return status;\n } catch (err) {\n if (this.debug) console.warn(\"[paywallo-push] requestPermission iOS CRASHED:\", err instanceof Error ? err.message : String(err));\n throw err;\n }\n }\n\n if (!needsAndroidRuntimePermission(platform)) {\n // Pre-Android 13: POST_NOTIFICATIONS is auto-granted at install time.\n if (this.debug) console.log(\"[paywallo-push] Android <13: auto-granted\");\n const status = await this.getStatus();\n this.emitOsEvent(status);\n return status;\n }\n\n // Android 13+: FCM requestPermission triggers POST_NOTIFICATIONS runtime dialog.\n if (this.debug) console.log(\"[paywallo-push] requestPermission Android 13+\");\n const raw = await this.bridge.requestPermission();\n const status = mapPermissionStatus(raw);\n this.emitOsEvent(status);\n return status;\n }\n\n async getStatus(): Promise<PushPermissionStatus> {\n const raw = await this.bridge.hasPermission();\n const status = mapPermissionStatus(raw);\n if (this.debug) console.log(\"[paywallo-push] getStatus:\", status);\n return status;\n }\n\n /**\n * Soft prompt flow — SDK never renders UI. Returns a handle with accept/reject\n * the consumer calls from its own bottom sheet / modal. Emits prompt events\n * via the injected tracker.\n */\n requestPermissionWithPrePrompt(opts: PrePromptOptions): PrePromptHandle {\n if (this.debug) console.log(\"[paywallo-push] pre-prompt shown\");\n this.emitPromptEvent(\"prompt_shown\");\n\n let settled = false;\n\n const accept = async (): Promise<PushPermissionStatus> => {\n if (settled) return this.getStatus();\n settled = true;\n this.emitPromptEvent(\"soft_accepted\");\n if (this.debug) console.log(\"[paywallo-push] pre-prompt accepted\");\n return this.requestPermission({ provisional: opts.provisional });\n };\n\n const reject = (): PushPermissionStatus => {\n if (settled) return \"notDetermined\";\n settled = true;\n this.emitPromptEvent(\"soft_rejected\");\n if (this.debug) console.log(\"[paywallo-push] pre-prompt rejected\");\n return \"notDetermined\";\n };\n\n return {\n title: opts.title,\n body: opts.body,\n acceptLabel: opts.acceptLabel,\n rejectLabel: opts.rejectLabel,\n accept,\n reject,\n };\n }\n\n private emitPromptEvent(event: PromptEventType): void {\n try {\n this.tracker?.trackPromptEvent(event);\n } catch (err) {\n if (this.debug) console.log(\"[paywallo-push] prompt tracker error:\", err);\n }\n }\n\n private emitOsEvent(status: PushPermissionStatus): void {\n if (status === \"granted\" || status === \"provisional\") {\n this.emitPromptEvent(\"os_granted\");\n } else if (status === \"denied\") {\n this.emitPromptEvent(\"os_denied\");\n }\n }\n\n private coerceTracker(\n tracker: PrePromptTracker | NotificationEventTracker | null | undefined\n ): PrePromptTracker | null {\n if (!tracker) return null;\n if (typeof (tracker as PrePromptTracker).trackPromptEvent === \"function\") {\n return tracker as PrePromptTracker;\n }\n // NotificationEventTracker has no prompt channel — wrap as no-op so DI stays optional.\n return null;\n }\n}\n\nexport const createPermissionManager = (\n bridge: IPushBridge,\n opts: { debug?: boolean; tracker?: PrePromptTracker | NotificationEventTracker; platform?: RNPlatform } = {}\n): PermissionManager => new PermissionManager(bridge, opts);\n","import type { HttpClient } from \"../../core/http/HttpClient\";\nimport type { SecureStorage } from \"../../core/storage/SecureStorage\";\n\nimport { NativePushBridge } from \"./bridges/NativePushBridge\";\nimport type { IPushBridge } from \"./bridges/types\";\nimport type { FcmRemoteMessage } from \"./bridges/types\";\nimport type { NotificationsConfig } from \"./config\";\nimport { resolveApiBaseUrl } from \"./config\";\nimport { registerBackgroundMessageHandler } from \"./handlers/BackgroundHandler\";\nimport { type EventBatcherLike,NotificationEventTracker } from \"./NotificationEventTracker\";\nimport {\n buildHandlers,\n getInitialNotificationPayload,\n} from \"./NotificationHandlerSetup\";\nimport {\n captureAndRegisterToken,\n invalidateLocalTokenStorage,\n optOutToken,\n registerAndPersistToken,\n subscribeTokenRefresh as subscribeTokenRefreshOp,\n type TokenOpsDeps,\n waitForApnsToken,\n} from \"./NotificationTokenOps\";\nimport type { PrePromptHandle, PrePromptOptions, RNPlatform } from \"./PermissionManager\";\nimport { PermissionManager } from \"./PermissionManager\";\nimport type { NotificationPayload,PushPermissionStatus } from \"./types\";\nimport { mapPermissionStatus } from \"./utils\";\n\nexport type { IPushBridge };\n\ninterface HandlersConfig {\n eventBatcher: EventBatcherLike;\n}\n\ninterface NotificationsManagerConfig {\n appKey: string;\n apiBaseUrl?: string;\n debug?: boolean;\n environment?: NotificationsConfig[\"environment\"];\n}\n\ninterface NotificationsManagerDeps {\n httpClient?: HttpClient;\n secureStorage?: SecureStorage;\n /** Generic bridge — takes precedence over fcmBridge if both are provided. */\n bridge?: IPushBridge;\n /** Kept for backwards compatibility — use bridge instead. */\n fcmBridge?: IPushBridge;\n getDeviceId?: () => string | null;\n getDistinctId?: () => string;\n platform?: RNPlatform;\n}\n\nclass NotificationsManager {\n private isInitialized = false;\n private permissionStatus: PushPermissionStatus = \"notDetermined\";\n private currentToken: string | null = null;\n private debug = false;\n\n private httpClient: HttpClient | null = null;\n private secureStorage: SecureStorage | null = null;\n private bridge: IPushBridge;\n private getDeviceId: (() => string | null) | null = null;\n private getDistinctId: (() => string) | null = null;\n private appKey: string | null = null;\n private apiBaseUrl: string | null = null;\n\n private tokenRefreshCleanup: (() => void) | null = null;\n private foregroundCleanup: (() => void) | null = null;\n private pendingHandlersConfig: HandlersConfig | null = null;\n private tracker: NotificationEventTracker | null = null;\n private permissionManager: PermissionManager;\n\n private receivedCallbacks: Array<(payload: NotificationPayload) => void> = [];\n private openedCallbacks: Array<(payload: NotificationPayload) => void> = [];\n private dismissedCallbacks: Array<(payload: NotificationPayload) => void> = [];\n\n constructor(deps: NotificationsManagerDeps = {}) {\n this.bridge = deps.bridge ?? deps.fcmBridge ?? new NativePushBridge();\n if (deps.httpClient) this.httpClient = deps.httpClient;\n if (deps.secureStorage) this.secureStorage = deps.secureStorage;\n if (deps.getDeviceId) this.getDeviceId = deps.getDeviceId;\n if (deps.getDistinctId) this.getDistinctId = deps.getDistinctId;\n this.permissionManager = new PermissionManager(this.bridge, { platform: deps.platform });\n }\n\n injectDeps(deps: {\n httpClient: HttpClient;\n secureStorage: SecureStorage;\n getDeviceId: () => string | null;\n getDistinctId?: () => string;\n }): void {\n this.httpClient = deps.httpClient;\n this.secureStorage = deps.secureStorage;\n this.getDeviceId = deps.getDeviceId;\n if (deps.getDistinctId) this.getDistinctId = deps.getDistinctId;\n }\n\n async initialize(config: NotificationsManagerConfig): Promise<void> {\n this.applyConfig(config);\n\n // Apply deferred handlers if setupHandlers was called before initialize\n if (this.pendingHandlersConfig) {\n this.setupHandlers(this.pendingHandlersConfig);\n this.pendingHandlersConfig = null;\n }\n\n await this.refreshPermissionStatus();\n await waitForApnsToken(this.bridge, this.debug);\n\n const token = await this.bridge.getToken();\n if (!token) {\n if (this.debug) console.warn(\"[Paywallo PUSH] token unavailable, skipping registration\");\n this.isInitialized = true;\n return;\n }\n if (this.debug) console.warn(\"[Paywallo PUSH] token acquired:\", token);\n this.currentToken = token;\n await this.doRegisterToken(token);\n this.subscribeTokenRefresh();\n this.isInitialized = true;\n }\n\n private applyConfig(config: NotificationsManagerConfig): void {\n this.appKey = config.appKey;\n this.apiBaseUrl = resolveApiBaseUrl({\n apiBaseUrl: config.apiBaseUrl,\n environment: config.environment,\n });\n this.debug = config.debug ?? false;\n this.permissionManager.setDebug(this.debug);\n }\n\n private async refreshPermissionStatus(): Promise<void> {\n const permStatus = await this.bridge.hasPermission();\n this.permissionStatus = mapPermissionStatus(permStatus);\n if (this.debug) console.warn(\"[Paywallo PUSH] permission status:\", this.permissionStatus);\n }\n\n private tokenDeps(): TokenOpsDeps {\n return {\n httpClient: this.httpClient,\n secureStorage: this.secureStorage,\n appKey: this.appKey,\n getDeviceId: this.getDeviceId,\n getDistinctId: this.getDistinctId,\n debug: this.debug,\n };\n }\n\n private async doRegisterToken(token: string): Promise<void> {\n await registerAndPersistToken(this.tokenDeps(), token);\n }\n\n private subscribeTokenRefresh(): void {\n this.tokenRefreshCleanup = subscribeTokenRefreshOp(\n this.bridge,\n this.tokenDeps(),\n (newToken) => { this.currentToken = newToken; },\n );\n }\n\n /** Deletes token on server + locally (explicit user opt-out). */\n async optOut(): Promise<void> {\n await optOutToken(this.httpClient, this.secureStorage, this.appKey, this.debug);\n this.currentToken = null;\n if (this.debug) console.warn(\"[Paywallo PUSH] opted out\");\n }\n\n /** Clears token locally without server call (used on sign-out/reset). */\n async invalidateLocalToken(): Promise<void> {\n await invalidateLocalTokenStorage(this.secureStorage, this.debug);\n this.currentToken = null;\n }\n\n async getPermissionStatus(): Promise<PushPermissionStatus> {\n const status = await this.permissionManager.getStatus();\n this.permissionStatus = status;\n return status;\n }\n\n async requestPermission(options?: { provisional?: boolean }): Promise<PushPermissionStatus> {\n return this.permissionManager.requestPermission(options);\n }\n\n /** Requests OS permission and, on success, captures + registers the push token. */\n async requestPushPermission(options?: { provisional?: boolean }): Promise<PushPermissionStatus> {\n if (this.debug) console.warn(\"[Paywallo PUSH] requestPushPermission called\");\n try {\n const status = await this.permissionManager.requestPermission(options);\n if (this.debug) console.warn(\"[Paywallo PUSH] permissionManager returned:\", status);\n this.permissionStatus = status;\n if (status === \"granted\" || status === \"provisional\") {\n if (this.debug) console.warn(\"[Paywallo PUSH] permission granted — capturing token...\");\n await this.captureAndRegisterToken();\n if (this.debug) console.warn(\"[Paywallo PUSH] token capture complete\");\n } else {\n if (this.debug) console.warn(\"[Paywallo PUSH] permission not granted, skipping token register:\", status);\n }\n return status;\n } catch (err) {\n if (this.debug) console.warn(\"[Paywallo PUSH] requestPushPermission CRASHED:\", err instanceof Error ? err.message : String(err));\n throw err;\n }\n }\n\n private async captureAndRegisterToken(): Promise<void> {\n await captureAndRegisterToken(\n this.bridge,\n this.tokenDeps(),\n (token) => { this.currentToken = token; },\n () => { if (!this.tokenRefreshCleanup) this.subscribeTokenRefresh(); },\n );\n }\n\n requestPermissionWithPrePrompt(opts: PrePromptOptions): PrePromptHandle {\n return this.permissionManager.requestPermissionWithPrePrompt(opts);\n }\n\n isReady(): boolean {\n return this.isInitialized;\n }\n\n markInitialized(): void {\n this.isInitialized = true;\n }\n\n getCurrentToken(): string | null {\n return this.currentToken;\n }\n\n setupHandlers(config: HandlersConfig): void {\n // If called before initialize (appKey not set yet), defer until applyConfig runs\n if (!this.appKey) {\n this.pendingHandlersConfig = config;\n return;\n }\n const result = buildHandlers({\n appKey: this.appKey,\n apiBaseUrl: this.apiBaseUrl,\n debug: this.debug,\n bridge: this.bridge,\n secureStorage: this.secureStorage,\n getDeviceId: this.getDeviceId,\n permissionManager: this.permissionManager,\n receivedCallbacks: this.receivedCallbacks,\n openedCallbacks: this.openedCallbacks,\n dismissedCallbacks: this.dismissedCallbacks,\n eventBatcher: config.eventBatcher,\n });\n if (!result) return;\n this.tracker = result.tracker;\n this.foregroundCleanup = result.foregroundCleanup;\n }\n\n onReceived(cb: (payload: NotificationPayload) => void): void {\n this.receivedCallbacks.push(cb);\n }\n\n onOpened(cb: (payload: NotificationPayload) => void): void {\n this.openedCallbacks.push(cb);\n }\n\n onDismissed(cb: (payload: NotificationPayload) => void): void {\n this.dismissedCallbacks.push(cb);\n }\n\n async getInitialNotification(): Promise<NotificationPayload | null> {\n return getInitialNotificationPayload(this.bridge);\n }\n\n async flushEvents(): Promise<void> {\n await this.tracker?.flush();\n }\n\n registerBackgroundHandler(cb: (message: FcmRemoteMessage) => Promise<void>): void {\n registerBackgroundMessageHandler(cb);\n }\n\n destroy(): void {\n this.tokenRefreshCleanup?.(); this.tokenRefreshCleanup = null;\n this.foregroundCleanup?.(); this.foregroundCleanup = null;\n this.tracker = null;\n this.receivedCallbacks = []; this.openedCallbacks = []; this.dismissedCallbacks = [];\n this.isInitialized = false; this.currentToken = null;\n }\n}\n\nexport { NotificationsManager };\nexport type { NotificationsManagerConfig, NotificationsManagerDeps };\nexport const notificationsManager = new NotificationsManager();\n","export { NativePushBridge } from \"./bridges/NativePushBridge\";\nexport type { IPushBridge } from \"./bridges/types\";\nexport type { NotificationsEnvironment } from \"./config\";\nexport {\n DEFAULT_API_BASE_URL,\n resolveApiBaseUrl,\n SANDBOX_API_BASE_URL,\n} from \"./config\";\nexport type { NotificationsErrorCode } from \"./NotificationsError\";\nexport {\n NOTIFICATIONS_ERROR_CODES,\n NotificationsError,\n PermissionDeniedError,\n RegistrationFailedError,\n TokenUnavailableError,\n} from \"./NotificationsError\";\nexport type { NotificationsManagerConfig } from \"./NotificationsManager\";\nexport { NotificationsManager,notificationsManager } from \"./NotificationsManager\";\nexport type { PrePromptHandle,PrePromptOptions } from \"./PermissionManager\";\nexport { createPermissionManager,PermissionManager } from \"./PermissionManager\";\nexport type {\n DeviceTokenRegistration,\n NotificationEventType,\n NotificationListener,\n NotificationPayload,\n PushPermissionStatus,\n PushPlatform,\n} from \"./types\";\n","/**\n * Enum legado aceito pelo SDK nos callers (`usePaywallActions`,\n * `usePurchaseOrchestrator`). Mantido só pra retrocompat — mapeado para\n * `PaywallCanonicalCloseReason` antes do emit canônico.\n */\nexport type PaywallCloseReason = \"dismissed\" | \"purchased\" | \"backgrounded\" | \"timeout\";\n\n/**\n * Enum do schema canônico `paywall {type: \"closed\"}` (sub-fase 2.10).\n * Qualquer emissão fora desse set é rejeitada pelo Zod em `EventBatcher`.\n */\nexport type PaywallCanonicalCloseReason = \"dismiss\" | \"cta\" | \"purchase\" | \"error\" | \"timeout\";\n\nconst CLOSE_REASON_MAP: Record<PaywallCloseReason, PaywallCanonicalCloseReason> = {\n dismissed: \"dismiss\",\n purchased: \"purchase\",\n backgrounded: \"dismiss\",\n timeout: \"timeout\",\n};\n\nexport function toCanonicalReason(\n reason: PaywallCloseReason | PaywallCanonicalCloseReason,\n): PaywallCanonicalCloseReason {\n if (reason in CLOSE_REASON_MAP) return CLOSE_REASON_MAP[reason as PaywallCloseReason];\n return reason as PaywallCanonicalCloseReason;\n}\n","import { PaywalloClient } from \"../../core/PaywalloClient\";\n\nimport {\n type PaywallCanonicalCloseReason,\n type PaywallCloseReason,\n toCanonicalReason,\n} from \"./paywallCloseReason\";\n\nexport interface EmitPaywallClosedOptions {\n placement: string;\n paywallId: string;\n presentedAt: number;\n reason: PaywallCloseReason | PaywallCanonicalCloseReason;\n variantKey?: string;\n campaignId?: string;\n /** UUID de `paywall_variants` (sub-fase 2.14). */\n variantId?: string;\n scrollDepth?: number;\n}\n\n/**\n * Emissor canônico único do `paywall {type: \"closed\"}` (sub-fase 2.10).\n *\n * Todo caller (modal via `usePaywallActions`, preloaded via\n * `usePaywallPresenter`, purchase/restore via `usePurchaseOrchestrator`,\n * unmount cleanup em `usePaywallSession`) passa por aqui — zero duplicação\n * do emit que causaria NULLs em `paywall_interactions.closedAt/durationS/variantId`.\n *\n * `closed_at` é ISO 8601, `duration_s` é segundos (não ms), `close_reason`\n * é sempre o enum canônico e `variant_id` é UUID quando o CampaignGate\n * (sub-fase 2.14) entrega.\n */\nexport async function emitPaywallClosed(opts: EmitPaywallClosedOptions): Promise<void> {\n try {\n const api = PaywalloClient.getApiClient();\n if (!api) return;\n const sessionId = PaywalloClient.getSessionId();\n const closedAt = new Date();\n const durationS = Math.max(0, Math.round((closedAt.getTime() - opts.presentedAt) / 1000));\n await api.trackEvent(\"paywall\", PaywalloClient.getDistinctId(), {\n type: \"closed\",\n paywall_id: opts.paywallId,\n placement: opts.placement,\n closed_at: closedAt.toISOString(),\n duration_s: durationS,\n close_reason: toCanonicalReason(opts.reason),\n ...(opts.variantId && { variant_id: opts.variantId }),\n ...(opts.variantKey && { variant_key: opts.variantKey }),\n ...(opts.campaignId && { campaign_id: opts.campaignId }),\n ...(typeof opts.scrollDepth === \"number\" && { scroll_depth: opts.scrollDepth }),\n ...(sessionId && { sessionId }),\n });\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.log(\"[Paywallo] emitPaywallClosed failed\", err);\n }\n}\n","export interface WebViewMessage {\n type: \"purchase\" | \"close\" | \"restore\" | \"select-product\" | \"open-url\" | \"ready\";\n id?: string;\n payload?: {\n productId?: string;\n url?: string;\n timestamp?: number;\n };\n}\n\nconst ALLOWED_MESSAGE_TYPES: ReadonlySet<string> = new Set([\n \"purchase\",\n \"close\",\n \"restore\",\n \"select-product\",\n \"open-url\",\n \"ready\",\n]);\n\nexport function deriveMessageId(message: WebViewMessage): string {\n if (message.id) return message.id;\n\n const payloadKey =\n message.payload?.productId ??\n message.payload?.url ??\n (message.payload?.timestamp != null ? String(message.payload.timestamp) : \"\");\n\n return `${message.type}:${payloadKey}`;\n}\n\nexport function parseWebViewMessage(raw: string): WebViewMessage | null {\n try {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n if (typeof parsed?.type !== \"string\" || !ALLOWED_MESSAGE_TYPES.has(parsed.type)) {\n return null;\n }\n\n const payload = parsed.payload;\n const safePayload: WebViewMessage[\"payload\"] =\n payload !== null && typeof payload === \"object\"\n ? {\n productId: typeof (payload as Record<string, unknown>).productId === \"string\"\n ? String((payload as Record<string, unknown>).productId)\n : undefined,\n url: typeof (payload as Record<string, unknown>).url === \"string\"\n ? String((payload as Record<string, unknown>).url)\n : undefined,\n timestamp: typeof (payload as Record<string, unknown>).timestamp === \"number\"\n ? Number((payload as Record<string, unknown>).timestamp)\n : undefined,\n }\n : undefined;\n\n return {\n type: parsed.type as WebViewMessage[\"type\"],\n id: typeof parsed.id === \"string\" ? parsed.id : undefined,\n payload: safePayload,\n };\n } catch {\n return null;\n }\n}\n","import { createContext, useContext } from \"react\";\n\nimport type { PaywallNode, TapBehavior } from \"../../types/blocks\";\nimport type { Product } from \"../../types/purchase\";\n\nimport { PAYWALL_ERROR_CODES, PaywallError } from \"./PaywallError\";\n\nexport interface PaywallContextValue {\n nodes: Record<string, PaywallNode>;\n rootId: string;\n language: string;\n defaultLanguage: string;\n products: Map<string, Product>;\n selectedProductId: string | null;\n primaryProductId: string | null;\n secondaryProductId: string | null;\n currentNavigationIndex: number;\n currentTabIndex: number;\n trialEnabled: boolean;\n selectedPeriod: string | null;\n isPurchasing: boolean;\n exitOfferVisible: boolean;\n exitOfferTriggeredByBackButton: boolean;\n\n onClose: () => void;\n onTryClose: () => void;\n onSelectProduct: (productId: string) => void;\n onPurchase: (productId: string) => void;\n onRestore: () => void;\n onNavigate: (target: \"next\" | \"previous\" | \"first\" | \"last\" | number) => void;\n onSetTab: (index: number) => void;\n onSetVariable: (name: string, value: string) => void;\n onToggleTrial: (enabled: boolean) => void;\n onSelectPeriod: (value: string) => void;\n onOpenUrl: (url: string, inBrowser?: boolean) => void;\n onTapBehavior: (behavior: TapBehavior) => void;\n onShowExitOffer: () => void;\n onDismissExitOffer: () => void;\n onTriggerBackButton: () => void;\n}\n\nexport const PaywallContext = createContext<PaywallContextValue | null>(null);\n\nexport function usePaywallContext(): PaywallContextValue {\n const context = useContext(PaywallContext);\n if (!context) {\n throw new PaywallError(\n PAYWALL_ERROR_CODES.NOT_INITIALIZED,\n \"usePaywallContext must be used within a Paywall component\"\n );\n }\n return context;\n}\n","import React, { Component } from \"react\";\n\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\n\nexport class PaywallErrorBoundary extends Component<{ children: React.ReactNode }, { hasError: boolean }> {\n state = { hasError: false };\n static getDerivedStateFromError(): { hasError: boolean } { return { hasError: true }; }\n componentDidCatch(error: Error): void {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] Paywall render error:\", error);\n try { PaywalloClient.getApiClient()?.reportError(\"PAYWALL_RENDER_ERROR\", error.message); } catch {}\n }\n render(): React.ReactNode { return this.state.hasError ? null : this.props.children; }\n}\n","import { secureStorage } from \"../../core/storage/SecureStorage\";\n\n/**\n * Crash-safe heartbeat para o paywall {closed} canônico (sub-fase 2.10).\n *\n * Enquanto um paywall está presente na tela o SDK escreve um snapshot a cada\n * HEARTBEAT_INTERVAL_MS no SecureStorage. Se o processo morre (kill do sistema,\n * OOM, crash nativo) a função de unmount/cleanup do React nunca roda — o evento\n * `paywall {closed}` nunca é emitido e as colunas `closedAt`/`durationS`\n * ficariam NULL em `paywall_interactions`.\n *\n * Na próxima inicialização do SDK, `recoverHeartbeat()` detecta o snapshot\n * órfão e sinta um evento `closed` com `close_reason: \"error\"` usando\n * `lastSeen - presentedAt` como `duration_s`. Isso fecha o row no server com\n * precisão de ±5s, eliminando o hole de observabilidade.\n */\n\nconst HEARTBEAT_STORAGE_KEY = \"@paywallo:paywall_heartbeat\";\nconst LEGACY_HEARTBEAT_STORAGE_KEY = \"@panel:paywall_heartbeat\";\n\nexport const HEARTBEAT_INTERVAL_MS = 5000;\n\nexport interface HeartbeatSnapshot {\n paywallId: string;\n variantId?: string;\n variantKey?: string;\n campaignId?: string;\n placement: string;\n presentedAt: number;\n lastSeen: number;\n}\n\ninterface ActiveHeartbeat {\n timer: ReturnType<typeof setInterval> | null;\n snapshot: HeartbeatSnapshot;\n}\n\nlet active: ActiveHeartbeat | null = null;\n\nfunction persist(snapshot: HeartbeatSnapshot): void {\n void secureStorage.set(HEARTBEAT_STORAGE_KEY, JSON.stringify(snapshot)).catch(() => undefined);\n}\n\n/**\n * Inicia o heartbeat para a sessão de paywall atual. Escreve imediatamente\n * e depois a cada 5s. Se já houver heartbeat ativo (re-open sem cleanup)\n * ele é substituído.\n */\nexport function startHeartbeat(snapshot: Omit<HeartbeatSnapshot, \"lastSeen\">): void {\n if (active?.timer) clearInterval(active.timer);\n const initial: HeartbeatSnapshot = { ...snapshot, lastSeen: Date.now() };\n persist(initial);\n const timer = setInterval(() => {\n if (!active) return;\n active.snapshot = { ...active.snapshot, lastSeen: Date.now() };\n persist(active.snapshot);\n }, HEARTBEAT_INTERVAL_MS);\n active = { timer, snapshot: initial };\n}\n\n/**\n * Interrompe o heartbeat ativo e remove o snapshot do storage — chamado\n * no cleanup do `useEffect` quando o paywall desmonta normalmente (incluindo\n * close por dismiss, cta, purchase, timeout).\n */\nexport async function stopHeartbeat(): Promise<void> {\n if (active?.timer) clearInterval(active.timer);\n active = null;\n try {\n await secureStorage.remove(HEARTBEAT_STORAGE_KEY);\n } catch {\n /* best-effort — storage pode estar indisponível em ambientes sem native module */\n }\n}\n\n/**\n * Snapshot atual em memória — exposto para testes e para o path de\n * trackClosed calcular `duration_s` consistente mesmo sem clock fresh.\n */\nexport function getActiveSnapshot(): HeartbeatSnapshot | null {\n return active ? active.snapshot : null;\n}\n\n/**\n * Lê o último snapshot persistido (ou null). Usado pela rotina de recovery\n * em `PaywalloInitializer.doInit` e pelos testes de crash.\n */\nexport async function readPersistedHeartbeat(): Promise<HeartbeatSnapshot | null> {\n try {\n let raw = await secureStorage.get(HEARTBEAT_STORAGE_KEY);\n if (!raw) {\n // Silent migration from legacy @panel: key\n raw = await secureStorage.get(LEGACY_HEARTBEAT_STORAGE_KEY).catch(() => null);\n if (raw) {\n await secureStorage.set(HEARTBEAT_STORAGE_KEY, raw).catch(() => undefined);\n await secureStorage.remove(LEGACY_HEARTBEAT_STORAGE_KEY).catch(() => undefined);\n }\n }\n if (!raw) return null;\n const parsed = JSON.parse(raw) as HeartbeatSnapshot;\n if (!parsed.paywallId || typeof parsed.presentedAt !== \"number\" || typeof parsed.lastSeen !== \"number\") {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\n/**\n * Remove o snapshot persistido (usado após recovery bem-sucedido ou reset\n * manual). Não mexe no heartbeat in-memory — esse é isolado em `stopHeartbeat`.\n */\nexport async function clearPersistedHeartbeat(): Promise<void> {\n try {\n await secureStorage.remove(HEARTBEAT_STORAGE_KEY);\n } catch {\n /* best-effort */\n }\n}\n","import { NativeModules, Platform } from \"react-native\";\n\nimport type { LocalizedText } from \"../types/blocks\";\n\nlet currentLanguage = \"pt-BR\";\nlet defaultLanguage = \"pt-BR\";\n\nexport function setCurrentLanguage(language: string): void {\n currentLanguage = language;\n}\n\nexport function setDefaultLanguage(language: string): void {\n defaultLanguage = language;\n}\n\nexport function getCurrentLanguage(): string {\n return currentLanguage;\n}\n\nexport function getDefaultLanguage(): string {\n return defaultLanguage;\n}\n\nexport function getLocalizedString(text: string | LocalizedText | undefined): string {\n if (!text) return \"\";\n if (typeof text === \"string\") return text;\n\n return text[currentLanguage] ?? text[defaultLanguage] ?? Object.values(text)[0] ?? \"\";\n}\n\nexport function detectDeviceLanguage(): string {\n try {\n if (Platform.OS === \"ios\") {\n const settings = (\n NativeModules as {\n SettingsManager?: { settings?: { AppleLocale?: string; AppleLanguages?: string[] } };\n }\n ).SettingsManager?.settings;\n return settings?.AppleLocale ?? settings?.AppleLanguages?.[0] ?? \"en-US\";\n }\n\n return (\n (NativeModules as { I18nManager?: { localeIdentifier?: string } }).I18nManager\n ?.localeIdentifier ?? \"en-US\"\n );\n } catch {\n return \"en-US\";\n }\n}\n\nconst SDK_STRINGS = {\n paywallErrorTitle: {\n \"pt-BR\": \"Algo deu errado\",\n \"pt\": \"Algo deu errado\",\n \"en\": \"Something went wrong\",\n \"en-US\": \"Something went wrong\",\n \"en-GB\": \"Something went wrong\",\n \"es\": \"Algo salió mal\",\n \"es-419\": \"Algo salió mal\",\n },\n paywallRetryButton: {\n \"pt-BR\": \"Tentar novamente\",\n \"pt\": \"Tentar novamente\",\n \"en\": \"Try again\",\n \"en-US\": \"Try again\",\n \"en-GB\": \"Try again\",\n \"es\": \"Reintentar\",\n \"es-419\": \"Reintentar\",\n },\n paywallCloseButton: {\n \"pt-BR\": \"Fechar\",\n \"pt\": \"Fechar\",\n \"en\": \"Close\",\n \"en-US\": \"Close\",\n \"en-GB\": \"Close\",\n \"es\": \"Cerrar\",\n \"es-419\": \"Cerrar\",\n },\n} as const;\n\ntype SdkStringKey = keyof typeof SDK_STRINGS;\n\nexport function getSdkString(key: SdkStringKey): string {\n const map: Record<string, string> = SDK_STRINGS[key];\n if (currentLanguage in map) return map[currentLanguage];\n const base = currentLanguage.split(\"-\")[0];\n if (base && base in map) return map[base];\n if (defaultLanguage in map) return map[defaultLanguage];\n return Object.values(map)[0];\n}\n\nexport function initLocalization(options?: {\n defaultLanguage?: string;\n detectDevice?: boolean;\n}): void {\n if (options?.defaultLanguage) {\n defaultLanguage = options.defaultLanguage;\n }\n\n if (options?.detectDevice !== false) {\n const deviceLanguage = detectDeviceLanguage();\n currentLanguage = deviceLanguage;\n }\n}\n","import type { Product } from \"../../types/purchase\";\n\ninterface PaywallInjectionData {\n craftData: string;\n products: Product[];\n primaryProductId?: string;\n secondaryProductId?: string;\n}\n\nexport function buildPaywallInjectionScript(data: PaywallInjectionData): string {\n const paywallData = {\n type: \"paywall\",\n data: {\n craftData: data.craftData,\n products: data.products,\n primaryProductId: data.primaryProductId,\n secondaryProductId: data.secondaryProductId,\n },\n };\n\n return `(function(){var d=${JSON.stringify(paywallData)},a=0,m=50;function t(){a++;if(window.receiveNativeMessage){window.receiveNativeMessage(d);return;}if(a<m){setTimeout(t,100);}}t();})();true;`;\n}\n\nexport function buildPurchaseStateScript(isPurchasing: boolean): string {\n return `if(window.receiveNativeMessage){window.receiveNativeMessage({type:\"purchaseState\",data:{isPurchasing:${isPurchasing}}});}true;`;\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n Linking,\n NativeEventEmitter,\n NativeModules,\n requireNativeComponent,\n StyleProp,\n StyleSheet,\n View,\n ViewStyle,\n} from \"react-native\";\n\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport type { Product } from \"../../types/purchase\";\n\nimport { deriveMessageId, parseWebViewMessage, WebViewMessage } from \"./parseWebViewMessage\";\nimport { buildPaywallInjectionScript, buildPurchaseStateScript } from \"./paywallScripts\";\n\ninterface NativeWebViewProps {\n sourceUrl: string;\n injectedJavaScript?: string;\n onMessage?: (event: { nativeEvent: { data: string } }) => void;\n onLoadEnd?: () => void;\n onError?: (event: { nativeEvent: Record<string, unknown> }) => void;\n style?: StyleProp<ViewStyle>;\n ref?: React.Ref<View>;\n}\n\ninterface WebViewError {\n code: number;\n description: string;\n url?: string;\n}\n\nlet NativeWebViewComponent: ReturnType<typeof requireNativeComponent<NativeWebViewProps>> | null =\n null;\nlet nativeWebViewLookupFailed = false;\n\nfunction getNativeWebView(): ReturnType<typeof requireNativeComponent<NativeWebViewProps>> | null {\n if (NativeWebViewComponent) return NativeWebViewComponent;\n if (nativeWebViewLookupFailed) return null;\n try {\n NativeWebViewComponent = requireNativeComponent<NativeWebViewProps>(\"PaywalloWebView\");\n return NativeWebViewComponent;\n } catch {\n nativeWebViewLookupFailed = true;\n return null;\n }\n}\n\nlet webViewEmitter: NativeEventEmitter | null = null;\nfunction getWebViewEmitter(): NativeEventEmitter | null {\n if (webViewEmitter) return webViewEmitter;\n // NativeModules is typed as Record<string,NativeModule|undefined> — cast needed for NativeEventEmitter\n const mod = NativeModules.PaywalloWebViewModule as (import(\"react-native\").NativeModule | undefined);\n if (!mod) return null;\n webViewEmitter = new NativeEventEmitter(mod);\n return webViewEmitter;\n}\n\nfunction parseErrorEvent(raw: Record<string, unknown>): WebViewError {\n return {\n code: typeof raw[\"code\"] === \"number\" ? raw[\"code\"] : -1,\n description: typeof raw[\"description\"] === \"string\" ? raw[\"description\"] : \"WebView error\",\n url: typeof raw[\"url\"] === \"string\" ? raw[\"url\"] : undefined,\n };\n}\n\ninterface PaywallWebViewProps {\n paywallId: string;\n craftData: string;\n products: Map<string, Product>;\n primaryProductId?: string;\n secondaryProductId?: string;\n isPurchasing: boolean;\n webUrl?: string | null;\n onPurchase: (productId: string) => void;\n onClose: () => void;\n onRestore: () => void;\n onReady?: () => void;\n onError?: (error: WebViewError) => void;\n}\n\nexport function PaywallWebView({\n paywallId,\n craftData,\n products,\n primaryProductId,\n secondaryProductId,\n isPurchasing,\n webUrl: webUrlProp,\n onPurchase,\n onClose,\n onRestore,\n onReady,\n onError,\n}: PaywallWebViewProps): React.ReactElement | null {\n const paywallDataSent = useRef(false);\n const loadEndReceived = useRef(false);\n const [scriptToInject, setScriptToInject] = useState<string | undefined>(undefined);\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const onReadyRef = useRef(onReady);\n onReadyRef.current = onReady;\n\n const NativeWebView = useMemo(() => getNativeWebView(), []);\n\n useEffect(() => {\n if (!NativeWebView) {\n onErrorRef.current?.({\n code: -1,\n description:\n \"Paywallo native module not linked. Run `pod install` (iOS) or rebuild the Android app.\",\n });\n }\n }, [NativeWebView]);\n\n const [resolvedWebUrl, setResolvedWebUrl] = useState<string | null>(\n () => webUrlProp ?? PaywalloClient.getWebUrl()\n );\n\n useEffect(() => {\n if (webUrlProp !== undefined) {\n setResolvedWebUrl(webUrlProp ?? null);\n return;\n }\n const url = PaywalloClient.getWebUrl();\n if (url) { setResolvedWebUrl(url); return; }\n const interval = setInterval(() => {\n const u = PaywalloClient.getWebUrl();\n if (u) { setResolvedWebUrl(u); clearInterval(interval); }\n }, 200);\n return () => clearInterval(interval);\n }, [webUrlProp]);\n\n useEffect(() => {\n if (!resolvedWebUrl) {\n onErrorRef.current?.({\n code: -1,\n description: \"Paywall URL not configured. SDK may not be initialized.\",\n });\n }\n }, []);\n\n const buildAndSetInjectionScript = useCallback(() => {\n if (!craftData || paywallDataSent.current) return;\n paywallDataSent.current = true;\n const script = buildPaywallInjectionScript({\n craftData,\n products: Array.from(products.values()),\n primaryProductId,\n secondaryProductId,\n });\n setScriptToInject(script);\n }, [craftData, products, primaryProductId, secondaryProductId]);\n\n const processedIdsRef = useRef<Set<string>>(new Set());\n const dedupeTimersRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n\n useEffect(() => {\n return () => {\n for (const timerId of dedupeTimersRef.current.values()) clearTimeout(timerId);\n dedupeTimersRef.current.clear();\n processedIdsRef.current.clear();\n };\n }, []);\n\n const handleParsedMessage = useCallback(\n (message: WebViewMessage) => {\n const msgId = deriveMessageId(message);\n if (processedIdsRef.current.has(msgId)) return;\n processedIdsRef.current.add(msgId);\n const timerId = setTimeout(() => {\n processedIdsRef.current.delete(msgId);\n dedupeTimersRef.current.delete(msgId);\n }, 5_000);\n dedupeTimersRef.current.set(msgId, timerId);\n\n switch (message.type) {\n case \"ready\":\n if (!paywallDataSent.current) {\n buildAndSetInjectionScript();\n } else {\n onReadyRef.current?.();\n }\n break;\n case \"purchase\":\n if (message.payload?.productId) onPurchase(message.payload.productId);\n break;\n case \"close\":\n onClose();\n break;\n case \"restore\":\n onRestore();\n break;\n case \"open-url\":\n if (message.payload?.url) {\n const url = message.payload.url;\n // Allow safe external schemes — https/http for web links, mailto for contact\n // links in paywall content, and platform store deep-links (itms-apps on iOS,\n // market: on Android). Everything else is dropped.\n if (\n /^https?:\\/\\//i.test(url) ||\n /^mailto:/i.test(url) ||\n /^itms-apps:/i.test(url) ||\n /^market:/i.test(url)\n ) {\n void Linking.openURL(url);\n }\n }\n break;\n }\n },\n [buildAndSetInjectionScript, onPurchase, onClose, onRestore]\n );\n\n useEffect(() => {\n const emitter = getWebViewEmitter();\n if (!emitter) return;\n\n const loadEndSub = emitter.addListener(\"PaywalloWebViewLoadEnd\", () => {\n if (!loadEndReceived.current) {\n loadEndReceived.current = true;\n buildAndSetInjectionScript();\n }\n });\n\n const messageSub = emitter.addListener(\"PaywalloWebViewMessage\", (event: { data: string }) => {\n const message = parseWebViewMessage(event.data);\n if (message) handleParsedMessage(message);\n });\n\n const errorSub = emitter.addListener(\n \"PaywalloWebViewError\",\n (event: Record<string, unknown>) => {\n onErrorRef.current?.(parseErrorEvent(event));\n }\n );\n\n return () => {\n loadEndSub.remove();\n messageSub.remove();\n errorSub.remove();\n };\n }, [buildAndSetInjectionScript, handleParsedMessage]);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n if (!paywallDataSent.current) {\n onErrorRef.current?.({\n code: -1001,\n description: \"Paywall load timed out after 10 seconds\",\n });\n }\n }, 10_000);\n\n return () => clearTimeout(timer);\n }, []);\n\n const handleLoadEnd = useCallback(() => {\n if (!loadEndReceived.current) {\n loadEndReceived.current = true;\n buildAndSetInjectionScript();\n }\n }, [buildAndSetInjectionScript]);\n\n const handleNativeError = useCallback((event: { nativeEvent: Record<string, unknown> }) => {\n const ne = event.nativeEvent;\n let errorData: Record<string, unknown>;\n if (ne[\"payload\"] && typeof ne[\"payload\"] === \"object\") {\n errorData = ne[\"payload\"] as Record<string, unknown>;\n } else if (typeof ne[\"data\"] === \"string\") {\n try {\n errorData = JSON.parse(ne[\"data\"]) as Record<string, unknown>;\n } catch {\n errorData = {};\n }\n } else {\n errorData = {};\n }\n onErrorRef.current?.(parseErrorEvent(errorData));\n }, []);\n\n const handleMessage = useCallback(\n (event: { nativeEvent: { data: string } }) => {\n const message = parseWebViewMessage(event.nativeEvent.data);\n if (message) handleParsedMessage(message);\n },\n [handleParsedMessage]\n );\n\n useEffect(() => {\n if (!paywallDataSent.current) return;\n setScriptToInject(buildPurchaseStateScript(isPurchasing));\n }, [isPurchasing]);\n\n if (!resolvedWebUrl || !NativeWebView) return null;\n\n const paywallUrl = `${resolvedWebUrl}/paywall/${paywallId}`;\n\n return (\n <View style={styles.container}>\n <NativeWebView\n sourceUrl={paywallUrl}\n injectedJavaScript={scriptToInject}\n onMessage={handleMessage}\n onLoadEnd={handleLoadEnd}\n onError={handleNativeError}\n style={styles.webview}\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: { flex: 1 },\n webview: { flex: 1, backgroundColor: \"transparent\" },\n});\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class PurchaseError extends PaywalloError {\n readonly userCancelled: boolean;\n /**\n * Populated when this error stems from an HTTP response (e.g. server\n * validation rejected the receipt). Lets callers distinguish a permanent\n * 4xx (drop + finishTransaction) from a transport-level failure that\n * should be retried via the offline queue.\n */\n readonly httpStatus?: number;\n\n constructor(code: string, message: string, userCancelled = false, httpStatus?: number) {\n super(\"purchase\", code, message);\n this.name = \"PurchaseError\";\n this.userCancelled = userCancelled;\n this.httpStatus = httpStatus;\n }\n}\n\nexport const PURCHASE_ERROR_CODES = {\n NOT_INITIALIZED: \"PURCHASE_NOT_INITIALIZED\",\n PRODUCT_NOT_FOUND: \"PRODUCT_NOT_FOUND\",\n PURCHASE_FAILED: \"PURCHASE_FAILED\",\n RESTORE_FAILED: \"RESTORE_FAILED\",\n VALIDATION_FAILED: \"VALIDATION_FAILED\",\n USER_CANCELLED: \"USER_CANCELLED\",\n NETWORK_ERROR: \"PURCHASE_NETWORK_ERROR\",\n STORE_ERROR: \"PURCHASE_STORE_ERROR\",\n PENDING_PURCHASE: \"PURCHASE_PENDING\",\n DEFERRED_PURCHASE: \"PURCHASE_DEFERRED\",\n STORE_NOT_AVAILABLE: \"PURCHASE_STORE_NOT_AVAILABLE\",\n} as const;\n\nconst DEFAULT_MESSAGES: Record<keyof typeof PURCHASE_ERROR_CODES, string> = {\n NOT_INITIALIZED: \"Purchase controller not initialized. Call init() first.\",\n PRODUCT_NOT_FOUND: \"Product not found in store.\",\n PURCHASE_FAILED: \"Purchase failed. Please try again.\",\n RESTORE_FAILED: \"Failed to restore purchases. Please try again.\",\n VALIDATION_FAILED: \"Failed to validate purchase with server.\",\n USER_CANCELLED: \"Purchase was cancelled.\",\n NETWORK_ERROR: \"Network error. Please check your connection.\",\n STORE_ERROR: \"Store error. Please try again later.\",\n PENDING_PURCHASE: \"Purchase is pending approval.\",\n DEFERRED_PURCHASE: \"Purchase is deferred (e.g., parental approval required).\",\n STORE_NOT_AVAILABLE: \"In-app purchases are not available on this device.\",\n};\n\nexport function createPurchaseError(\n code: keyof typeof PURCHASE_ERROR_CODES,\n message?: string\n): PurchaseError {\n return new PurchaseError(\n PURCHASE_ERROR_CODES[code],\n message ?? DEFAULT_MESSAGES[code] ?? \"Unknown purchase error\",\n code === \"USER_CANCELLED\"\n );\n}\n","import { NativeEventEmitter, NativeModules, Platform } from \"react-native\";\n\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport type { Product, Purchase } from \"../../types/purchase\";\nimport { isValidUUIDv4 } from \"../../utils/uuid\";\nimport { identityManager } from \"../identity/IdentityManager\";\n\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"./PurchaseError\";\n\ninterface NativeStoreKitModule {\n getProducts(productIds: string[]): Promise<NativeProduct[]>;\n purchase(productId: string, appAccountToken: string | null): Promise<NativePurchaseResult | null>;\n finishTransaction(transactionId: string): Promise<void>;\n getActiveTransactions(): Promise<NativePurchaseResult[]>;\n // NativeEventEmitter handshake — iOS uses RCTEventEmitter, Android exposes\n // no-op stubs. Optional on the TS side so mocks don't need them.\n addListener?(eventName: string): void;\n removeListeners?(count: number): void;\n}\n\n/**\n * Event payload emitted by the native module whenever StoreKit 2\n * (`Transaction.updates`) or Google Play Billing (`onPurchasesUpdated` +\n * refund diff) detects a renewal, refund, or cancellation.\n */\nexport interface NativeTransactionUpdate {\n type: \"renewed\" | \"refunded\" | \"canceled\";\n transactionId: string;\n productId: string;\n amount?: number;\n currency?: string;\n}\n\nexport type TransactionUpdateListener = (update: NativeTransactionUpdate) => void;\n\nexport interface TransactionUpdateSubscription {\n remove(): void;\n}\n\nconst TRANSACTION_UPDATE_EVENT = \"PaywalloTransactionUpdate\";\n\ninterface NativeProduct {\n productId: string;\n title: string;\n description: string;\n price: string;\n priceValue: number;\n currency: string;\n localizedPrice: string;\n type: string;\n subscriptionPeriod?: string;\n introductoryPrice?: string;\n introductoryPriceValue?: number;\n freeTrialPeriod?: string;\n}\n\ninterface NativePurchaseResult {\n transactionId: string;\n productId: string;\n receipt: string;\n transactionDate: number;\n pending?: boolean;\n}\n\nconst PaywalloStoreKitNative: NativeStoreKitModule | null =\n (NativeModules.PaywalloStoreKit as NativeStoreKitModule | undefined) ?? null;\n\nfunction isAvailable(): boolean {\n return PaywalloStoreKitNative != null;\n}\n\nfunction mapNativeProduct(native: NativeProduct): Product {\n const product: Product = {\n productId: native.productId,\n title: native.title,\n description: native.description,\n price: native.price,\n priceValue: native.priceValue,\n currency: native.currency ?? \"USD\",\n localizedPrice: native.localizedPrice,\n type: mapProductType(native.type),\n subscriptionPeriod: native.subscriptionPeriod,\n introductoryPrice: native.introductoryPrice,\n introductoryPriceValue: native.introductoryPriceValue,\n freeTrialPeriod: native.freeTrialPeriod,\n };\n\n if (native.subscriptionPeriod) {\n const prices = calculatePerPeriodPrices(native.priceValue, native.subscriptionPeriod);\n product.pricePerMonth = prices.perMonth;\n product.pricePerWeek = prices.perWeek;\n product.pricePerDay = prices.perDay;\n }\n\n return product;\n}\n\nfunction mapProductType(type: string): Product[\"type\"] {\n switch (type) {\n case \"subscription\":\n case \"autoRenewable\":\n return \"subscription\";\n case \"consumable\":\n return \"consumable\";\n default:\n return \"non_consumable\";\n }\n}\n\nfunction calculatePerPeriodPrices(\n priceValue: number,\n period: string\n): { perMonth?: string; perWeek?: string; perDay?: string } {\n const totalDays = periodToDays(period);\n if (totalDays <= 0) return {};\n\n const perDay = priceValue / totalDays;\n const perWeek = perDay * 7;\n const perMonth = perDay * 30;\n\n return {\n perDay: perDay.toFixed(2),\n perWeek: perWeek.toFixed(2),\n perMonth: perMonth.toFixed(2),\n };\n}\n\nfunction periodToDays(period: string): number {\n const match = period.match(/^P(\\d+)([DWMY])$/);\n if (!match) return 0;\n\n const value = parseInt(match[1], 10);\n switch (match[2]) {\n case \"D\":\n return value;\n case \"W\":\n return value * 7;\n case \"M\":\n return value * 30;\n case \"Y\":\n return value * 365;\n default:\n return 0;\n }\n}\n\nfunction mapNativePurchase(native: NativePurchaseResult): Purchase {\n return {\n productId: native.productId,\n transactionId: native.transactionId,\n transactionDate: native.transactionDate,\n receipt: native.receipt,\n platform: Platform.OS as \"ios\" | \"android\",\n };\n}\n\nexport const nativeStoreKit = {\n isAvailable,\n\n async getProducts(productIds: string[]): Promise<Product[]> {\n if (!PaywalloStoreKitNative) {\n return [];\n }\n const nativeProducts = await PaywalloStoreKitNative.getProducts(productIds);\n return nativeProducts.map(mapNativeProduct);\n },\n\n async purchase(productId: string): Promise<Purchase | null> {\n if (!PaywalloStoreKitNative) {\n throw new PurchaseError(\n PURCHASE_ERROR_CODES.STORE_NOT_AVAILABLE,\n \"StoreKit native module not available\"\n );\n }\n const distinctId = identityManager.getDistinctId();\n // StoreKit2 silently rejects `appAccountToken` that isn't a strict UUID v4\n // (root cause of orphan subscriptions with `app_user_id=NULL`). Pass null\n // when invalid — backend deduplicates by transaction_id + device_id.\n // Android V2 prefixes distinctId with `$paywallo_anon:` — strip before validating.\n const rawUuid = distinctId?.startsWith(\"$paywallo_anon:\") ? distinctId.slice(\"$paywallo_anon:\".length) : distinctId;\n const appAccountToken = isValidUUIDv4(rawUuid) ? rawUuid : null;\n if (distinctId && appAccountToken === null) {\n if (PaywalloClient.getConfig()?.debug) console.log(\"[Paywallo] distinctId is not a valid UUID v4 — passing null to appAccountToken:\", distinctId);\n }\n try {\n const result = await PaywalloStoreKitNative.purchase(productId, appAccountToken);\n if (!result || result.pending) {\n return null;\n }\n return mapNativePurchase(result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (message.toLowerCase().includes(\"cancel\")) {\n throw new PurchaseError(PURCHASE_ERROR_CODES.USER_CANCELLED, message, true);\n }\n throw new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, message);\n }\n },\n\n async finishTransaction(transactionId: string): Promise<void> {\n if (!PaywalloStoreKitNative) return;\n try {\n await PaywalloStoreKitNative.finishTransaction(transactionId);\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] finishTransaction native error\", err);\n }\n },\n\n async getActiveTransactions(): Promise<Purchase[]> {\n if (!PaywalloStoreKitNative) return [];\n try {\n const results = await PaywalloStoreKitNative.getActiveTransactions();\n return results.map(mapNativePurchase);\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] getActiveTransactions failed\", err);\n return [];\n }\n },\n\n /**\n * Subscribes to native transaction update events (renewals, refunds,\n * cancellations) from StoreKit 2 (`Transaction.updates`) on iOS or\n * `PurchasesUpdatedListener` + refund diff on Android.\n *\n * Returns a subscription with a `remove()` method. The caller is\n * responsible for cleanup (typically on `Paywallo.reset()`).\n *\n * Returns `null` when the native module isn't available (non-mobile env,\n * native module not linked) — callers should treat null as a no-op.\n */\n subscribeToTransactionUpdates(\n listener: TransactionUpdateListener\n ): TransactionUpdateSubscription | null {\n if (!PaywalloStoreKitNative) return null;\n try {\n // React Native's NativeEventEmitter constructor accepts the native\n // module instance on iOS (required) and undefined on Android. We\n // always pass it when available — the native module implements the\n // required `addListener`/`removeListeners` stubs on both platforms.\n const EmitterCtor = NativeEventEmitter as unknown as new (\n nativeModule?: unknown\n ) => { addListener: (eventType: string, cb: (payload: unknown) => void) => { remove: () => void } };\n const emitter = new EmitterCtor(PaywalloStoreKitNative);\n const sub = emitter.addListener(TRANSACTION_UPDATE_EVENT, (payload: unknown) => {\n const update = normalizeTransactionUpdate(payload);\n if (update) listener(update);\n });\n return { remove: () => sub.remove() };\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.log(\"[Paywallo] subscribeToTransactionUpdates failed\", err);\n return null;\n }\n },\n};\n\nfunction normalizeTransactionUpdate(raw: unknown): NativeTransactionUpdate | null {\n if (!raw || typeof raw !== \"object\") return null;\n const r = raw as Record<string, unknown>;\n const type = r.type;\n if (type !== \"renewed\" && type !== \"refunded\" && type !== \"canceled\") return null;\n const transactionId = typeof r.transactionId === \"string\" ? r.transactionId : null;\n const productId = typeof r.productId === \"string\" ? r.productId : null;\n if (!transactionId) return null;\n const update: NativeTransactionUpdate = {\n type,\n transactionId,\n productId: productId ?? \"\",\n };\n if (typeof r.amount === \"number\") update.amount = r.amount;\n if (typeof r.currency === \"string\") update.currency = r.currency;\n return update;\n}\n\n/** @deprecated Use `nativeStoreKit` (camelCase) */\nexport const NativeStoreKit = nativeStoreKit;\n","import { ApiClient } from \"../../core/ApiClient\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport type { Product, Purchase } from \"../../types/purchase\";\n\nimport {\n nativeStoreKit as NativeStoreKit,\n type NativeTransactionUpdate,\n type TransactionUpdateSubscription,\n} from \"./NativeStoreKit\";\n\n/**\n * Handles emitting transaction events to the analytics pipeline and manages\n * the native transaction update listener lifecycle.\n */\nexport class IAPTransactionEmitter {\n private transactionUpdateSubscription: TransactionUpdateSubscription | null = null;\n\n constructor(\n private readonly getProductFromCache: (productId: string) => Product | undefined,\n private readonly getApiClientFn: () => ApiClient | null,\n private readonly getDebug: () => boolean,\n ) {}\n\n /**\n * Emits `transaction {type: \"completed\"}` after a server-validated purchase.\n * Fire-and-forget — a tracking failure must never poison the purchase flow.\n */\n async emitTransactionCompleted(\n purchase: Purchase,\n productId: string,\n options?: { paywallId?: string; variantId?: string },\n ): Promise<void> {\n try {\n const apiClient = this.getApiClientFn();\n if (!apiClient) return;\n const distinctId = PaywalloClient.getDistinctId();\n if (!distinctId) return;\n\n const product = this.getProductFromCache(productId);\n const properties: Record<string, string | number | boolean | null> = {\n type: \"completed\",\n tx_id: purchase.transactionId,\n product_id: purchase.productId,\n };\n if (product?.priceValue !== undefined && product.priceValue > 0) {\n properties.amount = product.priceValue;\n }\n if (product?.currency) {\n properties.currency = product.currency;\n }\n if (options?.paywallId) properties.paywall_id = options.paywallId;\n if (options?.variantId) properties.variant_id = options.variantId;\n\n await apiClient.trackEvent(\"transaction\", distinctId, properties, undefined, { priority: \"critical\" });\n } catch (err) {\n if (this.getDebug()) console.log(\"[Paywallo PURCHASE] transaction event emission failed\", err);\n }\n }\n\n /**\n * Forwards a native transaction update to the EventBatcher.\n * Public so tests can exercise the wiring without a fake NativeEventEmitter.\n */\n async emitTransactionUpdate(update: NativeTransactionUpdate): Promise<void> {\n try {\n const apiClient = this.getApiClientFn() ?? PaywalloClient.getApiClient();\n if (!apiClient) {\n if (this.getDebug()) console.log(\"[Paywallo IAP] transaction update dropped (no apiClient)\", update.type);\n return;\n }\n const distinctId = PaywalloClient.getDistinctId();\n if (!distinctId) {\n if (this.getDebug()) console.log(\"[Paywallo IAP] transaction update dropped (no distinctId)\", update.type);\n return;\n }\n\n const properties: Record<string, string | number | boolean | null> = {\n type: update.type,\n tx_id: update.transactionId,\n product_id: update.productId,\n };\n\n if (update.type !== \"canceled\") {\n const cached = this.getProductFromCache(update.productId);\n const amount = update.amount ?? cached?.priceValue;\n const currency = update.currency ?? cached?.currency;\n if (typeof amount === \"number\" && amount > 0) properties.amount = amount;\n if (currency) properties.currency = currency;\n }\n\n await apiClient.trackEvent(\"transaction\", distinctId, properties, undefined, { priority: \"critical\" });\n if (this.getDebug()) console.log(`[Paywallo IAP] emitted transaction {${update.type}}`, update.transactionId);\n } catch (err) {\n if (this.getDebug()) console.log(\"[Paywallo IAP] transaction update emission failed\", err);\n }\n }\n\n /**\n * Starts listening to native Transaction.updates. Idempotent.\n */\n startListener(): void {\n if (this.transactionUpdateSubscription) return;\n this.transactionUpdateSubscription = NativeStoreKit.subscribeToTransactionUpdates(\n (update) => { void this.emitTransactionUpdate(update); },\n );\n if (this.getDebug() && this.transactionUpdateSubscription) {\n console.log(\"[Paywallo IAP] transaction update listener started\");\n }\n }\n\n /**\n * Removes the native listener. Safe to call multiple times.\n */\n stopListener(): void {\n if (!this.transactionUpdateSubscription) return;\n try {\n this.transactionUpdateSubscription.remove();\n } catch (err) {\n if (this.getDebug()) console.log(\"[Paywallo IAP] transaction listener removal failed\", err);\n }\n this.transactionUpdateSubscription = null;\n if (this.getDebug()) console.log(\"[Paywallo IAP] transaction update listener stopped\");\n }\n}\n","import { PaywalloError } from \"./PaywalloError\";\n\nexport class ClientError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"client\", code, message);\n this.name = \"ClientError\";\n }\n}\n\nexport const CLIENT_ERROR_CODES = {\n NOT_INITIALIZED: \"CLIENT_NOT_INITIALIZED\",\n MISSING_APP_KEY: \"CLIENT_MISSING_APP_KEY\",\n INVALID_EVENT_NAME: \"CLIENT_INVALID_EVENT_NAME\",\n PROVIDER_MISSING: \"CLIENT_PROVIDER_MISSING\",\n INSECURE_REQUEST: \"CLIENT_INSECURE_REQUEST\",\n UNKNOWN: \"CLIENT_UNKNOWN\",\n} as const;\n","import type { QueueItem } from \"./types\";\n\nexport function normalizeForComparison(obj: unknown): string {\n if (obj === null || obj === undefined) {\n return String(obj);\n }\n\n if (typeof obj !== \"object\") {\n return JSON.stringify(obj);\n }\n\n if (Array.isArray(obj)) {\n return \"[\" + obj.map((item) => normalizeForComparison(item)).join(\",\") + \"]\";\n }\n\n const sortedKeys = Object.keys(obj as Record<string, unknown>).sort();\n const pairs = sortedKeys.map((key) => {\n const value = (obj as Record<string, unknown>)[key];\n return `${JSON.stringify(key)}:${normalizeForComparison(value)}`;\n });\n return \"{\" + pairs.join(\",\") + \"}\";\n}\n\nexport function findDuplicateIndex(queue: QueueItem[], item: QueueItem): number {\n const byId = queue.findIndex((existing) => existing.id === item.id);\n if (byId !== -1) return byId;\n\n const normalizedBody = normalizeForComparison(item.body);\n return queue.findIndex(\n (existing) =>\n existing.url === item.url && normalizeForComparison(existing.body) === normalizedBody\n );\n}\n","import { nativeStorage } from \"../storage/NativeStorage\";\n\nimport type { QueueItem } from \"./types\";\n\n/**\n * Read an array of `QueueItem` from a storage key. Returns an empty array\n * for missing keys, malformed JSON, or non-array payloads — callers never\n * see a parse exception, just an empty fallback.\n */\nexport async function readQueueItems(key: string): Promise<QueueItem[]> {\n try {\n const stored = await nativeStorage.get(key);\n if (!stored) return [];\n const parsed: unknown = JSON.parse(stored);\n if (!Array.isArray(parsed)) return [];\n return parsed as QueueItem[];\n } catch {\n return [];\n }\n}\n\n/**\n * Append an item to the pre-write journal. Deduplicates by `id` so repeated\n * enqueues of the same stable id don't bloat the journal between snapshots.\n *\n * This is the durable write that MUST precede any network attempt — the\n * in-memory queue mutation and the main snapshot write both happen AFTER\n * this resolves. A crash anywhere after this call returns leaves the item\n * recoverable on the next cold start via {@link mergeJournalIntoMain}.\n *\n * Errors are swallowed (not thrown) — the caller is already mid-enqueue and\n * should proceed with the in-memory mutation even if the journal write\n * couldn't be persisted. The main snapshot is still attempted on the\n * subsequent save, so durability is best-effort when storage is flaky.\n */\nexport async function appendToJournal(\n journalKey: string,\n item: QueueItem,\n onError?: (err: unknown) => void,\n): Promise<void> {\n try {\n const existing = await readQueueItems(journalKey);\n const next = existing.filter((e) => e.id !== item.id);\n next.push(item);\n await nativeStorage.set(journalKey, JSON.stringify(next));\n } catch (error) {\n onError?.(error);\n }\n}\n\nexport interface RecoveryResult {\n merged: QueueItem[];\n recovered: number;\n hadJournal: boolean;\n}\n\n/**\n * Boot-time recovery: read the main snapshot + the journal, merge them\n * (dedup by id), and return the union.\n *\n * The journal is authoritative for \"items that were enqueued but may not\n * have made it into a successful snapshot\" — merging it on boot is what\n * makes the pre-write durability guarantee hold across crashes. Callers\n * are expected to persist the merged set and clear the journal afterwards\n * (via a normal snapshot save with `preserveJournal=false`).\n */\nexport async function mergeJournalIntoMain(\n mainKey: string,\n journalKey: string,\n): Promise<RecoveryResult> {\n const main = await readQueueItems(mainKey);\n const journal = await readQueueItems(journalKey);\n\n if (journal.length === 0) {\n return { merged: main, recovered: 0, hadJournal: false };\n }\n\n const merged: QueueItem[] = [...main];\n let recovered = 0;\n for (const item of journal) {\n const existing = merged.findIndex((q) => q.id === item.id);\n if (existing === -1) {\n merged.push(item);\n recovered++;\n }\n }\n\n return { merged, recovered, hadJournal: true };\n}\n\n/**\n * Split a queue into \"kept\" (not yet expired) and \"expired\" (past `maxAge`)\n * buckets based on each item's `timestamp`. Pure function — the caller\n * decides what to emit and when to persist.\n */\nexport function partitionExpired(\n queue: QueueItem[],\n maxAge: number,\n now: number = Date.now(),\n): { kept: QueueItem[]; expired: QueueItem[] } {\n const kept: QueueItem[] = [];\n const expired: QueueItem[] = [];\n for (const item of queue) {\n if (now - item.timestamp < maxAge) kept.push(item);\n else expired.push(item);\n }\n return { kept, expired };\n}\n\n/**\n * Pick the index of the queue entry to evict when the queue hits capacity.\n *\n * Rules, in order:\n * 1. Prefer non-critical items. Critical entries are only evicted when\n * every item in the queue is critical.\n * 2. Within the preferred pool, evict the item with the most attempts\n * (closest to permanent failure).\n * 3. Tiebreak by oldest timestamp (FIFO-ish retention).\n */\nexport function pickEvictionIndex(queue: QueueItem[]): number {\n const normal: number[] = [];\n const critical: number[] = [];\n for (let i = 0; i < queue.length; i++) {\n if (queue[i].priority === \"critical\") critical.push(i);\n else normal.push(i);\n }\n const pool = normal.length > 0 ? normal : critical;\n\n let evictIndex = pool[0];\n for (let k = 1; k < pool.length; k++) {\n const i = pool[k];\n const candidate = queue[i];\n const current = queue[evictIndex];\n if (\n candidate.attempts > current.attempts ||\n (candidate.attempts === current.attempts && candidate.timestamp < current.timestamp)\n ) {\n evictIndex = i;\n }\n }\n return evictIndex;\n}\n","import { CLIENT_ERROR_CODES, ClientError } from \"../../errors/ClientError\";\nimport { nativeStorage } from \"../storage/NativeStorage\";\n\nimport {\n appendToJournal,\n mergeJournalIntoMain,\n partitionExpired,\n pickEvictionIndex,\n} from \"./QueueJournal\";\nimport type { OfflineQueueConfig, QueueEvent, QueueItem } from \"./types\";\n\n/**\n * Handles persistence (load, save, journal recovery, expiry cleanup) for the\n * offline queue. Emits queue events via the provided `emit` callback so the\n * parent OfflineQueue can relay them to its listeners.\n */\nexport class OfflineQueueStorage {\n constructor(\n private readonly config: OfflineQueueConfig,\n private readonly emit: (event: QueueEvent) => void,\n private readonly log: (...args: unknown[]) => void,\n ) {}\n\n async loadFromStorage(queue: QueueItem[]): Promise<QueueItem[]> {\n const { merged, recovered, hadJournal } = await mergeJournalIntoMain(\n this.config.storageKey,\n this.config.journalKey,\n );\n const result = merged;\n\n if (!hadJournal) return result;\n\n if (recovered > 0) {\n this.log(\"Recovered items from journal on cold start\", {\n recovered,\n totalSize: result.length,\n });\n }\n\n // Persist the merged snapshot + wipe the journal.\n await this.saveToStorage(result);\n this.emit({ type: \"recovery:complete\", queueSize: result.length, count: recovered });\n return result;\n }\n\n async saveToStorage(queue: QueueItem[], preserveJournal = false): Promise<boolean> {\n try {\n await nativeStorage.set(this.config.storageKey, JSON.stringify(queue));\n if (!preserveJournal) {\n await nativeStorage.set(this.config.journalKey, \"[]\");\n }\n return true;\n } catch (error) {\n this.log(\"Failed to save queue to storage\", error);\n this.emit({\n type: \"item:failed\",\n error: new ClientError(\n CLIENT_ERROR_CODES.UNKNOWN,\n \"Storage save failed - journal retained for next boot\",\n ),\n queueSize: queue.length,\n });\n return false;\n }\n }\n\n cleanupExpired(queue: QueueItem[]): QueueItem[] {\n const { kept, expired } = partitionExpired(queue, this.config.maxAge);\n if (expired.length === 0) return queue;\n\n this.log(\"Expired items dropped from queue\", {\n count: expired.length,\n reason: \"max_age\",\n maxAgeMs: this.config.maxAge,\n remaining: kept.length,\n });\n\n for (const item of expired) {\n this.emit({\n type: \"item:expired\",\n item,\n queueSize: kept.length,\n count: expired.length,\n reason: \"max_age\",\n });\n }\n\n void this.saveToStorage(kept);\n return kept;\n }\n\n async appendToJournal(item: QueueItem): Promise<void> {\n await appendToJournal(this.config.journalKey, item, (err) =>\n this.log(\"Failed to append to journal\", err),\n );\n }\n\n pickEvictionIndex(queue: QueueItem[]): number {\n return pickEvictionIndex(queue);\n }\n\n get maxItems(): number {\n return this.config.maxItems;\n }\n}\n","export type QueuePriority = \"critical\" | \"normal\";\n\nexport interface QueueItem {\n id: string;\n method: \"POST\" | \"PUT\";\n url: string;\n body: unknown;\n headers?: Record<string, string>;\n timestamp: number;\n attempts: number;\n maxAttempts: number;\n /**\n * Priority for this queue item. `\"critical\"` items are journaled to disk\n * immediately and trigger an out-of-band flush via listeners; `\"normal\"`\n * items are still journaled pre-network but coalesce into batch snapshots.\n * Optional so pre-existing serialized items (SDK ≤0.10) still load.\n */\n priority?: QueuePriority;\n /**\n * Epoch ms timestamp before which this item should NOT be retried.\n * Computed via exponential backoff after each failed attempt.\n * Absent on first attempt (item eligible immediately).\n */\n nextRetryAt?: number;\n}\n\nexport interface OfflineQueueConfig {\n maxItems: number;\n maxAge: number;\n maxAttempts: number;\n storageKey: string;\n /**\n * Storage key for the pre-write journal. New items are written here first\n * (append-only) BEFORE any network attempt so a kernel panic between\n * `enqueue` and the main snapshot save still lets us recover the item on\n * the next cold start.\n */\n journalKey: string;\n /**\n * Storage key for the dead-letter queue. Items that exhaust `maxAttempts`\n * are moved here instead of being silently dropped, enabling diagnostics\n * and manual replay.\n */\n dlqKey: string;\n /**\n * Maximum number of items retained in the DLQ. Oldest items are evicted\n * when the limit is reached (FIFO).\n */\n dlqMaxItems: number;\n /**\n * Base delay (ms) for exponential backoff on retry.\n * Delay = min(baseRetryDelayMs * 2^(attempts-1), maxRetryDelayMs).\n */\n baseRetryDelayMs: number;\n /**\n * Maximum delay cap (ms) for exponential backoff.\n */\n maxRetryDelayMs: number;\n debug: boolean;\n}\n\nexport type QueueEventType =\n | \"item:added\"\n | \"item:removed\"\n | \"item:success\"\n | \"item:failed\"\n | \"item:evicted\"\n | \"item:expired\"\n | \"processing:start\"\n | \"processing:end\"\n | \"recovery:complete\"\n | \"flush:requested\";\n\nexport interface QueueEvent {\n type: QueueEventType;\n item?: QueueItem;\n error?: Error;\n queueSize: number;\n /**\n * Populated on `item:expired` and `recovery:complete` events to surface\n * counts without forcing listeners to snapshot the queue.\n */\n count?: number;\n /**\n * Populated on `item:expired` so observability can report WHY items were\n * dropped (currently always `\"max_age\"`). Never a silent drop.\n */\n reason?: \"max_age\";\n}\n\nexport type QueueListener = (event: QueueEvent) => void;\n\nexport const DEFAULT_QUEUE_CONFIG: OfflineQueueConfig = {\n maxItems: 100,\n // 7 days — aligned with server-side analytics ingest window. Items that\n // don't make it off-device in a week are almost certainly orphaned (app\n // reinstalled, user lost network for 7+ days, etc).\n maxAge: 7 * 24 * 60 * 60 * 1000,\n maxAttempts: 5,\n storageKey: \"@paywallo:offline_queue\",\n journalKey: \"@paywallo:offline_queue:journal\",\n dlqKey: \"@paywallo:offline_queue:dlq\",\n dlqMaxItems: 50,\n // Backoff: 30s, 60s, 120s, 240s, 480s (capped)\n baseRetryDelayMs: 30_000,\n maxRetryDelayMs: 8 * 60 * 1000,\n debug: false,\n};\n","import { CLIENT_ERROR_CODES, ClientError } from \"../../errors/ClientError\";\nimport { generateUUID } from \"../../utils/uuid\";\nimport { nativeStorage } from \"../storage/NativeStorage\";\n\nimport { findDuplicateIndex } from \"./deduplication\";\nimport { OfflineQueueStorage } from \"./OfflineQueueStorage\";\nimport type {\n OfflineQueueConfig,\n QueueEvent,\n QueueItem,\n QueueListener,\n QueuePriority,\n} from \"./types\";\nimport { DEFAULT_QUEUE_CONFIG } from \"./types\";\n\n/**\n * Durable offline queue with a pre-write journal.\n *\n * Durability contract:\n * 1. `enqueue()` writes the new item to a dedicated journal key in storage\n * BEFORE any network attempt and before the item is added to the\n * in-memory queue.\n * 2. The main snapshot is written after the in-memory mutation.\n * 3. On boot, `initialize()` merges main+journal (dedup by id) and persists\n * the union.\n *\n * Persistence logic is delegated to `OfflineQueueStorage`.\n * Retention: items older than `maxAge` (default 7 days) are dropped.\n */\nclass OfflineQueueClass {\n private config: OfflineQueueConfig = DEFAULT_QUEUE_CONFIG;\n private queue: QueueItem[] = [];\n private listeners: Set<QueueListener> = new Set();\n private initialized = false;\n private processing = false;\n private processingLock = false;\n private cleanupTimer: ReturnType<typeof setInterval> | null = null;\n private storage: OfflineQueueStorage | null = null;\n\n async initialize(config?: Partial<OfflineQueueConfig>): Promise<void> {\n if (this.initialized) return;\n\n this.config = { ...DEFAULT_QUEUE_CONFIG, ...config };\n this.storage = new OfflineQueueStorage(\n this.config,\n (event) => this.emit(event),\n (...args) => this.log(...args),\n );\n\n this.queue = await this.storage.loadFromStorage(this.queue);\n this.queue = this.storage.cleanupExpired(this.queue);\n\n this.cleanupTimer = setInterval(() => {\n this.queue = this.storage!.cleanupExpired(this.queue);\n }, 60 * 60 * 1000);\n this.initialized = true;\n }\n\n async enqueue(\n method: \"POST\" | \"PUT\",\n url: string,\n body: unknown,\n headers?: Record<string, string>,\n id?: string,\n priority?: QueuePriority,\n ): Promise<QueueItem> {\n const item: QueueItem = {\n id: id ?? generateUUID(),\n method,\n url,\n body,\n headers,\n timestamp: Date.now(),\n attempts: 0,\n maxAttempts: this.config.maxAttempts,\n priority: priority ?? \"normal\",\n };\n\n await this.storage!.appendToJournal(item);\n\n const dupIndex = findDuplicateIndex(this.queue, item);\n if (dupIndex !== -1) {\n return this.mergeDuplicate(dupIndex, item);\n }\n\n if (this.queue.length >= this.storage!.maxItems) {\n const evictIndex = this.storage!.pickEvictionIndex(this.queue);\n const [removed] = this.queue.splice(evictIndex, 1);\n this.emit({ type: \"item:evicted\", item: removed, queueSize: this.queue.length });\n }\n\n this.queue.push(item);\n await this.storage!.saveToStorage(this.queue);\n this.emit({ type: \"item:added\", item, queueSize: this.queue.length });\n\n if (item.priority === \"critical\") {\n this.emit({ type: \"flush:requested\", item, queueSize: this.queue.length });\n }\n\n return item;\n }\n\n private async mergeDuplicate(existingIndex: number, item: QueueItem): Promise<QueueItem> {\n this.queue[existingIndex].timestamp = Date.now();\n if (item.priority === \"critical\") {\n this.queue[existingIndex].priority = \"critical\";\n }\n await this.storage!.saveToStorage(this.queue);\n if (this.queue[existingIndex].priority === \"critical\") {\n this.emit({\n type: \"flush:requested\",\n item: this.queue[existingIndex],\n queueSize: this.queue.length,\n });\n }\n return this.queue[existingIndex];\n }\n\n async dequeue(): Promise<QueueItem | null> {\n const item = this.queue.shift() ?? null;\n if (item) {\n await this.storage!.saveToStorage(this.queue);\n this.emit({ type: \"item:removed\", item, queueSize: this.queue.length });\n }\n return item;\n }\n\n async removeItem(id: string): Promise<boolean> {\n const index = this.queue.findIndex((item) => item.id === id);\n if (index === -1) return false;\n const [item] = this.queue.splice(index, 1);\n await this.storage!.saveToStorage(this.queue);\n this.emit({ type: \"item:removed\", item, queueSize: this.queue.length });\n return true;\n }\n\n async processQueue(\n processor: (item: QueueItem) => Promise<boolean | { success: boolean; permanent?: boolean }>,\n options?: { delayBetweenItems?: number },\n ): Promise<{ processed: number; failed: number }> {\n if (this.processingLock || this.queue.length === 0) {\n return { processed: 0, failed: 0 };\n }\n\n this.processingLock = true;\n this.processing = true;\n this.emit({ type: \"processing:start\", queueSize: this.queue.length });\n\n let processed = 0;\n let failed = 0;\n const delayMs = options?.delayBetweenItems ?? 100;\n\n const now = Date.now();\n const sortedIds = [...this.queue]\n .filter((item) => !item.nextRetryAt || item.nextRetryAt <= now)\n .sort((a, b) => (a.priority === \"critical\" ? 0 : 1) - (b.priority === \"critical\" ? 0 : 1))\n .map((item) => item.id);\n\n for (let i = 0; i < sortedIds.length; i++) {\n const item = this.queue.find((q) => q.id === sortedIds[i]);\n if (!item) continue;\n\n item.attempts++;\n try {\n const result = await processor(item);\n const success = typeof result === \"boolean\" ? result : result.success;\n const permanent = typeof result === \"object\" ? (result.permanent ?? false) : false;\n\n if (success) {\n await this.removeItem(item.id);\n processed++;\n this.emit({ type: \"item:success\", item, queueSize: this.queue.length });\n } else if (await this.handleItemFailure(item, undefined, permanent)) {\n failed++;\n }\n } catch (error) {\n const err = error instanceof Error ? error : new ClientError(CLIENT_ERROR_CODES.UNKNOWN, String(error));\n if (await this.handleItemFailure(item, err, false)) failed++;\n }\n\n if (i < sortedIds.length - 1 && delayMs > 0) await this.sleep(delayMs);\n }\n\n this.processing = false;\n this.processingLock = false;\n this.emit({ type: \"processing:end\", queueSize: this.queue.length });\n return { processed, failed };\n }\n\n private async handleItemFailure(item: QueueItem, error?: Error, permanent = false): Promise<boolean> {\n if (permanent || item.attempts >= item.maxAttempts) {\n await this.removeItem(item.id);\n await this.moveToDlq(item);\n this.emit({\n type: \"item:failed\",\n item,\n error: error ?? new ClientError(CLIENT_ERROR_CODES.UNKNOWN, permanent ? \"Permanent failure\" : \"Max attempts reached\"),\n queueSize: this.queue.length,\n });\n return true;\n }\n // Exponential backoff: delay = min(base * 2^(attempts-1), max)\n const delay = Math.min(\n this.config.baseRetryDelayMs * Math.pow(2, item.attempts - 1),\n this.config.maxRetryDelayMs,\n );\n item.nextRetryAt = Date.now() + delay;\n await this.storage!.saveToStorage(this.queue);\n return false;\n }\n\n private async moveToDlq(item: QueueItem): Promise<void> {\n try {\n const raw = await nativeStorage.get(this.config.dlqKey);\n const dlq: QueueItem[] = raw ? (JSON.parse(raw) as QueueItem[]) : [];\n dlq.push(item);\n // Evict oldest if over limit\n while (dlq.length > this.config.dlqMaxItems) {\n dlq.shift();\n }\n await nativeStorage.set(this.config.dlqKey, JSON.stringify(dlq));\n } catch {\n // DLQ persistence is best-effort — never crash the main queue\n }\n }\n\n async getDlq(): Promise<QueueItem[]> {\n try {\n const raw = await nativeStorage.get(this.config.dlqKey);\n return raw ? (JSON.parse(raw) as QueueItem[]) : [];\n } catch {\n return [];\n }\n }\n\n async clearDlq(): Promise<void> {\n try {\n await nativeStorage.set(this.config.dlqKey, \"[]\");\n } catch {\n // best-effort\n }\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n getQueue(): ReadonlyArray<QueueItem> { return [...this.queue]; }\n getSize(): number { return this.queue.length; }\n isEmpty(): boolean { return this.queue.length === 0; }\n isProcessing(): boolean { return this.processing; }\n\n async clear(): Promise<void> {\n this.queue = [];\n await this.storage!.saveToStorage(this.queue);\n }\n\n async clearItemsWithInvalidAppKey(validAppKey: string): Promise<number> {\n const before = this.queue.length;\n this.queue = this.queue.filter((item) => {\n const itemAppKey = item.headers?.[\"X-App-Key\"];\n return itemAppKey === validAppKey || !itemAppKey;\n });\n const removed = before - this.queue.length;\n if (removed > 0) await this.storage!.saveToStorage(this.queue);\n return removed;\n }\n\n addListener(listener: QueueListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n removeListener(listener: QueueListener): void {\n this.listeners.delete(listener);\n }\n\n private emit(event: QueueEvent): void {\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch (error) {\n this.log(\"Listener error\", error);\n }\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) console.log(\"[Paywallo:Queue]\", ...args);\n }\n\n setDebug(debug: boolean): void { this.config.debug = debug; }\n\n dispose(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n this.listeners.clear();\n this.queue = [];\n this.initialized = false;\n this.processing = false;\n this.processingLock = false;\n }\n}\n\nexport const offlineQueue = new OfflineQueueClass();\n/** @deprecated Use `offlineQueue` (camelCase) */\nexport const OfflineQueue = offlineQueue;\n","export type NetworkState = \"online\" | \"offline\" | \"unknown\";\n\nexport type NetworkListener = (state: NetworkState) => void;\n\nexport interface NetworkMonitorConfig {\n debug: boolean;\n checkInterval: number;\n checkUrl: string;\n}\n\nexport const DEFAULT_NETWORK_CONFIG: NetworkMonitorConfig = {\n debug: false,\n checkInterval: 30000,\n checkUrl: \"https://clients3.google.com/generate_204\",\n};\n","import { AppState, AppStateStatus } from \"react-native\";\n\nimport type { NetworkListener, NetworkMonitorConfig, NetworkState } from \"./types\";\nimport { DEFAULT_NETWORK_CONFIG } from \"./types\";\n\nclass NetworkMonitorClass {\n private config: NetworkMonitorConfig = DEFAULT_NETWORK_CONFIG;\n private listeners: Set<NetworkListener> = new Set();\n private currentState: NetworkState = \"unknown\";\n private appStateSubscription: ReturnType<typeof AppState.addEventListener> | null = null;\n private initialized = false;\n private checkIntervalId: ReturnType<typeof setInterval> | null = null;\n\n async initialize(config?: Partial<NetworkMonitorConfig>): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n this.config = { ...DEFAULT_NETWORK_CONFIG, ...config };\n\n this.currentState = \"unknown\";\n this.initialized = true;\n\n this.log(\"Initialized (state: unknown, awaiting first connectivity check)\");\n\n void this.setupFallbackDetection();\n this.setupAppStateListener();\n }\n\n private async setupFallbackDetection(): Promise<void> {\n await this.checkConnectivity();\n\n this.checkIntervalId = setInterval(() => {\n void this.checkConnectivity();\n }, this.config.checkInterval);\n }\n\n private setupAppStateListener(): void {\n this.appStateSubscription = AppState.addEventListener(\"change\", (state: AppStateStatus) => {\n if (state === \"active\") {\n // Resume polling and check immediately on foreground.\n if (!this.checkIntervalId) {\n this.checkIntervalId = setInterval(() => {\n void this.checkConnectivity();\n }, this.config.checkInterval);\n }\n void this.checkConnectivity();\n } else if (state === \"background\" || state === \"inactive\") {\n // Pause polling to avoid background battery drain.\n if (this.checkIntervalId) {\n clearInterval(this.checkIntervalId);\n this.checkIntervalId = null;\n }\n }\n });\n }\n\n private async checkConnectivity(): Promise<void> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000);\n\n const response = await fetch(this.config.checkUrl, {\n method: \"HEAD\",\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n this.updateState(response.ok ? \"online\" : \"offline\");\n } catch {\n this.updateState(\"offline\");\n }\n }\n\n private updateState(newState: NetworkState): void {\n const previousState = this.currentState;\n if (previousState === newState) {\n return;\n }\n\n this.currentState = newState;\n this.log(\"Network state changed\", { from: previousState, to: newState });\n this.notifyListeners(newState);\n }\n\n private notifyListeners(state: NetworkState): void {\n for (const listener of this.listeners) {\n try {\n listener(state);\n } catch (error) {\n this.log(\"Listener error\", error);\n }\n }\n }\n\n isOnline(): boolean {\n if (!this.initialized || this.currentState === \"unknown\") {\n return true;\n }\n return this.currentState === \"online\";\n }\n\n getState(): NetworkState {\n return this.currentState;\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n addListener(listener: NetworkListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n removeListener(listener: NetworkListener): void {\n this.listeners.delete(listener);\n }\n\n async forceCheck(): Promise<NetworkState> {\n await this.checkConnectivity();\n return this.currentState;\n }\n\n dispose(): void {\n if (this.appStateSubscription) {\n this.appStateSubscription.remove();\n this.appStateSubscription = null;\n }\n\n if (this.checkIntervalId) {\n clearInterval(this.checkIntervalId);\n this.checkIntervalId = null;\n }\n\n this.listeners.clear();\n this.initialized = false;\n this.currentState = \"unknown\";\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) console.log(\"[Paywallo:Network]\", ...args);\n }\n\n setDebug(debug: boolean): void {\n this.config.debug = debug;\n }\n}\n\nexport const networkMonitor = new NetworkMonitorClass();\n/** @deprecated Use `networkMonitor` (camelCase) */\nexport const NetworkMonitor = networkMonitor;\n","export { networkMonitor } from \"./NetworkMonitor\";\nexport type { NetworkListener, NetworkMonitorConfig, NetworkState } from \"./types\";\nexport { DEFAULT_NETWORK_CONFIG } from \"./types\";\n","import { HttpClient } from \"../http\";\nimport { networkMonitor, type NetworkState } from \"../network\";\n\nimport { offlineQueue } from \"./OfflineQueue\";\nimport type { QueueItem } from \"./types\";\n\ninterface QueueItemResult {\n success: boolean;\n permanent?: boolean;\n status?: number;\n}\n\nexport interface QueueProcessorConfig {\n debounceMs: number;\n debug: boolean;\n /**\n * Lazy getter for headers that must be fresh at flush time (e.g. `X-App-Key`).\n * Called just before each batch/item HTTP request — not at enqueue time.\n * Avoids stale headers when the app key changes after the item was queued.\n */\n getFreshHeaders?: () => Record<string, string>;\n}\n\nconst DEFAULT_PROCESSOR_CONFIG: QueueProcessorConfig = {\n debounceMs: 2000,\n debug: false,\n};\n\nclass QueueProcessorClass {\n private config: QueueProcessorConfig = DEFAULT_PROCESSOR_CONFIG;\n private httpClient: HttpClient | null = null;\n private networkUnsubscribe: (() => void) | null = null;\n private queueUnsubscribe: (() => void) | null = null;\n private debounceTimeout: ReturnType<typeof setTimeout> | null = null;\n private retryIntervalId: ReturnType<typeof setInterval> | null = null;\n private initialized = false;\n\n initialize(httpClient: HttpClient, config?: Partial<QueueProcessorConfig>): void {\n if (this.initialized) {\n return;\n }\n\n this.httpClient = httpClient;\n this.config = { ...DEFAULT_PROCESSOR_CONFIG, ...config };\n\n this.networkUnsubscribe = networkMonitor.addListener((state: NetworkState) => {\n if (state === \"online\") {\n this.scheduleProcessing();\n }\n });\n\n // Critical items emit `flush:requested` from OfflineQueue. Bypass the\n // debounce window and drain immediately if we're online — matches the\n // EventBatcher \"critical → next microtask flush\" contract for items\n // that had to fall through to the offline queue.\n this.queueUnsubscribe = offlineQueue.addListener((event) => {\n if (event.type === \"flush:requested\" && networkMonitor.isOnline()) {\n void this.processQueue();\n }\n });\n\n if (networkMonitor.isOnline() && !offlineQueue.isEmpty()) {\n this.scheduleProcessing();\n }\n\n this.retryIntervalId = setInterval(() => {\n if (networkMonitor.isOnline() && !offlineQueue.isEmpty()) {\n this.scheduleProcessing();\n }\n }, 60000);\n\n this.initialized = true;\n this.log(\"QueueProcessor initialized\");\n }\n\n private scheduleProcessing(): void {\n if (this.debounceTimeout) {\n clearTimeout(this.debounceTimeout);\n }\n\n this.debounceTimeout = setTimeout(() => {\n void this.processQueue();\n }, this.config.debounceMs);\n }\n\n async processQueue(): Promise<{ processed: number; failed: number }> {\n if (!this.httpClient) {\n this.log(\"HttpClient not initialized\");\n return { processed: 0, failed: 0 };\n }\n\n if (!networkMonitor.isOnline()) {\n this.log(\"Offline, skipping queue processing\");\n return { processed: 0, failed: 0 };\n }\n\n const allItems = offlineQueue.getQueue();\n const eventItems = allItems.filter(\n (i) => (i.url.includes(\"/events\") || i.url.includes(\"/ingest\")) && !i.url.includes(\"/batch\")\n );\n const eventItemIds = new Set(eventItems.map((i) => i.id));\n\n const { processed: batchProcessed, failed: batchFailed, retryIds } =\n await this.processEventBatches(eventItems);\n\n const batchResult = { processed: batchProcessed, failed: batchFailed };\n\n const individualResult = await offlineQueue.processQueue(async (item: QueueItem) => {\n if (eventItemIds.has(item.id)) {\n // This event item was handled by batch processing.\n // If it's in retryIds, it failed with 5xx and should stay in queue for next cycle.\n // Return success=false, permanent=false to keep it and increment attempts.\n // If it was already removed (success/4xx), processQueue won't see it — so this\n // branch only executes for 5xx items still in the queue.\n if (retryIds.has(item.id)) {\n return { success: false, permanent: false };\n }\n // Already removed externally (shouldn't reach here, but guard anyway)\n return { success: true, permanent: false };\n }\n return this.processItem(item);\n });\n\n this.log(\"Queue processing complete\", {\n batchProcessed: batchResult.processed,\n batchFailed: batchResult.failed,\n individualProcessed: individualResult.processed,\n individualFailed: individualResult.failed,\n });\n\n return {\n processed: batchResult.processed + individualResult.processed,\n failed: batchResult.failed + individualResult.failed,\n };\n }\n\n private async processEventBatches(\n eventItems: QueueItem[]\n ): Promise<{ processed: number; failed: number; retryIds: Set<string> }> {\n if (eventItems.length === 0 || !this.httpClient) {\n return { processed: 0, failed: 0, retryIds: new Set() };\n }\n\n const BATCH_SIZE = 50;\n let processed = 0;\n let failed = 0;\n const retryIds = new Set<string>();\n\n for (let i = 0; i < eventItems.length; i += BATCH_SIZE) {\n const batch = eventItems.slice(i, i + BATCH_SIZE);\n const bodies = batch.map((item) => item.body);\n // Merge persisted headers with fresh headers captured at flush time so\n // rotated app keys and SDK telemetry headers (x-sdk-version, x-sdk-environment)\n // are always current — never stale from when the item was enqueued.\n const persistedHeaders = batch[0].headers ?? {};\n const freshHeaders = this.config.getFreshHeaders?.() ?? {};\n const headers = { ...persistedHeaders, ...freshHeaders };\n\n this.log(\"Sending event batch\", { size: batch.length, batchIndex: Math.floor(i / BATCH_SIZE) });\n\n const response = await this.httpClient.request(\"/sdk/events/batch\", {\n method: \"POST\",\n body: { events: bodies },\n headers,\n skipRetry: false,\n });\n\n if (response.ok) {\n for (const item of batch) {\n await offlineQueue.removeItem(item.id);\n processed++;\n }\n this.log(\"Event batch processed successfully\", { size: batch.length });\n } else if (response.status >= 400 && response.status < 500) {\n for (const item of batch) {\n await offlineQueue.removeItem(item.id);\n failed++;\n }\n this.log(\"Event batch failed permanently (4xx) - removing from queue\", {\n status: response.status,\n size: batch.length,\n });\n } else {\n for (const item of batch) {\n retryIds.add(item.id);\n }\n this.log(\"Event batch failed with server error - will retry\", {\n status: response.status,\n size: batch.length,\n });\n }\n }\n\n return { processed, failed, retryIds };\n }\n\n private async processItem(item: QueueItem): Promise<QueueItemResult> {\n if (!this.httpClient) {\n return { success: false, permanent: false };\n }\n\n this.log(\"Processing queue item\", {\n id: item.id,\n url: item.url,\n method: item.method,\n attempts: item.attempts,\n });\n\n const persistedHeaders = item.headers ?? {};\n const freshHeaders = this.config.getFreshHeaders?.() ?? {};\n const response = await this.httpClient.request(item.url, {\n method: item.method,\n body: item.body,\n headers: { ...persistedHeaders, ...freshHeaders },\n skipRetry: false,\n });\n\n if (response.ok) {\n this.log(\"Queue item processed successfully\", { id: item.id });\n return { success: true, permanent: false };\n }\n\n if (response.status >= 400 && response.status < 500) {\n this.log(\"Request failed with permanent client error - removing from queue\", {\n id: item.id,\n url: item.url,\n status: response.status,\n hasAppKey: item.headers?.[\"X-App-Key\"] != null,\n });\n return { success: false, permanent: true, status: response.status };\n }\n\n this.log(\"Request failed with server error - will retry\", {\n id: item.id,\n status: response.status,\n });\n return { success: false, permanent: false, status: response.status };\n }\n\n async enqueueIfOffline(\n method: \"POST\" | \"PUT\",\n url: string,\n body: unknown,\n headers?: Record<string, string>\n ): Promise<{ queued: boolean; item?: QueueItem }> {\n if (networkMonitor.isOnline()) {\n return { queued: false };\n }\n\n const item = await offlineQueue.enqueue(method, url, body, headers);\n this.log(\"Request queued for offline\", { id: item.id, url });\n return { queued: true, item };\n }\n\n getQueueSize(): number {\n return offlineQueue.getSize();\n }\n\n async clearQueue(): Promise<void> {\n await offlineQueue.clear();\n }\n\n dispose(): void {\n if (this.debounceTimeout) {\n clearTimeout(this.debounceTimeout);\n this.debounceTimeout = null;\n }\n\n if (this.retryIntervalId) {\n clearInterval(this.retryIntervalId);\n this.retryIntervalId = null;\n }\n\n if (this.networkUnsubscribe) {\n this.networkUnsubscribe();\n this.networkUnsubscribe = null;\n }\n\n if (this.queueUnsubscribe) {\n this.queueUnsubscribe();\n this.queueUnsubscribe = null;\n }\n\n this.httpClient = null;\n this.initialized = false;\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) console.log(\"[Paywallo:QueueProcessor]\", ...args);\n }\n\n setDebug(debug: boolean): void {\n this.config.debug = debug;\n }\n}\n\nexport const queueProcessor = new QueueProcessorClass();\n/** @deprecated Use `queueProcessor` (camelCase) */\nexport const QueueProcessor = queueProcessor;\n","export { offlineQueue } from \"./OfflineQueue\";\nexport { queueProcessor, type QueueProcessorConfig } from \"./QueueProcessor\";\nexport type {\n OfflineQueueConfig,\n QueueEvent,\n QueueEventType,\n QueueItem,\n QueueListener,\n QueuePriority,\n} from \"./types\";\nexport { DEFAULT_QUEUE_CONFIG } from \"./types\";\n","import { Platform } from \"react-native\";\n\nimport { ApiClient } from \"../../core/ApiClient\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport { offlineQueue } from \"../../core/queue\";\nimport type { Product, Purchase, ValidatePurchaseResponse } from \"../../types/purchase\";\n\nimport { PurchaseError } from \"./PurchaseError\";\n\n/**\n * Classification of a validateWithServer() failure.\n * - `network`: transport/timeout/5xx → keep the StoreKit transaction + enqueue retry.\n * - `server4xx`: permanent server rejection → finish the transaction.\n */\nexport type ValidationFailureKind = \"network\" | \"server4xx\";\n\nexport interface ValidateOptions {\n paywallPlacement?: string;\n variantKey?: string;\n paywallId?: string;\n variantId?: string;\n}\n\n/**\n * Encapsulates server-validation logic, retry strategy, and offline-queue\n * durable retry for IAP purchases.\n */\nexport class IAPValidator {\n constructor(\n private readonly getProductFromCache: (id: string) => Product | undefined,\n private readonly getApiClientFn: () => ApiClient,\n private readonly getDebug: () => boolean,\n private readonly getDeviceCountry: () => string,\n ) {}\n\n private async validateWithRetry(\n attempt: () => Promise<ValidatePurchaseResponse>,\n maxRetries = 2,\n delayMs = 3000,\n ): Promise<ValidatePurchaseResponse> {\n let lastError: unknown;\n for (let i = 0; i <= maxRetries; i++) {\n try {\n return await attempt();\n } catch (error) {\n lastError = error;\n if (i < maxRetries) await new Promise<void>((resolve) => setTimeout(resolve, delayMs));\n }\n }\n throw lastError;\n }\n\n async validateWithServer(purchase: Purchase, productId: string, options?: ValidateOptions): Promise<ValidatePurchaseResponse> {\n const apiClient = this.getApiClientFn();\n const product = this.getProductFromCache(productId);\n const platform = Platform.OS as \"ios\" | \"android\";\n const distinctId = PaywalloClient.getDistinctId();\n\n return this.validateWithRetry(\n () => apiClient.validatePurchase(\n platform,\n purchase.receipt,\n purchase.productId,\n purchase.transactionId,\n product?.priceValue ?? 0,\n product?.currency ?? \"USD\",\n this.getDeviceCountry(),\n distinctId,\n options?.paywallPlacement,\n options?.variantKey,\n ),\n );\n }\n\n /**\n * Bucketizes a validation failure into `server4xx` (permanent) vs `network` (transient).\n */\n classifyValidationError(error: unknown): ValidationFailureKind {\n if (error instanceof PurchaseError && typeof error.httpStatus === \"number\") {\n const status = error.httpStatus;\n if (status >= 400 && status < 500) return \"server4xx\";\n }\n return \"network\";\n }\n\n /**\n * Pushes the validation payload into the offline queue for durable retry.\n * The StoreKit transaction is intentionally left un-finished.\n */\n async enqueueValidationRetry(\n purchase: Purchase,\n productId: string,\n options?: Pick<ValidateOptions, \"paywallPlacement\" | \"variantKey\">,\n ): Promise<void> {\n try {\n const apiClient = this.getApiClientFn();\n const product = this.getProductFromCache(productId);\n const platform = Platform.OS as \"ios\" | \"android\";\n const distinctId = PaywalloClient.getDistinctId();\n const appKey = apiClient.getAppKey();\n\n const body: Record<string, unknown> = {\n platform,\n receipt: purchase.receipt,\n productId: purchase.productId,\n transactionId: purchase.transactionId,\n priceLocal: product?.priceValue ?? 0,\n currency: product?.currency ?? \"USD\",\n country: this.getDeviceCountry(),\n distinctId,\n };\n if (options?.paywallPlacement !== undefined) body.paywallPlacement = options.paywallPlacement;\n if (options?.variantKey !== undefined) body.variantKey = options.variantKey;\n\n await offlineQueue.enqueue(\n \"POST\",\n \"/purchases/validate\",\n body,\n { \"X-App-Key\": appKey },\n `validate:${purchase.transactionId}`,\n \"critical\",\n );\n if (this.getDebug()) console.log(\"[Paywallo PURCHASE] validation retry enqueued\", purchase.transactionId);\n } catch (err) {\n if (this.getDebug()) console.error(\"[Paywallo PURCHASE] failed to enqueue validation retry\", err);\n }\n }\n}\n","import { Platform } from \"react-native\";\n\nimport { ApiClient } from \"../../core/ApiClient\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport type { Product, Purchase, PurchaseResult } from \"../../types/purchase\";\n\nimport { IAPTransactionEmitter } from \"./IAPTransactionEmitter\";\nimport { IAPValidator, type ValidateOptions } from \"./IAPValidator\";\nimport {\n nativeStoreKit as NativeStoreKit,\n type NativeTransactionUpdate,\n} from \"./NativeStoreKit\";\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"./PurchaseError\";\n\nexport class IAPService {\n private productsCache: Map<string, Product> = new Map();\n private apiClient: ApiClient | null = null;\n private purchaseInFlight: string | null = null;\n /**\n * Idempotency guard against double-finish. Populated with transaction IDs\n * that have already been forwarded to `NativeStoreKit.finishTransaction`.\n */\n private finishedTransactions: Set<string> = new Set();\n\n private validator: IAPValidator;\n private emitter: IAPTransactionEmitter;\n\n constructor(apiClient?: ApiClient) {\n this.apiClient = apiClient ?? null;\n\n this.validator = new IAPValidator(\n (id) => this.productsCache.get(id),\n () => this.getApiClient(),\n () => this.debug,\n () => this.getDeviceCountry(),\n );\n\n this.emitter = new IAPTransactionEmitter(\n (id) => this.productsCache.get(id),\n () => this.apiClient ?? PaywalloClient.getApiClient(),\n () => this.debug,\n );\n }\n\n private get debug(): boolean {\n return PaywalloClient.getConfig()?.debug ?? false;\n }\n\n private getDeviceCountry(): string {\n try {\n const locale = Intl.DateTimeFormat().resolvedOptions().locale;\n const parts = locale.split(\"-\");\n return parts[parts.length - 1]?.toUpperCase() || \"US\";\n } catch {\n return \"US\";\n }\n }\n\n private getApiClient(): ApiClient {\n if (this.apiClient) return this.apiClient;\n const client = PaywalloClient.getApiClient();\n if (!client)\n throw new PurchaseError(PURCHASE_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized\");\n return client;\n }\n\n isAvailable(): boolean {\n return NativeStoreKit.isAvailable();\n }\n\n async loadProducts(productIds: string[]): Promise<Product[]> {\n if (!NativeStoreKit.isAvailable()) return [];\n try {\n const products = await NativeStoreKit.getProducts(productIds);\n for (const product of products) {\n this.productsCache.set(product.productId, product);\n }\n return products;\n } catch (err) {\n if (this.debug) console.error(\"[Paywallo] loadProducts failed\", err);\n return [];\n }\n }\n\n getProduct(productId: string): Product | undefined {\n return this.productsCache.get(productId);\n }\n\n getCachedProducts(): Map<string, Product> {\n return new Map(this.productsCache);\n }\n\n private async finishTransaction(transactionId: string): Promise<void> {\n if (this.finishedTransactions.has(transactionId)) {\n if (this.debug) console.log(\"[Paywallo PURCHASE] finishTransaction skipped (already finished)\", transactionId);\n return;\n }\n try {\n await NativeStoreKit.finishTransaction(transactionId);\n this.finishedTransactions.add(transactionId);\n } catch (err) {\n if (this.debug) console.error(\"[Paywallo] finishTransaction failed\", err);\n }\n }\n\n startTransactionListener(): void {\n this.emitter.startListener();\n }\n\n stopTransactionListener(): void {\n this.emitter.stopListener();\n }\n\n async emitTransactionUpdate(update: NativeTransactionUpdate): Promise<void> {\n return this.emitter.emitTransactionUpdate(update);\n }\n\n async purchase(productId: string, options?: ValidateOptions): Promise<PurchaseResult> {\n if (!NativeStoreKit.isAvailable()) {\n return {\n success: false,\n error: new PurchaseError(PURCHASE_ERROR_CODES.STORE_NOT_AVAILABLE, \"In-app purchases are not available on this device\"),\n };\n }\n\n if (this.purchaseInFlight) {\n return {\n success: false,\n error: new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, \"A purchase is already in progress\"),\n };\n }\n this.purchaseInFlight = productId;\n\n if (this.debug) console.log(`[Paywallo PURCHASE] starting ${productId}`);\n try {\n const purchase = await NativeStoreKit.purchase(productId);\n\n if (!purchase) {\n if (this.debug) console.log(`[Paywallo PURCHASE] ${productId} cancelled`);\n return { success: false };\n }\n\n if (this.debug) console.log(`[Paywallo PURCHASE] ${productId} approved`, { transactionId: purchase.transactionId });\n\n this.validator.validateWithServer(purchase, productId, options)\n .then(async () => {\n if (this.debug) console.log(`[Paywallo PURCHASE] ${productId} server validated`);\n await this.finishTransaction(purchase.transactionId);\n if (this.debug) console.log(`[Paywallo PURCHASE] ${productId} finished`);\n await this.emitter.emitTransactionCompleted(purchase, productId, {\n paywallId: options?.paywallId,\n variantId: options?.variantId,\n });\n })\n .catch(async (err) => {\n const kind = this.validator.classifyValidationError(err);\n if (kind === \"server4xx\") {\n if (this.debug) console.log(`[Paywallo PURCHASE] ${productId} validation rejected (4xx) — dropping`, err);\n await this.finishTransaction(purchase.transactionId);\n return;\n }\n if (this.debug) console.error(\"[Paywallo PURCHASE] background validation failed (network) — queued for retry\", err);\n await this.validator.enqueueValidationRetry(purchase, productId, {\n paywallPlacement: options?.paywallPlacement,\n variantKey: options?.variantKey,\n });\n });\n\n return { success: true, purchase };\n } catch (error) {\n if (this.debug) console.error(`[Paywallo PURCHASE] ${productId} failed`, error);\n const e = error instanceof PurchaseError\n ? error\n : new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, error instanceof Error ? error.message : String(error));\n return { success: false, error: e };\n } finally {\n this.purchaseInFlight = null;\n }\n }\n\n async restore(): Promise<Purchase[]> {\n if (!NativeStoreKit.isAvailable()) return [];\n\n try {\n const transactions = await NativeStoreKit.getActiveTransactions();\n const apiClient = this.getApiClient();\n const distinctId = PaywalloClient.getDistinctId();\n const platform = Platform.OS as \"ios\" | \"android\";\n\n const results = await Promise.allSettled(\n transactions.map((tx) => {\n const product = this.productsCache.get(tx.productId);\n return apiClient.validatePurchase(\n platform,\n tx.receipt,\n tx.productId,\n tx.transactionId,\n product?.priceValue ?? 0,\n product?.currency ?? \"USD\",\n this.getDeviceCountry(),\n distinctId,\n );\n }),\n );\n\n const validated: Purchase[] = [];\n for (let i = 0; i < results.length; i++) {\n const r = results[i];\n const tx = transactions[i];\n if (r.status === \"fulfilled\" && r.value.success) {\n await this.finishTransaction(tx.transactionId);\n validated.push(tx);\n continue;\n }\n\n if (r.status === \"rejected\") {\n const kind = this.validator.classifyValidationError(r.reason);\n if (kind === \"server4xx\") {\n if (this.debug) console.log(\"[Paywallo RESTORE] validation rejected (4xx) — dropping\", tx.transactionId);\n await this.finishTransaction(tx.transactionId);\n } else {\n if (this.debug) console.error(\"[Paywallo RESTORE] validation failed (network) — queued for retry\", r.reason);\n await this.validator.enqueueValidationRetry(tx, tx.productId);\n }\n } else if (r.status === \"fulfilled\" && !r.value.success) {\n if (this.debug) console.log(\"[Paywallo RESTORE] server returned success=false — dropping\", tx.transactionId);\n await this.finishTransaction(tx.transactionId);\n }\n }\n\n return validated;\n } catch (err) {\n if (this.debug) console.error(\"[Paywallo] restore failed\", err);\n return [];\n }\n }\n\n reset(): void {\n this.stopTransactionListener();\n this.productsCache.clear();\n this.finishedTransactions.clear();\n this.purchaseInFlight = null;\n }\n}\n\nlet _instance: IAPService | null = null;\n\nexport function getIAPService(): IAPService {\n if (!_instance) {\n _instance = new IAPService();\n _instance.startTransactionListener();\n }\n return _instance;\n}\n","import { useCallback } from \"react\";\n\nimport { emitPaywallClosed } from \"./emitPaywallClosed\";\nimport type { PaywallCanonicalCloseReason, PaywallCloseReason } from \"./paywallCloseReason\";\nimport { stopHeartbeat } from \"./paywallHeartbeat\";\n\ninterface TrackClosedOptions {\n placement: string;\n paywallId: string;\n presentedAt: number;\n reason: PaywallCloseReason | PaywallCanonicalCloseReason;\n variantKey?: string;\n campaignId?: string;\n /** UUID de `paywall_variants` (sub-fase 2.14). */\n variantId?: string;\n scrollDepth?: number;\n}\n\ninterface TrackDismissedOptions {\n placement: string;\n paywallId: string;\n duration_ms: number;\n reason: PaywallCloseReason;\n variantKey?: string;\n campaignId?: string;\n variantId?: string;\n}\n\ninterface TrackProductSelectedOptions {\n placement: string;\n paywallId: string;\n productId: string;\n variantKey?: string;\n campaignId?: string;\n variantId?: string;\n}\n\ninterface TrackPurchasedOptions {\n placement: string;\n paywallId: string;\n productId: string;\n variantKey?: string;\n campaignId?: string;\n variantId?: string;\n}\n\nexport interface UsePaywallTrackingResult {\n trackClosed: (opts: TrackClosedOptions) => Promise<void>;\n trackDismissed: (opts: TrackDismissedOptions) => Promise<void>;\n trackProductSelected: (opts: TrackProductSelectedOptions) => void;\n trackPurchased: (opts: TrackPurchasedOptions) => Promise<void>;\n}\n\n/**\n * Hook de tracking do paywall — única porta pro emit canônico\n * `paywall {type: \"closed\"}`.\n *\n * - `trackClosed` é o caminho canônico novo (sub-fase 2.10).\n * - `trackDismissed` é o wrapper legado (duration_ms + reason antigo)\n * mantido só pra não quebrar `usePaywallActions` e\n * `usePurchaseOrchestrator` — internamente roteia pro canonical.\n * - `trackProductSelected` e `trackPurchased` são no-ops (V2 taxonomy\n * droppou os eventos do server).\n */\nexport function usePaywallTracking(): UsePaywallTrackingResult {\n const trackClosed = useCallback(async (opts: TrackClosedOptions): Promise<void> => {\n await emitPaywallClosed(opts);\n await stopHeartbeat();\n }, []);\n\n const trackDismissed = useCallback(async (opts: TrackDismissedOptions): Promise<void> => {\n const presentedAt = Date.now() - Math.max(0, opts.duration_ms);\n await trackClosed({\n placement: opts.placement,\n paywallId: opts.paywallId,\n presentedAt,\n reason: opts.reason,\n ...(opts.variantKey && { variantKey: opts.variantKey }),\n ...(opts.campaignId && { campaignId: opts.campaignId }),\n ...(opts.variantId && { variantId: opts.variantId }),\n });\n }, [trackClosed]);\n\n const trackProductSelected = useCallback((_opts: TrackProductSelectedOptions): void => {\n // V2 taxonomy: dropped (no server consumer).\n }, []);\n\n const trackPurchased = useCallback(async (_opts: TrackPurchasedOptions): Promise<void> => {\n // V2 taxonomy: superseded by `transaction {type: \"completed\"}` from IAPService.\n }, []);\n\n return { trackClosed, trackDismissed, trackProductSelected, trackPurchased };\n}\n\n// Re-export pra não quebrar callers que importavam tipos do hook diretamente.\nexport type { PaywallCanonicalCloseReason, PaywallCloseReason } from \"./paywallCloseReason\";\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Animated, AppState, Dimensions } from \"react-native\";\n\nimport type { PaywallConfig, PaywallResult } from \"../../types\";\nimport { getIAPService } from \"../iap/IAPService\";\n\nimport type { PaywallCloseReason } from \"./usePaywallTracking\";\nimport { usePaywallTracking } from \"./usePaywallTracking\";\n\nconst PAYWALL_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes\n\nexport interface UsePaywallActionsResult {\n isPurchasing: boolean;\n slideAnim: Animated.Value;\n handleClose: () => void;\n handlePurchase: (productId: string) => Promise<void>;\n handleRestore: () => Promise<void>;\n}\n\nexport function usePaywallActions(\n placement: string,\n paywallConfig: PaywallConfig | null,\n onResult: (result: PaywallResult) => void,\n variantKey?: string,\n campaignId?: string,\n openAnim?: Animated.Value,\n /** UUID de `paywall_variants` (sub-fase 2.14). */\n variantId?: string,\n): UsePaywallActionsResult {\n const [isPurchasing, setIsPurchasing] = useState(false);\n const isPurchasingRef = useRef(false);\n const [isClosing, setIsClosing] = useState(false);\n const slideAnim = useRef(new Animated.Value(0)).current;\n const presentedAtRef = useRef<number>(Date.now());\n const closedRef = useRef(false);\n const { trackDismissed, trackProductSelected, trackPurchased } = usePaywallTracking();\n\n const closeWithReason = useCallback((reason: PaywallCloseReason, resultOverride?: PaywallResult) => {\n if (closedRef.current) return;\n closedRef.current = true;\n const animTarget = openAnim ?? slideAnim;\n Animated.timing(animTarget, {\n toValue: Dimensions.get(\"window\").height,\n duration: 350,\n useNativeDriver: true,\n }).start(() => {\n if (paywallConfig) {\n const duration_ms = Date.now() - presentedAtRef.current;\n void trackDismissed({ placement, paywallId: paywallConfig.id, duration_ms, reason, variantKey, campaignId, variantId });\n }\n slideAnim.setValue(0);\n closedRef.current = false;\n setIsClosing(false);\n onResult(resultOverride ?? { presented: true, purchased: false, cancelled: true, restored: false });\n });\n }, [openAnim, slideAnim, paywallConfig, placement, trackDismissed, variantKey, campaignId, variantId, onResult]);\n\n const handleClose = useCallback(() => {\n if (isClosing) return;\n setIsClosing(true);\n closeWithReason(\"dismissed\");\n }, [isClosing, closeWithReason]);\n\n // AppState listener: background → emit \"backgrounded\"\n // Skip during purchase — StoreKit payment sheet triggers \"inactive\" on iOS\n useEffect(() => {\n const sub = AppState.addEventListener(\"change\", (nextState) => {\n if (isPurchasingRef.current) return;\n if (nextState === \"background\" || nextState === \"inactive\") {\n closeWithReason(\"backgrounded\");\n }\n });\n return () => sub.remove();\n }, [closeWithReason]);\n\n // Timeout: auto-close after 30 minutes\n useEffect(() => {\n const timer = setTimeout(() => {\n closeWithReason(\"timeout\");\n }, PAYWALL_TIMEOUT_MS);\n return () => clearTimeout(timer);\n }, [closeWithReason]);\n\n const handlePurchase = useCallback(async (productId: string) => {\n if (isPurchasing) return;\n setIsPurchasing(true);\n isPurchasingRef.current = true;\n try {\n if (paywallConfig) trackProductSelected({ placement, paywallId: paywallConfig.id, productId, variantKey, campaignId, variantId });\n const result = await getIAPService().purchase(productId, {\n paywallPlacement: placement,\n variantKey,\n ...(paywallConfig && { paywallId: paywallConfig.id }),\n ...(variantId && { variantId }),\n });\n if (result.success) {\n if (paywallConfig) {\n const duration_ms = Date.now() - presentedAtRef.current;\n await trackDismissed({ placement, paywallId: paywallConfig.id, duration_ms, reason: \"purchased\", variantKey, campaignId, variantId });\n await trackPurchased({ placement, paywallId: paywallConfig.id, productId, variantKey, campaignId, variantId });\n }\n closedRef.current = true;\n onResult({ presented: true, purchased: true, cancelled: false, restored: false });\n } else if (result.error) {\n onResult({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n } catch (error) {\n onResult({ presented: true, purchased: false, cancelled: false, restored: false });\n } finally {\n isPurchasingRef.current = false;\n setIsPurchasing(false);\n }\n }, [isPurchasing, onResult, paywallConfig, placement, trackDismissed, trackProductSelected, trackPurchased, variantKey, campaignId, variantId]);\n\n const handleRestore = useCallback(async () => {\n if (isPurchasing) return;\n setIsPurchasing(true);\n isPurchasingRef.current = true;\n try {\n const transactions = await getIAPService().restore();\n if (transactions.length > 0) {\n if (paywallConfig) {\n const duration_ms = Date.now() - presentedAtRef.current;\n await trackDismissed({ placement, paywallId: paywallConfig.id, duration_ms, reason: \"dismissed\", variantKey, campaignId, variantId });\n }\n onResult({ presented: true, purchased: false, cancelled: false, restored: true });\n } else {\n onResult({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n } catch (error) {\n onResult({ presented: true, purchased: false, cancelled: false, restored: false });\n } finally {\n isPurchasingRef.current = false;\n setIsPurchasing(false);\n }\n }, [isPurchasing, onResult, paywallConfig, placement, trackDismissed, variantKey, campaignId, variantId]);\n\n return { isPurchasing, slideAnim, handleClose, handlePurchase, handleRestore };\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport type { PaywallConfig } from \"../../types\";\nimport type { Product } from \"../../types/purchase\";\nimport { getIAPService } from \"../iap/IAPService\";\n\nimport { PAYWALL_ERROR_CODES, PaywallError } from \"./PaywallError\";\n\ninterface PreloadedConfig {\n id: string;\n placement: string;\n config: Record<string, unknown>;\n primaryProductId?: string;\n secondaryProductId?: string;\n}\n\ninterface UsePaywallLoaderResult {\n paywallConfig: PaywallConfig | null;\n products: Map<string, Product>;\n error: Error | null;\n}\n\nexport function usePaywallLoader(\n placement: string,\n visible: boolean,\n preloadedConfig?: PreloadedConfig,\n preloadedProducts?: Map<string, Product>,\n variantKey?: string,\n campaignId?: string,\n /** UUID de `paywall_variants` (sub-fase 2.14). */\n variantId?: string,\n): UsePaywallLoaderResult {\n const [error, setError] = useState<Error | null>(null);\n const [paywallConfig, setPaywallConfig] = useState<PaywallConfig | null>(null);\n const [products, setProducts] = useState<Map<string, Product>>(new Map());\n const preloadedConfigRef = useRef(preloadedConfig);\n preloadedConfigRef.current = preloadedConfig;\n const preloadedProductsRef = useRef(preloadedProducts);\n preloadedProductsRef.current = preloadedProducts;\n const trackingDoneRef = useRef(false);\n\n useEffect(() => {\n if (!visible) { trackingDoneRef.current = false; return; }\n\n let cancelled = false;\n\n const load = async () => {\n setError(null);\n try {\n const apiClient = PaywalloClient.getApiClient();\n if (!apiClient) throw new PaywallError(PAYWALL_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized\");\n\n let config: PaywallConfig;\n const snap = preloadedConfigRef.current;\n if (snap) {\n config = { id: snap.id, placement: snap.placement, config: snap.config as { craftData: string },\n primaryProductId: snap.primaryProductId, secondaryProductId: snap.secondaryProductId };\n } else {\n const fetched = await apiClient.getPaywall(placement);\n if (!fetched) throw new PaywallError(PAYWALL_ERROR_CODES.NOT_FOUND, `Paywall not found for placement: ${placement}`);\n config = fetched;\n }\n if (cancelled) return;\n setPaywallConfig(config);\n\n const productIds: string[] = [];\n if (config.primaryProductId) productIds.push(config.primaryProductId);\n if (config.secondaryProductId) productIds.push(config.secondaryProductId);\n\n const snapProducts = preloadedProductsRef.current;\n if (snapProducts && snapProducts.size > 0) {\n if (!cancelled) setProducts(snapProducts);\n } else if (productIds.length > 0) {\n try {\n const storeProducts = await getIAPService().loadProducts(productIds);\n if (!cancelled) {\n const map = new Map<string, Product>();\n for (const p of storeProducts) map.set(p.productId, p);\n setProducts(map);\n }\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] loadProducts in paywall failed\", err);\n if (!cancelled) setProducts(new Map());\n }\n } else {\n if (!cancelled) setProducts(new Map());\n }\n\n if (!trackingDoneRef.current && !cancelled) {\n trackingDoneRef.current = true;\n const sessionId = PaywalloClient.getSessionId();\n const distinctId = PaywalloClient.getDistinctId();\n await apiClient.trackEvent(\"$paywall_viewed\", distinctId, {\n placement, paywallId: config.id,\n ...(sessionId && { sessionId }),\n ...(variantKey && { variantKey }),\n ...(campaignId && { campaignId }),\n ...(variantId && { variant_id: variantId }),\n });\n await apiClient.trackEvent(\"paywall\", distinctId, {\n type: \"open\",\n paywall_id: config.id,\n placement,\n opened_at: new Date().toISOString(),\n ...(sessionId && { sessionId }),\n ...(variantKey && { variant_key: variantKey }),\n ...(campaignId && { campaign_id: campaignId }),\n ...(variantId && { variant_id: variantId }),\n });\n }\n } catch (err) {\n if (cancelled) return;\n const e = err instanceof Error ? err : new PaywallError(PAYWALL_ERROR_CODES.LOAD_FAILED, String(err));\n setError(e);\n }\n };\n\n void load();\n return () => { cancelled = true; };\n }, [placement, visible, variantKey, campaignId, variantId]);\n\n return { paywallConfig, products, error };\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n Animated,\n Dimensions,\n Easing,\n Modal,\n Pressable,\n StyleSheet,\n Text,\n View,\n} from \"react-native\";\n\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport type { PaywallResult } from \"../../types\";\nimport type { Product } from \"../../types/purchase\";\nimport { getSdkString } from \"../../utils/localization\";\n\nimport { PaywallWebView } from \"./PaywallWebView\";\nimport { usePaywallActions } from \"./usePaywallActions\";\nimport { usePaywallLoader } from \"./usePaywallLoader\";\n\ninterface ErrorFallbackProps {\n description: string;\n onRetry: () => void;\n onClose: () => void;\n}\n\nfunction ErrorFallback({ description, onRetry, onClose }: ErrorFallbackProps): React.ReactElement {\n const overrides = PaywalloClient.getConfig()?.errorStrings;\n const title = overrides?.title ?? getSdkString(\"paywallErrorTitle\");\n const retryLabel = overrides?.retry ?? getSdkString(\"paywallRetryButton\");\n const closeLabel = overrides?.close ?? getSdkString(\"paywallCloseButton\");\n\n return (\n <View style={styles.fallbackContainer}>\n <View style={styles.fallbackCard}>\n <Text style={styles.fallbackTitle}>{title}</Text>\n <Text style={styles.fallbackDescription}>{description}</Text>\n <Pressable style={styles.retryButton} onPress={onRetry}>\n <Text style={styles.retryButtonText}>{retryLabel}</Text>\n </Pressable>\n <Pressable style={styles.closeButton} onPress={onClose}>\n <Text style={styles.closeButtonText}>{closeLabel}</Text>\n </Pressable>\n </View>\n </View>\n );\n}\n\ninterface PaywallModalProps {\n placement: string;\n visible: boolean;\n onResult: (result: PaywallResult) => void;\n paywallConfig?: {\n id: string;\n placement: string;\n config: Record<string, unknown>;\n primaryProductId?: string;\n secondaryProductId?: string;\n };\n preloadedProducts?: Map<string, Product>;\n variantKey?: string;\n campaignId?: string;\n /** UUID de `paywall_variants` (sub-fase 2.14). */\n variantId?: string;\n}\n\nexport function PaywallModal({\n placement,\n visible,\n onResult,\n paywallConfig: preloadedConfig,\n preloadedProducts,\n variantKey,\n campaignId,\n variantId,\n}: PaywallModalProps): React.ReactElement | null {\n const { paywallConfig, products, error } = usePaywallLoader(\n placement,\n visible,\n preloadedConfig,\n preloadedProducts,\n variantKey,\n campaignId,\n variantId,\n );\n\n const screenHeight = Dimensions.get(\"window\").height;\n const openAnim = useRef(new Animated.Value(screenHeight)).current;\n const [modalVisible, setModalVisible] = useState(false);\n\n const handleResult = useCallback((result: PaywallResult) => {\n setModalVisible(false);\n onResult(result);\n }, [onResult]);\n\n const { isPurchasing, slideAnim, handleClose, handlePurchase, handleRestore } =\n usePaywallActions(placement, paywallConfig, handleResult, variantKey, campaignId, openAnim, variantId);\n\n const [webViewError, setWebViewError] = useState<{\n code: number;\n description: string;\n } | null>(null);\n const [retryCount, setRetryCount] = useState(0);\n\n const retryCountRef = useRef(0);\n\n const handleWebViewError = useCallback(\n (err: { code: number; description: string; url?: string }) => {\n if (retryCountRef.current >= 1) {\n setWebViewError({ code: err.code, description: err.description });\n } else {\n retryCountRef.current += 1;\n setRetryCount(retryCountRef.current);\n }\n },\n []\n );\n\n const handleRetry = useCallback(() => {\n retryCountRef.current = 0;\n setWebViewError(null);\n setRetryCount(0);\n }, []);\n\n useEffect(() => {\n if (visible) {\n setModalVisible(true);\n openAnim.setValue(Dimensions.get(\"window\").height);\n Animated.timing(openAnim, {\n toValue: 0,\n duration: 550,\n easing: Easing.out(Easing.cubic),\n useNativeDriver: true,\n }).start();\n }\n }, [visible, openAnim]);\n\n if (!modalVisible && !visible) return null;\n\n return (\n <Modal\n visible={modalVisible}\n animationType=\"none\"\n presentationStyle=\"overFullScreen\"\n onRequestClose={handleClose}\n transparent\n statusBarTranslucent\n >\n <View style={styles.overlay}>\n <Animated.View style={[styles.animatedContainer, { transform: [{ translateY: openAnim }] }]}>\n <View style={styles.container}>\n {error && (\n <View style={styles.errorContainer}>\n <Text style={styles.errorText}>{error.message}</Text>\n </View>\n )}\n\n {!error && paywallConfig && \"craftData\" in paywallConfig.config && (\n <>\n {webViewError ? (\n <ErrorFallback\n description={webViewError.description}\n onRetry={handleRetry}\n onClose={handleClose}\n />\n ) : (\n <PaywallWebView\n key={retryCount}\n paywallId={paywallConfig.id}\n craftData={paywallConfig.config.craftData}\n products={products}\n primaryProductId={paywallConfig.primaryProductId}\n secondaryProductId={paywallConfig.secondaryProductId}\n isPurchasing={isPurchasing}\n onClose={handleClose}\n onPurchase={handlePurchase}\n onRestore={handleRestore}\n onError={handleWebViewError}\n />\n )}\n </>\n )}\n </View>\n </Animated.View>\n </View>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: { flex: 1, backgroundColor: \"rgba(0,0,0,0.3)\" },\n animatedContainer: { flex: 1, backgroundColor: \"#fff\" },\n container: { flex: 1, backgroundColor: \"#fff\" },\n errorContainer: { flex: 1, justifyContent: \"center\", alignItems: \"center\", padding: 20 },\n errorText: { fontSize: 16, color: \"#ef4444\", textAlign: \"center\" },\n fallbackContainer: {\n flex: 1, justifyContent: \"center\", alignItems: \"center\",\n backgroundColor: \"#111010\", padding: 24,\n },\n fallbackCard: {\n width: \"100%\", maxWidth: 360, alignItems: \"center\",\n backgroundColor: \"rgba(255,255,255,0.07)\", borderRadius: 16, padding: 28,\n },\n fallbackTitle: {\n fontSize: 18, fontWeight: \"600\", color: \"#f5f5f5\",\n marginBottom: 10, textAlign: \"center\",\n },\n fallbackDescription: {\n fontSize: 14, color: \"rgba(255,255,255,0.55)\",\n textAlign: \"center\", marginBottom: 28, lineHeight: 20,\n },\n retryButton: {\n width: \"100%\", backgroundColor: \"#ffffff\", borderRadius: 10,\n paddingVertical: 14, alignItems: \"center\", marginBottom: 12,\n },\n retryButtonText: { fontSize: 15, fontWeight: \"600\", color: \"#111010\" },\n closeButton: {\n width: \"100%\", borderRadius: 10, paddingVertical: 14,\n alignItems: \"center\", backgroundColor: \"rgba(255,255,255,0.1)\",\n },\n closeButtonText: { fontSize: 15, fontWeight: \"500\", color: \"rgba(255,255,255,0.7)\" },\n});\n","import { useCallback, useEffect, useRef } from \"react\";\n\nimport { emitPaywallClosed } from \"./emitPaywallClosed\";\nimport { startHeartbeat, stopHeartbeat } from \"./paywallHeartbeat\";\n\nexport interface PaywallSessionOptions {\n placement: string;\n paywallId: string;\n presentedAt: number;\n variantId?: string;\n variantKey?: string;\n campaignId?: string;\n}\n\n/**\n * Hook do ciclo de vida de um paywall apresentado (sub-fase 2.10).\n *\n * - Em mount: inicia heartbeat 5s (crash-safe) persistindo o snapshot no\n * SecureStorage. Se o processo morre antes do close, o próximo boot\n * detecta o snapshot órfão e emite `paywall {closed, close_reason:\"error\"}`.\n * - Em unmount: emite `paywall {closed, close_reason:\"dismiss\"}` se o caller\n * não chamou `markClosed()` antes — garante que `closedAt`, `durationS`\n * e `variantId` nunca sejam NULL em `paywall_interactions`.\n *\n * Callers que já emitem via `trackClosed`/`emitPaywallClosed` explícito\n * devem chamar `markClosed()` pra não emitir duplicado.\n */\nexport function usePaywallSession(options: PaywallSessionOptions | null): { markClosed: () => void } {\n const closedRef = useRef<boolean>(false);\n const optsRef = useRef<PaywallSessionOptions | null>(options);\n optsRef.current = options;\n\n useEffect(() => {\n if (!options) return;\n closedRef.current = false;\n startHeartbeat({\n paywallId: options.paywallId,\n placement: options.placement,\n presentedAt: options.presentedAt,\n ...(options.variantId && { variantId: options.variantId }),\n ...(options.variantKey && { variantKey: options.variantKey }),\n ...(options.campaignId && { campaignId: options.campaignId }),\n });\n return () => {\n const snap = optsRef.current;\n if (closedRef.current || !snap) {\n void stopHeartbeat();\n return;\n }\n void emitPaywallClosed({\n placement: snap.placement,\n paywallId: snap.paywallId,\n presentedAt: snap.presentedAt,\n reason: \"dismiss\",\n ...(snap.variantId && { variantId: snap.variantId }),\n ...(snap.variantKey && { variantKey: snap.variantKey }),\n ...(snap.campaignId && { campaignId: snap.campaignId }),\n }).finally(() => { void stopHeartbeat(); });\n };\n }, [options?.paywallId, options?.placement]);\n\n const markClosed = useCallback((): void => {\n closedRef.current = true;\n }, []);\n\n return { markClosed };\n}\n","import type { Dispatch, RefObject, SetStateAction } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport type { PreloadedWebView } from \"../../hooks/useCampaignPreload\";\nimport type { PaywallResult } from \"../../types\";\n\nimport { emitPaywallClosed } from \"./emitPaywallClosed\";\nimport { usePaywallSession } from \"./usePaywallSession\";\n\ntype SetPreloadedWebView = Dispatch<SetStateAction<PreloadedWebView | null>>;\n\ninterface UsePaywallPresenterReturn {\n showingPreloadedWebView: boolean;\n presentPreloadedWebView: () => Promise<PaywallResult>;\n resolvePreloadedPaywall: (result: PaywallResult) => void;\n handlePreloadedWebViewReady: () => void;\n handlePreloadedClose: () => void;\n setShowingPreloadedWebView: Dispatch<SetStateAction<boolean>>;\n presentedAtRef: RefObject<number>;\n}\n\nexport function usePaywallPresenter(\n preloadedWebView: PreloadedWebView | null,\n setPreloadedWebView: SetPreloadedWebView\n): UsePaywallPresenterReturn {\n const [showingPreloadedWebView, setShowingPreloadedWebView] = useState(false);\n const resolverRef = useRef<((result: PaywallResult) => void) | null>(null);\n const presentedAtRef = useRef<number>(Date.now());\n\n // Sessão canônica de paywall — heartbeat 5s + emit `closed` em unmount se\n // o caller não marcar explicitamente. Só ativa quando o preloaded está\n // realmente sendo apresentado (showing + preloadedWebView válido).\n const sessionOpts = showingPreloadedWebView && preloadedWebView\n ? {\n placement: preloadedWebView.placement,\n paywallId: preloadedWebView.paywallId,\n presentedAt: presentedAtRef.current,\n ...(preloadedWebView.variantId && { variantId: preloadedWebView.variantId }),\n ...(preloadedWebView.variantKey && { variantKey: preloadedWebView.variantKey }),\n ...(preloadedWebView.campaignId && { campaignId: preloadedWebView.campaignId }),\n }\n : null;\n const { markClosed } = usePaywallSession(sessionOpts);\n\n useEffect(() => {\n return () => {\n if (resolverRef.current) {\n resolverRef.current({ presented: false, purchased: false, cancelled: true, restored: false });\n resolverRef.current = null;\n }\n setShowingPreloadedWebView(false);\n };\n }, []);\n\n const presentPreloadedWebView = useCallback((): Promise<PaywallResult> => {\n return new Promise<PaywallResult>((resolve) => {\n resolverRef.current = resolve;\n presentedAtRef.current = Date.now();\n setShowingPreloadedWebView(true);\n\n // Emit $paywall_viewed for the preloaded-webview path. This is the single\n // canonical emission point for this code path — the modal path emits it\n // from `usePaywallLoader` at real render time.\n const apiClient = PaywalloClient.getApiClient();\n if (apiClient && preloadedWebView) {\n const sessionId = PaywalloClient.getSessionId();\n const distinctId = PaywalloClient.getDistinctId();\n void apiClient.trackEvent(\"$paywall_viewed\", distinctId, {\n placement: preloadedWebView.placement,\n paywallId: preloadedWebView.paywallId,\n preloaded: true,\n variantKey: preloadedWebView.variantKey ?? \"\",\n campaignId: preloadedWebView.campaignId ?? \"\",\n ...(preloadedWebView.variantId && { variant_id: preloadedWebView.variantId }),\n ...(sessionId && { sessionId }),\n }).catch(() => { /* non-critical */ });\n void apiClient.trackEvent(\"paywall\", distinctId, {\n type: \"open\",\n paywall_id: preloadedWebView.paywallId,\n placement: preloadedWebView.placement,\n opened_at: new Date().toISOString(),\n preloaded: true,\n ...(preloadedWebView.variantKey && { variant_key: preloadedWebView.variantKey }),\n ...(preloadedWebView.campaignId && { campaign_id: preloadedWebView.campaignId }),\n ...(preloadedWebView.variantId && { variant_id: preloadedWebView.variantId }),\n ...(sessionId && { sessionId }),\n }).catch(() => { /* non-critical */ });\n }\n });\n }, [preloadedWebView]);\n\n const resolvePreloadedPaywall = useCallback((result: PaywallResult): void => {\n if (resolverRef.current) { resolverRef.current(result); resolverRef.current = null; }\n }, []);\n\n const handlePreloadedWebViewReady = useCallback((): void => {\n setPreloadedWebView((prev) => (prev ? { ...prev, loaded: true } : null));\n }, [setPreloadedWebView]);\n\n const handlePreloadedClose = useCallback((): void => {\n // Sub-fase 2.10: path canonical único — `paywall {type: \"closed\"}` via\n // `emitPaywallClosed`. O path legado `$paywall_dismissed` inline foi\n // removido (duplicava o emit do `usePaywallTracking`).\n if (preloadedWebView) {\n markClosed();\n void emitPaywallClosed({\n placement: preloadedWebView.placement,\n paywallId: preloadedWebView.paywallId,\n presentedAt: presentedAtRef.current,\n reason: \"dismiss\",\n ...(preloadedWebView.variantKey && { variantKey: preloadedWebView.variantKey }),\n ...(preloadedWebView.campaignId && { campaignId: preloadedWebView.campaignId }),\n ...(preloadedWebView.variantId && { variantId: preloadedWebView.variantId }),\n });\n }\n setShowingPreloadedWebView(false);\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: true, restored: false });\n }, [preloadedWebView, markClosed, resolvePreloadedPaywall]);\n\n return { showingPreloadedWebView, presentPreloadedWebView, resolvePreloadedPaywall, handlePreloadedWebViewReady, handlePreloadedClose, setShowingPreloadedWebView, presentedAtRef };\n}\n","export type { EmitPaywallClosedOptions } from \"./emitPaywallClosed\";\nexport { emitPaywallClosed } from \"./emitPaywallClosed\";\nexport type { WebViewMessage } from \"./parseWebViewMessage\";\nexport { parseWebViewMessage } from \"./parseWebViewMessage\";\nexport type { PaywallContextValue } from \"./PaywallContext\";\nexport { PaywallContext, usePaywallContext } from \"./PaywallContext\";\nexport { PAYWALL_ERROR_CODES,PaywallError } from \"./PaywallError\";\nexport { PaywallErrorBoundary } from \"./PaywallErrorBoundary\";\nexport type { HeartbeatSnapshot } from \"./paywallHeartbeat\";\nexport {\n clearPersistedHeartbeat,\n HEARTBEAT_INTERVAL_MS,\n readPersistedHeartbeat,\n startHeartbeat,\n stopHeartbeat,\n} from \"./paywallHeartbeat\";\nexport { PaywallModal } from \"./PaywallModal\";\nexport { buildPaywallInjectionScript, buildPurchaseStateScript } from \"./paywallScripts\";\nexport { PaywallWebView } from \"./PaywallWebView\";\nexport type { UsePaywallActionsResult } from \"./usePaywallActions\";\nexport { usePaywallActions } from \"./usePaywallActions\";\nexport { usePaywallLoader } from \"./usePaywallLoader\";\nexport { usePaywallPresenter } from \"./usePaywallPresenter\";\nexport type { PaywallSessionOptions } from \"./usePaywallSession\";\nexport { usePaywallSession } from \"./usePaywallSession\";\nexport type { PaywallCanonicalCloseReason,PaywallCloseReason, UsePaywallTrackingResult } from \"./usePaywallTracking\";\nexport { usePaywallTracking } from \"./usePaywallTracking\";\n","import type { AllPlansResponse, CachedPlans } from \"./types\";\n\nconst DEFAULT_TTL = 5 * 60 * 1000; // 5 minutes\n\nexport class PlanCache {\n private cache: CachedPlans | null = null;\n private ttl: number = DEFAULT_TTL;\n\n get(): CachedPlans | null {\n if (!this.cache) return null;\n const isStale = Date.now() - this.cache.cachedAt > this.ttl;\n return { ...this.cache, isStale };\n }\n\n set(data: AllPlansResponse): void {\n this.cache = { data, cachedAt: Date.now(), isStale: false };\n }\n\n invalidate(): void {\n this.cache = null;\n }\n\n setTTL(ttl: number): void {\n this.ttl = ttl;\n }\n}\n\nexport const planCache = new PlanCache();\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class PlanError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"plan\", code, message);\n this.name = \"PlanError\";\n }\n}\n\nexport const PLAN_ERROR_CODES = {\n NOT_INITIALIZED: \"PLAN_NOT_INITIALIZED\",\n FETCH_FAILED: \"PLAN_FETCH_FAILED\",\n} as const;\n","import type { ApiClient } from \"../../core/ApiClient\";\nimport { secureStorage } from \"../../core/storage/SecureStorage\";\n\nimport { planCache } from \"./PlanCache\";\nimport { PLAN_ERROR_CODES, PlanError } from \"./PlanError\";\nimport type { AllPlansResponse, Plan, PlanServiceConfig } from \"./types\";\n\nconst PLAN_CACHE_KEY = \"plan_cache\";\nconst ALL_PLANS_CACHE_KEY = \"all_plans_cache\";\n\ninterface RawPlanProduct {\n id: string;\n name: string;\n description: string | null;\n type: string;\n apple_product_id: string | null;\n google_product_id: string | null;\n billing_period: string | null;\n trial_days: number | null;\n price_usd: number | null;\n regional_prices: unknown;\n display_order: number;\n is_active: boolean;\n intro_offer_mode?: string | null;\n intro_offer_price?: number | null;\n intro_offer_currency?: string | null;\n intro_offer_cycles?: number | null;\n intro_offer_duration_days?: number | null;\n}\n\ninterface RawPlan {\n id: string;\n identifier: string;\n name: string;\n description: string | null;\n metadata: unknown;\n products: RawPlanProduct[];\n}\n\ninterface RawCurrentPlanResponse {\n data: { plan: RawPlan | null };\n}\n\ninterface RawAllPlansResponse {\n data: { plans: RawPlan[]; current_identifier: string | null };\n}\n\nfunction mapProduct(raw: RawPlanProduct): Plan[\"products\"][number] {\n return {\n id: raw.id,\n name: raw.name,\n description: raw.description,\n type: raw.type,\n appleProductId: raw.apple_product_id,\n googleProductId: raw.google_product_id,\n billingPeriod: raw.billing_period,\n trialDays: raw.trial_days,\n priceUsd: raw.price_usd,\n regionalPrices: raw.regional_prices,\n displayOrder: raw.display_order,\n isActive: raw.is_active,\n };\n}\n\nfunction mapPlan(raw: RawPlan): Plan {\n return {\n id: raw.id,\n identifier: raw.identifier,\n name: raw.name,\n description: raw.description,\n metadata: raw.metadata,\n products: raw.products.map(mapProduct),\n };\n}\n\nexport class PlanService {\n private config: PlanServiceConfig | null = null;\n private cache = planCache;\n\n init(config: PlanServiceConfig): void {\n this.config = config;\n }\n\n async getCurrentPlan(forceRefresh = false): Promise<Plan | null> {\n if (!forceRefresh) {\n const cached = this.cache.get();\n if (cached && !cached.isStale) {\n const current = cached.data.plans.find(\n (p) => p.identifier === cached.data.currentIdentifier\n );\n return current ?? null;\n }\n }\n\n if (!this.cache.get()) {\n try {\n const stored = await secureStorage.get(ALL_PLANS_CACHE_KEY);\n if (stored) {\n const parsed = JSON.parse(stored) as AllPlansResponse;\n this.cache.set(parsed);\n }\n } catch { /* ignore storage errors */ }\n }\n\n const memCached = this.cache.get();\n if (memCached) {\n void this.fetchAllPlans();\n const current = memCached.data.plans.find(\n (p) => p.identifier === memCached.data.currentIdentifier\n );\n return current ?? null;\n }\n\n return this.fetchCurrentPlan();\n }\n\n async getAllPlans(forceRefresh = false): Promise<AllPlansResponse> {\n if (!forceRefresh) {\n const cached = this.cache.get();\n if (cached && !cached.isStale) return cached.data;\n }\n\n if (!this.cache.get()) {\n try {\n const stored = await secureStorage.get(ALL_PLANS_CACHE_KEY);\n if (stored) {\n const parsed = JSON.parse(stored) as AllPlansResponse;\n this.cache.set(parsed);\n }\n } catch { /* ignore storage errors */ }\n }\n\n const memCached = this.cache.get();\n if (memCached) {\n void this.fetchAllPlans();\n return memCached.data;\n }\n\n return this.fetchAllPlans();\n }\n\n invalidateCache(): void {\n this.cache.invalidate();\n secureStorage.remove(PLAN_CACHE_KEY).catch(() => undefined);\n secureStorage.remove(ALL_PLANS_CACHE_KEY).catch(() => undefined);\n }\n\n private getApiClient(): ApiClient {\n if (!this.config) {\n throw new PlanError(PLAN_ERROR_CODES.NOT_INITIALIZED, \"PlanService not initialized. Call Paywallo.init() first\");\n }\n return this.config.apiClient;\n }\n\n private async fetchCurrentPlan(): Promise<Plan | null> {\n try {\n const res = await this.getApiClient().get<RawCurrentPlanResponse>(\"/sdk/plans\");\n if (!res.ok) {\n this.log(\"fetchCurrentPlan failed\", res.status);\n return null;\n }\n const raw = res.data.data.plan;\n return raw ? mapPlan(raw) : null;\n } catch (err) {\n this.log(\"fetchCurrentPlan error\", err);\n return null;\n }\n }\n\n private async fetchAllPlans(): Promise<AllPlansResponse> {\n try {\n const res = await this.getApiClient().get<RawAllPlansResponse>(\"/sdk/plans/all\");\n if (!res.ok) {\n this.log(\"fetchAllPlans failed\", res.status);\n return { plans: [], currentIdentifier: null };\n }\n const result: AllPlansResponse = {\n plans: res.data.data.plans.map(mapPlan),\n currentIdentifier: res.data.data.current_identifier,\n };\n this.cache.set(result);\n secureStorage.set(ALL_PLANS_CACHE_KEY, JSON.stringify(result)).catch(() => undefined);\n return result;\n } catch (err) {\n this.log(\"fetchAllPlans error\", err);\n return { plans: [], currentIdentifier: null };\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config?.debug) console.log(\"[Paywallo Plans]\", ...args);\n }\n}\n\nexport const planService = new PlanService();\n","export { PlanCache, planCache } from \"./PlanCache\";\nexport { PlanService, planService } from \"./PlanService\";\nexport type {\n AllPlansResponse,\n CachedPlans,\n Plan,\n PlanProduct,\n PlanServiceConfig,\n PlansResponse,\n} from \"./types\";\n","export type { DistinctIdProvider } from \"./distinctIdGuard\";\nexport { waitForDistinctId } from \"./distinctIdGuard\";\nexport { SESSION_ERROR_CODES,SessionError } from \"./SessionError\";\nexport { SessionManager, sessionManager } from \"./SessionManager\";\nexport {\n trackAppBackground,\n trackAppOpen,\n trackSessionEnd,\n trackSessionStart,\n} from \"./sessionTracking\";\nexport type { EmergencyPaywallHandler,SessionConfig, SessionState } from \"./types\";\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class AnalyticsError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"analytics\", code, message);\n this.name = \"AnalyticsError\";\n }\n}\n\nexport const ANALYTICS_ERROR_CODES = {\n NOT_INITIALIZED: \"ANALYTICS_NOT_INITIALIZED\",\n INVALID_STEP_INDEX: \"ANALYTICS_INVALID_STEP_INDEX\",\n INVALID_ACTION_NAME: \"ANALYTICS_INVALID_ACTION_NAME\",\n VALIDATION_ERROR: \"ANALYTICS_VALIDATION_ERROR\",\n} as const;\n","export { ANALYTICS_ERROR_CODES,AnalyticsError } from \"./AnalyticsError\";\n","import { ANALYTICS_ERROR_CODES, AnalyticsError } from \"../domains/analytics\";\nimport { identityManager } from \"../domains/identity\";\nimport { sessionManager } from \"../domains/session\";\nimport { CLIENT_ERROR_CODES, ClientError } from \"../errors/ClientError\";\nimport type { TrackEventOptions } from \"../types\";\n\nimport type { ApiClient } from \"./ApiClient\";\nimport type { PaywalloState } from \"./PaywalloState\";\n\nexport function isValidEventName(name: string): boolean {\n if (name.startsWith(\"$\")) return /^\\$[a-z][a-z0-9]*(_[a-z0-9]+)*$/.test(name);\n return /^[a-z][a-z0-9]*(_[a-z0-9]+)*$/.test(name);\n}\n\nexport async function trackEvent(\n apiClient: ApiClient,\n state: PaywalloState,\n eventName: string,\n options?: TrackEventOptions,\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) {\n if (state.config?.debug) console.log(`[Paywallo TRACK] ${eventName} skipped (no distinctId)`);\n return;\n }\n if (!isValidEventName(eventName)) {\n const msg = `Invalid event name: \"${eventName}\". Use snake_case or $reserved_name.`;\n throw new ClientError(CLIENT_ERROR_CODES.INVALID_EVENT_NAME, msg);\n }\n if (state.config?.debug && eventName.startsWith(\"$purchase\")) console.log(`[Paywallo TRACK] ${eventName}`, options?.properties ?? {});\n const sessionId = sessionManager.getSessionId();\n await apiClient.trackEvent(\n eventName,\n distinctId,\n { ...identityManager.getProperties(), ...options?.properties, ...(sessionId && { sessionId }) },\n options?.timestamp,\n options?.priority ? { priority: options.priority } : undefined,\n );\n}\n\nexport async function trackOnboardingStep(\n apiClient: ApiClient,\n state: PaywalloState,\n index: number,\n name: string,\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) return;\n if (!Number.isInteger(index) || index < 0) {\n const msg = `Invalid stepIndex: \"${index}\". Must be a non-negative integer.`;\n throw new AnalyticsError(ANALYTICS_ERROR_CODES.INVALID_STEP_INDEX, msg);\n }\n const now = Date.now();\n const timeOnPreviousStep = state.lastOnboardingStepTimestamp !== null\n ? Math.round((now - state.lastOnboardingStepTimestamp) / 1000) : 0;\n state.lastOnboardingStepTimestamp = now;\n await apiClient.trackEvent(\"$onboarding_step\", distinctId, { stepIndex: index, stepName: name, timeOnPreviousStep });\n}\n\nexport function validateCoreAction(actionName: string): void {\n if (!actionName || typeof actionName !== \"string\") {\n const msg = `Invalid actionName: \"${actionName}\". Must be a non-empty string.`;\n throw new AnalyticsError(ANALYTICS_ERROR_CODES.INVALID_ACTION_NAME, msg);\n }\n}\n","import { identityManager } from \"../domains/identity\";\nimport type { ConditionalFlagContext, FlagVariant } from \"../types\";\n\nimport type { ApiClient } from \"./ApiClient\";\nimport type { PaywalloState } from \"./PaywalloState\";\n\nexport async function getVariantCached(apiClient: ApiClient, flagKey: string, defaultValue?: string): Promise<FlagVariant> {\n const distinctId = identityManager.getDistinctId();\n const result = await apiClient.getVariantFromCache(flagKey, distinctId);\n if (result) return result;\n void apiClient.getVariant(flagKey, distinctId).catch(() => {});\n return { variant: defaultValue ?? null, payload: undefined };\n}\n\nexport async function getVariant(apiClient: ApiClient, state: PaywalloState, flagKey: string): Promise<FlagVariant> {\n try {\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) {\n if (state.config?.debug) console.log(`[Paywallo FLAG] ${flagKey} → null (no distinctId)`);\n return { variant: null };\n }\n const result = await apiClient.getVariant(flagKey, distinctId);\n if (state.config?.debug) console.log(`[Paywallo FLAG] ${flagKey} →`, result.variant);\n return result;\n } catch (error) {\n if (state.config?.debug) console.log(`[Paywallo FLAG] ${flagKey} → error`, error);\n if (state.apiClient) void state.apiClient.reportError(\"GET_VARIANT_FAILED\", error instanceof Error ? error.message : String(error));\n return { variant: null };\n }\n}\n\nexport function evaluateFlags(apiClient: ApiClient, keys: string[]): Promise<Record<string, string | null>> {\n return apiClient.evaluateFlags(keys, identityManager.getDistinctId());\n}\n\nexport async function getConditionalFlag(apiClient: ApiClient, state: PaywalloState, flagKey: string, context?: Partial<ConditionalFlagContext>): Promise<boolean> {\n try {\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) return false;\n const result = await apiClient.getConditionalFlag(flagKey, { distinctId, ...context });\n return result.value;\n } catch (error) {\n if (state.apiClient) void state.apiClient.reportError(\"GET_CONDITIONAL_FLAG_FAILED\", error instanceof Error ? error.message : String(error));\n return false;\n }\n}\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class OnboardingError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"onboarding\", code, message);\n this.name = \"OnboardingError\";\n }\n}\n\nexport const ONBOARDING_ERROR_CODES = {\n NOT_INITIALIZED: \"ONBOARDING_NOT_INITIALIZED\",\n INVALID_STEP_NAME: \"ONBOARDING_INVALID_STEP_NAME\",\n} as const;\n","import { ONBOARDING_ERROR_CODES,OnboardingError } from \"./OnboardingError\";\nimport { OnboardingDropPayload, OnboardingStepPayload } from \"./types\";\n\n/**\n * Minimal surface the OnboardingManager needs from the unified event pipeline.\n * `PaywalloClient` satisfies this interface (forwarding to\n * `ApiClient.trackEvent` → `EventBatcher` → `/api/v1/events/batch`).\n */\nexport interface OnboardingEventPipeline {\n trackEvent(\n eventName: string,\n distinctId: string,\n properties?: Record<string, unknown>,\n timestamp?: number\n ): Promise<void>;\n getDistinctId(): string;\n}\n\ninterface OnboardingDepsConfig {\n pipeline: OnboardingEventPipeline;\n debug?: boolean;\n}\n\nexport class OnboardingManager {\n private pipeline: OnboardingEventPipeline | null = null;\n private debug = false;\n private lastStep: string | null = null;\n private finished = false;\n\n /**\n * Injects runtime dependencies. Called by PaywalloClient during init.\n */\n injectDeps(config: OnboardingDepsConfig): void {\n this.pipeline = config.pipeline;\n this.debug = config.debug ?? false;\n }\n\n /**\n * Tracks an onboarding step view.\n * Saves the step name internally for implicit drop detection on the backend.\n *\n * @param stepName - Unique name for this onboarding step.\n */\n async step(stepName: string): Promise<void> {\n this.assertConfig();\n this.validateStepName(stepName, \"step\");\n this.lastStep = stepName;\n const payload: Record<string, unknown> = {\n family: \"onboarding\",\n type: \"step\",\n ...(({ step_name: stepName } satisfies OnboardingStepPayload) as Record<string, unknown>),\n };\n return this.emit(\"onboarding\", payload, \"step\");\n }\n\n /**\n * Tracks successful completion of the onboarding flow.\n * Marks the flow as finished.\n */\n async complete(): Promise<void> {\n this.assertConfig();\n this.finished = true;\n return this.emit(\"onboarding\", { family: \"onboarding\", type: \"complete\" }, \"complete\");\n }\n\n /**\n * Tracks an explicit drop (abandonment) at the given step.\n * Marks the flow as finished.\n *\n * @param stepName - The step name where the user dropped off.\n */\n async drop(stepName: string): Promise<void> {\n this.assertConfig();\n this.validateStepName(stepName, \"drop\");\n this.finished = true;\n const payload: Record<string, unknown> = {\n family: \"onboarding\",\n type: \"drop\",\n ...(({ step_name: stepName } satisfies OnboardingDropPayload) as Record<string, unknown>),\n };\n return this.emit(\"onboarding\", payload, \"drop\");\n }\n\n /** Returns the last step name seen, or null if no step was tracked yet. */\n getLastStep(): string | null {\n return this.lastStep;\n }\n\n /** Returns whether the flow has been marked as finished (complete or drop). */\n isFinished(): boolean {\n return this.finished;\n }\n\n private async emit(\n eventName: string,\n properties: Record<string, unknown>,\n logLabel: string\n ): Promise<void> {\n const pipeline = this.pipeline!;\n const distinctId = pipeline.getDistinctId();\n if (!distinctId) {\n if (this.debug) console.log(`[Paywallo:Onboarding] skipped (no distinctId): ${logLabel}`);\n return;\n }\n await pipeline.trackEvent(eventName, distinctId, properties);\n if (this.debug) {\n console.log(`[Paywallo:Onboarding] event emitted: ${eventName}.${logLabel}`, properties);\n }\n }\n\n private assertConfig(): void {\n if (!this.pipeline) {\n throw new OnboardingError(\n ONBOARDING_ERROR_CODES.NOT_INITIALIZED,\n \"OnboardingManager not initialized. Call Paywallo.init() first.\"\n );\n }\n }\n\n private validateStepName(stepName: string, method: string): void {\n if (typeof stepName !== \"string\" || stepName.trim().length === 0) {\n throw new OnboardingError(\n ONBOARDING_ERROR_CODES.INVALID_STEP_NAME,\n `OnboardingManager.${method}(): stepName must be a non-empty string.`\n );\n }\n }\n}\n\nexport const onboardingManager = new OnboardingManager();\n","export { ONBOARDING_ERROR_CODES,OnboardingError } from \"./OnboardingError\";\nexport { OnboardingManager, onboardingManager } from \"./OnboardingManager\";\nexport type { OnboardingDropPayload,OnboardingStepPayload } from \"./types\";\n","import type { ApiClient } from \"../../core/ApiClient\";\n\nimport { clearPersistedHeartbeat, readPersistedHeartbeat } from \"./paywallHeartbeat\";\n\n/**\n * Recovery do heartbeat crash-safe (sub-fase 2.10).\n *\n * Chamada uma vez por boot do SDK (dentro de `PaywalloInitializer.doInit`),\n * DEPOIS do `apiClient` estar pronto mas ANTES de qualquer outra emissão de\n * paywall. Se existir um snapshot órfão no SecureStorage, significa que na\n * sessão anterior o processo morreu com um paywall aberto — emite o evento\n * canônico `paywall {type: \"closed\", close_reason: \"error\"}` com\n * `duration_s = lastSeen - presentedAt` (±5s dado o intervalo de heartbeat).\n *\n * Isso garante que `paywall_interactions.closedAt/durationS/variantId` nunca\n * ficam NULL mesmo em OOM, kill do sistema ou crash nativo.\n */\nexport async function recoverPaywallHeartbeat(\n apiClient: ApiClient,\n distinctId: string,\n sessionId: string | null,\n debug?: boolean,\n): Promise<boolean> {\n const snapshot = await readPersistedHeartbeat();\n if (!snapshot) return false;\n try {\n const closedAt = new Date(snapshot.lastSeen);\n const durationS = Math.max(0, Math.round((snapshot.lastSeen - snapshot.presentedAt) / 1000));\n await apiClient.trackEvent(\"paywall\", distinctId, {\n type: \"closed\",\n paywall_id: snapshot.paywallId,\n placement: snapshot.placement,\n closed_at: closedAt.toISOString(),\n duration_s: durationS,\n close_reason: \"error\",\n ...(snapshot.variantId && { variant_id: snapshot.variantId }),\n ...(snapshot.variantKey && { variant_key: snapshot.variantKey }),\n ...(snapshot.campaignId && { campaign_id: snapshot.campaignId }),\n ...(sessionId && { sessionId }),\n });\n if (debug) console.log(\"[Paywallo HEARTBEAT] recovered orphan paywall close\", {\n paywallId: snapshot.paywallId,\n durationS,\n });\n return true;\n } catch (err) {\n if (debug) console.log(\"[Paywallo HEARTBEAT] recovery failed\", err);\n return false;\n } finally {\n await clearPersistedHeartbeat();\n }\n}\n","import { SecureStorage } from \"../../core/storage/SecureStorage\";\n\nimport type { CachedSubscription, SubscriptionStatusResponse } from \"./types\";\n\nconst LEGACY_CACHE_KEY = \"@panel:subscription_cache\";\nconst CACHE_KEY_PREFIX = \"subscription_cache:\";\nconst CACHE_INDEX_KEY = \"subscription_cache:__index__\";\nconst DEFAULT_TTL = 24 * 60 * 60 * 1000;\n\nfunction keyFor(distinctId: string): string {\n return `${CACHE_KEY_PREFIX}${distinctId}`;\n}\n\nexport class SubscriptionCache {\n private ttl: number;\n private memoryCache: Map<string, CachedSubscription> = new Map();\n private storage: SecureStorage;\n private legacyCleanupDone = false;\n\n constructor(ttl: number = DEFAULT_TTL) {\n this.ttl = ttl;\n this.storage = new SecureStorage();\n }\n\n private async cleanupLegacyCache(): Promise<void> {\n if (this.legacyCleanupDone) return;\n this.legacyCleanupDone = true;\n try {\n await this.storage.remove(LEGACY_CACHE_KEY);\n } catch {\n }\n }\n\n async get(distinctId: string): Promise<CachedSubscription | null> {\n await this.cleanupLegacyCache();\n if (!distinctId) return null;\n\n const memEntry = this.memoryCache.get(distinctId);\n if (memEntry && !this.isExpired(memEntry)) {\n return memEntry;\n }\n\n try {\n const stored = await this.storage.get(keyFor(distinctId));\n if (!stored) {\n return null;\n }\n\n const parsed: unknown = JSON.parse(stored);\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n !(\"data\" in parsed) ||\n typeof (parsed as Record<string, unknown>).data !== \"object\" ||\n (parsed as Record<string, unknown>).data === null ||\n !(\"cachedAt\" in parsed) ||\n typeof (parsed as Record<string, unknown>).cachedAt !== \"number\"\n ) {\n await this.storage.remove(keyFor(distinctId));\n return null;\n }\n const cached = parsed as CachedSubscription;\n\n if (cached.data.subscription?.expiresAt) {\n cached.data.subscription.expiresAt = new Date(cached.data.subscription.expiresAt);\n }\n if (cached.data.subscription?.originalPurchaseDate) {\n cached.data.subscription.originalPurchaseDate = new Date(\n cached.data.subscription.originalPurchaseDate\n );\n }\n if (cached.data.subscription?.latestPurchaseDate) {\n cached.data.subscription.latestPurchaseDate = new Date(\n cached.data.subscription.latestPurchaseDate\n );\n }\n if (cached.data.subscription?.cancellationDate) {\n cached.data.subscription.cancellationDate = new Date(\n cached.data.subscription.cancellationDate\n );\n }\n if (cached.data.subscription?.gracePeriodExpiresAt) {\n cached.data.subscription.gracePeriodExpiresAt = new Date(\n cached.data.subscription.gracePeriodExpiresAt\n );\n }\n\n cached.isStale = this.isExpired(cached);\n if (!cached.isStale) {\n this.memoryCache.set(distinctId, cached);\n }\n\n return cached;\n } catch {\n return null;\n }\n }\n\n async set(distinctId: string, data: SubscriptionStatusResponse): Promise<void> {\n if (!distinctId) return;\n const cached: CachedSubscription = {\n data,\n cachedAt: Date.now(),\n isStale: false,\n };\n\n this.memoryCache.set(distinctId, cached);\n\n try {\n await this.storage.set(keyFor(distinctId), JSON.stringify(cached));\n await this.addToIndex(distinctId);\n } catch {\n }\n }\n\n private async addToIndex(distinctId: string): Promise<void> {\n try {\n const raw = await this.storage.get(CACHE_INDEX_KEY);\n const ids: string[] = raw ? (JSON.parse(raw) as string[]) : [];\n if (!ids.includes(distinctId)) {\n ids.push(distinctId);\n await this.storage.set(CACHE_INDEX_KEY, JSON.stringify(ids));\n }\n } catch {\n }\n }\n\n private async readIndex(): Promise<string[]> {\n try {\n const raw = await this.storage.get(CACHE_INDEX_KEY);\n if (!raw) return [];\n return JSON.parse(raw) as string[];\n } catch {\n return [];\n }\n }\n\n async invalidate(distinctId: string): Promise<void> {\n if (!distinctId) return;\n this.memoryCache.delete(distinctId);\n\n try {\n await this.storage.remove(keyFor(distinctId));\n } catch {\n }\n }\n\n async invalidateAll(): Promise<void> {\n // Collect keys from memory AND from the persisted index (survives restarts)\n const memKeys = Array.from(this.memoryCache.keys());\n const indexKeys = await this.readIndex();\n const allKeys = Array.from(new Set([...memKeys, ...indexKeys]));\n\n this.memoryCache.clear();\n\n await Promise.allSettled([\n this.storage.remove(LEGACY_CACHE_KEY),\n this.storage.remove(CACHE_INDEX_KEY),\n ...allKeys.map((k) => this.storage.remove(keyFor(k))),\n ]);\n }\n\n private isExpired(cached: CachedSubscription): boolean {\n return Date.now() - cached.cachedAt > this.ttl;\n }\n\n setTTL(ttl: number): void {\n this.ttl = ttl;\n }\n}\n\nexport const subscriptionCache = new SubscriptionCache();\n","import { SESSION_ERROR_CODES, SessionError } from \"../session/SessionError\";\n\nimport { SubscriptionCache } from \"./SubscriptionCache\";\nimport type {\n SubscriptionInfo,\n SubscriptionManagerConfig,\n SubscriptionStatusResponse,\n} from \"./types\";\n\ntype SubscriptionListener = (subscription: SubscriptionStatusResponse) => void;\n\nclass SubscriptionManagerClass {\n private config: SubscriptionManagerConfig | null = null;\n private cache: SubscriptionCache;\n private listeners: Set<SubscriptionListener> = new Set();\n private userId: string | null = null;\n\n constructor() {\n this.cache = new SubscriptionCache();\n }\n\n private cacheKey(): string {\n return this.userId ?? \"__anonymous__\";\n }\n\n init(config: SubscriptionManagerConfig): void {\n this.config = config;\n if (config.cacheTTL) {\n this.cache.setTTL(config.cacheTTL);\n }\n }\n\n setUserId(userId: string | null): void {\n if (this.userId !== userId) {\n this.userId = userId;\n void this.cache.invalidateAll();\n }\n }\n\n async hasActiveSubscription(forceRefresh = false): Promise<boolean> {\n const status = await this.getSubscriptionStatus(forceRefresh);\n return status.hasActiveSubscription;\n }\n\n async getSubscription(forceRefresh = false): Promise<SubscriptionInfo | null> {\n const status = await this.getSubscriptionStatus(forceRefresh);\n return status.subscription;\n }\n\n async getEntitlements(forceRefresh = false): Promise<string[]> {\n const status = await this.getSubscriptionStatus(forceRefresh);\n return status.entitlements;\n }\n\n async getSubscriptionStatus(forceRefresh = false): Promise<SubscriptionStatusResponse> {\n if (!this.config) {\n return this.getEmptyStatus();\n }\n\n if (!forceRefresh) {\n const cached = await this.cache.get(this.cacheKey());\n if (cached && !cached.isStale) {\n return cached.data;\n }\n }\n\n try {\n const status = await this.fetchSubscriptionStatus();\n await this.cache.set(this.cacheKey(), status);\n this.notifyListeners(status);\n return status;\n } catch (error) {\n this.log(\"Failed to fetch subscription status\", error);\n\n const cached = await this.cache.get(this.cacheKey());\n if (cached) {\n return cached.data;\n }\n\n return this.getEmptyStatus();\n }\n }\n\n async restorePurchases(): Promise<SubscriptionStatusResponse> {\n if (!this.config) {\n throw new SessionError(\n SESSION_ERROR_CODES.NOT_INITIALIZED,\n \"SubscriptionManager not initialized\"\n );\n }\n\n await this.cache.invalidate(this.cacheKey());\n return this.getSubscriptionStatus(true);\n }\n\n private async fetchSubscriptionStatus(): Promise<SubscriptionStatusResponse> {\n if (!this.config) {\n return this.getEmptyStatus();\n }\n\n const url = new URL(`${this.config.serverUrl}/sdk/purchases/status/${this.config.appKey}`);\n if (this.userId) {\n url.searchParams.set(\"distinctId\", this.userId);\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-App-Key\": this.config.appKey,\n },\n });\n\n if (!response.ok) {\n throw new SessionError(\n SESSION_ERROR_CODES.RESTORE_FAILED,\n `Failed to fetch subscription status: ${response.status}`\n );\n }\n\n const data = (await response.json()) as SubscriptionStatusResponse;\n\n if (data.subscription) {\n data.subscription.expiresAt = new Date(data.subscription.expiresAt);\n data.subscription.originalPurchaseDate = new Date(data.subscription.originalPurchaseDate);\n data.subscription.latestPurchaseDate = new Date(data.subscription.latestPurchaseDate);\n if (data.subscription.cancellationDate) {\n data.subscription.cancellationDate = new Date(data.subscription.cancellationDate);\n }\n if (data.subscription.gracePeriodExpiresAt) {\n data.subscription.gracePeriodExpiresAt = new Date(data.subscription.gracePeriodExpiresAt);\n }\n }\n\n return data;\n }\n\n private getEmptyStatus(): SubscriptionStatusResponse {\n return {\n hasActiveSubscription: false,\n subscription: null,\n entitlements: [],\n };\n }\n\n addListener(listener: SubscriptionListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notifyListeners(status: SubscriptionStatusResponse): void {\n for (const listener of this.listeners) {\n listener(status);\n }\n }\n\n async onPurchaseComplete(): Promise<void> {\n await this.cache.invalidate(this.cacheKey());\n await this.getSubscriptionStatus(true);\n }\n\n private log(...args: unknown[]): void {\n if (this.config?.debug) console.log(\"[Paywallo:Subscription]\", ...args);\n }\n}\n\nexport const subscriptionManager = new SubscriptionManagerClass();\n","import type { ApiClient } from \"../../core/ApiClient\";\nimport type {\n CampaignResponse,\n EmergencyPaywallResponse,\n SubscriptionStatusResponse,\n ValidatePurchaseResponse,\n} from \"../../types\";\n\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"./PurchaseError\";\n\nexport async function validatePurchase(\n client: ApiClient,\n appKey: string,\n platform: \"ios\" | \"android\",\n receipt: string,\n productId: string,\n transactionId: string,\n priceLocal: number,\n currency: string,\n country: string,\n distinctId?: string,\n paywallPlacement?: string,\n variantKey?: string\n): Promise<ValidatePurchaseResponse> {\n const response = await client.post<ValidatePurchaseResponse>(\n \"/sdk/purchases/validate\",\n {\n platform, receipt, productId, transactionId, priceLocal, currency, country, distinctId,\n ...(paywallPlacement !== undefined && { paywallPlacement }),\n ...(variantKey !== undefined && { variantKey }),\n },\n false\n );\n if (!response.ok) {\n throw new PurchaseError(\n PURCHASE_ERROR_CODES.VALIDATION_FAILED,\n `Server validation failed: HTTP ${response.status}`,\n false,\n response.status\n );\n }\n return response.data;\n}\n\nexport async function getSubscriptionStatus(\n client: ApiClient,\n baseUrl: string,\n appKey: string,\n distinctId: string\n): Promise<SubscriptionStatusResponse> {\n const url = new URL(`${baseUrl}/sdk/purchases/status`);\n url.searchParams.set(\"distinctId\", distinctId);\n const response = await client.get<SubscriptionStatusResponse>(url.toString());\n if (!response.ok) {\n throw new PurchaseError(PURCHASE_ERROR_CODES.NETWORK_ERROR, `Subscription status check failed: HTTP ${response.status}`);\n }\n return response.data;\n}\n\nexport async function getEmergencyPaywall(\n client: ApiClient\n): Promise<EmergencyPaywallResponse> {\n try {\n const response = await client.get<EmergencyPaywallResponse>(\"/sdk/emergency-paywall\");\n if (response.status === 404) return { enabled: false };\n return response.data;\n } catch {\n return { enabled: false };\n }\n}\n\nexport async function getCampaignData(\n client: ApiClient,\n baseUrl: string,\n placement: string,\n distinctId: string,\n context?: Record<string, unknown>\n): Promise<CampaignResponse | null> {\n const url = new URL(`${baseUrl}/sdk/campaigns/${placement}`);\n url.searchParams.set(\"distinctId\", distinctId);\n if (context) url.searchParams.set(\"context\", JSON.stringify(context));\n\n const response = await client.get<CampaignResponse | { paywall: null }>(url.toString());\n if (response.status === 404) return null;\n\n const data = response.data;\n if (\"paywall\" in data && data.paywall === null && !(\"campaignId\" in data)) return null;\n return data as CampaignResponse;\n}\n","import type { CampaignResponse, FlagVariant, PaywallConfig } from \"../types\";\n\ntype CacheEntry<T> = { value: T; ts: number; ttl?: number };\n\nexport class ApiCache {\n private readonly CACHE_TTL = 300_000;\n private readonly CACHE_NULL_TTL = 30_000;\n private readonly MAX_SIZE = 200;\n private readonly STALE_WINDOW_MS = 86_400_000;\n\n private variantCache = new Map<string, CacheEntry<FlagVariant>>();\n private paywallCache = new Map<string, CacheEntry<PaywallConfig | null>>();\n private campaignCache = new Map<string, CacheEntry<CampaignResponse | null>>();\n\n getCached<T>(cache: Map<string, CacheEntry<T>>, key: string): T | undefined {\n const entry = cache.get(key);\n if (!entry) return undefined;\n const ttl = entry.ttl ?? this.CACHE_TTL;\n if (Date.now() - entry.ts < ttl) return entry.value;\n cache.delete(key);\n return undefined;\n }\n\n setCached<T>(\n cache: Map<string, CacheEntry<T>>,\n key: string,\n value: T,\n ttlOverride?: number\n ): void {\n const entry: CacheEntry<T> = { value, ts: Date.now() };\n if (ttlOverride !== undefined) entry.ttl = ttlOverride;\n cache.set(key, entry);\n }\n\n evictExpiredEntries<T>(cache: Map<string, CacheEntry<T>>): void {\n if (cache.size <= this.MAX_SIZE) return;\n const now = Date.now();\n for (const [key, entry] of cache) {\n const ttl = entry.ttl ?? this.CACHE_TTL;\n if (now - entry.ts > ttl) cache.delete(key);\n }\n }\n\n getVariant(key: string): FlagVariant | undefined {\n return this.getCached(this.variantCache, key);\n }\n\n setVariant(key: string, value: FlagVariant, ttlOverride?: number): void {\n this.setCached(this.variantCache, key, value, ttlOverride);\n this.evictExpiredEntries(this.variantCache);\n }\n\n get nullTTL(): number {\n return this.CACHE_NULL_TTL;\n }\n\n getStaleVariant(key: string): FlagVariant | undefined {\n const entry = this.variantCache.get(key);\n if (entry && Date.now() - entry.ts < this.STALE_WINDOW_MS) return entry.value;\n return undefined;\n }\n\n getPaywall(key: string): PaywallConfig | null | undefined {\n return this.getCached(this.paywallCache, key);\n }\n\n setPaywall(key: string, value: PaywallConfig | null, ttlOverride?: number): void {\n this.setCached(this.paywallCache, key, value, ttlOverride);\n this.evictExpiredEntries(this.paywallCache);\n }\n\n getStalePaywall(key: string): PaywallConfig | null | undefined {\n const entry = this.paywallCache.get(key);\n if (entry && Date.now() - entry.ts < this.STALE_WINDOW_MS) return entry.value;\n return undefined;\n }\n\n getCampaign(key: string): CampaignResponse | null | undefined {\n return this.getCached(this.campaignCache, key);\n }\n\n setCampaign(key: string, value: CampaignResponse | null, ttlOverride?: number): void {\n this.setCached(this.campaignCache, key, value, ttlOverride);\n this.evictExpiredEntries(this.campaignCache);\n }\n\n getStaleCampaign(key: string): CampaignResponse | null | undefined {\n const entry = this.campaignCache.get(key);\n if (entry && Date.now() - entry.ts < this.STALE_WINDOW_MS) return entry.value;\n return undefined;\n }\n}\n","import type { ConditionalFlagContext } from \"../types\";\n\nimport { DEFAULT_WEB_URL } from \"./constants\";\n\n/**\n * Derives the web (dashboard) URL from the API base URL.\n * - Local dev (192.168.x or localhost): same host, port 3000\n * - Production: uses DEFAULT_WEB_URL (paywallo.com.br)\n * - api.* → app.*\n */\nexport function deriveWebUrl(baseUrl: string): string {\n try {\n const url = new URL(baseUrl);\n if (url.hostname.startsWith(\"192.168\") || url.hostname === \"localhost\") {\n url.port = \"3000\";\n return url.toString().replace(/\\/$/, \"\");\n }\n if (url.hostname.startsWith(\"api.\")) {\n url.hostname = url.hostname.replace(\"api.\", \"app.\");\n return url.toString().replace(/\\/$/, \"\");\n }\n return DEFAULT_WEB_URL;\n } catch {\n return DEFAULT_WEB_URL;\n }\n}\n\n/** Builds a URL with optional query params appended. */\nexport function buildUrl(base: string, params?: Record<string, unknown>): string {\n if (!params) return base;\n const entries = Object.entries(params).filter(([, v]) => v !== undefined && v !== null);\n if (entries.length === 0) return base;\n const query = entries\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join(\"&\");\n return `${base}?${query}`;\n}\n\n/** Builds the URL for the conditional-flags endpoint including context query params. */\nexport function buildConditionalFlagUrl(\n baseUrl: string,\n flagKey: string,\n context: ConditionalFlagContext\n): string {\n const url = new URL(`${baseUrl}/sdk/conditional-flags/${flagKey}`);\n if (context.platform) url.searchParams.set(\"platform\", context.platform);\n if (context.appVersion) url.searchParams.set(\"appVersion\", context.appVersion);\n if (context.country) url.searchParams.set(\"country\", context.country);\n if (context.distinctId) url.searchParams.set(\"distinctId\", context.distinctId);\n return url.toString();\n}\n","import type { FlagVariant } from \"../types\";\n\nimport { secureStorage } from \"./storage/SecureStorage\";\n\nconst FLAG_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport async function readFlagFromStorage(flagKey: string, distinctId: string): Promise<FlagVariant | null> {\n try {\n const raw = await secureStorage.get(`flag:${flagKey}:${distinctId}`);\n if (!raw) return null;\n const parsed: unknown = JSON.parse(raw);\n if (\n typeof parsed !== \"object\" || parsed === null ||\n !(\"variant\" in parsed) || !(\"cachedAt\" in parsed) ||\n typeof (parsed as Record<string, unknown>).cachedAt !== \"number\"\n ) return null;\n const { variant, payload, cachedAt } = parsed as { variant: string | null; payload?: Record<string, unknown>; cachedAt: number };\n if (Date.now() - cachedAt > FLAG_MAX_AGE_MS) return null;\n return { variant, payload };\n } catch {\n return null;\n }\n}\n\nexport async function writeFlagToStorage(flagKey: string, distinctId: string, flag: FlagVariant): Promise<void> {\n try {\n const value = JSON.stringify({ variant: flag.variant, payload: flag.payload, cachedAt: Date.now() });\n await secureStorage.set(`flag:${flagKey}:${distinctId}`, value);\n } catch {\n // storage failures are non-critical\n }\n}\n","import type { ConditionalFlagContext, ConditionalFlagResult, FlagVariant } from \"../types\";\n\nimport { ApiCache } from \"./ApiCache\";\nimport { buildConditionalFlagUrl } from \"./apiUrlUtils\";\nimport { readFlagFromStorage, writeFlagToStorage } from \"./FlagStorage\";\nimport type { HttpClient } from \"./http\";\n\nexport interface FlagClientDeps {\n get<T>(path: string): Promise<{ ok: boolean; status: number; data: T }>;\n httpClient: HttpClient;\n cache: ApiCache;\n appKey: string;\n baseUrl: string;\n}\n\nexport async function getVariant(\n deps: FlagClientDeps,\n flagKey: string,\n distinctId: string,\n): Promise<FlagVariant> {\n const key = `${flagKey}:${distinctId}`;\n const hit = deps.cache.getVariant(key);\n if (hit !== undefined) return hit;\n\n const persisted = await readFlagFromStorage(flagKey, distinctId);\n if (persisted !== null) { deps.cache.setVariant(key, persisted); return persisted; }\n\n try {\n const res = await deps.get<FlagVariant>(`/sdk/flags/${flagKey}?distinctId=${encodeURIComponent(distinctId)}`);\n if (res.status === 404) {\n const v: FlagVariant = { variant: null };\n deps.cache.setVariant(key, v, deps.cache.nullTTL);\n return v;\n }\n if (!res.ok) {\n const stale = deps.cache.getStaleVariant(key);\n return stale !== undefined ? stale : { variant: null };\n }\n deps.cache.setVariant(key, res.data);\n await writeFlagToStorage(flagKey, distinctId, res.data);\n return res.data;\n } catch {\n const stale = deps.cache.getStaleVariant(key);\n return stale !== undefined ? stale : { variant: null };\n }\n}\n\nexport async function evaluateFlags(\n deps: FlagClientDeps,\n keys: string[],\n distinctId: string,\n): Promise<Record<string, string | null>> {\n const query = keys.map(encodeURIComponent).join(\",\");\n try {\n const res = await deps.httpClient.get<unknown>(`/sdk/flags/evaluate?keys=${query}`, {\n headers: { \"X-App-Key\": deps.appKey, \"x-distinct-id\": distinctId },\n });\n if (!res.ok || typeof res.data !== \"object\" || res.data === null || Array.isArray(res.data)) return {};\n const record = res.data as Record<string, unknown>;\n const result: Record<string, string | null> = {};\n for (const key of Object.keys(record)) {\n const value = record[key];\n const variant: string | null =\n typeof value === \"boolean\" ? String(value) : typeof value === \"string\" ? value : null;\n result[key] = variant;\n const flagVariant: FlagVariant = { variant };\n deps.cache.setVariant(`${key}:${distinctId}`, flagVariant);\n await writeFlagToStorage(key, distinctId, flagVariant);\n }\n return result;\n } catch {\n return {};\n }\n}\n\nexport async function getConditionalFlag(\n deps: FlagClientDeps,\n flagKey: string,\n context: ConditionalFlagContext,\n): Promise<ConditionalFlagResult> {\n try {\n const url = buildConditionalFlagUrl(deps.baseUrl, flagKey, context);\n const response = await deps.get<{ value: boolean }>(url);\n if (response.status === 404 || !response.ok) return { value: false, flagKey };\n return { value: response.data.value, flagKey };\n } catch {\n return { value: false, flagKey };\n }\n}\n\nexport async function getVariantFromCache(\n deps: FlagClientDeps,\n flagKey: string,\n distinctId: string,\n): Promise<FlagVariant | null> {\n const key = `${flagKey}:${distinctId}`;\n const hit = deps.cache.getVariant(key);\n if (hit !== undefined) return hit;\n const persisted = await readFlagFromStorage(flagKey, distinctId);\n if (persisted !== null) { deps.cache.setVariant(key, persisted); return persisted; }\n return null;\n}\n","import { networkMonitor } from \"./network\";\nimport { offlineQueue } from \"./queue\";\n\nexport interface QueueDeps {\n isOfflineQueueEnabled: () => boolean;\n getAppKey: () => string;\n isDebug: () => boolean;\n post: (path: string, body: unknown, skipRetry?: boolean) => Promise<unknown>;\n}\n\nexport async function postWithQueue(\n deps: QueueDeps,\n url: string,\n payload: unknown,\n label: string,\n priority?: \"critical\" | \"normal\",\n): Promise<void> {\n if (deps.isOfflineQueueEnabled() && !networkMonitor.isOnline()) {\n await offlineQueue.enqueue(\n \"POST\",\n url,\n payload as Record<string, unknown>,\n { \"X-App-Key\": deps.getAppKey() },\n undefined,\n priority,\n );\n if (deps.isDebug()) console.log(\"[Paywallo:ApiClient] Queued for offline:\", label, priority ?? \"normal\");\n return;\n }\n try {\n await deps.post(url, payload);\n } catch (error) {\n if (deps.isDebug()) console.log(\"[Paywallo:ApiClient] Request failed:\", label, error);\n if (deps.isOfflineQueueEnabled()) {\n await offlineQueue.enqueue(\n \"POST\",\n url,\n payload,\n { \"X-App-Key\": deps.getAppKey() },\n undefined,\n priority,\n );\n return;\n }\n throw error;\n }\n}\n","import { z } from \"zod\";\n\n/**\n * 7 famílias canônicas de evento do Paywallo SDK V2.\n *\n * Cada schema é strict — campos não declarados são rejeitados pelo parse.\n * Isso força callers a emitir eventos no shape canônico e elimina eventos\n * \"lixo\" (payloads inconsistentes que o server descarta).\n *\n * A superfície pública (`paywallo.track(name, props)`) não muda — os\n * schemas rodam no EventBatcher antes do enqueue e falham loud em debug.\n */\n\n// ─── lifecycle ───────────────────────────────────────────────────────────\n// install | cold_start | foreground | background | session_start | session_end\nexport const lifecycleEventSchema = z\n .object({\n type: z.enum([\n \"install\",\n \"cold_start\",\n \"foreground\",\n \"background\",\n \"session_start\",\n \"session_end\",\n ]),\n session_id: z.string().optional(),\n duration_s: z.number().nonnegative().optional(),\n first_ever: z.boolean().optional(),\n // Contexto leve transportado em lifecycle (útil pra cold_start/install)\n app_version: z.string().optional(),\n device_type: z.enum([\"ios\", \"android\"]).optional(),\n os_version: z.string().optional(),\n // Timestamps opcionais — o EventBatcher injeta `timestamp` no envelope\n started_at: z.string().optional(),\n ended_at: z.string().optional(),\n })\n .strict();\n\n// ─── identify ────────────────────────────────────────────────────────────\nexport const identifyEventSchema = z\n .object({\n distinct_id: z.string().min(1),\n email: z.email().optional(),\n traits: z.record(z.string(), z.unknown()).optional(),\n attribution: z.record(z.string(), z.unknown()).optional(),\n device: z.record(z.string(), z.unknown()).optional(),\n })\n .strict();\n\n// ─── paywall ─────────────────────────────────────────────────────────────\n// viewed | closed | purchased (apenas 3 types canônicos)\nexport const paywallEventSchema = z\n .object({\n type: z.enum([\"viewed\", \"closed\", \"purchased\"]),\n paywall_id: z.string().min(1),\n placement: z.string().optional(),\n variant_id: z.string().optional(),\n variant_key: z.string().optional(),\n campaign_id: z.string().optional(),\n // `closed`-specific\n closed_at: z.string().optional(),\n duration_s: z.number().nonnegative().optional(),\n close_reason: z\n .enum([\"dismiss\", \"cta\", \"purchase\", \"error\", \"timeout\"])\n .optional(),\n scroll_depth: z.number().min(0).max(1).optional(),\n // `purchased`-specific (mínimo — transaction canônica leva detalhes)\n product_id: z.string().optional(),\n })\n .strict();\n\n// ─── transaction ─────────────────────────────────────────────────────────\n// completed | failed | refunded | renewed | canceled | expired\nexport const transactionEventSchema = z\n .object({\n type: z.enum([\n \"completed\",\n \"failed\",\n \"refunded\",\n \"renewed\",\n \"canceled\",\n \"expired\",\n ]),\n tx_id: z.string().min(1),\n amount: z.number().optional(),\n currency: z.string().length(3).optional(),\n product_id: z.string().optional(),\n subscription_id: z.string().optional(),\n paywall_id: z.string().optional(),\n variant_id: z.string().optional(),\n reason: z.string().optional(),\n })\n .strict();\n\n// ─── onboarding ──────────────────────────────────────────────────────────\n// step | complete | drop\nexport const onboardingEventSchema = z\n .object({\n type: z.enum([\"step\", \"complete\", \"drop\"]),\n step_index: z.number().int().nonnegative().optional(),\n step_name: z.string().optional(),\n variant_key: z.string().optional(),\n time_on_prev_s: z.number().nonnegative().optional(),\n })\n .strict();\n\n// ─── notification ────────────────────────────────────────────────────────\n// delivered | displayed | clicked | dismissed\nexport const notificationEventSchema = z\n .object({\n type: z.enum([\"delivered\", \"displayed\", \"clicked\", \"dismissed\"]),\n notification_id: z.string().optional(),\n campaign_id: z.string().optional(),\n variant_key: z.string().nullable().optional(),\n message_id: z.string().optional(),\n device_id: z.string().optional(),\n push_platform: z.enum([\"ios\", \"android\"]).optional(),\n timezone: z.string().optional(),\n failure_reason: z.string().optional(),\n app_user_id: z.string().optional(),\n })\n .strict();\n\n// ─── custom ──────────────────────────────────────────────────────────────\n// Usuários emitem events próprios (`paywallo.track(\"my_event\", {...})`).\n// `name` é o event name (snake_case, ou `$reserved` para internal events\n// como `$session_start` que não casam com nenhuma família canônica mas\n// continuam válidos no pipeline).\n// `props` é bag aberta — validação strict só no envelope.\nexport const customEventSchema = z\n .object({\n name: z\n .string()\n .min(1)\n .regex(\n /^(\\$[a-zA-Z0-9_]+|[a-z][a-z0-9_]*)$/,\n \"custom event name must be snake_case or $reserved\",\n ),\n props: z.record(z.string(), z.unknown()).optional(),\n })\n .strict();\n\n// ─── types inferidos ─────────────────────────────────────────────────────\nexport type LifecycleEvent = z.infer<typeof lifecycleEventSchema>;\nexport type IdentifyEvent = z.infer<typeof identifyEventSchema>;\nexport type PaywallEvent = z.infer<typeof paywallEventSchema>;\nexport type TransactionEvent = z.infer<typeof transactionEventSchema>;\nexport type OnboardingEvent = z.infer<typeof onboardingEventSchema>;\nexport type NotificationEvent = z.infer<typeof notificationEventSchema>;\nexport type CustomEvent = z.infer<typeof customEventSchema>;\n\nexport type EventFamily =\n | \"lifecycle\"\n | \"identify\"\n | \"paywall\"\n | \"transaction\"\n | \"onboarding\"\n | \"notification\"\n | \"custom\";\n\nexport const EVENT_SCHEMAS = {\n lifecycle: lifecycleEventSchema,\n identify: identifyEventSchema,\n paywall: paywallEventSchema,\n transaction: transactionEventSchema,\n onboarding: onboardingEventSchema,\n notification: notificationEventSchema,\n custom: customEventSchema,\n} as const;\n","import type { ZodError } from \"zod\";\n\nimport { EVENT_SCHEMAS, type EventFamily } from \"./schemas\";\n\n/**\n * Lista explícita das famílias canônicas. Qualquer `eventName` que NÃO\n * esteja aqui cai em `custom` (após passar pelo regex de nomes).\n */\nconst CANONICAL_FAMILIES: readonly EventFamily[] = [\n \"lifecycle\",\n \"identify\",\n \"paywall\",\n \"transaction\",\n \"onboarding\",\n \"notification\",\n \"custom\",\n] as const;\n\n/**\n * Eventos legacy que foram REMOVIDOS em V2. Chamá-los vira no-op (com\n * warning em debug). Ficam aqui só pra detecção — nunca são emitidos.\n *\n * Migrations:\n * `$paywall_purchased` → transaction {type:\"completed\"} (via IAPService)\n * `$paywall_product_selected` → REMOVIDO (sem consumer no server)\n * `$core_action` → REMOVIDO (sem consumer no server)\n * `$campaign_impression` → paywall {type:\"viewed\", campaign_id}\n * `$app_open` → lifecycle {type:\"cold_start\"|\"foreground\"}\n * `$app_background` → lifecycle {type:\"background\"}\n * `$app_foreground` → lifecycle {type:\"foreground\"}\n * `session.end` (sem `$`) → lifecycle {type:\"session_end\"}\n */\nexport const DEPRECATED_EVENT_NAMES: readonly string[] = [\n \"$paywall_purchased\",\n \"$paywall_product_selected\",\n \"$core_action\",\n \"$campaign_impression\",\n \"$app_open\",\n \"$app_background\",\n \"$app_foreground\",\n \"session.end\",\n] as const;\n\nexport function isDeprecatedEvent(eventName: string): boolean {\n return DEPRECATED_EVENT_NAMES.includes(eventName);\n}\n\nexport function isCanonicalFamily(name: string): name is EventFamily {\n return (CANONICAL_FAMILIES as readonly string[]).includes(name);\n}\n\n/**\n * Detecta a família canônica a partir do `eventName` que chega ao batcher.\n *\n * - `lifecycle | identify | paywall | transaction | onboarding | notification`\n * casam direto quando o caller usa `track(\"lifecycle\", { type: \"install\" })`.\n * - Qualquer outro nome (snake_case custom ou `$reserved`) vira `custom`.\n */\nexport function detectFamily(eventName: string): EventFamily {\n if (isCanonicalFamily(eventName) && eventName !== \"custom\") {\n return eventName;\n }\n return \"custom\";\n}\n\nexport interface ValidationResult {\n ok: boolean;\n family: EventFamily;\n /** Payload normalizado (shape do schema). Pode ter dropado campos extras. */\n data?: Record<string, unknown>;\n error?: ZodError;\n}\n\n/**\n * Valida o `properties` do event contra o schema da família detectada.\n *\n * Para `custom`: embrulha como `{ name, props }` antes de validar, já que\n * o schema custom espera esse shape (e o EventBatcher externaliza `name`).\n */\nexport function validateEvent(\n eventName: string,\n properties: Record<string, unknown> | undefined\n): ValidationResult {\n const family = detectFamily(eventName);\n const schema = EVENT_SCHEMAS[family];\n\n const input =\n family === \"custom\"\n ? { name: eventName, ...(properties ? { props: properties } : {}) }\n : (properties ?? {});\n\n const parsed = schema.safeParse(input);\n if (parsed.success) {\n return { ok: true, family, data: parsed.data as Record<string, unknown> };\n }\n return { ok: false, family, error: parsed.error };\n}\n\n/**\n * Formata erro do Zod pra log de debug (curto, útil pra dev console).\n */\nexport function formatValidationError(error: ZodError): string {\n return error.issues\n .map((i) => `${i.path.join(\".\") || \"(root)\"}: ${i.message}`)\n .join(\"; \");\n}\n","import { Platform } from \"react-native\";\n\nimport { z } from \"zod\";\n\nimport { generateUUID } from \"../utils/uuid\";\n\nimport { detectFamily } from \"./events/eventFamilies\";\nimport { SDK_VERSION } from \"./version\";\n\n// ─── V2 Envelope Zod Schema ─────────────────────────────────────────────────\n\nconst v2EventSchema = z.object({\n id: z.string().min(1),\n ts: z.number().int().positive(),\n name: z.string().min(1),\n payload: z.record(z.string(), z.unknown()),\n});\n\nconst v2ContextSchema = z.object({\n distinct_id: z.string().optional(),\n session_id: z.string().optional(),\n device_id: z.string().optional(),\n app_version: z.string().optional(),\n sdk_version: z.string().optional(),\n platform: z.string().optional(),\n os_version: z.string().optional(),\n device_model: z.string().optional(),\n timezone: z.string().optional(),\n locale: z.string().optional(),\n attribution: z.record(z.string(), z.unknown()).optional(),\n ids: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const v2EnvelopeSchema = z.object({\n context: v2ContextSchema,\n events: z.array(v2EventSchema).min(1),\n});\n\n// ─── Shared context ──────────────────────────────────────────────────────────\n\n/**\n * Shared context resolved once per batch and hoisted out of every individual\n * event in the V2 ingest envelope. The provider is called at flush time so\n * each field reflects the most recent SDK state.\n *\n * The shape mirrors the server-side `/api/v2/ingest/batch` contract (Phase\n * 3.1). Fields declared here are deduplicated across the batch — they exist\n * once on the envelope instead of `N` times on each `events[]` entry.\n */\nexport interface EventContext {\n distinct_id?: string;\n session_id?: string;\n device_id?: string;\n app_version?: string;\n sdk_version?: string;\n platform?: string;\n os_version?: string;\n device_model?: string;\n timezone?: string;\n locale?: string;\n attribution?: Record<string, unknown>;\n ids?: Record<string, unknown>;\n}\n\nexport type ContextProvider = () => EventContext | null;\n\nexport interface EventInput {\n eventName: string;\n distinctId: string;\n properties: Record<string, unknown>;\n timestamp: number;\n}\n\nexport interface V2Event {\n id: string;\n ts: number;\n name: string;\n payload: Record<string, unknown>;\n}\n\nexport interface V2Envelope {\n context: EventContext;\n events: V2Event[];\n}\n\n/**\n * Keys promoted to the shared `context` when they appear in an event's\n * `properties`. Each promoted field is stripped from the per-event payload\n * so the envelope stays V2-compliant: no duplication between `context` and\n * `events[i].payload`.\n *\n * Both snake_case and the camelCase legacy shape shipped by some callers\n * are recognized — the server receives the canonical snake_case key.\n */\nconst CONTEXT_KEY_ALIASES: Record<keyof EventContext, readonly string[]> = {\n distinct_id: [\"distinct_id\", \"distinctId\"],\n session_id: [\"session_id\", \"sessionId\"],\n device_id: [\"device_id\", \"deviceId\"],\n app_version: [\"app_version\", \"appVersion\"],\n sdk_version: [\"sdk_version\", \"sdkVersion\"],\n platform: [\"platform\"],\n os_version: [\"os_version\", \"osVersion\", \"systemVersion\"],\n device_model: [\"device_model\", \"deviceModel\", \"model\"],\n timezone: [\"timezone\", \"timeZone\"],\n locale: [\"locale\"],\n attribution: [\"attribution\"],\n ids: [\"ids\"],\n};\n\n/**\n * Construct the V2 envelope `{context: {...}, events: [{id, ts, name,\n * payload}]}`. Context fields are pulled from the provider AND from any\n * promotion-eligible keys present on the events themselves — this keeps\n * per-event payloads minimal (~130 bytes for `app_installed` vs the legacy\n * ~1.2 KB duplicated shape, ~80% reduction per batch).\n */\nexport function buildV2Envelope(\n events: EventInput[],\n providerContext: EventContext,\n): V2Envelope {\n const context: EventContext = { ...providerContext };\n\n const v2Events: V2Event[] = events.map((event) => {\n const { payload, promoted } = splitPayloadAndContext(event.properties);\n for (const [key, value] of Object.entries(promoted)) {\n const typedKey = key as keyof EventContext;\n if (context[typedKey] === undefined && value !== undefined) {\n // Types at this point are narrow enough: each promoted key matches\n // its context slot shape (object for attribution/ids, string\n // otherwise). Cast is narrow and local to preserve strict types.\n (context as Record<string, unknown>)[typedKey] = value;\n }\n }\n const family = detectFamily(event.eventName);\n if (family === \"custom\") {\n payload.event_name = event.eventName;\n }\n return {\n id: generateUUID(),\n ts: event.timestamp,\n name: family,\n payload,\n };\n });\n\n // Baseline fields the SDK always knows synchronously. Provider values\n // win so app-specific overrides (e.g. custom sdk_version) are honored.\n if (context.sdk_version === undefined) context.sdk_version = SDK_VERSION;\n if (context.platform === undefined) context.platform = Platform.OS;\n if (context.distinct_id === undefined && events.length > 0) {\n context.distinct_id = events[0].distinctId;\n }\n\n return { context, events: v2Events };\n}\n\n/**\n * Resolve the provider-supplied context, swallowing errors and skipping\n * null/undefined fields so downstream consumers never have to guard.\n */\nexport function resolveProviderContext(provider: ContextProvider | null): EventContext {\n if (!provider) return {};\n try {\n const ctx = provider();\n if (!ctx) return {};\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(ctx)) {\n if (v !== undefined && v !== null) out[k] = v;\n }\n return out as EventContext;\n } catch {\n return {};\n }\n}\n\n/**\n * Split raw event properties into:\n * - `payload`: the slim per-event body (everything not promoted)\n * - `promoted`: the subset that will be hoisted to envelope context\n */\nfunction splitPayloadAndContext(\n properties: Record<string, unknown>,\n): { payload: Record<string, unknown>; promoted: Partial<EventContext> } {\n const payload: Record<string, unknown> = { ...properties };\n const promoted: Record<string, unknown> = {};\n\n for (const canonical of Object.keys(CONTEXT_KEY_ALIASES) as Array<keyof EventContext>) {\n const aliases = CONTEXT_KEY_ALIASES[canonical];\n for (const alias of aliases) {\n if (alias in payload) {\n const value = payload[alias];\n if (value !== undefined && value !== null && promoted[canonical] === undefined) {\n promoted[canonical] = value;\n }\n delete payload[alias];\n }\n }\n }\n\n return { payload, promoted: promoted as Partial<EventContext> };\n}\n","export {\n DEPRECATED_EVENT_NAMES,\n detectFamily,\n formatValidationError,\n isCanonicalFamily,\n isDeprecatedEvent,\n validateEvent,\n type ValidationResult,\n} from \"./eventFamilies\";\nexport {\n type CustomEvent,\n customEventSchema,\n EVENT_SCHEMAS,\n type EventFamily,\n type IdentifyEvent,\n identifyEventSchema,\n type LifecycleEvent,\n lifecycleEventSchema,\n type NotificationEvent,\n notificationEventSchema,\n type OnboardingEvent,\n onboardingEventSchema,\n type PaywallEvent,\n paywallEventSchema,\n type TransactionEvent,\n transactionEventSchema,\n} from \"./schemas\";\n","import { Platform } from \"react-native\";\n\nimport type { UserProperties } from \"../types\";\n\nimport {\n buildV2Envelope,\n type ContextProvider,\n type EventInput,\n resolveProviderContext,\n v2EnvelopeSchema,\n} from \"./eventEnvelopeV2\";\nimport {\n formatValidationError,\n isDeprecatedEvent,\n validateEvent,\n} from \"./events\";\n\nexport type { ContextProvider, EventContext } from \"./eventEnvelopeV2\";\n\ninterface EventPayload {\n eventName: string;\n distinctId: string;\n properties: Record<string, unknown>;\n timestamp: number;\n environment: string;\n}\n\ntype PostFn = (\n url: string,\n payload: unknown,\n label: string,\n priority?: EventPriority,\n) => Promise<void>;\n\n/**\n * Event priority controls flush semantics:\n *\n * - `\"critical\"` → flushed as a batch-of-1 on the next microtask (via\n * `queueMicrotask`). Used for events where loss is unacceptable:\n * `transaction`, `identify`, `lifecycle {type: \"install\"}`,\n * `subscription_*`, `refund`, `checkout_started`.\n * - `\"normal\"` → buffered and flushed on a rolling window (whichever fires\n * first): `BATCH_MAX_SIZE` events OR `BATCH_FLUSH_MS`. Used for events\n * where batching amortizes network cost: `paywall`, non-install\n * `lifecycle` (foreground/background/session), `onboarding`,\n * `notification`, `custom`.\n *\n * Both priorities post to `/sdk/ingest/batch` (Phase 3.1 envelope) with\n * automatic fallback to `/sdk/events/batch` when the V2 endpoint is\n * absent (old server) or rejects the request. `OfflineQueue` handles\n * network-failure durability for both queues via the `PostFn` injected by\n * `ApiClient.postWithQueue`.\n */\nexport type EventPriority = \"critical\" | \"normal\";\n\nexport interface TrackOptions {\n priority?: EventPriority;\n}\n\nconst BATCH_MAX_SIZE = 25;\nconst BATCH_FLUSH_MS = 10_000;\nconst EVENT_NAME_REGEX = /^(\\$[a-zA-Z0-9_]+|[a-z][a-z0-9_]*)$/;\n\nexport const V2_BATCH_ENDPOINT = \"/sdk/ingest/batch\";\nexport const V1_BATCH_ENDPOINT = \"/sdk/events/batch\";\nexport const V1_SINGLE_ENDPOINT = \"/sdk/events\";\n\nexport class EventBatcher {\n private criticalQueue: EventPayload[] = [];\n private normalQueue: EventPayload[] = [];\n private normalTimer: ReturnType<typeof setTimeout> | null = null;\n private criticalScheduled = false;\n private readonly post: PostFn;\n private readonly debug: boolean;\n private readonly contextProvider: ContextProvider | null;\n private v2Disabled = false;\n\n constructor(post: PostFn, debug = false, contextProvider: ContextProvider | null = null) {\n this.post = post;\n this.debug = debug;\n this.contextProvider = contextProvider;\n }\n\n /**\n * Enqueue an event for eventual dispatch.\n *\n * `options.priority` defaults to `\"normal\"` — callers that care about\n * critical semantics must opt in explicitly. The public signature is\n * backwards compatible: pre-existing callers that omit `options` retain\n * today's batched behavior (now on a 25/10s window instead of 10/5s).\n */\n async track(\n eventName: string,\n distinctId: string,\n environment: string,\n properties?: UserProperties,\n timestamp?: number,\n options?: TrackOptions,\n ): Promise<void> {\n if (!EVENT_NAME_REGEX.test(eventName)) {\n if (this.debug) console.log(`[Paywallo] Invalid event name \"${eventName}\". Must be snake_case or start with $`);\n }\n\n // V2 taxonomy: drop deprecated events at the source. Callers that still\n // emit them become a no-op so we never leak lixo to the server.\n if (isDeprecatedEvent(eventName)) {\n if (this.debug) {\n console.log(\n `[Paywallo EVENTS] dropped deprecated event \"${eventName}\" (V2 taxonomy). Migrate to canonical family.`,\n );\n }\n return;\n }\n\n // V2 taxonomy: validate against the canonical family schema. Strict\n // parsing rejects unknown fields — this catches bugs early in dev.\n // The event still flows to the batch even on failure so prod analytics\n // don't go silent; the warning is the signal for the developer.\n const validation = validateEvent(\n eventName,\n properties as Record<string, unknown> | undefined,\n );\n if (!validation.ok && validation.error && this.debug) {\n console.log(\n `[Paywallo EVENTS] schema validation failed for \"${eventName}\" (family=${validation.family}): ${formatValidationError(validation.error)}`,\n );\n }\n\n const event: EventPayload = {\n eventName,\n distinctId,\n properties: { ...(properties as Record<string, unknown>), platform: Platform.OS },\n timestamp: timestamp ?? Date.now(),\n environment: environment.toLowerCase(),\n };\n\n const priority: EventPriority = options?.priority ?? \"normal\";\n\n if (priority === \"critical\") {\n this.criticalQueue.push(event);\n this.scheduleCriticalFlush();\n return;\n }\n\n this.normalQueue.push(event);\n\n if (this.normalQueue.length >= BATCH_MAX_SIZE) {\n if (this.normalTimer !== null) { clearTimeout(this.normalTimer); this.normalTimer = null; }\n await this.flushNormal();\n return;\n }\n\n if (this.normalTimer === null) {\n this.normalTimer = setTimeout(() => { this.normalTimer = null; void this.flushNormal(); }, BATCH_FLUSH_MS);\n }\n }\n\n /**\n * Force flush of the normal queue. Critical events are never held in the\n * normal queue, so this does not affect them (they flush on their own\n * microtask). Exposed so callers (e.g. `AppState=background` listener in\n * phase 2.4) can drain pending events before the app is suspended.\n */\n async flush(): Promise<void> {\n await this.flushNormal();\n }\n\n dispose(): void {\n if (this.normalTimer !== null) { clearTimeout(this.normalTimer); this.normalTimer = null; }\n this.criticalQueue = [];\n this.normalQueue = [];\n this.criticalScheduled = false;\n }\n\n private scheduleCriticalFlush(): void {\n if (this.criticalScheduled) return;\n this.criticalScheduled = true;\n queueMicrotask(() => {\n this.criticalScheduled = false;\n void this.flushCritical();\n });\n }\n\n private async flushCritical(): Promise<void> {\n if (this.criticalQueue.length === 0) return;\n // Drain under a local snapshot so new critical events enqueued during\n // the post don't get mixed in with this batch (they'll schedule their\n // own microtask).\n const drained = this.criticalQueue.splice(0, this.criticalQueue.length);\n // Post each critical event as a batch-of-1 so a single 4xx on one event\n // can't poison an entire critical batch.\n for (const event of drained) {\n try {\n await this.postBatch([event], `event_critical:${event.eventName}`, \"critical\");\n } catch {\n try {\n await this.post(V1_SINGLE_ENDPOINT, event, `event:${event.eventName}`, \"critical\");\n } catch {\n // PostFn is expected to enqueue to OfflineQueue on failure; if it\n // still throws, there's nothing useful to do here beyond logging.\n if (this.debug) console.log(`[Paywallo] critical event ${event.eventName} post failed`);\n }\n }\n }\n }\n\n private async flushNormal(): Promise<void> {\n if (this.normalQueue.length === 0) return;\n const batch = this.normalQueue.splice(0, this.normalQueue.length);\n if (this.normalTimer !== null) { clearTimeout(this.normalTimer); this.normalTimer = null; }\n\n try {\n await this.postBatch(batch, `event_batch:${batch.length}`);\n } catch {\n for (const event of batch) {\n await this.post(V1_SINGLE_ENDPOINT, event, `event:${event.eventName}`);\n }\n }\n }\n\n /**\n * POST the batch with V2 envelope semantics. Tries `/ingest/batch`\n * first; on failure (404/network) falls back to `/events/batch`\n * with the legacy per-event shape for retrocompat.\n *\n * After a single V2 failure we flip `v2Disabled` and stop trying V2 for\n * the lifetime of this EventBatcher — avoids N retries per batch on old\n * servers that will never have the endpoint. A fresh `new EventBatcher()`\n * (e.g. after `Paywallo.init` on a new server URL) resets the flag.\n */\n private async postBatch(\n events: EventPayload[],\n label: string,\n priority: EventPriority = \"normal\",\n ): Promise<void> {\n if (!this.v2Disabled) {\n try {\n const providerContext = resolveProviderContext(this.contextProvider);\n const inputs: EventInput[] = events.map((e) => ({\n eventName: e.eventName,\n distinctId: e.distinctId,\n properties: e.properties,\n timestamp: e.timestamp,\n }));\n const envelope = buildV2Envelope(inputs, providerContext);\n const parsed = v2EnvelopeSchema.safeParse(envelope);\n if (!parsed.success) {\n if (this.debug) console.log(\"[Paywallo EVENTS] V2 envelope schema validation failed:\", parsed.error.issues);\n throw parsed.error;\n }\n await this.post(V2_BATCH_ENDPOINT, parsed.data, label, priority);\n return;\n } catch (error) {\n this.v2Disabled = true;\n if (this.debug) {\n console.log(\n \"[Paywallo EVENTS] V2 ingest unavailable, falling back to /events/batch:\",\n error,\n );\n }\n // fall through to V1 legacy path below\n }\n }\n await this.post(V1_BATCH_ENDPOINT, { events }, label, priority);\n }\n}\n\nexport type { EventInput, V2Envelope, V2Event } from \"./eventEnvelopeV2\";\n","export interface RetryConfig {\n maxRetries: number;\n baseDelay: number;\n maxDelay: number;\n retryableStatusCodes: number[];\n}\n\nexport interface HttpClientConfig {\n baseUrl: string;\n timeout: number;\n retry: RetryConfig;\n debug: boolean;\n /**\n * Headers injected into every outgoing request (e.g. `x-sdk-version`,\n * `x-sdk-platform`). Per-request headers take precedence on conflict.\n */\n globalHeaders: Record<string, string>;\n}\n\nexport interface RequestOptions {\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n headers?: Record<string, string>;\n body?: unknown;\n skipRetry?: boolean;\n timeout?: number;\n}\n\nexport interface HttpResponse<T = unknown> {\n ok: boolean;\n status: number;\n data: T;\n headers: Record<string, string>;\n}\n\nexport interface RetryState {\n attempt: number;\n lastError: Error | null;\n}\n\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: 2,\n baseDelay: 500,\n maxDelay: 4000,\n retryableStatusCodes: [408, 429, 500, 502, 503, 504],\n};\n\nexport const DEFAULT_HTTP_CONFIG: Partial<HttpClientConfig> = {\n timeout: 10000,\n retry: DEFAULT_RETRY_CONFIG,\n debug: false,\n globalHeaders: {},\n};\n","import { CLIENT_ERROR_CODES, ClientError } from \"../../errors/ClientError\";\n\nimport type {\n HttpClientConfig,\n HttpResponse,\n RequestOptions,\n RetryConfig,\n RetryState,\n} from \"./types\";\nimport { DEFAULT_HTTP_CONFIG, DEFAULT_RETRY_CONFIG } from \"./types\";\n\nexport class HttpClient {\n private config: HttpClientConfig;\n\n constructor(baseUrl: string, config?: Partial<Omit<HttpClientConfig, \"baseUrl\">>) {\n this.config = {\n baseUrl,\n timeout: config?.timeout ?? DEFAULT_HTTP_CONFIG.timeout ?? 10000,\n retry: { ...DEFAULT_RETRY_CONFIG, ...config?.retry },\n debug: config?.debug ?? false,\n globalHeaders: { ...(config?.globalHeaders ?? {}) },\n };\n }\n\n /**\n * Merge additional headers into every subsequent request. Call sites\n * (e.g. `ApiClient`) use this to update `x-sdk-environment` when the\n * environment flips from Sandbox to Production at runtime.\n */\n setGlobalHeaders(headers: Record<string, string>): void {\n this.config.globalHeaders = { ...this.config.globalHeaders, ...headers };\n }\n\n async get<T>(path: string, options?: Partial<RequestOptions>): Promise<HttpResponse<T>> {\n return this.request<T>(path, { ...options, method: \"GET\" });\n }\n\n async post<T>(\n path: string,\n body?: unknown,\n options?: Partial<RequestOptions>\n ): Promise<HttpResponse<T>> {\n return this.request<T>(path, { ...options, method: \"POST\", body });\n }\n\n async request<T>(path: string, options: RequestOptions): Promise<HttpResponse<T>> {\n const url = this.buildUrl(path);\n const fetchOptions = this.buildFetchOptions(options);\n const timeout = options.timeout ?? this.config.timeout;\n\n if (options.skipRetry) {\n return this.executeRequest<T>(url, fetchOptions, timeout);\n }\n\n return this.executeWithRetry<T>(url, fetchOptions, options);\n }\n\n private async executeWithRetry<T>(\n url: string,\n fetchOptions: RequestInit,\n options: RequestOptions\n ): Promise<HttpResponse<T>> {\n const retryConfig = this.config.retry;\n const timeout = options.timeout ?? this.config.timeout;\n const state: RetryState = { attempt: 0, lastError: null };\n\n while (state.attempt <= retryConfig.maxRetries) {\n try {\n const response = await this.executeRequest<T>(url, fetchOptions, timeout);\n\n if (this.shouldRetry(response.status, retryConfig)) {\n if (state.attempt < retryConfig.maxRetries) {\n state.attempt++;\n const delay = this.calculateDelayForResponse(state.attempt, response.headers, retryConfig);\n await this.sleep(delay);\n continue;\n }\n }\n\n return response;\n } catch (error) {\n state.lastError = error instanceof Error ? error : new ClientError(CLIENT_ERROR_CODES.UNKNOWN, String(error));\n\n if (this.isNetworkError(state.lastError) && state.attempt < retryConfig.maxRetries) {\n state.attempt++;\n const delay = this.calculateDelay(state.attempt, retryConfig);\n await this.sleep(delay);\n continue;\n }\n\n throw state.lastError;\n }\n }\n\n throw state.lastError ?? new ClientError(CLIENT_ERROR_CODES.UNKNOWN, \"Max retries exceeded\");\n }\n\n private async executeRequest<T>(\n url: string,\n options: RequestInit,\n timeout: number\n ): Promise<HttpResponse<T>> {\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let isCompleted = false;\n\n timeoutId = setTimeout(() => {\n if (!isCompleted) {\n controller.abort();\n }\n }, timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n\n isCompleted = true;\n\n let data: T;\n const contentType = response.headers.get(\"content-type\");\n\n if (contentType?.includes(\"application/json\")) {\n data = (await response.json()) as T;\n } else {\n const textData = await response.text();\n data = textData as unknown as T;\n }\n\n const headers: Record<string, string> = {};\n response.headers.forEach((value: string, key: string) => {\n headers[key] = value;\n });\n\n return {\n ok: response.ok,\n status: response.status,\n data,\n headers,\n };\n } catch (error) {\n // Redact URL path segments that may contain the app key (e.g. /validate/{key}, /status/{key})\n // to avoid leaking credentials in debug logs.\n this.log(\"Request failed\", {\n url: this.redactUrl(url),\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n isCompleted = true;\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n }\n\n private buildUrl(path: string): string {\n if (path.startsWith(\"http://\") || path.startsWith(\"https://\")) {\n // Warn and block plain-HTTP absolute URLs to prevent credential leakage.\n // Exception: localhost / 192.168.x dev servers are allowed for local dev.\n if (path.startsWith(\"http://\")) {\n const isLocalDev = /^http:\\/\\/(localhost|127\\.0\\.0\\.1|192\\.168\\.\\d{1,3}\\.\\d{1,3})/.test(path);\n if (!isLocalDev) {\n const sanitizedPath = path.split(\"?\")[0];\n this.log(\"Blocked http:// request — only HTTPS is allowed in production:\", sanitizedPath);\n throw new ClientError(CLIENT_ERROR_CODES.INSECURE_REQUEST, `Insecure HTTP request blocked: ${sanitizedPath}`);\n }\n }\n return path;\n }\n return `${this.config.baseUrl}${path}`;\n }\n\n private buildFetchOptions(options: RequestOptions): RequestInit {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...this.config.globalHeaders,\n ...options.headers,\n };\n\n const fetchOptions: RequestInit = {\n method: options.method,\n headers,\n };\n\n if (options.body !== undefined) {\n fetchOptions.body = JSON.stringify(options.body);\n }\n\n return fetchOptions;\n }\n\n private shouldRetry(status: number, config: RetryConfig): boolean {\n return config.retryableStatusCodes.includes(status);\n }\n\n private isNetworkError(error: Error): boolean {\n const networkErrorPatterns = [\n \"network\",\n \"fetch\",\n \"ECONNREFUSED\",\n \"ETIMEDOUT\",\n \"ENOTFOUND\",\n \"aborted\",\n \"timeout\",\n ];\n\n const message = error.message.toLowerCase();\n return networkErrorPatterns.some((pattern) => message.includes(pattern.toLowerCase()));\n }\n\n private calculateDelay(attempt: number, config: RetryConfig): number {\n const exponentialDelay = config.baseDelay * Math.pow(2, attempt - 1);\n const jitter = Math.random() * 0.3 * exponentialDelay;\n return Math.min(exponentialDelay + jitter, config.maxDelay);\n }\n\n private calculateDelayForResponse(\n attempt: number,\n headers: Record<string, string>,\n config: RetryConfig\n ): number {\n // Honour Retry-After header (seconds or HTTP-date) to avoid 429 storms.\n const retryAfter = headers[\"retry-after\"];\n if (retryAfter) {\n const seconds = Number(retryAfter);\n if (!Number.isNaN(seconds) && seconds > 0) {\n return Math.min(seconds * 1000, config.maxDelay);\n }\n // HTTP-date format\n const date = new Date(retryAfter);\n if (!Number.isNaN(date.getTime())) {\n const ms = date.getTime() - Date.now();\n if (ms > 0) return Math.min(ms, config.maxDelay);\n }\n }\n return this.calculateDelay(attempt, config);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /** Strips path segments that look like app keys (alphanumeric, 20–64 chars) from URLs before logging. */\n private redactUrl(url: string): string {\n return url.replace(/\\/([a-zA-Z0-9_-]{20,64})(\\?|$|\\/)/g, \"/[REDACTED]$2\");\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) console.log(\"[Paywallo:Http]\", ...args);\n }\n\n setDebug(debug: boolean): void {\n this.config.debug = debug;\n }\n\n getConfig(): Readonly<HttpClientConfig> {\n return { ...this.config };\n }\n}\n","export { HttpClient } from \"./HttpClient\";\nexport type {\n HttpClientConfig,\n HttpResponse,\n RequestOptions,\n RetryConfig,\n RetryState,\n} from \"./types\";\nexport { DEFAULT_HTTP_CONFIG, DEFAULT_RETRY_CONFIG } from \"./types\";\n","import { Platform } from \"react-native\";\n\nimport {\n getCampaignData,\n getEmergencyPaywall,\n getSubscriptionStatus,\n validatePurchase,\n} from \"../domains/iap/apiPurchaseMethods\";\nimport type {\n ApiClientConfig,\n CampaignResponse,\n ConditionalFlagContext,\n ConditionalFlagResult,\n EmergencyPaywallResponse,\n Environment,\n FlagVariant,\n PaywallConfig,\n SubscriptionStatusResponse,\n UserProperties,\n ValidatePurchaseResponse,\n} from \"../types\";\n\nimport { ApiCache } from \"./ApiCache\";\nimport {\n evaluateFlags as _evaluateFlags,\n getConditionalFlag as _getConditionalFlag,\n getVariant as _getVariant,\n getVariantFromCache as _getVariantFromCache,\n} from \"./ApiClientFlags\";\nimport { postWithQueue } from \"./ApiClientQueue\";\nimport { deriveWebUrl } from \"./apiUrlUtils\";\nimport { EventBatcher, type EventContext, type TrackOptions as EventTrackOptions } from \"./EventBatcher\";\nimport { HttpClient, type HttpResponse } from \"./http\";\nimport { offlineQueue } from \"./queue\";\nimport { SDK_VERSION } from \"./version\";\n\nexport type { ApiClientConfig };\n\nexport class ApiClient {\n private baseUrl: string;\n private webUrl: string;\n private appKey: string;\n private debug: boolean;\n private environment: Environment;\n private offlineQueueEnabled: boolean;\n private httpClient: HttpClient;\n private readonly cache = new ApiCache();\n private readonly batcher: EventBatcher;\n private eventContextProvider: (() => EventContext | null) | null = null;\n private onError: ((error: unknown) => void) | null = null;\n\n constructor(\n appKey: string,\n apiUrl: string,\n debug = false,\n environment: Environment = \"Production\",\n offlineQueueEnabled = true,\n timeout = 30000,\n ) {\n this.appKey = appKey;\n this.baseUrl = apiUrl;\n this.webUrl = deriveWebUrl(this.baseUrl);\n this.debug = debug;\n this.environment = environment;\n this.offlineQueueEnabled = offlineQueueEnabled;\n this.httpClient = new HttpClient(this.baseUrl, {\n timeout,\n debug,\n globalHeaders: this.buildSdkHeaders(),\n });\n this.batcher = new EventBatcher(\n (url, payload, label, priority) =>\n postWithQueue(\n {\n isOfflineQueueEnabled: () => this.offlineQueueEnabled,\n getAppKey: () => this.appKey,\n isDebug: () => this.debug,\n post: (path, body, skipRetry) => this.post(path, body, skipRetry),\n },\n url,\n payload as Record<string, unknown>,\n label,\n priority,\n ),\n debug,\n () => this.resolveEventContext(),\n );\n }\n\n /**\n * Inject a context provider so the EventBatcher can hoist global fields\n * (sdk/platform/version/locale/attribution/ids) out of each event into\n * the V2 envelope. Allows PaywalloClient to wire in identity/session\n * state lazily without the batcher depending on those singletons.\n */\n setEventContextProvider(provider: () => EventContext | null): void {\n this.eventContextProvider = provider;\n }\n\n private resolveEventContext(): EventContext | null {\n if (!this.eventContextProvider) return null;\n try {\n return this.eventContextProvider();\n } catch {\n return null;\n }\n }\n\n getHttpClient(): HttpClient { return this.httpClient; }\n getBaseUrl(): string { return this.baseUrl; }\n getWebUrl(): string { return this.webUrl; }\n getAppKey(): string { return this.appKey; }\n getEnvironment(): Environment { return this.environment; }\n getQueueSize(): number { return offlineQueue.getSize(); }\n setofflineQueueEnabled(enabled: boolean): void { this.offlineQueueEnabled = enabled; }\n isofflineQueueEnabled(): boolean { return this.offlineQueueEnabled; }\n\n setOnError(callback: ((error: unknown) => void) | null): void { this.onError = callback; }\n\n setEnvironment(environment: Environment): void {\n this.environment = environment;\n // Keep the global `x-sdk-environment` header in sync so server-side\n // analytics/routing observe the new env on the very next request.\n this.httpClient.setGlobalHeaders({ \"x-sdk-environment\": this.environment });\n }\n setDebug(debug: boolean): void { this.debug = debug; this.httpClient.setDebug(debug); }\n\n /**\n * Build the baseline SDK telemetry headers that every outgoing request\n * should carry. Keep this tiny — it runs once per ApiClient instance.\n */\n private buildSdkHeaders(): Record<string, string> {\n return {\n \"x-sdk-version\": SDK_VERSION,\n \"x-sdk-platform\": Platform.OS,\n \"x-sdk-environment\": this.environment,\n };\n }\n async clearQueue(): Promise<void> { await offlineQueue.clear(); }\n async get<T>(path: string): Promise<HttpResponse<T>> {\n try {\n return await this.httpClient.get<T>(path, { headers: { \"X-App-Key\": this.appKey } });\n } catch (error) {\n this.onError?.(error);\n throw error;\n }\n }\n async post<T>(path: string, body: unknown, skipRetry = false): Promise<HttpResponse<T>> {\n try {\n return await this.httpClient.post<T>(path, body, { headers: { \"X-App-Key\": this.appKey }, skipRetry });\n } catch (error) {\n this.onError?.(error);\n throw error;\n }\n }\n\n async reportError(errorType: string, message: string, context?: Record<string, unknown>): Promise<void> {\n try {\n await this.post(\"/sdk/errors\", {\n errorType, message, context,\n sdkVersion: SDK_VERSION,\n platform: Platform.OS,\n }, true);\n } catch (err) {\n if (this.debug) console.log(\"[Paywallo:ApiClient] reportError failed\", err);\n }\n }\n\n async trackEvent(\n eventName: string,\n distinctId: string,\n properties?: UserProperties,\n timestamp?: number,\n options?: EventTrackOptions,\n ): Promise<void> {\n await this.batcher.track(eventName, distinctId, this.environment, properties, timestamp, options);\n }\n async flushEventBatch(): Promise<void> { await this.batcher.flush(); }\n dispose(): void { this.batcher.dispose(); }\n\n async identify(\n distinctId: string,\n properties?: UserProperties,\n email?: string,\n deviceId?: string,\n pii?: { phone?: string; firstName?: string; lastName?: string; dateOfBirth?: string; gender?: string },\n ): Promise<void> {\n await postWithQueue(\n {\n isOfflineQueueEnabled: () => this.offlineQueueEnabled,\n getAppKey: () => this.appKey,\n isDebug: () => this.debug,\n post: (path, body, skipRetry) => this.post(path, body, skipRetry),\n },\n \"/sdk/identify\",\n {\n distinctId,\n properties: properties ?? {},\n email,\n platform: Platform.OS,\n ...(deviceId && { deviceId }),\n ...(pii?.phone && { phone: pii.phone }),\n ...(pii?.firstName && { firstName: pii.firstName }),\n ...(pii?.lastName && { lastName: pii.lastName }),\n ...(pii?.dateOfBirth && { dateOfBirth: pii.dateOfBirth }),\n ...(pii?.gender && { gender: pii.gender }),\n },\n \"identify\",\n );\n }\n\n // Session lifecycle endpoints (`/api/v1/sessions/start` and `/api/v1/sessions/end`)\n // have been dropped. All session bookkeeping is now derived on the server from\n // the `$session_start` and `session.end` events that flow through the unified\n // EventBatcher pipeline.\n\n async getVariant(flagKey: string, distinctId: string): Promise<FlagVariant> {\n return _getVariant(this.flagDeps(), flagKey, distinctId);\n }\n\n async getPaywall(placement: string): Promise<PaywallConfig | null> {\n const hit = this.cache.getPaywall(placement);\n if (hit !== undefined) return hit;\n try {\n const res = await this.get<PaywallConfig>(`/sdk/paywalls/${placement}`);\n if (res.status === 404) { this.cache.setPaywall(placement, null, this.cache.nullTTL); return null; }\n if (!res.ok) {\n const stale = this.cache.getStalePaywall(placement);\n return stale !== undefined ? stale : null;\n }\n this.cache.setPaywall(placement, res.data);\n return res.data;\n } catch {\n const stale = this.cache.getStalePaywall(placement);\n return stale !== undefined ? stale : null;\n }\n }\n\n async getEmergencyPaywall(): Promise<EmergencyPaywallResponse> {\n return getEmergencyPaywall(this);\n }\n\n async getCampaign(placement: string, distinctId: string, context?: Record<string, unknown>): Promise<CampaignResponse | null> {\n const key = `${placement}:${distinctId}`;\n const hit = this.cache.getCampaign(key);\n if (hit !== undefined) return hit;\n try {\n const result = await getCampaignData(this, this.baseUrl, placement, distinctId, context);\n if (!result) { this.cache.setCampaign(key, null, this.cache.nullTTL); return null; }\n this.cache.setCampaign(key, result);\n return result;\n } catch {\n const stale = this.cache.getStaleCampaign(key);\n return stale !== undefined ? stale : null;\n }\n }\n\n async getActivePlacements(): Promise<string[]> {\n try {\n const res = await this.get<{ data: string[] }>(\"/sdk/campaigns/placements\");\n if (!res.ok || !Array.isArray(res.data?.data)) return [];\n return res.data.data;\n } catch {\n return [];\n }\n }\n\n async getPrimaryCampaign(distinctId: string): Promise<CampaignResponse | null> {\n const key = `primary:${distinctId}`;\n const hit = this.cache.getCampaign(key);\n if (hit !== undefined) return hit;\n try {\n const res = await this.get<CampaignResponse>(`/sdk/campaigns/public/primary?distinctId=${encodeURIComponent(distinctId)}`);\n if (res.status === 404) { this.cache.setCampaign(key, null, this.cache.nullTTL); return null; }\n if (!res.ok) {\n const stale = this.cache.getStaleCampaign(key);\n return stale !== undefined ? stale : null;\n }\n this.cache.setCampaign(key, res.data);\n return res.data;\n } catch {\n const stale = this.cache.getStaleCampaign(key);\n return stale !== undefined ? stale : null;\n }\n }\n\n async validatePurchase(\n platform: \"ios\" | \"android\",\n receipt: string,\n productId: string,\n transactionId: string,\n priceLocal: number,\n currency: string,\n country: string,\n distinctId?: string,\n paywallPlacement?: string,\n variantKey?: string,\n ): Promise<ValidatePurchaseResponse> {\n return validatePurchase(this, this.appKey, platform, receipt, productId, transactionId, priceLocal, currency, country, distinctId, paywallPlacement, variantKey);\n }\n\n async getSubscriptionStatus(distinctId: string): Promise<SubscriptionStatusResponse> {\n return getSubscriptionStatus(this, this.baseUrl, this.appKey, distinctId);\n }\n\n async evaluateFlags(keys: string[], distinctId: string): Promise<Record<string, string | null>> {\n return _evaluateFlags(this.flagDeps(), keys, distinctId);\n }\n\n async getConditionalFlag(flagKey: string, context: ConditionalFlagContext): Promise<ConditionalFlagResult> {\n return _getConditionalFlag(this.flagDeps(), flagKey, context);\n }\n\n async getVariantFromCache(flagKey: string, distinctId: string): Promise<FlagVariant | null> {\n return _getVariantFromCache(this.flagDeps(), flagKey, distinctId);\n }\n\n private flagDeps() {\n return {\n get: <T>(path: string) => this.get<T>(path),\n httpClient: this.httpClient,\n cache: this.cache,\n appKey: this.appKey,\n baseUrl: this.baseUrl,\n };\n }\n}\n","import { identityManager } from \"../domains/identity\";\nimport type { UserProperties } from \"../types\";\n\nimport type { ApiClient } from \"./ApiClient\";\nimport type { TrackOptions as EventTrackOptions } from \"./EventBatcher\";\n\n/**\n * Thin adapter that exposes the unified EventBatcher pipeline to domain\n * singletons (OnboardingManager, NotificationEventTracker, lifecycle hook)\n * without leaking ApiClient / identityManager into those modules.\n *\n * All consumers of this bridge ultimately emit events through\n * `ApiClient.trackEvent` → `EventBatcher` → `/api/v1/events/batch`, which is\n * the single event pipeline in the SDK.\n */\nexport interface EventPipelineBridge {\n trackEvent(\n eventName: string,\n distinctId: string,\n properties?: Record<string, unknown>,\n timestamp?: number,\n options?: EventTrackOptions,\n ): Promise<void>;\n getDistinctId(): string;\n}\n\nfunction coerceProps(properties: Record<string, unknown> | undefined): UserProperties | undefined {\n if (!properties) return undefined;\n const out: UserProperties = {};\n for (const [key, value] of Object.entries(properties)) {\n if (value === null || value === undefined) {\n out[key] = null;\n continue;\n }\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n out[key] = value;\n continue;\n }\n // Fallback: stringify anything else (objects, arrays) so nothing gets dropped.\n try { out[key] = JSON.stringify(value); } catch { out[key] = String(value); }\n }\n return out;\n}\n\nexport function createEventPipelineBridge(apiClient: ApiClient): EventPipelineBridge {\n return {\n trackEvent(eventName, distinctId, properties, timestamp, options) {\n return apiClient.trackEvent(eventName, distinctId, coerceProps(properties), timestamp, options);\n },\n getDistinctId() {\n return identityManager.getDistinctId();\n },\n };\n}\n","import { campaignGateService } from \"../domains/campaign\";\nimport { identityManager } from \"../domains/identity\";\nimport { notificationsManager } from \"../domains/notifications\";\nimport { isNativePushAvailable } from \"../domains/notifications/bridges/NativePushBridge\";\n\nimport { ApiClient } from \"./ApiClient\";\nimport { DEFAULT_API_URL } from \"./constants\";\nimport { createEventPipelineBridge } from \"./eventPipelineBridge\";\nimport type { PaywalloState } from \"./PaywalloState\";\nimport { SecureStorage } from \"./storage/SecureStorage\";\nimport type { PaywalloInitConfig } from \"./types\";\n\nexport function setupNotifications(\n apiClient: ApiClient,\n config: PaywalloInitConfig,\n environment: import(\"../types\").Environment,\n eventPipeline: ReturnType<typeof createEventPipelineBridge>,\n): void {\n // Explicit opt-out via config\n if (config.notifications === false) return;\n\n // Auto-detect: skip if native module not available\n if (config.notifications === undefined && !isNativePushAvailable()) return;\n\n try {\n notificationsManager.injectDeps({\n httpClient: apiClient.getHttpClient(),\n secureStorage: new SecureStorage(config.debug),\n getDeviceId: () => identityManager.getDeviceId(),\n getDistinctId: () => identityManager.getDistinctId(),\n });\n notificationsManager.setupHandlers({ eventBatcher: eventPipeline });\n notificationsManager.initialize({\n appKey: config.appKey,\n apiBaseUrl: config.apiUrl ?? DEFAULT_API_URL,\n debug: config.debug,\n environment: environment === \"Sandbox\" ? \"sandbox\" : \"production\",\n }).catch((err: unknown) => {\n if (config.debug) console.warn(\"[Paywallo PUSH] initialization warning:\", err instanceof Error ? err.message : String(err));\n });\n } catch (err) {\n if (config.debug) console.warn(\"[Paywallo PUSH] setup warning:\", err instanceof Error ? err.message : String(err));\n }\n}\n\nexport function setupAutoPreload(\n state: PaywalloState,\n apiClient: ApiClient,\n config: PaywalloInitConfig,\n distinctId: string,\n): void {\n if (config.autoPreloadCampaign) {\n state.autoPreloadedPlacement = config.autoPreloadCampaign;\n state.autoPreloadPlacementPromise = Promise.resolve(config.autoPreloadCampaign);\n if (config.debug) console.log(`[Paywallo PRELOAD] started — placement: ${config.autoPreloadCampaign}`);\n void campaignGateService.preloadCampaign(apiClient, config.autoPreloadCampaign).catch(() => {});\n return;\n }\n state.autoPreloadPlacementPromise = apiClient.getPrimaryCampaign(distinctId).then((primary) => {\n const placement = primary?.placement ?? primary?.paywall?.placement;\n if (placement) {\n state.autoPreloadedPlacement = placement;\n if (config.debug) console.log(`[Paywallo PRELOAD] started — placement: ${placement}`);\n void campaignGateService.preloadCampaign(apiClient, placement).catch(() => {});\n return placement;\n }\n return null;\n }).catch(() => null);\n}\n\nexport function startBatchPreload(\n apiClient: ApiClient,\n debug?: boolean,\n): void {\n void campaignGateService.preloadAllActive(apiClient, debug).catch(() => {});\n}\n","import type {\n CampaignResponse,\n CampaignResult,\n IdentifyOptions,\n PaywallResult,\n RestoreResult,\n Subscription,\n UserProperties,\n} from \"../types\";\n\nimport type { ApiClient } from \"./ApiClient\";\nimport type { PaywalloInitConfig } from \"./types\";\n\nexport type PendingIdentify = IdentifyOptions | UserProperties | undefined;\n\nexport type PaywallPresenter = (placement: string) => Promise<PaywallResult>;\nexport type CampaignPresenter = (campaign: CampaignResponse) => Promise<CampaignResult>;\nexport type SubscriptionGetter = () => Promise<Subscription | null>;\nexport type ActiveChecker = () => Promise<boolean>;\nexport type RestoreHandler = () => Promise<RestoreResult>;\n\n/**\n * Mutable state shared between `PaywalloClient`, `PaywalloInitializer` and\n * `PaywalloLifecycle`. Kept intentionally as a plain interface so helper\n * modules can mutate fields without coupling to the facade class.\n */\nexport interface PaywalloState {\n config: import(\"../types\").PaywalloConfig | null;\n apiClient: ApiClient | null;\n initPromise: Promise<void> | null;\n readyPromise: Promise<void> | null;\n resolveReady: (() => void) | null;\n\n paywallPresenter: PaywallPresenter | null;\n campaignPresenter: CampaignPresenter | null;\n subscriptionGetter: SubscriptionGetter | null;\n activeChecker: ActiveChecker | null;\n restoreHandler: RestoreHandler | null;\n\n lastOnboardingStepTimestamp: number | null;\n pendingConfig: PaywalloInitConfig | null;\n networkCleanup: (() => void) | null;\n initAttempts: number;\n autoPreloadedPlacement: string | null;\n autoPreloadPlacementPromise: Promise<string | null> | null;\n sessionFlagsMap: Map<string, string | null>;\n // Identify calls that arrived before init completed — replayed inside\n // `doInit` after identity.initialize(), before session.initialize().\n pendingIdentifies: PendingIdentify[];\n}\n\nexport const MAX_INIT_RETRIES = 3;\nexport const RETRY_DELAYS = [2000, 5000, 10000];\n\nexport function createPaywalloState(): PaywalloState {\n return {\n config: null,\n apiClient: null,\n initPromise: null,\n readyPromise: null,\n resolveReady: null,\n paywallPresenter: null,\n campaignPresenter: null,\n subscriptionGetter: null,\n activeChecker: null,\n restoreHandler: null,\n lastOnboardingStepTimestamp: null,\n pendingConfig: null,\n networkCleanup: null,\n initAttempts: 0,\n autoPreloadedPlacement: null,\n autoPreloadPlacementPromise: null,\n sessionFlagsMap: new Map<string, string | null>(),\n pendingIdentifies: [],\n };\n}\n","import { identityManager, InstallTracker } from \"../domains/identity\";\nimport { advertisingIdManager } from \"../domains/identity/AdvertisingIdManager\";\nimport { deepLinkAttributionCapture } from \"../domains/identity/DeepLinkAttributionCapture\";\nimport { attributionTracker } from \"../domains/identity/InstallTracker\";\nimport { metaBridge } from \"../domains/identity/MetaBridge\";\nimport { onboardingManager } from \"../domains/onboarding\";\nimport { recoverPaywallHeartbeat } from \"../domains/paywall/paywallHeartbeatRecovery\";\nimport { planService } from \"../domains/plan\";\nimport { sessionManager } from \"../domains/session\";\nimport { subscriptionManager } from \"../domains/subscription/SubscriptionManager\";\nimport { nativeDeviceInfo,setNativeDeviceInfoDebug } from \"../utils/NativeDeviceInfo\";\n\nimport { ApiClient } from \"./ApiClient\";\nimport { DEFAULT_API_URL } from \"./constants\";\nimport { createEventPipelineBridge } from \"./eventPipelineBridge\";\nimport { networkMonitor } from \"./network\";\nimport { setupAutoPreload, setupNotifications, startBatchPreload } from \"./PaywalloInitHelpers\";\nimport {\n MAX_INIT_RETRIES,\n type PaywalloState,\n RETRY_DELAYS,\n} from \"./PaywalloState\";\nimport { offlineQueue, queueProcessor } from \"./queue\";\nimport { setNativeStorageDebug } from \"./storage/NativeStorage\";\nimport type { PaywalloInitConfig } from \"./types\";\n\n/**\n * Runs init with retry/backoff. Resolves on first successful `doInit`, throws\n * after exhausting retries.\n */\nexport async function initWithRetry(\n state: PaywalloState,\n config: PaywalloInitConfig,\n): Promise<void> {\n while (state.initAttempts <= MAX_INIT_RETRIES) {\n try {\n await doInit(state, config);\n if (state.initAttempts > 0) {\n reportInitSuccess(state, config, state.initAttempts);\n }\n cleanupNetworkRecovery(state);\n state.pendingConfig = null;\n return;\n } catch (error) {\n state.initAttempts++;\n if (state.initAttempts > MAX_INIT_RETRIES) throw error;\n const delay = RETRY_DELAYS[state.initAttempts - 1] ?? 10000;\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n}\n\nexport function setupNetworkRecovery(\n state: PaywalloState,\n config: PaywalloInitConfig,\n): void {\n if (state.networkCleanup) return;\n if (!networkMonitor.isInitialized()) return;\n state.networkCleanup = networkMonitor.addListener((netState) => {\n if (netState !== \"online\") return;\n if (state.config && state.apiClient) return;\n if (state.initPromise) return;\n state.initPromise = initWithRetry(state, config);\n state.initPromise\n .catch(() => { reportInitFailure(state, config, null, \"NETWORK_RECOVERY_FAILED\"); })\n .finally(() => {\n const ready = state.config !== null && state.apiClient !== null;\n if (!ready) state.initPromise = null;\n });\n });\n}\n\nexport function cleanupNetworkRecovery(state: PaywalloState): void {\n if (state.networkCleanup) {\n state.networkCleanup();\n state.networkCleanup = null;\n }\n}\n\nexport function reportInitFailure(\n state: PaywalloState,\n config: PaywalloInitConfig,\n error: unknown,\n reason: string,\n): void {\n try {\n const tempClient = new ApiClient(\n config.appKey,\n config.apiUrl ?? DEFAULT_API_URL,\n config.debug,\n );\n void tempClient.reportError(\"INIT_FAILED\", reason, {\n attempts: state.initAttempts,\n error: error instanceof Error ? error.message : String(error),\n });\n } catch (err) {\n if (config.debug) console.error(\"[Paywallo] reportInitFailure error\", err);\n }\n}\n\nexport function reportInitSuccess(\n state: PaywalloState,\n config: PaywalloInitConfig,\n attempts: number,\n): void {\n try {\n if (state.apiClient) {\n void state.apiClient.reportError(\"INIT_RECOVERED\", `Succeeded after ${attempts} retries`, { attempts });\n }\n } catch (err) {\n if (config.debug) console.error(\"[Paywallo] reportInitSuccess error\", err);\n }\n}\n\nexport async function resolveSessionFlags(\n state: PaywalloState,\n keys: string[],\n apiClient: ApiClient,\n distinctId: string,\n): Promise<void> {\n try {\n const results = await apiClient.evaluateFlags(keys, distinctId);\n state.sessionFlagsMap.clear();\n for (const key of keys) {\n state.sessionFlagsMap.set(key, key in results ? results[key] : null);\n }\n } catch {\n for (const key of keys) {\n state.sessionFlagsMap.set(key, null);\n }\n }\n}\n\nexport async function doInit(\n state: PaywalloState,\n config: PaywalloInitConfig,\n): Promise<void> {\n const environment = config.environment\n ?? (typeof __DEV__ !== \"undefined\" && __DEV__ ? \"Sandbox\" : \"Production\");\n const offlineQueueEnabled = config.offlineQueueEnabled !== false;\n\n await Promise.all([\n networkMonitor.initialize({ debug: config.debug }),\n offlineQueue.initialize({ debug: config.debug }).then(() =>\n offlineQueue.clearItemsWithInvalidAppKey(config.appKey),\n ),\n ]);\n\n const apiClient = new ApiClient(\n config.appKey,\n config.apiUrl ?? DEFAULT_API_URL,\n config.debug,\n environment,\n offlineQueueEnabled,\n config.timeout,\n );\n if (config.onError) apiClient.setOnError(config.onError);\n state.apiClient = apiClient;\n queueProcessor.initialize(apiClient.getHttpClient(), {\n debug: config.debug,\n // Capture app key at flush time, not at enqueue time, so rotated keys\n // and SDK telemetry headers are always current.\n getFreshHeaders: () => ({ \"X-App-Key\": apiClient.getAppKey() }),\n });\n subscriptionManager.init({\n serverUrl: apiClient.getBaseUrl(),\n appKey: config.appKey,\n cacheTTL: config.subscriptionCacheTTL,\n debug: config.debug,\n });\n planService.init({ apiClient, debug: config.debug ?? false });\n\n await identityManager.initialize(apiClient, config.debug);\n\n // Replay de identify() chamado ANTES de init terminar (fica enfileirado\n // em state.pendingIdentifies). Processado aqui, depois da identity estar\n // pronta e ANTES de session.initialize, pra garantir que distinctId já\n // reflete o usuário correto antes da primeira sessão.\n if (state.pendingIdentifies.length > 0) {\n for (const pending of state.pendingIdentifies) {\n try {\n await identityManager.identify(pending);\n } catch (err) {\n if (config.debug) console.warn(\"[Paywallo INIT] pending identify replay failed\", err);\n }\n }\n state.pendingIdentifies = [];\n }\n\n const distinctId = identityManager.getDistinctId();\n\n // Sub-fase 2.8: hidrata attribution a partir do storage + captura cold-start\n // deep link (fbclid/gclid/ttclid/utm_*) via `Linking.getInitialURL()` e\n // registra listener pra warm-start. Best-effort — nunca bloqueia init.\n try {\n await attributionTracker.loadFromStorage();\n } catch (err) {\n if (config.debug) console.log(\"[Paywallo ATTR] loadFromStorage error\", err);\n }\n try {\n await deepLinkAttributionCapture.start();\n } catch (err) {\n if (config.debug) console.log(\"[Paywallo ATTR] start error\", err);\n }\n\n // Pre-warm async caches so the (sync) context provider has data on the\n // first flush. Each is fire-and-forget — first events may go without these\n // fields if a flush races the cache, but every subsequent event picks them\n // up from the populated cache.\n void nativeDeviceInfo.getDeviceInfo().catch(() => null);\n void advertisingIdManager.collect(false).catch(() => null);\n void metaBridge.getAnonymousID().catch(() => null);\n\n // Wire the event context provider so EVERY event envelope (V2) carries\n // attribution (fbclid, ttclid, utm_*, referrer) from the persisted store,\n // device fingerprint (locale, timezone, os_version, device_model, app_version)\n // and ad ids (idfa, idfv, gaid, fb_anon_id) — all required by the server's\n // probabilistic install matcher and CAPI dispatch. Called lazily at flush\n // time so each field reflects the latest state.\n apiClient.setEventContextProvider(() => {\n const attr = attributionTracker.get();\n const attrEntries: Array<[string, string]> = attr\n ? (\n [\n [\"fbclid\", attr.fbclid],\n [\"gclid\", attr.gclid],\n [\"ttclid\", attr.ttclid],\n [\"utm_source\", attr.utmSource],\n [\"utm_medium\", attr.utmMedium],\n [\"utm_campaign\", attr.utmCampaign],\n [\"utm_content\", attr.utmContent],\n [\"utm_term\", attr.utmTerm],\n [\"referrer\", attr.referrer],\n ] as Array<[string, string | undefined]>\n )\n .filter((pair): pair is [string, string] => pair[1] !== undefined && pair[1] !== \"\")\n : [];\n const attribution: Record<string, string> | undefined =\n attrEntries.length > 0 ? Object.fromEntries(attrEntries) : undefined;\n\n const adIds = advertisingIdManager.getCached();\n const fbAnonId = metaBridge.getCachedAnonymousID();\n const idsEntries: Array<[string, string]> = (\n [\n [\"idfa\", adIds?.idfa ?? null],\n [\"idfv\", adIds?.idfv ?? null],\n [\"gaid\", adIds?.gaid ?? null],\n [\"fb_anon_id\", fbAnonId],\n ] as Array<[string, string | null]>\n ).filter((pair): pair is [string, string] => pair[1] !== null && pair[1] !== \"\");\n const ids: Record<string, string> | undefined =\n idsEntries.length > 0 ? Object.fromEntries(idsEntries) : undefined;\n\n const device = nativeDeviceInfo.getCachedDeviceInfo();\n let locale: string | undefined;\n let timezone: string | undefined;\n try {\n const opts = Intl.DateTimeFormat().resolvedOptions();\n locale = opts.locale || undefined;\n timezone = opts.timeZone || undefined;\n } catch { /* non-critical */ }\n\n return {\n distinct_id: identityManager.getDistinctId() || undefined,\n device_id: identityManager.getDeviceId() ?? undefined,\n session_id: sessionManager.getSessionId() ?? undefined,\n app_version: device?.appVersion && device.appVersion !== \"0.0.0\" ? device.appVersion : undefined,\n os_version: device?.systemVersion && device.systemVersion !== \"0.0.0\" ? device.systemVersion : undefined,\n device_model: device?.modelId || device?.model || undefined,\n timezone,\n locale,\n ...(attribution && Object.keys(attribution).length > 0 && { attribution }),\n ...(ids && Object.keys(ids).length > 0 && { ids }),\n };\n });\n\n await sessionManager.initialize(\n apiClient,\n config.sessionConfig,\n config.debug,\n () => identityManager.getDistinctId(),\n );\n\n const eventPipeline = createEventPipelineBridge(apiClient);\n onboardingManager.injectDeps({\n pipeline: eventPipeline,\n debug: config.debug,\n });\n\n setupNotifications(apiClient, config, environment, eventPipeline);\n\n if (config.autoStartSession !== false) {\n sessionManager.startSession().catch((err) => {\n if (config.debug) console.warn(\"[Paywallo INIT] autoStart session error\", err);\n });\n }\n new InstallTracker(config.debug, {\n distinctIdProvider: () => identityManager.getDistinctId(),\n }).trackIfNeeded(apiClient, config.requestATT === true).catch(() => {});\n\n if (config.sessionFlags && config.sessionFlags.length > 0) {\n await resolveSessionFlags(state, config.sessionFlags, apiClient, distinctId);\n }\n\n setNativeStorageDebug(config.debug ?? false);\n setNativeDeviceInfoDebug(config.debug ?? false);\n metaBridge.setDebug?.(config.debug ?? false);\n state.config = config;\n if (state.resolveReady) {\n state.resolveReady();\n state.resolveReady = null;\n }\n if (config.debug) console.warn(\"[Paywallo] initialized successfully\");\n\n if (distinctId) {\n apiClient.getSubscriptionStatus(distinctId)\n .then(() => { if (config.debug) console.log(\"[Paywallo SUB] preloaded on boot\"); })\n .catch(() => {});\n\n // Sub-fase 2.10: recupera snapshot de heartbeat órfão (crash/kill com\n // paywall aberto) emitindo um `paywall {closed}` com\n // `close_reason: \"error\"`. Best-effort — nunca bloqueia o boot.\n void recoverPaywallHeartbeat(apiClient, distinctId, sessionManager.getSessionId(), config.debug)\n .catch((err) => { if (config.debug) console.log(\"[Paywallo HEARTBEAT] recovery error\", err); });\n }\n\n setupAutoPreload(state, apiClient, config, distinctId);\n startBatchPreload(apiClient, config.debug);\n}\n","import { campaignGateService } from \"../domains/campaign\";\nimport { getIAPService } from \"../domains/iap/IAPService\";\nimport { identityManager } from \"../domains/identity\";\nimport { deepLinkAttributionCapture } from \"../domains/identity/DeepLinkAttributionCapture\";\nimport { notificationsManager } from \"../domains/notifications\";\nimport { sessionManager } from \"../domains/session\";\nimport { subscriptionCache } from \"../domains/subscription/SubscriptionCache\";\n\nimport { networkMonitor } from \"./network\";\nimport { cleanupNetworkRecovery } from \"./PaywalloInitializer\";\nimport type { PaywalloState } from \"./PaywalloState\";\nimport { offlineQueue, queueProcessor } from \"./queue\";\n\n/**\n * Soft reset: clears identity + subscription cache but keeps the SDK running.\n * Also tears down the native StoreKit/Billing `Transaction.updates` listener\n * so the post-reset user doesn't receive transaction events attributed to\n * the previous identity. The listener is re-armed on the next\n * `getIAPService()` call.\n */\nexport async function doReset(): Promise<void> {\n await identityManager.reset();\n await subscriptionCache.invalidateAll();\n // Push token belongs to the previous identity — invalidate locally so the\n // next user doesn't re-register the same mapping. We do NOT call the\n // server: opt-out is an explicit user action, not a side-effect of reset.\n await notificationsManager.invalidateLocalToken().catch(() => undefined);\n try {\n getIAPService().stopTransactionListener();\n } catch {\n // getIAPService can throw in edge cases — never block reset on cleanup.\n }\n}\n\n/**\n * Hard reset: tears down every subsystem and resets state to the pre-`init`\n * defaults. Used by tests and on explicit user sign-out flows.\n */\nexport async function doFullReset(state: PaywalloState): Promise<void> {\n await sessionManager.endSession();\n sessionManager.destroy();\n await identityManager.reset();\n await subscriptionCache.invalidateAll();\n queueProcessor.dispose();\n offlineQueue.dispose();\n networkMonitor.dispose();\n campaignGateService.clearPreloaded();\n // Wipe the local token before tearing the manager down — `destroy()`\n // clears the in-memory token but not the secure-storage copy.\n await notificationsManager.invalidateLocalToken().catch(() => undefined);\n notificationsManager.destroy();\n deepLinkAttributionCapture.stop();\n try {\n getIAPService().stopTransactionListener();\n } catch { /* ignore — tests may not have IAPService wired */ }\n cleanupNetworkRecovery(state);\n state.sessionFlagsMap.clear();\n state.apiClient?.dispose();\n\n state.apiClient = null;\n state.config = null;\n state.initPromise = null;\n state.readyPromise = null;\n state.resolveReady = null;\n state.pendingConfig = null;\n state.initAttempts = 0;\n state.paywallPresenter = null;\n state.campaignPresenter = null;\n state.subscriptionGetter = null;\n state.activeChecker = null;\n state.restoreHandler = null;\n state.lastOnboardingStepTimestamp = null;\n state.autoPreloadedPlacement = null;\n state.autoPreloadPlacementPromise = null;\n}\n","import { identityManager } from \"../domains/identity\";\nimport type { Subscription } from \"../types\";\n\nimport type { PaywalloState } from \"./PaywalloState\";\n\nexport async function checkActiveSubscription(state: PaywalloState): Promise<boolean> {\n try {\n if (state.activeChecker) {\n const isActive = await state.activeChecker();\n if (state.config?.debug) console.log(\"[Paywallo SUB] hasActiveSubscription (checker):\", isActive);\n return isActive;\n }\n const distinctId = identityManager.getDistinctId();\n if (!distinctId || !state.apiClient) {\n if (state.config?.debug) console.log(\"[Paywallo SUB] hasActiveSubscription: false (no distinctId/apiClient)\");\n return false;\n }\n const status = await state.apiClient.getSubscriptionStatus(distinctId);\n const isActive = status.hasActiveSubscription;\n if (state.config?.debug) console.log(\"[Paywallo SUB] hasActiveSubscription (server):\", isActive);\n return isActive;\n } catch (error) {\n if (state.config?.debug) console.error(\"[Paywallo SUB] hasActiveSubscription error\", error);\n if (state.apiClient) void state.apiClient.reportError(\"SUBSCRIPTION_CHECK_FAILED\", error instanceof Error ? error.message : \"hasActiveSubscription failed\");\n return false;\n }\n}\n\nexport async function fetchSubscription(state: PaywalloState): Promise<Subscription | null> {\n try {\n if (state.subscriptionGetter) return await state.subscriptionGetter();\n const distinctId = identityManager.getDistinctId();\n if (!distinctId || !state.apiClient) return null;\n const status = await state.apiClient.getSubscriptionStatus(distinctId);\n if (!status.subscription) return null;\n return { ...status.subscription, expiresAt: status.subscription.expiresAt ? new Date(status.subscription.expiresAt) : null };\n } catch {\n return null;\n }\n}\n","import { campaignGateService } from \"../domains/campaign\";\nimport { identityManager } from \"../domains/identity\";\nimport type { PushPermissionStatus } from \"../domains/notifications\";\nimport { notificationsManager } from \"../domains/notifications\";\nimport { PAYWALL_ERROR_CODES, PaywallError } from \"../domains/paywall\";\nimport type { AllPlansResponse,Plan } from \"../domains/plan\";\nimport { planService } from \"../domains/plan\";\nimport { sessionManager } from \"../domains/session\";\nimport type { EmergencyPaywallHandler } from \"../domains/session/types\";\nimport { CLIENT_ERROR_CODES, ClientError } from \"../errors/ClientError\";\nimport type {\n CampaignResponse, CampaignResult, ConditionalFlagContext, IdentifyOptions,\n PaywallResult, RestoreResult, Subscription, TrackEventOptions, UserProperties,\n} from \"../types\";\nimport type { EmergencyPaywallResponse } from \"../types/paywall\";\n\nimport { ApiClient } from \"./ApiClient\";\nimport { networkMonitor } from \"./network\";\nimport { trackEvent, trackOnboardingStep, validateCoreAction } from \"./PaywalloAnalytics\";\nimport { evaluateFlags, getConditionalFlag,getVariant, getVariantCached } from \"./PaywalloFlags\";\nimport { initWithRetry, reportInitFailure, setupNetworkRecovery } from \"./PaywalloInitializer\";\nimport { doFullReset, doReset } from \"./PaywalloLifecycle\";\nimport {\ntype ActiveChecker, type CampaignPresenter, createPaywalloState, type PaywalloState, type PaywallPresenter,\ntype RestoreHandler, type SubscriptionGetter,\n} from \"./PaywalloState\";\nimport { checkActiveSubscription, fetchSubscription } from \"./PaywalloSubscription\";\nimport { offlineQueue, queueProcessor } from \"./queue\";\nimport type { IPaywalloClient, PaywalloInitConfig, PreloadCampaignResult } from \"./types\";\n\nexport type { IPaywalloClient, PaywalloInitConfig, PreloadCampaignResult } from \"./types\";\n\nclass PaywalloClientClass {\n private readonly state: PaywalloState = createPaywalloState();\n\n async init(config: PaywalloInitConfig): Promise<void> {\n const s = this.state;\n if (!s.readyPromise) s.readyPromise = new Promise<void>((resolve) => { s.resolveReady = resolve; });\n if (s.config && s.apiClient) { return; }\n if (s.initPromise) { await s.initPromise; return; }\n if (!config.appKey) throw new ClientError(CLIENT_ERROR_CODES.MISSING_APP_KEY, \"appKey is required\");\n s.pendingConfig = config;\n s.initAttempts = 0;\n s.initPromise = initWithRetry(s, config);\n try {\n await s.initPromise;\n } catch (error) {\n s.initPromise = null; s.config = null; s.apiClient = null;\n reportInitFailure(s, config, error, \"ALL_RETRIES_EXHAUSTED\");\n setupNetworkRecovery(s, config);\n throw error;\n }\n }\n isReady(): boolean { return this.state.config !== null && this.state.apiClient !== null; }\n waitUntilReady(): Promise<void> {\n const s = this.state;\n if (this.isReady()) return Promise.resolve();\n if (!s.readyPromise) s.readyPromise = new Promise<void>((resolve) => { s.resolveReady = resolve; });\n return s.readyPromise;\n }\n\n async identify(options?: IdentifyOptions | UserProperties): Promise<void> {\n // identify() chamado ANTES de init(): enfileira para replay durante\n // doInit (depois de identity.initialize, antes de session.initialize).\n // Evita throw e race conditions onde session começa antes do identify.\n if (!this.state.config || !this.state.apiClient) {\n if (this.state.initPromise) {\n this.state.pendingIdentifies.push(options);\n if (this.state.config?.debug) console.log(\"[Paywallo IDENTIFY] queued — init in progress\");\n return;\n }\n if (this.state.pendingConfig) {\n this.state.pendingIdentifies.push(options);\n return;\n }\n throw new ClientError(CLIENT_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized. Call Paywallo.init() first\");\n }\n if (this.state.config?.debug) console.log(\"[Paywallo IDENTIFY]\", options ? { hasEmail: \"email\" in options && !!(options as { email?: unknown }).email, hasProperties: \"properties\" in options } : undefined);\n await identityManager.identify(options);\n }\n async track(eventName: string, options?: TrackEventOptions): Promise<void> {\n return trackEvent(this.getApiClientOrThrow(), this.state, eventName, options);\n }\n\n async onboardingStep(index: number, name: string): Promise<void> {\n return trackOnboardingStep(this.getApiClientOrThrow(), this.state, index, name);\n }\n async coreAction(actionName: string): Promise<void> {\n // V2 taxonomy: `$core_action` has zero consumers on the server and was\n // dropped. Callers that want to track arbitrary actions should use the\n // `custom` family via `track(\"my_action\", { ...props })` directly.\n // Kept as validated no-op to preserve the public API shape.\n this.ensureInitialized();\n validateCoreAction(actionName);\n }\n\n async getVariantCached(flagKey: string, defaultValue?: string): Promise<import(\"../types\").FlagVariant> {\n this.ensureInitialized();\n return getVariantCached(this.getApiClientOrThrow(), flagKey, defaultValue);\n }\n\n async getVariant(flagKey: string): Promise<import(\"../types\").FlagVariant> {\n if (!this.state.apiClient) return { variant: null };\n return getVariant(this.state.apiClient, this.state, flagKey);\n }\n\n async evaluateFlags(keys: string[]): Promise<Record<string, string | null>> {\n this.ensureInitialized();\n return evaluateFlags(this.getApiClientOrThrow(), keys);\n }\n\n async getConditionalFlag(flagKey: string, context?: Partial<ConditionalFlagContext>): Promise<boolean> {\n if (!this.state.apiClient) return false;\n return getConditionalFlag(this.state.apiClient, this.state, flagKey, context);\n }\n async getPaywall(placement: string): Promise<import(\"../types\").PaywallConfig | null> {\n return this.getApiClientOrThrow().getPaywall(placement);\n }\n async presentPaywall(placement: string): Promise<PaywallResult> {\n this.ensureInitialized();\n if (!this.state.paywallPresenter) throw new PaywallError(PAYWALL_ERROR_CODES.NOT_INITIALIZED, \"PaywalloProvider not mounted. Wrap your app with <PaywalloProvider>\");\n return this.state.paywallPresenter(placement);\n }\n async getCampaign(placement: string, context?: Record<string, unknown>): Promise<CampaignResponse | null> {\n return campaignGateService.getCampaign(this.getApiClientOrThrow(), placement, context);\n }\n async presentCampaign(placement: string, context?: Record<string, unknown>): Promise<CampaignResult> {\n this.ensureInitialized();\n if (this.state.config?.debug) console.log(`[Paywallo CAMPAIGN] presenting ${placement}`);\n const result = await campaignGateService.presentCampaign(this.getApiClientOrThrow(), placement, () => this.hasActiveSubscription(), this.state.paywallPresenter, this.state.campaignPresenter, context);\n if (this.state.config?.debug) {\n if (result.error) console.log(`[Paywallo CAMPAIGN] ${placement} error:`, result.error.message);\n else console.log(`[Paywallo CAMPAIGN] ${placement} result:`, { purchased: result.purchased, cancelled: result.cancelled, restored: result.restored, skippedReason: result.skippedReason });\n }\n return result;\n }\n async hasActiveSubscription(): Promise<boolean> {\n this.ensureInitialized();\n return checkActiveSubscription(this.state);\n }\n async getSubscription(): Promise<Subscription | null> {\n this.ensureInitialized();\n return fetchSubscription(this.state);\n }\n async restorePurchases(): Promise<RestoreResult> {\n this.ensureInitialized();\n if (!this.state.restoreHandler) throw new PaywallError(PAYWALL_ERROR_CODES.NOT_INITIALIZED, \"PaywalloProvider not mounted. Wrap your app with <PaywalloProvider>\");\n if (this.state.config?.debug) console.log(\"[Paywallo RESTORE] starting\");\n const result = await this.state.restoreHandler();\n if (this.state.config?.debug) console.log(\"[Paywallo RESTORE] result:\", { success: result.success, restoredProducts: result.restoredProducts?.length ?? 0 });\n return result;\n }\n async reset(): Promise<void> { await doReset(); }\n async fullReset(): Promise<void> { await doFullReset(this.state); }\n\n /**\n * Request OS push permission (iOS/Android 13+) and, on grant, register\n * the FCM/APNS token with the Paywallo backend. Returns the final\n * permission status — no-op safe to call before init (returns\n * `notDetermined`). Token renewal via `onTokenRefresh` re-registers\n * automatically.\n */\n async requestPushPermission(options?: { provisional?: boolean }): Promise<PushPermissionStatus> {\n if (!this.state.config || !this.state.apiClient) {\n if (this.state.config?.debug) console.log(\"[Paywallo PUSH] requestPushPermission called before init\");\n return \"notDetermined\";\n }\n return notificationsManager.requestPushPermission(options);\n }\n\n getSessionFlag(key: string): string | null {\n if (!this.state.config || !this.state.apiClient) return null;\n const value = this.state.sessionFlagsMap.get(key);\n return value !== undefined ? value : null;\n }\n\n getConfig(): import(\"../types\").PaywalloConfig | null { return this.state.config; }\n getDistinctId(): string { return identityManager.getDistinctId(); }\n getDeviceId(): string | null { return identityManager.getDeviceId(); }\n getEmail(): string | null { return identityManager.getEmail(); }\n getEnvironment(): import(\"../types\").Environment { return this.state.apiClient?.getEnvironment() ?? \"Production\"; }\n setEnvironment(environment: import(\"../types\").Environment): void { this.state.apiClient?.setEnvironment(environment); }\n getApiClient(): ApiClient | null { return this.state.apiClient; }\n getWebUrl(): string | null { return this.state.apiClient?.getWebUrl() ?? null; }\n getIdentityState(): import(\"../domains/identity/IdentityManager\").IdentityState { return identityManager.getState(); }\n getSessionState(): import(\"../domains/session/types\").SessionState { return sessionManager.getState(); }\n getSessionId(): string | null { return sessionManager.getSessionId(); }\n async startSession(): Promise<string> { return sessionManager.startSession(); }\n async endSession(): Promise<void> { return sessionManager.endSession(); }\n registerPaywallPresenter(p: PaywallPresenter | null): void { this.state.paywallPresenter = p; }\n registerCampaignPresenter(p: CampaignPresenter | null): void { this.state.campaignPresenter = p; }\n registerSubscriptionGetter(g: SubscriptionGetter | null): void { this.state.subscriptionGetter = g; }\n registerActiveChecker(c: ActiveChecker | null): void { this.state.activeChecker = c; }\n registerRestoreHandler(h: RestoreHandler | null): void { this.state.restoreHandler = h; }\n registerEmergencyPaywallHandler(h: EmergencyPaywallHandler | null): void { sessionManager.registerEmergencyPaywallHandler(h); }\n\n async getEmergencyPaywall(): Promise<EmergencyPaywallResponse> {\n if (!this.state.apiClient) throw new ClientError(CLIENT_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized\");\n return this.state.apiClient.getEmergencyPaywall();\n }\n async requireSubscription(paywallPlacement?: string): Promise<boolean> {\n this.ensureInitialized();\n if (await this.hasActiveSubscription()) return true;\n if (!paywallPlacement) return false;\n const r = await this.presentPaywall(paywallPlacement);\n return r.purchased || r.restored;\n }\n async requireSubscriptionWithCampaign(placement: string, context?: Record<string, unknown>): Promise<boolean> {\n this.ensureInitialized();\n return campaignGateService.requireSubscriptionWithCampaign(this.getApiClientOrThrow(), placement, () => this.hasActiveSubscription(), this.state.paywallPresenter, this.state.campaignPresenter, context);\n }\n async gateContent<T>(content: () => T | Promise<T>, paywallPlacement?: string): Promise<T | null> {\n return (await this.requireSubscription(paywallPlacement)) ? content() : null;\n }\n async gateContentWithCampaign<T>(content: () => T | Promise<T>, placement: string, context?: Record<string, unknown>): Promise<T | null> {\n return (await this.requireSubscriptionWithCampaign(placement, context)) ? content() : null;\n }\n async preloadCampaign(placement: string, context?: Record<string, unknown>): Promise<PreloadCampaignResult> {\n return campaignGateService.preloadCampaign(this.getApiClientOrThrow(), placement, context);\n }\n getPreloadedCampaign(placement: string): CampaignResponse | null { return campaignGateService.getPreloadedCampaign(placement); }\n isPreloaded(placement: string): boolean { return campaignGateService.getPreloadedCampaign(placement) !== null; }\n getAutoPreloadedPlacement(): string | null { return this.state.autoPreloadedPlacement; }\n waitForAutoPreloadedPlacement(): Promise<string | null> { return this.state.autoPreloadPlacementPromise ?? Promise.resolve(null); }\n isOnline(): boolean { return networkMonitor.isOnline(); }\n getOfflineQueueSize(): number { return offlineQueue.getSize(); }\n async clearOfflineQueue(): Promise<void> { await offlineQueue.clear(); }\n async processOfflineQueue(): Promise<{ processed: number; failed: number }> { return queueProcessor.processQueue(); }\n\n async getPlans(): Promise<AllPlansResponse> {\n this.ensureInitialized();\n return planService.getAllPlans();\n }\n\n async getCurrentPlan(): Promise<Plan | null> {\n this.ensureInitialized();\n return planService.getCurrentPlan();\n }\n\n private getApiClientOrThrow(): ApiClient {\n if (!this.state.config || !this.state.apiClient) throw new ClientError(CLIENT_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized. Call Paywallo.init() first\");\n return this.state.apiClient;\n }\n private ensureInitialized(): void {\n if (!this.state.config || !this.state.apiClient) throw new ClientError(CLIENT_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized. Call Paywallo.init() first\");\n }\n}\n\nexport const PaywalloClient: IPaywalloClient = new PaywalloClientClass();\n","import { Platform } from \"react-native\";\n\nimport type { ApiClient } from \"../../core/ApiClient\";\nimport { secureStorage } from \"../../core/storage/SecureStorage\";\n\nimport type { CachedOfferings, Offering, OfferingProduct, OfferingServiceConfig } from \"./types\";\n\nconst OFFERINGS_CACHE_KEY = \"@paywallo:offerings_cache\";\nconst DEFAULT_TTL = 5 * 60 * 1000; // 5 minutes\n\ninterface RawOfferingProduct {\n id: string;\n name: string;\n description: string | null;\n type: string;\n apple_product_id: string | null;\n google_product_id: string | null;\n billing_period: string | null;\n trial_days: number | null;\n price_usd: number | null;\n regional_prices: unknown;\n is_active: boolean;\n}\n\ninterface RawOffering {\n id: string;\n identifier: string;\n name: string;\n description: string | null;\n metadata: unknown;\n products: RawOfferingProduct[];\n}\n\ninterface RawOfferingsResponse {\n data: { offerings: RawOffering[] };\n}\n\nfunction resolveProductId(raw: RawOfferingProduct): string {\n const isIos = Platform.OS === \"ios\";\n const productId = isIos ? raw.apple_product_id : raw.google_product_id;\n return productId ?? \"\";\n}\n\nfunction mapProduct(raw: RawOfferingProduct): OfferingProduct {\n return {\n id: raw.id,\n name: raw.name,\n description: raw.description,\n type: raw.type,\n productId: resolveProductId(raw),\n billingPeriod: raw.billing_period,\n trialDays: raw.trial_days,\n priceUsd: raw.price_usd,\n regionalPrices: raw.regional_prices,\n isActive: raw.is_active,\n };\n}\n\nfunction pickPlatformProduct(products: RawOfferingProduct[]): RawOfferingProduct | null {\n const isIos = Platform.OS === \"ios\";\n // Prefer product with matching platform ID, fallback to first active\n const match = products.find((p) => isIos ? p.apple_product_id : p.google_product_id);\n return match ?? products[0] ?? null;\n}\n\nfunction mapOffering(raw: RawOffering): Offering | null {\n const rawProduct = pickPlatformProduct(raw.products);\n if (!rawProduct) return null;\n\n return {\n id: raw.id,\n identifier: raw.identifier,\n name: raw.name,\n description: raw.description,\n metadata: raw.metadata,\n product: mapProduct(rawProduct),\n };\n}\n\nexport class OfferingService {\n private config: OfferingServiceConfig | null = null;\n private cache: CachedOfferings | null = null;\n private ttl: number = DEFAULT_TTL;\n\n init(config: OfferingServiceConfig): void {\n this.config = config;\n }\n\n async getOfferings(ids?: string[]): Promise<Offering[]> {\n const cached = this.getMemCache();\n if (cached && !cached.isStale) return this.filterByIds(cached.data, ids);\n\n if (!this.cache) {\n try {\n const stored = await secureStorage.get(OFFERINGS_CACHE_KEY);\n if (stored) {\n const parsed = JSON.parse(stored) as Offering[];\n this.setMemCache(parsed);\n }\n } catch { /* ignore storage errors */ }\n }\n\n const memCached = this.getMemCache();\n if (memCached) {\n void this.fetchOfferings(ids);\n return this.filterByIds(memCached.data, ids);\n }\n\n return this.fetchOfferings(ids);\n }\n\n invalidateCache(): void {\n this.cache = null;\n secureStorage.remove(OFFERINGS_CACHE_KEY).catch(() => undefined);\n }\n\n private getMemCache(): CachedOfferings | null {\n if (!this.cache) return null;\n const isStale = Date.now() - this.cache.cachedAt > this.ttl;\n return { ...this.cache, isStale };\n }\n\n private setMemCache(data: Offering[]): void {\n this.cache = { data, cachedAt: Date.now(), isStale: false };\n }\n\n private filterByIds(offerings: Offering[], ids?: string[]): Offering[] {\n if (!ids || ids.length === 0) return offerings;\n return offerings.filter((o) => ids.includes(o.identifier));\n }\n\n private getApiClient(): ApiClient {\n if (!this.config) {\n throw new Error(\"OfferingService not initialized. Call Paywallo.init() first\");\n }\n return this.config.apiClient;\n }\n\n private async fetchOfferings(ids?: string[]): Promise<Offering[]> {\n try {\n const qs = ids && ids.length > 0 ? `?ids=${ids.join(\",\")}` : \"\";\n const res = await this.getApiClient().get<RawOfferingsResponse>(`/sdk/offerings${qs}`);\n\n if (!res.ok) {\n this.log(\"fetchOfferings failed\", res.status);\n return [];\n }\n\n const offerings = res.data.data.offerings.map(mapOffering).filter((o): o is Offering => o !== null);\n this.setMemCache(offerings);\n secureStorage.set(OFFERINGS_CACHE_KEY, JSON.stringify(offerings)).catch(() => undefined);\n return this.filterByIds(offerings, ids);\n } catch (err) {\n this.log(\"fetchOfferings error\", err);\n return [];\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config?.debug) console.log(\"[Paywallo Offerings]\", ...args);\n }\n}\n\nexport const offeringService = new OfferingService();\n","import { PaywalloClient } from \"./core/PaywalloClient\";\n\nexport { PaywalloContext, type PreloadResult } from \"./context/PaywalloContext\";\nexport { ApiClient, type ApiClientConfig } from \"./core/ApiClient\";\nexport {\n HttpClient,\n type HttpClientConfig,\n type HttpResponse,\n type RequestOptions,\n type RetryConfig,\n} from \"./core/http\";\nexport {\n type NetworkListener,\n networkMonitor,\n type NetworkMonitorConfig,\n type NetworkState,\n} from \"./core/network\";\nexport {\n type IPaywalloClient,\n PaywalloClient,\n type PaywalloInitConfig,\n type PreloadCampaignResult,\n} from \"./core/PaywalloClient\";\nexport {\n offlineQueue,\n type OfflineQueueConfig,\n type QueueEvent,\n type QueueItem,\n type QueueListener,\n queueProcessor,\n type QueueProcessorConfig,\n} from \"./core/queue\";\nexport type {\n IAPProduct,\n IAPPurchase,\n ProductPriceInfo,\n PurchaseControllerConfig,\n PurchaseState,\n} from \"./domains/iap\";\nexport { getIAPService, IAPService } from \"./domains/iap\";\nexport { nativeStoreKit } from \"./domains/iap\";\nexport { ERROR_CODES } from \"./domains/iap\";\nexport { IdentityManager, identityManager, type IdentityState } from \"./domains/identity\";\nexport { MetaBridge, metaBridge } from \"./domains/identity\";\nexport {\n type DeviceTokenRegistration,\n type IPushBridge,\n NativePushBridge,\n type NotificationEventType,\n type NotificationListener,\n type NotificationPayload,\n NOTIFICATIONS_ERROR_CODES,\n NotificationsError,\n NotificationsManager,\n notificationsManager,\n type PrePromptHandle,\n type PrePromptOptions,\n type PushPermissionStatus,\n type PushPlatform,\n} from \"./domains/notifications\";\nexport type { CachedOfferings, Offering, OfferingProduct, OfferingServiceConfig } from \"./domains/offering\";\nexport { OfferingService, offeringService } from \"./domains/offering\";\nexport {\n ONBOARDING_ERROR_CODES,\n type OnboardingDropPayload,\n OnboardingError,\n OnboardingManager,\n onboardingManager,\n type OnboardingStepPayload,\n} from \"./domains/onboarding\";\nexport { PaywallModal } from \"./domains/paywall\";\nexport { PaywallContext, usePaywallContext } from \"./domains/paywall\";\nexport type { AllPlansResponse, CachedPlans, Plan, PlanProduct, PlanServiceConfig,PlansResponse } from \"./domains/plan\";\nexport { PlanCache, planCache,PlanService, planService } from \"./domains/plan\";\nexport {\n type SessionConfig,\n SessionManager,\n sessionManager,\n type SessionState,\n} from \"./domains/session\";\nexport type {\n CachedSubscription,\n SubscriptionInfo,\n SubscriptionManagerConfig,\n} from \"./domains/subscription\";\nexport { SubscriptionCache, subscriptionManager } from \"./domains/subscription\";\nexport {\n CAMPAIGN_ERROR_CODES,\n CampaignError,\n createPurchaseError,\n IDENTITY_ERROR_CODES,\n IdentityError,\n PAYWALL_ERROR_CODES,\n PaywallError,\n PaywalloError,\n PURCHASE_ERROR_CODES,\n PurchaseError,\n SESSION_ERROR_CODES,\n SessionError,\n} from \"./errors\";\nexport { useOfferingPurchase } from \"./hooks/useOfferingPurchase\";\nexport { useOfferings } from \"./hooks/useOfferings\";\nexport { useOnboarding } from \"./hooks/useOnboarding\";\nexport { usePaywallo } from \"./hooks/usePaywallo\";\n/**\n * @deprecated Use `useOfferingPurchase` instead.\n */\nexport { usePlanPurchase } from \"./hooks/usePlanPurchase\";\n/**\n * @deprecated Use `useOfferings` instead.\n */\nexport { usePlans } from \"./hooks/usePlans\";\nexport { useProducts } from \"./hooks/useProducts\";\nexport { usePurchase } from \"./hooks/usePurchase\";\nexport { useSubscription } from \"./hooks/useSubscription\";\nexport { PaywalloProvider, type PaywalloProviderProps } from \"./PaywalloProvider\";\nexport type {\n BlockType,\n BoxSpacing,\n CampaignPresentOptions,\n CampaignResponse,\n CampaignResult,\n ConditionalFlagContext,\n ConditionalFlagResult,\n EmergencyPaywallResponse,\n Environment,\n FlagVariant,\n IdentifyOptions,\n LocalizedText,\n PaywallBlockConfig,\n PaywallConfig,\n PaywallErrorStrings,\n PaywallNode,\n PaywalloConfig,\n PaywallPresentOptions,\n PaywallResult,\n PaywallState,\n Product,\n Purchase,\n PurchaseResult,\n RestoreResult,\n Subscription,\n SubscriptionPlatform,\n SubscriptionStatus,\n SubscriptionStatusResponse,\n TapBehavior,\n TrackEventOptions,\n UserProperties,\n ValidatePurchaseResponse,\n} from \"./types\";\nexport {\n detectDeviceLanguage,\n getCurrentLanguage,\n getDefaultLanguage,\n getLocalizedString,\n initLocalization,\n setCurrentLanguage,\n setDefaultLanguage,\n} from \"./utils/localization\";\nexport type { VariableContext } from \"./utils/variableResolver\";\nexport { hasVariables, parseVariables, resolveText } from \"./utils/variableResolver\";\n\nexport const Paywallo = PaywalloClient;\nexport default Paywallo;\n","import { createContext } from \"react\";\n\nimport type {\n CampaignResult,\n PaywallConfig,\n PaywalloConfig,\n PaywallResult,\n Subscription,\n} from \"../types\";\nimport type { Product } from \"../types/purchase\";\n\nexport interface PreloadResult {\n success: boolean;\n error?: Error;\n}\n\nexport interface PaywalloContextValue {\n config: PaywalloConfig | null;\n isInitialized: boolean;\n isReady: boolean;\n initError: Error | null;\n distinctId: string | null;\n subscription: Subscription | null;\n products: Map<string, Product>;\n isLoadingProducts: boolean;\n presentPaywall: (placement: string) => Promise<PaywallResult>;\n presentCampaign: (\n placement: string,\n context?: Record<string, unknown>\n ) => Promise<CampaignResult>;\n preloadCampaign: (placement: string, context?: Record<string, unknown>) => Promise<PreloadResult>;\n hasActiveSubscription: () => Promise<boolean>;\n getSubscription: () => Promise<Subscription | null>;\n restorePurchases: () => Promise<{ success: boolean; error?: Error }>;\n getPaywallConfig: (placement: string) => Promise<PaywallConfig | null>;\n refreshProducts: (productIds: string[]) => Promise<void>;\n}\n\nexport const PaywalloContext = createContext<PaywalloContextValue | null>(null);\n","export {\n createPurchaseError,\n PURCHASE_ERROR_CODES as ERROR_CODES,\n PurchaseError,\n} from \"./PurchaseError\";\n","export {\n getCampaignData,\n getEmergencyPaywall,\n getSubscriptionStatus,\n validatePurchase,\n} from \"./apiPurchaseMethods\";\nexport { ERROR_CODES } from \"./errors\";\nexport { getIAPService,IAPService } from \"./IAPService\";\nexport { nativeStoreKit } from \"./NativeStoreKit\";\nexport {\n calculatePricePerPeriod,\n getSubscriptionPeriodDays,\n parsePrice,\n} from \"./priceFormatter\";\nexport { formatProductForSDK } from \"./productFormatter\";\nexport { createPurchaseError,PURCHASE_ERROR_CODES, PurchaseError } from \"./PurchaseError\";\nexport type {\n IAPProduct,\n IAPPurchase,\n ProductPriceInfo,\n PurchaseControllerConfig,\n PurchaseState,\n} from \"./types\";\n","export { OfferingService, offeringService } from \"./OfferingService\";\nexport type { CachedOfferings, Offering, OfferingProduct, OfferingServiceConfig } from \"./types\";\n","export { SubscriptionCache } from \"./SubscriptionCache\";\nexport { subscriptionManager } from \"./SubscriptionManager\";\nexport type {\n CachedSubscription,\n SubscriptionInfo,\n SubscriptionManagerConfig,\n} from \"./types\";\n","export { ANALYTICS_ERROR_CODES, AnalyticsError } from \"../domains/analytics\";\nexport { CAMPAIGN_ERROR_CODES, CampaignError } from \"../domains/campaign\";\nexport { createPurchaseError, PURCHASE_ERROR_CODES, PurchaseError } from \"../domains/iap\";\nexport { IDENTITY_ERROR_CODES, IdentityError } from \"../domains/identity\";\nexport { PAYWALL_ERROR_CODES, PaywallError } from \"../domains/paywall\";\nexport { SESSION_ERROR_CODES, SessionError } from \"../domains/session\";\nexport { CLIENT_ERROR_CODES, ClientError } from \"./ClientError\";\nexport { PaywalloError } from \"./PaywalloError\";\n","import { useCallback, useState } from \"react\";\n\nimport { createPurchaseError, getIAPService, PurchaseError } from \"../domains/iap\";\nimport type { PurchaseState } from \"../domains/iap/types\";\nimport { invalidatePlanCache } from \"../domains/plan/invalidateCache\";\n\nexport interface UseOfferingPurchaseResult {\n purchase: (productId: string) => Promise<void>;\n isPurchasing: boolean;\n}\n\nexport function useOfferingPurchase(): UseOfferingPurchaseResult {\n const [state, setState] = useState<PurchaseState>(\"idle\");\n\n const purchase = useCallback(async (productId: string): Promise<void> => {\n setState(\"purchasing\");\n\n try {\n const iapService = getIAPService();\n const result = await iapService.purchase(productId);\n\n setState(\"idle\");\n\n if (result.success) await invalidatePlanCache();\n } catch (err) {\n const purchaseError =\n err instanceof PurchaseError\n ? err\n : createPurchaseError(\"PURCHASE_FAILED\", err instanceof Error ? err.message : String(err));\n\n if (purchaseError.userCancelled) {\n setState(\"idle\");\n return;\n }\n\n setState(\"error\");\n throw purchaseError;\n }\n }, []);\n\n return {\n purchase,\n isPurchasing: state === \"purchasing\",\n };\n}\n","export async function invalidatePlanCache(): Promise<void> {\n try {\n const mod = await import(\"./PlanService\");\n (mod as { planService: { invalidateCache(): void } }).planService?.invalidateCache();\n } catch {\n // PlanService not yet available — no-op\n }\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport type { Offering } from \"../domains/offering/types\";\n\nasync function getOfferingService(): Promise<{\n getOfferings(ids?: string[]): Promise<Offering[]>;\n} | null> {\n try {\n const mod = await import(\"../domains/offering/OfferingService\");\n return (mod as { offeringService: typeof mod.offeringService }).offeringService ?? null;\n } catch {\n return null;\n }\n}\n\nexport interface UseOfferingsResult {\n offerings: Offering[];\n isLoading: boolean;\n}\n\nexport function useOfferings(ids?: string[]): UseOfferingsResult {\n const [offerings, setOfferings] = useState<Offering[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n const idsKey = ids?.join(\",\") ?? \"\";\n\n const fetchOfferings = useCallback(async (): Promise<void> => {\n setIsLoading(true);\n\n try {\n const service = await getOfferingService();\n if (!service) {\n setOfferings([]);\n return;\n }\n\n const result = await service.getOfferings(ids);\n setOfferings(result);\n } catch {\n setOfferings([]);\n } finally {\n setIsLoading(false);\n }\n }, [idsKey]);\n\n useEffect(() => {\n void fetchOfferings();\n }, [fetchOfferings]);\n\n return { offerings, isLoading };\n}\n","import { useCallback } from \"react\";\n\nimport { onboardingManager } from \"../domains/onboarding\";\n\nexport interface UseOnboardingResult {\n step: (stepName: string) => Promise<void>;\n complete: () => Promise<void>;\n drop: (stepName: string) => Promise<void>;\n}\n\n/**\n * React hook that exposes bound onboarding tracking methods.\n * Wraps `onboardingManager` with stable `useCallback` references.\n */\nexport function useOnboarding(): UseOnboardingResult {\n const step = useCallback(\n (stepName: string) => onboardingManager.step(stepName),\n []\n );\n\n const complete = useCallback(\n () => onboardingManager.complete(),\n []\n );\n\n const drop = useCallback(\n (stepName: string) => onboardingManager.drop(stepName),\n []\n );\n\n return { step, complete, drop };\n}\n","import { useContext } from \"react\";\n\nimport { PaywalloContext, PaywalloContextValue } from \"../context/PaywalloContext\";\nimport { CLIENT_ERROR_CODES,ClientError } from \"../errors/ClientError\";\n\nexport function usePaywallo(): PaywalloContextValue {\n const context = useContext(PaywalloContext);\n\n if (!context) {\n throw new ClientError(CLIENT_ERROR_CODES.PROVIDER_MISSING, \"usePaywallo must be used within a PaywalloProvider\");\n }\n\n return context;\n}\n","import { useCallback, useState } from \"react\";\n\nimport { createPurchaseError, getIAPService, PurchaseError } from \"../domains/iap\";\nimport type { PurchaseState } from \"../domains/iap/types\";\nimport { invalidatePlanCache } from \"../domains/plan/invalidateCache\";\nimport type { PurchaseResult } from \"../types/purchase\";\n\nexport interface RestoreResult {\n restoredCount: number;\n productIds: string[];\n}\n\nexport interface UsePlanPurchaseResult {\n purchase: (productId: string) => Promise<PurchaseResult | null>;\n restore: () => Promise<RestoreResult | null>;\n isPurchasing: boolean;\n isRestoring: boolean;\n error: Error | null;\n}\n\nexport function usePlanPurchase(): UsePlanPurchaseResult {\n const [state, setState] = useState<PurchaseState>(\"idle\");\n const [error, setError] = useState<PurchaseError | null>(null);\n\n const purchase = useCallback(async (productId: string): Promise<PurchaseResult | null> => {\n setState(\"purchasing\");\n setError(null);\n\n try {\n const iapService = getIAPService();\n const result = await iapService.purchase(productId);\n\n setState(\"idle\");\n\n if (result.success) await invalidatePlanCache();\n\n return result.success\n ? {\n success: true,\n purchase: result.purchase\n ? { productId: result.purchase.productId, transactionId: result.purchase.transactionId ?? \"\", transactionDate: result.purchase.transactionDate, receipt: result.purchase.receipt, platform: \"ios\" }\n : undefined,\n }\n : { success: false, error: result.error };\n } catch (err) {\n const purchaseError =\n err instanceof PurchaseError\n ? err\n : createPurchaseError(\"PURCHASE_FAILED\", err instanceof Error ? err.message : String(err));\n\n if (purchaseError.userCancelled) {\n setState(\"idle\");\n return null;\n }\n\n setError(purchaseError);\n setState(\"error\");\n return { success: false, error: purchaseError };\n }\n }, []);\n\n const restore = useCallback(async (): Promise<RestoreResult | null> => {\n setState(\"restoring\");\n setError(null);\n\n try {\n const iapService = getIAPService();\n const transactions = await iapService.restore();\n\n setState(\"idle\");\n await invalidatePlanCache();\n\n return {\n restoredCount: transactions.length,\n productIds: transactions.map((tx) => tx.productId),\n };\n } catch (err) {\n const e =\n err instanceof PurchaseError\n ? err\n : createPurchaseError(\"RESTORE_FAILED\", String(err));\n\n setError(e);\n setState(\"error\");\n return null;\n }\n }, []);\n\n return {\n purchase,\n restore,\n isPurchasing: state === \"purchasing\",\n isRestoring: state === \"restoring\",\n error,\n };\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"../domains/iap\";\nimport type { Plan } from \"../domains/plan/types\";\n\n// planService will be wired when PlanService is created.\n// Using dynamic import to avoid hard compile error while domain is in-progress.\nasync function getPlanService(): Promise<{\n getAllPlans(forceRefresh?: boolean): Promise<{ plans: Plan[]; currentIdentifier: string | null }>;\n} | null> {\n try {\n const mod = await import(\"../domains/plan/PlanService\");\n return (mod as { planService: typeof mod.planService }).planService ?? null;\n } catch {\n return null;\n }\n}\n\nexport interface UsePlansResult {\n currentPlan: Plan | null;\n allPlans: Plan[];\n isLoading: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n}\n\nexport function usePlans(): UsePlansResult {\n const [allPlans, setAllPlans] = useState<Plan[]>([]);\n const [currentPlan, setCurrentPlan] = useState<Plan | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchPlans = useCallback(async (forceRefresh = false): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const service = await getPlanService();\n if (!service) {\n throw new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, \"PlanService not available\");\n }\n\n const response = await service.getAllPlans(forceRefresh);\n const { plans, currentIdentifier } = response;\n\n setAllPlans(plans);\n setCurrentPlan(\n currentIdentifier != null\n ? (plans.find((p) => p.identifier === currentIdentifier) ?? null)\n : null\n );\n } catch (err) {\n const e =\n err instanceof PurchaseError\n ? err\n : new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, String(err));\n setError(e);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n const refresh = useCallback((): Promise<void> => {\n return fetchPlans(true);\n }, [fetchPlans]);\n\n useEffect(() => {\n void fetchPlans(false);\n }, [fetchPlans]);\n\n return { currentPlan, allPlans, isLoading, error, refresh };\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"../domains/iap\";\nimport { getIAPService } from \"../domains/iap\";\nimport type { IAPProduct, ProductPriceInfo } from \"../domains/iap/types\";\nimport type { FormattedProduct } from \"../utils/productMappers\";\nimport { mapToFormattedProduct, mapToIAPProduct } from \"../utils/productMappers\";\n\ninterface UseProductsResult {\n products: IAPProduct[];\n formattedProducts: FormattedProduct[];\n isLoading: boolean;\n error: Error | null;\n loadProducts: (productIds: string[]) => Promise<void>;\n getProduct: (productId: string) => IAPProduct | undefined;\n getFormattedProduct: (productId: string) => FormattedProduct | undefined;\n getPriceInfo: (productId: string) => ProductPriceInfo | undefined;\n}\n\nexport function useProducts(initialProductIds?: string[]): UseProductsResult {\n const [products, setProducts] = useState<IAPProduct[]>([]);\n const [formattedProducts, setFormattedProducts] = useState<FormattedProduct[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const loadProducts = useCallback(async (productIds: string[]): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const iapService = getIAPService();\n const storeProducts = await iapService.loadProducts(productIds);\n\n setProducts(storeProducts.map(mapToIAPProduct));\n setFormattedProducts(storeProducts.map(mapToFormattedProduct));\n } catch (err) {\n setError(err instanceof PurchaseError ? err : new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, String(err)));\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n useEffect(() => {\n if (initialProductIds && initialProductIds.length > 0) {\n void loadProducts(initialProductIds);\n }\n // Intentionally runs once on mount — initialProductIds is a seed value, not a reactive dep.\n // Callers that need reactive reloads should call loadProducts() directly.\n }, []);\n\n const getProduct = useCallback(\n (productId: string): IAPProduct | undefined => {\n return products.find((p) => p.productId === productId);\n },\n [products]\n );\n\n const getFormattedProduct = useCallback(\n (productId: string): FormattedProduct | undefined => {\n return formattedProducts.find((p) => p.productId === productId);\n },\n [formattedProducts]\n );\n\n const getPriceInfo = useCallback(\n (productId: string): ProductPriceInfo | undefined => {\n const p = formattedProducts.find((fp) => fp.productId === productId);\n if (!p) return undefined;\n return {\n price: p.price,\n priceValue: p.priceValue,\n currency: p.currency,\n localizedPrice: p.localizedPrice,\n pricePerMonth: p.pricePerMonth,\n pricePerWeek: p.pricePerWeek,\n pricePerDay: p.pricePerDay,\n };\n },\n [formattedProducts]\n );\n\n return {\n products,\n formattedProducts,\n isLoading,\n error,\n loadProducts,\n getProduct,\n getFormattedProduct,\n getPriceInfo,\n };\n}\n","import type { IAPProduct, ProductPriceInfo } from \"../domains/iap/types\";\n\ntype RawStoreProduct = {\n productId: string;\n title: string;\n description: string;\n price: string;\n priceValue: number;\n currency: string;\n localizedPrice: string;\n type: string;\n subscriptionPeriod?: string;\n introductoryPrice?: string;\n freeTrialPeriod?: string;\n trialDays?: number;\n pricePerMonth?: string;\n pricePerWeek?: string;\n pricePerDay?: string;\n};\n\nexport interface FormattedProduct extends ProductPriceInfo {\n productId: string;\n title: string;\n description: string;\n subscriptionPeriod?: string;\n introductoryPrice?: string;\n freeTrialPeriod?: string;\n trialDays: number;\n}\n\nexport function mapToIAPProduct(product: RawStoreProduct): IAPProduct {\n return {\n productId: product.productId,\n price: product.price,\n currency: product.currency,\n localizedPrice: product.localizedPrice,\n title: product.title,\n description: product.description,\n type: product.type === \"subscription\" ? \"subs\" : \"inapp\",\n subscriptionPeriodAndroid: product.subscriptionPeriod,\n introductoryPrice: product.introductoryPrice,\n freeTrialPeriodAndroid: product.freeTrialPeriod,\n trialDays: product.trialDays ?? 0,\n };\n}\n\nexport function mapToFormattedProduct(product: RawStoreProduct): FormattedProduct {\n return {\n productId: product.productId,\n title: product.title,\n description: product.description,\n price: product.price,\n priceValue: product.priceValue,\n currency: product.currency,\n localizedPrice: product.localizedPrice,\n subscriptionPeriod: product.subscriptionPeriod,\n introductoryPrice: product.introductoryPrice,\n freeTrialPeriod: product.freeTrialPeriod,\n trialDays: product.trialDays ?? 0,\n pricePerMonth: product.pricePerMonth,\n pricePerWeek: product.pricePerWeek,\n pricePerDay: product.pricePerDay,\n };\n}\n","import { useCallback, useState } from \"react\";\n\nimport { createPurchaseError, getIAPService, PurchaseError } from \"../domains/iap\";\nimport type { IAPPurchase, PurchaseState } from \"../domains/iap/types\";\n\nexport interface PurchaseOutcome {\n status: \"success\" | \"cancelled\" | \"failed\";\n purchase?: IAPPurchase;\n error?: PurchaseError;\n}\n\ninterface UsePurchaseResult {\n state: PurchaseState;\n purchase: (productId: string) => Promise<PurchaseOutcome>;\n restore: () => Promise<IAPPurchase[]>;\n error: PurchaseError | null;\n isPurchasing: boolean;\n isRestoring: boolean;\n}\n\nfunction toIAPPurchase(p: { productId: string; transactionId: string; transactionDate: number; receipt: string }): IAPPurchase {\n return { productId: p.productId, transactionId: p.transactionId, transactionDate: p.transactionDate, transactionReceipt: p.receipt };\n}\n\nexport function usePurchase(): UsePurchaseResult {\n const [state, setState] = useState<PurchaseState>(\"idle\");\n const [error, setError] = useState<PurchaseError | null>(null);\n\n const purchase = useCallback(async (productId: string): Promise<PurchaseOutcome> => {\n setState(\"purchasing\");\n setError(null);\n\n try {\n const iapService = getIAPService();\n const result = await iapService.purchase(productId);\n\n if (result.success && result.purchase) {\n setState(\"idle\");\n return { status: \"success\", purchase: toIAPPurchase(result.purchase) };\n }\n\n if (result.error) {\n setError(result.error);\n setState(\"error\");\n return { status: \"failed\", error: result.error };\n }\n\n setState(\"idle\");\n return { status: \"cancelled\" };\n } catch (err) {\n const purchaseError = err instanceof PurchaseError\n ? err\n : createPurchaseError(\"PURCHASE_FAILED\", err instanceof Error ? err.message : String(err));\n\n if (purchaseError.userCancelled) {\n setState(\"idle\");\n return { status: \"cancelled\" };\n }\n\n setError(purchaseError);\n setState(\"error\");\n return { status: \"failed\", error: purchaseError };\n }\n }, []);\n\n const restore = useCallback(async (): Promise<IAPPurchase[]> => {\n setState(\"restoring\");\n setError(null);\n\n try {\n const iapService = getIAPService();\n const transactions = await iapService.restore();\n\n setState(\"idle\");\n return transactions.map((tx) => toIAPPurchase({ ...tx, receipt: tx.receipt }));\n } catch (err) {\n const e = err instanceof PurchaseError ? err : createPurchaseError(\"RESTORE_FAILED\", String(err));\n setError(e);\n setState(\"error\");\n throw e;\n }\n }, []);\n\n return { state, purchase, restore, error, isPurchasing: state === \"purchasing\", isRestoring: state === \"restoring\" };\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"../domains/iap\";\nimport { subscriptionManager } from \"../domains/subscription/SubscriptionManager\";\nimport type { SubscriptionInfo, SubscriptionStatusResponse } from \"../domains/subscription/types\";\n\nconst EMPTY_ENTITLEMENTS: string[] = [];\n\ninterface UseSubscriptionResult {\n subscription: SubscriptionInfo | null;\n isActive: boolean;\n isLoading: boolean;\n error: Error | null;\n entitlements: string[];\n refresh: () => Promise<void>;\n restore: () => Promise<void>;\n}\n\nexport function useSubscription(): UseSubscriptionResult {\n const [status, setStatus] = useState<SubscriptionStatusResponse | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const refresh = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const newStatus = await subscriptionManager.getSubscriptionStatus(true);\n setStatus(newStatus);\n } catch (err) {\n const e = err instanceof PurchaseError ? err : new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, String(err));\n setError(e);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n const restore = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const newStatus = await subscriptionManager.restorePurchases();\n setStatus(newStatus);\n } catch (err) {\n const e = err instanceof PurchaseError ? err : new PurchaseError(PURCHASE_ERROR_CODES.RESTORE_FAILED, String(err));\n setError(e);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n useEffect(() => {\n void subscriptionManager.getSubscriptionStatus()\n .then((s) => {\n setStatus(s);\n setIsLoading(false);\n })\n .catch((err) => {\n const e = err instanceof PurchaseError ? err : new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, String(err));\n setError(e);\n setIsLoading(false);\n });\n\n const removeListener = subscriptionManager.addListener((newStatus) => {\n setStatus(newStatus);\n });\n\n return () => {\n removeListener();\n };\n }, []);\n\n return {\n subscription: status?.subscription ?? null,\n isActive: status?.hasActiveSubscription ?? false,\n isLoading,\n error,\n entitlements: status?.entitlements ?? EMPTY_ENTITLEMENTS,\n refresh,\n restore,\n };\n}\n","import React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { Animated, Dimensions, Easing, StyleSheet } from \"react-native\";\n\nimport { PaywalloContext, PaywalloContextValue } from \"./context/PaywalloContext\";\nimport { PaywalloClient } from \"./core/PaywalloClient\";\nimport { SecureStorage } from \"./core/storage/SecureStorage\";\nimport { CAMPAIGN_ERROR_CODES, CampaignError } from \"./domains/campaign\";\nimport { getIAPService } from \"./domains/iap\";\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"./domains/iap\";\nimport { PaywallErrorBoundary } from \"./domains/paywall\";\nimport { PaywallModal } from \"./domains/paywall\";\nimport { PaywallWebView } from \"./domains/paywall\";\nimport { usePaywallPresenter } from \"./domains/paywall\";\nimport { sessionManager } from \"./domains/session\";\nimport { CLIENT_ERROR_CODES, ClientError } from \"./errors/ClientError\";\nimport { useAppAutoEvents } from \"./hooks/useAppAutoEvents\";\nimport { useCampaignPreload } from \"./hooks/useCampaignPreload\";\nimport { useProductLoader } from \"./hooks/useProductLoader\";\nimport { usePurchaseOrchestrator } from \"./hooks/usePurchaseOrchestrator\";\nimport { useSubscriptionSync } from \"./hooks/useSubscriptionSync\";\nimport type { CampaignResult, PaywallConfig, PaywalloConfig, PaywallResult, RestoreResult } from \"./types\";\nimport type { Product } from \"./types/purchase\";\nimport { initLocalization } from \"./utils/localization\";\n\nexport interface PaywalloProviderProps { children: React.ReactNode; config: PaywalloConfig; }\ninterface ActivePaywall {\n placement: string;\n resolver: (result: PaywallResult) => void;\n paywallConfig?: { id: string; placement: string; config: Record<string, unknown>; primaryProductId?: string; secondaryProductId?: string };\n preloadedProducts?: Map<string, Product>;\n variantKey?: string;\n campaignId?: string;\n /** UUID de `paywall_variants` (sub-fase 2.14). */\n variantId?: string;\n}\nexport function PaywalloProvider({ children, config }: PaywalloProviderProps): React.ReactElement {\n const [isInitialized, setIsInitialized] = useState(false);\n const [initError, setInitError] = useState<Error | null>(null);\n const [distinctId, setDistinctId] = useState<string | null>(null);\n const [activePaywall, setActivePaywall] = useState<ActivePaywall | null>(null);\n\n const { products, isLoadingProducts, refreshProducts } = useProductLoader();\n const { subscription, hasActiveSubscription, getSubscription, invalidateCache } = useSubscriptionSync();\n const { preloadedWebView, setPreloadedWebView, preloadCampaign, consumePreloadedCampaign, isPreloadValid } = useCampaignPreload();\n const clearPreloadedWebView = useCallback((): void => setPreloadedWebView(null), [setPreloadedWebView]);\n const autoPreloadTriggeredRef = useRef(false);\n const preloadedWebViewRef = useRef(preloadedWebView);\n const pollTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pollCancelledRef = useRef(false);\n const secureStorageRef = useRef(new SecureStorage(config.debug));\n\n useEffect(() => { preloadedWebViewRef.current = preloadedWebView; }, [preloadedWebView]);\n\n useAppAutoEvents({\n isInitialized,\n getAppVersion: () => (config as unknown as { appVersion?: string }).appVersion ?? \"unknown\",\n getSessionId: () => sessionManager.getSessionId(),\n emitLifecycle: (props, priority) => {\n // UserProperties has a string index signature — spread into a fresh object\n // so the compile-time shape matches without leaking `undefined` fields.\n const flat: Record<string, string | number | boolean | null> = {};\n for (const [k, v] of Object.entries(props)) if (v !== undefined) flat[k] = v as string | number | boolean | null;\n return PaywalloClient.track(\"lifecycle\", { properties: flat, priority });\n },\n storageGet: (key) => secureStorageRef.current.get(key),\n storageSet: (key, value) => secureStorageRef.current.set(key, value),\n debug: config.debug,\n });\n\n const triggerRepreload = useCallback((placement: string): void => {\n void PaywalloClient.preloadCampaign(placement).catch(() => {});\n }, []);\n\n const { showingPreloadedWebView, presentPreloadedWebView, resolvePreloadedPaywall, handlePreloadedWebViewReady: baseHandlePreloadedWebViewReady, handlePreloadedClose: baseHandlePreloadedClose, setShowingPreloadedWebView, presentedAtRef } =\n usePaywallPresenter(preloadedWebView, setPreloadedWebView);\n\n const SCREEN_HEIGHT = useMemo(() => Dimensions.get(\"window\").height, []);\n const slideAnim = useRef(new Animated.Value(SCREEN_HEIGHT)).current;\n\n const handlePreloadedWebViewReady = useCallback((): void => {\n if (PaywalloClient.getConfig()?.debug) { console.log(`[Paywallo WEBVIEW] loaded — placement: ${preloadedWebView?.placement}`); }\n baseHandlePreloadedWebViewReady();\n }, [preloadedWebView?.placement, baseHandlePreloadedWebViewReady]);\n\n const handlePreloadedClose = useCallback((): void => {\n const placement = preloadedWebView?.placement;\n Animated.timing(slideAnim, { toValue: SCREEN_HEIGHT, duration: 200, easing: Easing.in(Easing.cubic), useNativeDriver: true }).start(() => {\n baseHandlePreloadedClose();\n if (placement) triggerRepreload(placement);\n });\n }, [baseHandlePreloadedClose, preloadedWebView, triggerRepreload, slideAnim, SCREEN_HEIGHT]);\n\n const { handlePreloadedPurchase: rawPreloadedPurchase, handlePreloadedRestore } = usePurchaseOrchestrator(\n preloadedWebView, resolvePreloadedPaywall, clearPreloadedWebView, setShowingPreloadedWebView, presentedAtRef, invalidateCache\n );\n const [isPreloadPurchasing, setIsPreloadPurchasing] = useState(false);\n const handlePreloadedPurchase = useCallback(async (productId: string) => {\n setIsPreloadPurchasing(true);\n try { await rawPreloadedPurchase(productId); } finally { setIsPreloadPurchasing(false); }\n }, [rawPreloadedPurchase]);\n\n const configRef = useRef(config);\n\n useEffect(() => {\n let mounted = true;\n initLocalization({ detectDevice: true });\n PaywalloClient.init(configRef.current)\n .then(async () => {\n if (!mounted) return;\n setDistinctId(PaywalloClient.getDistinctId());\n setIsInitialized(true);\n if (!autoPreloadTriggeredRef.current) {\n autoPreloadTriggeredRef.current = true;\n const placement = await PaywalloClient.waitForAutoPreloadedPlacement();\n if (mounted && placement) void preloadCampaign(placement).catch(() => {});\n }\n })\n .catch((err: unknown) => {\n if (!mounted) return;\n setInitError(err instanceof Error ? err : new ClientError(CLIENT_ERROR_CODES.NOT_INITIALIZED, String(err)));\n });\n return () => { mounted = false; };\n }, [preloadCampaign]); // config is captured via ref — re-init on config change is intentional no-op\n\n const getPaywallConfig = useCallback(async (p: string): Promise<PaywallConfig | null> => {\n const api = PaywalloClient.getApiClient(); return api ? api.getPaywall(p) : null;\n }, []);\n\n const presentPaywall = useCallback((placement: string): Promise<PaywallResult> => {\n return new Promise<PaywallResult>((resolve) => setActivePaywall({ placement, resolver: resolve }));\n }, []);\n\n // V2 taxonomy: `$campaign_impression` merged into canonical\n // `paywall {type:\"viewed\", campaign_id}`. Single source of truth for\n // impression counts on the server.\n const trackCampaignImpression = useCallback((placement: string, variantKey: string, campaignId: string): void => {\n const api = PaywalloClient.getApiClient();\n if (!api) return;\n const sessionId = PaywalloClient.getSessionId();\n void api.trackEvent(\"paywall\", PaywalloClient.getDistinctId(), {\n type: \"viewed\",\n paywall_id: placement,\n placement,\n variant_key: variantKey,\n campaign_id: campaignId,\n ...(sessionId && { sessionId }),\n }).catch(() => {});\n }, []);\n\n const presentCampaign = useCallback(\n async (placement: string, context?: Record<string, unknown>): Promise<CampaignResult> => {\n try {\n if (preloadedWebView?.placement === placement && preloadedWebView.loaded && isPreloadValid(placement)) {\n consumePreloadedCampaign(placement);\n trackCampaignImpression(placement, preloadedWebView.variantKey ?? \"\", preloadedWebView.campaignId ?? \"\");\n // $paywall_viewed is now emitted from `usePaywallPresenter.presentPreloadedWebView`\n // so the event fires from a single canonical point for the preloaded path.\n const r = await presentPreloadedWebView();\n return {\n ...r,\n campaignId: preloadedWebView.campaignId ?? \"\",\n variantKey: preloadedWebView.variantKey ?? \"\",\n ...(preloadedWebView.variantId && { variantId: preloadedWebView.variantId }),\n };\n }\n const preloaded = consumePreloadedCampaign(placement);\n if (preloaded) {\n trackCampaignImpression(placement, preloaded.variantKey, preloaded.campaignId);\n const r = await new Promise<PaywallResult>((resolve) => setActivePaywall({\n placement: preloaded.paywall.placement, resolver: resolve,\n paywallConfig: preloaded.paywall, preloadedProducts: preloaded.products,\n variantKey: preloaded.variantKey, campaignId: preloaded.campaignId,\n variantId: preloaded.variantId,\n }));\n return {\n ...r,\n campaignId: preloaded.campaignId,\n variantKey: preloaded.variantKey,\n ...(preloaded.variantId && { variantId: preloaded.variantId }),\n };\n }\n const campaign = PaywalloClient.getPreloadedCampaign(placement) ?? await PaywalloClient.getCampaign(placement, context);\n if (!campaign?.paywall) return { presented: false, purchased: false, cancelled: false, restored: false,\n error: new CampaignError(campaign ? CAMPAIGN_ERROR_CODES.PRELOAD_FAILED : CAMPAIGN_ERROR_CODES.NOT_FOUND, campaign ? `No paywall: ${placement}` : `Campaign not found: ${placement}`) };\n trackCampaignImpression(placement, campaign.variantKey, campaign.campaignId);\n const r = await new Promise<PaywallResult>((resolve) => setActivePaywall({\n placement: campaign.paywall.placement, resolver: resolve,\n paywallConfig: { id: campaign.paywall.id, placement: campaign.paywall.placement, config: campaign.paywall.config,\n primaryProductId: campaign.paywall.primaryProductId, secondaryProductId: campaign.paywall.secondaryProductId },\n variantKey: campaign.variantKey, campaignId: campaign.campaignId,\n variantId: campaign.variantId,\n }));\n return {\n ...r,\n campaignId: campaign.campaignId,\n variantKey: campaign.variantKey,\n ...(campaign.variantId && { variantId: campaign.variantId }),\n };\n } catch (error) {\n return { presented: false, purchased: false, cancelled: false, restored: false,\n error: error instanceof Error ? error : new CampaignError(CAMPAIGN_ERROR_CODES.PRESENT_FAILED, String(error)) };\n }\n },\n [preloadedWebView, isPreloadValid, consumePreloadedCampaign, presentPreloadedWebView, trackCampaignImpression]\n );\n\n const restorePurchases = useCallback(async (): Promise<RestoreResult> => {\n invalidateCache();\n try {\n const txs = await getIAPService().restore();\n return txs.length > 0 ? { success: true, restoredProducts: txs.map((tx) => tx.productId) } : { success: false, restoredProducts: [] };\n } catch (error) {\n return { success: false, restoredProducts: [], error: error instanceof Error ? error : new PurchaseError(PURCHASE_ERROR_CODES.RESTORE_FAILED, String(error)) };\n }\n }, [invalidateCache]);\n\n const handlePaywallResult = useCallback((result: PaywallResult): void => {\n if (activePaywall) { activePaywall.resolver(result); setActivePaywall(null); }\n }, [activePaywall]);\n\n const bridgePaywallPresenter = useCallback((placement: string): Promise<PaywallResult> => {\n if (PaywalloClient.getConfig()?.debug) { console.log(`[Paywallo PRESENT] called — preloaded: ${preloadedWebViewRef.current?.loaded === true} placement: ${placement}`); }\n if (preloadedWebViewRef.current?.placement === placement) {\n if (preloadedWebViewRef.current.loaded) {\n return presentPreloadedWebView();\n }\n pollCancelledRef.current = false;\n return new Promise<PaywallResult>((resolve) => {\n let elapsed = 0;\n const poll = (): void => {\n if (pollCancelledRef.current) return;\n if (preloadedWebViewRef.current?.loaded) { resolve(presentPreloadedWebView()); return; }\n elapsed += 100;\n if (elapsed >= 500) { resolve(presentCampaign(placement)); return; }\n pollTimerRef.current = setTimeout(poll, 100);\n };\n pollTimerRef.current = setTimeout(poll, 100);\n });\n }\n return presentCampaign(placement);\n }, [presentPreloadedWebView, presentCampaign]);\n\n useEffect(() => {\n if (!isInitialized) return;\n const onEmergency = async (id: string): Promise<void> => { try { await bridgePaywallPresenter(id); } catch { /* non-critical */ } };\n PaywalloClient.registerPaywallPresenter(bridgePaywallPresenter);\n PaywalloClient.registerSubscriptionGetter(getSubscription);\n PaywalloClient.registerActiveChecker(hasActiveSubscription);\n PaywalloClient.registerRestoreHandler(restorePurchases);\n PaywalloClient.registerEmergencyPaywallHandler(onEmergency);\n return () => {\n pollCancelledRef.current = true;\n if (pollTimerRef.current !== null) { clearTimeout(pollTimerRef.current); pollTimerRef.current = null; }\n PaywalloClient.registerPaywallPresenter(null);\n PaywalloClient.registerSubscriptionGetter(null);\n PaywalloClient.registerActiveChecker(null);\n PaywalloClient.registerRestoreHandler(null);\n PaywalloClient.registerEmergencyPaywallHandler(null);\n };\n }, [isInitialized, bridgePaywallPresenter, getSubscription, hasActiveSubscription, restorePurchases]);\n\n\n const isReady = isInitialized && !isLoadingProducts;\n\n const noOp = useCallback(() => {}, []);\n const contextValue: PaywalloContextValue = useMemo(() => ({\n config: PaywalloClient.getConfig(), isInitialized, isReady, initError, distinctId, subscription, products, isLoadingProducts,\n presentPaywall, presentCampaign, preloadCampaign, hasActiveSubscription, getSubscription, restorePurchases, getPaywallConfig, refreshProducts,\n }), [isInitialized, isReady, initError, distinctId, subscription, products, isLoadingProducts,\n presentPaywall, presentCampaign, preloadCampaign, hasActiveSubscription, getSubscription, restorePurchases, getPaywallConfig, refreshProducts]);\n\n useLayoutEffect(() => {\n if (showingPreloadedWebView) {\n slideAnim.setValue(SCREEN_HEIGHT);\n Animated.timing(slideAnim, { toValue: 0, duration: 200, easing: Easing.out(Easing.cubic), useNativeDriver: true }).start();\n }\n }, [showingPreloadedWebView, slideAnim, SCREEN_HEIGHT]);\n\n const preloadStyle = [\n styles.preloadOverlay,\n showingPreloadedWebView ? styles.visible : styles.hidden,\n showingPreloadedWebView ? { transform: [{ translateY: slideAnim }] } : undefined,\n ];\n\n return (\n <PaywalloContext.Provider value={contextValue}>\n {children}\n <PaywallErrorBoundary>\n {!!preloadedWebView?.craftData && (\n <Animated.View style={preloadStyle} pointerEvents={showingPreloadedWebView ? \"auto\" : \"none\"}>\n <PaywallWebView\n paywallId={preloadedWebView.paywallId} craftData={preloadedWebView.craftData}\n products={preloadedWebView.products} primaryProductId={preloadedWebView.primaryProductId}\n secondaryProductId={preloadedWebView.secondaryProductId} isPurchasing={isPreloadPurchasing}\n webUrl={isInitialized ? PaywalloClient.getWebUrl() : null}\n onReady={handlePreloadedWebViewReady} onClose={showingPreloadedWebView ? handlePreloadedClose : noOp}\n onPurchase={showingPreloadedWebView ? handlePreloadedPurchase : noOp}\n onRestore={showingPreloadedWebView ? handlePreloadedRestore : noOp}\n />\n </Animated.View>\n )}\n </PaywallErrorBoundary>\n <PaywallErrorBoundary>\n {activePaywall && (\n <PaywallModal placement={activePaywall.placement} visible={true} onResult={handlePaywallResult}\n paywallConfig={activePaywall.paywallConfig} preloadedProducts={activePaywall.preloadedProducts}\n variantKey={activePaywall.variantKey} campaignId={activePaywall.campaignId}\n variantId={activePaywall.variantId} />\n )}\n </PaywallErrorBoundary>\n </PaywalloContext.Provider>\n );\n}\n\nconst styles = StyleSheet.create({\n preloadOverlay: { position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0, backgroundColor: \"#ffffff\" },\n hidden: { zIndex: -1, opacity: 0, width: 1, height: 1, overflow: \"hidden\" },\n visible: { zIndex: 9999, opacity: 1 },\n});\n","import { useEffect, useRef } from \"react\";\n\nimport { detectOsVersion, detectPlatform } from \"../utils/platformDetection\";\n\nconst FIRST_SEEN_KEY = \"@paywallo:firstSeen\";\nconst DEBOUNCE_MS = 1000;\n\nexport type LifecycleType = \"install\" | \"cold_start\" | \"foreground\" | \"background\";\n\nexport type LifecyclePriority = \"critical\" | \"normal\";\n\nexport interface LifecycleProperties {\n type: LifecycleType;\n session_id?: string;\n app_version?: string;\n device_type?: \"ios\" | \"android\";\n os_version?: string;\n}\n\ninterface AutoEventsConfig {\n isInitialized: boolean;\n getAppVersion: () => string;\n getSessionId: () => string | null;\n /**\n * Emits a `lifecycle` event through the unified EventBatcher pipeline\n * (`PaywalloClient.track`). Consumers should forward to\n * `PaywalloClient.track(\"lifecycle\", { properties, priority })`.\n *\n * `priority` is `\"critical\"` for `install` (one-shot, can't be lost) and\n * `\"normal\"` for recurring lifecycle events (`cold_start`, `foreground`,\n * `background`, session start/end).\n */\n emitLifecycle: (props: LifecycleProperties, priority: LifecyclePriority) => Promise<void>;\n storageGet: (key: string) => Promise<string | null>;\n storageSet: (key: string, value: string) => Promise<boolean>;\n debug?: boolean;\n}\n\n/**\n * Auto-emits `lifecycle` events into the unified EventBatcher pipeline.\n *\n * Emits `install` (critical, once per device, `@paywallo:firstSeen` guard) and\n * `cold_start` (normal, every fresh launch, debounced 1 s) via\n * `config.emitLifecycle` → `EventBatcher` → `/api/v1/events/batch`.\n *\n * Must be called from inside `PaywalloProvider` after SDK initialization.\n * The effect fires once when `isInitialized` flips to `true`; subsequent\n * re-renders are no-ops.\n */\nexport function useAppAutoEvents(config: AutoEventsConfig): void {\n const { isInitialized, getAppVersion, getSessionId, emitLifecycle, storageGet, storageSet, debug } = config;\n const didRunRef = useRef(false);\n\n useEffect(() => {\n if (!isInitialized || didRunRef.current) return;\n\n const timer = setTimeout(() => {\n if (didRunRef.current) return;\n didRunRef.current = true;\n\n void (async () => {\n const sessionId = getSessionId();\n const appVersion = getAppVersion();\n const deviceType = await detectPlatform();\n const osVersion = await detectOsVersion();\n\n // ── install (first-ever boot on this device) ────────────────────────\n try {\n const firstSeen = await storageGet(FIRST_SEEN_KEY);\n if (!firstSeen) {\n await emitLifecycle({ type: \"install\", device_type: deviceType, os_version: osVersion, app_version: appVersion, ...(sessionId ? { session_id: sessionId } : {}) }, \"critical\");\n await storageSet(FIRST_SEEN_KEY, new Date().toISOString());\n if (debug) console.log(\"[Paywallo EVENTS] lifecycle install emitted\");\n }\n } catch (err) {\n if (debug) console.log(\"[Paywallo EVENTS] lifecycle install check failed\", err);\n }\n\n // ── cold_start (every fresh launch) ─────────────────────────────────\n try {\n await emitLifecycle({ type: \"cold_start\", app_version: appVersion, device_type: deviceType, os_version: osVersion, ...(sessionId ? { session_id: sessionId } : {}) }, \"normal\");\n if (debug) console.log(\"[Paywallo EVENTS] lifecycle cold_start emitted\");\n } catch (err) {\n if (debug) console.log(\"[Paywallo EVENTS] lifecycle cold_start failed\", err);\n }\n })();\n }, DEBOUNCE_MS);\n\n return () => clearTimeout(timer);\n // intentionally run only once after isInitialized flips to true\n }, [isInitialized]);\n}\n","export async function detectPlatform(): Promise<\"ios\" | \"android\"> {\n try {\n const rn = await import(\"react-native\");\n return (rn as { Platform?: { OS?: string } }).Platform?.OS === \"ios\" ? \"ios\" : \"android\";\n } catch {\n return \"android\";\n }\n}\n\nexport async function detectOsVersion(): Promise<string> {\n try {\n const rn = await import(\"react-native\");\n const version = (rn as { Platform?: { Version?: string | number } }).Platform?.Version;\n return version != null ? String(version) : \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n","import { useCallback, useRef, useState } from \"react\";\n\nimport type { PreloadResult } from \"../context/PaywalloContext\";\nimport { PaywalloClient } from \"../core/PaywalloClient\";\nimport { CAMPAIGN_ERROR_CODES, CampaignError } from \"../domains/campaign/CampaignError\";\nimport { loadCampaignProducts } from \"../utils/loadCampaignProducts\";\nimport {\n getCacheEntry,\n isCacheEntryValid,\n type PreloadedCampaign,\n type PreloadedWebView,\n} from \"../utils/preloadCache\";\n\nexport type { PreloadedCampaign, PreloadedWebView };\n\nexport function useCampaignPreload() {\n const [preloadedWebView, setPreloadedWebView] = useState<PreloadedWebView | null>(null);\n const preloadedCampaignsRef = useRef<Map<string, PreloadedCampaign>>(new Map());\n\n const isPreloadValid = useCallback(\n (placement: string): boolean => isCacheEntryValid(preloadedCampaignsRef.current.get(placement)),\n []\n );\n\n const consumePreloadedCampaign = useCallback(\n (placement: string): PreloadedCampaign | null =>\n getCacheEntry(preloadedCampaignsRef.current, placement),\n []\n );\n\n const preloadCampaign = useCallback(\n async (placement: string, context?: Record<string, unknown>): Promise<PreloadResult> => {\n try {\n const campaign = await PaywalloClient.getCampaign(placement, context);\n if (!campaign?.paywall) {\n return {\n success: false,\n error: new CampaignError(\n CAMPAIGN_ERROR_CODES.NOT_FOUND,\n `Campaign or paywall not found: ${placement}`\n ),\n };\n }\n\n const { paywall } = campaign;\n const serverProducts = [paywall.primaryProduct, paywall.secondaryProduct].filter(Boolean);\n const storeProductIds = serverProducts.map((p) => p!.storeProductId).filter(Boolean);\n const productsMap = await loadCampaignProducts(\n serverProducts.map((p) => p!),\n storeProductIds\n );\n\n preloadedCampaignsRef.current.set(placement, {\n campaignId: campaign.campaignId,\n variantKey: campaign.variantKey,\n ...(campaign.variantId && { variantId: campaign.variantId }),\n paywall: {\n id: paywall.id,\n placement: paywall.placement,\n config: paywall.config,\n primaryProductId: paywall.primaryProductId,\n secondaryProductId: paywall.secondaryProductId,\n },\n products: productsMap,\n preloadedAt: Date.now(),\n });\n\n const craftData = (paywall.config as { craftData?: string })?.craftData ?? \"\";\n setPreloadedWebView({\n placement, paywallId: paywall.id, craftData, products: productsMap,\n primaryProductId: paywall.primaryProductId,\n secondaryProductId: paywall.secondaryProductId,\n loaded: false, campaignId: campaign.campaignId, variantKey: campaign.variantKey,\n ...(campaign.variantId && { variantId: campaign.variantId }),\n });\n if (PaywalloClient.getConfig()?.debug) console.log(`[Paywallo WEBVIEW] mounting hidden — placement: ${placement}`);\n\n return { success: true };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error\n ? error\n : new CampaignError(CAMPAIGN_ERROR_CODES.FETCH_FAILED, String(error)),\n };\n }\n },\n []\n );\n\n return {\n preloadedCampaignsRef,\n preloadedWebView,\n setPreloadedWebView,\n preloadCampaign,\n consumePreloadedCampaign,\n isPreloadValid,\n };\n}\n","import { getIAPService } from \"../domains/iap/IAPService\";\nimport type { ServerProductInfo } from \"../types/campaign\";\nimport type { Product } from \"../types/purchase\";\n\nimport { buildProductFromServerInfo } from \"./serverProduct\";\n\nexport async function loadCampaignProducts(\n serverProducts: ServerProductInfo[],\n storeProductIds: string[]\n): Promise<Map<string, Product>> {\n const productsMap = new Map<string, Product>();\n\n if (storeProductIds.length > 0) {\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n const storeProducts = await getIAPService().loadProducts(storeProductIds);\n if (storeProducts.length > 0) {\n for (const p of storeProducts) productsMap.set(p.productId, p);\n }\n if (productsMap.size >= storeProductIds.length) break;\n if (attempt < 3) await new Promise(r => setTimeout(r, 250 * Math.pow(2, attempt)));\n } catch { if (attempt < 3) await new Promise(r => setTimeout(r, 250 * Math.pow(2, attempt))); }\n }\n }\n\n for (const sp of serverProducts) {\n if (!productsMap.has(sp.storeProductId)) {\n const prod = buildProductFromServerInfo(sp);\n productsMap.set(prod.productId, prod);\n }\n }\n\n return productsMap;\n}\n","import type { ServerProductInfo } from \"../types/campaign\";\nimport type { Product } from \"../types/purchase\";\n\nconst PERIOD_MAP: Record<string, string> = {\n P1Y: \"ano\",\n P1M: \"mês\",\n P1W: \"semana\",\n P3M: \"trimestre\",\n P6M: \"semestre\",\n};\n\nexport function buildProductFromServerInfo(info: ServerProductInfo): Product {\n const period = PERIOD_MAP[info.billingPeriod ?? \"\"] ?? \"\";\n const priceStr = info.price != null ? `R$ ${info.price.toFixed(2).replace(\".\", \",\")}` : \"\";\n return {\n productId: info.storeProductId,\n title: info.name,\n description: \"\",\n price: priceStr,\n priceValue: info.price ?? 0,\n currency: \"BRL\",\n localizedPrice: priceStr,\n type: \"subscription\",\n subscriptionPeriod: period,\n freeTrialPeriod: info.trialDays ? `${info.trialDays} dias` : undefined,\n };\n}\n","import type { Product } from \"../types/purchase\";\n\nexport interface PreloadedCampaign {\n campaignId: string;\n variantKey: string;\n /** UUID de `paywall_variants` (sub-fase 2.14). Opcional pra retrocompat. */\n variantId?: string;\n paywall: {\n id: string;\n placement: string;\n config: Record<string, unknown>;\n primaryProductId?: string;\n secondaryProductId?: string;\n };\n products: Map<string, Product>;\n preloadedAt: number;\n}\n\nexport interface PreloadedWebView {\n placement: string;\n paywallId: string;\n craftData: string;\n products: Map<string, Product>;\n primaryProductId?: string;\n secondaryProductId?: string;\n loaded: boolean;\n campaignId?: string;\n variantKey?: string;\n /** UUID de `paywall_variants` (sub-fase 2.14). */\n variantId?: string;\n}\n\nconst CACHE_TTL_MS = 5 * 60 * 1000;\n\nexport function isCacheEntryValid(entry: PreloadedCampaign | undefined): boolean {\n return !!entry && Date.now() - entry.preloadedAt < CACHE_TTL_MS;\n}\n\nexport function getCacheEntry(\n cache: Map<string, PreloadedCampaign>,\n placement: string\n): PreloadedCampaign | null {\n const entry = cache.get(placement);\n if (!isCacheEntryValid(entry)) return null;\n return entry ?? null;\n}\n","import { useCallback, useState } from \"react\";\n\nimport { PaywalloClient } from \"../core/PaywalloClient\";\nimport { getIAPService } from \"../domains/iap\";\nimport type { Product } from \"../types/purchase\";\n\ninterface UseProductLoaderReturn {\n products: Map<string, Product>;\n isLoadingProducts: boolean;\n refreshProducts: (productIds: string[]) => Promise<void>;\n}\n\nexport function useProductLoader(): UseProductLoaderReturn {\n const [products, setProducts] = useState<Map<string, Product>>(new Map());\n const [isLoadingProducts, setIsLoadingProducts] = useState(false);\n\n const refreshProducts = useCallback(async (productIds: string[]): Promise<void> => {\n setIsLoadingProducts(true);\n try {\n const iapService = getIAPService();\n const loaded = await iapService.loadProducts(productIds);\n const map = new Map<string, Product>();\n for (const p of loaded) map.set(p.productId, p);\n setProducts(map);\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] refreshProducts failed\", err);\n } finally {\n setIsLoadingProducts(false);\n }\n }, []);\n\n return { products, isLoadingProducts, refreshProducts };\n}\n","import type React from \"react\";\nimport { useCallback } from \"react\";\n\nimport { PaywalloClient } from \"../core/PaywalloClient\";\nimport { getIAPService } from \"../domains/iap\";\nimport { usePaywallTracking } from \"../domains/paywall\";\nimport type { PaywallResult } from \"../types\";\n\nimport type { PreloadedWebView } from \"./useCampaignPreload\";\n\ninterface UsePurchaseOrchestratorReturn {\n handlePreloadedPurchase: (productId: string) => Promise<void>;\n handlePreloadedRestore: () => Promise<void>;\n}\n\nexport function usePurchaseOrchestrator(\n preloadedWebView: PreloadedWebView | null,\n resolvePreloadedPaywall: (result: PaywallResult) => void,\n clearPreloadedWebView: () => void,\n setShowingPreloadedWebView: React.Dispatch<React.SetStateAction<boolean>>,\n presentedAtRef: React.RefObject<number>,\n invalidateSubscriptionCache: () => void\n): UsePurchaseOrchestratorReturn {\n const { trackDismissed, trackProductSelected, trackPurchased } = usePaywallTracking();\n\n const handlePreloadedPurchase = useCallback(\n async (productId: string): Promise<void> => {\n try {\n if (preloadedWebView) {\n trackProductSelected({ placement: preloadedWebView.placement, paywallId: preloadedWebView.paywallId, productId, variantKey: preloadedWebView.variantKey, campaignId: preloadedWebView.campaignId });\n }\n\n const result = await getIAPService().purchase(productId, {\n paywallPlacement: preloadedWebView?.placement,\n variantKey: preloadedWebView?.variantKey,\n ...(preloadedWebView?.paywallId && { paywallId: preloadedWebView.paywallId }),\n ...(preloadedWebView?.variantId && { variantId: preloadedWebView.variantId }),\n });\n if (!result.success) {\n if (result.error) {\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n return;\n }\n\n if (preloadedWebView) {\n const duration_ms = Date.now() - presentedAtRef.current;\n await trackDismissed({ placement: preloadedWebView.placement, paywallId: preloadedWebView.paywallId, duration_ms, reason: \"purchased\", variantKey: preloadedWebView.variantKey, campaignId: preloadedWebView.campaignId });\n await trackPurchased({ placement: preloadedWebView.placement, paywallId: preloadedWebView.paywallId, productId, variantKey: preloadedWebView.variantKey, campaignId: preloadedWebView.campaignId });\n }\n\n invalidateSubscriptionCache();\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: true, cancelled: false, restored: false });\n } catch (error) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] preloaded purchase failed\", error);\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n },\n [preloadedWebView, resolvePreloadedPaywall, clearPreloadedWebView, setShowingPreloadedWebView, presentedAtRef, trackDismissed, trackProductSelected, trackPurchased, invalidateSubscriptionCache]\n );\n\n const handlePreloadedRestore = useCallback(async (): Promise<void> => {\n try {\n const transactions = await getIAPService().restore();\n if (transactions.length === 0) return;\n\n if (preloadedWebView) {\n const duration_ms = Date.now() - presentedAtRef.current;\n await trackDismissed({ placement: preloadedWebView.placement, paywallId: preloadedWebView.paywallId, duration_ms, reason: \"dismissed\", variantKey: preloadedWebView.variantKey, campaignId: preloadedWebView.campaignId });\n }\n\n invalidateSubscriptionCache();\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: true });\n } catch (error) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] preloaded restore failed\", error);\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n }, [preloadedWebView, resolvePreloadedPaywall, clearPreloadedWebView, setShowingPreloadedWebView, presentedAtRef, trackDismissed, invalidateSubscriptionCache]);\n\n return { handlePreloadedPurchase, handlePreloadedRestore };\n}\n","import { useCallback, useRef, useState } from \"react\";\n\nimport { PaywalloClient } from \"../core/PaywalloClient\";\nimport { subscriptionCache } from \"../domains/subscription/SubscriptionCache\";\nimport type { Subscription } from \"../types\";\n\nimport {\n CACHE_TTL_MS,\n CacheEntry,\n checkPersistedCache,\n checkStoreKitActive,\n isActiveCacheEntry,\n resolveOfflineFromCache,\n subscriptionInfoToSub,\n toDomainResponse,\n} from \"./subscriptionSyncHelpers\";\n\ninterface UseSubscriptionSyncReturn {\n subscription: Subscription | null;\n hasActiveSubscription: () => Promise<boolean>;\n getSubscription: () => Promise<Subscription | null>;\n invalidateCache: () => void;\n}\n\nexport function useSubscriptionSync(): UseSubscriptionSyncReturn {\n const [subscription, setSubscription] = useState<Subscription | null>(null);\n const cacheRef = useRef<CacheEntry | null>(null);\n\n const setCacheAndState = useCallback((sub: Subscription | null): void => {\n cacheRef.current = { data: sub, expiresAt: Date.now() + CACHE_TTL_MS };\n setSubscription(sub);\n }, []);\n\n const invalidateCache = useCallback((): void => {\n cacheRef.current = null;\n const distinctId = PaywalloClient.getDistinctId();\n if (distinctId) void subscriptionCache.invalidate(distinctId);\n }, []);\n\n const fetchAndCache = useCallback(async (): Promise<Subscription | null> => {\n const apiClient = PaywalloClient.getApiClient();\n const distinctId = PaywalloClient.getDistinctId();\n if (!apiClient || !distinctId) return null;\n\n const status = await apiClient.getSubscriptionStatus(distinctId);\n const sub = status.subscription\n ? { ...status.subscription, expiresAt: status.subscription.expiresAt ? new Date(status.subscription.expiresAt) : null }\n : null;\n\n setCacheAndState(sub);\n void subscriptionCache.set(distinctId, toDomainResponse(status));\n return sub;\n }, [setCacheAndState]);\n\n const hasActiveSubscription = useCallback(async (): Promise<boolean> => {\n const apiClient = PaywalloClient.getApiClient();\n const distinctId = PaywalloClient.getDistinctId();\n if (!apiClient || !distinctId) return false;\n\n const storeKitResult = await checkStoreKitActive(PaywalloClient.getConfig()?.debug);\n if (storeKitResult !== null) return storeKitResult;\n\n const cached = cacheRef.current;\n if (cached && cached.expiresAt > Date.now()) return isActiveCacheEntry(cached);\n\n const persistedResult = await checkPersistedCache(distinctId, (sub) => setCacheAndState(sub));\n if (persistedResult !== null) return persistedResult;\n\n try {\n const apiStatus = await apiClient.getSubscriptionStatus(distinctId);\n const sub = apiStatus.subscription ? { ...apiStatus.subscription, expiresAt: apiStatus.subscription.expiresAt ? new Date(apiStatus.subscription.expiresAt) : null } : null;\n setCacheAndState(sub);\n void subscriptionCache.set(distinctId, toDomainResponse(apiStatus));\n return apiStatus.hasActiveSubscription;\n } catch {\n return resolveOfflineFromCache(distinctId);\n }\n }, [setCacheAndState]);\n\n const getSubscription = useCallback(async (): Promise<Subscription | null> => {\n const apiClient = PaywalloClient.getApiClient();\n const distinctId = PaywalloClient.getDistinctId();\n if (!apiClient || !distinctId) return null;\n\n const cached = cacheRef.current;\n if (cached && cached.expiresAt > Date.now()) return cached.data;\n\n try {\n return await fetchAndCache();\n } catch {\n try {\n const persisted = await subscriptionCache.get(distinctId);\n if (!persisted?.data.subscription) return null;\n return subscriptionInfoToSub(persisted.data.subscription);\n } catch {\n return null;\n }\n }\n }, [fetchAndCache]);\n return { subscription, hasActiveSubscription, getSubscription, invalidateCache };\n}\n","import { subscriptionCache } from \"../domains/subscription/SubscriptionCache\";\nimport type {\n SubscriptionInfo,\n SubscriptionStatus as DomainSubscriptionStatus,\n SubscriptionStatusResponse as DomainStatusResponse,\n} from \"../domains/subscription/types\";\nimport type { Subscription, SubscriptionStatus, SubscriptionStatusResponse } from \"../types\";\n\nexport const CACHE_TTL_MS = 5 * 60 * 1000;\n\nexport interface CacheEntry {\n data: Subscription | null;\n expiresAt: number;\n}\n\nexport const ACTIVE_STATUSES = [\"active\", \"in_grace_period\"];\n\nexport const PUBLIC_TO_DOMAIN_STATUS: Record<string, DomainSubscriptionStatus> = {\n active: \"active\",\n expired: \"expired\",\n in_billing_retry: \"billing_retry\",\n in_grace_period: \"grace_period\",\n revoked: \"unknown\",\n cancelled: \"canceled\",\n};\n\nexport const DOMAIN_TO_PUBLIC_STATUS: Record<string, SubscriptionStatus> = {\n active: \"active\",\n expired: \"expired\",\n billing_retry: \"in_billing_retry\",\n grace_period: \"in_grace_period\",\n canceled: \"cancelled\",\n paused: \"expired\",\n unknown: \"expired\",\n};\n\nexport function toDomainSubscriptionInfo(sub: Subscription): SubscriptionInfo {\n return {\n id: \"\",\n productId: sub.productId,\n status: PUBLIC_TO_DOMAIN_STATUS[sub.status] ?? \"unknown\",\n expiresAt: sub.expiresAt ?? new Date(0),\n originalPurchaseDate: new Date(0),\n latestPurchaseDate: new Date(0),\n willRenew: sub.autoRenewEnabled,\n isTrial: false,\n isIntroductoryPeriod: false,\n platform: sub.platform,\n };\n}\n\nexport function toDomainResponse(status: SubscriptionStatusResponse): DomainStatusResponse {\n return {\n hasActiveSubscription: status.hasActiveSubscription,\n subscription: status.subscription ? toDomainSubscriptionInfo(status.subscription) : null,\n entitlements: status.entitlements ?? [],\n };\n}\n\nexport function isSubscriptionStillActive(\n sub: { status: string; expiresAt: Date | null } | null,\n): boolean {\n if (!sub) return false;\n if (!ACTIVE_STATUSES.includes(sub.status)) return false;\n if (sub.expiresAt && sub.expiresAt.getTime() !== 0 && sub.expiresAt < new Date()) return false;\n return true;\n}\n\nexport function subscriptionInfoToSub(s: SubscriptionInfo): Subscription {\n const status: SubscriptionStatus = DOMAIN_TO_PUBLIC_STATUS[s.status] ?? \"expired\";\n return {\n productId: s.productId,\n status,\n expiresAt: s.expiresAt ?? null,\n platform: s.platform,\n autoRenewEnabled: s.willRenew,\n inGracePeriod: status === \"in_grace_period\",\n };\n}\n\nexport async function resolveOfflineFromCache(distinctId: string): Promise<boolean> {\n try {\n const cached = await subscriptionCache.get(distinctId);\n if (!cached) return false;\n const sub = cached.data.subscription;\n return isSubscriptionStillActive(\n sub ? { status: sub.status, expiresAt: sub.expiresAt ?? null } : null,\n );\n } catch {\n return false;\n }\n}\n\nexport function isActiveCacheEntry(entry: CacheEntry): boolean {\n return isSubscriptionStillActive(entry.data);\n}\n\nexport async function checkStoreKitActive(debug: boolean | undefined): Promise<boolean | null> {\n try {\n const { nativeStoreKit } = await import(\"../domains/iap/NativeStoreKit\");\n if (!nativeStoreKit.isAvailable()) return null;\n const activeTransactions = await nativeStoreKit.getActiveTransactions();\n if (activeTransactions.length > 0) {\n if (debug) console.log(\"[Paywallo SUB] StoreKit: active entitlement found\", activeTransactions[0].productId);\n return true;\n }\n if (debug) console.log(\"[Paywallo SUB] StoreKit: no active entitlements → showing paywall\");\n return false;\n } catch (err) {\n if (debug) console.log(\"[Paywallo SUB] StoreKit check failed, falling through to server\", err);\n return null;\n }\n}\n\nexport async function checkPersistedCache(\n distinctId: string,\n onHit: (sub: ReturnType<typeof subscriptionInfoToSub>) => void,\n): Promise<boolean | null> {\n try {\n const persisted = await subscriptionCache.get(distinctId);\n if (!persisted || persisted.isStale) return null;\n const sub = persisted.data.subscription ? subscriptionInfoToSub(persisted.data.subscription) : null;\n if (isSubscriptionStillActive(sub)) {\n onHit(sub!);\n return true;\n }\n } catch {}\n return null;\n}\n","import type { Product } from \"../types/purchase\";\n\nimport type { VariableContext } from \"./variableResolver\";\n\nexport function getProductVariable(product: Product | undefined, property: string): string {\n if (!product) return \"\";\n\n switch (property) {\n case \"id\": return product.productId;\n case \"name\": return product.title;\n case \"price\": return product.localizedPrice;\n case \"pricePerMonth\": return product.pricePerMonth ?? product.localizedPrice;\n case \"pricePerWeek\": return product.pricePerWeek ?? \"\";\n case \"pricePerDay\": return product.pricePerDay ?? \"\";\n case \"period\": return product.subscriptionPeriod ?? \"\";\n case \"trialPeriod\": return product.freeTrialPeriod ?? \"\";\n case \"introPrice\": return product.introductoryPrice ?? \"\";\n case \"savings\": return product.savings ?? \"\";\n case \"savingsPercent\": return product.savingsPercent ?? \"\";\n case \"hasFreeTrial\": return product.freeTrialPeriod ? \"true\" : \"false\";\n case \"hasIntroOffer\": return product.introductoryPrice ? \"true\" : \"false\";\n case \"renewalPeriod\": return product.subscriptionPeriod ?? \"\";\n default: return \"\";\n }\n}\n\nexport function resolveProductsVariable(parts: string[], context: VariableContext): string | null {\n if (parts[0] !== \"products\") return null;\n\n if (parts[1] === \"selected\" && context.selectedProductId) {\n return getProductVariable(context.products.get(context.selectedProductId), parts[2]);\n }\n if (parts[1] === \"primary\" && context.primaryProductId) {\n return getProductVariable(context.products.get(context.primaryProductId), parts[2]);\n }\n if (parts[1] === \"secondary\" && context.secondaryProductId) {\n return getProductVariable(context.products.get(context.secondaryProductId), parts[2]);\n }\n if (parts[1] === \"hasIntroductoryOffer\") {\n return Array.from(context.products.values()).some((p) => p.introductoryPrice) ? \"true\" : \"false\";\n }\n\n return null;\n}\n\nexport function resolveLegacyVariable(variableName: string, context: VariableContext): string | null {\n if (variableName === \"device_name\") return context.deviceInfo?.name ?? \"\";\n if (variableName === \"product_price\" && context.selectedProductId) {\n return context.products.get(context.selectedProductId)?.localizedPrice ?? \"\";\n }\n if (variableName === \"trial_period\" && context.selectedProductId) {\n return context.products.get(context.selectedProductId)?.freeTrialPeriod ?? \"\";\n }\n return null;\n}\n","import type { Product } from \"../types/purchase\";\n\nimport { resolveLegacyVariable,resolveProductsVariable } from \"./productVariableResolver\";\n\nexport interface VariableContext {\n selectedProductId?: string;\n primaryProductId?: string;\n secondaryProductId?: string;\n products: Map<string, Product>;\n customVariables?: Record<string, string>;\n deviceInfo?: {\n name?: string;\n model?: string;\n os?: string;\n osVersion?: string;\n locale?: string;\n };\n userInfo?: {\n id?: string;\n name?: string;\n email?: string;\n };\n}\n\nfunction resolveVariable(variableName: string, context: VariableContext): string {\n const parts = variableName.split(\".\");\n\n if (parts[0] === \"device\" && context.deviceInfo) {\n switch (parts[1]) {\n case \"name\": return context.deviceInfo.name ?? \"\";\n case \"model\": return context.deviceInfo.model ?? \"\";\n case \"os\": return context.deviceInfo.os ?? \"\";\n case \"osVersion\": return context.deviceInfo.osVersion ?? \"\";\n case \"locale\": return context.deviceInfo.locale ?? \"\";\n default: return \"\";\n }\n }\n\n if (parts[0] === \"user\" && context.userInfo) {\n switch (parts[1]) {\n case \"id\": return context.userInfo.id ?? \"\";\n case \"name\": return context.userInfo.name ?? \"\";\n case \"email\": return context.userInfo.email ?? \"\";\n default: return \"\";\n }\n }\n\n if (parts[0] === \"products\") {\n return resolveProductsVariable(parts, context) ?? \"\";\n }\n\n return resolveLegacyVariable(variableName, context) ?? context.customVariables?.[variableName] ?? \"\";\n}\n\nexport function resolveText(text: string, context: VariableContext): string {\n const regex = /\\{\\{([^}]+)\\}\\}/g;\n return text.replace(regex, (_, variableName: string) => {\n return resolveVariable(variableName.trim(), context);\n });\n}\n\nexport function parseVariables(text: string): string[] {\n const regex = /\\{\\{([^}]+)\\}\\}/g;\n const variables: string[] = [];\n let match;\n while ((match = regex.exec(text)) !== null) {\n variables.push(match[1].trim());\n }\n return variables;\n}\n\nexport function hasVariables(text: string): boolean {\n return /\\{\\{[^}]+\\}\\}/.test(text);\n}\n"],"mappings":"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","names":["_debug","KEYCHAIN_KEY_PREFIX","_debug","isAvailable","import_react_native","import_react_native","idfv","import_react_native","generateUUID","import_react_native","import_react_native","import_react_native","generateUUID","import_react_native","import_react_native","import_react_native","secureStorage","getTimezone","detectPlatform","collectDeviceInfo","import_react_native","secureStorage","detectPlatform","getTimezone","secureStorage","mapPermissionStatus","AUTH_STATUS","import_react_native","raw","status","import_react","import_react_native","import_react","import_react_native","isAvailable","import_react_native","item","init_types","import_react_native","init_types","import_react_native","import_react_native","import_react","import_react","import_react_native","import_react","styles","import_react","import_react_native","import_jsx_runtime","import_react","import_react","DEFAULT_TTL","getVariant","evaluateFlags","getConditionalFlag","import_react_native","import_zod","import_react_native","init_types","init_types","import_react_native","getVariant","evaluateFlags","getConditionalFlag","isActive","mapProduct","import_react_native","DEFAULT_TTL","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_react_native","import_react","detectPlatform","getAppVersion","detectPlatform","import_react","import_react","import_react","import_react","CACHE_TTL_MS","nativeStoreKit","CACHE_TTL_MS","import_jsx_runtime","r","styles"]}
|