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
@@ -0,0 +1,113 @@
1
+ package com.margelo.nitro.iap
2
+
3
+ import kotlinx.coroutines.CompletableDeferred
4
+
5
+ /**
6
+ * Preserves invocation order for connection lifecycle calls before their
7
+ * coroutine bodies are scheduled. Consecutive init calls share one flight;
8
+ * an intervening end call invalidates that flight and closes the join window.
9
+ */
10
+ internal class ConnectionLifecycleQueue {
11
+ internal class Invocation<T> internal constructor(
12
+ private val awaitResult: suspend () -> T,
13
+ ) {
14
+ suspend fun await(): T = awaitResult()
15
+ }
16
+
17
+ private data class InitFlight(
18
+ val predecessor: CompletableDeferred<Unit>,
19
+ val completion: CompletableDeferred<Unit>,
20
+ val result: CompletableDeferred<Boolean>,
21
+ var invalidation: Throwable? = null,
22
+ )
23
+
24
+ private val lock = Any()
25
+ private var tail = CompletableDeferred(Unit)
26
+ private var joinableInit: InitFlight? = null
27
+
28
+ fun enqueueInit(
29
+ operation: suspend () -> Boolean,
30
+ onCommitted: (Boolean) -> Unit,
31
+ onFailed: (Throwable) -> Unit,
32
+ ): Invocation<Boolean> {
33
+ synchronized(lock) {
34
+ joinableInit?.let { flight ->
35
+ return Invocation { flight.result.await() }
36
+ }
37
+
38
+ val completion = CompletableDeferred<Unit>()
39
+ val flight =
40
+ InitFlight(
41
+ predecessor = tail,
42
+ completion = completion,
43
+ result = CompletableDeferred(),
44
+ )
45
+ tail = completion
46
+ joinableInit = flight
47
+
48
+ return Invocation {
49
+ try {
50
+ flight.predecessor.await()
51
+ synchronized(lock) { flight.invalidation }?.let { throw it }
52
+
53
+ val value = operation()
54
+ val committed =
55
+ synchronized(lock) {
56
+ if (flight.invalidation == null) {
57
+ onCommitted(value)
58
+ flight.result.complete(value)
59
+ true
60
+ } else {
61
+ false
62
+ }
63
+ }
64
+ if (!committed) {
65
+ throw synchronized(lock) {
66
+ checkNotNull(flight.invalidation)
67
+ }
68
+ }
69
+ } catch (error: Throwable) {
70
+ val effectiveError =
71
+ synchronized(lock) {
72
+ flight.invalidation ?: error
73
+ }
74
+ runCatching { onFailed(effectiveError) }
75
+ flight.result.completeExceptionally(effectiveError)
76
+ } finally {
77
+ synchronized(lock) {
78
+ if (joinableInit === flight) joinableInit = null
79
+ }
80
+ flight.completion.complete(Unit)
81
+ }
82
+
83
+ flight.result.await()
84
+ }
85
+ }
86
+ }
87
+
88
+ fun enqueueEnd(
89
+ pendingInitError: Throwable,
90
+ operation: suspend () -> Boolean,
91
+ ): Invocation<Boolean> {
92
+ val predecessor: CompletableDeferred<Unit>
93
+ val completion = CompletableDeferred<Unit>()
94
+ synchronized(lock) {
95
+ joinableInit?.let { flight ->
96
+ flight.invalidation = pendingInitError
97
+ flight.result.completeExceptionally(pendingInitError)
98
+ }
99
+ joinableInit = null
100
+ predecessor = tail
101
+ tail = completion
102
+ }
103
+
104
+ return Invocation {
105
+ try {
106
+ predecessor.await()
107
+ operation()
108
+ } finally {
109
+ completion.complete(Unit)
110
+ }
111
+ }
112
+ }
113
+ }
@@ -58,7 +58,6 @@ import java.util.Locale
58
58
  import kotlin.coroutines.cancellation.CancellationException
59
59
  import kotlinx.coroutines.Dispatchers
60
60
  import kotlinx.coroutines.withContext
61
- import kotlinx.coroutines.CompletableDeferred
62
61
  import org.json.JSONArray
