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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (489) hide show
  1. package/README.md +23 -25
  2. package/android/src/main/java/com/margelo/nitro/iap/ConnectionLifecycleQueue.kt +113 -0
  3. package/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt +471 -255
  4. package/android/src/main/java/com/margelo/nitro/iap/ProductSerialization.kt +98 -0
  5. package/android/src/main/java/com/margelo/nitro/iap/RnIapLog.kt +23 -1
  6. package/ios/HybridRnIap.swift +230 -140
  7. package/ios/RnIapHelper.swift +180 -28
  8. package/ios/RnIapLog.swift +24 -1
  9. package/lib/module/hooks/useIAP.js +20 -4
  10. package/lib/module/hooks/useIAP.js.map +1 -1
  11. package/lib/module/index.js +151 -46
  12. package/lib/module/index.js.map +1 -1
  13. package/lib/module/index.kepler.js +3 -0
  14. package/lib/module/index.kepler.js.map +1 -1
  15. package/lib/module/types.js +77 -14
  16. package/lib/module/types.js.map +1 -1
  17. package/lib/module/utils/error.js +7 -3
  18. package/lib/module/utils/error.js.map +1 -1
  19. package/lib/module/utils/errorMapping.js +2 -0
  20. package/lib/module/utils/errorMapping.js.map +1 -1
  21. package/lib/module/utils/type-bridge.js +50 -22
  22. package/lib/module/utils/type-bridge.js.map +1 -1
  23. package/lib/module/vega-adapter.js +55 -8
  24. package/lib/module/vega-adapter.js.map +1 -1
  25. package/lib/typescript/src/hooks/useIAP.d.ts +28 -5
  26. package/lib/typescript/src/hooks/useIAP.d.ts.map +1 -1
  27. package/lib/typescript/src/index.d.ts +50 -10
  28. package/lib/typescript/src/index.d.ts.map +1 -1
  29. package/lib/typescript/src/index.kepler.d.ts +3 -0
  30. package/lib/typescript/src/index.kepler.d.ts.map +1 -1
  31. package/lib/typescript/src/specs/RnIap.nitro.d.ts +98 -26
  32. package/lib/typescript/src/specs/RnIap.nitro.d.ts.map +1 -1
  33. package/lib/typescript/src/types.d.ts +279 -59
  34. package/lib/typescript/src/types.d.ts.map +1 -1
  35. package/lib/typescript/src/utils/error.d.ts.map +1 -1
  36. package/lib/typescript/src/utils/errorMapping.d.ts +3 -1
  37. package/lib/typescript/src/utils/errorMapping.d.ts.map +1 -1
  38. package/lib/typescript/src/utils/type-bridge.d.ts.map +1 -1
  39. package/lib/typescript/src/vega-adapter.d.ts.map +1 -1
  40. package/nitro.json +8 -2
  41. package/nitrogen/generated/android/NitroIap+autolinking.cmake +4 -1
  42. package/nitrogen/generated/android/NitroIapOnLoad.cpp +2 -2
  43. package/nitrogen/generated/android/c++/JAdvancedCommerceInfoIOS.hpp +10 -10
  44. package/nitrogen/generated/android/c++/JAdvancedCommerceItemDetailsIOS.hpp +2 -2
  45. package/nitrogen/generated/android/c++/JAdvancedCommerceItemIOS.hpp +2 -2
  46. package/nitrogen/generated/android/c++/JAdvancedCommerceRefundIOS.hpp +2 -2
  47. package/nitrogen/generated/android/c++/JAlternativeBillingModeAndroid.hpp +2 -2
  48. package/nitrogen/generated/android/c++/JAndroidSubscriptionOfferInput.hpp +2 -2
  49. package/nitrogen/generated/android/c++/JBillingChoiceImageLayoutAndroid.hpp +61 -0
  50. package/nitrogen/generated/android/c++/JBillingChoiceScreenTypeAndroid.hpp +61 -0
  51. package/nitrogen/generated/android/c++/JBillingProgramAndroid.hpp +5 -2
  52. package/nitrogen/generated/android/c++/JDeveloperBillingLaunchModeAndroid.hpp +61 -0
  53. package/nitrogen/generated/android/c++/JDeveloperBillingOptionParamsAndroid.hpp +78 -0
  54. package/nitrogen/generated/android/c++/JDeveloperBillingTypeAndroid.hpp +61 -0
  55. package/nitrogen/generated/android/c++/JDeveloperProvidedBillingDetailsAndroid.hpp +47 -7
  56. package/nitrogen/generated/android/c++/JDeveloperProvidedBillingProductAndroid.hpp +72 -0
  57. package/nitrogen/generated/android/c++/JExternalLinkLaunchModeAndroid.hpp +2 -2
  58. package/nitrogen/generated/android/c++/JExternalLinkTypeAndroid.hpp +2 -2
  59. package/nitrogen/generated/android/c++/JExternalPurchaseCustomLinkNoticeResultIOS.hpp +2 -2
  60. package/nitrogen/generated/android/c++/JExternalPurchaseCustomLinkNoticeTypeIOS.hpp +2 -2
  61. package/nitrogen/generated/android/c++/JExternalPurchaseCustomLinkTokenResultIOS.hpp +2 -2
  62. package/nitrogen/generated/android/c++/JExternalPurchaseCustomLinkTokenTypeIOS.hpp +2 -2
  63. package/nitrogen/generated/android/c++/JExternalPurchaseLinkResultIOS.hpp +2 -2
  64. package/nitrogen/generated/android/c++/JExternalPurchaseNoticeAction.hpp +2 -2
  65. package/nitrogen/generated/android/c++/JExternalPurchaseNoticeResultIOS.hpp +2 -2
  66. package/nitrogen/generated/android/c++/JFunc_void_DeveloperProvidedBillingDetailsAndroid.hpp +12 -2
  67. package/nitrogen/generated/android/c++/JFunc_void_NitroProduct.hpp +2 -2
  68. package/nitrogen/generated/android/c++/JFunc_void_NitroPurchase.hpp +26 -2
  69. package/nitrogen/generated/android/c++/JFunc_void_NitroPurchaseResult.hpp +5 -2
  70. package/nitrogen/generated/android/c++/JFunc_void_UserChoiceBillingDetails.hpp +12 -2
  71. package/nitrogen/generated/android/c++/JHybridRnIapSpec.cpp +160 -48
  72. package/nitrogen/generated/android/c++/JHybridRnIapSpec.hpp +7 -4
  73. package/nitrogen/generated/android/c++/JIapPlatform.hpp +2 -2
  74. package/nitrogen/generated/android/c++/JIapStore.hpp +2 -2
  75. package/nitrogen/generated/android/c++/JIapkitPurchaseState.hpp +2 -2
  76. package/nitrogen/generated/android/c++/JInAppMessageCategoryAndroid.hpp +58 -0
  77. package/nitrogen/generated/android/c++/JInAppMessageResponseCodeAndroid.hpp +58 -0
  78. package/nitrogen/generated/android/c++/JInitConnectionConfig.hpp +9 -3
  79. package/nitrogen/generated/android/c++/JNitroActiveSubscription.hpp +7 -2
  80. package/nitrogen/generated/android/c++/JNitroAvailablePurchasesAndroidOptions.hpp +2 -2
  81. package/nitrogen/generated/android/c++/JNitroAvailablePurchasesAndroidType.hpp +2 -2
  82. package/nitrogen/generated/android/c++/JNitroAvailablePurchasesIosOptions.hpp +2 -2
  83. package/nitrogen/generated/android/c++/JNitroAvailablePurchasesOptions.hpp +2 -2
  84. package/nitrogen/generated/android/c++/JNitroBillingChoiceInfoAndroid.hpp +66 -0
  85. package/nitrogen/generated/android/c++/JNitroBillingProgramAvailabilityResultAndroid.hpp +20 -5
  86. package/nitrogen/generated/android/c++/JNitroBillingProgramInformationDialogParamsAndroid.hpp +63 -0
  87. package/nitrogen/generated/android/c++/JNitroBillingProgramReportingDetailsAndroid.hpp +2 -2
  88. package/nitrogen/generated/android/c++/JNitroBillingResultAndroid.hpp +72 -0
  89. package/nitrogen/generated/android/c++/JNitroDeepLinkOptionsAndroid.hpp +2 -2
  90. package/nitrogen/generated/android/c++/JNitroDiscountAmountAndroid.hpp +2 -2
  91. package/nitrogen/generated/android/c++/JNitroDiscountDisplayInfoAndroid.hpp +2 -2
  92. package/nitrogen/generated/android/c++/JNitroFinishTransactionAndroidParams.hpp +2 -2
  93. package/nitrogen/generated/android/c++/JNitroFinishTransactionIosParams.hpp +2 -2
  94. package/nitrogen/generated/android/c++/JNitroFinishTransactionParams.hpp +2 -2
  95. package/nitrogen/generated/android/c++/JNitroGetBillingChoiceInfoParamsAndroid.hpp +74 -0
  96. package/nitrogen/generated/android/c++/JNitroInAppMessageParamsAndroid.hpp +64 -0
  97. package/nitrogen/generated/android/c++/JNitroInAppMessageResultAndroid.hpp +68 -0
  98. package/nitrogen/generated/android/c++/JNitroLaunchExternalLinkParamsAndroid.hpp +12 -3
  99. package/nitrogen/generated/android/c++/JNitroLimitedQuantityInfoAndroid.hpp +2 -2
  100. package/nitrogen/generated/android/c++/JNitroOneTimePurchaseOfferDetail.hpp +15 -11
  101. package/nitrogen/generated/android/c++/JNitroPreorderDetailsAndroid.hpp +2 -2
  102. package/nitrogen/generated/android/c++/JNitroProduct.hpp +15 -3
  103. package/nitrogen/generated/android/c++/JNitroPurchase.hpp +53 -5
  104. package/nitrogen/generated/android/c++/JNitroPurchaseRequest.hpp +9 -2
  105. package/nitrogen/generated/android/c++/JNitroPurchaseResult.hpp +46 -5
  106. package/nitrogen/generated/android/c++/JNitroReceiptValidationAppleOptions.hpp +2 -2
  107. package/nitrogen/generated/android/c++/JNitroReceiptValidationGoogleOptions.hpp +2 -2
  108. package/nitrogen/generated/android/c++/JNitroReceiptValidationHorizonOptions.hpp +2 -2
  109. package/nitrogen/generated/android/c++/JNitroReceiptValidationParams.hpp +2 -2
  110. package/nitrogen/generated/android/c++/JNitroReceiptValidationResultAndroid.hpp +2 -2
  111. package/nitrogen/generated/android/c++/JNitroReceiptValidationResultIOS.hpp +26 -2
  112. package/nitrogen/generated/android/c++/JNitroRenewalInfoIOS.hpp +16 -3
  113. package/nitrogen/generated/android/c++/JNitroRentalDetailsAndroid.hpp +2 -2
  114. package/nitrogen/generated/android/c++/JNitroRequestPurchaseAndroid.hpp +26 -11
  115. package/nitrogen/generated/android/c++/JNitroRequestPurchaseIos.hpp +2 -2
  116. package/nitrogen/generated/android/c++/JNitroSubscriptionStatus.hpp +15 -9
  117. package/nitrogen/generated/android/c++/JNitroValidTimeWindowAndroid.hpp +2 -2
  118. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitAmazonProps.hpp +2 -2
  119. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitAppleProps.hpp +2 -2
  120. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitGoogleProps.hpp +2 -2
  121. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitProps.hpp +2 -2
  122. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitResult.hpp +2 -2
  123. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithProviderError.hpp +2 -2
  124. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithProviderProps.hpp +2 -2
  125. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithProviderResult.hpp +2 -2
  126. package/nitrogen/generated/android/c++/JPaymentModeIOS.hpp +2 -2
  127. package/nitrogen/generated/android/c++/JPendingPurchaseUpdateAndroid.hpp +10 -10
  128. package/nitrogen/generated/android/c++/JProductType.hpp +58 -0
  129. package/nitrogen/generated/android/c++/JPromotionalOfferJwsInputIOS.hpp +2 -2
  130. package/nitrogen/generated/android/c++/JPurchase.hpp +3 -3
  131. package/nitrogen/generated/android/c++/JPurchaseAndroid.hpp +2 -2
  132. package/nitrogen/generated/android/c++/JPurchaseIOS.hpp +2 -2
  133. package/nitrogen/generated/android/c++/JPurchaseOfferIOS.hpp +2 -2
  134. package/nitrogen/generated/android/c++/JPurchaseState.hpp +2 -2
  135. package/nitrogen/generated/android/c++/JPurchaseUpdatedListenerOptions.hpp +2 -2
  136. package/nitrogen/generated/android/c++/JPurchaseVerificationProvider.hpp +2 -2
  137. package/nitrogen/generated/android/c++/JRenewalCommitmentInfoIOS.hpp +2 -2
  138. package/nitrogen/generated/android/c++/JRenewalInfoIOS.hpp +2 -2
  139. package/nitrogen/generated/android/c++/JRequestPurchaseResult.cpp +4 -4
  140. package/nitrogen/generated/android/c++/JRequestPurchaseResult.hpp +9 -9
  141. package/nitrogen/generated/android/c++/JSubResponseCodeAndroid.hpp +61 -0
  142. package/nitrogen/generated/android/c++/JSubscriptionBillingPlanTypeIOS.hpp +2 -2
  143. package/nitrogen/generated/android/c++/JSubscriptionProductReplacementParamsAndroid.hpp +2 -2
  144. package/nitrogen/generated/android/c++/JSubscriptionReplacementModeAndroid.hpp +2 -2
  145. package/nitrogen/generated/android/c++/JTransactionCommitmentInfoIOS.hpp +2 -2
  146. package/nitrogen/generated/android/c++/JUserChoiceBillingDetails.hpp +29 -11
  147. package/nitrogen/generated/android/c++/JVariant_Boolean_NitroPurchaseResult.hpp +6 -3
  148. package/nitrogen/generated/android/c++/JVariant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid.hpp +27 -3
  149. package/nitrogen/generated/android/c++/JVariant_NullType_AdvancedCommerceInfoIOS.hpp +3 -3
  150. package/nitrogen/generated/android/c++/JVariant_NullType_AdvancedCommerceItemDetailsIOS.hpp +3 -3
  151. package/nitrogen/generated/android/c++/JVariant_NullType_Array_AdvancedCommerceRefundIOS_.cpp +4 -4
  152. package/nitrogen/generated/android/c++/JVariant_NullType_Array_AdvancedCommerceRefundIOS_.hpp +7 -7
  153. package/nitrogen/generated/android/c++/JVariant_NullType_Array_AndroidSubscriptionOfferInput_.cpp +4 -4
  154. package/nitrogen/generated/android/c++/JVariant_NullType_Array_AndroidSubscriptionOfferInput_.hpp +7 -7
  155. package/nitrogen/generated/android/c++/JVariant_NullType_Array_DeveloperProvidedBillingProductAndroid_.cpp +35 -0
  156. package/nitrogen/generated/android/c++/JVariant_NullType_Array_DeveloperProvidedBillingProductAndroid_.hpp +86 -0
  157. package/nitrogen/generated/android/c++/JVariant_NullType_Array_InAppMessageCategoryAndroid_.cpp +35 -0
  158. package/nitrogen/generated/android/c++/JVariant_NullType_Array_InAppMessageCategoryAndroid_.hpp +81 -0
  159. package/nitrogen/generated/android/c++/JVariant_NullType_Array_NitroOneTimePurchaseOfferDetail_.cpp +4 -4
  160. package/nitrogen/generated/android/c++/JVariant_NullType_Array_NitroOneTimePurchaseOfferDetail_.hpp +7 -7
  161. package/nitrogen/generated/android/c++/JVariant_NullType_Array_NitroSubscriptionStatus_.cpp +4 -4
  162. package/nitrogen/generated/android/c++/JVariant_NullType_Array_NitroSubscriptionStatus_.hpp +16 -10
  163. package/nitrogen/generated/android/c++/JVariant_NullType_Array_NitroVerifyPurchaseWithProviderError_.cpp +4 -4
  164. package/nitrogen/generated/android/c++/JVariant_NullType_Array_NitroVerifyPurchaseWithProviderError_.hpp +7 -7
  165. package/nitrogen/generated/android/c++/JVariant_NullType_Array_String_.cpp +4 -4
  166. package/nitrogen/generated/android/c++/JVariant_NullType_Array_String_.hpp +7 -7
  167. package/nitrogen/generated/android/c++/JVariant_NullType_Boolean.hpp +3 -3
  168. package/nitrogen/generated/android/c++/JVariant_NullType_DeveloperBillingOptionParamsAndroid.cpp +26 -0
  169. package/nitrogen/generated/android/c++/JVariant_NullType_DeveloperBillingOptionParamsAndroid.hpp +78 -0
  170. package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +3 -3
  171. package/nitrogen/generated/android/c++/JVariant_NullType_InitConnectionConfig.hpp +5 -3
  172. package/nitrogen/generated/android/c++/JVariant_NullType_Map_String__String_.hpp +3 -3
  173. package/nitrogen/generated/android/c++/JVariant_NullType_NitroAvailablePurchasesAndroidOptions.hpp +3 -3
  174. package/nitrogen/generated/android/c++/JVariant_NullType_NitroAvailablePurchasesIosOptions.hpp +3 -3
  175. package/nitrogen/generated/android/c++/JVariant_NullType_NitroDiscountAmountAndroid.hpp +3 -3
  176. package/nitrogen/generated/android/c++/JVariant_NullType_NitroDiscountDisplayInfoAndroid.hpp +3 -3
  177. package/nitrogen/generated/android/c++/JVariant_NullType_NitroFinishTransactionAndroidParams.hpp +3 -3
  178. package/nitrogen/generated/android/c++/JVariant_NullType_NitroFinishTransactionIosParams.hpp +3 -3
  179. package/nitrogen/generated/android/c++/JVariant_NullType_NitroInAppMessageParamsAndroid.cpp +26 -0
  180. package/nitrogen/generated/android/c++/JVariant_NullType_NitroInAppMessageParamsAndroid.hpp +76 -0
  181. package/nitrogen/generated/android/c++/JVariant_NullType_NitroLimitedQuantityInfoAndroid.hpp +3 -3
  182. package/nitrogen/generated/android/c++/JVariant_NullType_NitroPreorderDetailsAndroid.hpp +3 -3
  183. package/nitrogen/generated/android/c++/JVariant_NullType_NitroProduct.hpp +3 -3
  184. package/nitrogen/generated/android/c++/JVariant_NullType_NitroPurchase.hpp +27 -3
  185. package/nitrogen/generated/android/c++/JVariant_NullType_NitroReceiptValidationAppleOptions.hpp +3 -3
  186. package/nitrogen/generated/android/c++/JVariant_NullType_NitroReceiptValidationGoogleOptions.hpp +3 -3
  187. package/nitrogen/generated/android/c++/JVariant_NullType_NitroReceiptValidationHorizonOptions.hpp +3 -3
  188. package/nitrogen/generated/android/c++/JVariant_NullType_NitroRenewalInfoIOS.hpp +8 -3
  189. package/nitrogen/generated/android/c++/JVariant_NullType_NitroRentalDetailsAndroid.hpp +3 -3
  190. package/nitrogen/generated/android/c++/JVariant_NullType_NitroRequestPurchaseAndroid.hpp +10 -3
  191. package/nitrogen/generated/android/c++/JVariant_NullType_NitroRequestPurchaseIos.hpp +3 -3
  192. package/nitrogen/generated/android/c++/JVariant_NullType_NitroValidTimeWindowAndroid.hpp +3 -3
  193. package/nitrogen/generated/android/c++/JVariant_NullType_NitroVerifyPurchaseWithIapkitAmazonProps.hpp +3 -3
  194. package/nitrogen/generated/android/c++/JVariant_NullType_NitroVerifyPurchaseWithIapkitAppleProps.hpp +3 -3
  195. package/nitrogen/generated/android/c++/JVariant_NullType_NitroVerifyPurchaseWithIapkitGoogleProps.hpp +3 -3
  196. package/nitrogen/generated/android/c++/JVariant_NullType_NitroVerifyPurchaseWithIapkitProps.hpp +3 -3
  197. package/nitrogen/generated/android/c++/JVariant_NullType_NitroVerifyPurchaseWithIapkitResult.hpp +3 -3
  198. package/nitrogen/generated/android/c++/JVariant_NullType_PendingPurchaseUpdateAndroid.hpp +3 -3
  199. package/nitrogen/generated/android/c++/JVariant_NullType_PromotionalOfferJwsInputIOS.hpp +3 -3
  200. package/nitrogen/generated/android/c++/JVariant_NullType_PurchaseOfferIOS.hpp +3 -3
  201. package/nitrogen/generated/android/c++/JVariant_NullType_RenewalCommitmentInfoIOS.hpp +3 -3
  202. package/nitrogen/generated/android/c++/JVariant_NullType_RenewalInfoIOS.hpp +3 -3
  203. package/nitrogen/generated/android/c++/JVariant_NullType_String.hpp +3 -3
  204. package/nitrogen/generated/android/c++/JVariant_NullType_SubscriptionProductReplacementParamsAndroid.hpp +3 -3
  205. package/nitrogen/generated/android/c++/JVariant_NullType_TransactionCommitmentInfoIOS.hpp +3 -3
  206. package/nitrogen/generated/android/c++/JVariant_NullType_WinBackOfferInputIOS.hpp +3 -3
  207. package/nitrogen/generated/android/c++/JWinBackOfferInputIOS.hpp +2 -2
  208. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AdvancedCommerceInfoIOS.kt +27 -0
  209. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AdvancedCommerceItemDetailsIOS.kt +13 -0
  210. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AdvancedCommerceItemIOS.kt +17 -0
  211. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AdvancedCommerceRefundIOS.kt +13 -0
  212. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AndroidSubscriptionOfferInput.kt +15 -0
  213. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/BillingChoiceImageLayoutAndroid.kt +24 -0
  214. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/BillingChoiceScreenTypeAndroid.kt +24 -0
  215. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/BillingProgramAndroid.kt +2 -1
  216. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperBillingLaunchModeAndroid.kt +24 -0
  217. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperBillingOptionParamsAndroid.kt +66 -0
  218. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperBillingTypeAndroid.kt +24 -0
  219. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperProvidedBillingDetailsAndroid.kt +32 -4
  220. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperProvidedBillingProductAndroid.kt +61 -0
  221. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/ExternalPurchaseCustomLinkNoticeResultIOS.kt +15 -0
  222. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/ExternalPurchaseCustomLinkTokenResultIOS.kt +15 -0
  223. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/ExternalPurchaseLinkResultIOS.kt +15 -0
  224. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/ExternalPurchaseNoticeResultIOS.kt +17 -0
  225. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/HybridRnIapSpec.kt +14 -2
  226. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/InAppMessageCategoryAndroid.kt +23 -0
  227. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/InAppMessageResponseCodeAndroid.kt +23 -0
  228. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/InitConnectionConfig.kt +22 -2
  229. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroActiveSubscription.kt +39 -0
  230. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroAvailablePurchasesAndroidOptions.kt +15 -0
  231. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroAvailablePurchasesIosOptions.kt +21 -0
  232. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroAvailablePurchasesOptions.kt +15 -0
  233. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingChoiceInfoAndroid.kt +56 -0
  234. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingProgramAvailabilityResultAndroid.kt +29 -4
  235. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingProgramInformationDialogParamsAndroid.kt +56 -0
  236. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingProgramReportingDetailsAndroid.kt +15 -0
  237. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingResultAndroid.kt +61 -0
  238. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroDeepLinkOptionsAndroid.kt +15 -0
  239. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroDiscountAmountAndroid.kt +15 -0
  240. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroDiscountDisplayInfoAndroid.kt +15 -0
  241. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroFinishTransactionAndroidParams.kt +15 -0
  242. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroFinishTransactionIosParams.kt +13 -0
  243. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroFinishTransactionParams.kt +15 -0
  244. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroGetBillingChoiceInfoParamsAndroid.kt +61 -0
  245. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroInAppMessageParamsAndroid.kt +51 -0
  246. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroInAppMessageResultAndroid.kt +56 -0
  247. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroLaunchExternalLinkParamsAndroid.kt +27 -3
  248. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroLimitedQuantityInfoAndroid.kt +15 -0
  249. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroOneTimePurchaseOfferDetail.kt +42 -2
  250. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroPreorderDetailsAndroid.kt +15 -0
  251. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroProduct.kt +96 -2
  252. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroPurchase.kt +128 -3
  253. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroPurchaseRequest.kt +19 -0
  254. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroPurchaseResult.kt +49 -3
  255. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroReceiptValidationAppleOptions.kt +13 -0
  256. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroReceiptValidationGoogleOptions.kt +21 -0
  257. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroReceiptValidationHorizonOptions.kt +17 -0
  258. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroReceiptValidationParams.kt +17 -0
  259. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroReceiptValidationResultAndroid.kt +47 -0
  260. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroReceiptValidationResultIOS.kt +19 -0
  261. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroRenewalInfoIOS.kt +45 -2
  262. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroRentalDetailsAndroid.kt +15 -0
  263. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroRequestPurchaseAndroid.kt +41 -2
  264. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroRequestPurchaseIos.kt +31 -0
  265. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroSubscriptionStatus.kt +19 -2
  266. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroValidTimeWindowAndroid.kt +15 -0
  267. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitAmazonProps.kt +17 -0
  268. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitAppleProps.kt +13 -0
  269. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitGoogleProps.kt +13 -0
  270. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitProps.kt +19 -0
  271. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitResult.kt +17 -0
  272. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithProviderError.kt +15 -0
  273. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithProviderProps.kt +15 -0
  274. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithProviderResult.kt +17 -0
  275. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PendingPurchaseUpdateAndroid.kt +15 -0
  276. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/ProductType.kt +23 -0
  277. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PromotionalOfferJwsInputIOS.kt +15 -0
  278. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Purchase.kt +16 -7
  279. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseAndroid.kt +55 -0
  280. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseIOS.kt +85 -0
  281. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseOfferIOS.kt +17 -0
  282. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseUpdatedListenerOptions.kt +13 -0
  283. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/RenewalCommitmentInfoIOS.kt +21 -0
  284. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/RenewalInfoIOS.kt +37 -0
  285. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/RequestPurchaseResult.kt +20 -9
  286. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/SubResponseCodeAndroid.kt +24 -0
  287. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/SubscriptionProductReplacementParamsAndroid.kt +15 -0
  288. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/TransactionCommitmentInfoIOS.kt +19 -0
  289. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/UserChoiceBillingDetails.kt +28 -3
  290. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_Boolean_NitroPurchaseResult.kt +16 -7
  291. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid.kt +16 -7
  292. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_AdvancedCommerceInfoIOS.kt +16 -7
  293. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_AdvancedCommerceItemDetailsIOS.kt +16 -7
  294. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_AdvancedCommerceRefundIOS_.kt +16 -7
  295. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_AndroidSubscriptionOfferInput_.kt +16 -7
  296. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_DeveloperProvidedBillingProductAndroid_.kt +62 -0
  297. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_InAppMessageCategoryAndroid_.kt +62 -0
  298. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_NitroOneTimePurchaseOfferDetail_.kt +16 -7
  299. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_NitroSubscriptionStatus_.kt +16 -7
  300. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_NitroVerifyPurchaseWithProviderError_.kt +16 -7
  301. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_String_.kt +16 -7
  302. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Boolean.kt +16 -7
  303. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_DeveloperBillingOptionParamsAndroid.kt +62 -0
  304. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Double.kt +16 -7
  305. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_InitConnectionConfig.kt +16 -7
  306. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Map_String__String_.kt +16 -7
  307. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroAvailablePurchasesAndroidOptions.kt +16 -7
  308. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroAvailablePurchasesIosOptions.kt +16 -7
  309. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroDiscountAmountAndroid.kt +16 -7
  310. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroDiscountDisplayInfoAndroid.kt +16 -7
  311. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroFinishTransactionAndroidParams.kt +16 -7
  312. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroFinishTransactionIosParams.kt +16 -7
  313. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroInAppMessageParamsAndroid.kt +62 -0
  314. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroLimitedQuantityInfoAndroid.kt +16 -7
  315. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroPreorderDetailsAndroid.kt +16 -7
  316. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroProduct.kt +16 -7
  317. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroPurchase.kt +16 -7
  318. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroReceiptValidationAppleOptions.kt +16 -7
  319. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroReceiptValidationGoogleOptions.kt +16 -7
  320. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroReceiptValidationHorizonOptions.kt +16 -7
  321. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroRenewalInfoIOS.kt +16 -7
  322. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroRentalDetailsAndroid.kt +16 -7
  323. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroRequestPurchaseAndroid.kt +16 -7
  324. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroRequestPurchaseIos.kt +16 -7
  325. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroValidTimeWindowAndroid.kt +16 -7
  326. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroVerifyPurchaseWithIapkitAmazonProps.kt +16 -7
  327. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroVerifyPurchaseWithIapkitAppleProps.kt +16 -7
  328. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroVerifyPurchaseWithIapkitGoogleProps.kt +16 -7
  329. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroVerifyPurchaseWithIapkitProps.kt +16 -7
  330. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroVerifyPurchaseWithIapkitResult.kt +16 -7
  331. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_PendingPurchaseUpdateAndroid.kt +16 -7
  332. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_PromotionalOfferJwsInputIOS.kt +16 -7
  333. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_PurchaseOfferIOS.kt +16 -7
  334. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_RenewalCommitmentInfoIOS.kt +16 -7
  335. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_RenewalInfoIOS.kt +16 -7
  336. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_String.kt +16 -7
  337. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_SubscriptionProductReplacementParamsAndroid.kt +16 -7
  338. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_TransactionCommitmentInfoIOS.kt +16 -7
  339. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_WinBackOfferInputIOS.kt +16 -7
  340. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/WinBackOfferInputIOS.kt +13 -0
  341. package/nitrogen/generated/ios/NitroIap+autolinking.rb +2 -0
  342. package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Bridge.cpp +24 -0
  343. package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Bridge.hpp +441 -47
  344. package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Umbrella.hpp +48 -3
  345. package/nitrogen/generated/ios/c++/HybridRnIapSpecSwift.hpp +75 -6
  346. package/nitrogen/generated/ios/swift/BillingChoiceImageLayoutAndroid.swift +44 -0
  347. package/nitrogen/generated/ios/swift/BillingChoiceScreenTypeAndroid.swift +44 -0
  348. package/nitrogen/generated/ios/swift/BillingProgramAndroid.swift +4 -0
  349. package/nitrogen/generated/ios/swift/DeveloperBillingLaunchModeAndroid.swift +44 -0
  350. package/nitrogen/generated/ios/swift/DeveloperBillingOptionParamsAndroid.swift +114 -0
  351. package/nitrogen/generated/ios/swift/DeveloperBillingTypeAndroid.swift +44 -0
  352. package/nitrogen/generated/ios/swift/DeveloperProvidedBillingDetailsAndroid.swift +121 -4
  353. package/nitrogen/generated/ios/swift/DeveloperProvidedBillingProductAndroid.swift +71 -0
  354. package/nitrogen/generated/ios/swift/Func_void_NitroBillingChoiceInfoAndroid.swift +46 -0
  355. package/nitrogen/generated/ios/swift/Func_void_NitroBillingResultAndroid.swift +46 -0
  356. package/nitrogen/generated/ios/swift/Func_void_NitroInAppMessageResultAndroid.swift +46 -0
  357. package/nitrogen/generated/ios/swift/HybridRnIapSpec.swift +5 -2
  358. package/nitrogen/generated/ios/swift/HybridRnIapSpec_cxx.swift +85 -9
  359. package/nitrogen/generated/ios/swift/InAppMessageCategoryAndroid.swift +40 -0
  360. package/nitrogen/generated/ios/swift/InAppMessageResponseCodeAndroid.swift +40 -0
  361. package/nitrogen/generated/ios/swift/InitConnectionConfig.swift +12 -1
  362. package/nitrogen/generated/ios/swift/NitroBillingChoiceInfoAndroid.swift +66 -0
  363. package/nitrogen/generated/ios/swift/NitroBillingProgramAvailabilityResultAndroid.swift +50 -2
  364. package/nitrogen/generated/ios/swift/NitroBillingProgramInformationDialogParamsAndroid.swift +34 -0
  365. package/nitrogen/generated/ios/swift/NitroBillingResultAndroid.swift +77 -0
  366. package/nitrogen/generated/ios/swift/NitroGetBillingChoiceInfoParamsAndroid.swift +71 -0
  367. package/nitrogen/generated/ios/swift/NitroInAppMessageParamsAndroid.swift +67 -0
  368. package/nitrogen/generated/ios/swift/NitroInAppMessageResultAndroid.swift +66 -0
  369. package/nitrogen/generated/ios/swift/NitroLaunchExternalLinkParamsAndroid.swift +39 -2
  370. package/nitrogen/generated/ios/swift/NitroOneTimePurchaseOfferDetail.swift +39 -2
  371. package/nitrogen/generated/ios/swift/NitroProduct.swift +113 -2
  372. package/nitrogen/generated/ios/swift/NitroPurchase.swift +204 -2
  373. package/nitrogen/generated/ios/swift/NitroPurchaseResult.swift +90 -1
  374. package/nitrogen/generated/ios/swift/NitroRenewalInfoIOS.swift +49 -1
  375. package/nitrogen/generated/ios/swift/NitroRequestPurchaseAndroid.swift +75 -1
  376. package/nitrogen/generated/ios/swift/NitroSubscriptionStatus.swift +11 -11
  377. package/nitrogen/generated/ios/swift/ProductType.swift +40 -0
  378. package/nitrogen/generated/ios/swift/Purchase.swift +12 -0
  379. package/nitrogen/generated/ios/swift/RequestPurchaseResult.swift +14 -0
  380. package/nitrogen/generated/ios/swift/SubResponseCodeAndroid.swift +44 -0
  381. package/nitrogen/generated/ios/swift/UserChoiceBillingDetails.swift +82 -2
  382. package/nitrogen/generated/ios/swift/Variant_Bool_NitroPurchaseResult.swift +12 -0
  383. package/nitrogen/generated/ios/swift/Variant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid.swift +12 -0
  384. package/nitrogen/generated/ios/swift/Variant_NullType_AdvancedCommerceInfoIOS.swift +12 -0
  385. package/nitrogen/generated/ios/swift/Variant_NullType_AdvancedCommerceItemDetailsIOS.swift +12 -0
  386. package/nitrogen/generated/ios/swift/Variant_NullType_Bool.swift +12 -0
  387. package/nitrogen/generated/ios/swift/Variant_NullType_DeveloperBillingOptionParamsAndroid.swift +30 -0
  388. package/nitrogen/generated/ios/swift/Variant_NullType_Dictionary_String__String_.swift +12 -0
  389. package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +12 -0
  390. package/nitrogen/generated/ios/swift/Variant_NullType_InitConnectionConfig.swift +12 -0
  391. package/nitrogen/generated/ios/swift/Variant_NullType_NitroAvailablePurchasesAndroidOptions.swift +12 -0
  392. package/nitrogen/generated/ios/swift/Variant_NullType_NitroAvailablePurchasesIosOptions.swift +12 -0
  393. package/nitrogen/generated/ios/swift/Variant_NullType_NitroDiscountAmountAndroid.swift +12 -0
  394. package/nitrogen/generated/ios/swift/Variant_NullType_NitroDiscountDisplayInfoAndroid.swift +12 -0
  395. package/nitrogen/generated/ios/swift/Variant_NullType_NitroFinishTransactionAndroidParams.swift +12 -0
  396. package/nitrogen/generated/ios/swift/Variant_NullType_NitroFinishTransactionIosParams.swift +12 -0
  397. package/nitrogen/generated/ios/swift/Variant_NullType_NitroInAppMessageParamsAndroid.swift +30 -0
  398. package/nitrogen/generated/ios/swift/Variant_NullType_NitroLimitedQuantityInfoAndroid.swift +12 -0
  399. package/nitrogen/generated/ios/swift/Variant_NullType_NitroPreorderDetailsAndroid.swift +12 -0
  400. package/nitrogen/generated/ios/swift/Variant_NullType_NitroProduct.swift +12 -0
  401. package/nitrogen/generated/ios/swift/Variant_NullType_NitroPurchase.swift +12 -0
  402. package/nitrogen/generated/ios/swift/Variant_NullType_NitroReceiptValidationAppleOptions.swift +12 -0
  403. package/nitrogen/generated/ios/swift/Variant_NullType_NitroReceiptValidationGoogleOptions.swift +12 -0
  404. package/nitrogen/generated/ios/swift/Variant_NullType_NitroReceiptValidationHorizonOptions.swift +12 -0
  405. package/nitrogen/generated/ios/swift/Variant_NullType_NitroRenewalInfoIOS.swift +12 -0
  406. package/nitrogen/generated/ios/swift/Variant_NullType_NitroRentalDetailsAndroid.swift +12 -0
  407. package/nitrogen/generated/ios/swift/Variant_NullType_NitroRequestPurchaseAndroid.swift +12 -0
  408. package/nitrogen/generated/ios/swift/Variant_NullType_NitroRequestPurchaseIos.swift +12 -0
  409. package/nitrogen/generated/ios/swift/Variant_NullType_NitroValidTimeWindowAndroid.swift +12 -0
  410. package/nitrogen/generated/ios/swift/Variant_NullType_NitroVerifyPurchaseWithIapkitAmazonProps.swift +12 -0
  411. package/nitrogen/generated/ios/swift/Variant_NullType_NitroVerifyPurchaseWithIapkitAppleProps.swift +12 -0
  412. package/nitrogen/generated/ios/swift/Variant_NullType_NitroVerifyPurchaseWithIapkitGoogleProps.swift +12 -0
  413. package/nitrogen/generated/ios/swift/Variant_NullType_NitroVerifyPurchaseWithIapkitProps.swift +12 -0
  414. package/nitrogen/generated/ios/swift/Variant_NullType_NitroVerifyPurchaseWithIapkitResult.swift +12 -0
  415. package/nitrogen/generated/ios/swift/Variant_NullType_PendingPurchaseUpdateAndroid.swift +12 -0
  416. package/nitrogen/generated/ios/swift/Variant_NullType_PromotionalOfferJwsInputIOS.swift +12 -0
  417. package/nitrogen/generated/ios/swift/Variant_NullType_PurchaseOfferIOS.swift +12 -0
  418. package/nitrogen/generated/ios/swift/Variant_NullType_RenewalCommitmentInfoIOS.swift +12 -0
  419. package/nitrogen/generated/ios/swift/Variant_NullType_RenewalInfoIOS.swift +12 -0
  420. package/nitrogen/generated/ios/swift/Variant_NullType_String.swift +12 -0
  421. package/nitrogen/generated/ios/swift/Variant_NullType_SubscriptionProductReplacementParamsAndroid.swift +12 -0
  422. package/nitrogen/generated/ios/swift/Variant_NullType_TransactionCommitmentInfoIOS.swift +12 -0
  423. package/nitrogen/generated/ios/swift/Variant_NullType_WinBackOfferInputIOS.swift +12 -0
  424. package/nitrogen/generated/ios/swift/Variant_NullType__AdvancedCommerceRefundIOS_.swift +12 -0
  425. package/nitrogen/generated/ios/swift/Variant_NullType__AndroidSubscriptionOfferInput_.swift +12 -0
  426. package/nitrogen/generated/ios/swift/Variant_NullType__DeveloperProvidedBillingProductAndroid_.swift +30 -0
  427. package/nitrogen/generated/ios/swift/Variant_NullType__InAppMessageCategoryAndroid_.swift +30 -0
  428. package/nitrogen/generated/ios/swift/Variant_NullType__NitroOneTimePurchaseOfferDetail_.swift +12 -0
  429. package/nitrogen/generated/ios/swift/Variant_NullType__NitroSubscriptionStatus_.swift +12 -0
  430. package/nitrogen/generated/ios/swift/Variant_NullType__NitroVerifyPurchaseWithProviderError_.swift +12 -0
  431. package/nitrogen/generated/ios/swift/Variant_NullType__String_.swift +12 -0
  432. package/nitrogen/generated/shared/c++/AdvancedCommerceInfoIOS.hpp +1 -1
  433. package/nitrogen/generated/shared/c++/AdvancedCommerceItemIOS.hpp +1 -1
  434. package/nitrogen/generated/shared/c++/BillingChoiceImageLayoutAndroid.hpp +80 -0
  435. package/nitrogen/generated/shared/c++/BillingChoiceScreenTypeAndroid.hpp +80 -0
  436. package/nitrogen/generated/shared/c++/BillingProgramAndroid.hpp +4 -0
  437. package/nitrogen/generated/shared/c++/DeveloperBillingLaunchModeAndroid.hpp +80 -0
  438. package/nitrogen/generated/shared/c++/DeveloperBillingOptionParamsAndroid.hpp +103 -0
  439. package/nitrogen/generated/shared/c++/DeveloperBillingTypeAndroid.hpp +80 -0
  440. package/nitrogen/generated/shared/c++/DeveloperProvidedBillingDetailsAndroid.hpp +25 -7
  441. package/nitrogen/generated/shared/c++/DeveloperProvidedBillingProductAndroid.hpp +96 -0
  442. package/nitrogen/generated/shared/c++/HybridRnIapSpec.cpp +3 -0
  443. package/nitrogen/generated/shared/c++/HybridRnIapSpec.hpp +26 -2
  444. package/nitrogen/generated/shared/c++/InAppMessageCategoryAndroid.hpp +76 -0
  445. package/nitrogen/generated/shared/c++/InAppMessageResponseCodeAndroid.hpp +76 -0
  446. package/nitrogen/generated/shared/c++/InitConnectionConfig.hpp +8 -1
  447. package/nitrogen/generated/shared/c++/NitroBillingChoiceInfoAndroid.hpp +90 -0
  448. package/nitrogen/generated/shared/c++/NitroBillingProgramAvailabilityResultAndroid.hpp +16 -2
  449. package/nitrogen/generated/shared/c++/NitroBillingProgramInformationDialogParamsAndroid.hpp +89 -0
  450. package/nitrogen/generated/shared/c++/NitroBillingResultAndroid.hpp +96 -0
  451. package/nitrogen/generated/shared/c++/NitroGetBillingChoiceInfoParamsAndroid.hpp +99 -0
  452. package/nitrogen/generated/shared/c++/NitroInAppMessageParamsAndroid.hpp +88 -0
  453. package/nitrogen/generated/shared/c++/NitroInAppMessageResultAndroid.hpp +92 -0
  454. package/nitrogen/generated/shared/c++/NitroLaunchExternalLinkParamsAndroid.hpp +9 -2
  455. package/nitrogen/generated/shared/c++/NitroOneTimePurchaseOfferDetail.hpp +6 -2
  456. package/nitrogen/generated/shared/c++/NitroProduct.hpp +14 -2
  457. package/nitrogen/generated/shared/c++/NitroPurchase.hpp +40 -3
  458. package/nitrogen/generated/shared/c++/NitroPurchaseRequest.hpp +1 -1
  459. package/nitrogen/generated/shared/c++/NitroPurchaseResult.hpp +27 -4
  460. package/nitrogen/generated/shared/c++/NitroReceiptValidationResultIOS.hpp +1 -1
  461. package/nitrogen/generated/shared/c++/NitroRenewalInfoIOS.hpp +15 -2
  462. package/nitrogen/generated/shared/c++/NitroRequestPurchaseAndroid.hpp +13 -2
  463. package/nitrogen/generated/shared/c++/NitroSubscriptionStatus.hpp +8 -8
  464. package/nitrogen/generated/shared/c++/NitroVerifyPurchaseWithProviderResult.hpp +1 -1
  465. package/nitrogen/generated/shared/c++/PendingPurchaseUpdateAndroid.hpp +1 -1
  466. package/nitrogen/generated/shared/c++/ProductType.hpp +76 -0
  467. package/nitrogen/generated/shared/c++/PurchaseAndroid.hpp +1 -1
  468. package/nitrogen/generated/shared/c++/PurchaseIOS.hpp +1 -1
  469. package/nitrogen/generated/shared/c++/SubResponseCodeAndroid.hpp +80 -0
  470. package/nitrogen/generated/shared/c++/UserChoiceBillingDetails.hpp +16 -3
  471. package/openiap-versions.json +3 -3
  472. package/package.json +8 -5
  473. package/src/hooks/useIAP.ts +70 -4
  474. package/src/index.kepler.ts +9 -0
  475. package/src/index.ts +268 -120
  476. package/src/specs/RnIap.nitro.ts +141 -27
  477. package/src/types.ts +294 -59
  478. package/src/utils/error.ts +11 -8
  479. package/src/utils/errorMapping.ts +9 -1
  480. package/src/utils/type-bridge.ts +63 -42
  481. package/src/vega-adapter.ts +112 -15
  482. package/nitrogen/generated/android/c++/JNitroSubscriptionRenewalInfo.hpp +0 -83
  483. package/nitrogen/generated/android/c++/JVariant_NullType_NitroSubscriptionRenewalInfo.cpp +0 -26
  484. package/nitrogen/generated/android/c++/JVariant_NullType_NitroSubscriptionRenewalInfo.hpp +0 -75
  485. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroSubscriptionRenewalInfo.kt +0 -53
  486. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroSubscriptionRenewalInfo.kt +0 -53
  487. package/nitrogen/generated/ios/swift/NitroSubscriptionRenewalInfo.swift +0 -182
  488. package/nitrogen/generated/ios/swift/Variant_NullType_NitroSubscriptionRenewalInfo.swift +0 -18
  489. package/nitrogen/generated/shared/c++/NitroSubscriptionRenewalInfo.hpp +0 -106
