react-native-iap 15.4.0-rc.3 → 15.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (489) hide show
  1. package/README.md +23 -25
  2. package/android/src/main/java/com/margelo/nitro/iap/ConnectionLifecycleQueue.kt +113 -0
  3. package/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt +471 -255
  4. package/android/src/main/java/com/margelo/nitro/iap/ProductSerialization.kt +98 -0
  5. package/android/src/main/java/com/margelo/nitro/iap/RnIapLog.kt +23 -1
  6. package/ios/HybridRnIap.swift +230 -140
  7. package/ios/RnIapHelper.swift +180 -28
  8. package/ios/RnIapLog.swift +24 -1
  9. package/lib/module/hooks/useIAP.js +20 -4
  10. package/lib/module/hooks/useIAP.js.map +1 -1
  11. package/lib/module/index.js +151 -46
  12. package/lib/module/index.js.map +1 -1
  13. package/lib/module/index.kepler.js +3 -0
  14. package/lib/module/index.kepler.js.map +1 -1
  15. package/lib/module/types.js +77 -14
  16. package/lib/module/types.js.map +1 -1
  17. package/lib/module/utils/error.js +7 -3
  18. package/lib/module/utils/error.js.map +1 -1
  19. package/lib/module/utils/errorMapping.js +2 -0
  20. package/lib/module/utils/errorMapping.js.map +1 -1
  21. package/lib/module/utils/type-bridge.js +50 -22
  22. package/lib/module/utils/type-bridge.js.map +1 -1
  23. package/lib/module/vega-adapter.js +55 -8
  24. package/lib/module/vega-adapter.js.map +1 -1
  25. package/lib/typescript/src/hooks/useIAP.d.ts +28 -5
  26. package/lib/typescript/src/hooks/useIAP.d.ts.map +1 -1
  27. package/lib/typescript/src/index.d.ts +50 -10
  28. package/lib/typescript/src/index.d.ts.map +1 -1
  29. package/lib/typescript/src/index.kepler.d.ts +3 -0
  30. package/lib/typescript/src/index.kepler.d.ts.map +1 -1
  31. package/lib/typescript/src/specs/RnIap.nitro.d.ts +98 -26
  32. package/lib/typescript/src/specs/RnIap.nitro.d.ts.map +1 -1
  33. package/lib/typescript/src/types.d.ts +279 -59
  34. package/lib/typescript/src/types.d.ts.map +1 -1
  35. package/lib/typescript/src/utils/error.d.ts.map +1 -1
  36. package/lib/typescript/src/utils/errorMapping.d.ts +3 -1
  37. package/lib/typescript/src/utils/errorMapping.d.ts.map +1 -1
  38. package/lib/typescript/src/utils/type-bridge.d.ts.map +1 -1
  39. package/lib/typescript/src/vega-adapter.d.ts.map +1 -1
  40. package/nitro.json +8 -2
  41. package/nitrogen/generated/android/NitroIap+autolinking.cmake +4 -1
  42. package/nitrogen/generated/android/NitroIapOnLoad.cpp +2 -2
  43. package/nitrogen/generated/android/c++/JAdvancedCommerceInfoIOS.hpp +10 -10
  44. package/nitrogen/generated/android/c++/JAdvancedCommerceItemDetailsIOS.hpp +2 -2
  45. package/nitrogen/generated/android/c++/JAdvancedCommerceItemIOS.hpp +2 -2
  46. package/nitrogen/generated/android/c++/JAdvancedCommerceRefundIOS.hpp +2 -2
  47. package/nitrogen/generated/android/c++/JAlternativeBillingModeAndroid.hpp +2 -2
  48. package/nitrogen/generated/android/c++/JAndroidSubscriptionOfferInput.hpp +2 -2
  49. package/nitrogen/generated/android/c++/JBillingChoiceImageLayoutAndroid.hpp +61 -0
  50. package/nitrogen/generated/android/c++/JBillingChoiceScreenTypeAndroid.hpp +61 -0
  51. package/nitrogen/generated/android/c++/JBillingProgramAndroid.hpp +5 -2
  52. package/nitrogen/generated/android/c++/JDeveloperBillingLaunchModeAndroid.hpp +61 -0
  53. package/nitrogen/generated/android/c++/JDeveloperBillingOptionParamsAndroid.hpp +78 -0
  54. package/nitrogen/generated/android/c++/JDeveloperBillingTypeAndroid.hpp +61 -0
  55. package/nitrogen/generated/android/c++/JDeveloperProvidedBillingDetailsAndroid.hpp +47 -7
  56. package/nitrogen/generated/android/c++/JDeveloperProvidedBillingProductAndroid.hpp +72 -0
  57. package/nitrogen/generated/android/c++/JExternalLinkLaunchModeAndroid.hpp +2 -2
  58. package/nitrogen/generated/android/c++/JExternalLinkTypeAndroid.hpp +2 -2
  59. package/nitrogen/generated/android/c++/JExternalPurchaseCustomLinkNoticeResultIOS.hpp +2 -2
  60. package/nitrogen/generated/android/c++/JExternalPurchaseCustomLinkNoticeTypeIOS.hpp +2 -2
  61. package/nitrogen/generated/android/c++/JExternalPurchaseCustomLinkTokenResultIOS.hpp +2 -2
  62. package/nitrogen/generated/android/c++/JExternalPurchaseCustomLinkTokenTypeIOS.hpp +2 -2
  63. package/nitrogen/generated/android/c++/JExternalPurchaseLinkResultIOS.hpp +2 -2
  64. package/nitrogen/generated/android/c++/JExternalPurchaseNoticeAction.hpp +2 -2
  65. package/nitrogen/generated/android/c++/JExternalPurchaseNoticeResultIOS.hpp +2 -2
  66. package/nitrogen/generated/android/c++/JFunc_void_DeveloperProvidedBillingDetailsAndroid.hpp +12 -2
  67. package/nitrogen/generated/android/c++/JFunc_void_NitroProduct.hpp +2 -2
  68. package/nitrogen/generated/android/c++/JFunc_void_NitroPurchase.hpp +26 -2
  69. package/nitrogen/generated/android/c++/JFunc_void_NitroPurchaseResult.hpp +5 -2
  70. package/nitrogen/generated/android/c++/JFunc_void_UserChoiceBillingDetails.hpp +12 -2
  71. package/nitrogen/generated/android/c++/JHybridRnIapSpec.cpp +160 -48
  72. package/nitrogen/generated/android/c++/JHybridRnIapSpec.hpp +7 -4
  73. package/nitrogen/generated/android/c++/JIapPlatform.hpp +2 -2
  74. package/nitrogen/generated/android/c++/JIapStore.hpp +2 -2
  75. package/nitrogen/generated/android/c++/JIapkitPurchaseState.hpp +2 -2
  76. package/nitrogen/generated/android/c++/JInAppMessageCategoryAndroid.hpp +58 -0
  77. package/nitrogen/generated/android/c++/JInAppMessageResponseCodeAndroid.hpp +58 -0
  78. package/nitrogen/generated/android/c++/JInitConnectionConfig.hpp +9 -3
  79. package/nitrogen/generated/android/c++/JNitroActiveSubscription.hpp +7 -2
  80. package/nitrogen/generated/android/c++/JNitroAvailablePurchasesAndroidOptions.hpp +2 -2
  81. package/nitrogen/generated/android/c++/JNitroAvailablePurchasesAndroidType.hpp +2 -2
  82. package/nitrogen/generated/android/c++/JNitroAvailablePurchasesIosOptions.hpp +2 -2
  83. package/nitrogen/generated/android/c++/JNitroAvailablePurchasesOptions.hpp +2 -2
  84. package/nitrogen/generated/android/c++/JNitroBillingChoiceInfoAndroid.hpp +66 -0
  85. package/nitrogen/generated/android/c++/JNitroBillingProgramAvailabilityResultAndroid.hpp +20 -5
  86. package/nitrogen/generated/android/c++/JNitroBillingProgramInformationDialogParamsAndroid.hpp +63 -0
  87. package/nitrogen/generated/android/c++/JNitroBillingProgramReportingDetailsAndroid.hpp +2 -2
  88. package/nitrogen/generated/android/c++/JNitroBillingResultAndroid.hpp +72 -0
  89. package/nitrogen/generated/android/c++/JNitroDeepLinkOptionsAndroid.hpp +2 -2
  90. package/nitrogen/generated/android/c++/JNitroDiscountAmountAndroid.hpp +2 -2
  91. package/nitrogen/generated/android/c++/JNitroDiscountDisplayInfoAndroid.hpp +2 -2
  92. package/nitrogen/generated/android/c++/JNitroFinishTransactionAndroidParams.hpp +2 -2
  93. package/nitrogen/generated/android/c++/JNitroFinishTransactionIosParams.hpp +2 -2
  94. package/nitrogen/generated/android/c++/JNitroFinishTransactionParams.hpp +2 -2
  95. package/nitrogen/generated/android/c++/JNitroGetBillingChoiceInfoParamsAndroid.hpp +74 -0
  96. package/nitrogen/generated/android/c++/JNitroInAppMessageParamsAndroid.hpp +64 -0
  97. package/nitrogen/generated/android/c++/JNitroInAppMessageResultAndroid.hpp +68 -0
  98. package/nitrogen/generated/android/c++/JNitroLaunchExternalLinkParamsAndroid.hpp +12 -3
  99. package/nitrogen/generated/android/c++/JNitroLimitedQuantityInfoAndroid.hpp +2 -2
  100. package/nitrogen/generated/android/c++/JNitroOneTimePurchaseOfferDetail.hpp +15 -11
  101. package/nitrogen/generated/android/c++/JNitroPreorderDetailsAndroid.hpp +2 -2
  102. package/nitrogen/generated/android/c++/JNitroProduct.hpp +15 -3
  103. package/nitrogen/generated/android/c++/JNitroPurchase.hpp +53 -5
  104. package/nitrogen/generated/android/c++/JNitroPurchaseRequest.hpp +9 -2
  105. package/nitrogen/generated/android/c++/JNitroPurchaseResult.hpp +46 -5
  106. package/nitrogen/generated/android/c++/JNitroReceiptValidationAppleOptions.hpp +2 -2
  107. package/nitrogen/generated/android/c++/JNitroReceiptValidationGoogleOptions.hpp +2 -2
  108. package/nitrogen/generated/android/c++/JNitroReceiptValidationHorizonOptions.hpp +2 -2
  109. package/nitrogen/generated/android/c++/JNitroReceiptValidationParams.hpp +2 -2
  110. package/nitrogen/generated/android/c++/JNitroReceiptValidationResultAndroid.hpp +2 -2
  111. package/nitrogen/generated/android/c++/JNitroReceiptValidationResultIOS.hpp +26 -2
  112. package/nitrogen/generated/android/c++/JNitroRenewalInfoIOS.hpp +16 -3
  113. package/nitrogen/generated/android/c++/JNitroRentalDetailsAndroid.hpp +2 -2
  114. package/nitrogen/generated/android/c++/JNitroRequestPurchaseAndroid.hpp +26 -11
  115. package/nitrogen/generated/android/c++/JNitroRequestPurchaseIos.hpp +2 -2
  116. package/nitrogen/generated/android/c++/JNitroSubscriptionStatus.hpp +15 -9
  117. package/nitrogen/generated/android/c++/JNitroValidTimeWindowAndroid.hpp +2 -2
  118. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitAmazonProps.hpp +2 -2
  119. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitAppleProps.hpp +2 -2
  120. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitGoogleProps.hpp +2 -2
  121. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitProps.hpp +2 -2
  122. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitResult.hpp +2 -2
  123. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithProviderError.hpp +2 -2
  124. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithProviderProps.hpp +2 -2
  125. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithProviderResult.hpp +2 -2
  126. package/nitrogen/generated/android/c++/JPaymentModeIOS.hpp +2 -2
  127. package/nitrogen/generated/android/c++/JPendingPurchaseUpdateAndroid.hpp +10 -10
  128. package/nitrogen/generated/android/c++/JProductType.hpp +58 -0
  129. package/nitrogen/generated/android/c++/JPromotionalOfferJwsInputIOS.hpp +2 -2
  130. package/nitrogen/generated/android/c++/JPurchase.hpp +3 -3
  131. package/nitrogen/generated/android/c++/JPurchaseAndroid.hpp +2 -2
  132. package/nitrogen/generated/android/c++/JPurchaseIOS.hpp +2 -2
  133. package/nitrogen/generated/android/c++/JPurchaseOfferIOS.hpp +2 -2
  134. package/nitrogen/generated/android/c++/JPurchaseState.hpp +2 -2
  135. package/nitrogen/generated/android/c++/JPurchaseUpdatedListenerOptions.hpp +2 -2
  136. package/nitrogen/generated/android/c++/JPurchaseVerificationProvider.hpp +2 -2
  137. package/nitrogen/generated/android/c++/JRenewalCommitmentInfoIOS.hpp +2 -2
  138. package/nitrogen/generated/android/c++/JRenewalInfoIOS.hpp +2 -2
  139. package/nitrogen/generated/android/c++/JRequestPurchaseResult.cpp +4 -4
  140. package/nitrogen/generated/android/c++/JRequestPurchaseResult.hpp +9 -9
  141. package/nitrogen/generated/android/c++/JSubResponseCodeAndroid.hpp +61 -0
  142. package/nitrogen/generated/android/c++/JSubscriptionBillingPlanTypeIOS.hpp +2 -2
  143. package/nitrogen/generated/android/c++/JSubscriptionProductReplacementParamsAndroid.hpp +2 -2
  144. package/nitrogen/generated/android/c++/JSubscriptionReplacementModeAndroid.hpp +2 -2
  145. package/nitrogen/generated/android/c++/JTransactionCommitmentInfoIOS.hpp +2 -2
  146. package/nitrogen/generated/android/c++/JUserChoiceBillingDetails.hpp +29 -11
  147. package/nitrogen/generated/android/c++/JVariant_Boolean_NitroPurchaseResult.hpp +6 -3
  148. package/nitrogen/generated/android/c++/JVariant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid.hpp +27 -3
  149. package/nitrogen/generated/android/c++/JVariant_NullType_AdvancedCommerceInfoIOS.hpp +3 -3
  150. package/nitrogen/generated/android/c++/JVariant_NullType_AdvancedCommerceItemDetailsIOS.hpp +3 -3
  151. package/nitrogen/generated/android/c++/JVariant_NullType_Array_AdvancedCommerceRefundIOS_.cpp +4 -4
  152. package/nitrogen/generated/android/c++/JVariant_NullType_Array_AdvancedCommerceRefundIOS_.hpp +7 -7
  153. package/nitrogen/generated/android/c++/JVariant_NullType_Array_AndroidSubscriptionOfferInput_.cpp +4 -4
  154. package/nitrogen/generated/android/c++/JVariant_NullType_Array_AndroidSubscriptionOfferInput_.hpp +7 -7
  155. package/nitrogen/generated/android/c++/JVariant_NullType_Array_DeveloperProvidedBillingProductAndroid_.cpp +35 -0
  156. package/nitrogen/generated/android/c++/JVariant_NullType_Array_DeveloperProvidedBillingProductAndroid_.hpp +86 -0
  157. package/nitrogen/generated/android/c++/JVariant_NullType_Array_InAppMessageCategoryAndroid_.cpp +35 -0
  158. package/nitrogen/generated/android/c++/JVariant_NullType_Array_InAppMessageCategoryAndroid_.hpp +81 -0
  159. package/nitrogen/generated/android/c++/JVariant_NullType_Array_NitroOneTimePurchaseOfferDetail_.cpp +4 -4
  160. package/nitrogen/generated/android/c++/JVariant_NullType_Array_NitroOneTimePurchaseOfferDetail_.hpp +7 -7
  161. package/nitrogen/generated/android/c++/JVariant_NullType_Array_NitroSubscriptionStatus_.cpp +4 -4
  162. package/nitrogen/generated/android/c++/JVariant_NullType_Array_NitroSubscriptionStatus_.hpp +16 -10
  163. package/nitrogen/generated/android/c++/JVariant_NullType_Array_NitroVerifyPurchaseWithProviderError_.cpp +4 -4
  164. package/nitrogen/generated/android/c++/JVariant_NullType_Array_NitroVerifyPurchaseWithProviderError_.hpp +7 -7
  165. package/nitrogen/generated/android/c++/JVariant_NullType_Array_String_.cpp +4 -4
  166. package/nitrogen/generated/android/c++/JVariant_NullType_Array_String_.hpp +7 -7
  167. package/nitrogen/generated/android/c++/JVariant_NullType_Boolean.hpp +3 -3
  168. package/nitrogen/generated/android/c++/JVariant_NullType_DeveloperBillingOptionParamsAndroid.cpp +26 -0
  169. package/nitrogen/generated/android/c++/JVariant_NullType_DeveloperBillingOptionParamsAndroid.hpp +78 -0
  170. package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +3 -3
  171. package/nitrogen/generated/android/c++/JVariant_NullType_InitConnectionConfig.hpp +5 -3
  172. package/nitrogen/generated/android/c++/JVariant_NullType_Map_String__String_.hpp +3 -3
  173. package/nitrogen/generated/android/c++/JVariant_NullType_NitroAvailablePurchasesAndroidOptions.hpp +3 -3
  174. package/nitrogen/generated/android/c++/JVariant_NullType_NitroAvailablePurchasesIosOptions.hpp +3 -3
  175. package/nitrogen/generated/android/c++/JVariant_NullType_NitroDiscountAmountAndroid.hpp +3 -3
  176. package/nitrogen/generated/android/c++/JVariant_NullType_NitroDiscountDisplayInfoAndroid.hpp +3 -3
  177. package/nitrogen/generated/android/c++/JVariant_NullType_NitroFinishTransactionAndroidParams.hpp +3 -3
  178. package/nitrogen/generated/android/c++/JVariant_NullType_NitroFinishTransactionIosParams.hpp +3 -3
  179. package/nitrogen/generated/android/c++/JVariant_NullType_NitroInAppMessageParamsAndroid.cpp +26 -0
  180. package/nitrogen/generated/android/c++/JVariant_NullType_NitroInAppMessageParamsAndroid.hpp +76 -0
  181. package/nitrogen/generated/android/c++/JVariant_NullType_NitroLimitedQuantityInfoAndroid.hpp +3 -3
  182. package/nitrogen/generated/android/c++/JVariant_NullType_NitroPreorderDetailsAndroid.hpp +3 -3
  183. package/nitrogen/generated/android/c++/JVariant_NullType_NitroProduct.hpp +3 -3
  184. package/nitrogen/generated/android/c++/JVariant_NullType_NitroPurchase.hpp +27 -3
  185. package/nitrogen/generated/android/c++/JVariant_NullType_NitroReceiptValidationAppleOptions.hpp +3 -3
  186. package/nitrogen/generated/android/c++/JVariant_NullType_NitroReceiptValidationGoogleOptions.hpp +3 -3
  187. package/nitrogen/generated/android/c++/JVariant_NullType_NitroReceiptValidationHorizonOptions.hpp +3 -3
  188. package/nitrogen/generated/android/c++/JVariant_NullType_NitroRenewalInfoIOS.hpp +8 -3
  189. package/nitrogen/generated/android/c++/JVariant_NullType_NitroRentalDetailsAndroid.hpp +3 -3
  190. package/nitrogen/generated/android/c++/JVariant_NullType_NitroRequestPurchaseAndroid.hpp +10 -3
  191. package/nitrogen/generated/android/c++/JVariant_NullType_NitroRequestPurchaseIos.hpp +3 -3
  192. package/nitrogen/generated/android/c++/JVariant_NullType_NitroValidTimeWindowAndroid.hpp +3 -3
  193. package/nitrogen/generated/android/c++/JVariant_NullType_NitroVerifyPurchaseWithIapkitAmazonProps.hpp +3 -3
  194. package/nitrogen/generated/android/c++/JVariant_NullType_NitroVerifyPurchaseWithIapkitAppleProps.hpp +3 -3
  195. package/nitrogen/generated/android/c++/JVariant_NullType_NitroVerifyPurchaseWithIapkitGoogleProps.hpp +3 -3
  196. package/nitrogen/generated/android/c++/JVariant_NullType_NitroVerifyPurchaseWithIapkitProps.hpp +3 -3
  197. package/nitrogen/generated/android/c++/JVariant_NullType_NitroVerifyPurchaseWithIapkitResult.hpp +3 -3
  198. package/nitrogen/generated/android/c++/JVariant_NullType_PendingPurchaseUpdateAndroid.hpp +3 -3
  199. package/nitrogen/generated/android/c++/JVariant_NullType_PromotionalOfferJwsInputIOS.hpp +3 -3
  200. package/nitrogen/generated/android/c++/JVariant_NullType_PurchaseOfferIOS.hpp +3 -3
  201. package/nitrogen/generated/android/c++/JVariant_NullType_RenewalCommitmentInfoIOS.hpp +3 -3
  202. package/nitrogen/generated/android/c++/JVariant_NullType_RenewalInfoIOS.hpp +3 -3
  203. package/nitrogen/generated/android/c++/JVariant_NullType_String.hpp +3 -3
  204. package/nitrogen/generated/android/c++/JVariant_NullType_SubscriptionProductReplacementParamsAndroid.hpp +3 -3
  205. package/nitrogen/generated/android/c++/JVariant_NullType_TransactionCommitmentInfoIOS.hpp +3 -3
  206. package/nitrogen/generated/android/c++/JVariant_NullType_WinBackOfferInputIOS.hpp +3 -3
  207. package/nitrogen/generated/android/c++/JWinBackOfferInputIOS.hpp +2 -2
  208. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AdvancedCommerceInfoIOS.kt +27 -0
  209. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AdvancedCommerceItemDetailsIOS.kt +13 -0
  210. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AdvancedCommerceItemIOS.kt +17 -0
  211. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AdvancedCommerceRefundIOS.kt +13 -0
  212. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AndroidSubscriptionOfferInput.kt +15 -0
  213. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/BillingChoiceImageLayoutAndroid.kt +24 -0
  214. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/BillingChoiceScreenTypeAndroid.kt +24 -0
  215. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/BillingProgramAndroid.kt +2 -1
  216. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperBillingLaunchModeAndroid.kt +24 -0
  217. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperBillingOptionParamsAndroid.kt +66 -0
  218. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperBillingTypeAndroid.kt +24 -0
  219. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperProvidedBillingDetailsAndroid.kt +32 -4
  220. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperProvidedBillingProductAndroid.kt +61 -0
  221. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/ExternalPurchaseCustomLinkNoticeResultIOS.kt +15 -0
  222. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/ExternalPurchaseCustomLinkTokenResultIOS.kt +15 -0
  223. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/ExternalPurchaseLinkResultIOS.kt +15 -0
  224. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/ExternalPurchaseNoticeResultIOS.kt +17 -0
  225. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/HybridRnIapSpec.kt +14 -2
  226. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/InAppMessageCategoryAndroid.kt +23 -0
  227. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/InAppMessageResponseCodeAndroid.kt +23 -0
  228. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/InitConnectionConfig.kt +22 -2
  229. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroActiveSubscription.kt +39 -0
  230. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroAvailablePurchasesAndroidOptions.kt +15 -0
  231. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroAvailablePurchasesIosOptions.kt +21 -0
  232. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroAvailablePurchasesOptions.kt +15 -0
  233. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingChoiceInfoAndroid.kt +56 -0
  234. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingProgramAvailabilityResultAndroid.kt +29 -4
  235. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingProgramInformationDialogParamsAndroid.kt +56 -0
  236. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingProgramReportingDetailsAndroid.kt +15 -0
  237. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingResultAndroid.kt +61 -0
  238. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroDeepLinkOptionsAndroid.kt +15 -0
  239. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroDiscountAmountAndroid.kt +15 -0
  240. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroDiscountDisplayInfoAndroid.kt +15 -0
  241. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroFinishTransactionAndroidParams.kt +15 -0
  242. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroFinishTransactionIosParams.kt +13 -0
  243. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroFinishTransactionParams.kt +15 -0
  244. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroGetBillingChoiceInfoParamsAndroid.kt +61 -0
  245. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroInAppMessageParamsAndroid.kt +51 -0
  246. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroInAppMessageResultAndroid.kt +56 -0
  247. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroLaunchExternalLinkParamsAndroid.kt +27 -3
  248. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroLimitedQuantityInfoAndroid.kt +15 -0
  249. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroOneTimePurchaseOfferDetail.kt +42 -2
  250. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroPreorderDetailsAndroid.kt +15 -0
  251. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroProduct.kt +96 -2
  252. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroPurchase.kt +128 -3
  253. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroPurchaseRequest.kt +19 -0
  254. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroPurchaseResult.kt +49 -3
  255. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroReceiptValidationAppleOptions.kt +13 -0
  256. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroReceiptValidationGoogleOptions.kt +21 -0
  257. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroReceiptValidationHorizonOptions.kt +17 -0
  258. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroReceiptValidationParams.kt +17 -0
  259. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroReceiptValidationResultAndroid.kt +47 -0
  260. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroReceiptValidationResultIOS.kt +19 -0
  261. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroRenewalInfoIOS.kt +45 -2
  262. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroRentalDetailsAndroid.kt +15 -0
  263. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroRequestPurchaseAndroid.kt +41 -2
  264. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroRequestPurchaseIos.kt +31 -0
  265. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroSubscriptionStatus.kt +19 -2
  266. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroValidTimeWindowAndroid.kt +15 -0
  267. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitAmazonProps.kt +17 -0
  268. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitAppleProps.kt +13 -0
  269. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitGoogleProps.kt +13 -0
  270. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitProps.kt +19 -0
  271. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitResult.kt +17 -0
  272. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithProviderError.kt +15 -0
  273. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithProviderProps.kt +15 -0
  274. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithProviderResult.kt +17 -0
  275. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PendingPurchaseUpdateAndroid.kt +15 -0
  276. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/ProductType.kt +23 -0
  277. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PromotionalOfferJwsInputIOS.kt +15 -0
  278. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Purchase.kt +16 -7
  279. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseAndroid.kt +55 -0
  280. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseIOS.kt +85 -0
  281. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseOfferIOS.kt +17 -0
  282. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseUpdatedListenerOptions.kt +13 -0
  283. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/RenewalCommitmentInfoIOS.kt +21 -0
  284. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/RenewalInfoIOS.kt +37 -0
  285. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/RequestPurchaseResult.kt +20 -9
  286. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/SubResponseCodeAndroid.kt +24 -0
  287. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/SubscriptionProductReplacementParamsAndroid.kt +15 -0
  288. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/TransactionCommitmentInfoIOS.kt +19 -0
  289. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/UserChoiceBillingDetails.kt +28 -3
  290. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_Boolean_NitroPurchaseResult.kt +16 -7
  291. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid.kt +16 -7
  292. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_AdvancedCommerceInfoIOS.kt +16 -7
  293. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_AdvancedCommerceItemDetailsIOS.kt +16 -7
  294. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_AdvancedCommerceRefundIOS_.kt +16 -7
  295. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_AndroidSubscriptionOfferInput_.kt +16 -7
  296. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_DeveloperProvidedBillingProductAndroid_.kt +62 -0
  297. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_InAppMessageCategoryAndroid_.kt +62 -0
  298. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_NitroOneTimePurchaseOfferDetail_.kt +16 -7
  299. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_NitroSubscriptionStatus_.kt +16 -7
  300. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_NitroVerifyPurchaseWithProviderError_.kt +16 -7
  301. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_String_.kt +16 -7
  302. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Boolean.kt +16 -7
  303. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_DeveloperBillingOptionParamsAndroid.kt +62 -0
  304. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Double.kt +16 -7
  305. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_InitConnectionConfig.kt +16 -7
  306. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Map_String__String_.kt +16 -7
  307. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroAvailablePurchasesAndroidOptions.kt +16 -7
  308. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroAvailablePurchasesIosOptions.kt +16 -7
  309. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroDiscountAmountAndroid.kt +16 -7
  310. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroDiscountDisplayInfoAndroid.kt +16 -7
  311. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroFinishTransactionAndroidParams.kt +16 -7
  312. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroFinishTransactionIosParams.kt +16 -7
  313. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroInAppMessageParamsAndroid.kt +62 -0
  314. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroLimitedQuantityInfoAndroid.kt +16 -7
  315. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroPreorderDetailsAndroid.kt +16 -7
  316. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroProduct.kt +16 -7
  317. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroPurchase.kt +16 -7
  318. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroReceiptValidationAppleOptions.kt +16 -7
  319. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroReceiptValidationGoogleOptions.kt +16 -7
  320. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroReceiptValidationHorizonOptions.kt +16 -7
  321. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroRenewalInfoIOS.kt +16 -7
  322. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroRentalDetailsAndroid.kt +16 -7
  323. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroRequestPurchaseAndroid.kt +16 -7
  324. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroRequestPurchaseIos.kt +16 -7
  325. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroValidTimeWindowAndroid.kt +16 -7
  326. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroVerifyPurchaseWithIapkitAmazonProps.kt +16 -7
  327. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroVerifyPurchaseWithIapkitAppleProps.kt +16 -7
  328. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroVerifyPurchaseWithIapkitGoogleProps.kt +16 -7
  329. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroVerifyPurchaseWithIapkitProps.kt +16 -7
  330. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroVerifyPurchaseWithIapkitResult.kt +16 -7
  331. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_PendingPurchaseUpdateAndroid.kt +16 -7
  332. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_PromotionalOfferJwsInputIOS.kt +16 -7
  333. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_PurchaseOfferIOS.kt +16 -7
  334. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_RenewalCommitmentInfoIOS.kt +16 -7
  335. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_RenewalInfoIOS.kt +16 -7
  336. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_String.kt +16 -7
  337. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_SubscriptionProductReplacementParamsAndroid.kt +16 -7
  338. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_TransactionCommitmentInfoIOS.kt +16 -7
  339. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_WinBackOfferInputIOS.kt +16 -7
  340. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/WinBackOfferInputIOS.kt +13 -0
  341. package/nitrogen/generated/ios/NitroIap+autolinking.rb +2 -0
  342. package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Bridge.cpp +24 -0
  343. package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Bridge.hpp +441 -47
  344. package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Umbrella.hpp +48 -3
  345. package/nitrogen/generated/ios/c++/HybridRnIapSpecSwift.hpp +75 -6
  346. package/nitrogen/generated/ios/swift/BillingChoiceImageLayoutAndroid.swift +44 -0
  347. package/nitrogen/generated/ios/swift/BillingChoiceScreenTypeAndroid.swift +44 -0
  348. package/nitrogen/generated/ios/swift/BillingProgramAndroid.swift +4 -0
  349. package/nitrogen/generated/ios/swift/DeveloperBillingLaunchModeAndroid.swift +44 -0
  350. package/nitrogen/generated/ios/swift/DeveloperBillingOptionParamsAndroid.swift +114 -0
  351. package/nitrogen/generated/ios/swift/DeveloperBillingTypeAndroid.swift +44 -0
  352. package/nitrogen/generated/ios/swift/DeveloperProvidedBillingDetailsAndroid.swift +121 -4
  353. package/nitrogen/generated/ios/swift/DeveloperProvidedBillingProductAndroid.swift +71 -0
  354. package/nitrogen/generated/ios/swift/Func_void_NitroBillingChoiceInfoAndroid.swift +46 -0
  355. package/nitrogen/generated/ios/swift/Func_void_NitroBillingResultAndroid.swift +46 -0
  356. package/nitrogen/generated/ios/swift/Func_void_NitroInAppMessageResultAndroid.swift +46 -0
  357. package/nitrogen/generated/ios/swift/HybridRnIapSpec.swift +5 -2
  358. package/nitrogen/generated/ios/swift/HybridRnIapSpec_cxx.swift +85 -9
  359. package/nitrogen/generated/ios/swift/InAppMessageCategoryAndroid.swift +40 -0
  360. package/nitrogen/generated/ios/swift/InAppMessageResponseCodeAndroid.swift +40 -0
  361. package/nitrogen/generated/ios/swift/InitConnectionConfig.swift +12 -1
  362. package/nitrogen/generated/ios/swift/NitroBillingChoiceInfoAndroid.swift +66 -0
  363. package/nitrogen/generated/ios/swift/NitroBillingProgramAvailabilityResultAndroid.swift +50 -2
  364. package/nitrogen/generated/ios/swift/NitroBillingProgramInformationDialogParamsAndroid.swift +34 -0
  365. package/nitrogen/generated/ios/swift/NitroBillingResultAndroid.swift +77 -0
  366. package/nitrogen/generated/ios/swift/NitroGetBillingChoiceInfoParamsAndroid.swift +71 -0
  367. package/nitrogen/generated/ios/swift/NitroInAppMessageParamsAndroid.swift +67 -0
  368. package/nitrogen/generated/ios/swift/NitroInAppMessageResultAndroid.swift +66 -0
  369. package/nitrogen/generated/ios/swift/NitroLaunchExternalLinkParamsAndroid.swift +39 -2
  370. package/nitrogen/generated/ios/swift/NitroOneTimePurchaseOfferDetail.swift +39 -2
  371. package/nitrogen/generated/ios/swift/NitroProduct.swift +113 -2
  372. package/nitrogen/generated/ios/swift/NitroPurchase.swift +204 -2
  373. package/nitrogen/generated/ios/swift/NitroPurchaseResult.swift +90 -1
  374. package/nitrogen/generated/ios/swift/NitroRenewalInfoIOS.swift +49 -1
  375. package/nitrogen/generated/ios/swift/NitroRequestPurchaseAndroid.swift +75 -1
  376. package/nitrogen/generated/ios/swift/NitroSubscriptionStatus.swift +11 -11
  377. package/nitrogen/generated/ios/swift/ProductType.swift +40 -0
  378. package/nitrogen/generated/ios/swift/Purchase.swift +12 -0
  379. package/nitrogen/generated/ios/swift/RequestPurchaseResult.swift +14 -0
  380. package/nitrogen/generated/ios/swift/SubResponseCodeAndroid.swift +44 -0
  381. package/nitrogen/generated/ios/swift/UserChoiceBillingDetails.swift +82 -2
  382. package/nitrogen/generated/ios/swift/Variant_Bool_NitroPurchaseResult.swift +12 -0
  383. package/nitrogen/generated/ios/swift/Variant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid.swift +12 -0
  384. package/nitrogen/generated/ios/swift/Variant_NullType_AdvancedCommerceInfoIOS.swift +12 -0
  385. package/nitrogen/generated/ios/swift/Variant_NullType_AdvancedCommerceItemDetailsIOS.swift +12 -0
  386. package/nitrogen/generated/ios/swift/Variant_NullType_Bool.swift +12 -0
  387. package/nitrogen/generated/ios/swift/Variant_NullType_DeveloperBillingOptionParamsAndroid.swift +30 -0
  388. package/nitrogen/generated/ios/swift/Variant_NullType_Dictionary_String__String_.swift +12 -0
  389. package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +12 -0
  390. package/nitrogen/generated/ios/swift/Variant_NullType_InitConnectionConfig.swift +12 -0
  391. package/nitrogen/generated/ios/swift/Variant_NullType_NitroAvailablePurchasesAndroidOptions.swift +12 -0
  392. package/nitrogen/generated/ios/swift/Variant_NullType_NitroAvailablePurchasesIosOptions.swift +12 -0
  393. package/nitrogen/generated/ios/swift/Variant_NullType_NitroDiscountAmountAndroid.swift +12 -0
  394. package/nitrogen/generated/ios/swift/Variant_NullType_NitroDiscountDisplayInfoAndroid.swift +12 -0
  395. package/nitrogen/generated/ios/swift/Variant_NullType_NitroFinishTransactionAndroidParams.swift +12 -0
  396. package/nitrogen/generated/ios/swift/Variant_NullType_NitroFinishTransactionIosParams.swift +12 -0
  397. package/nitrogen/generated/ios/swift/Variant_NullType_NitroInAppMessageParamsAndroid.swift +30 -0
  398. package/nitrogen/generated/ios/swift/Variant_NullType_NitroLimitedQuantityInfoAndroid.swift +12 -0
  399. package/nitrogen/generated/ios/swift/Variant_NullType_NitroPreorderDetailsAndroid.swift +12 -0
  400. package/nitrogen/generated/ios/swift/Variant_NullType_NitroProduct.swift +12 -0
  401. package/nitrogen/generated/ios/swift/Variant_NullType_NitroPurchase.swift +12 -0
  402. package/nitrogen/generated/ios/swift/Variant_NullType_NitroReceiptValidationAppleOptions.swift +12 -0
  403. package/nitrogen/generated/ios/swift/Variant_NullType_NitroReceiptValidationGoogleOptions.swift +12 -0
  404. package/nitrogen/generated/ios/swift/Variant_NullType_NitroReceiptValidationHorizonOptions.swift +12 -0
  405. package/nitrogen/generated/ios/swift/Variant_NullType_NitroRenewalInfoIOS.swift +12 -0
  406. package/nitrogen/generated/ios/swift/Variant_NullType_NitroRentalDetailsAndroid.swift +12 -0
  407. package/nitrogen/generated/ios/swift/Variant_NullType_NitroRequestPurchaseAndroid.swift +12 -0
  408. package/nitrogen/generated/ios/swift/Variant_NullType_NitroRequestPurchaseIos.swift +12 -0
  409. package/nitrogen/generated/ios/swift/Variant_NullType_NitroValidTimeWindowAndroid.swift +12 -0
  410. package/nitrogen/generated/ios/swift/Variant_NullType_NitroVerifyPurchaseWithIapkitAmazonProps.swift +12 -0
  411. package/nitrogen/generated/ios/swift/Variant_NullType_NitroVerifyPurchaseWithIapkitAppleProps.swift +12 -0
  412. package/nitrogen/generated/ios/swift/Variant_NullType_NitroVerifyPurchaseWithIapkitGoogleProps.swift +12 -0
  413. package/nitrogen/generated/ios/swift/Variant_NullType_NitroVerifyPurchaseWithIapkitProps.swift +12 -0
  414. package/nitrogen/generated/ios/swift/Variant_NullType_NitroVerifyPurchaseWithIapkitResult.swift +12 -0
  415. package/nitrogen/generated/ios/swift/Variant_NullType_PendingPurchaseUpdateAndroid.swift +12 -0
  416. package/nitrogen/generated/ios/swift/Variant_NullType_PromotionalOfferJwsInputIOS.swift +12 -0
  417. package/nitrogen/generated/ios/swift/Variant_NullType_PurchaseOfferIOS.swift +12 -0
  418. package/nitrogen/generated/ios/swift/Variant_NullType_RenewalCommitmentInfoIOS.swift +12 -0
  419. package/nitrogen/generated/ios/swift/Variant_NullType_RenewalInfoIOS.swift +12 -0
  420. package/nitrogen/generated/ios/swift/Variant_NullType_String.swift +12 -0
  421. package/nitrogen/generated/ios/swift/Variant_NullType_SubscriptionProductReplacementParamsAndroid.swift +12 -0
  422. package/nitrogen/generated/ios/swift/Variant_NullType_TransactionCommitmentInfoIOS.swift +12 -0
  423. package/nitrogen/generated/ios/swift/Variant_NullType_WinBackOfferInputIOS.swift +12 -0
  424. package/nitrogen/generated/ios/swift/Variant_NullType__AdvancedCommerceRefundIOS_.swift +12 -0
  425. package/nitrogen/generated/ios/swift/Variant_NullType__AndroidSubscriptionOfferInput_.swift +12 -0
  426. package/nitrogen/generated/ios/swift/Variant_NullType__DeveloperProvidedBillingProductAndroid_.swift +30 -0
  427. package/nitrogen/generated/ios/swift/Variant_NullType__InAppMessageCategoryAndroid_.swift +30 -0
  428. package/nitrogen/generated/ios/swift/Variant_NullType__NitroOneTimePurchaseOfferDetail_.swift +12 -0
  429. package/nitrogen/generated/ios/swift/Variant_NullType__NitroSubscriptionStatus_.swift +12 -0
  430. package/nitrogen/generated/ios/swift/Variant_NullType__NitroVerifyPurchaseWithProviderError_.swift +12 -0
  431. package/nitrogen/generated/ios/swift/Variant_NullType__String_.swift +12 -0
  432. package/nitrogen/generated/shared/c++/AdvancedCommerceInfoIOS.hpp +1 -1
  433. package/nitrogen/generated/shared/c++/AdvancedCommerceItemIOS.hpp +1 -1
  434. package/nitrogen/generated/shared/c++/BillingChoiceImageLayoutAndroid.hpp +80 -0
  435. package/nitrogen/generated/shared/c++/BillingChoiceScreenTypeAndroid.hpp +80 -0
  436. package/nitrogen/generated/shared/c++/BillingProgramAndroid.hpp +4 -0
  437. package/nitrogen/generated/shared/c++/DeveloperBillingLaunchModeAndroid.hpp +80 -0
  438. package/nitrogen/generated/shared/c++/DeveloperBillingOptionParamsAndroid.hpp +103 -0
  439. package/nitrogen/generated/shared/c++/DeveloperBillingTypeAndroid.hpp +80 -0
  440. package/nitrogen/generated/shared/c++/DeveloperProvidedBillingDetailsAndroid.hpp +25 -7
  441. package/nitrogen/generated/shared/c++/DeveloperProvidedBillingProductAndroid.hpp +96 -0
  442. package/nitrogen/generated/shared/c++/HybridRnIapSpec.cpp +3 -0
  443. package/nitrogen/generated/shared/c++/HybridRnIapSpec.hpp +26 -2
  444. package/nitrogen/generated/shared/c++/InAppMessageCategoryAndroid.hpp +76 -0
  445. package/nitrogen/generated/shared/c++/InAppMessageResponseCodeAndroid.hpp +76 -0
  446. package/nitrogen/generated/shared/c++/InitConnectionConfig.hpp +8 -1
  447. package/nitrogen/generated/shared/c++/NitroBillingChoiceInfoAndroid.hpp +90 -0
  448. package/nitrogen/generated/shared/c++/NitroBillingProgramAvailabilityResultAndroid.hpp +16 -2
  449. package/nitrogen/generated/shared/c++/NitroBillingProgramInformationDialogParamsAndroid.hpp +89 -0
  450. package/nitrogen/generated/shared/c++/NitroBillingResultAndroid.hpp +96 -0
  451. package/nitrogen/generated/shared/c++/NitroGetBillingChoiceInfoParamsAndroid.hpp +99 -0
  452. package/nitrogen/generated/shared/c++/NitroInAppMessageParamsAndroid.hpp +88 -0
  453. package/nitrogen/generated/shared/c++/NitroInAppMessageResultAndroid.hpp +92 -0
  454. package/nitrogen/generated/shared/c++/NitroLaunchExternalLinkParamsAndroid.hpp +9 -2
  455. package/nitrogen/generated/shared/c++/NitroOneTimePurchaseOfferDetail.hpp +6 -2
  456. package/nitrogen/generated/shared/c++/NitroProduct.hpp +14 -2
  457. package/nitrogen/generated/shared/c++/NitroPurchase.hpp +40 -3
  458. package/nitrogen/generated/shared/c++/NitroPurchaseRequest.hpp +1 -1
  459. package/nitrogen/generated/shared/c++/NitroPurchaseResult.hpp +27 -4
  460. package/nitrogen/generated/shared/c++/NitroReceiptValidationResultIOS.hpp +1 -1
  461. package/nitrogen/generated/shared/c++/NitroRenewalInfoIOS.hpp +15 -2
  462. package/nitrogen/generated/shared/c++/NitroRequestPurchaseAndroid.hpp +13 -2
  463. package/nitrogen/generated/shared/c++/NitroSubscriptionStatus.hpp +8 -8
  464. package/nitrogen/generated/shared/c++/NitroVerifyPurchaseWithProviderResult.hpp +1 -1
  465. package/nitrogen/generated/shared/c++/PendingPurchaseUpdateAndroid.hpp +1 -1
  466. package/nitrogen/generated/shared/c++/ProductType.hpp +76 -0
  467. package/nitrogen/generated/shared/c++/PurchaseAndroid.hpp +1 -1
  468. package/nitrogen/generated/shared/c++/PurchaseIOS.hpp +1 -1
  469. package/nitrogen/generated/shared/c++/SubResponseCodeAndroid.hpp +80 -0
  470. package/nitrogen/generated/shared/c++/UserChoiceBillingDetails.hpp +16 -3
  471. package/openiap-versions.json +3 -3
  472. package/package.json +8 -5
  473. package/src/hooks/useIAP.ts +70 -4
  474. package/src/index.kepler.ts +9 -0
  475. package/src/index.ts +268 -120
  476. package/src/specs/RnIap.nitro.ts +141 -27
  477. package/src/types.ts +294 -59
  478. package/src/utils/error.ts +11 -8
  479. package/src/utils/errorMapping.ts +9 -1
  480. package/src/utils/type-bridge.ts +63 -42
  481. package/src/vega-adapter.ts +112 -15
  482. package/nitrogen/generated/android/c++/JNitroSubscriptionRenewalInfo.hpp +0 -83
  483. package/nitrogen/generated/android/c++/JVariant_NullType_NitroSubscriptionRenewalInfo.cpp +0 -26
  484. package/nitrogen/generated/android/c++/JVariant_NullType_NitroSubscriptionRenewalInfo.hpp +0 -75
  485. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroSubscriptionRenewalInfo.kt +0 -53
  486. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroSubscriptionRenewalInfo.kt +0 -53
  487. package/nitrogen/generated/ios/swift/NitroSubscriptionRenewalInfo.swift +0 -182
  488. package/nitrogen/generated/ios/swift/Variant_NullType_NitroSubscriptionRenewalInfo.swift +0 -18
  489. package/nitrogen/generated/shared/c++/NitroSubscriptionRenewalInfo.hpp +0 -106