63
62
  import org.json.JSONObject
64
63
 
@@ -78,6 +77,15 @@ class OpenIapException(private val errorJson: String, cause: Throwable? = null)
78
77
  }
79
78
  }
80
79
 
80
+ internal suspend fun endRnConnectionWithCleanup(
81
+ endConnection: suspend () -> Boolean,
82
+ cleanup: () -> Unit,
83
+ ): Boolean = try {
84
+ endConnection()
85
+ } finally {
86
+ cleanup()
87
+ }
88
+
81
89
  class HybridRnIap : HybridRnIapSpec() {
82
90
  private data class PurchaseUpdatedListenerRegistration(
83
91
  val token: Double,
@@ -103,14 +111,24 @@ class HybridRnIap : HybridRnIapSpec() {
103
111
  private val subscriptionBillingIssueListeners = mutableListOf<(NitroPurchase) -> Unit>()
104
112
  private var listenersAttached = false
105
113
  private var isInitialized = false
106
- private var initDeferred: CompletableDeferred<Boolean>? = null
107
- private val initLock = Any()
114
+ private val connectionLifecycleQueue = ConnectionLifecycleQueue()
108
115
 
109
116
  // Connection methods
110
117
  // Variant wrapper helpers for nitrogen 0.35.0 compatibility
111
118
  private fun String?.wrapVariant(): Variant_NullType_String? = this?.let { Variant_NullType_String.Second(it) }
112
119
  private fun Double?.wrapVariant(): Variant_NullType_Double? = this?.let { Variant_NullType_Double.Second(it) }
113
120
  private fun Boolean?.wrapVariant(): Variant_NullType_Boolean? = this?.let { Variant_NullType_Boolean.Second(it) }
121
+ private fun List<String>?.wrapVariant(): Variant_NullType_Array_String_? =
122
+ this?.let { Variant_NullType_Array_String_.Second(it.toTypedArray()) }
123
+ private fun dev.hyo.openiap.PendingPurchaseUpdateAndroid?.wrapVariant(): Variant_NullType_PendingPurchaseUpdateAndroid? =
124
+ this?.let {
125
+ Variant_NullType_PendingPurchaseUpdateAndroid.Second(
126
+ PendingPurchaseUpdateAndroid(
127
+ products = it.products.toTypedArray(),
128
+ purchaseToken = it.purchaseToken
129
+ )
130
+ )
131
+ }
114
132
  private fun Variant_NullType_String?.unwrapString(): String? = (this as? Variant_NullType_String.Second)?.value
115
133
  private fun Variant_NullType_Double?.unwrapDouble(): Double? = (this as? Variant_NullType_Double.Second)?.value
116
134
  private fun Variant_NullType_Boolean?.unwrapBool(): Boolean? = (this as? Variant_NullType_Boolean.Second)?.value
@@ -120,14 +138,10 @@ class HybridRnIap : HybridRnIapSpec() {
120
138
  }
121
139
 
122
140
  override fun initConnection(config: Variant_NullType_InitConnectionConfig?): Promise<Boolean> {
123
- return Promise.async {
124
- val configValue = (config as? Variant_NullType_InitConnectionConfig.Second)?.value
141
+ val configValue = (config as? Variant_NullType_InitConnectionConfig.Second)?.value
142
+ val performInit: suspend () -> Boolean = initOperation@{
125
143
  RnIapLog.payload("initConnection", configValue)
126
- // Fast-path: if already initialized, return immediately
127
- if (isInitialized) {
128
- RnIapLog.result("initConnection", true)
129
- return@async true
130
- }
144
+ if (isInitialized) return@initOperation true
131
145
 
132
146
  // CRITICAL: Set Activity BEFORE calling initConnection
133
147
  // Horizon SDK needs Activity to initialize OVRPlatform with proper returnComponent
@@ -162,28 +176,14 @@ class HybridRnIap : HybridRnIapSpec() {
162
176
  )
163
177
  }
164
178
 
165
- // Single-flight: capture or create the shared Deferred atomically
166
- val wasExisting = synchronized(initLock) {
167
- if (initDeferred == null) {
168
- initDeferred = CompletableDeferred()
169
- false
170
- } else true
171
- }
172
- if (wasExisting) {
173
- val result = initDeferred!!.await()
174
- RnIapLog.result("initConnection.await", result)
175
- return@async result
176
- }
177
-
178
179
  try {
179
180
  if (!listenersAttached) {
180
- listenersAttached = true
181
181
  RnIapLog.payload("listeners.attach", null)
182
182
  openIap.addPurchaseUpdateListener(OpenIapPurchaseUpdateListener { p ->
183
183
  runCatching {
184
184
  RnIapLog.result(
185
185
  "purchaseUpdatedListener",
186
- mapOf("id" to p.id, "sku" to p.productId)
186
+ mapOf("productId" to p.productId)
187
187
  )
188
188
  sendPurchaseUpdate(convertToNitroPurchase(p))
189
189
  }.onFailure { RnIapLog.failure("purchaseUpdatedListener", it) }
@@ -205,8 +205,30 @@ class HybridRnIap : HybridRnIapSpec() {
205
205
  "userChoiceBillingListener",
206
206
  mapOf("products" to details.products, "token" to details.externalTransactionToken)
207
207
  )
208
+ val originalTransactionId = runCatching {
209
+ details.javaClass
210
+ .getMethod("getOriginalExternalTransactionId")
211
+ .invoke(details) as? String
212
+ }.getOrNull()
213
+ val productDetails = runCatching {
214
+ (details.javaClass.getMethod("getProductDetailsAndroid").invoke(details) as? List<*>)
215
+ ?.mapNotNull { it as? dev.hyo.openiap.DeveloperProvidedBillingProductAndroid }
216
+ }.getOrNull()
208
217
  val nitroDetails = UserChoiceBillingDetails(
209
218
  externalTransactionToken = details.externalTransactionToken,
219
+ originalExternalTransactionId = originalTransactionId.wrapVariant(),
220
+ productDetailsAndroid = productDetails?.map { product ->
221
+ DeveloperProvidedBillingProductAndroid(
222
+ id = product.id,
223
+ offerToken = product.offerToken.wrapVariant(),
224
+ type = when (product.type) {
225
+ OpenIapProductType.InApp -> ProductType.IN_APP
226
+ OpenIapProductType.Subs -> ProductType.SUBS
227
+ }
228
+ )
229
+ }?.toTypedArray()?.let {
230
+ Variant_NullType_Array_DeveloperProvidedBillingProductAndroid_.Second(it)
231
+ },
210
232
  products = details.products.toTypedArray()
211
233
  )
212
234
  sendUserChoiceBilling(nitroDetails)
@@ -237,6 +259,7 @@ class HybridRnIap : HybridRnIapSpec() {
237
259
  sendDeveloperProvidedBilling(nitroDetails)
238
260
  }.onFailure { RnIapLog.failure("developerProvidedBillingListener", it) }
239
261
  })
262
+ listenersAttached = true
240
263
  RnIapLog.result("listeners.attach", "attached")
241
264
  }
242
265
  } catch (err: CancellationException) {
@@ -253,18 +276,10 @@ class HybridRnIap : HybridRnIapSpec() {
253
276
  messageOverride = "Failed to register billing listeners: $errorMessage"
254
277
  )
255
278
  )
256
- synchronized(initLock) {
257
- initDeferred?.let { deferred ->
258
- if (!deferred.isCompleted) deferred.completeExceptionally(wrapped)
259
- }
260
- initDeferred = null
261
- }
262
279
  isInitialized = false
263
280
  throw wrapped
264
281
  }
265
282
 
266
- // We created it above; reuse the shared instance
267
- val deferred = initDeferred!!
268
283
  try {
269
284
  // Convert Nitro config to OpenIAP config
270
285
  // Note: enableBillingProgramAndroid is passed to OpenIapInitConnectionConfig
@@ -289,6 +304,8 @@ class HybridRnIap : HybridRnIapSpec() {
289
304
  withContext(Dispatchers.Main) {
290
305
  openIap.initConnection(openIapConfig)
291
306
  }
307
+ } catch (err: CancellationException) {
308
+ throw err
292
309
  } catch (err: Throwable) {
293
310
  val error = OpenIapError.InitConnection
294
311
  RnIapLog.failure("initConnection.native", err)
@@ -310,42 +327,57 @@ class HybridRnIap : HybridRnIapSpec() {
310
327
  )
311
328
  )
312
329
  }
313
- isInitialized = true
314
- deferred.complete(true)
315
- RnIapLog.result("initConnection", true)
316
330
  true
317
331
  } catch (e: Exception) {
318
- // Complete exceptionally so all concurrent awaiters receive the same failure
319
- if (!deferred.isCompleted) deferred.completeExceptionally(e)
320
- isInitialized = false
321
332
  RnIapLog.failure("initConnection", e)
322
333
  throw e
323
- } finally {
324
- initDeferred = null
325
334
  }
326
335
  }
336
+ val invocation = connectionLifecycleQueue.enqueueInit(
337
+ operation = performInit,
338
+ onCommitted = { value ->
339
+ isInitialized = value
340
+ RnIapLog.result("initConnection", value)
341
+ },
342
+ onFailed = { isInitialized = false }
343
+ )
344
+ return Promise.async {
345
+ invocation.await()
346
+ }
327
347
  }
328
348
 
329
349
  override fun endConnection(): Promise<Boolean> {
330
- return Promise.async {
350
+ val pendingInitError = OpenIapException(
351
+ toErrorJson(
352
+ error = OpenIapError.ServiceDisconnected(
353
+ "Connection ended while initialization was in progress"
354
+ )
355
+ )
356
+ )
357
+ val invocation = connectionLifecycleQueue.enqueueEnd(pendingInitError) {
331
358
  RnIapLog.payload("endConnection", null)
332
- runCatching { openIap.endConnection() }
333
- productTypeBySku.clear()
334
- isInitialized = false
335
- listenersAttached = false
336
- synchronized(purchaseUpdatedListeners) {
337
- purchaseUpdatedListeners.clear()
338
- nextPurchaseUpdatedListenerToken = 1.0
339
- }
340
- synchronized(purchaseErrorListeners) { purchaseErrorListeners.clear() }
341
- promotedProductListenersIOS.clear()
342
- synchronized(userChoiceBillingListenersAndroid) { userChoiceBillingListenersAndroid.clear() }
343
- synchronized(developerProvidedBillingListenersAndroid) { developerProvidedBillingListenersAndroid.clear() }
344
- synchronized(subscriptionBillingIssueListeners) { subscriptionBillingIssueListeners.clear() }
345
- detachSubscriptionBillingIssueIfNeeded()
346
- initDeferred = null
347
- RnIapLog.result("endConnection", true)
348
- true
359
+ val result = endRnConnectionWithCleanup(
360
+ endConnection = { openIap.endConnection() },
361
+ cleanup = {
362
+ productTypeBySku.clear()
363
+ isInitialized = false
364
+ // Native listener sets persist; clear only bridge callbacks.
365
+ synchronized(purchaseUpdatedListeners) {
366
+ purchaseUpdatedListeners.clear()
367
+ nextPurchaseUpdatedListenerToken = 1.0
368
+ }
369
+ synchronized(purchaseErrorListeners) { purchaseErrorListeners.clear() }
370
+ promotedProductListenersIOS.clear()
371
+ synchronized(userChoiceBillingListenersAndroid) { userChoiceBillingListenersAndroid.clear() }
372
+ synchronized(developerProvidedBillingListenersAndroid) { developerProvidedBillingListenersAndroid.clear() }
373
+ clearSubscriptionBillingIssueListeners()
374
+ },
375
+ )
376
+ RnIapLog.result("endConnection", result)
377
+ result
378
+ }
379
+ return Promise.async {
380
+ invocation.await()
349
381
  }
350
382
  }
351
383
 
@@ -572,14 +604,13 @@ class HybridRnIap : HybridRnIapSpec() {
572
604
  openIap.requestPurchase(requestProps)
573
605
  }
574
606
  val purchases = result.purchasesOrEmpty()
575
- purchases.forEach { p ->
576
- runCatching {
577
- RnIapLog.result(
578
- "requestPurchase.native",
579
- mapOf("id" to p.id, "sku" to p.productId)
580
- )
581
- }.onFailure { RnIapLog.failure("requestPurchase.native", it) }
582
- }
607
+ RnIapLog.result(
608
+ "requestPurchase.native",
609
+ mapOf(
610
+ "purchaseCount" to purchases.size,
611
+ "productIds" to purchases.map { it.productId }
612
+ )
613
+ )
583
614
 
584
615
  defaultResult
585
616
  } catch (e: Exception) {
@@ -639,7 +670,10 @@ class HybridRnIap : HybridRnIapSpec() {
639
670
  }
640
671
  RnIapLog.result(
641
672
  "getAvailablePurchases",
642
- result.map { mapOf("id" to it.id, "sku" to it.productId) }
673
+ mapOf(
674
+ "purchaseCount" to result.size,
675
+ "productIds" to result.map { it.productId }
676
+ )
643
677
  )
644
678
  result.map { convertToNitroPurchase(it) }.toTypedArray()
645
679
  }
@@ -752,7 +786,12 @@ class HybridRnIap : HybridRnIapSpec() {
752
786
  debugMessage = "Missing purchaseToken",
753
787
  code = OpenIapError.toCode(OpenIapError.DeveloperError()),
754
788
  message = "Missing purchaseToken",
755
- purchaseToken = null
789
+ purchaseToken = null,
790
+ productId = null,
791
+ productIds = null,
792
+ productType = null,
793
+ isEmptyProductList = null,
794
+ subResponseCodeAndroid = null
756
795
  )
757
796
  )