@@ -18,7 +18,7 @@ import dev.hyo.openiap.ProductRequest
18
18
  import dev.hyo.openiap.ProductSubscriptionAndroid
19
19
  import dev.hyo.openiap.ProductSubscriptionAndroidOfferDetails
20
20
  import dev.hyo.openiap.ProductCommon
21
- import dev.hyo.openiap.ProductType
21
+ import dev.hyo.openiap.ProductType as OpenIapProductType
22
22
  import dev.hyo.openiap.Purchase as OpenIapPurchase
23
23
  import dev.hyo.openiap.PurchaseAndroid
24
24
  import dev.hyo.openiap.RequestPurchaseAndroidProps
@@ -28,6 +28,7 @@ import dev.hyo.openiap.RequestPurchaseResultPurchase
28
28
  import dev.hyo.openiap.RequestPurchaseResultPurchases
29
29
  import dev.hyo.openiap.RequestSubscriptionAndroidProps
30
30
  import dev.hyo.openiap.RequestSubscriptionPropsByPlatforms
31
+ import dev.hyo.openiap.SubResponseCodeAndroid as OpenIapSubResponseCodeAndroid
31
32
  import dev.hyo.openiap.SubscriptionProductReplacementParamsAndroid as OpenIapSubscriptionProductReplacementParams
