react-native-iap 15.4.0 → 15.5.0

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 (424) hide show
  1. package/android/src/main/java/com/margelo/nitro/iap/ConnectionLifecycleQueue.kt +113 -0
  2. package/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt +222 -87
  3. package/android/src/main/java/com/margelo/nitro/iap/RnIapLog.kt +23 -1
  4. package/ios/HybridRnIap.swift +214 -139
  5. package/ios/RnIapHelper.swift +150 -26
  6. package/ios/RnIapLog.swift +24 -1
  7. package/lib/module/hooks/useIAP.js +1 -1
  8. package/lib/module/hooks/useIAP.js.map +1 -1
  9. package/lib/module/index.js +47 -28
  10. package/lib/module/index.js.map +1 -1
  11. package/lib/module/types.js +11 -9
  12. package/lib/module/types.js.map +1 -1
  13. package/lib/module/utils/error.js +7 -3
  14. package/lib/module/utils/error.js.map +1 -1
  15. package/lib/module/utils/errorMapping.js +2 -0
  16. package/lib/module/utils/errorMapping.js.map +1 -1
  17. package/lib/module/utils/type-bridge.js +28 -19
  18. package/lib/module/utils/type-bridge.js.map +1 -1
  19. package/lib/module/vega-adapter.js +108 -12
  20. package/lib/module/vega-adapter.js.map +1 -1
  21. package/lib/typescript/src/hooks/useIAP.d.ts +3 -3
  22. package/lib/typescript/src/hooks/useIAP.d.ts.map +1 -1
  23. package/lib/typescript/src/index.d.ts.map +1 -1
  24. package/lib/typescript/src/specs/RnIap.nitro.d.ts +27 -19
  25. package/lib/typescript/src/specs/RnIap.nitro.d.ts.map +1 -1
  26. package/lib/typescript/src/types.d.ts +65 -26
  27. package/lib/typescript/src/types.d.ts.map +1 -1
  28. package/lib/typescript/src/utils/error.d.ts.map +1 -1
  29. package/lib/typescript/src/utils/errorMapping.d.ts +3 -1
  30. package/lib/typescript/src/utils/errorMapping.d.ts.map +1 -1
  31. package/lib/typescript/src/utils/type-bridge.d.ts.map +1 -1
  32. package/lib/typescript/src/vega-adapter.d.ts.map +1 -1
  33. package/nitro.json +8 -2
  34. package/nitrogen/generated/android/NitroIap+autolinking.cmake +1 -1
  35. package/nitrogen/generated/android/NitroIapOnLoad.cpp +2 -2
  36. package/nitrogen/generated/android/c++/JAdvancedCommerceInfoIOS.hpp +10 -10
  37. package/nitrogen/generated/android/c++/JAdvancedCommerceItemDetailsIOS.hpp +2 -2
  38. package/nitrogen/generated/android/c++/JAdvancedCommerceItemIOS.hpp +2 -2
  39. package/nitrogen/generated/android/c++/JAdvancedCommerceRefundIOS.hpp +2 -2
  40. package/nitrogen/generated/android/c++/JAlternativeBillingModeAndroid.hpp +2 -2
  41. package/nitrogen/generated/android/c++/JAndroidSubscriptionOfferInput.hpp +2 -2
  42. package/nitrogen/generated/android/c++/JBillingChoiceImageLayoutAndroid.hpp +2 -2
  43. package/nitrogen/generated/android/c++/JBillingChoiceScreenTypeAndroid.hpp +2 -2
  44. package/nitrogen/generated/android/c++/JBillingProgramAndroid.hpp +2 -2
  45. package/nitrogen/generated/android/c++/JDeveloperBillingLaunchModeAndroid.hpp +2 -2
  46. package/nitrogen/generated/android/c++/JDeveloperBillingOptionParamsAndroid.hpp +2 -2
  47. package/nitrogen/generated/android/c++/JDeveloperBillingTypeAndroid.hpp +2 -2
  48. package/nitrogen/generated/android/c++/JDeveloperProvidedBillingDetailsAndroid.hpp +10 -10
  49. package/nitrogen/generated/android/c++/JDeveloperProvidedBillingProductAndroid.hpp +2 -2
  50. package/nitrogen/generated/android/c++/JExternalLinkLaunchModeAndroid.hpp +2 -2
  51. package/nitrogen/generated/android/c++/JExternalLinkTypeAndroid.hpp +2 -2
  52. package/nitrogen/generated/android/c++/JExternalPurchaseCustomLinkNoticeResultIOS.hpp +2 -2
  53. package/nitrogen/generated/android/c++/JExternalPurchaseCustomLinkNoticeTypeIOS.hpp +2 -2
  54. package/nitrogen/generated/android/c++/JExternalPurchaseCustomLinkTokenResultIOS.hpp +2 -2
  55. package/nitrogen/generated/android/c++/JExternalPurchaseCustomLinkTokenTypeIOS.hpp +2 -2
  56. package/nitrogen/generated/android/c++/JExternalPurchaseLinkResultIOS.hpp +2 -2
  57. package/nitrogen/generated/android/c++/JExternalPurchaseNoticeAction.hpp +2 -2
  58. package/nitrogen/generated/android/c++/JExternalPurchaseNoticeResultIOS.hpp +2 -2
  59. package/nitrogen/generated/android/c++/JFunc_void_DeveloperProvidedBillingDetailsAndroid.hpp +2 -2
  60. package/nitrogen/generated/android/c++/JFunc_void_NitroProduct.hpp +2 -2
  61. package/nitrogen/generated/android/c++/JFunc_void_NitroPurchase.hpp +26 -2
  62. package/nitrogen/generated/android/c++/JFunc_void_NitroPurchaseResult.hpp +5 -2
  63. package/nitrogen/generated/android/c++/JFunc_void_UserChoiceBillingDetails.hpp +12 -2
  64. package/nitrogen/generated/android/c++/JHybridRnIapSpec.cpp +51 -54
  65. package/nitrogen/generated/android/c++/JHybridRnIapSpec.hpp +3 -3
  66. package/nitrogen/generated/android/c++/JIapPlatform.hpp +2 -2
  67. package/nitrogen/generated/android/c++/JIapStore.hpp +2 -2
  68. package/nitrogen/generated/android/c++/JIapkitPurchaseState.hpp +2 -2
  69. package/nitrogen/generated/android/c++/JInAppMessageCategoryAndroid.hpp +2 -2
  70. package/nitrogen/generated/android/c++/JInAppMessageResponseCodeAndroid.hpp +2 -2
  71. package/nitrogen/generated/android/c++/JInitConnectionConfig.hpp +2 -2
  72. package/nitrogen/generated/android/c++/JNitroActiveSubscription.hpp +7 -2
  73. package/nitrogen/generated/android/c++/JNitroAvailablePurchasesAndroidOptions.hpp +2 -2
  74. package/nitrogen/generated/android/c++/JNitroAvailablePurchasesAndroidType.hpp +2 -2
  75. package/nitrogen/generated/android/c++/JNitroAvailablePurchasesIosOptions.hpp +2 -2
  76. package/nitrogen/generated/android/c++/JNitroAvailablePurchasesOptions.hpp +2 -2
  77. package/nitrogen/generated/android/c++/JNitroBillingChoiceInfoAndroid.hpp +2 -2
  78. package/nitrogen/generated/android/c++/JNitroBillingProgramAvailabilityResultAndroid.hpp +2 -2
  79. package/nitrogen/generated/android/c++/JNitroBillingProgramInformationDialogParamsAndroid.hpp +2 -2
  80. package/nitrogen/generated/android/c++/JNitroBillingProgramReportingDetailsAndroid.hpp +2 -2
  81. package/nitrogen/generated/android/c++/JNitroBillingResultAndroid.hpp +2 -2
  82. package/nitrogen/generated/android/c++/JNitroDeepLinkOptionsAndroid.hpp +2 -2
  83. package/nitrogen/generated/android/c++/JNitroDiscountAmountAndroid.hpp +2 -2
  84. package/nitrogen/generated/android/c++/JNitroDiscountDisplayInfoAndroid.hpp +2 -2
  85. package/nitrogen/generated/android/c++/JNitroFinishTransactionAndroidParams.hpp +2 -2
  86. package/nitrogen/generated/android/c++/JNitroFinishTransactionIosParams.hpp +2 -2
  87. package/nitrogen/generated/android/c++/JNitroFinishTransactionParams.hpp +2 -2
  88. package/nitrogen/generated/android/c++/JNitroGetBillingChoiceInfoParamsAndroid.hpp +2 -2
  89. package/nitrogen/generated/android/c++/JNitroInAppMessageParamsAndroid.hpp +2 -2
  90. package/nitrogen/generated/android/c++/JNitroInAppMessageResultAndroid.hpp +2 -2
  91. package/nitrogen/generated/android/c++/JNitroLaunchExternalLinkParamsAndroid.hpp +2 -2
  92. package/nitrogen/generated/android/c++/JNitroLimitedQuantityInfoAndroid.hpp +2 -2
  93. package/nitrogen/generated/android/c++/JNitroOneTimePurchaseOfferDetail.hpp +10 -10
  94. package/nitrogen/generated/android/c++/JNitroPreorderDetailsAndroid.hpp +2 -2
  95. package/nitrogen/generated/android/c++/JNitroProduct.hpp +2 -2
  96. package/nitrogen/generated/android/c++/JNitroPurchase.hpp +53 -5
  97. package/nitrogen/generated/android/c++/JNitroPurchaseRequest.hpp +2 -2
  98. package/nitrogen/generated/android/c++/JNitroPurchaseResult.hpp +46 -5
  99. package/nitrogen/generated/android/c++/JNitroReceiptValidationAppleOptions.hpp +2 -2
  100. package/nitrogen/generated/android/c++/JNitroReceiptValidationGoogleOptions.hpp +2 -2
  101. package/nitrogen/generated/android/c++/JNitroReceiptValidationHorizonOptions.hpp +2 -2
  102. package/nitrogen/generated/android/c++/JNitroReceiptValidationParams.hpp +2 -2
  103. package/nitrogen/generated/android/c++/JNitroReceiptValidationResultAndroid.hpp +2 -2
  104. package/nitrogen/generated/android/c++/JNitroReceiptValidationResultIOS.hpp +26 -2
  105. package/nitrogen/generated/android/c++/JNitroRenewalInfoIOS.hpp +16 -3
  106. package/nitrogen/generated/android/c++/JNitroRentalDetailsAndroid.hpp +2 -2
  107. package/nitrogen/generated/android/c++/JNitroRequestPurchaseAndroid.hpp +10 -10
  108. package/nitrogen/generated/android/c++/JNitroRequestPurchaseIos.hpp +2 -2
  109. package/nitrogen/generated/android/c++/JNitroSubscriptionStatus.hpp +15 -9
  110. package/nitrogen/generated/android/c++/JNitroValidTimeWindowAndroid.hpp +2 -2
  111. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitAmazonProps.hpp +2 -2
  112. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitAppleProps.hpp +2 -2
  113. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitGoogleProps.hpp +2 -2
  114. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitProps.hpp +7 -3
  115. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitResult.hpp +2 -2
  116. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithProviderError.hpp +2 -2
  117. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithProviderProps.hpp +2 -2
  118. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithProviderResult.hpp +2 -2
  119. package/nitrogen/generated/android/c++/JPaymentModeIOS.hpp +2 -2
  120. package/nitrogen/generated/android/c++/JPendingPurchaseUpdateAndroid.hpp +10 -10
  121. package/nitrogen/generated/android/c++/JProductType.hpp +2 -2
  122. package/nitrogen/generated/android/c++/JPromotionalOfferJwsInputIOS.hpp +2 -2
  123. package/nitrogen/generated/android/c++/JPurchase.hpp +3 -3
  124. package/nitrogen/generated/android/c++/JPurchaseAndroid.hpp +2 -2
  125. package/nitrogen/generated/android/c++/JPurchaseIOS.hpp +2 -2
  126. package/nitrogen/generated/android/c++/JPurchaseOfferIOS.hpp +2 -2
  127. package/nitrogen/generated/android/c++/JPurchaseState.hpp +2 -2
  128. package/nitrogen/generated/android/c++/JPurchaseUpdatedListenerOptions.hpp +2 -2
  129. package/nitrogen/generated/android/c++/JPurchaseVerificationProvider.hpp +2 -2
  130. package/nitrogen/generated/android/c++/JRenewalCommitmentInfoIOS.hpp +2 -2
  131. package/nitrogen/generated/android/c++/JRenewalInfoIOS.hpp +2 -2
  132. package/nitrogen/generated/android/c++/JRequestPurchaseResult.cpp +4 -4
  133. package/nitrogen/generated/android/c++/JRequestPurchaseResult.hpp +9 -9
  134. package/nitrogen/generated/android/c++/JSubResponseCodeAndroid.hpp +2 -2
  135. package/nitrogen/generated/android/c++/JSubscriptionBillingPlanTypeIOS.hpp +2 -2
  136. package/nitrogen/generated/android/c++/JSubscriptionProductReplacementParamsAndroid.hpp +2 -2
  137. package/nitrogen/generated/android/c++/JSubscriptionReplacementModeAndroid.hpp +2 -2
  138. package/nitrogen/generated/android/c++/JTransactionCommitmentInfoIOS.hpp +2 -2
  139. package/nitrogen/generated/android/c++/JUserChoiceBillingDetails.hpp +29 -11
  140. package/nitrogen/generated/android/c++/JVariant_Boolean_NitroPurchaseResult.hpp +6 -3
  141. package/nitrogen/generated/android/c++/JVariant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid.hpp +27 -3
  142. package/nitrogen/generated/android/c++/JVariant_NullType_AdvancedCommerceInfoIOS.hpp +3 -3
  143. package/nitrogen/generated/android/c++/JVariant_NullType_AdvancedCommerceItemDetailsIOS.hpp +3 -3
  144. package/nitrogen/generated/android/c++/JVariant_NullType_Array_AdvancedCommerceRefundIOS_.cpp +4 -4
  145. package/nitrogen/generated/android/c++/JVariant_NullType_Array_AdvancedCommerceRefundIOS_.hpp +7 -7
  146. package/nitrogen/generated/android/c++/JVariant_NullType_Array_AndroidSubscriptionOfferInput_.cpp +4 -4
  147. package/nitrogen/generated/android/c++/JVariant_NullType_Array_AndroidSubscriptionOfferInput_.hpp +7 -7
  148. package/nitrogen/generated/android/c++/JVariant_NullType_Array_DeveloperProvidedBillingProductAndroid_.cpp +35 -0
  149. package/nitrogen/generated/android/c++/JVariant_NullType_Array_DeveloperProvidedBillingProductAndroid_.hpp +86 -0
  150. package/nitrogen/generated/android/c++/JVariant_NullType_Array_InAppMessageCategoryAndroid_.cpp +4 -4
  151. package/nitrogen/generated/android/c++/JVariant_NullType_Array_InAppMessageCategoryAndroid_.hpp +7 -7
  152. package/nitrogen/generated/android/c++/JVariant_NullType_Array_NitroOneTimePurchaseOfferDetail_.cpp +4 -4
  153. package/nitrogen/generated/android/c++/JVariant_NullType_Array_NitroOneTimePurchaseOfferDetail_.hpp +7 -7
  154. package/nitrogen/generated/android/c++/JVariant_NullType_Array_NitroSubscriptionStatus_.cpp +4 -4
  155. package/nitrogen/generated/android/c++/JVariant_NullType_Array_NitroSubscriptionStatus_.hpp +16 -10
  156. package/nitrogen/generated/android/c++/JVariant_NullType_Array_NitroVerifyPurchaseWithProviderError_.cpp +4 -4
  157. package/nitrogen/generated/android/c++/JVariant_NullType_Array_NitroVerifyPurchaseWithProviderError_.hpp +7 -7
  158. package/nitrogen/generated/android/c++/JVariant_NullType_Array_String_.cpp +4 -4
  159. package/nitrogen/generated/android/c++/JVariant_NullType_Array_String_.hpp +7 -7
  160. package/nitrogen/generated/android/c++/JVariant_NullType_Boolean.hpp +3 -3
  161. package/nitrogen/generated/android/c++/JVariant_NullType_DeveloperBillingOptionParamsAndroid.hpp +3 -3
  162. package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +3 -3
  163. package/nitrogen/generated/android/c++/JVariant_NullType_InitConnectionConfig.hpp +3 -3
  164. package/nitrogen/generated/android/c++/JVariant_NullType_Map_String__String_.hpp +3 -3
  165. package/nitrogen/generated/android/c++/JVariant_NullType_NitroAvailablePurchasesAndroidOptions.hpp +3 -3
  166. package/nitrogen/generated/android/c++/JVariant_NullType_NitroAvailablePurchasesIosOptions.hpp +3 -3
  167. package/nitrogen/generated/android/c++/JVariant_NullType_NitroDiscountAmountAndroid.hpp +3 -3
  168. package/nitrogen/generated/android/c++/JVariant_NullType_NitroDiscountDisplayInfoAndroid.hpp +3 -3
  169. package/nitrogen/generated/android/c++/JVariant_NullType_NitroFinishTransactionAndroidParams.hpp +3 -3
  170. package/nitrogen/generated/android/c++/JVariant_NullType_NitroFinishTransactionIosParams.hpp +3 -3
  171. package/nitrogen/generated/android/c++/JVariant_NullType_NitroInAppMessageParamsAndroid.hpp +3 -3
  172. package/nitrogen/generated/android/c++/JVariant_NullType_NitroLimitedQuantityInfoAndroid.hpp +3 -3
  173. package/nitrogen/generated/android/c++/JVariant_NullType_NitroPreorderDetailsAndroid.hpp +3 -3
  174. package/nitrogen/generated/android/c++/JVariant_NullType_NitroProduct.hpp +3 -3
  175. package/nitrogen/generated/android/c++/JVariant_NullType_NitroPurchase.hpp +27 -3
  176. package/nitrogen/generated/android/c++/JVariant_NullType_NitroReceiptValidationAppleOptions.hpp +3 -3
  177. package/nitrogen/generated/android/c++/JVariant_NullType_NitroReceiptValidationGoogleOptions.hpp +3 -3
  178. package/nitrogen/generated/android/c++/JVariant_NullType_NitroReceiptValidationHorizonOptions.hpp +3 -3
  179. package/nitrogen/generated/android/c++/JVariant_NullType_NitroRenewalInfoIOS.hpp +8 -3
  180. package/nitrogen/generated/android/c++/JVariant_NullType_NitroRentalDetailsAndroid.hpp +3 -3
  181. package/nitrogen/generated/android/c++/JVariant_NullType_NitroRequestPurchaseAndroid.hpp +3 -3
  182. package/nitrogen/generated/android/c++/JVariant_NullType_NitroRequestPurchaseIos.hpp +3 -3
  183. package/nitrogen/generated/android/c++/JVariant_NullType_NitroValidTimeWindowAndroid.hpp +3 -3
  184. package/nitrogen/generated/android/c++/JVariant_NullType_NitroVerifyPurchaseWithIapkitAmazonProps.hpp +3 -3
  185. package/nitrogen/generated/android/c++/JVariant_NullType_NitroVerifyPurchaseWithIapkitAppleProps.hpp +3 -3
  186. package/nitrogen/generated/android/c++/JVariant_NullType_NitroVerifyPurchaseWithIapkitGoogleProps.hpp +3 -3
  187. package/nitrogen/generated/android/c++/JVariant_NullType_NitroVerifyPurchaseWithIapkitProps.hpp +3 -3
  188. package/nitrogen/generated/android/c++/JVariant_NullType_NitroVerifyPurchaseWithIapkitResult.hpp +3 -3
  189. package/nitrogen/generated/android/c++/JVariant_NullType_PendingPurchaseUpdateAndroid.hpp +3 -3
  190. package/nitrogen/generated/android/c++/JVariant_NullType_PromotionalOfferJwsInputIOS.hpp +3 -3
  191. package/nitrogen/generated/android/c++/JVariant_NullType_PurchaseOfferIOS.hpp +3 -3
  192. package/nitrogen/generated/android/c++/JVariant_NullType_RenewalCommitmentInfoIOS.hpp +3 -3
  193. package/nitrogen/generated/android/c++/JVariant_NullType_RenewalInfoIOS.hpp +3 -3
  194. package/nitrogen/generated/android/c++/JVariant_NullType_String.hpp +3 -3
  195. package/nitrogen/generated/android/c++/JVariant_NullType_SubscriptionProductReplacementParamsAndroid.hpp +3 -3
  196. package/nitrogen/generated/android/c++/JVariant_NullType_TransactionCommitmentInfoIOS.hpp +3 -3
  197. package/nitrogen/generated/android/c++/JVariant_NullType_WinBackOfferInputIOS.hpp +3 -3
  198. package/nitrogen/generated/android/c++/JWinBackOfferInputIOS.hpp +2 -2
  199. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AdvancedCommerceInfoIOS.kt +27 -0
  200. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AdvancedCommerceItemDetailsIOS.kt +13 -0
  201. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AdvancedCommerceItemIOS.kt +17 -0
  202. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AdvancedCommerceRefundIOS.kt +13 -0
  203. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AndroidSubscriptionOfferInput.kt +15 -0
  204. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperBillingOptionParamsAndroid.kt +19 -0
  205. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperProvidedBillingDetailsAndroid.kt +19 -0
  206. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperProvidedBillingProductAndroid.kt +17 -0
  207. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/ExternalPurchaseCustomLinkNoticeResultIOS.kt +15 -0
  208. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/ExternalPurchaseCustomLinkTokenResultIOS.kt +15 -0
  209. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/ExternalPurchaseLinkResultIOS.kt +15 -0
  210. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/ExternalPurchaseNoticeResultIOS.kt +17 -0
  211. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/HybridRnIapSpec.kt +1 -1
  212. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/InitConnectionConfig.kt +17 -0
  213. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroActiveSubscription.kt +39 -0
  214. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroAvailablePurchasesAndroidOptions.kt +15 -0
  215. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroAvailablePurchasesIosOptions.kt +21 -0
  216. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroAvailablePurchasesOptions.kt +15 -0
  217. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingChoiceInfoAndroid.kt +15 -0
  218. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingProgramAvailabilityResultAndroid.kt +19 -0
  219. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingProgramInformationDialogParamsAndroid.kt +15 -0
  220. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingProgramReportingDetailsAndroid.kt +15 -0
  221. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingResultAndroid.kt +17 -0
  222. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroDeepLinkOptionsAndroid.kt +15 -0
  223. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroDiscountAmountAndroid.kt +15 -0
  224. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroDiscountDisplayInfoAndroid.kt +15 -0
  225. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroFinishTransactionAndroidParams.kt +15 -0
  226. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroFinishTransactionIosParams.kt +13 -0
  227. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroFinishTransactionParams.kt +15 -0
  228. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroGetBillingChoiceInfoParamsAndroid.kt +17 -0
  229. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroInAppMessageParamsAndroid.kt +13 -0
  230. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroInAppMessageResultAndroid.kt +15 -0
  231. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroLaunchExternalLinkParamsAndroid.kt +21 -0
  232. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroLimitedQuantityInfoAndroid.kt +15 -0
  233. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroOneTimePurchaseOfferDetail.kt +37 -0
  234. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroPreorderDetailsAndroid.kt +15 -0
  235. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroProduct.kt +85 -0
  236. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroPurchase.kt +128 -3
  237. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroPurchaseRequest.kt +19 -0
  238. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroPurchaseResult.kt +49 -3
  239. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroReceiptValidationAppleOptions.kt +13 -0
  240. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroReceiptValidationGoogleOptions.kt +21 -0
  241. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroReceiptValidationHorizonOptions.kt +17 -0
  242. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroReceiptValidationParams.kt +17 -0
  243. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroReceiptValidationResultAndroid.kt +47 -0
  244. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroReceiptValidationResultIOS.kt +19 -0
  245. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroRenewalInfoIOS.kt +45 -2
  246. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroRentalDetailsAndroid.kt +15 -0
  247. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroRequestPurchaseAndroid.kt +33 -0
  248. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroRequestPurchaseIos.kt +31 -0
  249. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroSubscriptionStatus.kt +19 -2
  250. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroValidTimeWindowAndroid.kt +15 -0
  251. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitAmazonProps.kt +17 -0
  252. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitAppleProps.kt +13 -0
  253. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitGoogleProps.kt +13 -0
  254. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitProps.kt +26 -2
  255. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitResult.kt +17 -0
  256. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithProviderError.kt +15 -0
  257. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithProviderProps.kt +15 -0
  258. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithProviderResult.kt +17 -0
  259. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PendingPurchaseUpdateAndroid.kt +15 -0
  260. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PromotionalOfferJwsInputIOS.kt +15 -0
  261. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Purchase.kt +16 -7
  262. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseAndroid.kt +55 -0
  263. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseIOS.kt +85 -0
  264. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseOfferIOS.kt +17 -0
  265. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseUpdatedListenerOptions.kt +13 -0
  266. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/RenewalCommitmentInfoIOS.kt +21 -0
  267. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/RenewalInfoIOS.kt +37 -0
  268. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/RequestPurchaseResult.kt +20 -9
  269. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/SubscriptionProductReplacementParamsAndroid.kt +15 -0
  270. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/TransactionCommitmentInfoIOS.kt +19 -0
  271. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/UserChoiceBillingDetails.kt +28 -3
  272. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_Boolean_NitroPurchaseResult.kt +16 -7
  273. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid.kt +16 -7
  274. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_AdvancedCommerceInfoIOS.kt +16 -7
  275. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_AdvancedCommerceItemDetailsIOS.kt +16 -7
  276. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_AdvancedCommerceRefundIOS_.kt +16 -7
  277. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_AndroidSubscriptionOfferInput_.kt +16 -7
  278. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_DeveloperProvidedBillingProductAndroid_.kt +62 -0
  279. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_InAppMessageCategoryAndroid_.kt +16 -7
  280. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_NitroOneTimePurchaseOfferDetail_.kt +16 -7
  281. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_NitroSubscriptionStatus_.kt +16 -7
  282. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_NitroVerifyPurchaseWithProviderError_.kt +16 -7
  283. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_String_.kt +16 -7
  284. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Boolean.kt +16 -7
  285. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_DeveloperBillingOptionParamsAndroid.kt +16 -7
  286. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Double.kt +16 -7
  287. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_InitConnectionConfig.kt +16 -7
  288. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Map_String__String_.kt +16 -7
  289. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroAvailablePurchasesAndroidOptions.kt +16 -7
  290. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroAvailablePurchasesIosOptions.kt +16 -7
  291. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroDiscountAmountAndroid.kt +16 -7
  292. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroDiscountDisplayInfoAndroid.kt +16 -7
  293. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroFinishTransactionAndroidParams.kt +16 -7
  294. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroFinishTransactionIosParams.kt +16 -7
  295. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroInAppMessageParamsAndroid.kt +16 -7
  296. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroLimitedQuantityInfoAndroid.kt +16 -7
  297. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroPreorderDetailsAndroid.kt +16 -7
  298. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroProduct.kt +16 -7
  299. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroPurchase.kt +16 -7
  300. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroReceiptValidationAppleOptions.kt +16 -7
  301. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroReceiptValidationGoogleOptions.kt +16 -7
  302. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroReceiptValidationHorizonOptions.kt +16 -7
  303. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroRenewalInfoIOS.kt +16 -7
  304. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroRentalDetailsAndroid.kt +16 -7
  305. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroRequestPurchaseAndroid.kt +16 -7
  306. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroRequestPurchaseIos.kt +16 -7
  307. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroValidTimeWindowAndroid.kt +16 -7
  308. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroVerifyPurchaseWithIapkitAmazonProps.kt +16 -7
  309. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroVerifyPurchaseWithIapkitAppleProps.kt +16 -7
  310. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroVerifyPurchaseWithIapkitGoogleProps.kt +16 -7
  311. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroVerifyPurchaseWithIapkitProps.kt +16 -7
  312. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroVerifyPurchaseWithIapkitResult.kt +16 -7
  313. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_PendingPurchaseUpdateAndroid.kt +16 -7
  314. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_PromotionalOfferJwsInputIOS.kt +16 -7
  315. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_PurchaseOfferIOS.kt +16 -7
  316. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_RenewalCommitmentInfoIOS.kt +16 -7
  317. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_RenewalInfoIOS.kt +16 -7
  318. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_String.kt +16 -7
  319. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_SubscriptionProductReplacementParamsAndroid.kt +16 -7
  320. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_TransactionCommitmentInfoIOS.kt +16 -7
  321. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_WinBackOfferInputIOS.kt +16 -7
  322. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/WinBackOfferInputIOS.kt +13 -0
  323. package/nitrogen/generated/ios/NitroIap+autolinking.rb +2 -0
  324. package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Bridge.hpp +85 -73
  325. package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Umbrella.hpp +0 -3
  326. package/nitrogen/generated/ios/c++/HybridRnIapSpecSwift.hpp +7 -10
  327. package/nitrogen/generated/ios/swift/HybridRnIapSpec.swift +1 -1
  328. package/nitrogen/generated/ios/swift/HybridRnIapSpec_cxx.swift +7 -7
  329. package/nitrogen/generated/ios/swift/NitroPurchase.swift +204 -2
  330. package/nitrogen/generated/ios/swift/NitroPurchaseResult.swift +90 -1
  331. package/nitrogen/generated/ios/swift/NitroRenewalInfoIOS.swift +49 -1
  332. package/nitrogen/generated/ios/swift/NitroSubscriptionStatus.swift +11 -11
  333. package/nitrogen/generated/ios/swift/NitroVerifyPurchaseWithIapkitProps.swift +38 -1
  334. package/nitrogen/generated/ios/swift/Purchase.swift +12 -0
  335. package/nitrogen/generated/ios/swift/RequestPurchaseResult.swift +14 -0
  336. package/nitrogen/generated/ios/swift/UserChoiceBillingDetails.swift +82 -2
  337. package/nitrogen/generated/ios/swift/Variant_Bool_NitroPurchaseResult.swift +12 -0
  338. package/nitrogen/generated/ios/swift/Variant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid.swift +12 -0
  339. package/nitrogen/generated/ios/swift/Variant_NullType_AdvancedCommerceInfoIOS.swift +12 -0
  340. package/nitrogen/generated/ios/swift/Variant_NullType_AdvancedCommerceItemDetailsIOS.swift +12 -0
  341. package/nitrogen/generated/ios/swift/Variant_NullType_Bool.swift +12 -0
  342. package/nitrogen/generated/ios/swift/Variant_NullType_DeveloperBillingOptionParamsAndroid.swift +12 -0
  343. package/nitrogen/generated/ios/swift/Variant_NullType_Dictionary_String__String_.swift +12 -0
  344. package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +12 -0
  345. package/nitrogen/generated/ios/swift/Variant_NullType_InitConnectionConfig.swift +12 -0
  346. package/nitrogen/generated/ios/swift/Variant_NullType_NitroAvailablePurchasesAndroidOptions.swift +12 -0
  347. package/nitrogen/generated/ios/swift/Variant_NullType_NitroAvailablePurchasesIosOptions.swift +12 -0
  348. package/nitrogen/generated/ios/swift/Variant_NullType_NitroDiscountAmountAndroid.swift +12 -0
  349. package/nitrogen/generated/ios/swift/Variant_NullType_NitroDiscountDisplayInfoAndroid.swift +12 -0
  350. package/nitrogen/generated/ios/swift/Variant_NullType_NitroFinishTransactionAndroidParams.swift +12 -0
  351. package/nitrogen/generated/ios/swift/Variant_NullType_NitroFinishTransactionIosParams.swift +12 -0
  352. package/nitrogen/generated/ios/swift/Variant_NullType_NitroInAppMessageParamsAndroid.swift +12 -0
  353. package/nitrogen/generated/ios/swift/Variant_NullType_NitroLimitedQuantityInfoAndroid.swift +12 -0
  354. package/nitrogen/generated/ios/swift/Variant_NullType_NitroPreorderDetailsAndroid.swift +12 -0
  355. package/nitrogen/generated/ios/swift/Variant_NullType_NitroProduct.swift +12 -0
  356. package/nitrogen/generated/ios/swift/Variant_NullType_NitroPurchase.swift +12 -0
  357. package/nitrogen/generated/ios/swift/Variant_NullType_NitroReceiptValidationAppleOptions.swift +12 -0
  358. package/nitrogen/generated/ios/swift/Variant_NullType_NitroReceiptValidationGoogleOptions.swift +12 -0
  359. package/nitrogen/generated/ios/swift/Variant_NullType_NitroReceiptValidationHorizonOptions.swift +12 -0
  360. package/nitrogen/generated/ios/swift/Variant_NullType_NitroRenewalInfoIOS.swift +12 -0
  361. package/nitrogen/generated/ios/swift/Variant_NullType_NitroRentalDetailsAndroid.swift +12 -0
  362. package/nitrogen/generated/ios/swift/Variant_NullType_NitroRequestPurchaseAndroid.swift +12 -0
  363. package/nitrogen/generated/ios/swift/Variant_NullType_NitroRequestPurchaseIos.swift +12 -0
  364. package/nitrogen/generated/ios/swift/Variant_NullType_NitroValidTimeWindowAndroid.swift +12 -0
  365. package/nitrogen/generated/ios/swift/Variant_NullType_NitroVerifyPurchaseWithIapkitAmazonProps.swift +12 -0
  366. package/nitrogen/generated/ios/swift/Variant_NullType_NitroVerifyPurchaseWithIapkitAppleProps.swift +12 -0
  367. package/nitrogen/generated/ios/swift/Variant_NullType_NitroVerifyPurchaseWithIapkitGoogleProps.swift +12 -0
  368. package/nitrogen/generated/ios/swift/Variant_NullType_NitroVerifyPurchaseWithIapkitProps.swift +12 -0
  369. package/nitrogen/generated/ios/swift/Variant_NullType_NitroVerifyPurchaseWithIapkitResult.swift +12 -0
  370. package/nitrogen/generated/ios/swift/Variant_NullType_PendingPurchaseUpdateAndroid.swift +12 -0
  371. package/nitrogen/generated/ios/swift/Variant_NullType_PromotionalOfferJwsInputIOS.swift +12 -0
  372. package/nitrogen/generated/ios/swift/Variant_NullType_PurchaseOfferIOS.swift +12 -0
  373. package/nitrogen/generated/ios/swift/Variant_NullType_RenewalCommitmentInfoIOS.swift +12 -0
  374. package/nitrogen/generated/ios/swift/Variant_NullType_RenewalInfoIOS.swift +12 -0
  375. package/nitrogen/generated/ios/swift/Variant_NullType_String.swift +12 -0
  376. package/nitrogen/generated/ios/swift/Variant_NullType_SubscriptionProductReplacementParamsAndroid.swift +12 -0
  377. package/nitrogen/generated/ios/swift/Variant_NullType_TransactionCommitmentInfoIOS.swift +12 -0
  378. package/nitrogen/generated/ios/swift/Variant_NullType_WinBackOfferInputIOS.swift +12 -0
  379. package/nitrogen/generated/ios/swift/Variant_NullType__AdvancedCommerceRefundIOS_.swift +12 -0
  380. package/nitrogen/generated/ios/swift/Variant_NullType__AndroidSubscriptionOfferInput_.swift +12 -0
  381. package/nitrogen/generated/ios/swift/Variant_NullType__DeveloperProvidedBillingProductAndroid_.swift +30 -0
  382. package/nitrogen/generated/ios/swift/Variant_NullType__InAppMessageCategoryAndroid_.swift +12 -0
  383. package/nitrogen/generated/ios/swift/Variant_NullType__NitroOneTimePurchaseOfferDetail_.swift +12 -0
  384. package/nitrogen/generated/ios/swift/Variant_NullType__NitroSubscriptionStatus_.swift +12 -0
  385. package/nitrogen/generated/ios/swift/Variant_NullType__NitroVerifyPurchaseWithProviderError_.swift +12 -0
  386. package/nitrogen/generated/ios/swift/Variant_NullType__String_.swift +12 -0
  387. package/nitrogen/generated/shared/c++/AdvancedCommerceInfoIOS.hpp +1 -1
  388. package/nitrogen/generated/shared/c++/AdvancedCommerceItemIOS.hpp +1 -1
  389. package/nitrogen/generated/shared/c++/DeveloperProvidedBillingDetailsAndroid.hpp +1 -1
  390. package/nitrogen/generated/shared/c++/HybridRnIapSpec.hpp +1 -1
  391. package/nitrogen/generated/shared/c++/NitroInAppMessageParamsAndroid.hpp +1 -1
  392. package/nitrogen/generated/shared/c++/NitroOneTimePurchaseOfferDetail.hpp +1 -1
  393. package/nitrogen/generated/shared/c++/NitroProduct.hpp +1 -1
  394. package/nitrogen/generated/shared/c++/NitroPurchase.hpp +40 -3
  395. package/nitrogen/generated/shared/c++/NitroPurchaseRequest.hpp +1 -1
  396. package/nitrogen/generated/shared/c++/NitroPurchaseResult.hpp +27 -4
  397. package/nitrogen/generated/shared/c++/NitroReceiptValidationResultIOS.hpp +1 -1
  398. package/nitrogen/generated/shared/c++/NitroRenewalInfoIOS.hpp +15 -2
  399. package/nitrogen/generated/shared/c++/NitroRequestPurchaseAndroid.hpp +1 -1
  400. package/nitrogen/generated/shared/c++/NitroSubscriptionStatus.hpp +8 -8
  401. package/nitrogen/generated/shared/c++/NitroVerifyPurchaseWithIapkitProps.hpp +5 -1
  402. package/nitrogen/generated/shared/c++/NitroVerifyPurchaseWithProviderResult.hpp +1 -1
  403. package/nitrogen/generated/shared/c++/PendingPurchaseUpdateAndroid.hpp +1 -1
  404. package/nitrogen/generated/shared/c++/PurchaseAndroid.hpp +1 -1
  405. package/nitrogen/generated/shared/c++/PurchaseIOS.hpp +1 -1
  406. package/nitrogen/generated/shared/c++/UserChoiceBillingDetails.hpp +16 -3
  407. package/openiap-versions.json +3 -3
  408. package/package.json +8 -5
  409. package/src/hooks/useIAP.ts +7 -4
  410. package/src/index.ts +59 -39
  411. package/src/specs/RnIap.nitro.ts +31 -19
  412. package/src/types.ts +65 -26
  413. package/src/utils/error.ts +11 -8
  414. package/src/utils/errorMapping.ts +9 -1
  415. package/src/utils/type-bridge.ts +37 -40
  416. package/src/vega-adapter.ts +191 -26
  417. package/nitrogen/generated/android/c++/JNitroSubscriptionRenewalInfo.hpp +0 -83
  418. package/nitrogen/generated/android/c++/JVariant_NullType_NitroSubscriptionRenewalInfo.cpp +0 -26
  419. package/nitrogen/generated/android/c++/JVariant_NullType_NitroSubscriptionRenewalInfo.hpp +0 -75
  420. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroSubscriptionRenewalInfo.kt +0 -53
  421. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroSubscriptionRenewalInfo.kt +0 -53
  422. package/nitrogen/generated/ios/swift/NitroSubscriptionRenewalInfo.swift +0 -182
  423. package/nitrogen/generated/ios/swift/Variant_NullType_NitroSubscriptionRenewalInfo.swift +0 -18
  424. package/nitrogen/generated/shared/c++/NitroSubscriptionRenewalInfo.hpp +0 -106