758
797
  }
@@ -768,7 +807,12 @@ class HybridRnIap : HybridRnIapSpec() {
768
807
  debugMessage = e.message,
769
808
  code = OpenIapError.toCode(err),
770
809
  message = e.message?.takeIf { it.isNotBlank() } ?: err.message,
771
- purchaseToken = purchaseToken
810
+ purchaseToken = purchaseToken,
811
+ productId = null,
812
+ productIds = null,
813
+ productType = null,
814
+ isEmptyProductList = null,
815
+ subResponseCodeAndroid = null
772
816
  )
773
817
  )
774
818
  }
@@ -785,7 +829,12 @@ class HybridRnIap : HybridRnIapSpec() {
785
829
  debugMessage = null,
786
830
  code = "0",
787
831
  message = "OK",
788
- purchaseToken = purchaseToken
832
+ purchaseToken = purchaseToken,
833
+ productId = null,
834
+ productIds = null,
835
+ productType = null,
836
+ isEmptyProductList = null,
837
+ subResponseCodeAndroid = null
789
838
  )
790
839
  )
791
840
  RnIapLog.result("finishTransaction", mapOf("success" to true))
@@ -799,7 +848,12 @@ class HybridRnIap : HybridRnIapSpec() {
799
848
  debugMessage = e.message,
800
849
  code = OpenIapError.toCode(err),
801
850
  message = e.message?.takeIf { it.isNotBlank() } ?: err.message,
802
- purchaseToken = null
851
+ purchaseToken = null,
852
+ productId = null,
853
+ productIds = null,
854
+ productType = null,
855
+ isEmptyProductList = null,
856
+ subResponseCodeAndroid = null
803
857
  )