32
33
  import dev.hyo.openiap.SubscriptionReplacementModeAndroid as OpenIapSubscriptionReplacementMode
33
34
  import dev.hyo.openiap.VerifyPurchaseGoogleOptions
@@ -37,7 +38,17 @@ import dev.hyo.openiap.InitConnectionConfig as OpenIapInitConnectionConfig
37
38
  import dev.hyo.openiap.listener.OpenIapPurchaseErrorListener
38
39
  import dev.hyo.openiap.listener.OpenIapPurchaseUpdateListener
39
40
  import dev.hyo.openiap.listener.OpenIapUserChoiceBillingListener
41
+ import dev.hyo.openiap.BillingChoiceImageLayoutAndroid as OpenIapBillingChoiceImageLayout
42
+ import dev.hyo.openiap.BillingChoiceScreenTypeAndroid as OpenIapBillingChoiceScreenType
43
+ import dev.hyo.openiap.BillingProgramInformationDialogParamsAndroid as OpenIapBillingProgramInformationDialogParams
40
44
  import dev.hyo.openiap.BillingProgramAndroid as OpenIapBillingProgramAndroid
45
+ import dev.hyo.openiap.DeveloperBillingTypeAndroid as OpenIapDeveloperBillingType
46
+ import dev.hyo.openiap.DeveloperBillingLaunchModeAndroid as OpenIapDeveloperBillingLaunchMode
47
+ import dev.hyo.openiap.DeveloperBillingOptionParamsAndroid as OpenIapDeveloperBillingOptionParams
48
+ import dev.hyo.openiap.GetBillingChoiceInfoParamsAndroid as OpenIapGetBillingChoiceInfoParams
49
+ import dev.hyo.openiap.InAppMessageCategoryAndroid as OpenIapInAppMessageCategory
50
+ import dev.hyo.openiap.InAppMessageParamsAndroid as OpenIapInAppMessageParams
51
+ import dev.hyo.openiap.InAppMessageResponseCodeAndroid as OpenIapInAppMessageResponseCode
41
52
  import dev.hyo.openiap.LaunchExternalLinkParamsAndroid as OpenIapLaunchExternalLinkParams
