react-native-iap 15.2.2 → 15.2.4
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/README.md +2 -2
- package/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt +24 -8
- package/ios/HybridRnIap.swift +163 -70
- package/lib/module/hooks/useIAP.js +1 -1
- package/lib/module/hooks/useIAP.js.map +1 -1
- package/lib/module/index.js +65 -7
- package/lib/module/index.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/typescript/src/hooks/useIAP.d.ts +7 -1
- package/lib/typescript/src/hooks/useIAP.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +3 -3
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/specs/RnIap.nitro.d.ts +6 -4
- package/lib/typescript/src/specs/RnIap.nitro.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +16 -2
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/nitrogen/generated/android/c++/JHybridRnIapSpec.cpp +11 -6
- package/nitrogen/generated/android/c++/JHybridRnIapSpec.hpp +2 -2
- package/nitrogen/generated/android/c++/JNitroPurchaseUpdatedListenerOptions.hpp +61 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/HybridRnIapSpec.kt +4 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroPurchaseUpdatedListenerOptions.kt +38 -0
- package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Bridge.hpp +27 -0
- package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Umbrella.hpp +3 -0
- package/nitrogen/generated/ios/c++/HybridRnIapSpecSwift.hpp +9 -4
- package/nitrogen/generated/ios/swift/HybridRnIapSpec.swift +2 -2
- package/nitrogen/generated/ios/swift/HybridRnIapSpec_cxx.swift +8 -12
- package/nitrogen/generated/ios/swift/NitroPurchaseUpdatedListenerOptions.swift +61 -0
- package/nitrogen/generated/shared/c++/HybridRnIapSpec.hpp +5 -2
- package/nitrogen/generated/shared/c++/NitroPurchaseUpdatedListenerOptions.hpp +85 -0
- package/openiap-versions.json +3 -3
- package/package.json +1 -1
- package/src/hooks/useIAP.ts +8 -0
- package/src/index.ts +105 -11
- package/src/specs/RnIap.nitro.ts +10 -5
- package/src/types.ts +19 -2
package/README.md
CHANGED
|
@@ -195,11 +195,11 @@ Quick links:
|
|
|
195
195
|
React Native IAP conforms to the **[OpenIAP specification](https://openiap.dev)** — an open, vendor-neutral interoperability standard for in-app purchases. OpenIAP provides:
|
|
196
196
|
|
|
197
197
|
- **Shared specification** — Common types, error codes, and purchase flows across all platforms
|
|
198
|
-
- **Generated type-safe bindings** — Swift, Kotlin, Dart, and GDScript from a single GraphQL schema
|
|
198
|
+
- **Generated type-safe bindings** — Swift, Kotlin, TypeScript, Dart, C#, and GDScript from a single GraphQL schema
|
|
199
199
|
- **Platform implementations** — [openiap-apple](https://github.com/hyodotdev/openiap/tree/main/packages/apple) (StoreKit 2) and [openiap-google](https://github.com/hyodotdev/openiap/tree/main/packages/google) (Play Billing 8.x)
|
|
200
200
|
- **Verification profiles** — Standardized receipt validation and purchase verification patterns
|
|
201
201
|
|
|
202
|
-
Other libraries built on OpenIAP: [expo-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/expo-iap) · [flutter_inapp_purchase](https://github.com/hyodotdev/openiap/tree/main/libraries/flutter_inapp_purchase) · [kmp-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/kmp-iap) · [godot-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/godot-iap)
|
|
202
|
+
Other libraries built on OpenIAP: [expo-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/expo-iap) · [flutter_inapp_purchase](https://github.com/hyodotdev/openiap/tree/main/libraries/flutter_inapp_purchase) · [kmp-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/kmp-iap) · [maui-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/maui-iap) · [godot-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/godot-iap)
|
|
203
203
|
|
|
204
204
|
**[Learn more about the OpenIAP standard →](https://openiap.dev/docs/foundation/about)**
|
|
205
205
|
|
|
@@ -68,6 +68,10 @@ class OpenIapException(private val errorJson: String) : Exception() {
|
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
class HybridRnIap : HybridRnIapSpec() {
|
|
71
|
+
private data class PurchaseUpdatedListenerRegistration(
|
|
72
|
+
val token: Double,
|
|
73
|
+
val listener: (NitroPurchase) -> Unit
|
|
74
|
+
)
|
|
71
75
|
|
|
72
76
|
// Get ReactApplicationContext lazily from NitroModules
|
|
73
77
|
private val context: ReactApplicationContext by lazy {
|
|
@@ -79,7 +83,8 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
79
83
|
private val productTypeBySku = mutableMapOf<String, String>()
|
|
80
84
|
|
|
81
85
|
// Event listeners
|
|
82
|
-
private val purchaseUpdatedListeners = mutableListOf<
|
|
86
|
+
private val purchaseUpdatedListeners = mutableListOf<PurchaseUpdatedListenerRegistration>()
|
|
87
|
+
private var nextPurchaseUpdatedListenerToken = 1.0
|
|
83
88
|
private val purchaseErrorListeners = mutableListOf<(NitroPurchaseResult) -> Unit>()
|
|
84
89
|
private val promotedProductListenersIOS = mutableListOf<(NitroProduct) -> Unit>()
|
|
85
90
|
private val userChoiceBillingListenersAndroid = mutableListOf<(UserChoiceBillingDetails) -> Unit>()
|
|
@@ -302,7 +307,10 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
302
307
|
productTypeBySku.clear()
|
|
303
308
|
isInitialized = false
|
|
304
309
|
listenersAttached = false
|
|
305
|
-
synchronized(purchaseUpdatedListeners) {
|
|
310
|
+
synchronized(purchaseUpdatedListeners) {
|
|
311
|
+
purchaseUpdatedListeners.clear()
|
|
312
|
+
nextPurchaseUpdatedListenerToken = 1.0
|
|
313
|
+
}
|
|
306
314
|
synchronized(purchaseErrorListeners) { purchaseErrorListeners.clear() }
|
|
307
315
|
promotedProductListenersIOS.clear()
|
|
308
316
|
synchronized(userChoiceBillingListenersAndroid) { userChoiceBillingListenersAndroid.clear() }
|
|
@@ -783,9 +791,15 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
783
791
|
get() = 0L
|
|
784
792
|
|
|
785
793
|
// Event listener methods
|
|
786
|
-
override fun addPurchaseUpdatedListener(
|
|
787
|
-
|
|
788
|
-
|
|
794
|
+
override fun addPurchaseUpdatedListener(
|
|
795
|
+
listener: (purchase: NitroPurchase) -> Unit,
|
|
796
|
+
options: NitroPurchaseUpdatedListenerOptions?
|
|
797
|
+
): Double {
|
|
798
|
+
return synchronized(purchaseUpdatedListeners) {
|
|
799
|
+
val token = nextPurchaseUpdatedListenerToken
|
|
800
|
+
nextPurchaseUpdatedListenerToken += 1.0
|
|
801
|
+
purchaseUpdatedListeners.add(PurchaseUpdatedListenerRegistration(token, listener))
|
|
802
|
+
token
|
|
789
803
|
}
|
|
790
804
|
}
|
|
791
805
|
|
|
@@ -795,9 +809,9 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
795
809
|
}
|
|
796
810
|
}
|
|
797
811
|
|
|
798
|
-
override fun removePurchaseUpdatedListener(
|
|
812
|
+
override fun removePurchaseUpdatedListener(token: Double) {
|
|
799
813
|
synchronized(purchaseUpdatedListeners) {
|
|
800
|
-
purchaseUpdatedListeners.
|
|
814
|
+
purchaseUpdatedListeners.removeAll { it.token == token }
|
|
801
815
|
}
|
|
802
816
|
}
|
|
803
817
|
|
|
@@ -832,7 +846,9 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
832
846
|
"sendPurchaseUpdate",
|
|
833
847
|
mapOf("productId" to purchase.productId, "platform" to purchase.platform)
|
|
834
848
|
)
|
|
835
|
-
val snapshot = synchronized(purchaseUpdatedListeners) {
|
|
849
|
+
val snapshot = synchronized(purchaseUpdatedListeners) {
|
|
850
|
+
purchaseUpdatedListeners.map { it.listener }
|
|
851
|
+
}
|
|
836
852
|
snapshot.forEach { it(purchase) }
|
|
837
853
|
}
|
|
838
854
|
|
package/ios/HybridRnIap.swift
CHANGED
|
@@ -4,6 +4,16 @@ import OpenIAP
|
|
|
4
4
|
|
|
5
5
|
@available(iOS 15.0, macOS 14.0, tvOS 15.0, watchOS 8.0, *)
|
|
6
6
|
class HybridRnIap: HybridRnIapSpec {
|
|
7
|
+
private enum PurchaseUpdatedListenerBucket {
|
|
8
|
+
case deduping
|
|
9
|
+
case nonDeduping
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
private struct PurchaseUpdatedListenerRegistration {
|
|
13
|
+
let token: Double
|
|
14
|
+
let bucket: PurchaseUpdatedListenerBucket
|
|
15
|
+
}
|
|
16
|
+
|
|
7
17
|
// MARK: - Properties
|
|
8
18
|
private var updateListenerTask: Task<Void, Never>?
|
|
9
19
|
private var isInitialized: Bool = false
|
|
@@ -11,20 +21,20 @@ class HybridRnIap: HybridRnIapSpec {
|
|
|
11
21
|
private var productTypeBySku: [String: String] = [:]
|
|
12
22
|
// OpenIAP event subscriptions
|
|
13
23
|
private var purchaseUpdatedSub: Subscription?
|
|
24
|
+
private var purchaseUpdatedDuplicateSub: Subscription?
|
|
14
25
|
private var purchaseErrorSub: Subscription?
|
|
15
26
|
private var promotedProductSub: Subscription?
|
|
16
27
|
// Event listeners
|
|
17
|
-
private var
|
|
28
|
+
private var nextPurchaseUpdatedListenerToken: Double = 1
|
|
29
|
+
private var purchaseUpdatedListeners: [(token: Double, listener: (NitroPurchase) -> Void)] = []
|
|
30
|
+
private var purchaseUpdatedDuplicateListeners: [(token: Double, listener: (NitroPurchase) -> Void)] = []
|
|
31
|
+
private var purchaseUpdatedListenerRegistrations: [PurchaseUpdatedListenerRegistration] = []
|
|
18
32
|
private var purchaseErrorListeners: [(NitroPurchaseResult) -> Void] = []
|
|
19
33
|
private var promotedProductListeners: [(NitroProduct) -> Void] = []
|
|
20
34
|
private var subscriptionBillingIssueListeners: [(NitroPurchase) -> Void] = []
|
|
21
35
|
private var subscriptionBillingIssueSub: Subscription?
|
|
22
36
|
private var lastPurchaseErrorKey: String? = nil
|
|
23
37
|
private var lastPurchaseErrorTimestamp: TimeInterval = 0
|
|
24
|
-
private var deliveredPurchaseEventKeys: Set<String> = []
|
|
25
|
-
private var deliveredPurchaseEventOrder: [String] = []
|
|
26
|
-
private let purchaseEventDedupLimit = 128
|
|
27
|
-
private static let duplicatePurchaseCode = "duplicate-purchase"
|
|
28
38
|
private var purchasePayloadById: [String: [String: Any]] = [:]
|
|
29
39
|
// Thread safety lock for listener arrays and error dedup state
|
|
30
40
|
private let listenerLock = NSLock()
|
|
@@ -942,16 +952,92 @@ class HybridRnIap: HybridRnIapSpec {
|
|
|
942
952
|
|
|
943
953
|
// MARK: - Event Listener Methods
|
|
944
954
|
|
|
945
|
-
func addPurchaseUpdatedListener(
|
|
946
|
-
|
|
955
|
+
func addPurchaseUpdatedListener(
|
|
956
|
+
listener: @escaping (NitroPurchase) -> Void,
|
|
957
|
+
options: NitroPurchaseUpdatedListenerOptions?
|
|
958
|
+
) throws -> Double {
|
|
959
|
+
let dedupeTransactionIOS = purchaseUpdatedDedupeTransactionIOS(from: options)
|
|
960
|
+
let receiveDuplicateTransactionUpdatesIOS = !dedupeTransactionIOS
|
|
961
|
+
let token = listenerLock.withLock {
|
|
962
|
+
let token = nextPurchaseUpdatedListenerToken
|
|
963
|
+
nextPurchaseUpdatedListenerToken += 1
|
|
964
|
+
|
|
965
|
+
let registration = PurchaseUpdatedListenerRegistration(
|
|
966
|
+
token: token,
|
|
967
|
+
bucket: receiveDuplicateTransactionUpdatesIOS ? .nonDeduping : .deduping
|
|
968
|
+
)
|
|
969
|
+
if receiveDuplicateTransactionUpdatesIOS {
|
|
970
|
+
purchaseUpdatedDuplicateListeners.append((token: token, listener: listener))
|
|
971
|
+
} else {
|
|
972
|
+
purchaseUpdatedListeners.append((token: token, listener: listener))
|
|
973
|
+
}
|
|
974
|
+
purchaseUpdatedListenerRegistrations.append(registration)
|
|
975
|
+
return token
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
if receiveDuplicateTransactionUpdatesIOS {
|
|
979
|
+
attachDuplicatePurchaseUpdatedSubIfNeeded()
|
|
980
|
+
} else {
|
|
981
|
+
attachPurchaseUpdatedSubIfNeeded()
|
|
982
|
+
}
|
|
983
|
+
return token
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
func removePurchaseUpdatedListener(token: Double) throws {
|
|
987
|
+
let removedSubscription = listenerLock.withLock {
|
|
988
|
+
removePurchaseUpdatedListenerRegistration(token: token)
|
|
989
|
+
}
|
|
990
|
+
if let removedSubscription {
|
|
991
|
+
RnIapLog.payload("removeListener", removedSubscription.label)
|
|
992
|
+
OpenIapModule.shared.removeListener(removedSubscription.subscription)
|
|
993
|
+
}
|
|
947
994
|
}
|
|
948
995
|
|
|
949
996
|
func addPurchaseErrorListener(listener: @escaping (NitroPurchaseResult) -> Void) throws {
|
|
950
997
|
listenerLock.withLock { purchaseErrorListeners.append(listener) }
|
|
951
998
|
}
|
|
952
999
|
|
|
953
|
-
func
|
|
954
|
-
|
|
1000
|
+
private func purchaseUpdatedDedupeTransactionIOS(
|
|
1001
|
+
from options: NitroPurchaseUpdatedListenerOptions?
|
|
1002
|
+
) -> Bool {
|
|
1003
|
+
guard let dedupeTransactionIOS = options?.dedupeTransactionIOS else {
|
|
1004
|
+
return true
|
|
1005
|
+
}
|
|
1006
|
+
switch dedupeTransactionIOS {
|
|
1007
|
+
case .second(let enabled):
|
|
1008
|
+
return enabled
|
|
1009
|
+
case .first:
|
|
1010
|
+
return true
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
private func removePurchaseUpdatedListenerRegistration(token: Double) -> (label: String, subscription: Subscription)? {
|
|
1015
|
+
guard let registrationIndex = purchaseUpdatedListenerRegistrations.lastIndex(where: {
|
|
1016
|
+
$0.token == token
|
|
1017
|
+
}) else {
|
|
1018
|
+
return nil
|
|
1019
|
+
}
|
|
1020
|
+
let registration = purchaseUpdatedListenerRegistrations.remove(at: registrationIndex)
|
|
1021
|
+
switch registration.bucket {
|
|
1022
|
+
case .deduping:
|
|
1023
|
+
if let index = purchaseUpdatedListeners.lastIndex(where: { $0.token == token }) {
|
|
1024
|
+
purchaseUpdatedListeners.remove(at: index)
|
|
1025
|
+
}
|
|
1026
|
+
guard purchaseUpdatedListeners.isEmpty, let sub = purchaseUpdatedSub else {
|
|
1027
|
+
return nil
|
|
1028
|
+
}
|
|
1029
|
+
purchaseUpdatedSub = nil
|
|
1030
|
+
return ("purchaseUpdated", sub)
|
|
1031
|
+
case .nonDeduping:
|
|
1032
|
+
if let index = purchaseUpdatedDuplicateListeners.lastIndex(where: { $0.token == token }) {
|
|
1033
|
+
purchaseUpdatedDuplicateListeners.remove(at: index)
|
|
1034
|
+
}
|
|
1035
|
+
guard purchaseUpdatedDuplicateListeners.isEmpty, let sub = purchaseUpdatedDuplicateSub else {
|
|
1036
|
+
return nil
|
|
1037
|
+
}
|
|
1038
|
+
purchaseUpdatedDuplicateSub = nil
|
|
1039
|
+
return ("purchaseUpdatedDuplicate", sub)
|
|
1040
|
+
}
|
|
955
1041
|
}
|
|
956
1042
|
|
|
957
1043
|
func removePurchaseErrorListener(listener: @escaping (NitroPurchaseResult) -> Void) throws {
|
|
@@ -970,26 +1056,7 @@ class HybridRnIap: HybridRnIapSpec {
|
|
|
970
1056
|
// MARK: - Private Helper Methods
|
|
971
1057
|
|
|
972
1058
|
private func attachListenersIfNeeded() {
|
|
973
|
-
|
|
974
|
-
RnIapLog.payload("purchaseUpdatedListener.register", nil)
|
|
975
|
-
purchaseUpdatedSub = OpenIapModule.shared.purchaseUpdatedListener { [weak self] openIapPurchase in
|
|
976
|
-
guard let self else {
|
|
977
|
-
RnIapLog.warn("purchaseUpdatedListener: HybridRnIap deallocated, purchase event dropped")
|
|
978
|
-
return
|
|
979
|
-
}
|
|
980
|
-
Task { @MainActor in
|
|
981
|
-
let rawPayload = OpenIapSerialization.purchase(openIapPurchase)
|
|
982
|
-
let payload = RnIapHelper.sanitizeDictionary(rawPayload)
|
|
983
|
-
RnIapLog.result("purchaseUpdatedListener", payload)
|
|
984
|
-
if let identifier = rawPayload["id"] as? String {
|
|
985
|
-
self.purchasePayloadById[identifier] = rawPayload
|
|
986
|
-
}
|
|
987
|
-
let nitro = RnIapHelper.convertPurchaseDictionary(payload)
|
|
988
|
-
self.sendPurchaseUpdate(nitro)
|
|
989
|
-
}
|
|
990
|
-
}
|
|
991
|
-
RnIapLog.result("purchaseUpdatedListener.register", "attached")
|
|
992
|
-
}
|
|
1059
|
+
attachPurchaseUpdatedSubIfNeeded()
|
|
993
1060
|
|
|
994
1061
|
if purchaseErrorSub == nil {
|
|
995
1062
|
RnIapLog.payload("purchaseErrorListener.register", nil)
|
|
@@ -1048,6 +1115,61 @@ class HybridRnIap: HybridRnIapSpec {
|
|
|
1048
1115
|
}
|
|
1049
1116
|
}
|
|
1050
1117
|
|
|
1118
|
+
private func attachPurchaseUpdatedSubIfNeeded() {
|
|
1119
|
+
listenerLock.withLock {
|
|
1120
|
+
guard purchaseUpdatedSub == nil else {
|
|
1121
|
+
return
|
|
1122
|
+
}
|
|
1123
|
+
RnIapLog.payload("purchaseUpdatedListener.register", nil)
|
|
1124
|
+
purchaseUpdatedSub = OpenIapModule.shared.purchaseUpdatedListener { [weak self] openIapPurchase in
|
|
1125
|
+
guard let self else {
|
|
1126
|
+
RnIapLog.warn("purchaseUpdatedListener: HybridRnIap deallocated, purchase event dropped")
|
|
1127
|
+
return
|
|
1128
|
+
}
|
|
1129
|
+
Task { @MainActor in
|
|
1130
|
+
let rawPayload = OpenIapSerialization.purchase(openIapPurchase)
|
|
1131
|
+
let payload = RnIapHelper.sanitizeDictionary(rawPayload)
|
|
1132
|
+
RnIapLog.result("purchaseUpdatedListener", payload)
|
|
1133
|
+
if let identifier = rawPayload["id"] as? String {
|
|
1134
|
+
self.purchasePayloadById[identifier] = rawPayload
|
|
1135
|
+
}
|
|
1136
|
+
let nitro = RnIapHelper.convertPurchaseDictionary(payload)
|
|
1137
|
+
self.sendPurchaseUpdate(nitro, includeDuplicateListeners: false)
|
|
1138
|
+
}
|
|
1139
|
+
}
|
|
1140
|
+
RnIapLog.result("purchaseUpdatedListener.register", "attached")
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1143
|
+
|
|
1144
|
+
private func attachDuplicatePurchaseUpdatedSubIfNeeded() {
|
|
1145
|
+
listenerLock.withLock {
|
|
1146
|
+
guard purchaseUpdatedDuplicateSub == nil else {
|
|
1147
|
+
return
|
|
1148
|
+
}
|
|
1149
|
+
RnIapLog.payload("purchaseUpdatedListener.register.duplicates", nil)
|
|
1150
|
+
let options = PurchaseUpdatedListenerOptions(
|
|
1151
|
+
dedupeTransactionIOS: false
|
|
1152
|
+
)
|
|
1153
|
+
purchaseUpdatedDuplicateSub = OpenIapModule.shared.purchaseUpdatedListener({ [weak self] openIapPurchase in
|
|
1154
|
+
guard let self else {
|
|
1155
|
+
RnIapLog.warn("purchaseUpdatedListener: HybridRnIap deallocated, non-deduping purchase event dropped")
|
|
1156
|
+
return
|
|
1157
|
+
}
|
|
1158
|
+
Task { @MainActor in
|
|
1159
|
+
let rawPayload = OpenIapSerialization.purchase(openIapPurchase)
|
|
1160
|
+
let payload = RnIapHelper.sanitizeDictionary(rawPayload)
|
|
1161
|
+
RnIapLog.result("purchaseUpdatedListener.duplicates", payload)
|
|
1162
|
+
if let identifier = rawPayload["id"] as? String {
|
|
1163
|
+
self.purchasePayloadById[identifier] = rawPayload
|
|
1164
|
+
}
|
|
1165
|
+
let nitro = RnIapHelper.convertPurchaseDictionary(payload)
|
|
1166
|
+
self.sendPurchaseUpdate(nitro, includeDuplicateListeners: true)
|
|
1167
|
+
}
|
|
1168
|
+
}, options: options)
|
|
1169
|
+
RnIapLog.result("purchaseUpdatedListener.register.duplicates", "attached")
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
|
|
1051
1173
|
private func attachSubscriptionBillingIssueSubIfNeeded() {
|
|
1052
1174
|
guard subscriptionBillingIssueSub == nil else { return }
|
|
1053
1175
|
RnIapLog.payload("subscriptionBillingIssueListener.register", nil)
|
|
@@ -1075,48 +1197,13 @@ class HybridRnIap: HybridRnIapSpec {
|
|
|
1075
1197
|
}
|
|
1076
1198
|
}
|
|
1077
1199
|
|
|
1078
|
-
private func sendPurchaseUpdate(_ purchase: NitroPurchase) {
|
|
1079
|
-
let originalTxId: String
|
|
1080
|
-
if case .second(let val) = purchase.originalTransactionIdentifierIOS { originalTxId = val } else { originalTxId = "" }
|
|
1081
|
-
let purchaseTokenStr: String
|
|
1082
|
-
if case .second(let val) = purchase.purchaseToken { purchaseTokenStr = val } else { purchaseTokenStr = "" }
|
|
1083
|
-
let keyComponents: [String] = [
|
|
1084
|
-
purchase.id,
|
|
1085
|
-
purchase.productId,
|
|
1086
|
-
String(purchase.transactionDate),
|
|
1087
|
-
originalTxId,
|
|
1088
|
-
purchaseTokenStr
|
|
1089
|
-
]
|
|
1090
|
-
let eventKey = keyComponents.joined(separator: "#")
|
|
1091
|
-
|
|
1092
|
-
var isDuplicate = false
|
|
1200
|
+
private func sendPurchaseUpdate(_ purchase: NitroPurchase, includeDuplicateListeners: Bool) {
|
|
1093
1201
|
let snapshot: [(NitroPurchase) -> Void] = listenerLock.withLock {
|
|
1094
|
-
if
|
|
1095
|
-
|
|
1096
|
-
return []
|
|
1097
|
-
}
|
|
1098
|
-
|
|
1099
|
-
deliveredPurchaseEventKeys.insert(eventKey)
|
|
1100
|
-
deliveredPurchaseEventOrder.append(eventKey)
|
|
1101
|
-
if deliveredPurchaseEventOrder.count > purchaseEventDedupLimit, let removed = deliveredPurchaseEventOrder.first {
|
|
1102
|
-
deliveredPurchaseEventOrder.removeFirst()
|
|
1103
|
-
deliveredPurchaseEventKeys.remove(removed)
|
|
1202
|
+
if includeDuplicateListeners {
|
|
1203
|
+
return purchaseUpdatedDuplicateListeners.map(\.listener)
|
|
1104
1204
|
}
|
|
1105
1205
|
|
|
1106
|
-
return
|
|
1107
|
-
}
|
|
1108
|
-
|
|
1109
|
-
if isDuplicate {
|
|
1110
|
-
RnIapLog.warn("Duplicate purchase update skipped for \(purchase.productId)")
|
|
1111
|
-
let error = NitroPurchaseResult(
|
|
1112
|
-
responseCode: -1,
|
|
1113
|
-
debugMessage: nil,
|
|
1114
|
-
code: HybridRnIap.duplicatePurchaseCode,
|
|
1115
|
-
message: "Duplicate purchase update skipped for \(purchase.productId). Use restorePurchases or getAvailablePurchases to recover.",
|
|
1116
|
-
purchaseToken: nil
|
|
1117
|
-
)
|
|
1118
|
-
sendPurchaseError(error, productId: purchase.productId)
|
|
1119
|
-
return
|
|
1206
|
+
return purchaseUpdatedListeners.map(\.listener)
|
|
1120
1207
|
}
|
|
1121
1208
|
|
|
1122
1209
|
for listener in snapshot {
|
|
@@ -1178,6 +1265,10 @@ class HybridRnIap: HybridRnIapSpec {
|
|
|
1178
1265
|
RnIapLog.payload("removeListener", "purchaseUpdated")
|
|
1179
1266
|
OpenIapModule.shared.removeListener(sub)
|
|
1180
1267
|
}
|
|
1268
|
+
if let sub = purchaseUpdatedDuplicateSub {
|
|
1269
|
+
RnIapLog.payload("removeListener", "purchaseUpdatedDuplicate")
|
|
1270
|
+
OpenIapModule.shared.removeListener(sub)
|
|
1271
|
+
}
|
|
1181
1272
|
if let sub = purchaseErrorSub {
|
|
1182
1273
|
RnIapLog.payload("removeListener", "purchaseError")
|
|
1183
1274
|
OpenIapModule.shared.removeListener(sub)
|
|
@@ -1191,6 +1282,7 @@ class HybridRnIap: HybridRnIapSpec {
|
|
|
1191
1282
|
OpenIapModule.shared.removeListener(sub)
|
|
1192
1283
|
}
|
|
1193
1284
|
purchaseUpdatedSub = nil
|
|
1285
|
+
purchaseUpdatedDuplicateSub = nil
|
|
1194
1286
|
purchaseErrorSub = nil
|
|
1195
1287
|
promotedProductSub = nil
|
|
1196
1288
|
subscriptionBillingIssueSub = nil
|
|
@@ -1203,13 +1295,14 @@ class HybridRnIap: HybridRnIapSpec {
|
|
|
1203
1295
|
// Clear event listeners, error dedup state, and delivery state (thread-safe)
|
|
1204
1296
|
listenerLock.withLock {
|
|
1205
1297
|
purchaseUpdatedListeners.removeAll()
|
|
1298
|
+
purchaseUpdatedDuplicateListeners.removeAll()
|
|
1299
|
+
purchaseUpdatedListenerRegistrations.removeAll()
|
|
1300
|
+
nextPurchaseUpdatedListenerToken = 1
|
|
1206
1301
|
purchaseErrorListeners.removeAll()
|
|
1207
1302
|
promotedProductListeners.removeAll()
|
|
1208
1303
|
subscriptionBillingIssueListeners.removeAll()
|
|
1209
1304
|
lastPurchaseErrorKey = nil
|
|
1210
1305
|
lastPurchaseErrorTimestamp = 0
|
|
1211
|
-
deliveredPurchaseEventKeys.removeAll()
|
|
1212
|
-
deliveredPurchaseEventOrder.removeAll()
|
|
1213
1306
|
}
|
|
1214
1307
|
// Clear purchasePayloadById on MainActor to match its access pattern
|
|
1215
1308
|
Task { @MainActor in
|
|
@@ -192,7 +192,7 @@ export function useIAP(options) {
|
|
|
192
192
|
if (optionsRef.current?.onPurchaseSuccess) {
|
|
193
193
|
optionsRef.current.onPurchaseSuccess(purchase);
|
|
194
194
|
}
|
|
195
|
-
});
|
|
195
|
+
}, optionsRef.current?.purchaseUpdatedListenerOptions);
|
|
196
196
|
}
|
|
197
197
|
if (!subscriptionsRef.current.purchaseError) {
|
|
198
198
|
subscriptionsRef.current.purchaseError = purchaseErrorListener(error => {
|
|
@@ -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","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":[]}
|
|
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","purchaseUpdatedListenerOptions","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":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -114,11 +114,15 @@ const IAP = {
|
|
|
114
114
|
// ============================================================================
|
|
115
115
|
|
|
116
116
|
const purchaseUpdateJsListeners = new Set();
|
|
117
|
+
const purchaseUpdateDuplicateJsListeners = new Set();
|
|
117
118
|
let purchaseUpdateNativeAttached = false;
|
|
118
|
-
|
|
119
|
+
let purchaseUpdateDuplicateNativeAttached = false;
|
|
120
|
+
let purchaseUpdateNativeToken = null;
|
|
121
|
+
let purchaseUpdateDuplicateNativeToken = null;
|
|
122
|
+
const emitPurchaseUpdateToListeners = (nitroPurchase, listeners) => {
|
|
119
123
|
if (validateNitroPurchase(nitroPurchase)) {
|
|
120
124
|
const convertedPurchase = convertNitroPurchaseToPurchase(nitroPurchase);
|
|
121
|
-
for (const listener of
|
|
125
|
+
for (const listener of listeners) {
|
|
122
126
|
try {
|
|
123
127
|
listener(convertedPurchase);
|
|
124
128
|
} catch (e) {
|
|
@@ -129,6 +133,12 @@ const purchaseUpdateNativeHandler = nitroPurchase => {
|
|
|
129
133
|
RnIapConsole.error('Invalid purchase data received from native — productId:', nitroPurchase?.productId ?? 'unknown');
|
|
130
134
|
}
|
|
131
135
|
};
|
|
136
|
+
const purchaseUpdateNativeHandler = nitroPurchase => {
|
|
137
|
+
emitPurchaseUpdateToListeners(nitroPurchase, purchaseUpdateJsListeners);
|
|
138
|
+
};
|
|
139
|
+
const purchaseUpdateDuplicateNativeHandler = nitroPurchase => {
|
|
140
|
+
emitPurchaseUpdateToListeners(nitroPurchase, purchaseUpdateDuplicateJsListeners);
|
|
141
|
+
};
|
|
132
142
|
const purchaseErrorJsListeners = new Set();
|
|
133
143
|
let purchaseErrorNativeAttached = false;
|
|
134
144
|
const purchaseErrorNativeHandler = error => {
|
|
@@ -168,6 +178,9 @@ const promotedProductNativeHandler = nitroProduct => {
|
|
|
168
178
|
*/
|
|
169
179
|
export const resetListenerState = () => {
|
|
170
180
|
purchaseUpdateNativeAttached = false;
|
|
181
|
+
purchaseUpdateDuplicateNativeAttached = false;
|
|
182
|
+
purchaseUpdateNativeToken = null;
|
|
183
|
+
purchaseUpdateDuplicateNativeToken = null;
|
|
171
184
|
purchaseErrorNativeAttached = false;
|
|
172
185
|
promotedProductNativeAttached = false;
|
|
173
186
|
userChoiceBillingNativeAttached = false;
|
|
@@ -175,17 +188,21 @@ export const resetListenerState = () => {
|
|
|
175
188
|
subscriptionBillingIssueNativeAttached = false;
|
|
176
189
|
// Clear all JS listeners since native side clears them in endConnection
|
|
177
190
|
purchaseUpdateJsListeners.clear();
|
|
191
|
+
purchaseUpdateDuplicateJsListeners.clear();
|
|
178
192
|
purchaseErrorJsListeners.clear();
|
|
179
193
|
promotedProductJsListeners.clear();
|
|
180
194
|
userChoiceBillingJsListeners.clear();
|
|
181
195
|
developerProvidedBillingJsListeners.clear();
|
|
182
196
|
subscriptionBillingIssueJsListeners.clear();
|
|
183
197
|
};
|
|
184
|
-
export const purchaseUpdatedListener = listener => {
|
|
185
|
-
|
|
186
|
-
|
|
198
|
+
export const purchaseUpdatedListener = (listener, options) => {
|
|
199
|
+
const receiveDuplicateTransactionUpdatesIOS = Platform.OS === 'ios' && options?.dedupeTransactionIOS === false;
|
|
200
|
+
const listeners = receiveDuplicateTransactionUpdatesIOS ? purchaseUpdateDuplicateJsListeners : purchaseUpdateJsListeners;
|
|
201
|
+
listeners.add(listener);
|
|
202
|
+
if (!purchaseUpdateNativeAttached && !receiveDuplicateTransactionUpdatesIOS) {
|
|
187
203
|
try {
|
|
188
|
-
IAP.instance.addPurchaseUpdatedListener(purchaseUpdateNativeHandler);
|
|
204
|
+
const token = IAP.instance.addPurchaseUpdatedListener(purchaseUpdateNativeHandler);
|
|
205
|
+
purchaseUpdateNativeToken = typeof token === 'number' ? token : null;
|
|
189
206
|
purchaseUpdateNativeAttached = true;
|
|
190
207
|
} catch (e) {
|
|
191
208
|
const msg = toErrorMessage(e);
|
|
@@ -196,9 +213,50 @@ export const purchaseUpdatedListener = listener => {
|
|
|
196
213
|
}
|
|
197
214
|
}
|
|
198
215
|
}
|
|
216
|
+
if (!purchaseUpdateDuplicateNativeAttached && receiveDuplicateTransactionUpdatesIOS) {
|
|
217
|
+
try {
|
|
218
|
+
const nativeOptions = {
|
|
219
|
+
dedupeTransactionIOS: false
|
|
220
|
+
};
|
|
221
|
+
const token = IAP.instance.addPurchaseUpdatedListener(purchaseUpdateDuplicateNativeHandler, nativeOptions);
|
|
222
|
+
purchaseUpdateDuplicateNativeToken = typeof token === 'number' ? token : null;
|
|
223
|
+
purchaseUpdateDuplicateNativeAttached = true;
|
|
224
|
+
} catch (e) {
|
|
225
|
+
const msg = toErrorMessage(e);
|
|
226
|
+
if (msg.includes('Nitro runtime not installed')) {
|
|
227
|
+
RnIapConsole.warn('[purchaseUpdatedListener] Nitro not ready yet; listener inert until initConnection()');
|
|
228
|
+
} else {
|
|
229
|
+
throw e;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
let removed = false;
|
|
199
234
|
return {
|
|
200
235
|
remove: () => {
|
|
201
|
-
|
|
236
|
+
if (removed) {
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
removed = true;
|
|
240
|
+
listeners.delete(listener);
|
|
241
|
+
if (listeners.size > 0) {
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
const token = receiveDuplicateTransactionUpdatesIOS ? purchaseUpdateDuplicateNativeToken : purchaseUpdateNativeToken;
|
|
245
|
+
if (token == null) {
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
try {
|
|
249
|
+
IAP.instance.removePurchaseUpdatedListener(token);
|
|
250
|
+
if (receiveDuplicateTransactionUpdatesIOS) {
|
|
251
|
+
purchaseUpdateDuplicateNativeToken = null;
|
|
252
|
+
purchaseUpdateDuplicateNativeAttached = false;
|
|
253
|
+
} else {
|
|
254
|
+
purchaseUpdateNativeToken = null;
|
|
255
|
+
purchaseUpdateNativeAttached = false;
|
|
256
|
+
}
|
|
257
|
+
} catch (e) {
|
|
258
|
+
RnIapConsole.warn('[purchaseUpdatedListener] native remove failed:', e);
|
|
259
|
+
}
|
|
202
260
|
}
|
|
203
261
|
};
|
|
204
262
|
};
|