804
858
  )
805
859
  }
@@ -812,11 +866,30 @@ class HybridRnIap : HybridRnIapSpec() {
812
866
  ensureConnection()
813
867
  RnIapLog.payload("getStorefront", null)
814
868
  val value = openIap.getStorefront()
869
+ if (value.isBlank()) {
870
+ throw OpenIapError.ServiceUnavailable(
871
+ "Storefront lookup returned no country code"
872
+ )
873
+ }
815
874
  RnIapLog.result("getStorefront", value)
816
875
  value
876
+ } catch (e: OpenIapException) {
877
+ RnIapLog.failure("getStorefront", e)
878
+ throw e
879
+ } catch (e: OpenIapError) {
880
+ RnIapLog.failure("getStorefront", e)
881
+ throw OpenIapException(toErrorJson(e))
817
882
  } catch (e: Exception) {
818
883
  RnIapLog.failure("getStorefront", e)
819
- ""
884
+ val error = OpenIapError.ServiceUnavailable(e.message)
885
+ throw OpenIapException(
886
+ toErrorJson(
887
+ error = error,
888
+ debugMessage = e.message,
889
+ messageOverride = "Failed to get storefront"
890
+ ),
891
+ e
892
+ )
820
893
  }
821
894
  }
822
895
  }
@@ -913,7 +986,12 @@ class HybridRnIap : HybridRnIapSpec() {
913
986
  debugMessage = debugMessage,
914
987
  code = errorCode,
915
988
  message = message,
916
- purchaseToken = null
989
+ purchaseToken = null,
990
+ productId = sku,
991
+ productIds = null,
992
+ productType = null,
993
+ isEmptyProductList = null,
994
+ subResponseCodeAndroid = null
917
995
  )
