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.
- package/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt +139 -91
- package/android/src/test/java/com/margelo/nitro/iap/ListenerThreadSafetyTest.kt +154 -0
- package/ios/HybridRnIap.swift +79 -55
- package/lib/module/hooks/useIAP.js +3 -1
- package/lib/module/hooks/useIAP.js.map +1 -1
- package/lib/typescript/src/hooks/useIAP.d.ts +2 -2
- package/lib/typescript/src/hooks/useIAP.d.ts.map +1 -1
- package/openiap-versions.json +1 -1
- package/package.json +1 -1
- package/src/hooks/useIAP.ts +4 -5
|
@@ -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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
114
|
-
|
|
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
|
-
|
|
132
|
-
listenersAttached
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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
|
|
774
|
+
synchronized(purchaseUpdatedListeners) {
|
|
775
|
+
purchaseUpdatedListeners.add(listener)
|
|
776
|
+
}
|
|
729
777
|
}
|
|
730
|
-
|
|
778
|
+
|
|
731
779
|
override fun addPurchaseErrorListener(listener: (error: NitroPurchaseResult) -> Unit) {
|
|
732
|
-
purchaseErrorListeners
|
|
780
|
+
synchronized(purchaseErrorListeners) {
|
|
781
|
+
purchaseErrorListeners.add(listener)
|
|
782
|
+
}
|
|
733
783
|
}
|
|
734
|
-
|
|
784
|
+
|
|
735
785
|
override fun removePurchaseUpdatedListener(listener: (purchase: NitroPurchase) -> Unit) {
|
|
736
|
-
|
|
737
|
-
|
|
786
|
+
synchronized(purchaseUpdatedListeners) {
|
|
787
|
+
purchaseUpdatedListeners.remove(listener)
|
|
788
|
+
}
|
|
738
789
|
}
|
|
739
|
-
|
|
790
|
+
|
|
740
791
|
override fun removePurchaseErrorListener(listener: (error: NitroPurchaseResult) -> Unit) {
|
|
741
|
-
|
|
742
|
-
|
|
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
|
-
|
|
771
|
-
|
|
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
|
-
|
|
784
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
}
|
package/ios/HybridRnIap.swift
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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
|
|
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
|
|
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
|
-
|
|
987
|
-
|
|
988
|
-
|
|
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
|
-
|
|
992
|
-
|
|
993
|
-
|
|
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
|
|
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
|
-
|
|
1016
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
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 =>
|
|
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,
|
|
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<
|
|
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":"AAgCA,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EACpB,
|
|
1
|
+
{"version":3,"file":"useIAP.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useIAP.ts"],"names":[],"mappings":"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"}
|
package/openiap-versions.json
CHANGED
package/package.json
CHANGED
package/src/hooks/useIAP.ts
CHANGED
|
@@ -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) =>
|
|
330
|
+
async (requestObj: RequestPurchaseProps): Promise<void> => {
|
|
331
|
+
await requestPurchaseInternal(requestObj);
|
|
332
|
+
},
|
|
334
333
|
[],
|
|
335
334
|
);
|
|
336
335
|
|