42
53
  import dev.hyo.openiap.ExternalLinkLaunchModeAndroid as OpenIapExternalLinkLaunchMode
43
54
  import dev.hyo.openiap.ExternalLinkTypeAndroid as OpenIapExternalLinkType
@@ -47,7 +58,6 @@ import java.util.Locale
47
58
  import kotlin.coroutines.cancellation.CancellationException
48
59
  import kotlinx.coroutines.Dispatchers
49
60
  import kotlinx.coroutines.withContext
50
- import kotlinx.coroutines.CompletableDeferred
51
61
  import org.json.JSONArray
52
62
  import org.json.JSONObject
53
63
 
@@ -55,7 +65,7 @@ import org.json.JSONObject
55
65
  * Custom exception for OpenIAP errors that only includes the error JSON without stack traces.
56
66
  * This ensures clean error messages are passed to JavaScript without Java/Kotlin stack traces.
57
67
  */
58
- class OpenIapException(private val errorJson: String) : Exception() {
68
+ class OpenIapException(private val errorJson: String, cause: Throwable? = null) : Exception(cause) {
59
69
  override val message: String
60
70
  get() = errorJson
61
71
 
@@ -67,6 +77,15 @@ class OpenIapException(private val errorJson: String) : Exception() {
67
77
  }
68
78
  }
69
79
 
80
+ internal suspend fun endRnConnectionWithCleanup(
81
+ endConnection: suspend () -> Boolean,
82
+ cleanup: () -> Unit,
83
+ ): Boolean = try {
84
+ endConnection()
85
+ } finally {
86
+ cleanup()
87
+ }
88
+
70
89
  class HybridRnIap : HybridRnIapSpec() {
71
90
  private data class PurchaseUpdatedListenerRegistration(
72
91
  val token: Double,
@@ -92,14 +111,24 @@ class HybridRnIap : HybridRnIapSpec() {
92
111
  private val subscriptionBillingIssueListeners = mutableListOf<(NitroPurchase) -> Unit>()
93
112
  private var listenersAttached = false
94
113
  private var isInitialized = false
95
- private var initDeferred: CompletableDeferred<Boolean>? = null
96
- private val initLock = Any()
114
+ private val connectionLifecycleQueue = ConnectionLifecycleQueue()
97
115
 
98
116
  // Connection methods
99
117
  // Variant wrapper helpers for nitrogen 0.35.0 compatibility
100
118
  private fun String?.wrapVariant(): Variant_NullType_String? = this?.let { Variant_NullType_String.Second(it) }
101
119
  private fun Double?.wrapVariant(): Variant_NullType_Double? = this?.let { Variant_NullType_Double.Second(it) }
102
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
+ }
103
132
  private fun Variant_NullType_String?.unwrapString(): String? = (this as? Variant_NullType_String.Second)?.value
104
133
  private fun Variant_NullType_Double?.unwrapDouble(): Double? = (this as? Variant_NullType_Double.Second)?.value
105
134
  private fun Variant_NullType_Boolean?.unwrapBool(): Boolean? = (this as? Variant_NullType_Boolean.Second)?.value
@@ -109,14 +138,10 @@ class HybridRnIap : HybridRnIapSpec() {
109
138
  }
110
139
 
111
140
  override fun initConnection(config: Variant_NullType_InitConnectionConfig?): Promise<Boolean> {
112
- return Promise.async {
113
- 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@{
114
143
  RnIapLog.payload("initConnection", configValue)
115
- // Fast-path: if already initialized, return immediately
116
- if (isInitialized) {
117
- RnIapLog.result("initConnection", true)
118
- return@async true
119
- }
144
+ if (isInitialized) return@initOperation true
120
145
 
121
146
  // CRITICAL: Set Activity BEFORE calling initConnection
122
147
  // Horizon SDK needs Activity to initialize OVRPlatform with proper returnComponent
@@ -151,28 +176,14 @@ class HybridRnIap : HybridRnIapSpec() {
151
176
  )
152
177
  }
153
178
 
154
- // Single-flight: capture or create the shared Deferred atomically
155
- val wasExisting = synchronized(initLock) {
156
- if (initDeferred == null) {
157
- initDeferred = CompletableDeferred()
158
- false
159
- } else true
160
- }
161
- if (wasExisting) {
162
- val result = initDeferred!!.await()
163
- RnIapLog.result("initConnection.await", result)
164
- return@async result
165
- }
166
-
167
179
  try {
168
180
  if (!listenersAttached) {
169
- listenersAttached = true
170
181
  RnIapLog.payload("listeners.attach", null)
171
182
  openIap.addPurchaseUpdateListener(OpenIapPurchaseUpdateListener { p ->
172
183
  runCatching {
173
184
  RnIapLog.result(
174
185
  "purchaseUpdatedListener",
175
- mapOf("id" to p.id, "sku" to p.productId)
186
+ mapOf("productId" to p.productId)
176
187
  )
177
188
  sendPurchaseUpdate(convertToNitroPurchase(p))
178
189
  }.onFailure { RnIapLog.failure("purchaseUpdatedListener", it) }
@@ -194,26 +205,61 @@ class HybridRnIap : HybridRnIapSpec() {
194
205
  "userChoiceBillingListener",
195
206
  mapOf("products" to details.products, "token" to details.externalTransactionToken)
196
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()
197
217
  val nitroDetails = UserChoiceBillingDetails(
198
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
+ },
199
232
  products = details.products.toTypedArray()
200
233
  )
201
234
  sendUserChoiceBilling(nitroDetails)
202
235
  }.onFailure { RnIapLog.failure("userChoiceBillingListener", it) }
203
236
  })
204
- // Developer Provided Billing listener (External Payments - 8.3.0+)
237
+ // Developer Provided Billing listener (External Payments 8.3.0+, Billing Choice 9.1.0+)
205
238
  openIap.addDeveloperProvidedBillingListener(OpenIapDeveloperProvidedBillingListener { details ->
206
239
  runCatching {
207
240
  RnIapLog.result(
208
241
  "developerProvidedBillingListener",
209
- mapOf("token" to details.externalTransactionToken)
242
+ mapOf("productCount" to details.products.size)
210
243
  )
211
244
  val nitroDetails = DeveloperProvidedBillingDetailsAndroid(
212
- externalTransactionToken = details.externalTransactionToken
245
+ externalTransactionToken = details.externalTransactionToken.wrapVariant(),
246
+ linkUri = details.linkUri.wrapVariant(),
247
+ originalExternalTransactionId = details.originalExternalTransactionId.wrapVariant(),
248
+ products = details.products.map { product ->
249
+ DeveloperProvidedBillingProductAndroid(
250
+ id = product.id,
251
+ offerToken = product.offerToken.wrapVariant(),
252
+ type = when (product.type) {
253
+ OpenIapProductType.InApp -> ProductType.IN_APP
254
+ OpenIapProductType.Subs -> ProductType.SUBS
255
+ }
256
+ )
257
+ }.toTypedArray()
213
258
  )
214
259
  sendDeveloperProvidedBilling(nitroDetails)
215
260
  }.onFailure { RnIapLog.failure("developerProvidedBillingListener", it) }
216
261
  })
262
+ listenersAttached = true
217
263
  RnIapLog.result("listeners.attach", "attached")
218
264
  }
219
265
  } catch (err: CancellationException) {
@@ -230,18 +276,10 @@ class HybridRnIap : HybridRnIapSpec() {
230
276
  messageOverride = "Failed to register billing listeners: $errorMessage"
231
277
  )
232
278
  )
233
- synchronized(initLock) {
234
- initDeferred?.let { deferred ->
235
- if (!deferred.isCompleted) deferred.completeExceptionally(wrapped)
236
- }
237
- initDeferred = null
238
- }
239
279
  isInitialized = false
240
280
  throw wrapped
241
281
  }
242
282
 
243
- // We created it above; reuse the shared instance
244
- val deferred = initDeferred!!
245
283
  try {
246
284
  // Convert Nitro config to OpenIAP config
247
285
  // Note: enableBillingProgramAndroid is passed to OpenIapInitConnectionConfig
@@ -255,6 +293,9 @@ class HybridRnIap : HybridRnIapSpec() {
255
293
  },
256
294
  enableBillingProgramAndroid = configValue.enableBillingProgramAndroid?.let { program ->
257
295
  mapBillingProgram(program)
296
+ },
297
+ billingChoiceScreenTypeAndroid = configValue.billingChoiceScreenTypeAndroid?.let { type ->
298
+ mapBillingChoiceScreenTypeToOpenIap(type)
258
299
  }
259
300
  )
260
301
  }
@@ -263,6 +304,8 @@ class HybridRnIap : HybridRnIapSpec() {
263
304
  withContext(Dispatchers.Main) {
264
305
  openIap.initConnection(openIapConfig)
265
306
  }
307
+ } catch (err: CancellationException) {
308
+ throw err
266
309
  } catch (err: Throwable) {
267
310
  val error = OpenIapError.InitConnection
268
311
  RnIapLog.failure("initConnection.native", err)
@@ -284,42 +327,57 @@ class HybridRnIap : HybridRnIapSpec() {
284
327
  )
285
328
  )
286
329
  }
287
- isInitialized = true
288
- deferred.complete(true)
289
- RnIapLog.result("initConnection", true)
290
330
  true
291
331
  } catch (e: Exception) {
292
- // Complete exceptionally so all concurrent awaiters receive the same failure
293
- if (!deferred.isCompleted) deferred.completeExceptionally(e)
294
- isInitialized = false
295
332
  RnIapLog.failure("initConnection", e)
296
333
  throw e
297
- } finally {
298
- initDeferred = null
299
334
  }