918
996
  }
919
997
 
@@ -1117,11 +1195,16 @@ class HybridRnIap : HybridRnIapSpec() {
1117
1195
  productId = purchase.productId,
1118
1196
  transactionDate = purchase.transactionDate,
1119
1197
  purchaseToken = purchase.purchaseToken.wrapVariant(),
1198
+ currentPlanId = purchase.currentPlanId.wrapVariant(),
1199
+ ids = purchase.ids.wrapVariant(),
1120
1200
  platform = IapPlatform.ANDROID,
1121
1201
  store = mapIapStore(purchase.store),
1122
1202
  quantity = purchase.quantity.toDouble(),
1123
1203
  purchaseState = mapPurchaseState(purchase.purchaseState),
1124
1204
  isAutoRenewing = purchase.isAutoRenewing,
1205
+ advancedCommerceInfoIOS = null,
1206
+ billingPlanTypeIOS = null,
1207
+ commitmentInfoIOS = null,
1125
1208
  quantityIOS = null,
1126
1209
  originalTransactionDateIOS = null,
1127
1210
  originalTransactionIdentifierIOS = null,
@@ -1154,7 +1237,8 @@ class HybridRnIap : HybridRnIapSpec() {
1154
1237
  obfuscatedAccountIdAndroid = androidPurchase?.obfuscatedAccountIdAndroid.wrapVariant(),
1155
1238
  obfuscatedProfileIdAndroid = androidPurchase?.obfuscatedProfileIdAndroid.wrapVariant(),
1156
1239
  developerPayloadAndroid = androidPurchase?.developerPayloadAndroid.wrapVariant(),
1157
- isSuspendedAndroid = androidPurchase?.isSuspendedAndroid.wrapVariant()
1240
+ isSuspendedAndroid = androidPurchase?.isSuspendedAndroid.wrapVariant(),
1241
+ pendingPurchaseUpdateAndroid = androidPurchase?.pendingPurchaseUpdateAndroid.wrapVariant()
1158
1242
  )
1159
1243
  }
