react-native-iap 15.1.0 → 15.2.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 (96) hide show
  1. package/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt +171 -114
  2. package/android/src/main/java/com/margelo/nitro/iap/ProductQueryHelpers.kt +42 -0
  3. package/android/src/test/java/com/margelo/nitro/iap/ProductQueryHelpersTest.kt +140 -0
  4. package/ios/HybridRnIap.swift +72 -1
  5. package/lib/module/hooks/useIAP.js +11 -1
  6. package/lib/module/hooks/useIAP.js.map +1 -1
  7. package/lib/module/hooks/useWebhookEvents.js +113 -0
  8. package/lib/module/hooks/useWebhookEvents.js.map +1 -0
  9. package/lib/module/index.js +405 -131
  10. package/lib/module/index.js.map +1 -1
  11. package/lib/module/kit-api.js +161 -0
  12. package/lib/module/kit-api.js.map +1 -0
  13. package/lib/module/types.js +16 -0
  14. package/lib/module/types.js.map +1 -1
  15. package/lib/module/utils/error.js.map +1 -1
  16. package/lib/module/utils/errorMapping.js +6 -0
  17. package/lib/module/utils/errorMapping.js.map +1 -1
  18. package/lib/module/webhook-client.js +164 -0
  19. package/lib/module/webhook-client.js.map +1 -0
  20. package/lib/typescript/plugin/src/withIAP.d.ts +1 -1
  21. package/lib/typescript/src/hooks/useIAP.d.ts +172 -2
  22. package/lib/typescript/src/hooks/useIAP.d.ts.map +1 -1
  23. package/lib/typescript/src/hooks/useWebhookEvents.d.ts +55 -0
  24. package/lib/typescript/src/hooks/useWebhookEvents.d.ts.map +1 -0
  25. package/lib/typescript/src/index.d.ts +283 -129
  26. package/lib/typescript/src/index.d.ts.map +1 -1
  27. package/lib/typescript/src/kit-api.d.ts +54 -0
  28. package/lib/typescript/src/kit-api.d.ts.map +1 -0
  29. package/lib/typescript/src/specs/RnIap.nitro.d.ts +24 -0
  30. package/lib/typescript/src/specs/RnIap.nitro.d.ts.map +1 -1
  31. package/lib/typescript/src/types.d.ts +320 -75
  32. package/lib/typescript/src/types.d.ts.map +1 -1
  33. package/lib/typescript/src/utils/error.d.ts +3 -0
  34. package/lib/typescript/src/utils/error.d.ts.map +1 -1
  35. package/lib/typescript/src/utils/errorMapping.d.ts +6 -0
  36. package/lib/typescript/src/utils/errorMapping.d.ts.map +1 -1
  37. package/lib/typescript/src/webhook-client.d.ts +82 -0
  38. package/lib/typescript/src/webhook-client.d.ts.map +1 -0
  39. package/nitrogen/generated/android/NitroIap+autolinking.cmake +3 -0
  40. package/nitrogen/generated/android/c++/JAdvancedCommerceInfoIOS.hpp +118 -0
  41. package/nitrogen/generated/android/c++/JAdvancedCommerceItemDetailsIOS.hpp +62 -0
  42. package/nitrogen/generated/android/c++/JAdvancedCommerceItemIOS.hpp +78 -0
  43. package/nitrogen/generated/android/c++/JAdvancedCommerceRefundIOS.hpp +62 -0
  44. package/nitrogen/generated/android/c++/JHybridRnIapSpec.cpp +52 -0
  45. package/nitrogen/generated/android/c++/JHybridRnIapSpec.hpp +3 -0
  46. package/nitrogen/generated/android/c++/JPurchase.hpp +11 -0
  47. package/nitrogen/generated/android/c++/JPurchaseIOS.hpp +16 -1
  48. package/nitrogen/generated/android/c++/JRequestPurchaseResult.hpp +11 -0
  49. package/nitrogen/generated/android/c++/JVariant_NullType_AdvancedCommerceInfoIOS.cpp +26 -0
  50. package/nitrogen/generated/android/c++/JVariant_NullType_AdvancedCommerceInfoIOS.hpp +84 -0
  51. package/nitrogen/generated/android/c++/JVariant_NullType_AdvancedCommerceItemDetailsIOS.cpp +26 -0
  52. package/nitrogen/generated/android/c++/JVariant_NullType_AdvancedCommerceItemDetailsIOS.hpp +74 -0
  53. package/nitrogen/generated/android/c++/JVariant_NullType_Array_AdvancedCommerceRefundIOS_.cpp +35 -0
  54. package/nitrogen/generated/android/c++/JVariant_NullType_Array_AdvancedCommerceRefundIOS_.hpp +84 -0
  55. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AdvancedCommerceInfoIOS.kt +59 -0
  56. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AdvancedCommerceItemDetailsIOS.kt +38 -0
  57. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AdvancedCommerceItemIOS.kt +44 -0
  58. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AdvancedCommerceRefundIOS.kt +38 -0
  59. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/HybridRnIapSpec.kt +22 -0
  60. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseIOS.kt +5 -2
  61. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_AdvancedCommerceInfoIOS.kt +53 -0
  62. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_AdvancedCommerceItemDetailsIOS.kt +53 -0
  63. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_AdvancedCommerceRefundIOS_.kt +53 -0
  64. package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Bridge.hpp +166 -0
  65. package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Umbrella.hpp +12 -0
  66. package/nitrogen/generated/ios/c++/HybridRnIapSpecSwift.hpp +32 -0
  67. package/nitrogen/generated/ios/swift/AdvancedCommerceInfoIOS.swift +294 -0
  68. package/nitrogen/generated/ios/swift/AdvancedCommerceItemDetailsIOS.swift +61 -0
  69. package/nitrogen/generated/ios/swift/AdvancedCommerceItemIOS.swift +141 -0
  70. package/nitrogen/generated/ios/swift/AdvancedCommerceRefundIOS.swift +61 -0
  71. package/nitrogen/generated/ios/swift/HybridRnIapSpec.swift +3 -0
  72. package/nitrogen/generated/ios/swift/HybridRnIapSpec_cxx.swift +57 -0
  73. package/nitrogen/generated/ios/swift/PurchaseIOS.swift +39 -2
  74. package/nitrogen/generated/ios/swift/Variant_NullType_AdvancedCommerceInfoIOS.swift +18 -0
  75. package/nitrogen/generated/ios/swift/Variant_NullType_AdvancedCommerceItemDetailsIOS.swift +18 -0
  76. package/nitrogen/generated/ios/swift/Variant_NullType__AdvancedCommerceRefundIOS_.swift +18 -0
  77. package/nitrogen/generated/shared/c++/AdvancedCommerceInfoIOS.hpp +117 -0
  78. package/nitrogen/generated/shared/c++/AdvancedCommerceItemDetailsIOS.hpp +86 -0
  79. package/nitrogen/generated/shared/c++/AdvancedCommerceItemIOS.hpp +99 -0
  80. package/nitrogen/generated/shared/c++/AdvancedCommerceRefundIOS.hpp +86 -0
  81. package/nitrogen/generated/shared/c++/HybridRnIapSpec.cpp +3 -0
  82. package/nitrogen/generated/shared/c++/HybridRnIapSpec.hpp +3 -0
  83. package/nitrogen/generated/shared/c++/PurchaseIOS.hpp +9 -2
  84. package/openiap-versions.json +3 -3
  85. package/package.json +1 -1
  86. package/plugin/build/withIAP.d.ts +1 -1
  87. package/plugin/src/withIAP.ts +1 -1
  88. package/src/hooks/useIAP.ts +185 -2
  89. package/src/hooks/useWebhookEvents.ts +180 -0
  90. package/src/index.ts +440 -130
  91. package/src/kit-api.ts +225 -0
  92. package/src/specs/RnIap.nitro.ts +31 -0
  93. package/src/types.ts +330 -75
  94. package/src/utils/error.ts +3 -0
  95. package/src/utils/errorMapping.ts +12 -0
  96. package/src/webhook-client.ts +312 -0