300
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
+ }
301
347
  }
302
348
 
303
349
  override fun endConnection(): Promise<Boolean> {
304
- 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) {
305
358
  RnIapLog.payload("endConnection", null)
306
- runCatching { openIap.endConnection() }
307
- productTypeBySku.clear()
308
- isInitialized = false
309
- listenersAttached = false
310
- synchronized(purchaseUpdatedListeners) {
311
- purchaseUpdatedListeners.clear()
312
- nextPurchaseUpdatedListenerToken = 1.0
313
- }
314
- synchronized(purchaseErrorListeners) { purchaseErrorListeners.clear() }
315
- promotedProductListenersIOS.clear()
316
- synchronized(userChoiceBillingListenersAndroid) { userChoiceBillingListenersAndroid.clear() }
317
- synchronized(developerProvidedBillingListenersAndroid) { developerProvidedBillingListenersAndroid.clear() }
318
- synchronized(subscriptionBillingIssueListeners) { subscriptionBillingIssueListeners.clear() }
319
- detachSubscriptionBillingIssueIfNeeded()
320
- initDeferred = null
321
- RnIapLog.result("endConnection", true)
322
- 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()
323
381
  }
324
382
  }
325
383
 
@@ -478,6 +536,11 @@ class HybridRnIap : HybridRnIapSpec() {
478
536
  }
479
537
  ?: emptyList()
480
538
  val normalizedOffers = subscriptionOffers.takeIf { it.isNotEmpty() }
539
+ val developerBillingOption =
540
+ (androidRequest.developerBillingOption as?
541
+ Variant_NullType_DeveloperBillingOptionParamsAndroid.Second)
542
+ ?.value
543
+ ?.let(::mapDeveloperBillingOption)
481
544
 
482
545
  val requestProps = when (queryType) {
483
546
  ProductQueryType.Subs -> {
@@ -495,6 +558,8 @@ class HybridRnIap : HybridRnIapSpec() {
495
558
  isOfferPersonalized = androidRequest.isOfferPersonalized.unwrapBool(),
496
559
  obfuscatedAccountId = androidRequest.obfuscatedAccountId.unwrapString(),
497
560
  obfuscatedProfileId = androidRequest.obfuscatedProfileId.unwrapString(),
561
+ developerBillingOption = developerBillingOption,
562
+ originalExternalTransactionId = androidRequest.originalExternalTransactionId.unwrapString(),
498
563
  purchaseToken = androidRequest.purchaseToken.unwrapString(),
499
564
  replacementMode = replacementMode,
500
565
  skus = androidRequest.skus.toList(),
@@ -503,7 +568,7 @@ class HybridRnIap : HybridRnIapSpec() {
503
568
  )
504
569
  RequestPurchaseProps(
505
570
  request = RequestPurchaseProps.Request.Subscription(
506
- RequestSubscriptionPropsByPlatforms(android = androidProps)
571
+ RequestSubscriptionPropsByPlatforms(google = androidProps)
507
572
  ),
508
573
  type = ProductQueryType.Subs
509
574
  )
@@ -513,12 +578,13 @@ class HybridRnIap : HybridRnIapSpec() {
513
578
  isOfferPersonalized = androidRequest.isOfferPersonalized.unwrapBool(),
514
579
  obfuscatedAccountId = androidRequest.obfuscatedAccountId.unwrapString(),
515
580
  obfuscatedProfileId = androidRequest.obfuscatedProfileId.unwrapString(),
581
+ developerBillingOption = developerBillingOption,
516
582
  offerToken = androidRequest.offerToken.unwrapString(),
517
583
  skus = androidRequest.skus.toList()
518
584
  )
519
585
  RequestPurchaseProps(
520
586
  request = RequestPurchaseProps.Request.Purchase(
521
- RequestPurchasePropsByPlatforms(android = androidProps)
587
+ RequestPurchasePropsByPlatforms(google = androidProps)
522
588
  ),
523
589
  type = ProductQueryType.InApp
524
590
  )
@@ -538,14 +604,13 @@ class HybridRnIap : HybridRnIapSpec() {
538
604
  openIap.requestPurchase(requestProps)
539
605
  }
540
606
  val purchases = result.purchasesOrEmpty()
541
- purchases.forEach { p ->
542
- runCatching {
543
- RnIapLog.result(
544
- "requestPurchase.native",
545
- mapOf("id" to p.id, "sku" to p.productId)
546
- )
547
- }.onFailure { RnIapLog.failure("requestPurchase.native", it) }
548
- }
607
+ RnIapLog.result(
608
+ "requestPurchase.native",
609
+ mapOf(
610
+ "purchaseCount" to purchases.size,
611
+ "productIds" to purchases.map { it.productId }
612
+ )
613
+ )
549
614
 
550
615
  defaultResult
551
616
  } catch (e: Exception) {
@@ -605,7 +670,10 @@ class HybridRnIap : HybridRnIapSpec() {
605
670
  }
606
671
  RnIapLog.result(
607
672
  "getAvailablePurchases",
608
- 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
+ )
609
677
  )
610
678
  result.map { convertToNitroPurchase(it) }.toTypedArray()
611
679
  }
@@ -718,7 +786,12 @@ class HybridRnIap : HybridRnIapSpec() {
718
786
  debugMessage = "Missing purchaseToken",
719
787
  code = OpenIapError.toCode(OpenIapError.DeveloperError()),
720
788
  message = "Missing purchaseToken",
721
- purchaseToken = null
789
+ purchaseToken = null,
790
+ productId = null,
791
+ productIds = null,
792
+ productType = null,
793
+ isEmptyProductList = null,
794
+ subResponseCodeAndroid = null
722
795
  )
723
796
  )
724
797
  }
@@ -734,7 +807,12 @@ class HybridRnIap : HybridRnIapSpec() {
734
807
  debugMessage = e.message,
735
808
  code = OpenIapError.toCode(err),
736
809
  message = e.message?.takeIf { it.isNotBlank() } ?: err.message,
737
- purchaseToken = purchaseToken
810
+ purchaseToken = purchaseToken,
811
+ productId = null,
812
+ productIds = null,
813
+ productType = null,
814
+ isEmptyProductList = null,
815
+ subResponseCodeAndroid = null
738
816
  )
739
817
  )