1160
1244
 
@@ -1225,10 +1309,10 @@ class HybridRnIap : HybridRnIapSpec() {
1225
1309
  }
1226
1310
  }
1227
1311
 
1228
- override fun buyPromotedProductIOS(): Promise<Unit> {
1312
+ override fun buyPromotedProductIOS(): Promise<Boolean> {
1229
1313
  return Promise.async {
1230
1314
  // Android doesn't have promoted products like iOS App Store
1231
- // This is an iOS-only feature, so we do nothing on Android
1315
+ false
1232
1316
  }
1233
1317
  }
1234
1318
 
@@ -1310,11 +1394,17 @@ class HybridRnIap : HybridRnIapSpec() {
1310
1394
 
1311
1395
  // Call OpenIAP's verifyPurchase - this makes the actual Google Play API call
1312
1396
  val verifyResult = openIap.verifyPurchase(props)
1313
- RnIapLog.result("validateReceipt", verifyResult.toString())
1314
1397
 
1315
1398
  // Cast to Android result type (on Android, verifyPurchase returns VerifyPurchaseResultAndroid)
1316
1399
  val androidResult = verifyResult as? VerifyPurchaseResultAndroid
1317
1400
  ?: throw OpenIapException(toErrorJson(OpenIapError.InvalidPurchaseVerification, debugMessage = "Unexpected result type from verifyPurchase"))
1401
+ RnIapLog.result(
1402
+ "validateReceipt",
1403
+ mapOf(
1404
+ "productId" to androidResult.productId,
1405
+ "testTransaction" to androidResult.testTransaction
1406
+ )
1407
+ )
1318
1408
 
1319
1409
  // Convert OpenIAP result to Nitro result
1320
1410
  val result = NitroReceiptValidationResultAndroid(
@@ -1372,6 +1462,7 @@ class HybridRnIap : HybridRnIapSpec() {
1372
1462
  // Use provided apiKey, or fallback to host app AndroidManifest meta-data.
1373
1463
  val apiKey = iapkit.apiKey.unwrapString() ?: getIapkitApiKeyFromManifest()
1374
1464
  apiKey?.let { iapkitMap["apiKey"] = it }
1465
+ iapkit.baseUrl.unwrapString()?.let { iapkitMap["baseUrl"] = it }
1375
1466
  (iapkit.google as? Variant_NullType_NitroVerifyPurchaseWithIapkitGoogleProps.Second)?.value?.let { google ->
1376
1467
  iapkitMap["google"] = mapOf("purchaseToken" to google.purchaseToken)
1377
1468
  }
@@ -1561,7 +1652,10 @@ class HybridRnIap : HybridRnIapSpec() {
1561
1652
  val token = withContext(Dispatchers.Main) {
1562
1653
  openIap.createAlternativeBillingReportingToken()
1563
1654
  }
1564
- RnIapLog.result("createAlternativeBillingTokenAndroid", token)
1655
+ RnIapLog.result(
1656
+ "createAlternativeBillingTokenAndroid",
1657
+ if (token.isNullOrBlank()) "<empty>" else "<token>"
1658
+ )
1565
1659
  token?.let { Variant_NullType_String.Second(it) } ?: Variant_NullType_String.First(NullType.NULL)
1566
1660
  } catch (err: Throwable) {
1567
1661
  RnIapLog.failure("createAlternativeBillingTokenAndroid", err)
@@ -1618,15 +1712,19 @@ class HybridRnIap : HybridRnIapSpec() {
1618
1712
  private var subscriptionBillingIssueNativeListener: dev.hyo.openiap.listener.OpenIapSubscriptionBillingIssueListener? = null
1619
1713
 
1620
1714
  override fun addSubscriptionBillingIssueListener(listener: (purchase: NitroPurchase) -> Unit) {
1621
- synchronized(subscriptionBillingIssueListeners) {
1622
- subscriptionBillingIssueListeners.add(listener)
1715
+ synchronized(subscriptionBillingIssueAttachLock) {
1716
+ synchronized(subscriptionBillingIssueListeners) {
1717
+ subscriptionBillingIssueListeners.add(listener)
1718
+ }
1719
+ attachSubscriptionBillingIssueIfNeeded()
1623
1720
  }
1624
- attachSubscriptionBillingIssueIfNeeded()
1625
1721
  }
1626
1722
 
1627
1723
  override fun removeSubscriptionBillingIssueListener(listener: (purchase: NitroPurchase) -> Unit) {
1628
- synchronized(subscriptionBillingIssueListeners) {
1629
- subscriptionBillingIssueListeners.remove(listener)
1724
+ synchronized(subscriptionBillingIssueAttachLock) {
1725
+ synchronized(subscriptionBillingIssueListeners) {
1726
+ subscriptionBillingIssueListeners.remove(listener)
1727
+ }
1630
1728
  }
1631
1729
  }
1632
1730
 
@@ -1658,6 +1756,15 @@ class HybridRnIap : HybridRnIapSpec() {
1658
1756
  }
1659
1757
  }
1660
1758
 
1759
+ private fun clearSubscriptionBillingIssueListeners() {
1760
+ synchronized(subscriptionBillingIssueAttachLock) {
1761
+ synchronized(subscriptionBillingIssueListeners) {
1762
+ subscriptionBillingIssueListeners.clear()
1763
+ }
1764
+ detachSubscriptionBillingIssueIfNeeded()
1765
+ }
1766
+ }
1767
+
1661
1768
  // -------------------------------------------------------------------------
1662
1769
  // Billing Programs API (Android 8.2.0+)
1663
1770
  // -------------------------------------------------------------------------
@@ -2048,6 +2155,13 @@ class HybridRnIap : HybridRnIapSpec() {
2048
2155
  ?: OpenIapError.Companion.defaultMessage(code)
2049
2156
  val diagnostics = error.toJSON()
2050
2157
  val responseCode = (diagnostics["responseCode"] as? Number)?.toInt()
2158
+ val diagnosticProductId = productId
2159
+ ?: diagnostics["productId"] as? String
2160
+ ?: when (error) {
2161
+ is OpenIapError.ProductNotFound -> error.productId
2162
+ is OpenIapError.SkuNotFound -> error.sku
2163
+ else -> null
2164
+ }
2051
2165
  val productIds = diagnostics["productIds"] as? List<*>
2052
2166
  val productType = diagnostics["productType"] as? String
2053
2167
  val isEmptyProductList = diagnostics["isEmptyProductList"] as? Boolean
@@ -2057,15 +2171,18 @@ class HybridRnIap : HybridRnIapSpec() {
2057
2171
  "message" to message
2058
2172
  )
2059
2173
 
2060
- errorMap["responseCode"] = responseCode ?: -1
2174
+ responseCode?.let { errorMap["responseCode"] = it }
2061
2175
  debugMessage
2062
2176
  ?.let { errorMap["debugMessage"] = it }
2063
2177
  ?: (diagnostics["debugMessage"] as? String)?.let { errorMap["debugMessage"] = it }
2064
2178
  ?: error.message?.let { errorMap["debugMessage"] = it }
2065
- productId?.let { errorMap["productId"] = it }
2179
+ diagnosticProductId?.let { errorMap["productId"] = it }
2066
2180
  if (!productIds.isNullOrEmpty()) errorMap["productIds"] = productIds
2067
2181
  productType?.let { errorMap["productType"] = it }
2068
2182
  isEmptyProductList?.let { errorMap["isEmptyProductList"] = it }
2183
+ (diagnostics["subResponseCodeAndroid"] as? String)?.let {
2184
+ errorMap["subResponseCodeAndroid"] = it
2185
+ }
2069
2186
 
2070
2187
  return try {
2071
2188
  JSONObject(errorMap).toString()
@@ -2135,12 +2252,30 @@ class HybridRnIap : HybridRnIapSpec() {
2135
2252
  val diagnostics = error.toJSON()
2136
2253
  val responseCode = (diagnostics["responseCode"] as? Number)?.toDouble()
2137
2254
  val diagnosticMessage = diagnostics["debugMessage"] as? String
2255
+ val diagnosticProductId = productId
2256
+ ?: diagnostics["productId"] as? String
2257
+ ?: when (error) {
2258
+ is OpenIapError.ProductNotFound -> error.productId
2259
+ is OpenIapError.SkuNotFound -> error.sku
2260
+ else -> null
2261
+ }
2262
+ val productIds = (diagnostics["productIds"] as? Iterable<*>)
2263
+ ?.filterIsInstance<String>()
2264
+ ?.toTypedArray()
2265
+ val subResponseCode = (diagnostics["subResponseCodeAndroid"] as? String)?.let {
2266
+ runCatching { OpenIapSubResponseCodeAndroid.fromJson(it) }.getOrNull()
2267
+ }
2138
2268
  return NitroPurchaseResult(
2139
2269
  responseCode = responseCode ?: -1.0,
2140
2270
  debugMessage = debugMessage ?: diagnosticMessage ?: error.message,
2141
2271
  code = code,
2142
2272
  message = message,
2143
- purchaseToken = null
2273
+ purchaseToken = null,
2274
+ productId = diagnosticProductId,
2275
+ productIds = productIds,
2276
+ productType = diagnostics["productType"] as? String,
2277
+ isEmptyProductList = diagnostics["isEmptyProductList"] as? Boolean,
2278
+ subResponseCodeAndroid = mapSubResponseCode(subResponseCode)
2144
2279
  )
2145
2280
  }
2146
2281
  }