@@ -3,9 +3,25 @@ package com.margelo.nitro.iap
3
3
  import android.util.Log
4
4
  import org.json.JSONArray
5
5
  import org.json.JSONObject
6
+ import java.util.Locale
6
7
 
7
8
  internal object RnIapLog {
8
9
  private const val TAG = "RnIap"
10
+ private val SENSITIVE_KEY_FRAGMENTS = setOf(
11
+ "token",
12
+ "apikey",
13
+ "secret",
14
+ "jws",
15
+ "receiptid",
16
+ "userid",
17
+ "password",
18
+ "bearer"
19
+ )
20
+ private val SENSITIVE_AUTH_KEYS = setOf(
21
+ "auth",
22
+ "authorization",
23
+ "authheader"
24
+ )
9
25
 
10
26
  fun payload(name: String, payload: Any?) {
11
27
  debug("$name payload: ${stringify(payload)}")
@@ -52,10 +68,16 @@ internal object RnIapLog {
52
68
  }
53
69
 
54
70
  private fun sanitizeMap(source: Map<*, *>): Map<String, Any?> {
71
+ fun isSensitiveKey(key: String): Boolean {
72
+ val normalized = key.lowercase(Locale.ROOT).filter { it.isLetterOrDigit() }
73
+ return SENSITIVE_KEY_FRAGMENTS.any { normalized.contains(it) } ||
74
+ normalized in SENSITIVE_AUTH_KEYS
75
+ }
76
+
55
77
  val sanitized = linkedMapOf<String, Any?>()
56
78
  for ((rawKey, rawValue) in source) {
57
79
  val key = rawKey as? String ?: continue
58
- if (key.lowercase().contains("token")) {
80
+ if (isSensitiveKey(key)) {
59
81
  sanitized[key] = "hidden"
60
82
  continue
61
83
  }
@@ -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)
@@ -440,6 +452,9 @@ class HybridRnIap: HybridRnIapSpec {
440
452
  } else if let plistApiKey = Bundle.main.object(forInfoDictionaryKey: "IAPKitAPIKey") as? String {
441
453
  iapkitDict["apiKey"] = plistApiKey
442
454
  }
455
+ if case .second(let baseUrl) = iapkit.baseUrl {
456
+ iapkitDict["baseUrl"] = baseUrl
457
+ }
443
458
  if case .second(let apple) = iapkit.apple {
444
459
  iapkitDict["apple"] = ["jws": apple.jws]
445
460
  }
@@ -590,12 +605,13 @@ class HybridRnIap: HybridRnIapSpec {
590
605
  return try getPromotedProductIOS()
591
606
  }
592
607
 
593
- func buyPromotedProductIOS() throws -> Promise<Void> {
608
+ func buyPromotedProductIOS() throws -> Promise<Bool> {
594
609
  return Promise.async {
595
610
  do {
596
611
  RnIapLog.payload("buyPromotedProductIOS", nil)
597
612
  let ok = try await OpenIapModule.shared.requestPurchaseOnPromotedProductIOS()
598
613
  RnIapLog.result("buyPromotedProductIOS", ok)
614
+ return ok
599
615
  } catch let purchaseError as PurchaseError {
600
616
  RnIapLog.failure("buyPromotedProductIOS", error: purchaseError)
601
617
  throw OpenIapException.from(purchaseError)
@@ -623,14 +639,9 @@ class HybridRnIap: HybridRnIapSpec {
623
639
 
624
640
  func clearTransactionIOS() throws -> Promise<Void> {
625
641
  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
- }
642
+ RnIapLog.payload("clearTransactionIOS", nil)
643
+ let ok = try await OpenIapModule.shared.clearTransactionIOS()
644
+ RnIapLog.result("clearTransactionIOS", ok)
634
645
  }
635
646
  }
636
647
 
@@ -654,11 +665,13 @@ class HybridRnIap: HybridRnIapSpec {
654
665
  stateValue = 0
655
666
  }
656
667
  let platform = payload["platform"] as? String ?? "ios"
657
- var renewalInfo: Variant_NullType_NitroSubscriptionRenewalInfo? = nil
668
+ var renewalInfo: Variant_NullType_NitroRenewalInfoIOS? = nil
658
669
  if let renewalPayload = payload["renewalInfo"] as? [String: Any?] {
659
- if let info = RnIapHelper.convertRenewalInfo(RnIapHelper.sanitizeDictionary(renewalPayload)) {
660
- renewalInfo = .second(info)
661
- }
670
+ renewalInfo = RnIapHelper.wrapRenewalInfo(
671
+ RnIapHelper.convertRenewalInfoFromOpenIAP(
672
+ RnIapHelper.sanitizeDictionary(renewalPayload)
673
+ )
674
+ )
662
675
  }
663
676
  return NitroSubscriptionStatus(state: stateValue, platform: platform, renewalInfo: renewalInfo)
664
677
  }
@@ -763,8 +776,9 @@ class HybridRnIap: HybridRnIapSpec {
763
776
  payloadUpdates[identifier] = raw
764
777
  }
765
778
  }
779
+ let updates = payloadUpdates
766
780
  await MainActor.run {
767
- for (key, value) in payloadUpdates {
781
+ for (key, value) in updates {
768
782
  self.purchasePayloadById[key] = value
769
783
  }
770
784
  }
@@ -802,17 +816,10 @@ class HybridRnIap: HybridRnIapSpec {
802
816
  return Promise.async {
803
817
  try self.ensureConnection()
804
818
  do {
805
- // Trigger system UI
806
819
  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))
820
+ let changedPurchases = try await OpenIapModule.shared.showManageSubscriptionsIOS()
821
+ let unionPurchases = changedPurchases.map { OpenIAP.Purchase.purchaseIos($0) }
822
+ let payloads = RnIapHelper.sanitizeArray(OpenIapSerialization.purchases(unionPurchases))
816
823
  RnIapLog.result("showManageSubscriptionsIOS", payloads)
817
824
  return payloads.map { RnIapHelper.convertPurchaseDictionary($0) }
818
825
  } catch let purchaseError as PurchaseError {
@@ -953,12 +960,19 @@ class HybridRnIap: HybridRnIapSpec {
953
960
  }
954
961
 
955
962
  func addPromotedProductListenerIOS(listener: @escaping (NitroProduct) -> Void) throws {
956
- listenerLock.withLock { promotedProductListeners.append(listener) }
963
+ let epoch = listenerLock.withLock {
964
+ promotedProductListeners.append(listener)
965
+ return isInitialized ? connectionEpoch : nil
966
+ }
967
+ guard let epoch else { return }
968
+ attachPromotedProductSubIfNeeded(expectedEpoch: epoch)
957
969
 
958
970
  // If a promoted product is already available from OpenIAP, notify immediately
959
971
  Task {
972
+ guard self.isCurrentConnection(epoch) else { return }
960
973
  RnIapLog.payload("promotedProductListenerIOS.fetch", nil)
961
974
  if let product = try? await OpenIapModule.shared.getPromotedProductIOS() {
975
+ guard self.isCurrentConnection(epoch) else { return }
962
976
  let payload = RnIapHelper.sanitizeDictionary(OpenIapSerialization.encode(product))
963
977
  RnIapLog.result("promotedProductListenerIOS.fetch", payload)
964
978
  let nitro = RnIapHelper.convertProductDictionary(payload)
@@ -979,7 +993,7 @@ class HybridRnIap: HybridRnIapSpec {
979
993
  ) throws -> Double {
980
994
  let dedupeTransactionIOS = purchaseUpdatedDedupeTransactionIOS(from: options)
981
995
  let receiveDuplicateTransactionUpdatesIOS = !dedupeTransactionIOS
982
- let token = listenerLock.withLock {
996
+ let (token, epoch) = listenerLock.withLock {
983
997
  let token = nextPurchaseUpdatedListenerToken
984
998
  nextPurchaseUpdatedListenerToken += 1
985
999
 
@@ -993,13 +1007,15 @@ class HybridRnIap: HybridRnIapSpec {
993
1007
  purchaseUpdatedListeners.append((token: token, listener: listener))
994
1008
  }
995
1009
  purchaseUpdatedListenerRegistrations.append(registration)
996
- return token
1010
+ return (token, isInitialized ? connectionEpoch : nil)
997
1011
  }
998
1012
 
999
- if receiveDuplicateTransactionUpdatesIOS {
1000
- attachDuplicatePurchaseUpdatedSubIfNeeded()
1001
- } else {
1002
- attachPurchaseUpdatedSubIfNeeded()
1013
+ if let epoch {
1014
+ if receiveDuplicateTransactionUpdatesIOS {
1015
+ attachDuplicatePurchaseUpdatedSubIfNeeded(expectedEpoch: epoch)
1016
+ } else {
1017
+ attachPurchaseUpdatedSubIfNeeded(expectedEpoch: epoch)
1018
+ }
1003
1019
  }
1004
1020
  return token
1005
1021
  }
@@ -1015,7 +1031,13 @@ class HybridRnIap: HybridRnIapSpec {
1015
1031
  }
1016
1032
 
1017
1033
  func addPurchaseErrorListener(listener: @escaping (NitroPurchaseResult) -> Void) throws {
1018
- listenerLock.withLock { purchaseErrorListeners.append(listener) }
1034
+ let epoch = listenerLock.withLock {
1035
+ purchaseErrorListeners.append(listener)
1036
+ return isInitialized ? connectionEpoch : nil
1037
+ }
1038
+ if let epoch {
1039
+ attachPurchaseErrorSubIfNeeded(expectedEpoch: epoch)
1040
+ }
1019
1041
  }
1020
1042
 
1021
1043
  private func purchaseUpdatedDedupeTransactionIOS(
@@ -1066,8 +1088,13 @@ class HybridRnIap: HybridRnIapSpec {
1066
1088
  }
1067
1089
 
1068
1090
  func addSubscriptionBillingIssueListener(listener: @escaping (NitroPurchase) -> Void) throws {
1069
- listenerLock.withLock { subscriptionBillingIssueListeners.append(listener) }
1070
- attachSubscriptionBillingIssueSubIfNeeded()
1091
+ let epoch = listenerLock.withLock {
1092
+ subscriptionBillingIssueListeners.append(listener)
1093
+ return isInitialized ? connectionEpoch : nil
1094
+ }
1095
+ if let epoch {
1096
+ attachSubscriptionBillingIssueSubIfNeeded(expectedEpoch: epoch)
1097
+ }
1071
1098
  }
1072
1099
 
1073
1100
  func removeSubscriptionBillingIssueListener(listener: @escaping (NitroPurchase) -> Void) throws {
@@ -1076,10 +1103,35 @@ class HybridRnIap: HybridRnIapSpec {
1076
1103
 
1077
1104
  // MARK: - Private Helper Methods
1078
1105
 
1079
- private func attachListenersIfNeeded() {
1080
- attachPurchaseUpdatedSubIfNeeded()
1106
+ private func enqueueLifecycleOperation<T>(
1107
+ _ operation: @escaping () async throws -> T
1108
+ ) -> Task<T, Error> {
1109
+ lifecycleLock.withLock {
1110
+ let predecessor = lifecycleTail
1111
+ let task = Task<T, Error> {
1112
+ if let predecessor {
1113
+ await predecessor.value
1114
+ }
1115
+ return try await operation()
1116
+ }
1117
+ lifecycleTail = Task { _ = try? await task.value }
1118
+ return task
1119
+ }
1120
+ }
1121
+
1122
+ private func attachListenersIfNeeded(epoch: UInt64) {
1123
+ attachPurchaseUpdatedSubIfNeeded(expectedEpoch: epoch)
1124
+ attachDuplicatePurchaseUpdatedSubIfNeeded(expectedEpoch: epoch)
1125
+ attachPurchaseErrorSubIfNeeded(expectedEpoch: epoch)
1126
+ attachPromotedProductSubIfNeeded(expectedEpoch: epoch)
1127
+ attachSubscriptionBillingIssueSubIfNeeded(expectedEpoch: epoch)
1128
+ }
1081
1129
 
1082
- if purchaseErrorSub == nil {
1130
+ private func attachPurchaseErrorSubIfNeeded(expectedEpoch: UInt64) {
1131
+ listenerLock.withLock {
1132
+ guard isInitialized,
1133
+ connectionEpoch == expectedEpoch,
1134
+ purchaseErrorSub == nil else { return }
1083
1135
  RnIapLog.payload("purchaseErrorListener.register", nil)
1084
1136
  purchaseErrorSub = OpenIapModule.shared.purchaseErrorListener { [weak self] error in
1085
1137
  guard let self else {
@@ -1087,20 +1139,27 @@ class HybridRnIap: HybridRnIapSpec {
1087
1139
  return
1088
1140
  }
1089
1141
  Task { @MainActor in
1142
+ guard self.isCurrentConnection(expectedEpoch) else { return }
1090
1143
  let payload = RnIapHelper.sanitizeDictionary(OpenIapSerialization.encode(error))
1091
1144
  RnIapLog.result("purchaseErrorListener", payload)
1092
1145
  let nitroError = RnIapHelper.makePurchaseErrorResult(
1093
1146
  code: error.code,
1094
1147
  message: error.message,
1095
- error.productId
1148
+ error.productId,
1149
+ debugMessage: error.debugMessage
1096
1150
  )
1097
1151
  self.sendPurchaseError(nitroError, productId: error.productId)
1098
1152
  }
1099
1153
  }
1100
1154
  RnIapLog.result("purchaseErrorListener.register", "attached")
1101
1155
  }
1156
+ }
1102
1157
 
1103
- if promotedProductSub == nil {
1158
+ private func attachPromotedProductSubIfNeeded(expectedEpoch: UInt64) {
1159
+ listenerLock.withLock {
1160
+ guard isInitialized,
1161
+ connectionEpoch == expectedEpoch,
1162
+ promotedProductSub == nil else { return }
1104
1163
  RnIapLog.payload("promotedProductListenerIOS.register", nil)
1105
1164
  promotedProductSub = OpenIapModule.shared.promotedProductListenerIOS { [weak self] productId in
1106
1165
  guard let self else {
@@ -1108,6 +1167,7 @@ class HybridRnIap: HybridRnIapSpec {
1108
1167
  return
1109
1168
  }
1110
1169
  Task {
1170
+ guard self.isCurrentConnection(expectedEpoch) else { return }
1111
1171
  RnIapLog.payload("promotedProductListenerIOS", ["productId": productId])
1112
1172
  do {
1113
1173
  let request = try OpenIapSerialization.productRequest(skus: [productId], type: .all)
@@ -1115,6 +1175,7 @@ class HybridRnIap: HybridRnIapSpec {
1115
1175
  let payloads = RnIapHelper.sanitizeArray(OpenIapSerialization.products(result))
1116
1176
  RnIapLog.result("fetchProducts", payloads)
1117
1177
  if let payload = payloads.first {
1178
+ guard self.isCurrentConnection(expectedEpoch) else { return }
1118
1179
  let nitro = RnIapHelper.convertProductDictionary(payload)
1119
1180
  let snapshot = self.listenerLock.withLock { Array(self.promotedProductListeners) }
1120
1181
  await MainActor.run {
@@ -1122,6 +1183,7 @@ class HybridRnIap: HybridRnIapSpec {
1122
1183
  }
1123
1184
  }
1124
1185
  } catch {
1186
+ guard self.isCurrentConnection(expectedEpoch) else { return }
1125
1187
  RnIapLog.failure("promotedProductListenerIOS", error: error)
1126
1188
  let id = productId
1127
1189
  let snapshot = self.listenerLock.withLock { Array(self.promotedProductListeners) }
@@ -1136,11 +1198,11 @@ class HybridRnIap: HybridRnIapSpec {
1136
1198
  }
1137
1199
  }
1138
1200
 
1139
- private func attachPurchaseUpdatedSubIfNeeded() {
1201
+ private func attachPurchaseUpdatedSubIfNeeded(expectedEpoch: UInt64) {
1140
1202
  listenerLock.withLock {
1141
- guard purchaseUpdatedSub == nil else {
1142
- return
1143
- }
1203
+ guard isInitialized,
1204
+ connectionEpoch == expectedEpoch,
1205
+ purchaseUpdatedSub == nil else { return }
1144
1206
  RnIapLog.payload("purchaseUpdatedListener.register", nil)
1145
1207
  purchaseUpdatedSub = OpenIapModule.shared.purchaseUpdatedListener { [weak self] openIapPurchase in
1146
1208
  guard let self else {
@@ -1148,6 +1210,7 @@ class HybridRnIap: HybridRnIapSpec {
1148
1210
  return
1149
1211
  }
1150
1212
  Task { @MainActor in
1213
+ guard self.isCurrentConnection(expectedEpoch) else { return }
1151
1214
  let rawPayload = OpenIapSerialization.purchase(openIapPurchase)
1152
1215
  let payload = RnIapHelper.sanitizeDictionary(rawPayload)
1153
1216
  RnIapLog.result("purchaseUpdatedListener", payload)
@@ -1162,11 +1225,12 @@ class HybridRnIap: HybridRnIapSpec {
1162
1225
  }
1163
1226
  }
1164
1227
 
1165
- private func attachDuplicatePurchaseUpdatedSubIfNeeded() {
1228
+ private func attachDuplicatePurchaseUpdatedSubIfNeeded(expectedEpoch: UInt64) {
1166
1229
  listenerLock.withLock {
1167
- guard purchaseUpdatedDuplicateSub == nil else {
1168
- return
1169
- }
1230
+ guard isInitialized,
1231
+ connectionEpoch == expectedEpoch,
1232
+ purchaseUpdatedDuplicateSub == nil,
1233
+ !purchaseUpdatedDuplicateListeners.isEmpty else { return }
1170
1234
  RnIapLog.payload("purchaseUpdatedListener.register.duplicates", nil)
1171
1235
  let options = OpenIAP.PurchaseUpdatedListenerOptions(
1172
1236
  dedupeTransactionIOS: false
@@ -1177,6 +1241,7 @@ class HybridRnIap: HybridRnIapSpec {
1177
1241
  return
1178
1242
  }
1179
1243
  Task { @MainActor in
1244
+ guard self.isCurrentConnection(expectedEpoch) else { return }
1180
1245
  let rawPayload = OpenIapSerialization.purchase(openIapPurchase)
1181
1246
  let payload = RnIapHelper.sanitizeDictionary(rawPayload)
1182
1247
  RnIapLog.result("purchaseUpdatedListener.duplicates", payload)
@@ -1191,32 +1256,46 @@ class HybridRnIap: HybridRnIapSpec {
1191
1256
  }
1192
1257
  }
1193
1258
 
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)
1259
+ private func attachSubscriptionBillingIssueSubIfNeeded(expectedEpoch: UInt64) {
1260
+ listenerLock.withLock {
1261
+ guard isInitialized,
1262
+ connectionEpoch == expectedEpoch,
1263
+ subscriptionBillingIssueSub == nil,
1264
+ !subscriptionBillingIssueListeners.isEmpty else { return }
1265
+ RnIapLog.payload("subscriptionBillingIssueListener.register", nil)
1266
+ subscriptionBillingIssueSub = OpenIapModule.shared.subscriptionBillingIssueListener { [weak self] openIapPurchase in
1267
+ guard let self else {
1268
+ RnIapLog.warn("subscriptionBillingIssueListener: HybridRnIap deallocated, event dropped")
1269
+ return
1270
+ }
1271
+ Task { @MainActor in
1272
+ guard self.isCurrentConnection(expectedEpoch) else { return }
1273
+ let payload = RnIapHelper.sanitizeDictionary(OpenIapSerialization.purchase(openIapPurchase))
1274
+ RnIapLog.result("subscriptionBillingIssueListener", payload)
1275
+ let nitro = RnIapHelper.convertPurchaseDictionary(payload)
1276
+ let snapshot: [(NitroPurchase) -> Void] = self.listenerLock.withLock {
1277
+ Array(self.subscriptionBillingIssueListeners)
1278
+ }
1279
+ for listener in snapshot { listener(nitro) }
1208
1280
  }
1209
- for l in snapshot { l(nitro) }
1210
1281
  }
1282
+ RnIapLog.result("subscriptionBillingIssueListener.register", "attached")
1211
1283
  }
1212
- RnIapLog.result("subscriptionBillingIssueListener.register", "attached")
1213
1284
  }
1214
1285
 
1215
1286
  private func ensureConnection() throws {
1216
- guard isInitialized else {
1287
+ guard isConnectionInitialized() else {
1217
1288
  throw OpenIapException.make(code: .initConnection, message: "Connection not initialized. Call initConnection() first.")
1218
1289
  }
1219
1290
  }
1291
+
1292
+ private func isConnectionInitialized() -> Bool {
1293
+ listenerLock.withLock { isInitialized }
1294
+ }
1295
+
1296
+ private func isCurrentConnection(_ epoch: UInt64) -> Bool {
1297
+ listenerLock.withLock { isInitialized && connectionEpoch == epoch }
1298
+ }
1220
1299
 
1221
1300
  private func sendPurchaseUpdate(_ purchase: NitroPurchase, includeDuplicateListeners: Bool) {
1222
1301
  let snapshot: [(NitroPurchase) -> Void] = listenerLock.withLock {
@@ -1259,7 +1338,12 @@ class HybridRnIap: HybridRnIapSpec {
1259
1338
  debugMessage: error.debugMessage,
1260
1339
  code: error.code,
1261
1340
  message: error.message,
1262
- purchaseToken: nil
1341
+ purchaseToken: nil,
1342
+ productId: error.productId,
1343
+ productIds: error.productIds,
1344
+ productType: error.productType,
1345
+ isEmptyProductList: error.isEmptyProductList,
1346
+ subResponseCodeAndroid: error.subResponseCodeAndroid
1263
1347
  )
1264
1348
  } else {
1265
1349
  sanitized = error
@@ -1274,60 +1358,51 @@ class HybridRnIap: HybridRnIapSpec {
1274
1358
  sendPurchaseError(error, productId: productId)
1275
1359
  }
1276
1360
 
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)
1361
+ private func detachConnectionState() -> [(label: String, subscription: Subscription)] {
1317
1362
  listenerLock.withLock {
1363
+ connectionEpoch &+= 1
1364
+ isInitialized = false
1365
+
1366
+ var subscriptions: [(label: String, subscription: Subscription)] = []
1367
+ if let purchaseUpdatedSub {
1368
+ subscriptions.append(("purchaseUpdated", purchaseUpdatedSub))
1369
+ }
1370
+ if let purchaseUpdatedDuplicateSub {
1371
+ subscriptions.append(("purchaseUpdatedDuplicate", purchaseUpdatedDuplicateSub))
1372
+ }
1373
+ if let purchaseErrorSub {
1374
+ subscriptions.append(("purchaseError", purchaseErrorSub))
1375
+ }
1376
+ if let promotedProductSub {
1377
+ subscriptions.append(("promotedProduct", promotedProductSub))
1378
+ }
1379
+ if let subscriptionBillingIssueSub {
1380
+ subscriptions.append(("subscriptionBillingIssue", subscriptionBillingIssueSub))
1381
+ }
1382
+
1383
+ purchaseUpdatedSub = nil
1384
+ purchaseUpdatedDuplicateSub = nil
1385
+ purchaseErrorSub = nil
1386
+ promotedProductSub = nil
1387
+ subscriptionBillingIssueSub = nil
1318
1388
  purchaseUpdatedListeners.removeAll()
1319
1389
  purchaseUpdatedDuplicateListeners.removeAll()
1320
1390
  purchaseUpdatedListenerRegistrations.removeAll()
1321
- nextPurchaseUpdatedListenerToken = 1
1322
1391
  purchaseErrorListeners.removeAll()
1323
1392
  promotedProductListeners.removeAll()
1324
1393
  subscriptionBillingIssueListeners.removeAll()
1325
1394
  lastPurchaseErrorKey = nil
1326
1395
  lastPurchaseErrorTimestamp = 0
1396
+ return subscriptions
1327
1397
  }
1328
- // Clear purchasePayloadById on MainActor to match its access pattern
1329
- Task { @MainActor in
1330
- self.purchasePayloadById.removeAll()
1398
+ }
1399
+
1400
+ private func removeSubscriptions(
1401
+ _ subscriptions: [(label: String, subscription: Subscription)]
1402
+ ) {
1403
+ for subscription in subscriptions {
1404
+ RnIapLog.payload("removeListener", subscription.label)
1405
+ OpenIapModule.shared.removeListener(subscription.subscription)
1331
1406
  }
1332
1407
  }
1333
1408