740
818
  }
@@ -751,7 +829,12 @@ class HybridRnIap : HybridRnIapSpec() {
751
829
  debugMessage = null,
752
830
  code = "0",
753
831
  message = "OK",
754
- purchaseToken = purchaseToken
832
+ purchaseToken = purchaseToken,
833
+ productId = null,
834
+ productIds = null,
835
+ productType = null,
836
+ isEmptyProductList = null,
837
+ subResponseCodeAndroid = null
755
838
  )
756
839
  )
757
840
  RnIapLog.result("finishTransaction", mapOf("success" to true))
@@ -765,7 +848,12 @@ class HybridRnIap : HybridRnIapSpec() {
765
848
  debugMessage = e.message,
766
849
  code = OpenIapError.toCode(err),
767
850
  message = e.message?.takeIf { it.isNotBlank() } ?: err.message,
768
- purchaseToken = null
851
+ purchaseToken = null,
852
+ productId = null,
853
+ productIds = null,
854
+ productType = null,
855
+ isEmptyProductList = null,
856
+ subResponseCodeAndroid = null
769
857
  )
770
858
  )
771
859
  }
@@ -778,11 +866,30 @@ class HybridRnIap : HybridRnIapSpec() {
778
866
  ensureConnection()
779
867
  RnIapLog.payload("getStorefront", null)
780
868
  val value = openIap.getStorefront()
869
+ if (value.isBlank()) {
870
+ throw OpenIapError.ServiceUnavailable(
871
+ "Storefront lookup returned no country code"
872
+ )
873
+ }
781
874
  RnIapLog.result("getStorefront", value)
782
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))
783
882
  } catch (e: Exception) {
784
883
  RnIapLog.failure("getStorefront", e)
785
- ""
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
+ )
786
893
  }
787
894
  }
788
895
  }
@@ -879,7 +986,12 @@ class HybridRnIap : HybridRnIapSpec() {
879
986
  debugMessage = debugMessage,
880
987
  code = errorCode,
881
988
  message = message,
882
- purchaseToken = null
989
+ purchaseToken = null,
990
+ productId = sku,
991
+ productIds = null,
992
+ productType = null,
993
+ isEmptyProductList = null,
994
+ subResponseCodeAndroid = null
883
995
  )
884
996
  }
885
997
 
@@ -924,111 +1036,21 @@ class HybridRnIap : HybridRnIapSpec() {
924
1036
  }
925
1037
 
926
1038
  private fun serializeSubscriptionOffers(offers: List<ProductSubscriptionAndroidOfferDetails>): String {
927
- val array = JSONArray()
928
- offers.forEach { offer ->
929
- val offerJson = JSONObject()
930
- offerJson.put("basePlanId", offer.basePlanId)
931
- offerJson.put("offerId", offer.offerId)
932
- offerJson.put("offerTags", JSONArray(offer.offerTags))
933
- offerJson.put("offerToken", offer.offerToken)
934
-
935
- val phasesArray = JSONArray()
936
- offer.pricingPhases.pricingPhaseList.forEach { phase ->
937
- val phaseJson = JSONObject()
938
- phaseJson.put("billingCycleCount", phase.billingCycleCount)
939
- phaseJson.put("billingPeriod", phase.billingPeriod)
940
- phaseJson.put("formattedPrice", phase.formattedPrice)
941
- phaseJson.put("priceAmountMicros", phase.priceAmountMicros)
942
- phaseJson.put("priceCurrencyCode", phase.priceCurrencyCode)
943
- phaseJson.put("recurrenceMode", phase.recurrenceMode)
944
- phasesArray.put(phaseJson)
945
- }
946
-
947
- val pricingPhasesJson = JSONObject()
948
- pricingPhasesJson.put("pricingPhaseList", phasesArray)
949
- offerJson.put("pricingPhases", pricingPhasesJson)
950
-
951
- array.put(offerJson)
952
- }
953
- return array.toString()
1039
+ return JSONArray(legacySubscriptionOfferMaps(offers)).toString()
954
1040
  }
955
1041
 
956
1042
  /**
957
1043
  * Serialize standardized SubscriptionOffer list to JSON string (OpenIAP 1.3.10+)
958
1044
  */
959
1045
  private fun serializeStandardizedSubscriptionOffers(offers: List<dev.hyo.openiap.SubscriptionOffer>): String {
960
- val array = JSONArray()
961
- offers.forEach { offer ->
962
- val offerJson = JSONObject()
963
- offerJson.put("id", offer.id)
964
- offerJson.put("displayPrice", offer.displayPrice)
965
- offerJson.put("price", offer.price)
966
- offerJson.put("type", offer.type.rawValue)
967
- offer.currency?.let { offerJson.put("currency", it) }
968
- offer.basePlanIdAndroid?.let { offerJson.put("basePlanIdAndroid", it) }
969
- offer.offerTokenAndroid?.let { offerJson.put("offerTokenAndroid", it) }
970
- offer.offerTagsAndroid?.let { offerJson.put("offerTagsAndroid", JSONArray(it)) }
971
- offer.paymentMode?.let { offerJson.put("paymentMode", it.rawValue) }
972
- offer.periodCount?.let { offerJson.put("periodCount", it) }
973
- offer.numberOfPeriodsIOS?.let { offerJson.put("numberOfPeriodsIOS", it) }
974
- offer.period?.let { period ->
975
- val periodJson = JSONObject()
976
- periodJson.put("unit", period.unit.rawValue)
977
- periodJson.put("value", period.value)
978
- offerJson.put("period", periodJson)
979
- }
980
- offer.pricingPhasesAndroid?.let { phases ->
981
- val phasesJson = JSONObject()
982
- val phaseList = JSONArray()
983
- phases.pricingPhaseList.forEach { phase ->
984
- val phaseJson = JSONObject()
985
- phaseJson.put("billingCycleCount", phase.billingCycleCount)
986
- phaseJson.put("billingPeriod", phase.billingPeriod)
987
- phaseJson.put("formattedPrice", phase.formattedPrice)
988
- phaseJson.put("priceAmountMicros", phase.priceAmountMicros)
989
- phaseJson.put("priceCurrencyCode", phase.priceCurrencyCode)
990
- phaseJson.put("recurrenceMode", phase.recurrenceMode)
991
- phaseList.put(phaseJson)
992
- }
993
- phasesJson.put("pricingPhaseList", phaseList)
994
- offerJson.put("pricingPhasesAndroid", phasesJson)
995
- }
996
- array.put(offerJson)
997
- }
998
- return array.toString()
1046
+ return JSONArray(subscriptionOfferMaps(offers)).toString()
999
1047
  }
1000
1048
 
1001
1049
  /**
1002
1050
  * Serialize standardized DiscountOffer list to JSON string (OpenIAP 1.3.10+)
1003
1051
  */
1004
1052
  private fun serializeStandardizedDiscountOffers(offers: List<dev.hyo.openiap.DiscountOffer>): String {
1005
- val array = JSONArray()
1006
- offers.forEach { offer ->
1007
- val offerJson = JSONObject()
1008
- offerJson.put("currency", offer.currency)
1009
- offerJson.put("displayPrice", offer.displayPrice)
1010
- offerJson.put("price", offer.price)
1011
- offer.id?.let { offerJson.put("id", it) }
1012
- offer.offerTagsAndroid?.let { offerJson.put("offerTagsAndroid", JSONArray(it)) }
1013
- offer.offerTokenAndroid?.let { offerJson.put("offerTokenAndroid", it) }
1014
- offer.discountAmountMicrosAndroid?.let { offerJson.put("discountAmountMicrosAndroid", it) }
1015
- offer.formattedDiscountAmountAndroid?.let { offerJson.put("formattedDiscountAmountAndroid", it) }
1016
- offer.fullPriceMicrosAndroid?.let { offerJson.put("fullPriceMicrosAndroid", it) }
1017
- offer.limitedQuantityInfoAndroid?.let { info ->
1018
- val infoJson = JSONObject()
1019
- infoJson.put("maximumQuantity", info.maximumQuantity)
1020
- infoJson.put("remainingQuantity", info.remainingQuantity)
1021
- offerJson.put("limitedQuantityInfoAndroid", infoJson)
1022
- }
1023
- offer.validTimeWindowAndroid?.let { window ->
1024
- val windowJson = JSONObject()
1025
- windowJson.put("startTimeMillis", window.startTimeMillis)
1026
- windowJson.put("endTimeMillis", window.endTimeMillis)
1027
- offerJson.put("validTimeWindowAndroid", windowJson)
1028
- }
1029
- array.put(offerJson)
1030
- }
1031
- return array.toString()
1053
+ return JSONArray(discountOfferMaps(offers)).toString()
1032
1054
  }
1033
1055
 
