react-native-iap 15.4.0 → 15.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) 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 +221 -87
  3. package/android/src/main/java/com/margelo/nitro/iap/RnIapLog.kt +23 -1
  4. package/ios/HybridRnIap.swift +211 -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 +31 -6
  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 +21 -19
  25. package/lib/typescript/src/specs/RnIap.nitro.d.ts.map +1 -1
  26. package/lib/typescript/src/types.d.ts +58 -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 +2 -2
  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 +19 -0
  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/Purchase.swift +12 -0
  334. package/nitrogen/generated/ios/swift/RequestPurchaseResult.swift +14 -0
  335. package/nitrogen/generated/ios/swift/UserChoiceBillingDetails.swift +82 -2
  336. package/nitrogen/generated/ios/swift/Variant_Bool_NitroPurchaseResult.swift +12 -0
  337. package/nitrogen/generated/ios/swift/Variant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid.swift +12 -0
  338. package/nitrogen/generated/ios/swift/Variant_NullType_AdvancedCommerceInfoIOS.swift +12 -0
  339. package/nitrogen/generated/ios/swift/Variant_NullType_AdvancedCommerceItemDetailsIOS.swift +12 -0
  340. package/nitrogen/generated/ios/swift/Variant_NullType_Bool.swift +12 -0
  341. package/nitrogen/generated/ios/swift/Variant_NullType_DeveloperBillingOptionParamsAndroid.swift +12 -0
  342. package/nitrogen/generated/ios/swift/Variant_NullType_Dictionary_String__String_.swift +12 -0
  343. package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +12 -0
  344. package/nitrogen/generated/ios/swift/Variant_NullType_InitConnectionConfig.swift +12 -0
  345. package/nitrogen/generated/ios/swift/Variant_NullType_NitroAvailablePurchasesAndroidOptions.swift +12 -0
  346. package/nitrogen/generated/ios/swift/Variant_NullType_NitroAvailablePurchasesIosOptions.swift +12 -0
  347. package/nitrogen/generated/ios/swift/Variant_NullType_NitroDiscountAmountAndroid.swift +12 -0
  348. package/nitrogen/generated/ios/swift/Variant_NullType_NitroDiscountDisplayInfoAndroid.swift +12 -0
  349. package/nitrogen/generated/ios/swift/Variant_NullType_NitroFinishTransactionAndroidParams.swift +12 -0
  350. package/nitrogen/generated/ios/swift/Variant_NullType_NitroFinishTransactionIosParams.swift +12 -0
  351. package/nitrogen/generated/ios/swift/Variant_NullType_NitroInAppMessageParamsAndroid.swift +12 -0
  352. package/nitrogen/generated/ios/swift/Variant_NullType_NitroLimitedQuantityInfoAndroid.swift +12 -0
  353. package/nitrogen/generated/ios/swift/Variant_NullType_NitroPreorderDetailsAndroid.swift +12 -0
  354. package/nitrogen/generated/ios/swift/Variant_NullType_NitroProduct.swift +12 -0
  355. package/nitrogen/generated/ios/swift/Variant_NullType_NitroPurchase.swift +12 -0
  356. package/nitrogen/generated/ios/swift/Variant_NullType_NitroReceiptValidationAppleOptions.swift +12 -0
  357. package/nitrogen/generated/ios/swift/Variant_NullType_NitroReceiptValidationGoogleOptions.swift +12 -0
  358. package/nitrogen/generated/ios/swift/Variant_NullType_NitroReceiptValidationHorizonOptions.swift +12 -0
  359. package/nitrogen/generated/ios/swift/Variant_NullType_NitroRenewalInfoIOS.swift +12 -0
  360. package/nitrogen/generated/ios/swift/Variant_NullType_NitroRentalDetailsAndroid.swift +12 -0
  361. package/nitrogen/generated/ios/swift/Variant_NullType_NitroRequestPurchaseAndroid.swift +12 -0
  362. package/nitrogen/generated/ios/swift/Variant_NullType_NitroRequestPurchaseIos.swift +12 -0
  363. package/nitrogen/generated/ios/swift/Variant_NullType_NitroValidTimeWindowAndroid.swift +12 -0
  364. package/nitrogen/generated/ios/swift/Variant_NullType_NitroVerifyPurchaseWithIapkitAmazonProps.swift +12 -0
  365. package/nitrogen/generated/ios/swift/Variant_NullType_NitroVerifyPurchaseWithIapkitAppleProps.swift +12 -0
  366. package/nitrogen/generated/ios/swift/Variant_NullType_NitroVerifyPurchaseWithIapkitGoogleProps.swift +12 -0
  367. package/nitrogen/generated/ios/swift/Variant_NullType_NitroVerifyPurchaseWithIapkitProps.swift +12 -0
  368. package/nitrogen/generated/ios/swift/Variant_NullType_NitroVerifyPurchaseWithIapkitResult.swift +12 -0
  369. package/nitrogen/generated/ios/swift/Variant_NullType_PendingPurchaseUpdateAndroid.swift +12 -0
  370. package/nitrogen/generated/ios/swift/Variant_NullType_PromotionalOfferJwsInputIOS.swift +12 -0
  371. package/nitrogen/generated/ios/swift/Variant_NullType_PurchaseOfferIOS.swift +12 -0
  372. package/nitrogen/generated/ios/swift/Variant_NullType_RenewalCommitmentInfoIOS.swift +12 -0
  373. package/nitrogen/generated/ios/swift/Variant_NullType_RenewalInfoIOS.swift +12 -0
  374. package/nitrogen/generated/ios/swift/Variant_NullType_String.swift +12 -0
  375. package/nitrogen/generated/ios/swift/Variant_NullType_SubscriptionProductReplacementParamsAndroid.swift +12 -0
  376. package/nitrogen/generated/ios/swift/Variant_NullType_TransactionCommitmentInfoIOS.swift +12 -0
  377. package/nitrogen/generated/ios/swift/Variant_NullType_WinBackOfferInputIOS.swift +12 -0
  378. package/nitrogen/generated/ios/swift/Variant_NullType__AdvancedCommerceRefundIOS_.swift +12 -0
  379. package/nitrogen/generated/ios/swift/Variant_NullType__AndroidSubscriptionOfferInput_.swift +12 -0
  380. package/nitrogen/generated/ios/swift/Variant_NullType__DeveloperProvidedBillingProductAndroid_.swift +30 -0
  381. package/nitrogen/generated/ios/swift/Variant_NullType__InAppMessageCategoryAndroid_.swift +12 -0
  382. package/nitrogen/generated/ios/swift/Variant_NullType__NitroOneTimePurchaseOfferDetail_.swift +12 -0
  383. package/nitrogen/generated/ios/swift/Variant_NullType__NitroSubscriptionStatus_.swift +12 -0
  384. package/nitrogen/generated/ios/swift/Variant_NullType__NitroVerifyPurchaseWithProviderError_.swift +12 -0
  385. package/nitrogen/generated/ios/swift/Variant_NullType__String_.swift +12 -0
  386. package/nitrogen/generated/shared/c++/AdvancedCommerceInfoIOS.hpp +1 -1
  387. package/nitrogen/generated/shared/c++/AdvancedCommerceItemIOS.hpp +1 -1
  388. package/nitrogen/generated/shared/c++/DeveloperProvidedBillingDetailsAndroid.hpp +1 -1
  389. package/nitrogen/generated/shared/c++/HybridRnIapSpec.hpp +1 -1
  390. package/nitrogen/generated/shared/c++/NitroInAppMessageParamsAndroid.hpp +1 -1
  391. package/nitrogen/generated/shared/c++/NitroOneTimePurchaseOfferDetail.hpp +1 -1
  392. package/nitrogen/generated/shared/c++/NitroProduct.hpp +1 -1
  393. package/nitrogen/generated/shared/c++/NitroPurchase.hpp +40 -3
  394. package/nitrogen/generated/shared/c++/NitroPurchaseRequest.hpp +1 -1
  395. package/nitrogen/generated/shared/c++/NitroPurchaseResult.hpp +27 -4
  396. package/nitrogen/generated/shared/c++/NitroReceiptValidationResultIOS.hpp +1 -1
  397. package/nitrogen/generated/shared/c++/NitroRenewalInfoIOS.hpp +15 -2
  398. package/nitrogen/generated/shared/c++/NitroRequestPurchaseAndroid.hpp +1 -1
  399. package/nitrogen/generated/shared/c++/NitroSubscriptionStatus.hpp +8 -8
  400. package/nitrogen/generated/shared/c++/NitroVerifyPurchaseWithProviderResult.hpp +1 -1
  401. package/nitrogen/generated/shared/c++/PendingPurchaseUpdateAndroid.hpp +1 -1
  402. package/nitrogen/generated/shared/c++/PurchaseAndroid.hpp +1 -1
  403. package/nitrogen/generated/shared/c++/PurchaseIOS.hpp +1 -1
  404. package/nitrogen/generated/shared/c++/UserChoiceBillingDetails.hpp +16 -3
  405. package/openiap-versions.json +3 -3
  406. package/package.json +8 -5
  407. package/src/hooks/useIAP.ts +7 -4
  408. package/src/index.ts +59 -39
  409. package/src/specs/RnIap.nitro.ts +25 -19
  410. package/src/types.ts +58 -26
  411. package/src/utils/error.ts +11 -8
  412. package/src/utils/errorMapping.ts +9 -1
  413. package/src/utils/type-bridge.ts +37 -40
  414. package/src/vega-adapter.ts +66 -4
  415. package/nitrogen/generated/android/c++/JNitroSubscriptionRenewalInfo.hpp +0 -83
  416. package/nitrogen/generated/android/c++/JVariant_NullType_NitroSubscriptionRenewalInfo.cpp +0 -26
  417. package/nitrogen/generated/android/c++/JVariant_NullType_NitroSubscriptionRenewalInfo.hpp +0 -75
  418. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroSubscriptionRenewalInfo.kt +0 -53
  419. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroSubscriptionRenewalInfo.kt +0 -53
  420. package/nitrogen/generated/ios/swift/NitroSubscriptionRenewalInfo.swift +0 -182
  421. package/nitrogen/generated/ios/swift/Variant_NullType_NitroSubscriptionRenewalInfo.swift +0 -18
  422. 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(
@@ -1561,7 +1651,10 @@ class HybridRnIap : HybridRnIapSpec() {
1561
1651
  val token = withContext(Dispatchers.Main) {
1562
1652
  openIap.createAlternativeBillingReportingToken()
1563
1653
  }
1564
- RnIapLog.result("createAlternativeBillingTokenAndroid", token)
1654
+ RnIapLog.result(
1655
+ "createAlternativeBillingTokenAndroid",
1656
+ if (token.isNullOrBlank()) "<empty>" else "<token>"
1657
+ )
1565
1658
  token?.let { Variant_NullType_String.Second(it) } ?: Variant_NullType_String.First(NullType.NULL)
1566
1659
  } catch (err: Throwable) {
1567
1660
  RnIapLog.failure("createAlternativeBillingTokenAndroid", err)
@@ -1618,15 +1711,19 @@ class HybridRnIap : HybridRnIapSpec() {
1618
1711
  private var subscriptionBillingIssueNativeListener: dev.hyo.openiap.listener.OpenIapSubscriptionBillingIssueListener? = null
1619
1712
 
1620
1713
  override fun addSubscriptionBillingIssueListener(listener: (purchase: NitroPurchase) -> Unit) {
1621
- synchronized(subscriptionBillingIssueListeners) {
1622
- subscriptionBillingIssueListeners.add(listener)
1714
+ synchronized(subscriptionBillingIssueAttachLock) {
1715
+ synchronized(subscriptionBillingIssueListeners) {
1716
+ subscriptionBillingIssueListeners.add(listener)
1717
+ }
1718
+ attachSubscriptionBillingIssueIfNeeded()
1623
1719
  }
1624
- attachSubscriptionBillingIssueIfNeeded()
1625
1720
  }
1626
1721
 
1627
1722
  override fun removeSubscriptionBillingIssueListener(listener: (purchase: NitroPurchase) -> Unit) {
1628
- synchronized(subscriptionBillingIssueListeners) {
1629
- subscriptionBillingIssueListeners.remove(listener)
1723
+ synchronized(subscriptionBillingIssueAttachLock) {
1724
+ synchronized(subscriptionBillingIssueListeners) {
1725
+ subscriptionBillingIssueListeners.remove(listener)
1726
+ }
1630
1727
  }
1631
1728
  }
1632
1729
 
@@ -1658,6 +1755,15 @@ class HybridRnIap : HybridRnIapSpec() {
1658
1755
  }
1659
1756
  }
1660
1757
 
1758
+ private fun clearSubscriptionBillingIssueListeners() {
1759
+ synchronized(subscriptionBillingIssueAttachLock) {
1760
+ synchronized(subscriptionBillingIssueListeners) {
1761
+ subscriptionBillingIssueListeners.clear()
1762
+ }
1763
+ detachSubscriptionBillingIssueIfNeeded()
1764
+ }
1765
+ }
1766
+
1661
1767
  // -------------------------------------------------------------------------
1662
1768
  // Billing Programs API (Android 8.2.0+)
1663
1769
  // -------------------------------------------------------------------------
@@ -2048,6 +2154,13 @@ class HybridRnIap : HybridRnIapSpec() {
2048
2154
  ?: OpenIapError.Companion.defaultMessage(code)
2049
2155
  val diagnostics = error.toJSON()
2050
2156
  val responseCode = (diagnostics["responseCode"] as? Number)?.toInt()
2157
+ val diagnosticProductId = productId
2158
+ ?: diagnostics["productId"] as? String
2159
+ ?: when (error) {
2160
+ is OpenIapError.ProductNotFound -> error.productId
2161
+ is OpenIapError.SkuNotFound -> error.sku
2162
+ else -> null
2163
+ }
2051
2164
  val productIds = diagnostics["productIds"] as? List<*>
2052
2165
  val productType = diagnostics["productType"] as? String
2053
2166
  val isEmptyProductList = diagnostics["isEmptyProductList"] as? Boolean
@@ -2057,15 +2170,18 @@ class HybridRnIap : HybridRnIapSpec() {
2057
2170
  "message" to message
2058
2171
  )
2059
2172
 
2060
- errorMap["responseCode"] = responseCode ?: -1
2173
+ responseCode?.let { errorMap["responseCode"] = it }
2061
2174
  debugMessage
2062
2175
  ?.let { errorMap["debugMessage"] = it }
2063
2176
  ?: (diagnostics["debugMessage"] as? String)?.let { errorMap["debugMessage"] = it }
2064
2177
  ?: error.message?.let { errorMap["debugMessage"] = it }
2065
- productId?.let { errorMap["productId"] = it }
2178
+ diagnosticProductId?.let { errorMap["productId"] = it }
2066
2179
  if (!productIds.isNullOrEmpty()) errorMap["productIds"] = productIds
2067
2180
  productType?.let { errorMap["productType"] = it }
2068
2181
  isEmptyProductList?.let { errorMap["isEmptyProductList"] = it }
2182
+ (diagnostics["subResponseCodeAndroid"] as? String)?.let {
2183
+ errorMap["subResponseCodeAndroid"] = it
2184
+ }
2069
2185
 
2070
2186
  return try {
2071
2187
  JSONObject(errorMap).toString()
@@ -2135,12 +2251,30 @@ class HybridRnIap : HybridRnIapSpec() {
2135
2251
  val diagnostics = error.toJSON()
2136
2252
  val responseCode = (diagnostics["responseCode"] as? Number)?.toDouble()
2137
2253
  val diagnosticMessage = diagnostics["debugMessage"] as? String
2254
+ val diagnosticProductId = productId
2255
+ ?: diagnostics["productId"] as? String
2256
+ ?: when (error) {
2257
+ is OpenIapError.ProductNotFound -> error.productId
2258
+ is OpenIapError.SkuNotFound -> error.sku
2259
+ else -> null
2260
+ }
2261
+ val productIds = (diagnostics["productIds"] as? Iterable<*>)
2262
+ ?.filterIsInstance<String>()
2263
+ ?.toTypedArray()
2264
+ val subResponseCode = (diagnostics["subResponseCodeAndroid"] as? String)?.let {
2265
+ runCatching { OpenIapSubResponseCodeAndroid.fromJson(it) }.getOrNull()
2266
+ }
2138
2267
  return NitroPurchaseResult(
2139
2268
  responseCode = responseCode ?: -1.0,
2140
2269
  debugMessage = debugMessage ?: diagnosticMessage ?: error.message,
2141
2270
  code = code,
2142
2271
  message = message,
2143
- purchaseToken = null
2272
+ purchaseToken = null,
2273
+ productId = diagnosticProductId,
2274
+ productIds = productIds,
2275
+ productType = diagnostics["productType"] as? String,
2276
+ isEmptyProductList = diagnostics["isEmptyProductList"] as? Boolean,
2277
+ subResponseCodeAndroid = mapSubResponseCode(subResponseCode)
2144
2278
  )
2145
2279
  }
2146
2280
  }