@@ -15,9 +15,8 @@ class HybridRnIap: HybridRnIapSpec {
15
15
  }
16
16
 
17
17
  // MARK: - Properties
18
- private var updateListenerTask: Task<Void, Never>?
19
18
  private var isInitialized: Bool = false
20
- private var isInitializing: Bool = false
19
+ private var connectionEpoch: UInt64 = 0
21
20
  private var productTypeBySku: [String: String] = [:]
22
21
  // OpenIAP event subscriptions
23
22
  private var purchaseUpdatedSub: Subscription?
@@ -38,6 +37,8 @@ class HybridRnIap: HybridRnIapSpec {
38
37
  private var purchasePayloadById: [String: [String: Any]] = [:]
39
38
  // Thread safety lock for listener arrays and error dedup state
40
39
  private let listenerLock = NSLock()
40
+ private let lifecycleLock = NSLock()
41
+ private var lifecycleTail: Task<Void, Never>?
41
42
 
42
43
  // MARK: - Initialization
43
44
 
@@ -45,57 +46,68 @@ class HybridRnIap: HybridRnIapSpec {
45
46
  super.init()
46
47
  }
47
48
 
48
- deinit {
49
- updateListenerTask?.cancel()
50
- }
51
-
52
49
  // MARK: - Public Methods (Cross-platform)
53
50
 
54
51
 
55
52
 
56
53
  func initConnection(config: Variant_NullType_InitConnectionConfig?) throws -> Promise<Bool> {
57
- return Promise.async {
54
+ let operation = enqueueLifecycleOperation {
58
55
  let configValue: InitConnectionConfig? = {
59
56
  if case .second(let c) = config { return c }
60
57
  return nil
61
58
  }()
62
59
  RnIapLog.payload("initConnection", configValue?.alternativeBillingModeAndroid)
63
- self.attachListenersIfNeeded()
64
-
65
- if self.isInitialized || self.isInitializing {
66
- RnIapLog.result("initConnection", true)
67
- return true
68
- }
69
-
70
- self.isInitializing = true
60
+ let epoch = self.listenerLock.withLock { self.connectionEpoch }
71
61
 
72
62
  do {
73
63
  // Note: iOS doesn't support alternative billing config parameter
74
64
  // Config is ignored on iOS platform
75
65
  let ok = try await OpenIapModule.shared.initConnection()
76
66
  RnIapLog.result("initConnection", ok)
77
- self.isInitialized = ok
78
- self.isInitializing = false
67
+ let isCurrent = self.listenerLock.withLock {
68
+ guard self.connectionEpoch == epoch else { return false }
69
+ self.isInitialized = ok
70
+ return true
71
+ }
72
+ guard isCurrent else { return false }
73
+ if ok {
74
+ self.attachListenersIfNeeded(epoch: epoch)
75
+ }
79
76
  return ok
80
77
  } catch {
81
- RnIapLog.failure("initConnection", error: error)
82
- let err = RnIapHelper.makePurchaseErrorResult(
83
- code: .initConnection,
84
- message: error.localizedDescription
85
- )
86
- self.sendPurchaseError(err, productId: nil)
87
- self.isInitialized = false
88
- self.isInitializing = false
78
+ let isCurrent = self.listenerLock.withLock {
79
+ guard self.connectionEpoch == epoch else { return false }
80
+ self.isInitialized = false
81
+ return true
82
+ }
83
+ if isCurrent {
84
+ RnIapLog.failure("initConnection", error: error)
85
+ let err = RnIapHelper.makePurchaseErrorResult(
86
+ code: .initConnection,
87
+ message: error.localizedDescription
88
+ )
89
+ self.sendPurchaseError(err, productId: nil)
90
+ }
89
91
  return false
90
92
  }
91
93
  }
94
+ return Promise.async { try await operation.value }
92
95
  }
93
96
 
94
97
  func endConnection() throws -> Promise<Bool> {
95
- return Promise.async {
96
- self.cleanupExistingState()
97
- return true
98
+ let operation = enqueueLifecycleOperation {
99
+ let subscriptions = self.detachConnectionState()
100
+ self.removeSubscriptions(subscriptions)
101
+ await MainActor.run {
102
+ self.productTypeBySku.removeAll()
103
+ self.purchasePayloadById.removeAll()
104
+ }
105
+ RnIapLog.payload("endConnection", nil)
106
+ let result = try await OpenIapModule.shared.endConnection()
107
+ RnIapLog.result("endConnection", result)
108
+ return result
98
109
  }
110
+ return Promise.async { try await operation.value }
99
111
  }
100
112
 
101
113
  func fetchProducts(skus: [String], type: String) throws -> Promise<[NitroProduct]> {
@@ -183,7 +195,7 @@ class HybridRnIap: HybridRnIapSpec {
183
195
  return defaultResult
184
196
  }
185
197
 
186
- guard self.isInitialized else {
198
+ guard self.isConnectionInitialized() else {
187
199
  let err = RnIapHelper.makePurchaseErrorResult(
188
200
  code: .initConnection,
189
201
  message: "IAP store connection not initialized",
@@ -368,7 +380,7 @@ class HybridRnIap: HybridRnIapSpec {
368
380
  let purchaseInput = try OpenIapSerialization.purchaseInput(from: purchasePayload)
369
381
  _ = try await OpenIapModule.shared.finishTransaction(purchase: purchaseInput, isConsumable: nil)
370
382
  RnIapLog.result("finishTransaction", true)
371
- await MainActor.run {
383
+ _ = await MainActor.run {
372
384
  self.purchasePayloadById.removeValue(forKey: iosParams.transactionId)
373
385
  }
374
386
  return .first(true)
@@ -590,12 +602,13 @@ class HybridRnIap: HybridRnIapSpec {
590
602
  return try getPromotedProductIOS()
591
603
  }
592
604
 
593
- func buyPromotedProductIOS() throws -> Promise<Void> {
605
+ func buyPromotedProductIOS() throws -> Promise<Bool> {
594
606
  return Promise.async {
595
607
  do {
596
608
  RnIapLog.payload("buyPromotedProductIOS", nil)
597
609
  let ok = try await OpenIapModule.shared.requestPurchaseOnPromotedProductIOS()
598
610
  RnIapLog.result("buyPromotedProductIOS", ok)
611
+ return ok
599
612
  } catch let purchaseError as PurchaseError {
600
613
  RnIapLog.failure("buyPromotedProductIOS", error: purchaseError)
601
614
  throw OpenIapException.from(purchaseError)
@@ -623,14 +636,9 @@ class HybridRnIap: HybridRnIapSpec {
623
636
 
624
637
  func clearTransactionIOS() throws -> Promise<Void> {
625
638
  return Promise.async {
626
- do {
627
- RnIapLog.payload("clearTransactionIOS", nil)
628
- let ok = try await OpenIapModule.shared.clearTransactionIOS()
629
- RnIapLog.result("clearTransactionIOS", ok)
630
- } catch {
631
- // ignore
632
- RnIapLog.failure("clearTransactionIOS", error: error)
633
- }
639
+ RnIapLog.payload("clearTransactionIOS", nil)
640
+ let ok = try await OpenIapModule.shared.clearTransactionIOS()
641
+ RnIapLog.result("clearTransactionIOS", ok)
634
642
  }
635
643
  }
636
644
 
@@ -654,11 +662,13 @@ class HybridRnIap: HybridRnIapSpec {
654
662
  stateValue = 0
655
663
  }
656
664
  let platform = payload["platform"] as? String ?? "ios"
657
- var renewalInfo: Variant_NullType_NitroSubscriptionRenewalInfo? = nil
665
+ var renewalInfo: Variant_NullType_NitroRenewalInfoIOS? = nil
658
666
  if let renewalPayload = payload["renewalInfo"] as? [String: Any?] {
659
- if let info = RnIapHelper.convertRenewalInfo(RnIapHelper.sanitizeDictionary(renewalPayload)) {
660
- renewalInfo = .second(info)
661
- }
667
+ renewalInfo = RnIapHelper.wrapRenewalInfo(
668
+ RnIapHelper.convertRenewalInfoFromOpenIAP(
669
+ RnIapHelper.sanitizeDictionary(renewalPayload)
670
+ )
671
+ )
662
672
  }
663
673
  return NitroSubscriptionStatus(state: stateValue, platform: platform, renewalInfo: renewalInfo)
664
674
  }
@@ -763,8 +773,9 @@ class HybridRnIap: HybridRnIapSpec {
763
773
  payloadUpdates[identifier] = raw
764
774
  }
765
775
  }
776
+ let updates = payloadUpdates
766
777
  await MainActor.run {
767
- for (key, value) in payloadUpdates {
778
+ for (key, value) in updates {
768
779
  self.purchasePayloadById[key] = value
769
780
  }
770
781
  }
@@ -802,17 +813,10 @@ class HybridRnIap: HybridRnIapSpec {
802
813
  return Promise.async {
803
814
  try self.ensureConnection()
804
815
  do {
805
- // Trigger system UI
806
816
  RnIapLog.payload("showManageSubscriptionsIOS", nil)
807
- _ = try await OpenIapModule.shared.showManageSubscriptionsIOS()
808
- // Return current entitlements as approximation of updates
809
- let optionsDictionary: [String: Any] = [
810
- "alsoPublishToEventListenerIOS": false,
811
- "onlyIncludeActiveItemsIOS": true
812
- ]
813
- let iosOptions = try OpenIapSerialization.purchaseOptions(from: optionsDictionary)
814
- let purchases = try await OpenIapModule.shared.getAvailablePurchases(iosOptions)
815
- let payloads = RnIapHelper.sanitizeArray(OpenIapSerialization.purchases(purchases))
817
+ let changedPurchases = try await OpenIapModule.shared.showManageSubscriptionsIOS()
818
+ let unionPurchases = changedPurchases.map { OpenIAP.Purchase.purchaseIos($0) }
819
+ let payloads = RnIapHelper.sanitizeArray(OpenIapSerialization.purchases(unionPurchases))
816
820
  RnIapLog.result("showManageSubscriptionsIOS", payloads)
817
821
  return payloads.map { RnIapHelper.convertPurchaseDictionary($0) }
818
822
  } catch let purchaseError as PurchaseError {
@@ -953,12 +957,19 @@ class HybridRnIap: HybridRnIapSpec {
953
957
  }
954
958
 
955
959
  func addPromotedProductListenerIOS(listener: @escaping (NitroProduct) -> Void) throws {
956
- listenerLock.withLock { promotedProductListeners.append(listener) }
960
+ let epoch = listenerLock.withLock {
961
+ promotedProductListeners.append(listener)
962
+ return isInitialized ? connectionEpoch : nil
963
+ }
964
+ guard let epoch else { return }
965
+ attachPromotedProductSubIfNeeded(expectedEpoch: epoch)
957
966
 
958
967
  // If a promoted product is already available from OpenIAP, notify immediately
959
968
  Task {
969
+ guard self.isCurrentConnection(epoch) else { return }
960
970
  RnIapLog.payload("promotedProductListenerIOS.fetch", nil)
961
971
  if let product = try? await OpenIapModule.shared.getPromotedProductIOS() {
972
+ guard self.isCurrentConnection(epoch) else { return }
962
973
  let payload = RnIapHelper.sanitizeDictionary(OpenIapSerialization.encode(product))
963
974
  RnIapLog.result("promotedProductListenerIOS.fetch", payload)
964
975
  let nitro = RnIapHelper.convertProductDictionary(payload)
@@ -979,7 +990,7 @@ class HybridRnIap: HybridRnIapSpec {
979
990
  ) throws -> Double {
980
991
  let dedupeTransactionIOS = purchaseUpdatedDedupeTransactionIOS(from: options)
981
992
  let receiveDuplicateTransactionUpdatesIOS = !dedupeTransactionIOS
982
- let token = listenerLock.withLock {
993
+ let (token, epoch) = listenerLock.withLock {
983
994
  let token = nextPurchaseUpdatedListenerToken
984
995
  nextPurchaseUpdatedListenerToken += 1
985
996
 
@@ -993,13 +1004,15 @@ class HybridRnIap: HybridRnIapSpec {
993
1004
  purchaseUpdatedListeners.append((token: token, listener: listener))
994
1005
  }
995
1006
  purchaseUpdatedListenerRegistrations.append(registration)
996
- return token
1007
+ return (token, isInitialized ? connectionEpoch : nil)
997
1008
  }
998
1009
 
999
- if receiveDuplicateTransactionUpdatesIOS {
1000
- attachDuplicatePurchaseUpdatedSubIfNeeded()
1001
- } else {
1002
- attachPurchaseUpdatedSubIfNeeded()
1010
+ if let epoch {
1011
+ if receiveDuplicateTransactionUpdatesIOS {
1012
+ attachDuplicatePurchaseUpdatedSubIfNeeded(expectedEpoch: epoch)
1013
+ } else {
1014
+ attachPurchaseUpdatedSubIfNeeded(expectedEpoch: epoch)
1015
+ }
1003
1016
  }
1004
1017
  return token
1005
1018
  }
@@ -1015,7 +1028,13 @@ class HybridRnIap: HybridRnIapSpec {
1015
1028
  }
1016
1029
 
1017
1030
  func addPurchaseErrorListener(listener: @escaping (NitroPurchaseResult) -> Void) throws {
1018
- listenerLock.withLock { purchaseErrorListeners.append(listener) }
1031
+ let epoch = listenerLock.withLock {
1032
+ purchaseErrorListeners.append(listener)
1033
+ return isInitialized ? connectionEpoch : nil
1034
+ }
1035
+ if let epoch {
1036
+ attachPurchaseErrorSubIfNeeded(expectedEpoch: epoch)
1037
+ }
1019
1038
  }
1020
1039
 
1021
1040
  private func purchaseUpdatedDedupeTransactionIOS(
@@ -1066,8 +1085,13 @@ class HybridRnIap: HybridRnIapSpec {
1066
1085
  }
1067
1086
 
1068
1087
  func addSubscriptionBillingIssueListener(listener: @escaping (NitroPurchase) -> Void) throws {
1069
- listenerLock.withLock { subscriptionBillingIssueListeners.append(listener) }
1070
- attachSubscriptionBillingIssueSubIfNeeded()
1088
+ let epoch = listenerLock.withLock {
1089
+ subscriptionBillingIssueListeners.append(listener)
1090
+ return isInitialized ? connectionEpoch : nil
1091
+ }
1092
+ if let epoch {
1093
+ attachSubscriptionBillingIssueSubIfNeeded(expectedEpoch: epoch)
1094
+ }
1071
1095
  }
1072
1096
 
1073
1097
  func removeSubscriptionBillingIssueListener(listener: @escaping (NitroPurchase) -> Void) throws {
@@ -1076,10 +1100,35 @@ class HybridRnIap: HybridRnIapSpec {
1076
1100
 
1077
1101
  // MARK: - Private Helper Methods
1078
1102
 
1079
- private func attachListenersIfNeeded() {
1080
- attachPurchaseUpdatedSubIfNeeded()
1103
+ private func enqueueLifecycleOperation<T>(
1104
+ _ operation: @escaping () async throws -> T
1105
+ ) -> Task<T, Error> {
1106
+ lifecycleLock.withLock {
1107
+ let predecessor = lifecycleTail
1108
+ let task = Task<T, Error> {
1109
+ if let predecessor {
1110
+ await predecessor.value
1111
+ }
1112
+ return try await operation()
1113
+ }
1114
+ lifecycleTail = Task { _ = try? await task.value }
1115
+ return task
1116
+ }
1117
+ }
1118
+
1119
+ private func attachListenersIfNeeded(epoch: UInt64) {
1120
+ attachPurchaseUpdatedSubIfNeeded(expectedEpoch: epoch)
1121
+ attachDuplicatePurchaseUpdatedSubIfNeeded(expectedEpoch: epoch)
1122
+ attachPurchaseErrorSubIfNeeded(expectedEpoch: epoch)
1123
+ attachPromotedProductSubIfNeeded(expectedEpoch: epoch)
1124
+ attachSubscriptionBillingIssueSubIfNeeded(expectedEpoch: epoch)
1125
+ }
1081
1126
 
1082
- if purchaseErrorSub == nil {
1127
+ private func attachPurchaseErrorSubIfNeeded(expectedEpoch: UInt64) {
1128
+ listenerLock.withLock {
1129
+ guard isInitialized,
1130
+ connectionEpoch == expectedEpoch,
1131
+ purchaseErrorSub == nil else { return }
1083
1132
  RnIapLog.payload("purchaseErrorListener.register", nil)
1084
1133
  purchaseErrorSub = OpenIapModule.shared.purchaseErrorListener { [weak self] error in
1085
1134
  guard let self else {
@@ -1087,20 +1136,27 @@ class HybridRnIap: HybridRnIapSpec {
1087
1136
  return
1088
1137
  }
1089
1138
  Task { @MainActor in
1139
+ guard self.isCurrentConnection(expectedEpoch) else { return }
1090
1140
  let payload = RnIapHelper.sanitizeDictionary(OpenIapSerialization.encode(error))
1091
1141
  RnIapLog.result("purchaseErrorListener", payload)
1092
1142
  let nitroError = RnIapHelper.makePurchaseErrorResult(
1093
1143
  code: error.code,
1094
1144
  message: error.message,
1095
- error.productId
1145
+ error.productId,
1146
+ debugMessage: error.debugMessage
1096
1147
  )
1097
1148
  self.sendPurchaseError(nitroError, productId: error.productId)
1098
1149
  }
1099
1150
  }
1100
1151
  RnIapLog.result("purchaseErrorListener.register", "attached")
1101
1152
  }
1153
+ }
1102
1154
 
1103
- if promotedProductSub == nil {
1155
+ private func attachPromotedProductSubIfNeeded(expectedEpoch: UInt64) {
1156
+ listenerLock.withLock {
1157
+ guard isInitialized,
1158
+ connectionEpoch == expectedEpoch,
1159
+ promotedProductSub == nil else { return }
1104
1160
  RnIapLog.payload("promotedProductListenerIOS.register", nil)
1105
1161
  promotedProductSub = OpenIapModule.shared.promotedProductListenerIOS { [weak self] productId in
1106
1162
  guard let self else {
@@ -1108,6 +1164,7 @@ class HybridRnIap: HybridRnIapSpec {
1108
1164
  return
1109
1165
  }
1110
1166
  Task {
1167
+ guard self.isCurrentConnection(expectedEpoch) else { return }
1111
1168
  RnIapLog.payload("promotedProductListenerIOS", ["productId": productId])
1112
1169
  do {
1113
1170
  let request = try OpenIapSerialization.productRequest(skus: [productId], type: .all)
@@ -1115,6 +1172,7 @@ class HybridRnIap: HybridRnIapSpec {
1115
1172
  let payloads = RnIapHelper.sanitizeArray(OpenIapSerialization.products(result))
1116
1173
  RnIapLog.result("fetchProducts", payloads)
1117
1174
  if let payload = payloads.first {
1175
+ guard self.isCurrentConnection(expectedEpoch) else { return }
1118
1176
  let nitro = RnIapHelper.convertProductDictionary(payload)
1119
1177
  let snapshot = self.listenerLock.withLock { Array(self.promotedProductListeners) }
1120
1178
  await MainActor.run {
@@ -1122,6 +1180,7 @@ class HybridRnIap: HybridRnIapSpec {
1122
1180
  }
1123
1181
  }
1124
1182
  } catch {
1183
+ guard self.isCurrentConnection(expectedEpoch) else { return }
1125
1184
  RnIapLog.failure("promotedProductListenerIOS", error: error)
1126
1185
  let id = productId
1127
1186
  let snapshot = self.listenerLock.withLock { Array(self.promotedProductListeners) }
@@ -1136,11 +1195,11 @@ class HybridRnIap: HybridRnIapSpec {
1136
1195
  }
1137
1196
  }
1138
1197
 
1139
- private func attachPurchaseUpdatedSubIfNeeded() {
1198
+ private func attachPurchaseUpdatedSubIfNeeded(expectedEpoch: UInt64) {
1140
1199
  listenerLock.withLock {
1141
- guard purchaseUpdatedSub == nil else {
1142
- return
1143
- }
1200
+ guard isInitialized,
1201
+ connectionEpoch == expectedEpoch,
1202
+ purchaseUpdatedSub == nil else { return }
1144
1203
  RnIapLog.payload("purchaseUpdatedListener.register", nil)
1145
1204
  purchaseUpdatedSub = OpenIapModule.shared.purchaseUpdatedListener { [weak self] openIapPurchase in
1146
1205
  guard let self else {
@@ -1148,6 +1207,7 @@ class HybridRnIap: HybridRnIapSpec {
1148
1207
  return
1149
1208
  }
1150
1209
  Task { @MainActor in
1210
+ guard self.isCurrentConnection(expectedEpoch) else { return }
1151
1211
  let rawPayload = OpenIapSerialization.purchase(openIapPurchase)
1152
1212
  let payload = RnIapHelper.sanitizeDictionary(rawPayload)
1153
1213
  RnIapLog.result("purchaseUpdatedListener", payload)
@@ -1162,11 +1222,12 @@ class HybridRnIap: HybridRnIapSpec {
1162
1222
  }
1163
1223
  }
1164
1224
 
1165
- private func attachDuplicatePurchaseUpdatedSubIfNeeded() {
1225
+ private func attachDuplicatePurchaseUpdatedSubIfNeeded(expectedEpoch: UInt64) {
1166
1226
  listenerLock.withLock {
1167
- guard purchaseUpdatedDuplicateSub == nil else {
1168
- return
1169
- }
1227
+ guard isInitialized,
1228
+ connectionEpoch == expectedEpoch,
1229
+ purchaseUpdatedDuplicateSub == nil,
1230
+ !purchaseUpdatedDuplicateListeners.isEmpty else { return }
1170
1231
  RnIapLog.payload("purchaseUpdatedListener.register.duplicates", nil)
1171
1232
  let options = OpenIAP.PurchaseUpdatedListenerOptions(
1172
1233
  dedupeTransactionIOS: false
@@ -1177,6 +1238,7 @@ class HybridRnIap: HybridRnIapSpec {
1177
1238
  return
1178
1239
  }
1179
1240
  Task { @MainActor in
1241
+ guard self.isCurrentConnection(expectedEpoch) else { return }
1180
1242
  let rawPayload = OpenIapSerialization.purchase(openIapPurchase)
1181
1243
  let payload = RnIapHelper.sanitizeDictionary(rawPayload)
1182
1244
  RnIapLog.result("purchaseUpdatedListener.duplicates", payload)
@@ -1191,32 +1253,46 @@ class HybridRnIap: HybridRnIapSpec {
1191
1253
  }
1192
1254
  }
1193
1255
 
1194
- private func attachSubscriptionBillingIssueSubIfNeeded() {
1195
- guard subscriptionBillingIssueSub == nil else { return }
1196
- RnIapLog.payload("subscriptionBillingIssueListener.register", nil)
1197
- subscriptionBillingIssueSub = OpenIapModule.shared.subscriptionBillingIssueListener { [weak self] openIapPurchase in
1198
- guard let self else {
1199
- RnIapLog.warn("subscriptionBillingIssueListener: HybridRnIap deallocated, event dropped")
1200
- return
1201
- }
1202
- Task { @MainActor in
1203
- let payload = RnIapHelper.sanitizeDictionary(OpenIapSerialization.purchase(openIapPurchase))
1204
- RnIapLog.result("subscriptionBillingIssueListener", payload)
1205
- let nitro = RnIapHelper.convertPurchaseDictionary(payload)
1206
- let snapshot: [(NitroPurchase) -> Void] = self.listenerLock.withLock {
1207
- Array(self.subscriptionBillingIssueListeners)
1256
+ private func attachSubscriptionBillingIssueSubIfNeeded(expectedEpoch: UInt64) {
1257
+ listenerLock.withLock {
1258
+ guard isInitialized,
1259
+ connectionEpoch == expectedEpoch,
1260
+ subscriptionBillingIssueSub == nil,
1261
+ !subscriptionBillingIssueListeners.isEmpty else { return }
1262
+ RnIapLog.payload("subscriptionBillingIssueListener.register", nil)
1263
+ subscriptionBillingIssueSub = OpenIapModule.shared.subscriptionBillingIssueListener { [weak self] openIapPurchase in
1264
+ guard let self else {
1265
+ RnIapLog.warn("subscriptionBillingIssueListener: HybridRnIap deallocated, event dropped")
1266
+ return
1267
+ }
1268
+ Task { @MainActor in
1269
+ guard self.isCurrentConnection(expectedEpoch) else { return }
1270
+ let payload = RnIapHelper.sanitizeDictionary(OpenIapSerialization.purchase(openIapPurchase))
1271
+ RnIapLog.result("subscriptionBillingIssueListener", payload)
1272
+ let nitro = RnIapHelper.convertPurchaseDictionary(payload)
1273
+ let snapshot: [(NitroPurchase) -> Void] = self.listenerLock.withLock {
1274
+ Array(self.subscriptionBillingIssueListeners)
1275
+ }
1276
+ for listener in snapshot { listener(nitro) }
1208
1277
  }
1209
- for l in snapshot { l(nitro) }
1210
1278
  }
1279
+ RnIapLog.result("subscriptionBillingIssueListener.register", "attached")
1211
1280
  }
1212
- RnIapLog.result("subscriptionBillingIssueListener.register", "attached")
1213
1281
  }
1214
1282
 
1215
1283
  private func ensureConnection() throws {
1216
- guard isInitialized else {
1284
+ guard isConnectionInitialized() else {
1217
1285
  throw OpenIapException.make(code: .initConnection, message: "Connection not initialized. Call initConnection() first.")
1218
1286
  }
1219
1287
  }
1288
+
1289
+ private func isConnectionInitialized() -> Bool {
1290
+ listenerLock.withLock { isInitialized }
1291
+ }
1292
+
1293
+ private func isCurrentConnection(_ epoch: UInt64) -> Bool {
1294
+ listenerLock.withLock { isInitialized && connectionEpoch == epoch }
1295
+ }
1220
1296
 
1221
1297
  private func sendPurchaseUpdate(_ purchase: NitroPurchase, includeDuplicateListeners: Bool) {
1222
1298
  let snapshot: [(NitroPurchase) -> Void] = listenerLock.withLock {
@@ -1259,7 +1335,12 @@ class HybridRnIap: HybridRnIapSpec {
1259
1335
  debugMessage: error.debugMessage,
1260
1336
  code: error.code,
1261
1337
  message: error.message,
1262
- purchaseToken: nil
1338
+ purchaseToken: nil,
1339
+ productId: error.productId,
1340
+ productIds: error.productIds,
1341
+ productType: error.productType,
1342
+ isEmptyProductList: error.isEmptyProductList,
1343
+ subResponseCodeAndroid: error.subResponseCodeAndroid
1263
1344
  )
1264
1345
  } else {
1265
1346
  sanitized = error
@@ -1274,60 +1355,51 @@ class HybridRnIap: HybridRnIapSpec {
1274
1355
  sendPurchaseError(error, productId: productId)
1275
1356
  }
1276
1357
 
1277
- private func cleanupExistingState() {
1278
- // Cancel transaction listener if any
1279
- updateListenerTask?.cancel()
1280
- updateListenerTask = nil
1281
- isInitialized = false
1282
- isInitializing = false
1283
-
1284
- // Remove OpenIAP listeners & end connection
1285
- if let sub = purchaseUpdatedSub {
1286
- RnIapLog.payload("removeListener", "purchaseUpdated")
1287
- OpenIapModule.shared.removeListener(sub)
1288
- }
1289
- if let sub = purchaseUpdatedDuplicateSub {
1290
- RnIapLog.payload("removeListener", "purchaseUpdatedDuplicate")
1291
- OpenIapModule.shared.removeListener(sub)
1292
- }
1293
- if let sub = purchaseErrorSub {
1294
- RnIapLog.payload("removeListener", "purchaseError")
1295
- OpenIapModule.shared.removeListener(sub)
1296
- }
1297
- if let sub = promotedProductSub {
1298
- RnIapLog.payload("removeListener", "promotedProduct")
1299
- OpenIapModule.shared.removeListener(sub)
1300
- }
1301
- if let sub = subscriptionBillingIssueSub {
1302
- RnIapLog.payload("removeListener", "subscriptionBillingIssue")
1303
- OpenIapModule.shared.removeListener(sub)
1304
- }
1305
- purchaseUpdatedSub = nil
1306
- purchaseUpdatedDuplicateSub = nil
1307
- purchaseErrorSub = nil
1308
- promotedProductSub = nil
1309
- subscriptionBillingIssueSub = nil
1310
- Task {
1311
- RnIapLog.payload("endConnection", nil)
1312
- let result = try? await OpenIapModule.shared.endConnection()
1313
- RnIapLog.result("endConnection", result as Any)
1314
- }
1315
-
1316
- // Clear event listeners, error dedup state, and delivery state (thread-safe)
1358
+ private func detachConnectionState() -> [(label: String, subscription: Subscription)] {
1317
1359
  listenerLock.withLock {
1360
+ connectionEpoch &+= 1
1361
+ isInitialized = false
1362
+
1363
+ var subscriptions: [(label: String, subscription: Subscription)] = []
1364
+ if let purchaseUpdatedSub {
1365
+ subscriptions.append(("purchaseUpdated", purchaseUpdatedSub))
1366
+ }
1367
+ if let purchaseUpdatedDuplicateSub {
1368
+ subscriptions.append(("purchaseUpdatedDuplicate", purchaseUpdatedDuplicateSub))
1369
+ }
1370
+ if let purchaseErrorSub {
1371
+ subscriptions.append(("purchaseError", purchaseErrorSub))
1372
+ }
1373
+ if let promotedProductSub {
1374
+ subscriptions.append(("promotedProduct", promotedProductSub))
1375
+ }
1376
+ if let subscriptionBillingIssueSub {
1377
+ subscriptions.append(("subscriptionBillingIssue", subscriptionBillingIssueSub))
1378
+ }
1379
+
1380
+ purchaseUpdatedSub = nil
1381
+ purchaseUpdatedDuplicateSub = nil
1382
+ purchaseErrorSub = nil
1383
+ promotedProductSub = nil
1384
+ subscriptionBillingIssueSub = nil
1318
1385
  purchaseUpdatedListeners.removeAll()
1319
1386
  purchaseUpdatedDuplicateListeners.removeAll()
1320
1387
  purchaseUpdatedListenerRegistrations.removeAll()
1321
- nextPurchaseUpdatedListenerToken = 1
1322
1388
  purchaseErrorListeners.removeAll()
1323
1389
  promotedProductListeners.removeAll()
1324
1390
  subscriptionBillingIssueListeners.removeAll()
1325
1391
  lastPurchaseErrorKey = nil
1326
1392
  lastPurchaseErrorTimestamp = 0
1393
+ return subscriptions
1327
1394
  }
1328
- // Clear purchasePayloadById on MainActor to match its access pattern
1329
- Task { @MainActor in
1330
- self.purchasePayloadById.removeAll()
1395
+ }
1396
+
1397
+ private func removeSubscriptions(
1398
+ _ subscriptions: [(label: String, subscription: Subscription)]
1399
+ ) {
1400
+ for subscription in subscriptions {
1401
+ RnIapLog.payload("removeListener", subscription.label)
1402
+ OpenIapModule.shared.removeListener(subscription.subscription)
1331
1403
  }
1332
1404
  }
1333
1405
 
@@ -1385,12 +1457,30 @@ class HybridRnIap: HybridRnIapSpec {
1385
1457
  }
1386
1458
  }
1387
1459
 
1388
- func createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid) throws -> Promise<NitroBillingProgramReportingDetailsAndroid> {
1460
+ func getBillingChoiceInfoAndroid(params: NitroGetBillingChoiceInfoParamsAndroid) throws -> Promise<NitroBillingChoiceInfoAndroid> {
1461
+ return Promise.async {
1462
+ throw OpenIapException.make(code: .featureNotSupported, message: "Billing Choice API is Android-only")
1463
+ }
1464
+ }
1465
+
1466
+ func createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid, developerBillingType: DeveloperBillingTypeAndroid?) throws -> Promise<NitroBillingProgramReportingDetailsAndroid> {
1389
1467
  return Promise.async {
1390
1468
  throw OpenIapException.make(code: .featureNotSupported, message: "Billing Programs API is Android-only")
1391
1469
  }
1392
1470
  }
1393
1471
 
1472
+ func showBillingProgramInformationDialogAndroid(params: NitroBillingProgramInformationDialogParamsAndroid) throws -> Promise<NitroBillingResultAndroid> {
1473
+ return Promise.async {
1474
+ throw OpenIapException.make(code: .featureNotSupported, message: "Billing Choice API is Android-only")
1475
+ }
1476
+ }
1477
+
1478
+ func showInAppMessagesAndroid(params: Variant_NullType_NitroInAppMessageParamsAndroid?) throws -> Promise<NitroInAppMessageResultAndroid> {
1479
+ return Promise.async {
1480
+ throw OpenIapException.make(code: .featureNotSupported, message: "In-app messages are Android-only")
1481
+ }
1482
+ }
1483
+
1394
1484
  func launchExternalLinkAndroid(params: NitroLaunchExternalLinkParamsAndroid) throws -> Promise<Bool> {
1395
1485
  return Promise.async {
1396
1486
  throw OpenIapException.make(code: .featureNotSupported, message: "Billing Programs API is Android-only")