1034
1056
  private fun convertToNitroProduct(product: ProductCommon): NitroProduct {
@@ -1044,64 +1066,9 @@ class HybridRnIap : HybridRnIapSpec() {
1044
1066
  }
1045
1067
 
1046
1068
  val subscriptionOffersJson = subscriptionOffers.takeIf { it.isNotEmpty() }?.let { serializeSubscriptionOffers(it) }
1047
- val oneTimeOffersNitro = oneTimeOffers?.map { otp ->
1048
- NitroOneTimePurchaseOfferDetail(
1049
- formattedPrice = otp.formattedPrice,
1050
- priceAmountMicros = otp.priceAmountMicros,
1051
- priceCurrencyCode = otp.priceCurrencyCode,
1052
- offerId = otp.offerId.wrapVariant(),
1053
- offerToken = otp.offerToken,
1054
- offerTags = otp.offerTags.toTypedArray(),
1055
- fullPriceMicros = otp.fullPriceMicros.wrapVariant(),
1056
- discountDisplayInfo = otp.discountDisplayInfo?.let { discount ->
1057
- Variant_NullType_NitroDiscountDisplayInfoAndroid.Second(
1058
- NitroDiscountDisplayInfoAndroid(
1059
- percentageDiscount = discount.percentageDiscount?.toDouble().wrapVariant(),
1060
- discountAmount = discount.discountAmount?.let { amount ->
1061
- Variant_NullType_NitroDiscountAmountAndroid.Second(
1062
- NitroDiscountAmountAndroid(
1063
- discountAmountMicros = amount.discountAmountMicros,
1064
- formattedDiscountAmount = amount.formattedDiscountAmount
1065
- )
1066
- )
1067
- }
1068
- )
1069
- )
1070
- },
1071
- validTimeWindow = otp.validTimeWindow?.let { window ->
1072
- Variant_NullType_NitroValidTimeWindowAndroid.Second(
1073
- NitroValidTimeWindowAndroid(
1074
- startTimeMillis = window.startTimeMillis,
1075
- endTimeMillis = window.endTimeMillis
1076
- )
1077
- )
1078
- },
1079
- limitedQuantityInfo = otp.limitedQuantityInfo?.let { info ->
1080
- Variant_NullType_NitroLimitedQuantityInfoAndroid.Second(
1081
- NitroLimitedQuantityInfoAndroid(
1082
- maximumQuantity = info.maximumQuantity.toDouble(),
1083
- remainingQuantity = info.remainingQuantity.toDouble()
1084
- )
1085
- )
1086
- },
1087
- preorderDetailsAndroid = otp.preorderDetailsAndroid?.let { preorder ->
1088
- Variant_NullType_NitroPreorderDetailsAndroid.Second(
1089
- NitroPreorderDetailsAndroid(
1090
- preorderPresaleEndTimeMillis = preorder.preorderPresaleEndTimeMillis,
1091
- preorderReleaseTimeMillis = preorder.preorderReleaseTimeMillis
1092
- )
1093
- )
1094
- },
1095
- rentalDetailsAndroid = otp.rentalDetailsAndroid?.let { rental ->
1096
- Variant_NullType_NitroRentalDetailsAndroid.Second(
1097
- NitroRentalDetailsAndroid(
1098
- rentalExpirationPeriod = rental.rentalExpirationPeriod?.let { Variant_NullType_String.Second(it) },
1099
- rentalPeriod = rental.rentalPeriod
1100
- )
1101
- )
1102
- }
1103
- )
1104
- }?.toTypedArray()
1069
+ val oneTimeOffersNitro = oneTimeOffers
1070
+ ?.map { it.toNitroOneTimePurchaseOfferDetail() }
1071
+ ?.toTypedArray()
1105
1072
 
1106
1073
  var originalPriceAndroid: String? = null
1107
1074
  var originalPriceAmountMicrosAndroid: Double? = null
@@ -1111,7 +1078,7 @@ class HybridRnIap : HybridRnIapSpec() {
1111
1078
  var subscriptionPeriodAndroid: String? = null
1112
1079
  var freeTrialPeriodAndroid: String? = null
1113
1080
 
1114
- if (product.type == ProductType.InApp) {
1081
+ if (product.type == OpenIapProductType.InApp) {
1115
1082
  oneTimeOffers?.firstOrNull()?.let { otp ->
1116
1083
  originalPriceAndroid = otp.formattedPrice
1117
1084
  originalPriceAmountMicrosAndroid = otp.priceAmountMicros.toDoubleOrNull()
@@ -1177,6 +1144,7 @@ class HybridRnIap : HybridRnIapSpec() {
1177
1144
  id = product.id,
1178
1145
  title = product.title,
1179
1146
  description = product.description,
1147
+ debugDescription = product.nitroDebugDescription(),
1180
1148
  type = product.type.rawValue,
1181
1149
  displayName = product.displayName.wrapVariant(),
1182
1150
  displayPrice = product.displayPrice,
@@ -1186,6 +1154,8 @@ class HybridRnIap : HybridRnIapSpec() {
1186
1154
  typeIOS = null,
1187
1155
  isFamilyShareableIOS = null,
1188
1156
  jsonRepresentationIOS = null,
1157
+ pricingTermsIOS = null,
1158
+ subscriptionInfoIOS = null,
1189
1159
  discountsIOS = null,
1190
1160
  subscriptionPeriodUnitIOS = null,
1191
1161
  subscriptionPeriodNumberIOS = null,
@@ -1225,11 +1195,16 @@ class HybridRnIap : HybridRnIapSpec() {
1225
1195
  productId = purchase.productId,
1226
1196
  transactionDate = purchase.transactionDate,
1227
1197
  purchaseToken = purchase.purchaseToken.wrapVariant(),
1198
+ currentPlanId = purchase.currentPlanId.wrapVariant(),
1199
+ ids = purchase.ids.wrapVariant(),
1228
1200
  platform = IapPlatform.ANDROID,
1229
1201
  store = mapIapStore(purchase.store),
1230
1202
  quantity = purchase.quantity.toDouble(),
1231
1203
  purchaseState = mapPurchaseState(purchase.purchaseState),
1232
1204
  isAutoRenewing = purchase.isAutoRenewing,
1205
+ advancedCommerceInfoIOS = null,
1206
+ billingPlanTypeIOS = null,
1207
+ commitmentInfoIOS = null,
1233
1208
  quantityIOS = null,
1234
1209
  originalTransactionDateIOS = null,
1235
1210
  originalTransactionIdentifierIOS = null,
@@ -1262,7 +1237,8 @@ class HybridRnIap : HybridRnIapSpec() {
1262
1237
  obfuscatedAccountIdAndroid = androidPurchase?.obfuscatedAccountIdAndroid.wrapVariant(),
1263
1238
  obfuscatedProfileIdAndroid = androidPurchase?.obfuscatedProfileIdAndroid.wrapVariant(),
1264
1239
  developerPayloadAndroid = androidPurchase?.developerPayloadAndroid.wrapVariant(),
1265
- isSuspendedAndroid = androidPurchase?.isSuspendedAndroid.wrapVariant()
1240
+ isSuspendedAndroid = androidPurchase?.isSuspendedAndroid.wrapVariant(),
1241
+ pendingPurchaseUpdateAndroid = androidPurchase?.pendingPurchaseUpdateAndroid.wrapVariant()
1266
1242
  )
1267
1243
  }
1268
1244
 
@@ -1333,10 +1309,10 @@ class HybridRnIap : HybridRnIapSpec() {
1333
1309
  }
1334
1310
  }
1335
1311
 
1336
- override fun buyPromotedProductIOS(): Promise<Unit> {
1312
+ override fun buyPromotedProductIOS(): Promise<Boolean> {
1337
1313
  return Promise.async {
1338
1314
  // Android doesn't have promoted products like iOS App Store
1339
- // This is an iOS-only feature, so we do nothing on Android
1315
+ false
1340
1316
  }
1341
1317
  }
1342
1318
 
@@ -1418,11 +1394,17 @@ class HybridRnIap : HybridRnIapSpec() {
1418
1394
 
1419
1395
  // Call OpenIAP's verifyPurchase - this makes the actual Google Play API call
1420
1396
  val verifyResult = openIap.verifyPurchase(props)
1421
- RnIapLog.result("validateReceipt", verifyResult.toString())
1422
1397
 
1423
1398
  // Cast to Android result type (on Android, verifyPurchase returns VerifyPurchaseResultAndroid)
1424
1399
  val androidResult = verifyResult as? VerifyPurchaseResultAndroid
1425
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
+ )
1426
1408
 
1427
1409
  // Convert OpenIAP result to Nitro result
1428
1410
  val result = NitroReceiptValidationResultAndroid(
@@ -1631,7 +1613,7 @@ class HybridRnIap : HybridRnIapSpec() {
1631
1613
  } catch (err: Throwable) {
1632
1614
  RnIapLog.failure("checkAlternativeBillingAvailabilityAndroid", err)
1633
1615
  val errorType = parseOpenIapError(err)
1634
- throw OpenIapException(toErrorJson(errorType, debugMessage = err.message))
1616
+ throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err)
1635
1617
  }
1636
1618
  }
1637
1619
  }
@@ -1653,7 +1635,7 @@ class HybridRnIap : HybridRnIapSpec() {
1653
1635
  } catch (err: Throwable) {
1654
1636
  RnIapLog.failure("showAlternativeBillingDialogAndroid", err)
1655
1637
  val errorType = parseOpenIapError(err)
1656
- throw OpenIapException(toErrorJson(errorType, debugMessage = err.message))
1638
+ throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err)
1657
1639
  }
1658
1640
  }
1659
1641
  }
@@ -1669,12 +1651,15 @@ class HybridRnIap : HybridRnIapSpec() {
1669
1651
  val token = withContext(Dispatchers.Main) {
1670
1652
  openIap.createAlternativeBillingReportingToken()
1671
1653
  }
1672
- RnIapLog.result("createAlternativeBillingTokenAndroid", token)
1654
+ RnIapLog.result(
1655
+ "createAlternativeBillingTokenAndroid",
1656
+ if (token.isNullOrBlank()) "<empty>" else "<token>"
1657
+ )
1673
1658
  token?.let { Variant_NullType_String.Second(it) } ?: Variant_NullType_String.First(NullType.NULL)
1674
1659
  } catch (err: Throwable) {
1675
1660
  RnIapLog.failure("createAlternativeBillingTokenAndroid", err)
1676
1661
  val errorType = parseOpenIapError(err)
1677
- throw OpenIapException(toErrorJson(errorType, debugMessage = err.message))
1662
+ throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err)
1678
1663
  }
1679
1664
  }
1680
1665
  }
@@ -1726,15 +1711,19 @@ class HybridRnIap : HybridRnIapSpec() {
1726
1711
  private var subscriptionBillingIssueNativeListener: dev.hyo.openiap.listener.OpenIapSubscriptionBillingIssueListener? = null
1727
1712
 
1728
1713
  override fun addSubscriptionBillingIssueListener(listener: (purchase: NitroPurchase) -> Unit) {
1729
- synchronized(subscriptionBillingIssueListeners) {
1730
- subscriptionBillingIssueListeners.add(listener)
1714
+ synchronized(subscriptionBillingIssueAttachLock) {
1715
+ synchronized(subscriptionBillingIssueListeners) {
1716
+ subscriptionBillingIssueListeners.add(listener)
1717
+ }
1718
+ attachSubscriptionBillingIssueIfNeeded()
1731
1719
  }
1732
- attachSubscriptionBillingIssueIfNeeded()
1733
1720
  }
1734
1721
 
1735
1722
  override fun removeSubscriptionBillingIssueListener(listener: (purchase: NitroPurchase) -> Unit) {
1736
- synchronized(subscriptionBillingIssueListeners) {
1737
- subscriptionBillingIssueListeners.remove(listener)
1723
+ synchronized(subscriptionBillingIssueAttachLock) {
1724
+ synchronized(subscriptionBillingIssueListeners) {
1725
+ subscriptionBillingIssueListeners.remove(listener)
1726
+ }
1738
1727
  }
1739
1728
  }
1740
1729
 
@@ -1766,6 +1755,15 @@ class HybridRnIap : HybridRnIapSpec() {
1766
1755
  }
1767
1756
  }
1768
1757
 
1758
+ private fun clearSubscriptionBillingIssueListeners() {
1759
+ synchronized(subscriptionBillingIssueAttachLock) {
1760
+ synchronized(subscriptionBillingIssueListeners) {
1761
+ subscriptionBillingIssueListeners.clear()
1762
+ }
1763
+ detachSubscriptionBillingIssueIfNeeded()
1764
+ }
1765
+ }
1766
+
1769
1767
  // -------------------------------------------------------------------------
1770
1768
  // Billing Programs API (Android 8.2.0+)
1771
1769
  // -------------------------------------------------------------------------
@@ -1794,25 +1792,66 @@ class HybridRnIap : HybridRnIapSpec() {
1794
1792
  val result = openIapStore.isBillingProgramAvailable(openIapProgram)
1795
1793
  val nitroResult = NitroBillingProgramAvailabilityResultAndroid(
1796
1794
  billingProgram = program,
1797
- isAvailable = result.isAvailable
1795
+ choiceScreenType = result.choiceScreenType?.let { mapBillingChoiceScreenType(it) },
1796
+ isAvailable = result.isAvailable,
1797
+ isExternalLinkAvailable = result.isExternalLinkAvailable.wrapVariant()
1798
1798
  )
1799
1799
  RnIapLog.result("isBillingProgramAvailableAndroid", mapOf("isAvailable" to result.isAvailable))
1800
1800
  nitroResult
1801
1801
  } catch (err: Throwable) {
1802
1802
  RnIapLog.failure("isBillingProgramAvailableAndroid", err)
1803
1803
  val errorType = parseOpenIapError(err)
1804
- throw OpenIapException(toErrorJson(errorType, debugMessage = err.message))
1804
+ throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err)
1805
1805
  }
1806
1806
  }
1807
1807
  }
1808
1808
 
