expo-iap 6.0.0 → 6.0.2
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/expo/modules/iap/ExpoIapHelper.kt +10 -5
- package/android/src/main/java/expo/modules/iap/ExpoIapModule.kt +23 -4
- package/build/ExpoIapModule.d.ts +1 -1
- package/build/ExpoIapModule.d.ts.map +1 -1
- package/build/ExpoIapModule.js.map +1 -1
- package/build/index.d.ts +2 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +42 -45
- package/build/index.js.map +1 -1
- package/build/index.kepler.d.ts +1 -0
- package/build/index.kepler.d.ts.map +1 -1
- package/build/index.kepler.js +1 -0
- package/build/index.kepler.js.map +1 -1
- package/build/modules/android.d.ts.map +1 -1
- package/build/modules/android.js +3 -2
- package/build/modules/android.js.map +1 -1
- package/build/modules/ios.d.ts +2 -1
- package/build/modules/ios.d.ts.map +1 -1
- package/build/modules/ios.js +36 -26
- package/build/modules/ios.js.map +1 -1
- package/build/types.d.ts +37 -8
- package/build/types.d.ts.map +1 -1
- package/build/types.js.map +1 -1
- package/build/useIAP.d.ts +5 -4
- package/build/useIAP.d.ts.map +1 -1
- package/build/useIAP.js +128 -170
- package/build/useIAP.js.map +1 -1
- package/build/utils/errorMapping.d.ts +12 -15
- package/build/utils/errorMapping.d.ts.map +1 -1
- package/build/utils/errorMapping.js +113 -298
- package/build/utils/errorMapping.js.map +1 -1
- package/build/utils/nativeError.d.ts +20 -0
- package/build/utils/nativeError.d.ts.map +1 -0
- package/build/utils/nativeError.js +138 -0
- package/build/utils/nativeError.js.map +1 -0
- package/build/utils/packageName.d.ts +3 -0
- package/build/utils/packageName.d.ts.map +1 -0
- package/build/utils/packageName.js +3 -0
- package/build/utils/packageName.js.map +1 -0
- package/ios/ExpoIapHelper.swift +26 -0
- package/ios/ExpoIapModule.swift +259 -264
- package/openiap-versions.json +3 -3
- package/package.json +1 -1
- package/src/ExpoIapModule.ts +1 -0
- package/src/index.kepler.ts +2 -0
- package/src/index.ts +89 -59
- package/src/modules/android.ts +9 -2
- package/src/modules/ios.ts +70 -29
- package/src/types.ts +43 -8
- package/src/useIAP.ts +158 -210
- package/src/utils/errorMapping.ts +136 -370
- package/src/utils/nativeError.ts +187 -0
- package/src/utils/packageName.ts +2 -0
|
@@ -45,6 +45,15 @@ object ExpoIapHelper {
|
|
|
45
45
|
|
|
46
46
|
internal fun serializeErrorEnvelope(payload: Map<String, Any?>): String = ERROR_ENVELOPE_PREFIX + JSONObject(payload).toString()
|
|
47
47
|
|
|
48
|
+
/** Rejects with the canonical error envelope that the JS bridge parses. */
|
|
49
|
+
internal fun rejectWithErrorEnvelope(
|
|
50
|
+
promise: Promise,
|
|
51
|
+
error: Exception,
|
|
52
|
+
) {
|
|
53
|
+
val openIapError = error as? OpenIapError ?: OpenIapError.ServiceUnavailable(error.message)
|
|
54
|
+
promise.reject(openIapError.code, serializeErrorEnvelope(serializeOpenIapError(openIapError)), null)
|
|
55
|
+
}
|
|
56
|
+
|
|
48
57
|
fun emitOrQueue(
|
|
49
58
|
module: Module,
|
|
50
59
|
scope: CoroutineScope,
|
|
@@ -282,7 +291,6 @@ object ExpoIapHelper {
|
|
|
282
291
|
eventName: String,
|
|
283
292
|
payload: Map<String, Any?>,
|
|
284
293
|
eventPurchaseError: String,
|
|
285
|
-
fallbackErrorCode: String,
|
|
286
294
|
fallbackErrorPrefix: String,
|
|
287
295
|
logTag: String,
|
|
288
296
|
) {
|
|
@@ -292,7 +300,7 @@ object ExpoIapHelper {
|
|
|
292
300
|
ExpoIapLog.failure("buffer/send $logTag", error)
|
|
293
301
|
val errorPayload =
|
|
294
302
|
mapOf(
|
|
295
|
-
"code" to
|
|
303
|
+
"code" to OpenIapError.UnknownError.CODE,
|
|
296
304
|
"message" to "$fallbackErrorPrefix: ${error.message}",
|
|
297
305
|
)
|
|
298
306
|
runCatching {
|
|
@@ -397,7 +405,6 @@ object ExpoIapHelper {
|
|
|
397
405
|
eventUserChoiceBilling,
|
|
398
406
|
details.toJson(),
|
|
399
407
|
eventPurchaseError,
|
|
400
|
-
"alternative-billing-not-available",
|
|
401
408
|
"Failed to process user choice billing",
|
|
402
409
|
"USER_CHOICE_BILLING",
|
|
403
410
|
)
|
|
@@ -415,7 +422,6 @@ object ExpoIapHelper {
|
|
|
415
422
|
eventDeveloperProvidedBilling,
|
|
416
423
|
details.toJson(),
|
|
417
424
|
eventPurchaseError,
|
|
418
|
-
"developer-billing-error",
|
|
419
425
|
"Failed to process developer provided billing",
|
|
420
426
|
"DEVELOPER_PROVIDED_BILLING",
|
|
421
427
|
)
|
|
@@ -433,7 +439,6 @@ object ExpoIapHelper {
|
|
|
433
439
|
eventSubscriptionBillingIssue,
|
|
434
440
|
purchase.toJson(),
|
|
435
441
|
eventPurchaseError,
|
|
436
|
-
"subscription-billing-issue-error",
|
|
437
442
|
"Failed to process subscription billing issue",
|
|
438
443
|
"SUBSCRIPTION_BILLING_ISSUE",
|
|
439
444
|
)
|
|
@@ -25,6 +25,7 @@ import dev.hyo.openiap.VerifyPurchaseHorizonOptions
|
|
|
25
25
|
import dev.hyo.openiap.VerifyPurchaseProps
|
|
26
26
|
import dev.hyo.openiap.VerifyPurchaseWithProviderProps
|
|
27
27
|
import dev.hyo.openiap.helpers.OpenIapFirstPurchaseNotice
|
|
28
|
+
import dev.hyo.openiap.helpers.finishPurchaseToken
|
|
28
29
|
import dev.hyo.openiap.store.OpenIapStore
|
|
29
30
|
import expo.modules.kotlin.Promise
|
|
30
31
|
import expo.modules.kotlin.exception.Exceptions
|
|
@@ -529,13 +530,13 @@ class ExpoIapModule : Module() {
|
|
|
529
530
|
ExpoIapLog.payload("acknowledgePurchaseAndroid", mapOf("token" to token))
|
|
530
531
|
scope.launch {
|
|
531
532
|
try {
|
|
532
|
-
openIap.
|
|
533
|
+
openIap.finishPurchaseToken(token, isConsumable = false)
|
|
533
534
|
val response = mapOf("responseCode" to 0)
|
|
534
535
|
ExpoIapLog.result("acknowledgePurchaseAndroid", response)
|
|
535
536
|
promise.resolve(response)
|
|
536
537
|
} catch (e: Exception) {
|
|
537
538
|
ExpoIapLog.failure("acknowledgePurchaseAndroid", e)
|
|
538
|
-
|
|
539
|
+
ExpoIapHelper.rejectWithErrorEnvelope(promise, e)
|
|
539
540
|
}
|
|
540
541
|
}
|
|
541
542
|
}
|
|
@@ -544,7 +545,7 @@ class ExpoIapModule : Module() {
|
|
|
544
545
|
ExpoIapLog.payload("consumePurchaseAndroid", mapOf("token" to token))
|
|
545
546
|
scope.launch {
|
|
546
547
|
try {
|
|
547
|
-
openIap.
|
|
548
|
+
openIap.finishPurchaseToken(token, isConsumable = true)
|
|
548
549
|
val response = mapOf("responseCode" to 0, "purchaseToken" to token)
|
|
549
550
|
ExpoIapLog.result(
|
|
550
551
|
"consumePurchaseAndroid",
|
|
@@ -553,7 +554,7 @@ class ExpoIapModule : Module() {
|
|
|
553
554
|
promise.resolve(response)
|
|
554
555
|
} catch (e: Exception) {
|
|
555
556
|
ExpoIapLog.failure("consumePurchaseAndroid", e)
|
|
556
|
-
|
|
557
|
+
ExpoIapHelper.rejectWithErrorEnvelope(promise, e)
|
|
557
558
|
}
|
|
558
559
|
}
|
|
559
560
|
}
|
|
@@ -563,6 +564,24 @@ class ExpoIapModule : Module() {
|
|
|
563
564
|
OpenIapFirstPurchaseNotice.claim(context)
|
|
564
565
|
}
|
|
565
566
|
|
|
567
|
+
AsyncFunction("verifyAppOwnership") { params: Map<String, Any?>, promise: Promise ->
|
|
568
|
+
scope.launch {
|
|
569
|
+
try {
|
|
570
|
+
val options = dev.hyo.openiap.VerifyAppOwnershipProps.fromJson(params)
|
|
571
|
+
promise.resolve(openIap.verifyAppOwnership(options).toJson())
|
|
572
|
+
} catch (e: CancellationException) {
|
|
573
|
+
throw e
|
|
574
|
+
} catch (e: Exception) {
|
|
575
|
+
val code = when (e) {
|
|
576
|
+
is OpenIapError -> e.code
|
|
577
|
+
is IllegalArgumentException -> OpenIapError.DeveloperError.CODE
|
|
578
|
+
else -> OpenIapError.ServiceUnavailable.CODE
|
|
579
|
+
}
|
|
580
|
+
promise.reject(code, e.message, e)
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
|
|
566
585
|
AsyncFunction("verifyPurchase") { params: Map<String, Any?>, promise: Promise ->
|
|
567
586
|
ExpoIapLog.payload(
|
|
568
587
|
"verifyPurchase",
|
package/build/ExpoIapModule.d.ts
CHANGED
|
@@ -18,7 +18,7 @@ type MutationFields<K extends keyof Mutation> = {
|
|
|
18
18
|
* Native surface behind the default export. Results the wrappers decode stay
|
|
19
19
|
* `unknown`; the rest match the generated operation signatures.
|
|
20
20
|
*/
|
|
21
|
-
export type ExpoIapNativeModule = NativeEventModule & QueryFields<'canPresentExternalPurchaseNoticeIOS' | 'currentEntitlementIOS' | 'getActiveSubscriptions' | 'getAppTransactionIOS' | 'getBillingChoiceInfoAndroid' | 'getExternalPurchaseCustomLinkTokenIOS' | 'getPromotedProductIOS' | 'getReceiptDataIOS' | 'getTransactionJwsIOS' | 'hasActiveSubscriptions' | 'isEligibleForExternalPurchaseCustomLinkIOS' | 'isEligibleForIntroOfferIOS' | 'isTransactionVerifiedIOS' | 'latestTransactionIOS'> & MutationFields<'beginRefundRequestIOS' | 'clearTransactionIOS' | 'endConnection' | 'initConnection' | 'isBillingProgramAvailableAndroid' | 'launchExternalLinkAndroid' | 'openRedeemOfferCode' | 'presentExternalPurchaseLinkIOS' | 'presentExternalPurchaseNoticeSheetIOS' | 'showBillingProgramInformationDialogAndroid' | 'showExternalPurchaseCustomLinkNoticeIOS' | 'showInAppMessagesAndroid' | 'syncIOS' | 'verifyPurchase' | 'verifyPurchaseWithProvider'> & {
|
|
21
|
+
export type ExpoIapNativeModule = NativeEventModule & QueryFields<'canPresentExternalPurchaseNoticeIOS' | 'currentEntitlementIOS' | 'getActiveSubscriptions' | 'getAppTransactionIOS' | 'verifyAppOwnership' | 'getBillingChoiceInfoAndroid' | 'getExternalPurchaseCustomLinkTokenIOS' | 'getPromotedProductIOS' | 'getReceiptDataIOS' | 'getTransactionJwsIOS' | 'hasActiveSubscriptions' | 'isEligibleForExternalPurchaseCustomLinkIOS' | 'isEligibleForIntroOfferIOS' | 'isTransactionVerifiedIOS' | 'latestTransactionIOS'> & MutationFields<'beginRefundRequestIOS' | 'clearTransactionIOS' | 'endConnection' | 'initConnection' | 'isBillingProgramAvailableAndroid' | 'launchExternalLinkAndroid' | 'openRedeemOfferCode' | 'presentExternalPurchaseLinkIOS' | 'presentExternalPurchaseNoticeSheetIOS' | 'showBillingProgramInformationDialogAndroid' | 'showExternalPurchaseCustomLinkNoticeIOS' | 'showInAppMessagesAndroid' | 'syncIOS' | 'verifyPurchase' | 'verifyPurchaseWithProvider'> & {
|
|
22
22
|
USING_ONSIDE_SDK: boolean;
|
|
23
23
|
USING_VEGA_SDK: boolean;
|
|
24
24
|
fetchProducts(request: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoIapModule.d.ts","sourceRoot":"","sources":["../src/ExpoIapModule.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ExpoIapModule.d.ts","sourceRoot":"","sources":["../src/ExpoIapModule.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoIapModule.js","sourceRoot":"","sources":["../src/ExpoIapModule.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n requireNativeModule,\n UnavailabilityError,\n type EventSubscription,\n} from 'expo-modules-core';\nimport {installedFromOnside} from './onside';\nimport type {\n BillingProgramAndroid,\n BillingProgramReportingDetailsAndroid,\n DeveloperBillingTypeAndroid,\n Mutation,\n MutationField,\n ProductQueryType,\n PurchaseInput,\n PurchaseOptions,\n PurchaseUpdatedListenerOptions,\n Query,\n QueryField,\n SubscriptionStatusIOS,\n} from './types';\nimport {getVegaIapModule, isVegaOS} from './vega';\n\ntype NativeIapModuleName = 'ExpoIapVega' | 'ExpoIapOnside' | 'ExpoIap';\nconst ONSIDE_MARKETPLACE_ID = 'com.onside.marketplace-app';\n\n/** Members read from the raw module; every store module provides them. */\ntype NativeEventModule = {\n ERROR_CODES?: Record<string, unknown>;\n HAS_EXPLICIT_STORE_PROVIDER?: boolean;\n addListener<T>(\n eventName: string,\n listener: (payload: T) => void,\n ): EventSubscription | undefined;\n removeListener?<T>(eventName: string, listener: (payload: T) => void): void;\n setPurchaseUpdatedListenerOptions?(\n options?: PurchaseUpdatedListenerOptions | null,\n ): Promise<void>;\n};\n\ntype QueryFields<K extends keyof Query> = {[P in K]: QueryField<P>};\ntype MutationFields<K extends keyof Mutation> = {[P in K]: MutationField<P>};\n\n/**\n * Native surface behind the default export. Results the wrappers decode stay\n * `unknown`; the rest match the generated operation signatures.\n */\nexport type ExpoIapNativeModule = NativeEventModule &\n QueryFields<\n | 'canPresentExternalPurchaseNoticeIOS'\n | 'currentEntitlementIOS'\n | 'getActiveSubscriptions'\n | 'getAppTransactionIOS'\n | 'getBillingChoiceInfoAndroid'\n | 'getExternalPurchaseCustomLinkTokenIOS'\n | 'getPromotedProductIOS'\n | 'getReceiptDataIOS'\n | 'getTransactionJwsIOS'\n | 'hasActiveSubscriptions'\n | 'isEligibleForExternalPurchaseCustomLinkIOS'\n | 'isEligibleForIntroOfferIOS'\n | 'isTransactionVerifiedIOS'\n | 'latestTransactionIOS'\n > &\n MutationFields<\n | 'beginRefundRequestIOS'\n | 'clearTransactionIOS'\n | 'endConnection'\n | 'initConnection'\n | 'isBillingProgramAvailableAndroid'\n | 'launchExternalLinkAndroid'\n | 'openRedeemOfferCode'\n | 'presentExternalPurchaseLinkIOS'\n | 'presentExternalPurchaseNoticeSheetIOS'\n | 'showBillingProgramInformationDialogAndroid'\n | 'showExternalPurchaseCustomLinkNoticeIOS'\n | 'showInAppMessagesAndroid'\n | 'syncIOS'\n | 'verifyPurchase'\n | 'verifyPurchaseWithProvider'\n > & {\n USING_ONSIDE_SDK: boolean;\n USING_VEGA_SDK: boolean;\n fetchProducts(request: {\n skus: string[];\n type: ProductQueryType;\n }): Promise<unknown[]>;\n fetchProducts(type: ProductQueryType, skus: string[]): Promise<unknown[]>;\n getAvailableItems(\n alsoPublishToEventListenerIOS: boolean,\n onlyIncludeActiveItemsIOS: boolean,\n ): Promise<unknown>;\n getAvailableItems(options: PurchaseOptions): Promise<unknown>;\n getAllTransactionsIOS(): Promise<unknown>;\n getPendingTransactionsIOS(): Promise<unknown>;\n showManageSubscriptionsIOS(): Promise<unknown>;\n deepLinkToSubscriptionsIOS(): Promise<boolean>;\n requestPurchase(request: object): Promise<unknown>;\n finishTransaction(\n purchase: PurchaseInput,\n isConsumable: boolean | null,\n ): Promise<boolean>;\n /** Internal: the once-per-install flag behind the first-purchase notice. */\n claimFirstPurchaseNotice(): Promise<boolean>;\n acknowledgePurchaseAndroid(purchaseToken: string): Promise<unknown>;\n consumePurchaseAndroid(purchaseToken: string): Promise<unknown>;\n createBillingProgramReportingDetailsAndroid(\n program: BillingProgramAndroid,\n developerBillingType: DeveloperBillingTypeAndroid | null,\n ): Promise<BillingProgramReportingDetailsAndroid>;\n subscriptionStatusIOS(sku: string): Promise<SubscriptionStatusIOS[] | null>;\n requestReceiptRefreshIOS(): Promise<string>;\n deepLinkToSubscriptionsAndroid?(options: {\n skuAndroid?: string;\n packageNameAndroid?: string;\n }): Promise<void> | void;\n getStorefront?(): Promise<string> | string;\n restorePurchases?(): Promise<boolean>;\n };\n\ntype ResolvedNativeModule = {\n module: NativeEventModule;\n name: NativeIapModuleName;\n};\n\nlet cached: ResolvedNativeModule | null = null;\nlet onsideModuleUnavailable = false;\nlet explicitStoreProvider: boolean | undefined;\n\nfunction getResolved(): ResolvedNativeModule {\n function shouldUseOnsideModule(): boolean {\n if (\n installedFromOnside === true ||\n typeof installedFromOnside === 'string'\n ) {\n if (explicitStoreProvider === undefined) {\n try {\n const module =\n cached?.name === 'ExpoIap'\n ? cached.module\n : requireNativeModule<NativeEventModule>('ExpoIap');\n explicitStoreProvider = module.HAS_EXPLICIT_STORE_PROVIDER === true;\n } catch (error) {\n if (!isMissingModuleError(error, 'ExpoIap')) throw error;\n explicitStoreProvider = false;\n }\n }\n if (explicitStoreProvider) return false;\n }\n if (installedFromOnside === true) {\n return true;\n }\n\n if (typeof installedFromOnside !== 'string') {\n return false;\n }\n\n const normalized = installedFromOnside.trim().toLowerCase();\n return normalized === 'true' || normalized === ONSIDE_MARKETPLACE_ID;\n }\n\n function getExpectedModuleName(): NativeIapModuleName {\n if (isVegaOS()) {\n return 'ExpoIapVega';\n }\n\n return shouldUseOnsideModule() ? 'ExpoIapOnside' : 'ExpoIap';\n }\n\n function resolveNativeModule(): ResolvedNativeModule {\n if (isVegaOS()) {\n const vegaModule = getVegaIapModule();\n if (!vegaModule) {\n throw new UnavailabilityError(\n 'expo-iap',\n 'Amazon Vega IAP module is unavailable. Install @amazon-devices/keplerscript-appstore-iap-lib in the Vega app target and build with the React Native for Vega kepler platform.',\n );\n }\n return {module: vegaModule, name: 'ExpoIapVega'};\n }\n\n if (shouldUseOnsideModule()) {\n if (onsideModuleUnavailable) {\n throw new UnavailabilityError(\n 'expo-iap',\n 'The Onside marketplace build does not contain ExpoIapOnside. Rebuild with ios.onside.enabled instead of routing purchases through Apple StoreKit.',\n );\n }\n try {\n return {\n module: requireNativeModule<NativeEventModule>('ExpoIapOnside'),\n name: 'ExpoIapOnside',\n };\n } catch (error) {\n if (!isMissingModuleError(error, 'ExpoIapOnside')) {\n throw error;\n }\n onsideModuleUnavailable = true;\n throw new UnavailabilityError(\n 'expo-iap',\n 'The Onside marketplace build does not contain ExpoIapOnside. Rebuild with ios.onside.enabled instead of routing purchases through Apple StoreKit.',\n );\n }\n }\n\n return {\n module: requireNativeModule<NativeEventModule>('ExpoIap'),\n name: 'ExpoIap',\n };\n }\n\n const expectedName = getExpectedModuleName();\n if (!cached || cached.name !== expectedName) {\n cached = resolveNativeModule();\n }\n return cached;\n}\n\nfunction isMissingModuleError(error: unknown, moduleName: string): boolean {\n if (error instanceof UnavailabilityError) {\n return true;\n }\n\n if (error instanceof Error) {\n return error.message.includes(`Cannot find native module '${moduleName}'`);\n }\n\n return false;\n}\n\nexport const NATIVE_ERROR_CODES: Record<string, unknown> = new Proxy(\n {} as Record<string, unknown>,\n {\n get(target, prop) {\n if (typeof prop === 'symbol') return Reflect.get(target, prop);\n const errorCodes: Record<string, unknown> =\n getResolved().module.ERROR_CODES || {};\n return errorCodes[prop];\n },\n },\n);\n\n/**\n * Returns the raw native module, not the Proxy. Use it for addListener: a JSI\n * HostObject needs the real module as `this`, and a Proxy throws \"native state\n * unsupported on Proxy\" on New Architecture / Hermes.\n */\nexport function getNativeModule(): NativeEventModule {\n return getResolved().module;\n}\n\n// The Proxy forwards every member to the lazily resolved store module.\nexport default new Proxy({} as ExpoIapNativeModule, {\n get(target, prop) {\n if (typeof prop === 'symbol') return Reflect.get(target, prop);\n const resolved = getResolved();\n if (prop === 'USING_ONSIDE_SDK') {\n return resolved.name === 'ExpoIapOnside';\n }\n if (prop === 'USING_VEGA_SDK') {\n return resolved.name === 'ExpoIapVega';\n }\n\n const value: unknown = Reflect.get(resolved.module, prop);\n if (value !== undefined || resolved.name !== 'ExpoIapOnside') {\n return value;\n }\n\n return () => {\n throw new UnavailabilityError(\n 'expo-iap',\n `The Onside marketplace does not support ${String(\n prop,\n )}. The call was not routed through Apple StoreKit.`,\n );\n };\n },\n});\n"]}
|
|
1
|
+
{"version":3,"file":"ExpoIapModule.js","sourceRoot":"","sources":["../src/ExpoIapModule.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n requireNativeModule,\n UnavailabilityError,\n type EventSubscription,\n} from 'expo-modules-core';\nimport {installedFromOnside} from './onside';\nimport type {\n BillingProgramAndroid,\n BillingProgramReportingDetailsAndroid,\n DeveloperBillingTypeAndroid,\n Mutation,\n MutationField,\n ProductQueryType,\n PurchaseInput,\n PurchaseOptions,\n PurchaseUpdatedListenerOptions,\n Query,\n QueryField,\n SubscriptionStatusIOS,\n} from './types';\nimport {getVegaIapModule, isVegaOS} from './vega';\n\ntype NativeIapModuleName = 'ExpoIapVega' | 'ExpoIapOnside' | 'ExpoIap';\nconst ONSIDE_MARKETPLACE_ID = 'com.onside.marketplace-app';\n\n/** Members read from the raw module; every store module provides them. */\ntype NativeEventModule = {\n ERROR_CODES?: Record<string, unknown>;\n HAS_EXPLICIT_STORE_PROVIDER?: boolean;\n addListener<T>(\n eventName: string,\n listener: (payload: T) => void,\n ): EventSubscription | undefined;\n removeListener?<T>(eventName: string, listener: (payload: T) => void): void;\n setPurchaseUpdatedListenerOptions?(\n options?: PurchaseUpdatedListenerOptions | null,\n ): Promise<void>;\n};\n\ntype QueryFields<K extends keyof Query> = {[P in K]: QueryField<P>};\ntype MutationFields<K extends keyof Mutation> = {[P in K]: MutationField<P>};\n\n/**\n * Native surface behind the default export. Results the wrappers decode stay\n * `unknown`; the rest match the generated operation signatures.\n */\nexport type ExpoIapNativeModule = NativeEventModule &\n QueryFields<\n | 'canPresentExternalPurchaseNoticeIOS'\n | 'currentEntitlementIOS'\n | 'getActiveSubscriptions'\n | 'getAppTransactionIOS'\n | 'verifyAppOwnership'\n | 'getBillingChoiceInfoAndroid'\n | 'getExternalPurchaseCustomLinkTokenIOS'\n | 'getPromotedProductIOS'\n | 'getReceiptDataIOS'\n | 'getTransactionJwsIOS'\n | 'hasActiveSubscriptions'\n | 'isEligibleForExternalPurchaseCustomLinkIOS'\n | 'isEligibleForIntroOfferIOS'\n | 'isTransactionVerifiedIOS'\n | 'latestTransactionIOS'\n > &\n MutationFields<\n | 'beginRefundRequestIOS'\n | 'clearTransactionIOS'\n | 'endConnection'\n | 'initConnection'\n | 'isBillingProgramAvailableAndroid'\n | 'launchExternalLinkAndroid'\n | 'openRedeemOfferCode'\n | 'presentExternalPurchaseLinkIOS'\n | 'presentExternalPurchaseNoticeSheetIOS'\n | 'showBillingProgramInformationDialogAndroid'\n | 'showExternalPurchaseCustomLinkNoticeIOS'\n | 'showInAppMessagesAndroid'\n | 'syncIOS'\n | 'verifyPurchase'\n | 'verifyPurchaseWithProvider'\n > & {\n USING_ONSIDE_SDK: boolean;\n USING_VEGA_SDK: boolean;\n fetchProducts(request: {\n skus: string[];\n type: ProductQueryType;\n }): Promise<unknown[]>;\n fetchProducts(type: ProductQueryType, skus: string[]): Promise<unknown[]>;\n getAvailableItems(\n alsoPublishToEventListenerIOS: boolean,\n onlyIncludeActiveItemsIOS: boolean,\n ): Promise<unknown>;\n getAvailableItems(options: PurchaseOptions): Promise<unknown>;\n getAllTransactionsIOS(): Promise<unknown>;\n getPendingTransactionsIOS(): Promise<unknown>;\n showManageSubscriptionsIOS(): Promise<unknown>;\n deepLinkToSubscriptionsIOS(): Promise<boolean>;\n requestPurchase(request: object): Promise<unknown>;\n finishTransaction(\n purchase: PurchaseInput,\n isConsumable: boolean | null,\n ): Promise<boolean>;\n /** Internal: the once-per-install flag behind the first-purchase notice. */\n claimFirstPurchaseNotice(): Promise<boolean>;\n acknowledgePurchaseAndroid(purchaseToken: string): Promise<unknown>;\n consumePurchaseAndroid(purchaseToken: string): Promise<unknown>;\n createBillingProgramReportingDetailsAndroid(\n program: BillingProgramAndroid,\n developerBillingType: DeveloperBillingTypeAndroid | null,\n ): Promise<BillingProgramReportingDetailsAndroid>;\n subscriptionStatusIOS(sku: string): Promise<SubscriptionStatusIOS[] | null>;\n requestReceiptRefreshIOS(): Promise<string>;\n deepLinkToSubscriptionsAndroid?(options: {\n skuAndroid?: string;\n packageNameAndroid?: string;\n }): Promise<void> | void;\n getStorefront?(): Promise<string> | string;\n restorePurchases?(): Promise<boolean>;\n };\n\ntype ResolvedNativeModule = {\n module: NativeEventModule;\n name: NativeIapModuleName;\n};\n\nlet cached: ResolvedNativeModule | null = null;\nlet onsideModuleUnavailable = false;\nlet explicitStoreProvider: boolean | undefined;\n\nfunction getResolved(): ResolvedNativeModule {\n function shouldUseOnsideModule(): boolean {\n if (\n installedFromOnside === true ||\n typeof installedFromOnside === 'string'\n ) {\n if (explicitStoreProvider === undefined) {\n try {\n const module =\n cached?.name === 'ExpoIap'\n ? cached.module\n : requireNativeModule<NativeEventModule>('ExpoIap');\n explicitStoreProvider = module.HAS_EXPLICIT_STORE_PROVIDER === true;\n } catch (error) {\n if (!isMissingModuleError(error, 'ExpoIap')) throw error;\n explicitStoreProvider = false;\n }\n }\n if (explicitStoreProvider) return false;\n }\n if (installedFromOnside === true) {\n return true;\n }\n\n if (typeof installedFromOnside !== 'string') {\n return false;\n }\n\n const normalized = installedFromOnside.trim().toLowerCase();\n return normalized === 'true' || normalized === ONSIDE_MARKETPLACE_ID;\n }\n\n function getExpectedModuleName(): NativeIapModuleName {\n if (isVegaOS()) {\n return 'ExpoIapVega';\n }\n\n return shouldUseOnsideModule() ? 'ExpoIapOnside' : 'ExpoIap';\n }\n\n function resolveNativeModule(): ResolvedNativeModule {\n if (isVegaOS()) {\n const vegaModule = getVegaIapModule();\n if (!vegaModule) {\n throw new UnavailabilityError(\n 'expo-iap',\n 'Amazon Vega IAP module is unavailable. Install @amazon-devices/keplerscript-appstore-iap-lib in the Vega app target and build with the React Native for Vega kepler platform.',\n );\n }\n return {module: vegaModule, name: 'ExpoIapVega'};\n }\n\n if (shouldUseOnsideModule()) {\n if (onsideModuleUnavailable) {\n throw new UnavailabilityError(\n 'expo-iap',\n 'The Onside marketplace build does not contain ExpoIapOnside. Rebuild with ios.onside.enabled instead of routing purchases through Apple StoreKit.',\n );\n }\n try {\n return {\n module: requireNativeModule<NativeEventModule>('ExpoIapOnside'),\n name: 'ExpoIapOnside',\n };\n } catch (error) {\n if (!isMissingModuleError(error, 'ExpoIapOnside')) {\n throw error;\n }\n onsideModuleUnavailable = true;\n throw new UnavailabilityError(\n 'expo-iap',\n 'The Onside marketplace build does not contain ExpoIapOnside. Rebuild with ios.onside.enabled instead of routing purchases through Apple StoreKit.',\n );\n }\n }\n\n return {\n module: requireNativeModule<NativeEventModule>('ExpoIap'),\n name: 'ExpoIap',\n };\n }\n\n const expectedName = getExpectedModuleName();\n if (!cached || cached.name !== expectedName) {\n cached = resolveNativeModule();\n }\n return cached;\n}\n\nfunction isMissingModuleError(error: unknown, moduleName: string): boolean {\n if (error instanceof UnavailabilityError) {\n return true;\n }\n\n if (error instanceof Error) {\n return error.message.includes(`Cannot find native module '${moduleName}'`);\n }\n\n return false;\n}\n\nexport const NATIVE_ERROR_CODES: Record<string, unknown> = new Proxy(\n {} as Record<string, unknown>,\n {\n get(target, prop) {\n if (typeof prop === 'symbol') return Reflect.get(target, prop);\n const errorCodes: Record<string, unknown> =\n getResolved().module.ERROR_CODES || {};\n return errorCodes[prop];\n },\n },\n);\n\n/**\n * Returns the raw native module, not the Proxy. Use it for addListener: a JSI\n * HostObject needs the real module as `this`, and a Proxy throws \"native state\n * unsupported on Proxy\" on New Architecture / Hermes.\n */\nexport function getNativeModule(): NativeEventModule {\n return getResolved().module;\n}\n\n// The Proxy forwards every member to the lazily resolved store module.\nexport default new Proxy({} as ExpoIapNativeModule, {\n get(target, prop) {\n if (typeof prop === 'symbol') return Reflect.get(target, prop);\n const resolved = getResolved();\n if (prop === 'USING_ONSIDE_SDK') {\n return resolved.name === 'ExpoIapOnside';\n }\n if (prop === 'USING_VEGA_SDK') {\n return resolved.name === 'ExpoIapVega';\n }\n\n const value: unknown = Reflect.get(resolved.module, prop);\n if (value !== undefined || resolved.name !== 'ExpoIapOnside') {\n return value;\n }\n\n return () => {\n throw new UnavailabilityError(\n 'expo-iap',\n `The Onside marketplace does not support ${String(\n prop,\n )}. The call was not routed through Apple StoreKit.`,\n );\n };\n },\n});\n"]}
|
package/build/index.d.ts
CHANGED
|
@@ -273,6 +273,8 @@ export declare const hasActiveSubscriptions: QueryField<'hasActiveSubscriptions'
|
|
|
273
273
|
* @see {@link https://openiap.dev/docs/apis/get-storefront}
|
|
274
274
|
*/
|
|
275
275
|
export declare const getStorefront: QueryField<'getStorefront'>;
|
|
276
|
+
/** Verify app acquisition; send Android integrity tokens to your backend. */
|
|
277
|
+
export declare const verifyAppOwnership: QueryField<'verifyAppOwnership'>;
|
|
276
278
|
/**
|
|
277
279
|
* Initiate a purchase or subscription flow. The result arrives through
|
|
278
280
|
* `purchaseUpdatedListener` / `purchaseErrorListener` (or `useIAP`'s
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAGV,sCAAsC,EAEtC,aAAa,EAEb,OAAO,EACP,gBAAgB,EAEhB,QAAQ,EAER,8BAA8B,EAC9B,UAAU,EAOV,wBAAwB,EACzB,MAAM,SAAS,CAAC;AAEjB,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/build/index.js
CHANGED
|
@@ -10,7 +10,8 @@ import { showFirstPurchaseNotice } from './utils/firstPurchaseNotice';
|
|
|
10
10
|
import { restorePurchasesNative } from './utils/restorePurchases';
|
|
11
11
|
import { decodeAndroidPurchases, decodeApplePurchases, } from './utils/availablePurchases';
|
|
12
12
|
import { ErrorCode, resolveStoreId } from './types';
|
|
13
|
-
import { createPurchaseError,
|
|
13
|
+
import { createPurchaseError, normalizeErrorCodeFromNative, } from './utils/errorMapping';
|
|
14
|
+
import { createPurchaseErrorFromNativeException, invokeNativeWithPurchaseError, } from './utils/nativeError';
|
|
14
15
|
export * from './types';
|
|
15
16
|
export * from './modules/android';
|
|
16
17
|
export * from './modules/ios';
|
|
@@ -33,6 +34,8 @@ export var OpenIapEvent;
|
|
|
33
34
|
const isStorePlatform = () => Platform.OS === 'ios' || Platform.OS === 'android';
|
|
34
35
|
const isStoreRuntime = () => Platform.OS === 'ios' || isAndroidStoreRuntime();
|
|
35
36
|
const unsupportedPlatformError = () => new Error(`Unsupported platform: ${Platform.OS}`);
|
|
37
|
+
// Platform tag for PurchaseErrors built from native rejections.
|
|
38
|
+
const nativePlatform = () => Platform.OS === 'ios' ? 'ios' : 'android';
|
|
36
39
|
// Listener calls go to the raw native module (see getNativeModule), resolved
|
|
37
40
|
// lazily so importing this module doesn't throw on unsupported platforms.
|
|
38
41
|
export const emitter = {
|
|
@@ -185,8 +188,9 @@ export const purchaseUpdatedListener = (listener, options) => {
|
|
|
185
188
|
};
|
|
186
189
|
};
|
|
187
190
|
export const purchaseErrorListener = (listener) => {
|
|
191
|
+
// Native events may carry codes outside ErrorCode; deliver canonical codes.
|
|
188
192
|
const wrappedListener = (error) => {
|
|
189
|
-
listener(error);
|
|
193
|
+
listener({ ...error, code: normalizeErrorCodeFromNative(error.code) });
|
|
190
194
|
};
|
|
191
195
|
const emitterSubscription = emitter.addListener(OpenIapEvent.PurchaseError, wrappedListener);
|
|
192
196
|
return emitterSubscription;
|
|
@@ -371,7 +375,7 @@ export const subscriptionBillingIssueListener = (listener) => {
|
|
|
371
375
|
* @see {@link https://openiap.dev/docs/apis/init-connection}
|
|
372
376
|
*/
|
|
373
377
|
export const initConnection = async (config) => {
|
|
374
|
-
const result = await ExpoIapModule.initConnection(config ?? null);
|
|
378
|
+
const result = await invokeNativeWithPurchaseError(() => ExpoIapModule.initConnection(config ?? null), nativePlatform());
|
|
375
379
|
if (result === true &&
|
|
376
380
|
Platform.OS === 'ios' &&
|
|
377
381
|
nonDedupingPurchaseUpdatedListenerCountIOS > 0) {
|
|
@@ -385,38 +389,12 @@ export const initConnection = async (config) => {
|
|
|
385
389
|
* @see {@link https://openiap.dev/docs/apis/end-connection}
|
|
386
390
|
*/
|
|
387
391
|
export const endConnection = async () => {
|
|
388
|
-
const result = await ExpoIapModule.endConnection();
|
|
392
|
+
const result = await invokeNativeWithPurchaseError(() => ExpoIapModule.endConnection(), nativePlatform());
|
|
389
393
|
if (result === true && Platform.OS === 'ios') {
|
|
390
394
|
resetPurchaseUpdatedDedupeHistoryIOS();
|
|
391
395
|
}
|
|
392
396
|
return result;
|
|
393
397
|
};
|
|
394
|
-
const invokeNativeWithPurchaseError = async (operation, platform, fallback) => {
|
|
395
|
-
try {
|
|
396
|
-
return await operation();
|
|
397
|
-
}
|
|
398
|
-
catch (error) {
|
|
399
|
-
const nativeError = typeof error === 'object' && error !== null
|
|
400
|
-
? error
|
|
401
|
-
: undefined;
|
|
402
|
-
const nativeMessage = typeof nativeError?.message === 'string'
|
|
403
|
-
? nativeError.message
|
|
404
|
-
: typeof error === 'string'
|
|
405
|
-
? error
|
|
406
|
-
: '';
|
|
407
|
-
const hasCanonicalFields = nativeMessage.includes(OPENIAP_ERROR_ENVELOPE_PREFIX) ||
|
|
408
|
-
nativeError?.code !== undefined ||
|
|
409
|
-
nativeError?.responseCode !== undefined ||
|
|
410
|
-
nativeError?.debugMessage !== undefined ||
|
|
411
|
-
nativeError?.productId !== undefined ||
|
|
412
|
-
nativeError?.productIds !== undefined;
|
|
413
|
-
// Preserve the identity of unrelated JavaScript errors (including adapter
|
|
414
|
-
// or test errors) while normalizing native OpenIAP rejections.
|
|
415
|
-
if (!hasCanonicalFields)
|
|
416
|
-
throw error;
|
|
417
|
-
throw createPurchaseErrorFromNativeException(error, platform, fallback);
|
|
418
|
-
}
|
|
419
|
-
};
|
|
420
398
|
/**
|
|
421
399
|
* Retrieve products or subscriptions from the store by SKU.
|
|
422
400
|
*
|
|
@@ -525,10 +503,10 @@ export const getAvailablePurchases = async (options) => {
|
|
|
525
503
|
}
|
|
526
504
|
let purchases;
|
|
527
505
|
if (Platform.OS === 'ios') {
|
|
528
|
-
purchases = (await ExpoIapModule.getAvailableItems(normalizedOptions.alsoPublishToEventListenerIOS, normalizedOptions.onlyIncludeActiveItemsIOS));
|
|
506
|
+
purchases = (await invokeNativeWithPurchaseError(() => ExpoIapModule.getAvailableItems(normalizedOptions.alsoPublishToEventListenerIOS, normalizedOptions.onlyIncludeActiveItemsIOS), 'ios'));
|
|
529
507
|
}
|
|
530
508
|
else if (Platform.OS === 'android') {
|
|
531
|
-
purchases = (await ExpoIapModule.getAvailableItems(normalizedOptions));
|
|
509
|
+
purchases = (await invokeNativeWithPurchaseError(() => ExpoIapModule.getAvailableItems(normalizedOptions), 'android'));
|
|
532
510
|
}
|
|
533
511
|
else {
|
|
534
512
|
throw unsupportedPlatformError();
|
|
@@ -567,7 +545,7 @@ export const getActiveSubscriptions = async (subscriptionIds) => {
|
|
|
567
545
|
if (!isStoreRuntime()) {
|
|
568
546
|
throw unsupportedPlatformError();
|
|
569
547
|
}
|
|
570
|
-
const result = await ExpoIapModule.getActiveSubscriptions(subscriptionIds ?? null);
|
|
548
|
+
const result = await invokeNativeWithPurchaseError(() => ExpoIapModule.getActiveSubscriptions(subscriptionIds ?? null), nativePlatform());
|
|
571
549
|
return (result ?? []);
|
|
572
550
|
};
|
|
573
551
|
/**
|
|
@@ -591,7 +569,7 @@ export const hasActiveSubscriptions = async (subscriptionIds) => {
|
|
|
591
569
|
if (!isStoreRuntime()) {
|
|
592
570
|
throw unsupportedPlatformError();
|
|
593
571
|
}
|
|
594
|
-
return !!(await ExpoIapModule.hasActiveSubscriptions(subscriptionIds ?? null));
|
|
572
|
+
return !!(await invokeNativeWithPurchaseError(() => ExpoIapModule.hasActiveSubscriptions(subscriptionIds ?? null), nativePlatform()));
|
|
595
573
|
};
|
|
596
574
|
/**
|
|
597
575
|
* Return the user's storefront country code.
|
|
@@ -605,7 +583,7 @@ export const getStorefront = async () => {
|
|
|
605
583
|
message: `Storefront lookup is not supported on ${Platform.OS}.`,
|
|
606
584
|
});
|
|
607
585
|
}
|
|
608
|
-
const platform =
|
|
586
|
+
const platform = nativePlatform();
|
|
609
587
|
if (typeof ExpoIapModule.getStorefront !== 'function') {
|
|
610
588
|
throw createPurchaseError({
|
|
611
589
|
code: ErrorCode.FeatureNotSupported,
|
|
@@ -658,6 +636,25 @@ function validateAndroidPurchaseBranchOptions(request, type) {
|
|
|
658
636
|
});
|
|
659
637
|
}
|
|
660
638
|
}
|
|
639
|
+
/** Verify app acquisition; send Android integrity tokens to your backend. */
|
|
640
|
+
export const verifyAppOwnership = async (options) => {
|
|
641
|
+
if (isVegaOS() ||
|
|
642
|
+
ExpoIapModule.USING_ONSIDE_SDK ||
|
|
643
|
+
(Platform.OS !== 'ios' && Platform.OS !== 'android')) {
|
|
644
|
+
return {
|
|
645
|
+
status: 'unknown',
|
|
646
|
+
reason: 'unsupported',
|
|
647
|
+
storeId: isVegaOS()
|
|
648
|
+
? 'amazon'
|
|
649
|
+
: ExpoIapModule.USING_ONSIDE_SDK
|
|
650
|
+
? 'onside'
|
|
651
|
+
: 'unknown',
|
|
652
|
+
};
|
|
653
|
+
}
|
|
654
|
+
return invokeNativeWithPurchaseError(() => ExpoIapModule.verifyAppOwnership(options ?? {}), nativePlatform(), {
|
|
655
|
+
code: ErrorCode.ServiceError,
|
|
656
|
+
});
|
|
657
|
+
};
|
|
661
658
|
/**
|
|
662
659
|
* Initiate a purchase or subscription flow. The result arrives through
|
|
663
660
|
* `purchaseUpdatedListener` / `purchaseErrorListener` (or `useIAP`'s
|
|
@@ -839,9 +836,10 @@ export const requestPurchase = async (args) => {
|
|
|
839
836
|
export const finishTransaction = async ({ purchase, isConsumable, }) => {
|
|
840
837
|
// The schema allows explicit null; the native boolean cannot take it.
|
|
841
838
|
const consumable = isConsumable ?? false;
|
|
839
|
+
const platform = nativePlatform();
|
|
842
840
|
if (Platform.OS === 'ios' ||
|
|
843
841
|
(isAndroidStoreRuntime() && purchase.store === 'unknown')) {
|
|
844
|
-
await ExpoIapModule.finishTransaction(purchase, consumable);
|
|
842
|
+
await invokeNativeWithPurchaseError(() => ExpoIapModule.finishTransaction(purchase, consumable), platform, { productId: purchase.productId });
|
|
845
843
|
}
|
|
846
844
|
else if (isAndroidStoreRuntime()) {
|
|
847
845
|
const token = purchase.purchaseToken ?? undefined;
|
|
@@ -853,12 +851,10 @@ export const finishTransaction = async ({ purchase, isConsumable, }) => {
|
|
|
853
851
|
platform: 'android',
|
|
854
852
|
});
|
|
855
853
|
}
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
await ExpoIapModule.acknowledgePurchaseAndroid(token);
|
|
861
|
-
}
|
|
854
|
+
// Native rejects when the store refuses the token, so a failure cannot pass as finished.
|
|
855
|
+
await invokeNativeWithPurchaseError(() => consumable
|
|
856
|
+
? ExpoIapModule.consumePurchaseAndroid(token)
|
|
857
|
+
: ExpoIapModule.acknowledgePurchaseAndroid(token), 'android', { productId: purchase.productId });
|
|
862
858
|
}
|
|
863
859
|
else {
|
|
864
860
|
throw unsupportedPlatformError();
|
|
@@ -930,7 +926,7 @@ export const openRedeemOfferCode = async () => {
|
|
|
930
926
|
if (Platform.OS !== 'ios' && !isAndroidStoreRuntime()) {
|
|
931
927
|
throw unsupportedPlatformError();
|
|
932
928
|
}
|
|
933
|
-
return invokeNativeWithPurchaseError(() => ExpoIapModule.openRedeemOfferCode(),
|
|
929
|
+
return invokeNativeWithPurchaseError(() => ExpoIapModule.openRedeemOfferCode(), nativePlatform(), { code: ErrorCode.PurchaseError, message: 'Failed to redeem offer code.' });
|
|
934
930
|
};
|
|
935
931
|
/**
|
|
936
932
|
* Verify purchase with the configured providers.
|
|
@@ -944,7 +940,8 @@ export const verifyPurchase = async (options) => {
|
|
|
944
940
|
if (!isStorePlatform()) {
|
|
945
941
|
throw unsupportedPlatformError();
|
|
946
942
|
}
|
|
947
|
-
|
|
943
|
+
// The native result is already the flat union member, with `__typename`.
|
|
944
|
+
return invokeNativeWithPurchaseError(() => ExpoIapModule.verifyPurchase(options), nativePlatform());
|
|
948
945
|
};
|
|
949
946
|
/**
|
|
950
947
|
* Verify purchase with a specific provider (e.g., IAPKit).
|
|
@@ -1002,7 +999,7 @@ export const verifyPurchaseWithProvider = async (options) => {
|
|
|
1002
999
|
'Or provide apiKey directly in verifyPurchaseWithProvider options.');
|
|
1003
1000
|
}
|
|
1004
1001
|
}
|
|
1005
|
-
const result = await ExpoIapModule.verifyPurchaseWithProvider(resolvedOptions);
|
|
1002
|
+
const result = await invokeNativeWithPurchaseError(() => ExpoIapModule.verifyPurchaseWithProvider(resolvedOptions), nativePlatform());
|
|
1006
1003
|
if (result.iapkit == null) {
|
|
1007
1004
|
return result;
|
|
1008
1005
|
}
|