react-native-iap 14.7.11 → 14.7.13

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.
@@ -42,6 +42,7 @@ import dev.hyo.openiap.ExternalLinkLaunchModeAndroid as OpenIapExternalLinkLaunc
42
42
  import dev.hyo.openiap.ExternalLinkTypeAndroid as OpenIapExternalLinkType
43
43
  import dev.hyo.openiap.listener.OpenIapDeveloperProvidedBillingListener
44
44
  import dev.hyo.openiap.store.OpenIapStore
45
+ import kotlin.coroutines.cancellation.CancellationException
45
46
  import kotlinx.coroutines.Dispatchers
46
47
  import kotlinx.coroutines.withContext
47
48
  import kotlinx.coroutines.CompletableDeferred
@@ -100,19 +101,34 @@ class HybridRnIap : HybridRnIapSpec() {
100
101
  // CRITICAL: Set Activity BEFORE calling initConnection
101
102
  // Horizon SDK needs Activity to initialize OVRPlatform with proper returnComponent
102
103
  // https://github.com/meta-quest/Meta-Spatial-SDK-Samples/issues/82#issuecomment-3452577530
103
- withContext(Dispatchers.Main) {
104
- runCatching { context.currentActivity }
105
- .onSuccess { activity ->
106
- if (activity != null) {
107
- RnIapLog.debug("Activity available: ${activity.javaClass.name}")
108
- openIap.setActivity(activity)
109
- } else {
110
- RnIapLog.warn("Activity is null during initConnection")
104
+ try {
105
+ withContext(Dispatchers.Main) {
106
+ runCatching { context.currentActivity }
107
+ .onSuccess { activity ->
108
+ if (activity != null) {
109
+ RnIapLog.debug("Activity available: ${activity.javaClass.name}")
110
+ openIap.setActivity(activity)
111
+ } else {
112
+ RnIapLog.warn("Activity is null during initConnection")
113
+ }
111
114
  }
112
- }
113
- .onFailure {
114
- RnIapLog.warn("Activity not available during initConnection - OpenIAP will use Context")
115
- }
115
+ .onFailure {
116
+ RnIapLog.warn("Activity not available during initConnection - OpenIAP will use Context")
117
+ }
118
+ }
119
+ } catch (err: CancellationException) {
120
+ throw err
121
+ } catch (err: Throwable) {
122
+ val error = OpenIAPError.InitConnection
123
+ val errorMessage = err.message ?: err.javaClass.name
124
+ RnIapLog.failure("initConnection.setActivity", err)
125
+ throw OpenIapException(
126
+ toErrorJson(
127
+ error = error,
128
+ debugMessage = errorMessage,
129
+ messageOverride = "Failed to set activity: $errorMessage"
130
+ )
131
+ )
116
132
  }
117
133
 
118
134
  // Single-flight: capture or create the shared Deferred atomically
@@ -128,64 +144,88 @@ class HybridRnIap : HybridRnIapSpec() {
128
144
  return@async result
129
145
  }
130
146
 
131
- if (!listenersAttached) {
132
- listenersAttached = true
133
- RnIapLog.payload("listeners.attach", null)
134
- openIap.addPurchaseUpdateListener(OpenIapPurchaseUpdateListener { p ->
135
- runCatching {
136
- RnIapLog.result(
137
- "purchaseUpdatedListener",
138
- mapOf("id" to p.id, "sku" to p.productId)
139
- )
140
- sendPurchaseUpdate(convertToNitroPurchase(p))
141
- }.onFailure { RnIapLog.failure("purchaseUpdatedListener", it) }
142
- })
143
- openIap.addPurchaseErrorListener(OpenIapPurchaseErrorListener { e ->
144
- val code = OpenIAPError.toCode(e)
145
- val message = e.message ?: OpenIAPError.defaultMessage(code)
146
- runCatching {
147
- RnIapLog.result(
148
- "purchaseErrorListener",
149
- mapOf("code" to code, "message" to message)
150
- )
151
- sendPurchaseError(
152
- NitroPurchaseResult(
153
- responseCode = -1.0,
154
- debugMessage = null,
155
- code = code,
156
- message = message,
157
- purchaseToken = null
147
+ try {
148
+ if (!listenersAttached) {
149
+ listenersAttached = true
150
+ RnIapLog.payload("listeners.attach", null)
151
+ openIap.addPurchaseUpdateListener(OpenIapPurchaseUpdateListener { p ->
152
+ runCatching {
153
+ RnIapLog.result(
154
+ "purchaseUpdatedListener",
155
+ mapOf("id" to p.id, "sku" to p.productId)
158
156
  )
159
- )
160
- }.onFailure { RnIapLog.failure("purchaseErrorListener", it) }
161
- })
162
- openIap.addUserChoiceBillingListener(OpenIapUserChoiceBillingListener { details ->
163
- runCatching {
164
- RnIapLog.result(
165
- "userChoiceBillingListener",
166
- mapOf("products" to details.products, "token" to details.externalTransactionToken)
167
- )
168
- val nitroDetails = UserChoiceBillingDetails(
169
- externalTransactionToken = details.externalTransactionToken,
170
- products = details.products.toTypedArray()
171
- )
172
- sendUserChoiceBilling(nitroDetails)
173
- }.onFailure { RnIapLog.failure("userChoiceBillingListener", it) }
174
- })
175
- // Developer Provided Billing listener (External Payments - 8.3.0+)
176
- openIap.addDeveloperProvidedBillingListener(OpenIapDeveloperProvidedBillingListener { details ->
177
- runCatching {
178
- RnIapLog.result(
179
- "developerProvidedBillingListener",
180
- mapOf("token" to details.externalTransactionToken)
181
- )
182
- val nitroDetails = DeveloperProvidedBillingDetailsAndroid(
183
- externalTransactionToken = details.externalTransactionToken
184
- )
185
- sendDeveloperProvidedBilling(nitroDetails)
186
- }.onFailure { RnIapLog.failure("developerProvidedBillingListener", it) }
187
- })
188
- RnIapLog.result("listeners.attach", "attached")
157
+ sendPurchaseUpdate(convertToNitroPurchase(p))
158
+ }.onFailure { RnIapLog.failure("purchaseUpdatedListener", it) }
159
+ })
160
+ openIap.addPurchaseErrorListener(OpenIapPurchaseErrorListener { e ->
161
+ val code = OpenIAPError.toCode(e)
162
+ val message = e.message ?: OpenIAPError.defaultMessage(code)
163
+ runCatching {
164
+ RnIapLog.result(
165
+ "purchaseErrorListener",
166
+ mapOf("code" to code, "message" to message)
167
+ )
168
+ sendPurchaseError(
169
+ NitroPurchaseResult(
170
+ responseCode = -1.0,
171
+ debugMessage = null,
172
+ code = code,
173
+ message = message,
174
+ purchaseToken = null
175
+ )
176
+ )
177
+ }.onFailure { RnIapLog.failure("purchaseErrorListener", it) }
178
+ })
179
+ openIap.addUserChoiceBillingListener(OpenIapUserChoiceBillingListener { details ->
180
+ runCatching {
181
+ RnIapLog.result(
182
+ "userChoiceBillingListener",
183
+ mapOf("products" to details.products, "token" to details.externalTransactionToken)
184
+ )
185
+ val nitroDetails = UserChoiceBillingDetails(
186
+ externalTransactionToken = details.externalTransactionToken,
187
+ products = details.products.toTypedArray()
188
+ )
189
+ sendUserChoiceBilling(nitroDetails)
190
+ }.onFailure { RnIapLog.failure("userChoiceBillingListener", it) }
191
+ })
192
+ // Developer Provided Billing listener (External Payments - 8.3.0+)
193
+ openIap.addDeveloperProvidedBillingListener(OpenIapDeveloperProvidedBillingListener { details ->
194
+ runCatching {
195
+ RnIapLog.result(
196
+ "developerProvidedBillingListener",
197
+ mapOf("token" to details.externalTransactionToken)
198
+ )
199
+ val nitroDetails = DeveloperProvidedBillingDetailsAndroid(
200
+ externalTransactionToken = details.externalTransactionToken
201
+ )
202
+ sendDeveloperProvidedBilling(nitroDetails)
203
+ }.onFailure { RnIapLog.failure("developerProvidedBillingListener", it) }
204
+ })
205
+ RnIapLog.result("listeners.attach", "attached")
206
+ }
207
+ } catch (err: CancellationException) {
208
+ throw err
209
+ } catch (err: Throwable) {
210
+ listenersAttached = false
211
+ val error = OpenIAPError.InitConnection
212
+ val errorMessage = err.message ?: err.javaClass.name
213
+ RnIapLog.failure("initConnection.listeners", err)
214
+ val wrapped = OpenIapException(
215
+ toErrorJson(
216
+ error = error,
217
+ debugMessage = errorMessage,
218
+ messageOverride = "Failed to register billing listeners: $errorMessage"
219
+ )
220
+ )
221
+ synchronized(initLock) {
222
+ initDeferred?.let { deferred ->
223
+ if (!deferred.isCompleted) deferred.completeExceptionally(wrapped)
224
+ }
225
+ initDeferred = null
226
+ }
227
+ isInitialized = false
228
+ throw wrapped
189
229
  }
190
230
 
191
231
  // We created it above; reuse the shared instance
@@ -254,6 +294,12 @@ class HybridRnIap : HybridRnIapSpec() {
254
294
  runCatching { openIap.endConnection() }
255
295
  productTypeBySku.clear()
256
296
  isInitialized = false
297
+ listenersAttached = false
298
+ synchronized(purchaseUpdatedListeners) { purchaseUpdatedListeners.clear() }
299
+ synchronized(purchaseErrorListeners) { purchaseErrorListeners.clear() }
300
+ promotedProductListenersIOS.clear()
301
+ synchronized(userChoiceBillingListenersAndroid) { userChoiceBillingListenersAndroid.clear() }
302
+ synchronized(developerProvidedBillingListenersAndroid) { developerProvidedBillingListenersAndroid.clear() }
257
303
  initDeferred = null
258
304
  RnIapLog.result("endConnection", true)
259
305
  true
@@ -725,21 +771,27 @@ class HybridRnIap : HybridRnIapSpec() {
725
771
 
726
772
  // Event listener methods
727
773
  override fun addPurchaseUpdatedListener(listener: (purchase: NitroPurchase) -> Unit) {
728
- purchaseUpdatedListeners.add(listener)
774
+ synchronized(purchaseUpdatedListeners) {
775
+ purchaseUpdatedListeners.add(listener)
776
+ }
729
777
  }
730
-
778
+
731
779
  override fun addPurchaseErrorListener(listener: (error: NitroPurchaseResult) -> Unit) {
732
- purchaseErrorListeners.add(listener)
780
+ synchronized(purchaseErrorListeners) {
781
+ purchaseErrorListeners.add(listener)
782
+ }
733
783
  }
734
-
784
+
735
785
  override fun removePurchaseUpdatedListener(listener: (purchase: NitroPurchase) -> Unit) {
736
- // Note: Kotlin doesn't have easy closure comparison, so we'll clear all listeners
737
- purchaseUpdatedListeners.clear()
786
+ synchronized(purchaseUpdatedListeners) {
787
+ purchaseUpdatedListeners.remove(listener)
788
+ }
738
789
  }
739
-
790
+
740
791
  override fun removePurchaseErrorListener(listener: (error: NitroPurchaseResult) -> Unit) {
741
- // Note: Kotlin doesn't have easy closure comparison, so we'll clear all listeners
742
- purchaseErrorListeners.clear()
792
+ synchronized(purchaseErrorListeners) {
793
+ purchaseErrorListeners.remove(listener)
794
+ }
743
795
  }
744
796
 
745
797
  override fun addPromotedProductListenerIOS(listener: (product: NitroProduct) -> Unit) {
@@ -767,11 +819,10 @@ class HybridRnIap : HybridRnIapSpec() {
767
819
  "sendPurchaseUpdate",
768
820
  mapOf("productId" to purchase.productId, "platform" to purchase.platform)
769
821
  )
770
- for (listener in purchaseUpdatedListeners) {
771
- listener(purchase)
772
- }
822
+ val snapshot = synchronized(purchaseUpdatedListeners) { ArrayList(purchaseUpdatedListeners) }
823
+ snapshot.forEach { it(purchase) }
773
824
  }
774
-
825
+
775
826
  /**
776
827
  * Send purchase error event to listeners
777
828
  */
@@ -780,9 +831,8 @@ class HybridRnIap : HybridRnIapSpec() {
780
831
  "sendPurchaseError",
781
832
  mapOf("code" to error.code, "message" to error.message)
782
833
  )
783
- for (listener in purchaseErrorListeners) {
784
- listener(error)
785
- }
834
+ val snapshot = synchronized(purchaseErrorListeners) { ArrayList(purchaseErrorListeners) }
835
+ snapshot.forEach { it(error) }
786
836
  }
787
837
 
788
838
  /**
@@ -1582,9 +1632,8 @@ class HybridRnIap : HybridRnIapSpec() {
1582
1632
  }
1583
1633
 
1584
1634
  private fun sendUserChoiceBilling(details: UserChoiceBillingDetails) {
1585
- synchronized(userChoiceBillingListenersAndroid) {
1586
- userChoiceBillingListenersAndroid.forEach { it(details) }
1587
- }
1635
+ val snapshot = synchronized(userChoiceBillingListenersAndroid) { ArrayList(userChoiceBillingListenersAndroid) }
1636
+ snapshot.forEach { it(details) }
1588
1637
  }
1589
1638
 
1590
1639
  // Developer Provided Billing listener (External Payments - 8.3.0+)
@@ -1601,9 +1650,8 @@ class HybridRnIap : HybridRnIapSpec() {
1601
1650
  }
1602
1651
 
1603
1652
  private fun sendDeveloperProvidedBilling(details: DeveloperProvidedBillingDetailsAndroid) {
1604
- synchronized(developerProvidedBillingListenersAndroid) {
1605
- developerProvidedBillingListenersAndroid.forEach { it(details) }
1606
- }
1653
+ val snapshot = synchronized(developerProvidedBillingListenersAndroid) { ArrayList(developerProvidedBillingListenersAndroid) }
1654
+ snapshot.forEach { it(details) }
1607
1655
  }
1608
1656
 
1609
1657
  // -------------------------------------------------------------------------
@@ -0,0 +1,154 @@
1
+ package com.margelo.nitro.iap
2
+
3
+ import org.junit.Test
4
+ import org.junit.Assert.*
5
+ import java.util.concurrent.CyclicBarrier
6
+ import java.util.concurrent.atomic.AtomicInteger
7
+ import java.util.concurrent.atomic.AtomicReference
8
+ import kotlin.concurrent.thread
9
+
10
+ /**
11
+ * Thread safety tests for the synchronized + snapshot listener pattern
12
+ * used in HybridRnIap to prevent ConcurrentModificationException.
13
+ *
14
+ * Addresses Issue #3150 where purchase events were silently lost
15
+ * due to concurrent listener access.
16
+ */
17
+ class ListenerThreadSafetyTest {
18
+
19
+ @Test
20
+ fun `concurrent add and snapshot iterate does not throw`() {
21
+ val listeners = mutableListOf<(String) -> Unit>()
22
+ val callCount = AtomicInteger(0)
23
+ val errorRef = AtomicReference<Throwable?>(null)
24
+ val iterations = 500
25
+ val barrier = CyclicBarrier(2)
26
+
27
+ val adder = thread {
28
+ barrier.await()
29
+ repeat(iterations) {
30
+ synchronized(listeners) { listeners.add { callCount.incrementAndGet() } }
31
+ }
32
+ }
33
+
34
+ val sender = thread {
35
+ barrier.await()
36
+ repeat(iterations) {
37
+ val snapshot = synchronized(listeners) { ArrayList(listeners) }
38
+ snapshot.forEach {
39
+ try {
40
+ it("event")
41
+ } catch (e: Throwable) {
42
+ errorRef.compareAndSet(null, e)
43
+ }
44
+ }
45
+ }
46
+ }
47
+
48
+ adder.join(5000)
49
+ sender.join(5000)
50
+ assertFalse("Adder thread did not finish", adder.isAlive)
51
+ assertFalse("Sender thread did not finish", sender.isAlive)
52
+ assertNull("Should not throw ConcurrentModificationException", errorRef.get())
53
+ }
54
+
55
+ @Test
56
+ fun `concurrent add, remove, and iterate is safe`() {
57
+ val listeners = mutableListOf<(String) -> Unit>()
58
+ val errorRef = AtomicReference<Throwable?>(null)
59
+ val barrier = CyclicBarrier(3)
60
+
61
+ val adder = thread {
62
+ barrier.await()
63
+ repeat(200) {
64
+ synchronized(listeners) { listeners.add { _ -> } }
65
+ }
66
+ }
67
+
68
+ val remover = thread {
69
+ barrier.await()
70
+ repeat(200) {
71
+ synchronized(listeners) {
72
+ if (listeners.isNotEmpty()) listeners.removeAt(0)
73
+ }
74
+ }
75
+ }
76
+
77
+ val sender = thread {
78
+ barrier.await()
79
+ repeat(200) {
80
+ val snapshot = synchronized(listeners) { ArrayList(listeners) }
81
+ snapshot.forEach {
82
+ try {
83
+ it("event")
84
+ } catch (e: Throwable) {
85
+ errorRef.compareAndSet(null, e)
86
+ }
87
+ }
88
+ }
89
+ }
90
+
91
+ adder.join(5000)
92
+ remover.join(5000)
93
+ sender.join(5000)
94
+ assertFalse("Adder thread did not finish", adder.isAlive)
95
+ assertFalse("Remover thread did not finish", remover.isAlive)
96
+ assertFalse("Sender thread did not finish", sender.isAlive)
97
+ assertNull("Concurrent access should be safe with snapshot pattern", errorRef.get())
98
+ }
99
+
100
+ @Test
101
+ fun `snapshot delivers to all registered listeners`() {
102
+ val listeners = mutableListOf<(String) -> Unit>()
103
+ val results = mutableListOf<String>()
104
+
105
+ synchronized(listeners) {
106
+ listeners.add { results.add("listener1:$it") }
107
+ listeners.add { results.add("listener2:$it") }
108
+ }
109
+
110
+ val snapshot = synchronized(listeners) { ArrayList(listeners) }
111
+ snapshot.forEach { it("event") }
112
+
113
+ assertEquals(2, results.size)
114
+ assertTrue(results.contains("listener1:event"))
115
+ assertTrue(results.contains("listener2:event"))
116
+ }
117
+
118
+ @Test
119
+ fun `synchronized clear removes all listeners`() {
120
+ val listeners = mutableListOf<(String) -> Unit>()
121
+ synchronized(listeners) {
122
+ listeners.add { _ -> }
123
+ listeners.add { _ -> }
124
+ }
125
+
126
+ synchronized(listeners) { listeners.clear() }
127
+
128
+ val snapshot = synchronized(listeners) { ArrayList(listeners) }
129
+ assertTrue("Listeners should be empty after clear", snapshot.isEmpty())
130
+ }
131
+
132
+ @Test
133
+ fun `snapshot is isolated from subsequent modifications`() {
134
+ val listeners = mutableListOf<(String) -> Unit>()
135
+ val results = mutableListOf<String>()
136
+
137
+ synchronized(listeners) {
138
+ listeners.add { results.add("original:$it") }
139
+ }
140
+
141
+ // Take snapshot before adding more listeners
142
+ val snapshot = synchronized(listeners) { ArrayList(listeners) }
143
+
144
+ // Add another listener after snapshot
145
+ synchronized(listeners) {
146
+ listeners.add { results.add("added-after:$it") }
147
+ }
148
+
149
+ // Only the original listener should be in the snapshot
150
+ snapshot.forEach { it("event") }
151
+ assertEquals(1, results.size)
152
+ assertEquals("original:event", results[0])
153
+ }
154
+ }
@@ -23,7 +23,9 @@ class HybridRnIap: HybridRnIapSpec {
23
23
  private var deliveredPurchaseEventOrder: [String] = []
24
24
  private let purchaseEventDedupLimit = 128
25
25
  private var purchasePayloadById: [String: [String: Any]] = [:]
26
-
26
+ // Thread safety lock for listener arrays and error dedup state
27
+ private let listenerLock = NSLock()
28
+
27
29
  // MARK: - Initialization
28
30
 
29
31
  override init() {
@@ -851,8 +853,8 @@ class HybridRnIap: HybridRnIapSpec {
851
853
  }
852
854
 
853
855
  func addPromotedProductListenerIOS(listener: @escaping (NitroProduct) -> Void) throws {
854
- promotedProductListeners.append(listener)
855
-
856
+ listenerLock.withLock { promotedProductListeners.append(listener) }
857
+
856
858
  // If a promoted product is already available from OpenIAP, notify immediately
857
859
  Task {
858
860
  RnIapLog.payload("promotedProductListenerIOS.fetch", nil)
@@ -864,33 +866,27 @@ class HybridRnIap: HybridRnIapSpec {
864
866
  }
865
867
  }
866
868
  }
867
-
869
+
868
870
  func removePromotedProductListenerIOS(listener: @escaping (NitroProduct) -> Void) throws {
869
- // Note: In Swift, comparing closures is not straightforward, so we'll clear all listeners
870
- // In a real implementation, you might want to use a unique identifier for each listener
871
- promotedProductListeners.removeAll()
871
+ listenerLock.withLock { promotedProductListeners.removeAll() }
872
872
  }
873
-
873
+
874
874
  // MARK: - Event Listener Methods
875
-
875
+
876
876
  func addPurchaseUpdatedListener(listener: @escaping (NitroPurchase) -> Void) throws {
877
- purchaseUpdatedListeners.append(listener)
877
+ listenerLock.withLock { purchaseUpdatedListeners.append(listener) }
878
878
  }
879
-
879
+
880
880
  func addPurchaseErrorListener(listener: @escaping (NitroPurchaseResult) -> Void) throws {
881
- purchaseErrorListeners.append(listener)
881
+ listenerLock.withLock { purchaseErrorListeners.append(listener) }
882
882
  }
883
-
883
+
884
884
  func removePurchaseUpdatedListener(listener: @escaping (NitroPurchase) -> Void) throws {
885
- // Note: This is a limitation of Swift closures - we can't easily remove by reference
886
- // For now, we'll just clear all listeners when requested
887
- purchaseUpdatedListeners.removeAll()
885
+ listenerLock.withLock { purchaseUpdatedListeners.removeAll() }
888
886
  }
889
-
887
+
890
888
  func removePurchaseErrorListener(listener: @escaping (NitroPurchaseResult) -> Void) throws {
891
- // Note: This is a limitation of Swift closures - we can't easily remove by reference
892
- // For now, we'll just clear all listeners when requested
893
- purchaseErrorListeners.removeAll()
889
+ listenerLock.withLock { purchaseErrorListeners.removeAll() }
894
890
  }
895
891
 
896
892
  // MARK: - Private Helper Methods
@@ -899,7 +895,10 @@ class HybridRnIap: HybridRnIapSpec {
899
895
  if purchaseUpdatedSub == nil {
900
896
  RnIapLog.payload("purchaseUpdatedListener.register", nil)
901
897
  purchaseUpdatedSub = OpenIapModule.shared.purchaseUpdatedListener { [weak self] openIapPurchase in
902
- guard let self else { return }
898
+ guard let self else {
899
+ RnIapLog.warn("purchaseUpdatedListener: HybridRnIap deallocated, purchase event dropped")
900
+ return
901
+ }
903
902
  Task { @MainActor in
904
903
  let rawPayload = OpenIapSerialization.purchase(openIapPurchase)
905
904
  let payload = RnIapHelper.sanitizeDictionary(rawPayload)
@@ -917,7 +916,10 @@ class HybridRnIap: HybridRnIapSpec {
917
916
  if purchaseErrorSub == nil {
918
917
  RnIapLog.payload("purchaseErrorListener.register", nil)
919
918
  purchaseErrorSub = OpenIapModule.shared.purchaseErrorListener { [weak self] error in
920
- guard let self else { return }
919
+ guard let self else {
920
+ RnIapLog.warn("purchaseErrorListener: HybridRnIap deallocated, error event dropped")
921
+ return
922
+ }
921
923
  Task { @MainActor in
922
924
  let payload = RnIapHelper.sanitizeDictionary(OpenIapSerialization.encode(error))
923
925
  RnIapLog.result("purchaseErrorListener", payload)
@@ -935,7 +937,10 @@ class HybridRnIap: HybridRnIapSpec {
935
937
  if promotedProductSub == nil {
936
938
  RnIapLog.payload("promotedProductListenerIOS.register", nil)
937
939
  promotedProductSub = OpenIapModule.shared.promotedProductListenerIOS { [weak self] productId in
938
- guard let self else { return }
940
+ guard let self else {
941
+ RnIapLog.warn("promotedProductListenerIOS: HybridRnIap deallocated, promoted product event dropped")
942
+ return
943
+ }
939
944
  Task {
940
945
  RnIapLog.payload("promotedProductListenerIOS", ["productId": productId])
941
946
  do {
@@ -945,20 +950,22 @@ class HybridRnIap: HybridRnIapSpec {
945
950
  RnIapLog.result("fetchProducts", payloads)
946
951
  if let payload = payloads.first {
947
952
  let nitro = RnIapHelper.convertProductDictionary(payload)
953
+ let snapshot = self.listenerLock.withLock { Array(self.promotedProductListeners) }
948
954
  await MainActor.run {
949
- for listener in self.promotedProductListeners { listener(nitro) }
955
+ for listener in snapshot { listener(nitro) }
950
956
  }
951
957
  }
952
958
  } catch {
953
959
  RnIapLog.failure("promotedProductListenerIOS", error: error)
954
960
  let id = productId
961
+ let snapshot = self.listenerLock.withLock { Array(self.promotedProductListeners) }
955
962
  await MainActor.run {
956
963
  var minimal = NitroProduct()
957
964
  minimal.id = id
958
965
  minimal.title = id
959
966
  minimal.type = "inapp"
960
967
  minimal.platform = .ios
961
- for listener in self.promotedProductListeners { listener(minimal) }
968
+ for listener in snapshot { listener(minimal) }
962
969
  }
963
970
  }
964
971
  }
@@ -983,44 +990,59 @@ class HybridRnIap: HybridRnIapSpec {
983
990
  ]
984
991
  let eventKey = keyComponents.joined(separator: "#")
985
992
 
986
- if deliveredPurchaseEventKeys.contains(eventKey) {
987
- RnIapLog.warn("Duplicate purchase update skipped for \(purchase.productId)")
988
- return
993
+ var isDuplicate = false
994
+ let snapshot: [(NitroPurchase) -> Void] = listenerLock.withLock {
995
+ if deliveredPurchaseEventKeys.contains(eventKey) {
996
+ isDuplicate = true
997
+ return []
998
+ }
999
+
1000
+ deliveredPurchaseEventKeys.insert(eventKey)
1001
+ deliveredPurchaseEventOrder.append(eventKey)
1002
+ if deliveredPurchaseEventOrder.count > purchaseEventDedupLimit, let removed = deliveredPurchaseEventOrder.first {
1003
+ deliveredPurchaseEventOrder.removeFirst()
1004
+ deliveredPurchaseEventKeys.remove(removed)
1005
+ }
1006
+
1007
+ return Array(purchaseUpdatedListeners)
989
1008
  }
990
1009
 
991
- deliveredPurchaseEventKeys.insert(eventKey)
992
- deliveredPurchaseEventOrder.append(eventKey)
993
- if deliveredPurchaseEventOrder.count > purchaseEventDedupLimit, let removed = deliveredPurchaseEventOrder.first {
994
- deliveredPurchaseEventOrder.removeFirst()
995
- deliveredPurchaseEventKeys.remove(removed)
1010
+ if isDuplicate {
1011
+ RnIapLog.warn("Duplicate purchase update skipped for \(purchase.productId)")
1012
+ return
996
1013
  }
997
1014
 
998
- for listener in purchaseUpdatedListeners {
1015
+ for listener in snapshot {
999
1016
  listener(purchase)
1000
1017
  }
1001
1018
  }
1002
-
1019
+
1003
1020
  private func sendPurchaseError(_ error: NitroPurchaseResult, productId: String? = nil) {
1004
- let now = Date().timeIntervalSince1970
1005
1021
  let dedupIdentifier = productId
1006
1022
  ?? (error.purchaseToken?.isEmpty == false ? error.purchaseToken : nil)
1007
1023
  ?? (error.message.isEmpty ? nil : error.message)
1008
1024
  let currentKey = RnIapHelper.makeErrorDedupKey(code: error.code, productId: dedupIdentifier)
1009
- // Dedup only when the exact same error is emitted almost simultaneously.
1010
- let withinWindow = (now - lastPurchaseErrorTimestamp) < 0.15
1011
- if currentKey == lastPurchaseErrorKey && withinWindow {
1012
- return
1013
- }
1014
1025
 
1015
- lastPurchaseErrorKey = currentKey
1016
- lastPurchaseErrorTimestamp = now
1026
+ // Protect error dedup state since sendPurchaseError is called from multiple threads
1027
+ let shouldSkip: Bool = listenerLock.withLock {
1028
+ let now = Date().timeIntervalSince1970
1029
+ let withinWindow = (now - lastPurchaseErrorTimestamp) < 0.15
1030
+ if currentKey == lastPurchaseErrorKey && withinWindow {
1031
+ return true
1032
+ }
1033
+ lastPurchaseErrorKey = currentKey
1034
+ lastPurchaseErrorTimestamp = now
1035
+ return false
1036
+ }
1037
+ if shouldSkip { return }
1017
1038
 
1018
1039
  // Ensure we never leak SKU via purchaseToken
1019
1040
  var sanitized = error
1020
1041
  if let pid = productId, sanitized.purchaseToken == pid {
1021
1042
  sanitized.purchaseToken = nil
1022
1043
  }
1023
- for listener in purchaseErrorListeners {
1044
+ let snapshot = listenerLock.withLock { Array(purchaseErrorListeners) }
1045
+ for listener in snapshot {
1024
1046
  listener(sanitized)
1025
1047
  }
1026
1048
  }
@@ -1034,8 +1056,8 @@ class HybridRnIap: HybridRnIapSpec {
1034
1056
  updateListenerTask?.cancel()
1035
1057
  updateListenerTask = nil
1036
1058
  isInitialized = false
1037
-
1038
-
1059
+ isInitializing = false
1060
+
1039
1061
  // Remove OpenIAP listeners & end connection
1040
1062
  if let sub = purchaseUpdatedSub {
1041
1063
  RnIapLog.payload("removeListener", "purchaseUpdated")
@@ -1058,15 +1080,17 @@ class HybridRnIap: HybridRnIapSpec {
1058
1080
  RnIapLog.result("endConnection", result as Any)
1059
1081
  }
1060
1082
 
1061
- // Clear event listeners
1062
- purchaseUpdatedListeners.removeAll()
1063
- purchaseErrorListeners.removeAll()
1064
- promotedProductListeners.removeAll()
1065
- deliveredPurchaseEventKeys.removeAll()
1066
- deliveredPurchaseEventOrder.removeAll()
1067
- purchasePayloadById.removeAll()
1068
- lastPurchaseErrorKey = nil
1069
- lastPurchaseErrorTimestamp = 0
1083
+ // Clear event listeners, error dedup state, and delivery state (thread-safe)
1084
+ listenerLock.withLock {
1085
+ purchaseUpdatedListeners.removeAll()
1086
+ purchaseErrorListeners.removeAll()
1087
+ promotedProductListeners.removeAll()
1088
+ lastPurchaseErrorKey = nil
1089
+ lastPurchaseErrorTimestamp = 0
1090
+ deliveredPurchaseEventKeys.removeAll()
1091
+ deliveredPurchaseEventOrder.removeAll()
1092
+ purchasePayloadById.removeAll()
1093
+ }
1070
1094
  }
1071
1095
 
1072
1096
  func deepLinkToSubscriptionsAndroid(options: NitroDeepLinkOptionsAndroid) throws -> Promise<Void> {
@@ -139,7 +139,9 @@ export function useIAP(options) {
139
139
  // Users should handle errors in their onPurchaseSuccess callback if needed.
140
140
  await finishTransactionInternal(args);
141
141
  }, []);
142
- const requestPurchase = useCallback(requestObj => requestPurchaseInternal(requestObj), []);
142
+ const requestPurchase = useCallback(async requestObj => {
143
+ await requestPurchaseInternal(requestObj);
144
+ }, []);
143
145
 
144
146
  // No local restorePurchases; use the top-level helper via returned API
145
147
 
@@ -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","restorePurchases","restorePurchasesTopLevel","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","_skus","alsoPublishToEventListenerIOS","onlyIncludeActiveItemsIOS","getActiveSubscriptionsInternal","subscriptionIds","hasActiveSubscriptionsInternal","args","requestObj","initIapWithSubscriptions","config","OS","enableBillingProgramAndroid","alternativeBillingModeAndroid","purchaseUpdate","purchase","e","onPurchaseSuccess","purchaseError","code","InitConnection","onPurchaseError","onPromotedProductIOS","onUserChoiceBillingAndroid","userChoiceBillingAndroid","details","remove","undefined","currentSubscriptions"],"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","restorePurchases","restorePurchasesTopLevel","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","_skus","alsoPublishToEventListenerIOS","onlyIncludeActiveItemsIOS","getActiveSubscriptionsInternal","subscriptionIds","hasActiveSubscriptionsInternal","args","requestObj","initIapWithSubscriptions","config","OS","enableBillingProgramAndroid","alternativeBillingModeAndroid","purchaseUpdate","purchase","e","onPurchaseSuccess","purchaseError","code","InitConnection","onPurchaseError","onPromotedProductIOS","onUserChoiceBillingAndroid","userChoiceBillingAndroid","details","remove","undefined","currentSubscriptions"],"sourceRoot":"../../../src","sources":["hooks/useIAP.ts"],"mappings":"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","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import type { ProductQueryType, RequestPurchaseProps, RequestPurchaseResult, AlternativeBillingModeAndroid, BillingProgramAndroid, UserChoiceBillingDetails, VerifyPurchaseProps, VerifyPurchaseResult, VerifyPurchaseWithProviderProps, VerifyPurchaseWithProviderResult } from '../types';
1
+ import type { ProductQueryType, RequestPurchaseProps, AlternativeBillingModeAndroid, BillingProgramAndroid, UserChoiceBillingDetails, VerifyPurchaseProps, VerifyPurchaseResult, VerifyPurchaseWithProviderProps, VerifyPurchaseWithProviderResult } from '../types';
2
2
  import type { ActiveSubscription, Product, Purchase, PurchaseError, ProductSubscription } from '../types';
3
3
  import type { MutationFinishTransactionArgs } from '../types';
4
4
  type UseIap = {
@@ -14,7 +14,7 @@ type UseIap = {
14
14
  skus: string[];
15
15
  type?: ProductQueryType | null;
16
16
  }) => Promise<void>;
17
- requestPurchase: (params: RequestPurchaseProps) => Promise<RequestPurchaseResult | null>;
17
+ requestPurchase: (params: RequestPurchaseProps) => Promise<void>;
18
18
  /**
19
19
  * @deprecated Use `verifyPurchase` instead. This function will be removed in a future version.
20
20
  */
@@ -1 +1 @@
1
- {"version":3,"file":"useIAP.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useIAP.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useIAP.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useIAP.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  {
2
- "apple": "1.3.14",
2
+ "apple": "1.3.15",
3
3
  "google": "1.3.28",
4
4
  "gql": "1.3.17",
5
5
  "docs": "1.3.17"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-iap",
3
- "version": "14.7.11",
3
+ "version": "14.7.13",
4
4
  "description": "React Native In-App Purchases module for iOS and Android using Nitro",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -33,7 +33,6 @@ import {ErrorCode} from '../types';
33
33
  import type {
34
34
  ProductQueryType,
35
35
  RequestPurchaseProps,
36
- RequestPurchaseResult,
37
36
  AlternativeBillingModeAndroid,
38
37
  BillingProgramAndroid,
39
38
  UserChoiceBillingDetails,
@@ -69,9 +68,7 @@ type UseIap = {
69
68
  skus: string[];
70
69
  type?: ProductQueryType | null;
71
70
  }) => Promise<void>;
72
- requestPurchase: (
73
- params: RequestPurchaseProps,
74
- ) => Promise<RequestPurchaseResult | null>;
71
+ requestPurchase: (params: RequestPurchaseProps) => Promise<void>;
75
72
  /**
76
73
  * @deprecated Use `verifyPurchase` instead. This function will be removed in a future version.
77
74
  */
@@ -330,7 +327,9 @@ export function useIAP(options?: UseIapOptions): UseIap {
330
327
  );
331
328
 
332
329
  const requestPurchase = useCallback(
333
- (requestObj: RequestPurchaseProps) => requestPurchaseInternal(requestObj),
330
+ async (requestObj: RequestPurchaseProps): Promise<void> => {
331
+ await requestPurchaseInternal(requestObj);
332
+ },
334
333
  [],
335
334
  );
336
335