1809
- override fun createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid): Promise<NitroBillingProgramReportingDetailsAndroid> {
1809
+ override fun getBillingChoiceInfoAndroid(params: NitroGetBillingChoiceInfoParamsAndroid): Promise<NitroBillingChoiceInfoAndroid> {
1810
1810
  return Promise.async {
1811
- RnIapLog.payload("createBillingProgramReportingDetailsAndroid", mapOf("program" to program.name))
1811
+ RnIapLog.payload("getBillingChoiceInfoAndroid", mapOf(
1812
+ "billingProgram" to params.billingProgram.name,
1813
+ "playBillingChoiceImageLayout" to params.playBillingChoiceImageLayout.name,
1814
+ "userLocale" to params.userLocale.unwrapString()
1815
+ ))
1816
+ try {
1817
+ ensureConnection()
1818
+ val result = openIapStore.getBillingChoiceInfo(
1819
+ OpenIapGetBillingChoiceInfoParams(
1820
+ billingProgram = mapBillingProgram(params.billingProgram),
1821
+ playBillingChoiceImageLayout = mapBillingChoiceImageLayout(params.playBillingChoiceImageLayout),
1822
+ userLocale = params.userLocale.unwrapString()
1823
+ )
1824
+ )
1825
+ val nitroResult = NitroBillingChoiceInfoAndroid(
1826
+ playBillingChoiceImageUrl = result.playBillingChoiceImageUrl,
1827
+ playBillingLoyaltyInfo = result.playBillingLoyaltyInfo.wrapVariant()
1828
+ )
1829
+ RnIapLog.result("getBillingChoiceInfoAndroid", mapOf("hasImageUrl" to result.playBillingChoiceImageUrl.isNotBlank()))
1830
+ nitroResult
1831
+ } catch (err: Throwable) {
1832
+ RnIapLog.failure("getBillingChoiceInfoAndroid", err)
1833
+ val errorType = parseOpenIapError(err)
1834
+ throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err)
1835
+ }
1836
+ }
1837
+ }
1838
+
1839
+ override fun createBillingProgramReportingDetailsAndroid(
1840
+ program: BillingProgramAndroid,
1841
+ developerBillingType: DeveloperBillingTypeAndroid?
1842
+ ): Promise<NitroBillingProgramReportingDetailsAndroid> {
1843
+ return Promise.async {
1844
+ RnIapLog.payload(
1845
+ "createBillingProgramReportingDetailsAndroid",
1846
+ mapOf("program" to program.name, "developerBillingType" to developerBillingType?.name)
1847
+ )
1812
1848
  try {
1813
1849
  ensureConnection()
1814
1850
  val openIapProgram = mapBillingProgram(program)
1815
- val result = openIapStore.createBillingProgramReportingDetails(openIapProgram)
1851
+ val result = openIapStore.createBillingProgramReportingDetails(
1852
+ openIapProgram,
1853
+ mapDeveloperBillingType(developerBillingType)
1854
+ )
1816
1855
  val nitroResult = NitroBillingProgramReportingDetailsAndroid(
1817
1856
  billingProgram = program,
1818
1857
  externalTransactionToken = result.externalTransactionToken
@@ -1822,7 +1861,75 @@ class HybridRnIap : HybridRnIapSpec() {
1822
1861
  } catch (err: Throwable) {
1823
1862
  RnIapLog.failure("createBillingProgramReportingDetailsAndroid", err)
1824
1863
  val errorType = parseOpenIapError(err)
1825
- throw OpenIapException(toErrorJson(errorType, debugMessage = err.message))
1864
+ throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err)
1865
+ }
1866
+ }
1867
+ }
1868
+
1869
+ override fun showBillingProgramInformationDialogAndroid(
1870
+ params: NitroBillingProgramInformationDialogParamsAndroid
1871
+ ): Promise<NitroBillingResultAndroid> {
1872
+ return Promise.async {
1873
+ RnIapLog.payload("showBillingProgramInformationDialogAndroid", mapOf("program" to params.billingProgram.name))
1874
+ try {
1875
+ ensureConnection()
1876
+ val activity = withContext(Dispatchers.Main) {
1877
+ runCatching { context.currentActivity }.getOrNull()
1878
+ } ?: throw OpenIapException(toErrorJson(OpenIapError.DeveloperError(), debugMessage = "Activity not available"))
1879
+ val result = withContext(Dispatchers.Main) {
1880
+ openIapStore.showBillingProgramInformationDialog(
1881
+ activity,
1882
+ OpenIapBillingProgramInformationDialogParams(
1883
+ billingProgram = mapBillingProgram(params.billingProgram),
1884
+ externalTransactionToken = params.externalTransactionToken
1885
+ )
1886
+ )
1887
+ }
1888
+ RnIapLog.result("showBillingProgramInformationDialogAndroid", mapOf("responseCode" to result.responseCode))
1889
+ NitroBillingResultAndroid(
1890
+ responseCode = result.responseCode.toDouble(),
1891
+ debugMessage = result.debugMessage.wrapVariant(),
1892
+ subResponseCode = mapSubResponseCode(result.subResponseCode)
1893
+ )
1894
+ } catch (err: Throwable) {
1895
+ RnIapLog.failure("showBillingProgramInformationDialogAndroid", err)
1896
+ val errorType = parseOpenIapError(err)
1897
+ throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err)
1898
+ }
1899
+ }
1900
+ }
1901
+
1902
+ override fun showInAppMessagesAndroid(
1903
+ params: Variant_NullType_NitroInAppMessageParamsAndroid?
1904
+ ): Promise<NitroInAppMessageResultAndroid> {
1905
+ return Promise.async {
1906
+ val messageParams = params?.asSecondOrNull()
1907
+ val categories = messageParams?.categories?.asSecondOrNull()
1908
+ RnIapLog.payload("showInAppMessagesAndroid", mapOf("categories" to categories?.map { it.name }))
1909
+ try {
1910
+ ensureConnection()
1911
+ val activity = withContext(Dispatchers.Main) {
1912
+ runCatching { context.currentActivity }.getOrNull()
1913
+ } ?: throw OpenIapException(toErrorJson(OpenIapError.DeveloperError(), debugMessage = "Activity not available"))
1914
+ val result = withContext(Dispatchers.Main) {
1915
+ openIapStore.showInAppMessages(
1916
+ activity,
1917
+ messageParams?.let {
1918
+ OpenIapInAppMessageParams(
1919
+ categories = categories?.map { category -> mapInAppMessageCategory(category) }
1920
+ )
1921
+ }
1922
+ )
1923
+ }
1924
+ RnIapLog.result("showInAppMessagesAndroid", mapOf("responseCode" to result.responseCode.name))
1925
+ NitroInAppMessageResultAndroid(
1926
+ responseCode = mapInAppMessageResponseCode(result.responseCode),
1927
+ purchaseToken = result.purchaseToken.wrapVariant()
1928
+ )
1929
+ } catch (err: Throwable) {
1930
+ RnIapLog.failure("showInAppMessagesAndroid", err)
1931
+ val errorType = parseOpenIapError(err)
1932
+ throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err)
1826
1933
  }
1827
1934
  }
1828
1935
  }
@@ -1844,6 +1951,7 @@ class HybridRnIap : HybridRnIapSpec() {
1844
1951
 
1845
1952
  val openIapParams = OpenIapLaunchExternalLinkParams(
1846
1953
  billingProgram = mapBillingProgram(params.billingProgram),
1954
+ externalTransactionToken = params.externalTransactionToken.unwrapString(),
1847
1955
  launchMode = mapExternalLinkLaunchMode(params.launchMode),
1848
1956
  linkType = mapExternalLinkType(params.linkType),
1849
1957
  linkUri = params.linkUri
@@ -1870,6 +1978,86 @@ class HybridRnIap : HybridRnIapSpec() {
1870
1978
  BillingProgramAndroid.EXTERNAL_OFFER -> OpenIapBillingProgramAndroid.ExternalOffer
1871
1979
  BillingProgramAndroid.EXTERNAL_PAYMENTS -> OpenIapBillingProgramAndroid.ExternalPayments
1872
1980
  BillingProgramAndroid.USER_CHOICE_BILLING -> OpenIapBillingProgramAndroid.UserChoiceBilling
1981
+ BillingProgramAndroid.BILLING_CHOICE -> OpenIapBillingProgramAndroid.BillingChoice
1982
+ }
1983
+ }
1984
+
1985
+ private fun mapBillingChoiceImageLayout(layout: BillingChoiceImageLayoutAndroid): OpenIapBillingChoiceImageLayout {
1986
+ return when (layout) {
1987
+ BillingChoiceImageLayoutAndroid.RECTANGULAR_FOUR_BY_ONE -> OpenIapBillingChoiceImageLayout.RectangularFourByOne
1988
+ BillingChoiceImageLayoutAndroid.RECTANGULAR_THREE_BY_ONE -> OpenIapBillingChoiceImageLayout.RectangularThreeByOne
1989
+ BillingChoiceImageLayoutAndroid.RECTANGULAR_TWO_BY_TWO -> OpenIapBillingChoiceImageLayout.RectangularTwoByTwo
1990
+ }
1991
+ }
1992
+
1993
+ private fun mapBillingChoiceScreenType(type: OpenIapBillingChoiceScreenType): BillingChoiceScreenTypeAndroid {
1994
+ return when (type) {
1995
+ OpenIapBillingChoiceScreenType.Unspecified -> BillingChoiceScreenTypeAndroid.UNSPECIFIED
1996
+ OpenIapBillingChoiceScreenType.DeveloperRendered -> BillingChoiceScreenTypeAndroid.DEVELOPER_RENDERED
1997
+ OpenIapBillingChoiceScreenType.GoogleRendered -> BillingChoiceScreenTypeAndroid.GOOGLE_RENDERED
1998
+ }
1999
+ }
2000
+
2001
+ private fun mapBillingChoiceScreenTypeToOpenIap(
2002
+ type: BillingChoiceScreenTypeAndroid
2003
+ ): OpenIapBillingChoiceScreenType {
2004
+ return when (type) {
2005
+ BillingChoiceScreenTypeAndroid.UNSPECIFIED -> OpenIapBillingChoiceScreenType.Unspecified
2006
+ BillingChoiceScreenTypeAndroid.DEVELOPER_RENDERED -> OpenIapBillingChoiceScreenType.DeveloperRendered
2007
+ BillingChoiceScreenTypeAndroid.GOOGLE_RENDERED -> OpenIapBillingChoiceScreenType.GoogleRendered
2008
+ }
2009
+ }
2010
+
2011
+ private fun mapDeveloperBillingType(type: DeveloperBillingTypeAndroid?): OpenIapDeveloperBillingType? {
2012
+ return when (type) {
2013
+ null, DeveloperBillingTypeAndroid.DEVELOPER_BILLING_TYPE_UNSPECIFIED -> null
2014
+ DeveloperBillingTypeAndroid.IN_APP -> OpenIapDeveloperBillingType.InApp
2015
+ DeveloperBillingTypeAndroid.EXTERNAL_LINK -> OpenIapDeveloperBillingType.ExternalLink
2016
+ }
2017
+ }
2018
+
2019
+ private fun mapSubResponseCode(
2020
+ code: OpenIapSubResponseCodeAndroid?
2021
+ ): SubResponseCodeAndroid? = when (code) {
2022
+ null -> null
2023
+ OpenIapSubResponseCodeAndroid.NoApplicableSubResponseCode ->
2024
+ SubResponseCodeAndroid.NO_APPLICABLE_SUB_RESPONSE_CODE
2025
+ OpenIapSubResponseCodeAndroid.PaymentDeclinedDueToInsufficientFunds ->
2026
+ SubResponseCodeAndroid.PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS
2027
+ OpenIapSubResponseCodeAndroid.UserIneligible ->
2028
+ SubResponseCodeAndroid.USER_INELIGIBLE
2029
+ }
2030
+
2031
+ private fun mapDeveloperBillingOption(
2032
+ option: DeveloperBillingOptionParamsAndroid
2033
+ ): OpenIapDeveloperBillingOptionParams {
2034
+ val launchMode = when (option.launchMode) {
2035
+ null -> null
2036
+ DeveloperBillingLaunchModeAndroid.UNSPECIFIED -> OpenIapDeveloperBillingLaunchMode.Unspecified
2037
+ DeveloperBillingLaunchModeAndroid.LAUNCH_IN_EXTERNAL_BROWSER_OR_APP ->
2038
+ OpenIapDeveloperBillingLaunchMode.LaunchInExternalBrowserOrApp
2039
+ DeveloperBillingLaunchModeAndroid.CALLER_WILL_LAUNCH_LINK ->
2040
+ OpenIapDeveloperBillingLaunchMode.CallerWillLaunchLink
2041
+ }
2042
+ return OpenIapDeveloperBillingOptionParams(
2043
+ billingProgram = mapBillingProgram(option.billingProgram),
2044
+ externalTransactionToken = option.externalTransactionToken.unwrapString(),
2045
+ launchMode = launchMode,
2046
+ linkUri = option.linkUri.unwrapString()
2047
+ )
2048
+ }
2049
+
2050
+ private fun mapInAppMessageCategory(category: InAppMessageCategoryAndroid): OpenIapInAppMessageCategory {
2051
+ return when (category) {
2052
+ InAppMessageCategoryAndroid.UNKNOWN_IN_APP_MESSAGE_CATEGORY_ID -> OpenIapInAppMessageCategory.UnknownInAppMessageCategoryId
2053
+ InAppMessageCategoryAndroid.TRANSACTIONAL -> OpenIapInAppMessageCategory.Transactional
2054
+ }
2055
+ }
2056
+
2057
+ private fun mapInAppMessageResponseCode(code: OpenIapInAppMessageResponseCode): InAppMessageResponseCodeAndroid {
2058
+ return when (code) {
2059
+ OpenIapInAppMessageResponseCode.NoActionNeeded -> InAppMessageResponseCodeAndroid.NO_ACTION_NEEDED
2060
+ OpenIapInAppMessageResponseCode.SubscriptionStatusUpdated -> InAppMessageResponseCodeAndroid.SUBSCRIPTION_STATUS_UPDATED
1873
2061
  }
1874
2062
  }
1875
2063
 
@@ -1966,6 +2154,13 @@ class HybridRnIap : HybridRnIapSpec() {
1966
2154
  ?: OpenIapError.Companion.defaultMessage(code)
1967
2155
  val diagnostics = error.toJSON()
1968
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
+ }
1969
2164
  val productIds = diagnostics["productIds"] as? List<*>
1970
2165
  val productType = diagnostics["productType"] as? String
1971
2166
  val isEmptyProductList = diagnostics["isEmptyProductList"] as? Boolean
@@ -1975,15 +2170,18 @@ class HybridRnIap : HybridRnIapSpec() {
1975
2170
  "message" to message
1976
2171
  )
1977
2172
 
1978
- errorMap["responseCode"] = responseCode ?: -1
2173
+ responseCode?.let { errorMap["responseCode"] = it }
1979
2174
  debugMessage
1980
2175
  ?.let { errorMap["debugMessage"] = it }
1981
2176
  ?: (diagnostics["debugMessage"] as? String)?.let { errorMap["debugMessage"] = it }
1982
2177
  ?: error.message?.let { errorMap["debugMessage"] = it }
1983
- productId?.let { errorMap["productId"] = it }
2178
+ diagnosticProductId?.let { errorMap["productId"] = it }
1984
2179
  if (!productIds.isNullOrEmpty()) errorMap["productIds"] = productIds
1985
2180
  productType?.let { errorMap["productType"] = it }
1986
2181
  isEmptyProductList?.let { errorMap["isEmptyProductList"] = it }
2182
+ (diagnostics["subResponseCodeAndroid"] as? String)?.let {
2183
+ errorMap["subResponseCodeAndroid"] = it
2184
+ }
1987
2185
 
1988
2186
  return try {
1989
2187
  JSONObject(errorMap).toString()
@@ -2053,12 +2251,30 @@ class HybridRnIap : HybridRnIapSpec() {
2053
2251
  val diagnostics = error.toJSON()
2054
2252
  val responseCode = (diagnostics["responseCode"] as? Number)?.toDouble()
2055
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
+ }
2056
2267
  return NitroPurchaseResult(
2057
2268
  responseCode = responseCode ?: -1.0,
2058
2269
  debugMessage = debugMessage ?: diagnosticMessage ?: error.message,
2059
2270
  code = code,
2060
2271
  message = message,
2061
- 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)
2062
2278
  )
2063
2279
  }
2064
2280
  }