@@ -0,0 +1,42 @@
1
+ package com.margelo.nitro.iap
2
+
3
+ import dev.hyo.openiap.ProductCommon
4
+ import dev.hyo.openiap.ProductQueryType
5
+ import kotlin.coroutines.cancellation.CancellationException
6
+ import kotlinx.coroutines.async
7
+ import kotlinx.coroutines.coroutineScope
8
+
9
+ internal suspend fun collectAllQueryProducts(
10
+ skusList: List<String>,
11
+ fetchKind: suspend (ProductQueryType) -> List<ProductCommon>,
12
+ onFailure: (ProductQueryType, Throwable) -> Unit = { _, _ -> },
13
+ ): List<ProductCommon> = coroutineScope {
14
+ val byId = linkedMapOf<String, ProductCommon>()
15
+ var firstFailure: Throwable? = null
16
+
17
+ val queries = listOf(ProductQueryType.InApp, ProductQueryType.Subs).map { kind ->
18
+ kind to async {
19
+ runCatching {
20
+ fetchKind(kind)
21
+ }
22
+ }
23
+ }
24
+
25
+ queries.forEach { (kind, query) ->
26
+ query.await().onSuccess { fetched ->
27
+ fetched.forEach { product ->
28
+ byId.putIfAbsent(product.id, product)
29
+ }
30
+ }.onFailure { error ->
31
+ if (error is CancellationException) throw error
32
+ onFailure(kind, error)
33
+ if (firstFailure == null) firstFailure = error
34
+ }
35
+ }
36
+
37
+ if (byId.isEmpty()) {
38
+ firstFailure?.let { throw it }
39
+ }
40
+
41
+ skusList.mapNotNull { byId[it] }
42
+ }
@@ -0,0 +1,140 @@
1
+ package com.margelo.nitro.iap
2
+
3
+ import dev.hyo.openiap.IapPlatform
4
+ import dev.hyo.openiap.OpenIapError
5
+ import dev.hyo.openiap.ProductCommon
6
+ import dev.hyo.openiap.ProductQueryType
7
+ import dev.hyo.openiap.ProductType
8
+ import java.util.Collections
9
+ import kotlinx.coroutines.CompletableDeferred
10
+ import kotlinx.coroutines.runBlocking
11
+ import kotlinx.coroutines.withTimeout
12
+ import org.junit.Assert.assertEquals
13
+ import org.junit.Assert.assertSame
14
+ import org.junit.Test
15
+
16
+ class ProductQueryHelpersTest {
17
+ @Test
18
+ fun `all query starts in-app and subs fetches concurrently`() = runBlocking {
19
+ val startedKinds = Collections.synchronizedSet(mutableSetOf<ProductQueryType>())
20
+ val bothStarted = CompletableDeferred<Unit>()
21
+
22
+ val products = withTimeout(1000) {
23
+ collectAllQueryProducts(
24
+ skusList = listOf("monthly", "lifetime"),
25
+ fetchKind = { kind ->
26
+ when (kind) {
27
+ ProductQueryType.InApp,
28
+ ProductQueryType.Subs -> {
29
+ startedKinds.add(kind)
30
+ if (startedKinds.size == 2) {
31
+ bothStarted.complete(Unit)
32
+ }
33
+ bothStarted.await()
34
+
35
+ when (kind) {
36
+ ProductQueryType.InApp -> listOf(
37
+ fakeProduct("lifetime", ProductType.InApp),
38
+ )
39
+ ProductQueryType.Subs -> listOf(
40
+ fakeProduct("monthly", ProductType.Subs),
41
+ )
42
+ ProductQueryType.All -> error("All should be expanded by the helper")
43
+ }
44
+ }
45
+ ProductQueryType.All -> error("All should be expanded by the helper")
46
+ }
47
+ },
48
+ )
49
+ }
50
+
51
+ assertEquals(setOf(ProductQueryType.InApp, ProductQueryType.Subs), startedKinds.toSet())
52
+ assertEquals(listOf("monthly", "lifetime"), products.map { it.id })
53
+ }
54
+
55
+ @Test
56
+ fun `all query returns partial success when one product kind fails`() = runBlocking {
57
+ val queryError = OpenIapError.BillingError("Invalid subscriptions")
58
+ val failures = mutableListOf<Pair<ProductQueryType, Throwable>>()
59
+
60
+ val products = collectAllQueryProducts(
61
+ skusList = listOf("monthly", "lifetime"),
62
+ fetchKind = { kind ->
63
+ when (kind) {
64
+ ProductQueryType.InApp -> listOf(fakeProduct("lifetime", ProductType.InApp))
65
+ ProductQueryType.Subs -> throw queryError
66
+ ProductQueryType.All -> error("All should be expanded by the helper")
67
+ }
68
+ },
69
+ onFailure = { kind, error -> failures += kind to error },
70
+ )
71
+
72
+ assertEquals(listOf("lifetime"), products.map { it.id })
73
+ assertEquals(listOf(ProductQueryType.Subs), failures.map { it.first })
74
+ assertSame(queryError, failures.single().second)
75
+ }
76
+
77
+ @Test
78
+ fun `all query rethrows first failure when both product kinds fail`() = runBlocking {
79
+ val firstError = OpenIapError.BillingError("Invalid in-app products")
80
+ val secondError = OpenIapError.BillingError("Service unavailable")
81
+ val failures = mutableListOf<ProductQueryType>()
82
+
83
+ try {
84
+ collectAllQueryProducts(
85
+ skusList = listOf("monthly", "lifetime"),
86
+ fetchKind = { kind ->
87
+ when (kind) {
88
+ ProductQueryType.InApp -> throw firstError
89
+ ProductQueryType.Subs -> throw secondError
90
+ ProductQueryType.All -> error("All should be expanded by the helper")
91
+ }
92
+ },
93
+ onFailure = { kind, _ -> failures += kind },
94
+ )
95
+ } catch (error: Throwable) {
96
+ assertSame(firstError, error)
97
+ assertEquals(listOf(ProductQueryType.InApp, ProductQueryType.Subs), failures)
98
+ return@runBlocking
99
+ }
100
+
101
+ error("Expected the first product query failure to be rethrown")
102
+ }
103
+
104
+ @Test
105
+ fun `all query preserves input sku order and keeps first matching product`() = runBlocking {
106
+ val products = collectAllQueryProducts(
107
+ skusList = listOf("monthly", "lifetime", "annual"),
108
+ fetchKind = { kind ->
109
+ when (kind) {
110
+ ProductQueryType.InApp -> listOf(
111
+ fakeProduct("lifetime", ProductType.InApp),
112
+ fakeProduct("monthly", ProductType.InApp),
113
+ )
114
+ ProductQueryType.Subs -> listOf(
115
+ fakeProduct("monthly", ProductType.Subs),
116
+ fakeProduct("annual", ProductType.Subs),
117
+ )
118
+ ProductQueryType.All -> error("All should be expanded by the helper")
119
+ }
120
+ },
121
+ )
122
+
123
+ assertEquals(listOf("monthly", "lifetime", "annual"), products.map { it.id })
124
+ assertEquals(ProductType.InApp, products[0].type)
125
+ }
126
+
127
+ private fun fakeProduct(productId: String, type: ProductType): ProductCommon =
128
+ object : ProductCommon {
129
+ override val currency: String = "USD"
130
+ override val debugDescription: String? = null
131
+ override val description: String = productId
132
+ override val displayName: String? = productId
133
+ override val displayPrice: String = "$1.00"
134
+ override val id: String = productId
135
+ override val platform: IapPlatform = IapPlatform.Android
136
+ override val price: Double? = 1.0
137
+ override val title: String = productId
138
+ override val type: ProductType = type
139
+ }
140
+ }
@@ -17,6 +17,8 @@ class HybridRnIap: HybridRnIapSpec {
17
17
  private var purchaseUpdatedListeners: [(NitroPurchase) -> Void] = []
18
18
  private var purchaseErrorListeners: [(NitroPurchaseResult) -> Void] = []
19
19
  private var promotedProductListeners: [(NitroProduct) -> Void] = []
20
+ private var subscriptionBillingIssueListeners: [(NitroPurchase) -> Void] = []
21
+ private var subscriptionBillingIssueSub: Subscription?
20
22
  private var lastPurchaseErrorKey: String? = nil
21
23
  private var lastPurchaseErrorTimestamp: TimeInterval = 0
22
24
  private var deliveredPurchaseEventKeys: Set<String> = []
@@ -715,6 +717,39 @@ class HybridRnIap: HybridRnIapSpec {
715
717
  }
716
718
  }
717
719
 
720
+ func getAllTransactionsIOS() throws -> Promise<[NitroPurchase]> {
721
+ return Promise.async {
722
+ do {
723
+ RnIapLog.payload("getAllTransactionsIOS", nil)
724
+ let all = try await OpenIapModule.shared.getAllTransactionsIOS()
725
+ var unionPurchases: [OpenIAP.Purchase] = []
726
+ var payloadUpdates: [String: [String: Any]] = [:]
727
+ for purchase in all {
728
+ let union = OpenIAP.Purchase.purchaseIos(purchase)
729
+ unionPurchases.append(union)
730
+ let raw = OpenIapSerialization.purchase(union)
731
+ if let identifier = raw["id"] as? String {
732
+ payloadUpdates[identifier] = raw
733
+ }
734
+ }
735
+ await MainActor.run {
736
+ for (key, value) in payloadUpdates {
737
+ self.purchasePayloadById[key] = value
738
+ }
739
+ }
740
+ let payloads = RnIapHelper.sanitizeArray(OpenIapSerialization.purchases(unionPurchases))
741
+ RnIapLog.result("getAllTransactionsIOS", payloads)
742
+ return payloads.map { RnIapHelper.convertPurchaseDictionary($0) }
743
+ } catch let purchaseError as PurchaseError {
744
+ RnIapLog.failure("getAllTransactionsIOS", error: purchaseError)
745
+ throw OpenIapException.from(purchaseError)
746
+ } catch {
747
+ RnIapLog.failure("getAllTransactionsIOS", error: error)
748
+ throw OpenIapException.make(code: .serviceError, message: error.localizedDescription)
749
+ }
750
+ }
751
+ }
752
+
718
753
  func syncIOS() throws -> Promise<Bool> {
719
754
  return Promise.async {
720
755
  do {
@@ -922,7 +957,16 @@ class HybridRnIap: HybridRnIapSpec {
922
957
  func removePurchaseErrorListener(listener: @escaping (NitroPurchaseResult) -> Void) throws {
923
958
  listenerLock.withLock { purchaseErrorListeners.removeAll() }
924
959
  }
925
-
960
+
961
+ func addSubscriptionBillingIssueListener(listener: @escaping (NitroPurchase) -> Void) throws {
962
+ listenerLock.withLock { subscriptionBillingIssueListeners.append(listener) }
963
+ attachSubscriptionBillingIssueSubIfNeeded()
964
+ }
965
+
966
+ func removeSubscriptionBillingIssueListener(listener: @escaping (NitroPurchase) -> Void) throws {
967
+ listenerLock.withLock { subscriptionBillingIssueListeners.removeAll() }
968
+ }
969
+
926
970
  // MARK: - Private Helper Methods
927
971
 
928
972
  private func attachListenersIfNeeded() {
@@ -1004,6 +1048,27 @@ class HybridRnIap: HybridRnIapSpec {
1004
1048
  }
1005
1049
  }
1006
1050
 
1051
+ private func attachSubscriptionBillingIssueSubIfNeeded() {
1052
+ guard subscriptionBillingIssueSub == nil else { return }
1053
+ RnIapLog.payload("subscriptionBillingIssueListener.register", nil)
1054
+ subscriptionBillingIssueSub = OpenIapModule.shared.subscriptionBillingIssueListener { [weak self] openIapPurchase in
1055
+ guard let self else {
1056
+ RnIapLog.warn("subscriptionBillingIssueListener: HybridRnIap deallocated, event dropped")
1057
+ return
1058
+ }
1059
+ Task { @MainActor in
1060
+ let payload = RnIapHelper.sanitizeDictionary(OpenIapSerialization.purchase(openIapPurchase))
1061
+ RnIapLog.result("subscriptionBillingIssueListener", payload)
1062
+ let nitro = RnIapHelper.convertPurchaseDictionary(payload)
1063
+ let snapshot: [(NitroPurchase) -> Void] = self.listenerLock.withLock {
1064
+ Array(self.subscriptionBillingIssueListeners)
1065
+ }
1066
+ for l in snapshot { l(nitro) }
1067
+ }
1068
+ }
1069
+ RnIapLog.result("subscriptionBillingIssueListener.register", "attached")
1070
+ }
1071
+
1007
1072
  private func ensureConnection() throws {
1008
1073
  guard isInitialized else {
1009
1074
  throw OpenIapException.make(code: .initConnection, message: "Connection not initialized. Call initConnection() first.")
@@ -1121,9 +1186,14 @@ class HybridRnIap: HybridRnIapSpec {
1121
1186
  RnIapLog.payload("removeListener", "promotedProduct")
1122
1187
  OpenIapModule.shared.removeListener(sub)
1123
1188
  }
1189
+ if let sub = subscriptionBillingIssueSub {
1190
+ RnIapLog.payload("removeListener", "subscriptionBillingIssue")
1191
+ OpenIapModule.shared.removeListener(sub)
1192
+ }
1124
1193
  purchaseUpdatedSub = nil
1125
1194
  purchaseErrorSub = nil
1126
1195
  promotedProductSub = nil
1196
+ subscriptionBillingIssueSub = nil
1127
1197
  Task {
1128
1198
  RnIapLog.payload("endConnection", nil)
1129
1199
  let result = try? await OpenIapModule.shared.endConnection()
@@ -1135,6 +1205,7 @@ class HybridRnIap: HybridRnIapSpec {
1135
1205
  purchaseUpdatedListeners.removeAll()
1136
1206
  purchaseErrorListeners.removeAll()
1137
1207
  promotedProductListeners.removeAll()
1208
+ subscriptionBillingIssueListeners.removeAll()
1138
1209
  lastPurchaseErrorKey = nil
1139
1210
  lastPurchaseErrorTimestamp = 0
1140
1211
  deliveredPurchaseEventKeys.removeAll()
@@ -6,7 +6,7 @@ import { Platform } from 'react-native';
6
6
  import { RnIapConsole } from "../utils/debug.js";
7
7
 
8
8
  // Internal modules
9
- import { initConnection, purchaseErrorListener, purchaseUpdatedListener, promotedProductListenerIOS, getAvailablePurchases, finishTransaction as finishTransactionInternal, requestPurchase as requestPurchaseInternal, fetchProducts, validateReceipt as validateReceiptInternal, verifyPurchase as verifyPurchaseTopLevel, verifyPurchaseWithProvider as verifyPurchaseWithProviderTopLevel, getActiveSubscriptions, hasActiveSubscriptions, syncIOS, getPromotedProductIOS, requestPurchaseOnPromotedProductIOS, checkAlternativeBillingAvailabilityAndroid, showAlternativeBillingDialogAndroid, createAlternativeBillingTokenAndroid, userChoiceBillingListenerAndroid, isStandardIOS } from "../index.js";
9
+ import { initConnection, purchaseErrorListener, purchaseUpdatedListener, promotedProductListenerIOS, getAvailablePurchases, finishTransaction as finishTransactionInternal, requestPurchase as requestPurchaseInternal, fetchProducts, validateReceipt as validateReceiptInternal, verifyPurchase as verifyPurchaseTopLevel, verifyPurchaseWithProvider as verifyPurchaseWithProviderTopLevel, getActiveSubscriptions, hasActiveSubscriptions, syncIOS, getPromotedProductIOS, requestPurchaseOnPromotedProductIOS, checkAlternativeBillingAvailabilityAndroid, showAlternativeBillingDialogAndroid, createAlternativeBillingTokenAndroid, userChoiceBillingListenerAndroid, subscriptionBillingIssueListener, isStandardIOS } from "../index.js";
10
10
 
11
11
  // Types
12
12
  import { ErrorCode } from "../types.js";
@@ -219,6 +219,14 @@ export function useIAP(options) {
219
219
  }
220
220
  });
221
221
  }
222
+
223
+ // Always attach so callers that supply `onSubscriptionBillingIssue` later
224
+ // (after the hook has already set up listeners) still receive events.
225
+ if (!subscriptionsRef.current.subscriptionBillingIssue) {
226
+ subscriptionsRef.current.subscriptionBillingIssue = subscriptionBillingIssueListener(purchase => {
227
+ optionsRef.current?.onSubscriptionBillingIssue?.(purchase);
228
+ });
229
+ }
222
230
  }, [getActiveSubscriptionsInternal, getAvailablePurchasesInternal]);
223
231
 
224
232
  // Shared helper: clean up all listeners
@@ -227,10 +235,12 @@ export function useIAP(options) {
227
235
  subscriptionsRef.current.purchaseError?.remove();
228
236
  subscriptionsRef.current.promotedProductIOS?.remove();
229
237
  subscriptionsRef.current.userChoiceBillingAndroid?.remove();
238
+ subscriptionsRef.current.subscriptionBillingIssue?.remove();
230
239
  subscriptionsRef.current.purchaseUpdate = undefined;
231
240
  subscriptionsRef.current.purchaseError = undefined;
232
241
  subscriptionsRef.current.promotedProductIOS = undefined;
233
242
  subscriptionsRef.current.userChoiceBillingAndroid = undefined;
243
+ subscriptionsRef.current.subscriptionBillingIssue = undefined;
234
244
  }, []);
235
245
  const initIapWithSubscriptions = useCallback(async () => {
236
246
  const config = buildAndroidConfig();
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useEffect","useState","useRef","Platform","RnIapConsole","initConnection","purchaseErrorListener","purchaseUpdatedListener","promotedProductListenerIOS","getAvailablePurchases","finishTransaction","finishTransactionInternal","requestPurchase","requestPurchaseInternal","fetchProducts","validateReceipt","validateReceiptInternal","verifyPurchase","verifyPurchaseTopLevel","verifyPurchaseWithProvider","verifyPurchaseWithProviderTopLevel","getActiveSubscriptions","hasActiveSubscriptions","syncIOS","getPromotedProductIOS","requestPurchaseOnPromotedProductIOS","checkAlternativeBillingAvailabilityAndroid","showAlternativeBillingDialogAndroid","createAlternativeBillingTokenAndroid","userChoiceBillingListenerAndroid","isStandardIOS","ErrorCode","useIAP","options","connected","setConnected","products","setProducts","subscriptions","setSubscriptions","availablePurchases","setAvailablePurchases","promotedProductIOS","setPromotedProductIOS","activeSubscriptions","setActiveSubscriptions","optionsRef","connectedRef","mergeWithDuplicateCheck","existingItems","newItems","getKey","merged","forEach","newItem","isDuplicate","some","existingItem","push","current","subscriptionsRef","isMountedRef","subscriptionsRefState","invokeOnError","error","onError","Error","String","fetchProductsInternal","params","warn","requestType","type","debug","skus","result","items","prevSubscriptions","subscription","id","newProducts","filter","item","newSubscriptions","prevProducts","product","getAvailablePurchasesInternal","alsoPublishToEventListenerIOS","onlyIncludeActiveItemsIOS","includeSuspendedAndroid","getActiveSubscriptionsInternal","subscriptionIds","hasActiveSubscriptionsInternal","args","requestObj","restorePurchases","OS","buildAndroidConfig","config","enableBillingProgramAndroid","alternativeBillingModeAndroid","registerListeners","purchaseUpdate","purchase","e","onPurchaseSuccess","purchaseError","code","InitConnection","onPurchaseError","onPromotedProductIOS","onUserChoiceBillingAndroid","userChoiceBillingAndroid","details","cleanupListeners","remove","undefined","initIapWithSubscriptions","reconnect"],"sourceRoot":"../../../src","sources":["hooks/useIAP.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","useEffect","useState","useRef","Platform","RnIapConsole","initConnection","purchaseErrorListener","purchaseUpdatedListener","promotedProductListenerIOS","getAvailablePurchases","finishTransaction","finishTransactionInternal","requestPurchase","requestPurchaseInternal","fetchProducts","validateReceipt","validateReceiptInternal","verifyPurchase","verifyPurchaseTopLevel","verifyPurchaseWithProvider","verifyPurchaseWithProviderTopLevel","getActiveSubscriptions","hasActiveSubscriptions","syncIOS","getPromotedProductIOS","requestPurchaseOnPromotedProductIOS","checkAlternativeBillingAvailabilityAndroid","showAlternativeBillingDialogAndroid","createAlternativeBillingTokenAndroid","userChoiceBillingListenerAndroid","subscriptionBillingIssueListener","isStandardIOS","ErrorCode","useIAP","options","connected","setConnected","products","setProducts","subscriptions","setSubscriptions","availablePurchases","setAvailablePurchases","promotedProductIOS","setPromotedProductIOS","activeSubscriptions","setActiveSubscriptions","optionsRef","connectedRef","mergeWithDuplicateCheck","existingItems","newItems","getKey","merged","forEach","newItem","isDuplicate","some","existingItem","push","current","subscriptionsRef","isMountedRef","subscriptionsRefState","invokeOnError","error","onError","Error","String","fetchProductsInternal","params","warn","requestType","type","debug","skus","result","items","prevSubscriptions","subscription","id","newProducts","filter","item","newSubscriptions","prevProducts","product","getAvailablePurchasesInternal","alsoPublishToEventListenerIOS","onlyIncludeActiveItemsIOS","includeSuspendedAndroid","getActiveSubscriptionsInternal","subscriptionIds","hasActiveSubscriptionsInternal","args","requestObj","restorePurchases","OS","buildAndroidConfig","config","enableBillingProgramAndroid","alternativeBillingModeAndroid","registerListeners","purchaseUpdate","purchase","e","onPurchaseSuccess","purchaseError","code","InitConnection","onPurchaseError","onPromotedProductIOS","onUserChoiceBillingAndroid","userChoiceBillingAndroid","details","subscriptionBillingIssue","onSubscriptionBillingIssue","cleanupListeners","remove","undefined","initIapWithSubscriptions","reconnect"],"sourceRoot":"../../../src","sources":["hooks/useIAP.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+
3
+ import { useEffect, useRef, useState } from 'react';
4
+ import { connectWebhookStream } from "../webhook-client.js";
5
+ // React hook wrapping the SSE webhook stream. Lifecycle:
6
+ // - opens on mount (once `apiKey` is non-empty),
7
+ // - closes on unmount,
8
+ // - reconnects automatically when EventSource raises a transport
9
+ // error (the underlying client auto-reconnects via the EventSource
10
+ // spec; this hook just surfaces the error and re-renders).
11
+ //
12
+ // Why a hook: openiap's UX guidance is that consumers consume webhook
13
+ // events from React state (granting entitlement, refreshing the
14
+ // subscription view) rather than via an imperative listener. The
15
+ // hook's `events` buffer + `onEvent` callback cover both styles.
16
+ export function useWebhookEvents({
17
+ apiKey,
18
+ baseUrl,
19
+ eventSourceFactory,
20
+ bufferSize = 50,
21
+ onEvent,
22
+ onError
23
+ }) {
24
+ const [events, setEvents] = useState([]);
25
+ const [lastError, setLastError] = useState(null);
26
+ const [isConnected, setIsConnected] = useState(false);
27
+
28
+ // Stash callbacks in refs so reconnects don't fire on every render.
29
+ // The underlying SSE connection should only restart when `apiKey` /
30
+ // `baseUrl` change. `eventSourceFactory` is held in a ref too so
31
+ // anonymous-function callers don't tear down the connection every
32
+ // render (a common React pitfall — was previously documented as a
33
+ // caller-side constraint, now enforced by the hook). `bufferSize`
34
+ // is also a ref so adjusting the buffer cap from the host component
35
+ // doesn't tear down the stream and lose in-flight events.
36
+ const onEventRef = useRef(onEvent);
37
+ const onErrorRef = useRef(onError);
38
+ const eventSourceFactoryRef = useRef(eventSourceFactory);
39
+ const bufferSizeRef = useRef(bufferSize);
40
+ onEventRef.current = onEvent;
41
+ onErrorRef.current = onError;
42
+ eventSourceFactoryRef.current = eventSourceFactory;
43
+ bufferSizeRef.current = bufferSize;
44
+
45
+ // Trim the visible buffer immediately when bufferSize is lowered
46
+ // mid-stream. The ref-based update would otherwise only take
47
+ // effect on the next event.
48
+ useEffect(() => {
49
+ setEvents(prev => bufferSize > 0 ? prev.slice(0, bufferSize) : []);
50
+ }, [bufferSize]);
51
+ useEffect(() => {
52
+ // Fresh stream → fresh state. Resetting events + lastError on
53
+ // (re)connect prevents a stale payload from the previous
54
+ // apiKey/baseUrl from briefly leaking into the new context.
55
+ setEvents([]);
56
+ setLastError(null);
57
+ if (!apiKey) {
58
+ return;
59
+ }
60
+ let listener = null;
61
+ let mounted = true;
62
+ try {
63
+ listener = connectWebhookStream({
64
+ apiKey,
65
+ baseUrl,
66
+ eventSourceFactory: eventSourceFactoryRef.current,
67
+ onEvent: event => {
68
+ if (!mounted) {
69
+ return;
70
+ }
71
+ setIsConnected(true);
72
+ const cap = bufferSizeRef.current;
73
+ if (cap > 0) {
74
+ setEvents(prev => [event, ...prev].slice(0, cap));
75
+ }
76
+ onEventRef.current?.(event);
77
+ },
78
+ onError: error => {
79
+ if (!mounted) {
80
+ return;
81
+ }
82
+ setLastError(error);
83
+ onErrorRef.current?.(error);
84
+ }
85
+ });
86
+ } catch (error) {
87
+ const wrapped = {
88
+ code: 'TRANSPORT_ERROR',
89
+ message: error instanceof Error ? error.message : 'Failed to open webhook stream',
90
+ cause: error
91
+ };
92
+ setLastError(wrapped);
93
+ onErrorRef.current?.(wrapped);
94
+ }
95
+ return () => {
96
+ mounted = false;
97
+ listener?.close();
98
+ setIsConnected(false);
99
+ };
100
+ // `eventSourceFactory` deliberately omitted from deps — held in a
101
+ // ref above so anonymous-function callers don't trigger reconnects
102
+ // on every render. The connection is only re-opened when apiKey or
103
+ // baseUrl changes; a runtime factory swap is picked up on that
104
+ // next reconnect via the ref.
105
+ // eslint-disable-next-line react-hooks/exhaustive-deps
106
+ }, [apiKey, baseUrl]);
107
+ return {
108
+ events,
109
+ lastError,
110
+ isConnected
111
+ };
112
+ }
113
+ //# sourceMappingURL=useWebhookEvents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useEffect","useRef","useState","connectWebhookStream","useWebhookEvents","apiKey","baseUrl","eventSourceFactory","bufferSize","onEvent","onError","events","setEvents","lastError","setLastError","isConnected","setIsConnected","onEventRef","onErrorRef","eventSourceFactoryRef","bufferSizeRef","current","prev","slice","listener","mounted","event","cap","error","wrapped","code","message","Error","cause","close"],"sourceRoot":"../../../src","sources":["hooks/useWebhookEvents.ts"],"mappings":"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","ignoreList":[]}