expo-iap 5.0.0 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/java/expo/modules/iap/ExpoIapModule.kt +43 -16
- package/build/index.d.ts.map +1 -1
- package/build/index.js +8 -11
- package/build/index.js.map +1 -1
- package/build/index.kepler.d.ts.map +1 -1
- package/build/index.kepler.js +2 -1
- package/build/index.kepler.js.map +1 -1
- package/build/modules/ios.d.ts.map +1 -1
- package/build/modules/ios.js +4 -3
- package/build/modules/ios.js.map +1 -1
- package/build/types.d.ts +11 -0
- package/build/types.d.ts.map +1 -1
- package/build/types.js.map +1 -1
- package/build/useIAP.d.ts.map +1 -1
- package/build/useIAP.js +6 -5
- package/build/useIAP.js.map +1 -1
- package/build/utils/availablePurchases.d.ts +8 -0
- package/build/utils/availablePurchases.d.ts.map +1 -0
- package/build/utils/availablePurchases.js +74 -0
- package/build/utils/availablePurchases.js.map +1 -0
- package/build/utils/restorePurchases.d.ts +9 -0
- package/build/utils/restorePurchases.d.ts.map +1 -0
- package/build/utils/restorePurchases.js +29 -0
- package/build/utils/restorePurchases.js.map +1 -0
- package/build/vega-adapter.d.ts.map +1 -1
- package/build/vega-adapter.js +12 -6
- package/build/vega-adapter.js.map +1 -1
- package/ios/ExpoIapHelper.swift +27 -0
- package/ios/ExpoIapModule.swift +14 -6
- package/openiap-versions.json +3 -3
- package/package.json +1 -1
- package/src/index.kepler.ts +3 -1
- package/src/index.ts +11 -13
- package/src/modules/ios.ts +4 -3
- package/src/types.ts +11 -0
- package/src/useIAP.ts +6 -5
- package/src/utils/availablePurchases.ts +105 -0
- package/src/utils/restorePurchases.ts +31 -0
- package/src/vega-adapter.ts +24 -3
|
@@ -27,6 +27,7 @@ import expo.modules.kotlin.Promise
|
|
|
27
27
|
import expo.modules.kotlin.exception.Exceptions
|
|
28
28
|
import expo.modules.kotlin.modules.Module
|
|
29
29
|
import expo.modules.kotlin.modules.ModuleDefinition
|
|
30
|
+
import kotlinx.coroutines.CancellationException
|
|
30
31
|
import kotlinx.coroutines.CoroutineScope
|
|
31
32
|
import kotlinx.coroutines.Dispatchers
|
|
32
33
|
import kotlinx.coroutines.Job
|
|
@@ -58,6 +59,20 @@ internal suspend fun endExpoConnectionWithCleanup(
|
|
|
58
59
|
internal fun endConnectionErrorCode(error: Exception): String =
|
|
59
60
|
(error as? OpenIapError)?.code ?: OpenIapError.ServiceDisconnected.CODE
|
|
60
61
|
|
|
62
|
+
internal fun deliverPurchaseRequestFailure(
|
|
63
|
+
reachedOpenIapRequest: Boolean,
|
|
64
|
+
isCancellation: Boolean = false,
|
|
65
|
+
errorCode: String,
|
|
66
|
+
errorEnvelope: String,
|
|
67
|
+
emitLocalError: () -> Unit,
|
|
68
|
+
rejectPendingPromises: (String, String) -> Unit,
|
|
69
|
+
) {
|
|
70
|
+
if (!reachedOpenIapRequest && !isCancellation) {
|
|
71
|
+
emitLocalError()
|
|
72
|
+
}
|
|
73
|
+
rejectPendingPromises(errorCode, errorEnvelope)
|
|
74
|
+
}
|
|
75
|
+
|
|
61
76
|
class ExpoIapModule : Module() {
|
|
62
77
|
companion object {
|
|
63
78
|
const val TAG = "ExpoIapModule"
|
|
@@ -387,9 +402,11 @@ class ExpoIapModule : Module() {
|
|
|
387
402
|
|
|
388
403
|
ExpoIapHelper.addPurchasePromise(promise)
|
|
389
404
|
scope.launch {
|
|
405
|
+
var reachedOpenIapRequest = false
|
|
390
406
|
try {
|
|
391
407
|
val activity = currentActivity
|
|
392
408
|
openIap.setActivity(activity)
|
|
409
|
+
reachedOpenIapRequest = true
|
|
393
410
|
val result = openIap.requestPurchase(requestProps)
|
|
394
411
|
val purchases =
|
|
395
412
|
when (result) {
|
|
@@ -415,23 +432,33 @@ class ExpoIapModule : Module() {
|
|
|
415
432
|
)
|
|
416
433
|
}
|
|
417
434
|
val errorCode = errorMap["code"] as? String ?: OpenIapError.PurchaseFailed.CODE
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
435
|
+
val errorEnvelope = ExpoIapHelper.serializeErrorEnvelope(errorMap)
|
|
436
|
+
deliverPurchaseRequestFailure(
|
|
437
|
+
reachedOpenIapRequest = reachedOpenIapRequest,
|
|
438
|
+
isCancellation = e is CancellationException,
|
|
439
|
+
errorCode = errorCode,
|
|
440
|
+
errorEnvelope = errorEnvelope,
|
|
441
|
+
emitLocalError = {
|
|
442
|
+
runCatching {
|
|
443
|
+
ExpoIapHelper.emitOrQueue(
|
|
444
|
+
this@ExpoIapModule,
|
|
445
|
+
scope,
|
|
446
|
+
connectionReady,
|
|
447
|
+
pendingEvents,
|
|
448
|
+
EVENT_PURCHASE_ERROR,
|
|
449
|
+
errorMap,
|
|
450
|
+
)
|
|
451
|
+
}.onFailure { ex ->
|
|
452
|
+
ExpoIapLog.failure("send PURCHASE_ERROR event requestPurchase", ex)
|
|
453
|
+
}
|
|
454
|
+
},
|
|
455
|
+
rejectPendingPromises = { code, message ->
|
|
456
|
+
ExpoIapHelper.rejectPurchasePromises(code, message, null)
|
|
457
|
+
},
|
|
434
458
|
)
|
|
459
|
+
if (e is CancellationException) {
|
|
460
|
+
throw e
|
|
461
|
+
}
|
|
435
462
|
}
|
|
436
463
|
}
|
|
437
464
|
}
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/build/index.js
CHANGED
|
@@ -3,9 +3,11 @@ import { Platform } from 'react-native';
|
|
|
3
3
|
// Internal modules
|
|
4
4
|
import ExpoIapModule, { getNativeModule } from './ExpoIapModule';
|
|
5
5
|
import { isVegaOS } from './vega';
|
|
6
|
-
import { isProductIOS, deepLinkToSubscriptionsIOS
|
|
6
|
+
import { isProductIOS, deepLinkToSubscriptionsIOS } from './modules/ios';
|
|
7
7
|
import { isProductAndroid, deepLinkToSubscriptionsAndroid, } from './modules/android';
|
|
8
8
|
import { ExpoIapConsole } from './utils/debug';
|
|
9
|
+
import { restorePurchasesIOSNative } from './utils/restorePurchases';
|
|
10
|
+
import { decodeAndroidPurchases, decodeApplePurchases, } from './utils/availablePurchases';
|
|
9
11
|
import { ErrorCode } from './types';
|
|
10
12
|
import { createPurchaseError, createPurchaseErrorFromNativeException, OPENIAP_ERROR_ENVELOPE_PREFIX, } from './utils/errorMapping';
|
|
11
13
|
// Export all types
|
|
@@ -531,7 +533,7 @@ export const getAvailablePurchases = async (options) => {
|
|
|
531
533
|
};
|
|
532
534
|
if (isVegaOS()) {
|
|
533
535
|
const purchases = await ExpoIapModule.getAvailableItems(normalizedOptions);
|
|
534
|
-
return purchases;
|
|
536
|
+
return decodeAndroidPurchases(purchases);
|
|
535
537
|
}
|
|
536
538
|
let purchases;
|
|
537
539
|
if (Platform.OS === 'ios') {
|
|
@@ -543,7 +545,9 @@ export const getAvailablePurchases = async (options) => {
|
|
|
543
545
|
else {
|
|
544
546
|
throw unsupportedPlatformError();
|
|
545
547
|
}
|
|
546
|
-
return
|
|
548
|
+
return Platform.OS === 'ios'
|
|
549
|
+
? decodeApplePurchases(purchases)
|
|
550
|
+
: decodeAndroidPurchases(purchases);
|
|
547
551
|
};
|
|
548
552
|
/**
|
|
549
553
|
* Get all active subscriptions with detailed information.
|
|
@@ -853,14 +857,7 @@ export const finishTransaction = async ({ purchase, isConsumable = false, }) =>
|
|
|
853
857
|
*/
|
|
854
858
|
export const restorePurchases = async () => {
|
|
855
859
|
if (Platform.OS === 'ios') {
|
|
856
|
-
|
|
857
|
-
if (nativeModule.USING_ONSIDE_SDK &&
|
|
858
|
-
typeof nativeModule.restorePurchases === 'function') {
|
|
859
|
-
await nativeModule.restorePurchases().catch(() => undefined);
|
|
860
|
-
}
|
|
861
|
-
else {
|
|
862
|
-
await syncIOS().catch(() => undefined);
|
|
863
|
-
}
|
|
860
|
+
await restorePurchasesIOSNative();
|
|
864
861
|
}
|
|
865
862
|
await getAvailablePurchases({
|
|
866
863
|
alsoPublishToEventListenerIOS: false,
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["// External dependencies\nimport {Platform} from 'react-native';\n\n// Internal modules\nimport ExpoIapModule, {getNativeModule} from './ExpoIapModule';\nimport {isVegaOS} from './vega';\nimport {isProductIOS, deepLinkToSubscriptionsIOS, syncIOS} from './modules/ios';\nimport {\n isProductAndroid,\n deepLinkToSubscriptionsAndroid,\n} from './modules/android';\nimport {ExpoIapConsole} from './utils/debug';\n\n// Types\nimport type {\n ActiveSubscription,\n DeepLinkOptions,\n DeveloperProvidedBillingDetailsAndroid,\n IapPlatform,\n MutationField,\n MutationRequestPurchaseArgs,\n Product,\n ProductQueryType,\n ProductSubscription,\n Purchase,\n PurchaseOptions,\n PurchaseUpdatedListenerOptions,\n QueryField,\n RequestPurchasePropsByPlatforms,\n RequestPurchaseAndroidProps,\n RequestPurchaseIosProps,\n RequestSubscriptionPropsByPlatforms,\n RequestSubscriptionAndroidProps,\n RequestSubscriptionIosProps,\n UserChoiceBillingDetails,\n} from './types';\nimport {ErrorCode} from './types';\nimport {\n createPurchaseError,\n createPurchaseErrorFromNativeException,\n OPENIAP_ERROR_ENVELOPE_PREFIX,\n type PurchaseError,\n type PurchaseErrorProps,\n} from './utils/errorMapping';\n\n// Export all types\nexport * from './types';\nexport * from './modules/android';\nexport * from './modules/ios';\nexport * from './onside';\nexport * from './vega';\n\n// Get the native constant value\nexport enum OpenIapEvent {\n PurchaseUpdated = 'purchase-updated',\n PurchaseError = 'purchase-error',\n PromotedProductIOS = 'promoted-product-ios',\n UserChoiceBillingAndroid = 'user-choice-billing-android',\n /**\n * Fired for External Payments (8.3.0+) and Billing Choice (9.1.0+)\n * developer billing flows. Nullable fields depend on the selected flow.\n */\n DeveloperProvidedBillingAndroid = 'developer-provided-billing-android',\n /**\n * Fired when a subscription enters a billing-issue state (cross-platform).\n * Unifies StoreKit 2 `Message.Reason.billingIssue` (iOS / Mac Catalyst 16.4+, visionOS 1.0+) and Play Billing 8.1+\n * `Purchase.isSuspended`. NOT fired on the Meta Horizon flavor.\n */\n SubscriptionBillingIssue = 'subscription-billing-issue',\n}\n\ntype ExpoIapEventPayloads = {\n [OpenIapEvent.PurchaseUpdated]: Purchase;\n [OpenIapEvent.PurchaseError]: PurchaseError;\n [OpenIapEvent.PromotedProductIOS]:\n | Product\n | string\n | {id?: string; productId?: string};\n [OpenIapEvent.UserChoiceBillingAndroid]: UserChoiceBillingDetails;\n [OpenIapEvent.DeveloperProvidedBillingAndroid]: DeveloperProvidedBillingDetailsAndroid;\n [OpenIapEvent.SubscriptionBillingIssue]: Purchase;\n};\n\ntype ExpoIapEventListener<E extends OpenIapEvent> = (\n payload: ExpoIapEventPayloads[E],\n) => void;\n\ntype ExpoIapEmitter = {\n addListener<E extends OpenIapEvent>(\n eventName: E,\n listener: ExpoIapEventListener<E>,\n ): {remove: () => void};\n removeListener<E extends OpenIapEvent>(\n eventName: E,\n listener: ExpoIapEventListener<E>,\n ): void;\n};\n\ntype NativePurchaseUpdatedOptionsModule = {\n setPurchaseUpdatedListenerOptions?: (\n options?: PurchaseUpdatedListenerOptions | null,\n ) => Promise<void>;\n};\n\nconst isStorePlatform = (): boolean =>\n Platform.OS === 'ios' || Platform.OS === 'android';\n\nconst isStoreRuntime = (): boolean =>\n Platform.OS === 'ios' || isAndroidStoreRuntime();\n\nconst unsupportedPlatformError = (): Error =>\n new Error(`Unsupported platform: ${Platform.OS}`);\n\n// Use the raw native module for listener calls — JSI HostObjects require the\n// real native module as `this` when calling addListener. Using a Proxy as\n// `this` triggers \"native state unsupported on Proxy\" on New Architecture / Hermes.\n// Resolved lazily so importing this module doesn't throw on unsupported platforms.\nexport const emitter: ExpoIapEmitter = {\n addListener(eventName, listener) {\n const nativeModule = getNativeModule();\n const nativeSubscription = nativeModule.addListener(eventName, listener);\n let removed = false;\n\n return {\n remove: () => {\n if (removed) {\n return;\n }\n removed = true;\n\n if (typeof nativeSubscription?.remove === 'function') {\n nativeSubscription.remove();\n return;\n }\n\n nativeModule.removeListener?.(eventName, listener);\n },\n };\n },\n removeListener(eventName, listener) {\n return getNativeModule().removeListener?.(eventName, listener);\n },\n};\n\nlet nonDedupingPurchaseUpdatedListenerCountIOS = 0;\nconst purchaseUpdatedDedupeHistoryLimitIOS = 512;\nconst purchaseUpdatedDedupeHistoryIOS = {\n ids: new Set<string>(),\n order: [] as string[],\n start: 0,\n};\nlet purchaseUpdatedDedupeGenerationIOS = 0;\n\ntype PurchaseUpdatedDedupeHistoryIOS = {\n ids: Set<string>;\n order: string[];\n start: number;\n};\n\nconst purchaseUpdatedTransactionIdIOS = (purchase: Purchase) => {\n if (typeof purchase.id === 'string' && purchase.id.length > 0) {\n return purchase.id;\n }\n return null;\n};\n\nconst rememberPurchaseUpdatedTransactionIOS = (\n transactionId: string,\n history: PurchaseUpdatedDedupeHistoryIOS,\n) => {\n if (history.ids.has(transactionId)) {\n return;\n }\n\n history.ids.add(transactionId);\n history.order.push(transactionId);\n if (\n history.order.length - history.start >\n purchaseUpdatedDedupeHistoryLimitIOS\n ) {\n const evicted = history.order[history.start];\n history.start += 1;\n if (evicted != null) {\n history.ids.delete(evicted);\n }\n if (history.start > 128 && history.start * 2 > history.order.length) {\n history.order = history.order.slice(history.start);\n history.start = 0;\n }\n }\n};\n\nconst clearPurchaseUpdatedDedupeHistoryIOS = (\n history: PurchaseUpdatedDedupeHistoryIOS,\n) => {\n history.ids.clear();\n history.order.length = 0;\n history.start = 0;\n};\n\nconst resetPurchaseUpdatedDedupeHistoryIOS = () => {\n clearPurchaseUpdatedDedupeHistoryIOS(purchaseUpdatedDedupeHistoryIOS);\n purchaseUpdatedDedupeGenerationIOS += 1;\n};\n\nconst configurePurchaseUpdatedListenerOptionsIOS = (\n dedupeTransactionIOS: boolean,\n) => {\n if (Platform.OS !== 'ios') return;\n\n const nativeModule = getNativeModule() as NativePurchaseUpdatedOptionsModule;\n const promise = nativeModule.setPurchaseUpdatedListenerOptions?.({\n dedupeTransactionIOS,\n });\n void promise?.catch((error: unknown) => {\n ExpoIapConsole.warn(\n 'Failed to configure purchase updated listener options:',\n error,\n );\n });\n};\n\nexport type ProductTypeInput = ProductQueryType;\n\nconst normalizeProductType = (type?: ProductTypeInput) => {\n if (!type || type === 'in-app') {\n return {\n canonical: 'in-app' as ProductQueryType,\n native: 'in-app' as const,\n };\n }\n if (type === 'subs') {\n return {\n canonical: 'subs' as ProductQueryType,\n native: 'subs' as const,\n };\n }\n if (type === 'all') {\n return {\n canonical: 'all' as ProductQueryType,\n native: 'all' as const,\n };\n }\n throw new Error(`Unsupported product type: ${type}`);\n};\n\nconst isAndroidStoreRuntime = (): boolean => {\n return Platform.OS === 'android' || isVegaOS();\n};\n\nexport const purchaseUpdatedListener = (\n listener: (event: Purchase) => void,\n options?: PurchaseUpdatedListenerOptions | null,\n) => {\n const receiveDuplicateTransactionUpdatesIOS =\n Platform.OS === 'ios' && options?.dedupeTransactionIOS === false;\n const listenerDedupeHistoryIOS: PurchaseUpdatedDedupeHistoryIOS = {\n ids: new Set(purchaseUpdatedDedupeHistoryIOS.ids),\n order: purchaseUpdatedDedupeHistoryIOS.order.slice(\n purchaseUpdatedDedupeHistoryIOS.start,\n ),\n start: 0,\n };\n let listenerDedupeGenerationIOS = purchaseUpdatedDedupeGenerationIOS;\n\n const wrappedListener = (event: Purchase) => {\n const normalized = event;\n if (Platform.OS === 'ios') {\n if (listenerDedupeGenerationIOS !== purchaseUpdatedDedupeGenerationIOS) {\n clearPurchaseUpdatedDedupeHistoryIOS(listenerDedupeHistoryIOS);\n listenerDedupeGenerationIOS = purchaseUpdatedDedupeGenerationIOS;\n }\n const transactionId = purchaseUpdatedTransactionIdIOS(normalized);\n if (transactionId != null) {\n const isDuplicateForListener =\n listenerDedupeHistoryIOS.ids.has(transactionId);\n rememberPurchaseUpdatedTransactionIOS(\n transactionId,\n listenerDedupeHistoryIOS,\n );\n rememberPurchaseUpdatedTransactionIOS(\n transactionId,\n purchaseUpdatedDedupeHistoryIOS,\n );\n if (!receiveDuplicateTransactionUpdatesIOS && isDuplicateForListener) {\n return;\n }\n }\n }\n listener(normalized);\n };\n const emitterSubscription = emitter.addListener(\n OpenIapEvent.PurchaseUpdated,\n wrappedListener,\n );\n\n if (!receiveDuplicateTransactionUpdatesIOS) {\n return emitterSubscription;\n }\n\n nonDedupingPurchaseUpdatedListenerCountIOS += 1;\n configurePurchaseUpdatedListenerOptionsIOS(false);\n let removed = false;\n\n return {\n remove: () => {\n if (removed) {\n return;\n }\n removed = true;\n try {\n emitterSubscription?.remove?.();\n } finally {\n nonDedupingPurchaseUpdatedListenerCountIOS = Math.max(\n 0,\n nonDedupingPurchaseUpdatedListenerCountIOS - 1,\n );\n configurePurchaseUpdatedListenerOptionsIOS(\n nonDedupingPurchaseUpdatedListenerCountIOS === 0,\n );\n }\n },\n };\n};\n\nexport const purchaseErrorListener = (\n listener: (error: PurchaseError) => void,\n) => {\n const wrappedListener = (error: PurchaseError) => {\n listener(error);\n };\n const emitterSubscription = emitter.addListener(\n OpenIapEvent.PurchaseError,\n wrappedListener,\n );\n return emitterSubscription;\n};\n\n/**\n * iOS-only listener for App Store promoted product events.\n * This fires when a user taps on a promoted product in the App Store.\n *\n * @param listener - Callback function that receives the promoted product details\n * @returns EventSubscription that can be used to unsubscribe\n *\n * @example\n * ```typescript\n * const subscription = promotedProductListenerIOS((product) => {\n * console.log('Promoted product:', product);\n * // Handle the promoted product\n * });\n *\n * // Later, clean up\n * subscription.remove();\n * ```\n *\n * @platform iOS\n */\nexport const promotedProductListenerIOS = (\n listener: (product: Product) => void,\n) => {\n if (Platform.OS !== 'ios') {\n ExpoIapConsole.warn(\n 'promotedProductListenerIOS: This listener is only available on iOS',\n );\n return {remove: () => {}};\n }\n\n let deliveredProductId: string | undefined;\n const deliver = (product: Product) => {\n const productId =\n product.id ?? (product as Product & {productId?: string}).productId;\n if (productId && productId === deliveredProductId) {\n return;\n }\n deliveredProductId = productId;\n listener(product);\n };\n\n const replayPendingProduct = () => {\n let pendingProduct: Promise<Product | null> | undefined;\n try {\n pendingProduct = ExpoIapModule.getPromotedProductIOS() as\n | Promise<Product | null>\n | undefined;\n } catch {\n return Promise.resolve();\n }\n\n if (!pendingProduct || typeof pendingProduct.then !== 'function') {\n return Promise.resolve();\n }\n\n return pendingProduct\n .then((product: Product | null) => {\n if (product) {\n deliver(product);\n }\n })\n .catch(() => {});\n };\n\n const subscription = emitter.addListener(\n OpenIapEvent.PromotedProductIOS,\n (payload) => {\n if (typeof payload === 'string') {\n void replayPendingProduct();\n return;\n }\n\n deliver(payload as Product);\n },\n );\n\n void replayPendingProduct();\n\n return subscription;\n};\n\n/**\n * Android-only listener for User Choice Billing events.\n * This fires when a user selects alternative billing instead of Google Play billing\n * in the User Choice Billing dialog (only in 'user-choice' mode).\n *\n * @param listener - Callback function that receives the external transaction token and product IDs\n * @returns EventSubscription that can be used to unsubscribe\n *\n * @example\n * ```typescript\n * const subscription = userChoiceBillingListenerAndroid((details) => {\n * console.log('User selected alternative billing');\n * console.log('External transaction token received; send it to your backend without logging it.');\n * console.log('Products:', details.products);\n *\n * // Process payment in your system, then report token to Google\n * await processPaymentAndReportToken(details);\n * });\n *\n * // Later, clean up\n * subscription.remove();\n * ```\n *\n * @platform Android\n */\nexport const userChoiceBillingListenerAndroid = (\n listener: (details: UserChoiceBillingDetails) => void,\n) => {\n if (Platform.OS !== 'android') {\n ExpoIapConsole.warn(\n 'userChoiceBillingListenerAndroid: This listener is only available on Android',\n );\n return {remove: () => {}};\n }\n return emitter.addListener(OpenIapEvent.UserChoiceBillingAndroid, listener);\n};\n\n/**\n * Android-only listener for Developer Provided Billing events.\n * This fires when a user selects the developer's option in an External Payments\n * or Billing Choice purchase flow.\n *\n * Requires Google Play Billing Library 8.3.0+; Billing Choice fields require 9.1.0+.\n *\n * @param listener - Callback that receives selected products and flow details\n * @returns EventSubscription that can be used to unsubscribe\n *\n * @example\n * ```typescript\n * const subscription = developerProvidedBillingListenerAndroid(async (details) => {\n * await processPaymentWithYourGateway(details.products, details.linkUri);\n * if (details.externalTransactionToken) {\n * await reportExternalTransactionToGoogle(details.externalTransactionToken);\n * }\n * });\n *\n * // Later, clean up\n * subscription.remove();\n * ```\n *\n * @platform Android (8.3.0+; Billing Choice 9.1.0+)\n */\nexport const developerProvidedBillingListenerAndroid = (\n listener: (details: DeveloperProvidedBillingDetailsAndroid) => void,\n) => {\n if (Platform.OS !== 'android') {\n ExpoIapConsole.warn(\n 'developerProvidedBillingListenerAndroid: This listener is only available on Android',\n );\n return {remove: () => {}};\n }\n return emitter.addListener(\n OpenIapEvent.DeveloperProvidedBillingAndroid,\n listener,\n );\n};\n\n/**\n * Listen for subscription billing-issue events (cross-platform).\n *\n * Fires when a user's active subscription enters a state that needs attention\n * for a payment problem. Unifies:\n * - iOS / Mac Catalyst 16.4+ and visionOS 1.0+: StoreKit 2 `Message.Reason.billingIssue`.\n * - Android (Play Billing 8.1+): when `Purchase.isSuspendedAndroid === true`.\n * - Meta Horizon / iOS 17 / older platforms: never fires.\n *\n * Recommended UX: call `deepLinkToSubscriptions()` when this fires so the user\n * can update their payment method in the platform subscription center.\n *\n * @example\n * ```typescript\n * const subscription = subscriptionBillingIssueListener((purchase) => {\n * console.warn('Needs attention:', purchase.productId);\n * deepLinkToSubscriptions({\n * skuAndroid: purchase.productId,\n * packageNameAndroid: 'com.example.app',\n * });\n * });\n * ```\n */\nexport const subscriptionBillingIssueListener = (\n listener: (purchase: Purchase) => void,\n) => {\n const wrappedListener = (event: Purchase) => {\n listener(event);\n };\n return emitter.addListener(\n OpenIapEvent.SubscriptionBillingIssue,\n wrappedListener,\n );\n};\n\n/**\n * Initialize the store connection. Must be called before any other IAP API.\n *\n * @param config Optional connection config. Use `enableBillingProgramAndroid` (Android,\n * Play Billing 8.2.0+) to opt into a billing program. For Billing Choice 9.1.0+, set\n * `billingChoiceScreenTypeAndroid` to the renderer configured in Play Console.\n * iOS ignores Android-specific fields.\n * @returns Promise resolving to `true` when the platform billing client is connected.\n * @throws When the platform billing client fails to initialize.\n *\n * @example\n * ```ts\n * await initConnection();\n * await initConnection({ enableBillingProgramAndroid: 'external-offer' });\n * await initConnection({\n * enableBillingProgramAndroid: 'billing-choice',\n * billingChoiceScreenTypeAndroid: 'developer-rendered',\n * });\n * ```\n *\n * @remarks When using `useIAP()`, connection is auto-managed on mount/unmount —\n * pass options to the hook instead of calling this directly.\n *\n * @see {@link https://openiap.dev/docs/apis/init-connection}\n */\nexport const initConnection: MutationField<'initConnection'> = async (\n config,\n) => {\n const result = await ExpoIapModule.initConnection(config ?? null);\n if (\n result === true &&\n Platform.OS === 'ios' &&\n nonDedupingPurchaseUpdatedListenerCountIOS > 0\n ) {\n configurePurchaseUpdatedListenerOptionsIOS(false);\n }\n return result;\n};\n\n/**\n * Close the store connection and release resources.\n *\n * @see {@link https://openiap.dev/docs/apis/end-connection}\n */\nexport const endConnection: MutationField<'endConnection'> = async () => {\n const result = await ExpoIapModule.endConnection();\n if (result === true && Platform.OS === 'ios') {\n resetPurchaseUpdatedDedupeHistoryIOS();\n }\n return result;\n};\n\nconst invokeNativeWithPurchaseError = async <T>(\n operation: () => Promise<T>,\n platform: IapPlatform,\n fallback: PurchaseErrorProps,\n): Promise<T> => {\n try {\n return await operation();\n } catch (error) {\n const nativeError =\n typeof error === 'object' && error !== null\n ? (error as Record<string, unknown>)\n : undefined;\n const nativeMessage =\n typeof nativeError?.message === 'string'\n ? nativeError.message\n : typeof error === 'string'\n ? error\n : '';\n const hasCanonicalFields =\n nativeMessage.includes(OPENIAP_ERROR_ENVELOPE_PREFIX) ||\n nativeError?.code !== undefined ||\n nativeError?.responseCode !== undefined ||\n nativeError?.debugMessage !== undefined ||\n nativeError?.productId !== undefined ||\n nativeError?.productIds !== undefined;\n\n // Preserve the identity of unrelated JavaScript errors (including adapter\n // or test errors) while normalizing native OpenIAP rejections.\n if (!hasCanonicalFields) throw error;\n throw createPurchaseErrorFromNativeException(error, platform, fallback);\n }\n};\n\n/**\n * Retrieve products or subscriptions from the store by SKU.\n *\n * @param request `ProductRequest` — `skus` (string[]) and optional `type`\n * (`'in-app' | 'subs' | 'all'`, defaults to `'in-app'`).\n * @returns Promise resolving to a `FetchProductsResult` union — `Product[]` for `'in-app'`,\n * `ProductSubscription[]` for `'subs'`, or a mixed array for `'all'`.\n * @throws When the store rejects the request (empty `skus`, not connected,\n * network/store error). Unknown SKUs are simply omitted from the result, not thrown.\n *\n * @example\n * ```ts\n * const products = await fetchProducts({\n * skus: ['com.app.coins_100', 'com.app.premium'],\n * type: 'in-app',\n * });\n * ```\n *\n * @remarks This is a regular promise-based call. Don't confuse with `request*` APIs\n * (`requestPurchase`), which are event-based.\n *\n * @see {@link https://openiap.dev/docs/apis/fetch-products}\n */\nexport const fetchProducts: QueryField<'fetchProducts'> = async (request) => {\n ExpoIapConsole.debug('fetchProducts called with:', request);\n const {skus, type} = request ?? {};\n\n if (!Array.isArray(skus) || skus.length === 0) {\n throw createPurchaseError({\n message: 'No SKUs provided',\n code: ErrorCode.EmptySkuList,\n });\n }\n\n const {canonical, native} = normalizeProductType(\n type as ProductTypeInput | undefined,\n );\n const skuSet = new Set(skus);\n\n const filterIosItems = (\n items: unknown[],\n ): (Product | ProductSubscription)[] =>\n items.filter((item): item is Product | ProductSubscription => {\n if (!isProductIOS(item)) {\n return false;\n }\n const candidate = item as Product | ProductSubscription;\n return typeof candidate.id === 'string' && skuSet.has(candidate.id);\n });\n\n const filterAndroidItems = (\n items: unknown[],\n ): (Product | ProductSubscription)[] =>\n items.filter((item): item is Product | ProductSubscription => {\n if (!isProductAndroid(item)) {\n return false;\n }\n const candidate = item as Product | ProductSubscription;\n return typeof candidate.id === 'string' && skuSet.has(candidate.id);\n });\n\n const castResult = (\n items: (Product | ProductSubscription)[],\n ):\n | (Product | ProductSubscription)[]\n | Product[]\n | ProductSubscription[]\n | null => {\n if (canonical === 'in-app') {\n return items as Product[];\n }\n if (canonical === 'subs') {\n return items as ProductSubscription[];\n }\n // For 'all' type, items contain both Product and ProductSubscription\n // Return as ProductOrSubscription[] to preserve discriminated union\n return items;\n };\n\n if (Platform.OS === 'ios') {\n const rawItems = await invokeNativeWithPurchaseError<unknown[]>(\n () => ExpoIapModule.fetchProducts({skus, type: native}),\n 'ios',\n {\n code: ErrorCode.QueryProduct,\n message: 'Failed to query products',\n productIds: skus,\n productType: canonical,\n },\n );\n return castResult(filterIosItems(rawItems));\n }\n\n if (isAndroidStoreRuntime()) {\n const rawItems = await invokeNativeWithPurchaseError<unknown[]>(\n () => ExpoIapModule.fetchProducts(native, skus),\n 'android',\n {\n code: ErrorCode.QueryProduct,\n message: 'Failed to query products',\n productIds: skus,\n productType: canonical,\n },\n );\n return castResult(filterAndroidItems(rawItems));\n }\n\n throw unsupportedPlatformError();\n};\n\n/**\n * List the user's unfinished purchases — non-consumables, active subscriptions, and any\n * pending transactions not yet finished.\n *\n * @param options Optional `PurchaseOptions`. iOS-only flags:\n * `alsoPublishToEventListenerIOS`, `onlyIncludeActiveItemsIOS`.\n * @returns Promise resolving to an array of `Purchase` currently held by the store.\n * @throws When the platform query fails.\n *\n * @example\n * ```ts\n * const purchases = await getAvailablePurchases();\n * for (const p of purchases) {\n * if (await verifyOnServer(p)) await finishTransaction({ purchase: p, isConsumable: false });\n * }\n * ```\n *\n * @see {@link https://openiap.dev/docs/apis/get-available-purchases}\n */\nexport const getAvailablePurchases: QueryField<\n 'getAvailablePurchases'\n> = async (options) => {\n const normalizedOptions: PurchaseOptions = {\n alsoPublishToEventListenerIOS:\n options?.alsoPublishToEventListenerIOS ?? false,\n onlyIncludeActiveItemsIOS: options?.onlyIncludeActiveItemsIOS ?? true,\n includeSuspendedAndroid: options?.includeSuspendedAndroid ?? false,\n };\n\n if (isVegaOS()) {\n const purchases = await ExpoIapModule.getAvailableItems(normalizedOptions);\n return purchases as Purchase[];\n }\n\n let purchases: Purchase[];\n\n if (Platform.OS === 'ios') {\n purchases = (await ExpoIapModule.getAvailableItems(\n normalizedOptions.alsoPublishToEventListenerIOS,\n normalizedOptions.onlyIncludeActiveItemsIOS,\n )) as Purchase[];\n } else if (Platform.OS === 'android') {\n purchases = (await ExpoIapModule.getAvailableItems(\n normalizedOptions,\n )) as Purchase[];\n } else {\n throw unsupportedPlatformError();\n }\n\n return purchases as Purchase[];\n};\n\n/**\n * Get all active subscriptions with detailed information.\n * Uses native OpenIAP module for accurate subscription status and renewal info.\n *\n * On iOS: Returns subscriptions with renewalInfoIOS containing pendingUpgradeProductId,\n * willAutoRenew, autoRenewPreference, and other renewal details.\n *\n * On Android: Filters available purchases to find active subscriptions (fallback implementation).\n *\n * @param subscriptionIds - Optional array of subscription product IDs to filter. If not provided, returns all active subscriptions.\n * @returns Promise resolving to array of active subscriptions with details\n *\n * @example\n * ```typescript\n * // Get all active subscriptions\n * const subs = await getActiveSubscriptions();\n *\n * // Get specific subscriptions\n * const premiumSubs = await getActiveSubscriptions(['premium', 'premium_year']);\n *\n * // Check for pending upgrades (iOS)\n * subs.forEach(sub => {\n * if (sub.renewalInfoIOS?.pendingUpgradeProductId) {\n * console.log(`Upgrade pending to: ${sub.renewalInfoIOS.pendingUpgradeProductId}`);\n * }\n * });\n * ```\n *\n * @see {@link https://openiap.dev/docs/apis/get-active-subscriptions}\n */\nexport const getActiveSubscriptions: QueryField<\n 'getActiveSubscriptions'\n> = async (subscriptionIds) => {\n if (!isStoreRuntime()) {\n throw unsupportedPlatformError();\n }\n\n const result = await ExpoIapModule.getActiveSubscriptions(\n subscriptionIds ?? null,\n );\n return (result ?? []) as ActiveSubscription[];\n};\n\n/**\n * Check if user has any active subscriptions.\n *\n * @param subscriptionIds - Optional array of subscription product IDs to check. If not provided, checks all subscriptions.\n * @returns Promise resolving to true if user has at least one active subscription\n *\n * @example\n * ```typescript\n * // Check any active subscription\n * const hasAny = await hasActiveSubscriptions();\n *\n * // Check specific subscriptions\n * const hasPremium = await hasActiveSubscriptions(['premium', 'premium_year']);\n * ```\n *\n * @see {@link https://openiap.dev/docs/apis/has-active-subscriptions}\n */\nexport const hasActiveSubscriptions: QueryField<\n 'hasActiveSubscriptions'\n> = async (subscriptionIds) => {\n if (!isStoreRuntime()) {\n throw unsupportedPlatformError();\n }\n\n return !!(await ExpoIapModule.hasActiveSubscriptions(\n subscriptionIds ?? null,\n ));\n};\n\n/**\n * Return the user's storefront country code.\n *\n * @see {@link https://openiap.dev/docs/apis/get-storefront}\n */\nexport const getStorefront: QueryField<'getStorefront'> = async () => {\n if (Platform.OS !== 'ios' && !isAndroidStoreRuntime()) {\n throw createPurchaseError({\n code: ErrorCode.FeatureNotSupported,\n message: `Storefront lookup is not supported on ${Platform.OS}.`,\n });\n }\n\n const platform: IapPlatform = Platform.OS === 'ios' ? 'ios' : 'android';\n if (typeof ExpoIapModule.getStorefront !== 'function') {\n throw createPurchaseError({\n code: ErrorCode.FeatureNotSupported,\n message: 'Native getStorefront is not available on this build.',\n platform,\n });\n }\n\n let storefront: unknown;\n try {\n storefront = await ExpoIapModule.getStorefront();\n } catch (error) {\n throw createPurchaseErrorFromNativeException(error, platform, {\n code: ErrorCode.ServiceError,\n message: 'Failed to get storefront.',\n debugMessage: error instanceof Error ? error.message : String(error),\n });\n }\n\n if (typeof storefront !== 'string' || storefront.trim().length === 0) {\n throw createPurchaseError({\n code: ErrorCode.ServiceError,\n message: 'Storefront lookup returned no country code.',\n platform,\n });\n }\n return storefront;\n};\n\n/**\n * Helper to normalize request props to platform-specific format\n */\nfunction normalizeRequestProps(\n request: RequestPurchasePropsByPlatforms,\n platform: 'ios',\n): RequestPurchaseIosProps | null | undefined;\nfunction normalizeRequestProps(\n request: RequestPurchasePropsByPlatforms,\n platform: 'android',\n): RequestPurchaseAndroidProps | null | undefined;\nfunction normalizeRequestProps(\n request: RequestSubscriptionPropsByPlatforms,\n platform: 'ios',\n): RequestSubscriptionIosProps | null | undefined;\nfunction normalizeRequestProps(\n request: RequestSubscriptionPropsByPlatforms,\n platform: 'android',\n): RequestSubscriptionAndroidProps | null | undefined;\nfunction normalizeRequestProps(\n request:\n | RequestPurchasePropsByPlatforms\n | RequestSubscriptionPropsByPlatforms,\n platform: 'ios' | 'android',\n) {\n if (platform === 'ios') {\n return request.apple;\n }\n return request.google;\n}\n\n/**\n * Initiate a purchase or subscription flow. The result is delivered through\n * `purchaseUpdatedListener` — NOT the return value.\n *\n * @param args `RequestPurchaseProps`, discriminated by `type`:\n * - `type: 'in-app'` — pass `request.apple.sku` (iOS) and/or `request.google.skus` (Android).\n * - `type: 'subs'` — same shape, plus `request.google.subscriptionOffers: [{ sku, offerToken }]`.\n * @returns The dispatched purchase payload. **Do not rely on it** for the actual outcome.\n * @throws Synchronous rejection from the store (e.g. `E_NOT_PREPARED`, validation failure).\n *\n * @example\n * ```ts\n * await requestPurchase({\n * request: {\n * apple: { sku: 'com.app.premium' },\n * google: { skus: ['com.app.premium'] },\n * },\n * type: 'in-app',\n * });\n * ```\n *\n * @remarks Event-based. Listen for the result via {@link purchaseUpdatedListener} /\n * {@link purchaseErrorListener}, or use `useIAP({ onPurchaseSuccess, onPurchaseError })`.\n *\n * @see {@link https://openiap.dev/docs/apis/request-purchase}\n */\nexport const requestPurchase: MutationField<'requestPurchase'> = async (\n args,\n) => {\n const {request, type} = args;\n const {canonical, native} = normalizeProductType(type as ProductTypeInput);\n const isInAppPurchase = canonical === 'in-app';\n\n if (Platform.OS === 'ios') {\n const normalizedRequest = normalizeRequestProps(request, 'ios');\n\n if (!normalizedRequest?.sku) {\n throw new Error(\n 'Invalid request for Apple. The `sku` property is required and must be a string.\\n\\n' +\n 'Expected format:\\n' +\n ' requestPurchase({\\n' +\n ' request: {\\n' +\n ' apple: { sku: \"product_id\" },\\n' +\n ' google: { skus: [\"product_id\"] }\\n' +\n ' },\\n' +\n ' type: \"in-app\"\\n' +\n ' })\\n\\n' +\n 'See: https://openiap.dev/docs/apis/request-purchase',\n );\n }\n\n if (canonical !== 'in-app' && canonical !== 'subs') {\n throw new Error(`Unsupported product type: ${canonical}`);\n }\n\n const payload: MutationRequestPurchaseArgs = {\n type: canonical === 'in-app' ? 'in-app' : 'subs',\n request: {apple: normalizedRequest},\n };\n\n const purchase = (await invokeNativeWithPurchaseError(\n () => ExpoIapModule.requestPurchase(payload),\n 'ios',\n {\n code: ErrorCode.PurchaseError,\n message: 'Failed to request purchase',\n productId: normalizedRequest.sku,\n productIds: [normalizedRequest.sku],\n productType: canonical,\n },\n )) as Purchase | Purchase[] | null;\n\n if (Array.isArray(purchase)) {\n return purchase;\n }\n\n if (purchase) {\n return purchase;\n }\n\n return canonical === 'subs' ? [] : null;\n }\n\n if (isAndroidStoreRuntime()) {\n if (isInAppPurchase) {\n const normalizedRequest = normalizeRequestProps(\n request as RequestPurchasePropsByPlatforms,\n 'android',\n ) as RequestPurchaseAndroidProps | null | undefined;\n\n if (!normalizedRequest?.skus?.length) {\n throw new Error(\n 'Invalid request for Google. The `skus` property is required and must be a non-empty array.\\n\\n' +\n 'Expected format:\\n' +\n ' requestPurchase({\\n' +\n ' request: {\\n' +\n ' apple: { sku: \"product_id\" },\\n' +\n ' google: { skus: [\"product_id\"] }\\n' +\n ' },\\n' +\n ' type: \"in-app\"\\n' +\n ' })\\n\\n' +\n 'See: https://openiap.dev/docs/apis/request-purchase',\n );\n }\n\n const {\n skus,\n obfuscatedAccountId,\n obfuscatedProfileId,\n isOfferPersonalized,\n offerToken,\n developerBillingOption,\n } = normalizedRequest;\n\n const result = (await invokeNativeWithPurchaseError(\n () =>\n ExpoIapModule.requestPurchase({\n type: native,\n skus,\n purchaseToken: undefined,\n obfuscatedAccountId: obfuscatedAccountId,\n obfuscatedProfileId: obfuscatedProfileId,\n offerToken: offerToken,\n developerBillingOption: developerBillingOption ?? undefined,\n isOfferPersonalized: isOfferPersonalized ?? false,\n }),\n 'android',\n {\n code: ErrorCode.PurchaseError,\n message: 'Failed to request purchase',\n productId: skus[0],\n productIds: skus,\n productType: canonical,\n },\n )) as Purchase[];\n\n return result;\n }\n\n if (canonical === 'subs') {\n const normalizedRequest = normalizeRequestProps(\n request as RequestSubscriptionPropsByPlatforms,\n 'android',\n ) as RequestSubscriptionAndroidProps | null | undefined;\n\n if (!normalizedRequest?.skus?.length) {\n throw new Error(\n 'Invalid request for Google. The `skus` property is required and must be a non-empty array.\\n\\n' +\n 'Expected format:\\n' +\n ' requestPurchase({\\n' +\n ' request: {\\n' +\n ' apple: { sku: \"subscription_id\" },\\n' +\n ' google: { skus: [\"subscription_id\"] }\\n' +\n ' },\\n' +\n ' type: \"subs\"\\n' +\n ' })\\n\\n' +\n 'See: https://openiap.dev/docs/apis/request-purchase',\n );\n }\n\n const {\n skus,\n obfuscatedAccountId,\n obfuscatedProfileId,\n isOfferPersonalized,\n subscriptionOffers,\n purchaseToken: purchaseTokenInput,\n originalExternalTransactionId,\n developerBillingOption,\n subscriptionProductReplacementParams,\n } = normalizedRequest;\n\n const normalizedOffers = subscriptionOffers ?? [];\n const purchaseToken = purchaseTokenInput ?? undefined;\n\n const result = (await invokeNativeWithPurchaseError(\n () =>\n ExpoIapModule.requestPurchase({\n type: native,\n skus,\n purchaseToken,\n originalExternalTransactionId:\n originalExternalTransactionId ?? undefined,\n obfuscatedAccountId: obfuscatedAccountId,\n obfuscatedProfileId: obfuscatedProfileId,\n subscriptionOffers: normalizedOffers,\n isOfferPersonalized: isOfferPersonalized ?? false,\n developerBillingOption: developerBillingOption ?? undefined,\n subscriptionProductReplacementParams:\n subscriptionProductReplacementParams ?? undefined,\n }),\n 'android',\n {\n code: ErrorCode.PurchaseError,\n message: 'Failed to request purchase',\n productId: skus[0],\n productIds: skus,\n productType: canonical,\n },\n )) as Purchase[];\n\n return result;\n }\n\n throw new Error(\n \"Invalid request for Android: Expected a valid request object with 'skus' array.\",\n );\n }\n\n throw unsupportedPlatformError();\n};\n\n/**\n * Complete a purchase transaction. Call after server-side verification to remove it\n * from the queue.\n *\n * @param args.purchase The `Purchase` to finalize.\n * @param args.isConsumable `true` for consumables (consumes the token so the SKU can be\n * re-bought, e.g. coins); `false` (default) for non-consumables and subscriptions.\n * @returns Promise that resolves once the platform finalizes the transaction.\n * @throws When the platform finalize call fails.\n *\n * @example\n * ```ts\n * // Inside purchaseUpdatedListener:\n * if (await verifyOnServer(purchase)) {\n * await finishTransaction({ purchase, isConsumable: false });\n * }\n * ```\n *\n * @remarks **Critical:** Android purchases must be finalized within 3 days or Google\n * auto-refunds. iOS unfinished transactions replay on every app launch.\n *\n * @see {@link https://openiap.dev/docs/apis/finish-transaction}\n */\nexport const finishTransaction: MutationField<'finishTransaction'> = async ({\n purchase,\n isConsumable = false,\n}) => {\n if (Platform.OS === 'ios') {\n await ExpoIapModule.finishTransaction(purchase, isConsumable);\n return;\n }\n\n if (isAndroidStoreRuntime()) {\n const token = purchase.purchaseToken ?? undefined;\n\n if (!token) {\n throw createPurchaseError({\n message: 'Purchase token is required to finish transaction',\n code: ErrorCode.DeveloperError,\n productId: purchase.productId,\n platform: 'android',\n });\n }\n\n if (isConsumable) {\n await ExpoIapModule.consumePurchaseAndroid(token);\n return;\n }\n\n await ExpoIapModule.acknowledgePurchaseAndroid(token);\n return;\n }\n\n throw unsupportedPlatformError();\n};\n\n/**\n * Restore completed transactions (cross-platform behavior)\n *\n * - iOS: perform a lightweight sync, or Onside restore when OnsideKit is active,\n * then fetch available purchases to surface restored items to the app.\n * - Android: simply fetch available purchases (restoration happens via query).\n *\n * This helper triggers the refresh flows but does not return the purchases; consumers should\n * call `getAvailablePurchases` or rely on hook state to inspect the latest items.\n *\n * @see {@link https://openiap.dev/docs/apis/restore-purchases}\n */\nexport const restorePurchases: MutationField<'restorePurchases'> = async () => {\n if (Platform.OS === 'ios') {\n const nativeModule = ExpoIapModule as any;\n\n if (\n nativeModule.USING_ONSIDE_SDK &&\n typeof nativeModule.restorePurchases === 'function'\n ) {\n await nativeModule.restorePurchases().catch(() => undefined);\n } else {\n await syncIOS().catch(() => undefined);\n }\n }\n\n await getAvailablePurchases({\n alsoPublishToEventListenerIOS: false,\n onlyIncludeActiveItemsIOS: true,\n });\n};\n\n/**\n * Deeplinks to native interface that allows users to manage their subscriptions\n * @param options.skuAndroid - Required for Android to locate specific subscription (ignored on iOS)\n * @param options.packageNameAndroid - Required for Android to identify your app (ignored on iOS)\n *\n * @returns Promise that resolves when the deep link is successfully opened\n *\n * @throws {Error} When called on unsupported platform or when required Android parameters are missing\n *\n * @example\n * import { deepLinkToSubscriptions } from 'expo-iap';\n *\n * // Works on both iOS and Android\n * await deepLinkToSubscriptions({\n * skuAndroid: 'your_subscription_sku',\n * packageNameAndroid: 'com.example.app'\n * });\n *\n * @see {@link https://openiap.dev/docs/apis/deep-link-to-subscriptions}\n */\nexport const deepLinkToSubscriptions: MutationField<\n 'deepLinkToSubscriptions'\n> = async (options) => {\n if (Platform.OS === 'ios') {\n await deepLinkToSubscriptionsIOS();\n return;\n }\n\n if (Platform.OS === 'android') {\n await deepLinkToSubscriptionsAndroid((options as DeepLinkOptions) ?? null);\n return;\n }\n\n throw unsupportedPlatformError();\n};\n\n/**\n * Verify purchase with the configured providers\n *\n * This function uses the native OpenIAP verifyPurchase implementation\n * which validates purchases using platform-specific methods.\n *\n * @param options - Receipt validation options containing the SKU\n * @returns Promise resolving to receipt validation result\n *\n * @see {@link https://openiap.dev/docs/features/validation#verify-purchase}\n */\nexport const verifyPurchase: MutationField<'verifyPurchase'> = async (\n options,\n) => {\n if (!isStorePlatform()) {\n throw unsupportedPlatformError();\n }\n\n return ExpoIapModule.verifyPurchase(options);\n};\n\n/**\n * Verify purchase with a specific provider (e.g., IAPKit)\n *\n * This function allows you to verify purchases using external verification\n * services like IAPKit, which provide additional validation and security.\n *\n * @param options - Verification options including provider and credentials\n * @returns Promise resolving to provider-specific verification result\n *\n * @example\n * ```typescript\n * const result = await verifyPurchaseWithProvider({\n * provider: 'iapkit',\n * iapkit: {\n * apiKey: 'your-api-key',\n * // Choose exactly one store payload.\n * // apple: { jws: purchase.purchaseToken },\n * // google: { purchaseToken: purchase.purchaseToken },\n * amazon: {\n * userId: amazonUserId,\n * receiptId: purchase.purchaseToken,\n * sandbox: __DEV__,\n * }\n * }\n * });\n * ```\n *\n * @see {@link https://openiap.dev/docs/features/validation#verify-purchase-with-provider}\n */\nexport const verifyPurchaseWithProvider: MutationField<\n 'verifyPurchaseWithProvider'\n> = async (options) => {\n if (!isStoreRuntime()) {\n throw unsupportedPlatformError();\n }\n\n let resolvedOptions = options;\n\n if (\n resolvedOptions.provider === 'iapkit' &&\n resolvedOptions.iapkit &&\n !resolvedOptions.iapkit.apiKey\n ) {\n try {\n // Dynamically import expo-constants to avoid hard dependency\n const {default: Constants} = await import('expo-constants');\n const configApiKey = Constants.expoConfig?.extra?.iapkitApiKey;\n if (typeof configApiKey === 'string' && configApiKey.length > 0) {\n resolvedOptions = {\n ...resolvedOptions,\n iapkit: {\n ...resolvedOptions.iapkit,\n apiKey: configApiKey,\n },\n };\n }\n } catch {\n throw new Error(\n 'expo-constants is required for auto-filling iapkitApiKey from config. ' +\n 'Please install it: npx expo install expo-constants\\n' +\n 'Or provide apiKey directly in verifyPurchaseWithProvider options.',\n );\n }\n }\n\n const result = await ExpoIapModule.verifyPurchaseWithProvider(\n resolvedOptions,\n );\n if (result.iapkit == null) {\n return result;\n }\n\n const {clientPayload, productId, ...iapkit} = result.iapkit;\n return {\n ...result,\n iapkit: {\n ...iapkit,\n ...(clientPayload == null ? {} : {clientPayload}),\n ...(productId == null ? {} : {productId}),\n },\n };\n};\n\nexport * from './useIAP';\nexport {kitApi, KitApiError} from './kit-api';\nexport type {\n KitApiOptions,\n KitClientPayloadCache,\n KitClientPayloadOptions,\n KitClientPayloadResponse,\n KitProduct,\n KitProductClientPayload,\n KitProductOffer,\n KitProductPlatform,\n KitProductsOptions,\n KitProductsResponse,\n KitSubscription,\n EntitlementsResponse,\n StatusResponse,\n} from './kit-api';\nexport {\n ErrorCodeUtils,\n ErrorCodeMapping,\n createPurchaseError,\n createPurchaseErrorFromPlatform,\n} from './utils/errorMapping';\nexport type {\n PurchaseError as ExpoPurchaseError,\n PurchaseErrorProps,\n} from './utils/errorMapping';\nexport {ExpoIapConsole} from './utils/debug';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["// External dependencies\nimport {Platform} from 'react-native';\n\n// Internal modules\nimport ExpoIapModule, {getNativeModule} from './ExpoIapModule';\nimport {isVegaOS} from './vega';\nimport {isProductIOS, deepLinkToSubscriptionsIOS} from './modules/ios';\nimport {\n isProductAndroid,\n deepLinkToSubscriptionsAndroid,\n} from './modules/android';\nimport {ExpoIapConsole} from './utils/debug';\nimport {restorePurchasesIOSNative} from './utils/restorePurchases';\nimport {\n decodeAndroidPurchases,\n decodeApplePurchases,\n} from './utils/availablePurchases';\n\n// Types\nimport type {\n ActiveSubscription,\n DeepLinkOptions,\n DeveloperProvidedBillingDetailsAndroid,\n IapPlatform,\n MutationField,\n MutationRequestPurchaseArgs,\n Product,\n ProductQueryType,\n ProductSubscription,\n Purchase,\n PurchaseOptions,\n PurchaseUpdatedListenerOptions,\n QueryField,\n RequestPurchasePropsByPlatforms,\n RequestPurchaseAndroidProps,\n RequestPurchaseIosProps,\n RequestSubscriptionPropsByPlatforms,\n RequestSubscriptionAndroidProps,\n RequestSubscriptionIosProps,\n UserChoiceBillingDetails,\n} from './types';\nimport {ErrorCode} from './types';\nimport {\n createPurchaseError,\n createPurchaseErrorFromNativeException,\n OPENIAP_ERROR_ENVELOPE_PREFIX,\n type PurchaseError,\n type PurchaseErrorProps,\n} from './utils/errorMapping';\n\n// Export all types\nexport * from './types';\nexport * from './modules/android';\nexport * from './modules/ios';\nexport * from './onside';\nexport * from './vega';\n\n// Get the native constant value\nexport enum OpenIapEvent {\n PurchaseUpdated = 'purchase-updated',\n PurchaseError = 'purchase-error',\n PromotedProductIOS = 'promoted-product-ios',\n UserChoiceBillingAndroid = 'user-choice-billing-android',\n /**\n * Fired for External Payments (8.3.0+) and Billing Choice (9.1.0+)\n * developer billing flows. Nullable fields depend on the selected flow.\n */\n DeveloperProvidedBillingAndroid = 'developer-provided-billing-android',\n /**\n * Fired when a subscription enters a billing-issue state (cross-platform).\n * Unifies StoreKit 2 `Message.Reason.billingIssue` (iOS / Mac Catalyst 16.4+, visionOS 1.0+) and Play Billing 8.1+\n * `Purchase.isSuspended`. NOT fired on the Meta Horizon flavor.\n */\n SubscriptionBillingIssue = 'subscription-billing-issue',\n}\n\ntype ExpoIapEventPayloads = {\n [OpenIapEvent.PurchaseUpdated]: Purchase;\n [OpenIapEvent.PurchaseError]: PurchaseError;\n [OpenIapEvent.PromotedProductIOS]:\n | Product\n | string\n | {id?: string; productId?: string};\n [OpenIapEvent.UserChoiceBillingAndroid]: UserChoiceBillingDetails;\n [OpenIapEvent.DeveloperProvidedBillingAndroid]: DeveloperProvidedBillingDetailsAndroid;\n [OpenIapEvent.SubscriptionBillingIssue]: Purchase;\n};\n\ntype ExpoIapEventListener<E extends OpenIapEvent> = (\n payload: ExpoIapEventPayloads[E],\n) => void;\n\ntype ExpoIapEmitter = {\n addListener<E extends OpenIapEvent>(\n eventName: E,\n listener: ExpoIapEventListener<E>,\n ): {remove: () => void};\n removeListener<E extends OpenIapEvent>(\n eventName: E,\n listener: ExpoIapEventListener<E>,\n ): void;\n};\n\ntype NativePurchaseUpdatedOptionsModule = {\n setPurchaseUpdatedListenerOptions?: (\n options?: PurchaseUpdatedListenerOptions | null,\n ) => Promise<void>;\n};\n\nconst isStorePlatform = (): boolean =>\n Platform.OS === 'ios' || Platform.OS === 'android';\n\nconst isStoreRuntime = (): boolean =>\n Platform.OS === 'ios' || isAndroidStoreRuntime();\n\nconst unsupportedPlatformError = (): Error =>\n new Error(`Unsupported platform: ${Platform.OS}`);\n\n// Use the raw native module for listener calls — JSI HostObjects require the\n// real native module as `this` when calling addListener. Using a Proxy as\n// `this` triggers \"native state unsupported on Proxy\" on New Architecture / Hermes.\n// Resolved lazily so importing this module doesn't throw on unsupported platforms.\nexport const emitter: ExpoIapEmitter = {\n addListener(eventName, listener) {\n const nativeModule = getNativeModule();\n const nativeSubscription = nativeModule.addListener(eventName, listener);\n let removed = false;\n\n return {\n remove: () => {\n if (removed) {\n return;\n }\n removed = true;\n\n if (typeof nativeSubscription?.remove === 'function') {\n nativeSubscription.remove();\n return;\n }\n\n nativeModule.removeListener?.(eventName, listener);\n },\n };\n },\n removeListener(eventName, listener) {\n return getNativeModule().removeListener?.(eventName, listener);\n },\n};\n\nlet nonDedupingPurchaseUpdatedListenerCountIOS = 0;\nconst purchaseUpdatedDedupeHistoryLimitIOS = 512;\nconst purchaseUpdatedDedupeHistoryIOS = {\n ids: new Set<string>(),\n order: [] as string[],\n start: 0,\n};\nlet purchaseUpdatedDedupeGenerationIOS = 0;\n\ntype PurchaseUpdatedDedupeHistoryIOS = {\n ids: Set<string>;\n order: string[];\n start: number;\n};\n\nconst purchaseUpdatedTransactionIdIOS = (purchase: Purchase) => {\n if (typeof purchase.id === 'string' && purchase.id.length > 0) {\n return purchase.id;\n }\n return null;\n};\n\nconst rememberPurchaseUpdatedTransactionIOS = (\n transactionId: string,\n history: PurchaseUpdatedDedupeHistoryIOS,\n) => {\n if (history.ids.has(transactionId)) {\n return;\n }\n\n history.ids.add(transactionId);\n history.order.push(transactionId);\n if (\n history.order.length - history.start >\n purchaseUpdatedDedupeHistoryLimitIOS\n ) {\n const evicted = history.order[history.start];\n history.start += 1;\n if (evicted != null) {\n history.ids.delete(evicted);\n }\n if (history.start > 128 && history.start * 2 > history.order.length) {\n history.order = history.order.slice(history.start);\n history.start = 0;\n }\n }\n};\n\nconst clearPurchaseUpdatedDedupeHistoryIOS = (\n history: PurchaseUpdatedDedupeHistoryIOS,\n) => {\n history.ids.clear();\n history.order.length = 0;\n history.start = 0;\n};\n\nconst resetPurchaseUpdatedDedupeHistoryIOS = () => {\n clearPurchaseUpdatedDedupeHistoryIOS(purchaseUpdatedDedupeHistoryIOS);\n purchaseUpdatedDedupeGenerationIOS += 1;\n};\n\nconst configurePurchaseUpdatedListenerOptionsIOS = (\n dedupeTransactionIOS: boolean,\n) => {\n if (Platform.OS !== 'ios') return;\n\n const nativeModule = getNativeModule() as NativePurchaseUpdatedOptionsModule;\n const promise = nativeModule.setPurchaseUpdatedListenerOptions?.({\n dedupeTransactionIOS,\n });\n void promise?.catch((error: unknown) => {\n ExpoIapConsole.warn(\n 'Failed to configure purchase updated listener options:',\n error,\n );\n });\n};\n\nexport type ProductTypeInput = ProductQueryType;\n\nconst normalizeProductType = (type?: ProductTypeInput) => {\n if (!type || type === 'in-app') {\n return {\n canonical: 'in-app' as ProductQueryType,\n native: 'in-app' as const,\n };\n }\n if (type === 'subs') {\n return {\n canonical: 'subs' as ProductQueryType,\n native: 'subs' as const,\n };\n }\n if (type === 'all') {\n return {\n canonical: 'all' as ProductQueryType,\n native: 'all' as const,\n };\n }\n throw new Error(`Unsupported product type: ${type}`);\n};\n\nconst isAndroidStoreRuntime = (): boolean => {\n return Platform.OS === 'android' || isVegaOS();\n};\n\nexport const purchaseUpdatedListener = (\n listener: (event: Purchase) => void,\n options?: PurchaseUpdatedListenerOptions | null,\n) => {\n const receiveDuplicateTransactionUpdatesIOS =\n Platform.OS === 'ios' && options?.dedupeTransactionIOS === false;\n const listenerDedupeHistoryIOS: PurchaseUpdatedDedupeHistoryIOS = {\n ids: new Set(purchaseUpdatedDedupeHistoryIOS.ids),\n order: purchaseUpdatedDedupeHistoryIOS.order.slice(\n purchaseUpdatedDedupeHistoryIOS.start,\n ),\n start: 0,\n };\n let listenerDedupeGenerationIOS = purchaseUpdatedDedupeGenerationIOS;\n\n const wrappedListener = (event: Purchase) => {\n const normalized = event;\n if (Platform.OS === 'ios') {\n if (listenerDedupeGenerationIOS !== purchaseUpdatedDedupeGenerationIOS) {\n clearPurchaseUpdatedDedupeHistoryIOS(listenerDedupeHistoryIOS);\n listenerDedupeGenerationIOS = purchaseUpdatedDedupeGenerationIOS;\n }\n const transactionId = purchaseUpdatedTransactionIdIOS(normalized);\n if (transactionId != null) {\n const isDuplicateForListener =\n listenerDedupeHistoryIOS.ids.has(transactionId);\n rememberPurchaseUpdatedTransactionIOS(\n transactionId,\n listenerDedupeHistoryIOS,\n );\n rememberPurchaseUpdatedTransactionIOS(\n transactionId,\n purchaseUpdatedDedupeHistoryIOS,\n );\n if (!receiveDuplicateTransactionUpdatesIOS && isDuplicateForListener) {\n return;\n }\n }\n }\n listener(normalized);\n };\n const emitterSubscription = emitter.addListener(\n OpenIapEvent.PurchaseUpdated,\n wrappedListener,\n );\n\n if (!receiveDuplicateTransactionUpdatesIOS) {\n return emitterSubscription;\n }\n\n nonDedupingPurchaseUpdatedListenerCountIOS += 1;\n configurePurchaseUpdatedListenerOptionsIOS(false);\n let removed = false;\n\n return {\n remove: () => {\n if (removed) {\n return;\n }\n removed = true;\n try {\n emitterSubscription?.remove?.();\n } finally {\n nonDedupingPurchaseUpdatedListenerCountIOS = Math.max(\n 0,\n nonDedupingPurchaseUpdatedListenerCountIOS - 1,\n );\n configurePurchaseUpdatedListenerOptionsIOS(\n nonDedupingPurchaseUpdatedListenerCountIOS === 0,\n );\n }\n },\n };\n};\n\nexport const purchaseErrorListener = (\n listener: (error: PurchaseError) => void,\n) => {\n const wrappedListener = (error: PurchaseError) => {\n listener(error);\n };\n const emitterSubscription = emitter.addListener(\n OpenIapEvent.PurchaseError,\n wrappedListener,\n );\n return emitterSubscription;\n};\n\n/**\n * iOS-only listener for App Store promoted product events.\n * This fires when a user taps on a promoted product in the App Store.\n *\n * @param listener - Callback function that receives the promoted product details\n * @returns EventSubscription that can be used to unsubscribe\n *\n * @example\n * ```typescript\n * const subscription = promotedProductListenerIOS((product) => {\n * console.log('Promoted product:', product);\n * // Handle the promoted product\n * });\n *\n * // Later, clean up\n * subscription.remove();\n * ```\n *\n * @platform iOS\n */\nexport const promotedProductListenerIOS = (\n listener: (product: Product) => void,\n) => {\n if (Platform.OS !== 'ios') {\n ExpoIapConsole.warn(\n 'promotedProductListenerIOS: This listener is only available on iOS',\n );\n return {remove: () => {}};\n }\n\n let deliveredProductId: string | undefined;\n const deliver = (product: Product) => {\n const productId =\n product.id ?? (product as Product & {productId?: string}).productId;\n if (productId && productId === deliveredProductId) {\n return;\n }\n deliveredProductId = productId;\n listener(product);\n };\n\n const replayPendingProduct = () => {\n let pendingProduct: Promise<Product | null> | undefined;\n try {\n pendingProduct = ExpoIapModule.getPromotedProductIOS() as\n | Promise<Product | null>\n | undefined;\n } catch {\n return Promise.resolve();\n }\n\n if (!pendingProduct || typeof pendingProduct.then !== 'function') {\n return Promise.resolve();\n }\n\n return pendingProduct\n .then((product: Product | null) => {\n if (product) {\n deliver(product);\n }\n })\n .catch(() => {});\n };\n\n const subscription = emitter.addListener(\n OpenIapEvent.PromotedProductIOS,\n (payload) => {\n if (typeof payload === 'string') {\n void replayPendingProduct();\n return;\n }\n\n deliver(payload as Product);\n },\n );\n\n void replayPendingProduct();\n\n return subscription;\n};\n\n/**\n * Android-only listener for User Choice Billing events.\n * This fires when a user selects alternative billing instead of Google Play billing\n * in the User Choice Billing dialog (only in 'user-choice' mode).\n *\n * @param listener - Callback function that receives the external transaction token and product IDs\n * @returns EventSubscription that can be used to unsubscribe\n *\n * @example\n * ```typescript\n * const subscription = userChoiceBillingListenerAndroid((details) => {\n * console.log('User selected alternative billing');\n * console.log('External transaction token received; send it to your backend without logging it.');\n * console.log('Products:', details.products);\n *\n * // Process payment in your system, then report token to Google\n * await processPaymentAndReportToken(details);\n * });\n *\n * // Later, clean up\n * subscription.remove();\n * ```\n *\n * @platform Android\n */\nexport const userChoiceBillingListenerAndroid = (\n listener: (details: UserChoiceBillingDetails) => void,\n) => {\n if (Platform.OS !== 'android') {\n ExpoIapConsole.warn(\n 'userChoiceBillingListenerAndroid: This listener is only available on Android',\n );\n return {remove: () => {}};\n }\n return emitter.addListener(OpenIapEvent.UserChoiceBillingAndroid, listener);\n};\n\n/**\n * Android-only listener for Developer Provided Billing events.\n * This fires when a user selects the developer's option in an External Payments\n * or Billing Choice purchase flow.\n *\n * Requires Google Play Billing Library 8.3.0+; Billing Choice fields require 9.1.0+.\n *\n * @param listener - Callback that receives selected products and flow details\n * @returns EventSubscription that can be used to unsubscribe\n *\n * @example\n * ```typescript\n * const subscription = developerProvidedBillingListenerAndroid(async (details) => {\n * await processPaymentWithYourGateway(details.products, details.linkUri);\n * if (details.externalTransactionToken) {\n * await reportExternalTransactionToGoogle(details.externalTransactionToken);\n * }\n * });\n *\n * // Later, clean up\n * subscription.remove();\n * ```\n *\n * @platform Android (8.3.0+; Billing Choice 9.1.0+)\n */\nexport const developerProvidedBillingListenerAndroid = (\n listener: (details: DeveloperProvidedBillingDetailsAndroid) => void,\n) => {\n if (Platform.OS !== 'android') {\n ExpoIapConsole.warn(\n 'developerProvidedBillingListenerAndroid: This listener is only available on Android',\n );\n return {remove: () => {}};\n }\n return emitter.addListener(\n OpenIapEvent.DeveloperProvidedBillingAndroid,\n listener,\n );\n};\n\n/**\n * Listen for subscription billing-issue events (cross-platform).\n *\n * Fires when a user's active subscription enters a state that needs attention\n * for a payment problem. Unifies:\n * - iOS / Mac Catalyst 16.4+ and visionOS 1.0+: StoreKit 2 `Message.Reason.billingIssue`.\n * - Android (Play Billing 8.1+): when `Purchase.isSuspendedAndroid === true`.\n * - Meta Horizon / iOS 17 / older platforms: never fires.\n *\n * Recommended UX: call `deepLinkToSubscriptions()` when this fires so the user\n * can update their payment method in the platform subscription center.\n *\n * @example\n * ```typescript\n * const subscription = subscriptionBillingIssueListener((purchase) => {\n * console.warn('Needs attention:', purchase.productId);\n * deepLinkToSubscriptions({\n * skuAndroid: purchase.productId,\n * packageNameAndroid: 'com.example.app',\n * });\n * });\n * ```\n */\nexport const subscriptionBillingIssueListener = (\n listener: (purchase: Purchase) => void,\n) => {\n const wrappedListener = (event: Purchase) => {\n listener(event);\n };\n return emitter.addListener(\n OpenIapEvent.SubscriptionBillingIssue,\n wrappedListener,\n );\n};\n\n/**\n * Initialize the store connection. Must be called before any other IAP API.\n *\n * @param config Optional connection config. Use `enableBillingProgramAndroid` (Android,\n * Play Billing 8.2.0+) to opt into a billing program. For Billing Choice 9.1.0+, set\n * `billingChoiceScreenTypeAndroid` to the renderer configured in Play Console.\n * iOS ignores Android-specific fields.\n * @returns Promise resolving to `true` when the platform billing client is connected.\n * @throws When the platform billing client fails to initialize.\n *\n * @example\n * ```ts\n * await initConnection();\n * await initConnection({ enableBillingProgramAndroid: 'external-offer' });\n * await initConnection({\n * enableBillingProgramAndroid: 'billing-choice',\n * billingChoiceScreenTypeAndroid: 'developer-rendered',\n * });\n * ```\n *\n * @remarks When using `useIAP()`, connection is auto-managed on mount/unmount —\n * pass options to the hook instead of calling this directly.\n *\n * @see {@link https://openiap.dev/docs/apis/init-connection}\n */\nexport const initConnection: MutationField<'initConnection'> = async (\n config,\n) => {\n const result = await ExpoIapModule.initConnection(config ?? null);\n if (\n result === true &&\n Platform.OS === 'ios' &&\n nonDedupingPurchaseUpdatedListenerCountIOS > 0\n ) {\n configurePurchaseUpdatedListenerOptionsIOS(false);\n }\n return result;\n};\n\n/**\n * Close the store connection and release resources.\n *\n * @see {@link https://openiap.dev/docs/apis/end-connection}\n */\nexport const endConnection: MutationField<'endConnection'> = async () => {\n const result = await ExpoIapModule.endConnection();\n if (result === true && Platform.OS === 'ios') {\n resetPurchaseUpdatedDedupeHistoryIOS();\n }\n return result;\n};\n\nconst invokeNativeWithPurchaseError = async <T>(\n operation: () => Promise<T>,\n platform: IapPlatform,\n fallback: PurchaseErrorProps,\n): Promise<T> => {\n try {\n return await operation();\n } catch (error) {\n const nativeError =\n typeof error === 'object' && error !== null\n ? (error as Record<string, unknown>)\n : undefined;\n const nativeMessage =\n typeof nativeError?.message === 'string'\n ? nativeError.message\n : typeof error === 'string'\n ? error\n : '';\n const hasCanonicalFields =\n nativeMessage.includes(OPENIAP_ERROR_ENVELOPE_PREFIX) ||\n nativeError?.code !== undefined ||\n nativeError?.responseCode !== undefined ||\n nativeError?.debugMessage !== undefined ||\n nativeError?.productId !== undefined ||\n nativeError?.productIds !== undefined;\n\n // Preserve the identity of unrelated JavaScript errors (including adapter\n // or test errors) while normalizing native OpenIAP rejections.\n if (!hasCanonicalFields) throw error;\n throw createPurchaseErrorFromNativeException(error, platform, fallback);\n }\n};\n\n/**\n * Retrieve products or subscriptions from the store by SKU.\n *\n * @param request `ProductRequest` — `skus` (string[]) and optional `type`\n * (`'in-app' | 'subs' | 'all'`, defaults to `'in-app'`).\n * @returns Promise resolving to a `FetchProductsResult` union — `Product[]` for `'in-app'`,\n * `ProductSubscription[]` for `'subs'`, or a mixed array for `'all'`.\n * @throws When the store rejects the request (empty `skus`, not connected,\n * network/store error). Unknown SKUs are simply omitted from the result, not thrown.\n *\n * @example\n * ```ts\n * const products = await fetchProducts({\n * skus: ['com.app.coins_100', 'com.app.premium'],\n * type: 'in-app',\n * });\n * ```\n *\n * @remarks This is a regular promise-based call. Don't confuse with `request*` APIs\n * (`requestPurchase`), which are event-based.\n *\n * @see {@link https://openiap.dev/docs/apis/fetch-products}\n */\nexport const fetchProducts: QueryField<'fetchProducts'> = async (request) => {\n ExpoIapConsole.debug('fetchProducts called with:', request);\n const {skus, type} = request ?? {};\n\n if (!Array.isArray(skus) || skus.length === 0) {\n throw createPurchaseError({\n message: 'No SKUs provided',\n code: ErrorCode.EmptySkuList,\n });\n }\n\n const {canonical, native} = normalizeProductType(\n type as ProductTypeInput | undefined,\n );\n const skuSet = new Set(skus);\n\n const filterIosItems = (\n items: unknown[],\n ): (Product | ProductSubscription)[] =>\n items.filter((item): item is Product | ProductSubscription => {\n if (!isProductIOS(item)) {\n return false;\n }\n const candidate = item as Product | ProductSubscription;\n return typeof candidate.id === 'string' && skuSet.has(candidate.id);\n });\n\n const filterAndroidItems = (\n items: unknown[],\n ): (Product | ProductSubscription)[] =>\n items.filter((item): item is Product | ProductSubscription => {\n if (!isProductAndroid(item)) {\n return false;\n }\n const candidate = item as Product | ProductSubscription;\n return typeof candidate.id === 'string' && skuSet.has(candidate.id);\n });\n\n const castResult = (\n items: (Product | ProductSubscription)[],\n ):\n | (Product | ProductSubscription)[]\n | Product[]\n | ProductSubscription[]\n | null => {\n if (canonical === 'in-app') {\n return items as Product[];\n }\n if (canonical === 'subs') {\n return items as ProductSubscription[];\n }\n // For 'all' type, items contain both Product and ProductSubscription\n // Return as ProductOrSubscription[] to preserve discriminated union\n return items;\n };\n\n if (Platform.OS === 'ios') {\n const rawItems = await invokeNativeWithPurchaseError<unknown[]>(\n () => ExpoIapModule.fetchProducts({skus, type: native}),\n 'ios',\n {\n code: ErrorCode.QueryProduct,\n message: 'Failed to query products',\n productIds: skus,\n productType: canonical,\n },\n );\n return castResult(filterIosItems(rawItems));\n }\n\n if (isAndroidStoreRuntime()) {\n const rawItems = await invokeNativeWithPurchaseError<unknown[]>(\n () => ExpoIapModule.fetchProducts(native, skus),\n 'android',\n {\n code: ErrorCode.QueryProduct,\n message: 'Failed to query products',\n productIds: skus,\n productType: canonical,\n },\n );\n return castResult(filterAndroidItems(rawItems));\n }\n\n throw unsupportedPlatformError();\n};\n\n/**\n * List the user's unfinished purchases — non-consumables, active subscriptions, and any\n * pending transactions not yet finished.\n *\n * @param options Optional `PurchaseOptions`. iOS-only flags:\n * `alsoPublishToEventListenerIOS`, `onlyIncludeActiveItemsIOS`.\n * @returns Promise resolving to an array of `Purchase` currently held by the store.\n * @throws When the platform query fails.\n *\n * @example\n * ```ts\n * const purchases = await getAvailablePurchases();\n * for (const p of purchases) {\n * if (await verifyOnServer(p)) await finishTransaction({ purchase: p, isConsumable: false });\n * }\n * ```\n *\n * @see {@link https://openiap.dev/docs/apis/get-available-purchases}\n */\nexport const getAvailablePurchases: QueryField<\n 'getAvailablePurchases'\n> = async (options) => {\n const normalizedOptions: PurchaseOptions = {\n alsoPublishToEventListenerIOS:\n options?.alsoPublishToEventListenerIOS ?? false,\n onlyIncludeActiveItemsIOS: options?.onlyIncludeActiveItemsIOS ?? true,\n includeSuspendedAndroid: options?.includeSuspendedAndroid ?? false,\n };\n\n if (isVegaOS()) {\n const purchases = await ExpoIapModule.getAvailableItems(normalizedOptions);\n return decodeAndroidPurchases(purchases);\n }\n\n let purchases: Purchase[];\n\n if (Platform.OS === 'ios') {\n purchases = (await ExpoIapModule.getAvailableItems(\n normalizedOptions.alsoPublishToEventListenerIOS,\n normalizedOptions.onlyIncludeActiveItemsIOS,\n )) as Purchase[];\n } else if (Platform.OS === 'android') {\n purchases = (await ExpoIapModule.getAvailableItems(\n normalizedOptions,\n )) as Purchase[];\n } else {\n throw unsupportedPlatformError();\n }\n\n return Platform.OS === 'ios'\n ? decodeApplePurchases(purchases)\n : decodeAndroidPurchases(purchases);\n};\n\n/**\n * Get all active subscriptions with detailed information.\n * Uses native OpenIAP module for accurate subscription status and renewal info.\n *\n * On iOS: Returns subscriptions with renewalInfoIOS containing pendingUpgradeProductId,\n * willAutoRenew, autoRenewPreference, and other renewal details.\n *\n * On Android: Filters available purchases to find active subscriptions (fallback implementation).\n *\n * @param subscriptionIds - Optional array of subscription product IDs to filter. If not provided, returns all active subscriptions.\n * @returns Promise resolving to array of active subscriptions with details\n *\n * @example\n * ```typescript\n * // Get all active subscriptions\n * const subs = await getActiveSubscriptions();\n *\n * // Get specific subscriptions\n * const premiumSubs = await getActiveSubscriptions(['premium', 'premium_year']);\n *\n * // Check for pending upgrades (iOS)\n * subs.forEach(sub => {\n * if (sub.renewalInfoIOS?.pendingUpgradeProductId) {\n * console.log(`Upgrade pending to: ${sub.renewalInfoIOS.pendingUpgradeProductId}`);\n * }\n * });\n * ```\n *\n * @see {@link https://openiap.dev/docs/apis/get-active-subscriptions}\n */\nexport const getActiveSubscriptions: QueryField<\n 'getActiveSubscriptions'\n> = async (subscriptionIds) => {\n if (!isStoreRuntime()) {\n throw unsupportedPlatformError();\n }\n\n const result = await ExpoIapModule.getActiveSubscriptions(\n subscriptionIds ?? null,\n );\n return (result ?? []) as ActiveSubscription[];\n};\n\n/**\n * Check if user has any active subscriptions.\n *\n * @param subscriptionIds - Optional array of subscription product IDs to check. If not provided, checks all subscriptions.\n * @returns Promise resolving to true if user has at least one active subscription\n *\n * @example\n * ```typescript\n * // Check any active subscription\n * const hasAny = await hasActiveSubscriptions();\n *\n * // Check specific subscriptions\n * const hasPremium = await hasActiveSubscriptions(['premium', 'premium_year']);\n * ```\n *\n * @see {@link https://openiap.dev/docs/apis/has-active-subscriptions}\n */\nexport const hasActiveSubscriptions: QueryField<\n 'hasActiveSubscriptions'\n> = async (subscriptionIds) => {\n if (!isStoreRuntime()) {\n throw unsupportedPlatformError();\n }\n\n return !!(await ExpoIapModule.hasActiveSubscriptions(\n subscriptionIds ?? null,\n ));\n};\n\n/**\n * Return the user's storefront country code.\n *\n * @see {@link https://openiap.dev/docs/apis/get-storefront}\n */\nexport const getStorefront: QueryField<'getStorefront'> = async () => {\n if (Platform.OS !== 'ios' && !isAndroidStoreRuntime()) {\n throw createPurchaseError({\n code: ErrorCode.FeatureNotSupported,\n message: `Storefront lookup is not supported on ${Platform.OS}.`,\n });\n }\n\n const platform: IapPlatform = Platform.OS === 'ios' ? 'ios' : 'android';\n if (typeof ExpoIapModule.getStorefront !== 'function') {\n throw createPurchaseError({\n code: ErrorCode.FeatureNotSupported,\n message: 'Native getStorefront is not available on this build.',\n platform,\n });\n }\n\n let storefront: unknown;\n try {\n storefront = await ExpoIapModule.getStorefront();\n } catch (error) {\n throw createPurchaseErrorFromNativeException(error, platform, {\n code: ErrorCode.ServiceError,\n message: 'Failed to get storefront.',\n debugMessage: error instanceof Error ? error.message : String(error),\n });\n }\n\n if (typeof storefront !== 'string' || storefront.trim().length === 0) {\n throw createPurchaseError({\n code: ErrorCode.ServiceError,\n message: 'Storefront lookup returned no country code.',\n platform,\n });\n }\n return storefront;\n};\n\n/**\n * Helper to normalize request props to platform-specific format\n */\nfunction normalizeRequestProps(\n request: RequestPurchasePropsByPlatforms,\n platform: 'ios',\n): RequestPurchaseIosProps | null | undefined;\nfunction normalizeRequestProps(\n request: RequestPurchasePropsByPlatforms,\n platform: 'android',\n): RequestPurchaseAndroidProps | null | undefined;\nfunction normalizeRequestProps(\n request: RequestSubscriptionPropsByPlatforms,\n platform: 'ios',\n): RequestSubscriptionIosProps | null | undefined;\nfunction normalizeRequestProps(\n request: RequestSubscriptionPropsByPlatforms,\n platform: 'android',\n): RequestSubscriptionAndroidProps | null | undefined;\nfunction normalizeRequestProps(\n request:\n | RequestPurchasePropsByPlatforms\n | RequestSubscriptionPropsByPlatforms,\n platform: 'ios' | 'android',\n) {\n if (platform === 'ios') {\n return request.apple;\n }\n return request.google;\n}\n\n/**\n * Initiate a purchase or subscription flow. The result is delivered through\n * `purchaseUpdatedListener` — NOT the return value.\n *\n * @param args `RequestPurchaseProps`, discriminated by `type`:\n * - `type: 'in-app'` — pass `request.apple.sku` (iOS) and/or `request.google.skus` (Android).\n * - `type: 'subs'` — same shape, plus `request.google.subscriptionOffers: [{ sku, offerToken }]`.\n * @returns The dispatched purchase payload. **Do not rely on it** for the actual outcome.\n * @throws Synchronous rejection from the store (e.g. `E_NOT_PREPARED`, validation failure).\n *\n * @example\n * ```ts\n * await requestPurchase({\n * request: {\n * apple: { sku: 'com.app.premium' },\n * google: { skus: ['com.app.premium'] },\n * },\n * type: 'in-app',\n * });\n * ```\n *\n * @remarks Event-based. Listen for the result via {@link purchaseUpdatedListener} /\n * {@link purchaseErrorListener}, or use `useIAP({ onPurchaseSuccess, onPurchaseError })`.\n *\n * @see {@link https://openiap.dev/docs/apis/request-purchase}\n */\nexport const requestPurchase: MutationField<'requestPurchase'> = async (\n args,\n) => {\n const {request, type} = args;\n const {canonical, native} = normalizeProductType(type as ProductTypeInput);\n const isInAppPurchase = canonical === 'in-app';\n\n if (Platform.OS === 'ios') {\n const normalizedRequest = normalizeRequestProps(request, 'ios');\n\n if (!normalizedRequest?.sku) {\n throw new Error(\n 'Invalid request for Apple. The `sku` property is required and must be a string.\\n\\n' +\n 'Expected format:\\n' +\n ' requestPurchase({\\n' +\n ' request: {\\n' +\n ' apple: { sku: \"product_id\" },\\n' +\n ' google: { skus: [\"product_id\"] }\\n' +\n ' },\\n' +\n ' type: \"in-app\"\\n' +\n ' })\\n\\n' +\n 'See: https://openiap.dev/docs/apis/request-purchase',\n );\n }\n\n if (canonical !== 'in-app' && canonical !== 'subs') {\n throw new Error(`Unsupported product type: ${canonical}`);\n }\n\n const payload: MutationRequestPurchaseArgs = {\n type: canonical === 'in-app' ? 'in-app' : 'subs',\n request: {apple: normalizedRequest},\n };\n\n const purchase = (await invokeNativeWithPurchaseError(\n () => ExpoIapModule.requestPurchase(payload),\n 'ios',\n {\n code: ErrorCode.PurchaseError,\n message: 'Failed to request purchase',\n productId: normalizedRequest.sku,\n productIds: [normalizedRequest.sku],\n productType: canonical,\n },\n )) as Purchase | Purchase[] | null;\n\n if (Array.isArray(purchase)) {\n return purchase;\n }\n\n if (purchase) {\n return purchase;\n }\n\n return canonical === 'subs' ? [] : null;\n }\n\n if (isAndroidStoreRuntime()) {\n if (isInAppPurchase) {\n const normalizedRequest = normalizeRequestProps(\n request as RequestPurchasePropsByPlatforms,\n 'android',\n ) as RequestPurchaseAndroidProps | null | undefined;\n\n if (!normalizedRequest?.skus?.length) {\n throw new Error(\n 'Invalid request for Google. The `skus` property is required and must be a non-empty array.\\n\\n' +\n 'Expected format:\\n' +\n ' requestPurchase({\\n' +\n ' request: {\\n' +\n ' apple: { sku: \"product_id\" },\\n' +\n ' google: { skus: [\"product_id\"] }\\n' +\n ' },\\n' +\n ' type: \"in-app\"\\n' +\n ' })\\n\\n' +\n 'See: https://openiap.dev/docs/apis/request-purchase',\n );\n }\n\n const {\n skus,\n obfuscatedAccountId,\n obfuscatedProfileId,\n isOfferPersonalized,\n offerToken,\n developerBillingOption,\n } = normalizedRequest;\n\n const result = (await invokeNativeWithPurchaseError(\n () =>\n ExpoIapModule.requestPurchase({\n type: native,\n skus,\n purchaseToken: undefined,\n obfuscatedAccountId: obfuscatedAccountId,\n obfuscatedProfileId: obfuscatedProfileId,\n offerToken: offerToken,\n developerBillingOption: developerBillingOption ?? undefined,\n isOfferPersonalized: isOfferPersonalized ?? false,\n }),\n 'android',\n {\n code: ErrorCode.PurchaseError,\n message: 'Failed to request purchase',\n productId: skus[0],\n productIds: skus,\n productType: canonical,\n },\n )) as Purchase[];\n\n return result;\n }\n\n if (canonical === 'subs') {\n const normalizedRequest = normalizeRequestProps(\n request as RequestSubscriptionPropsByPlatforms,\n 'android',\n ) as RequestSubscriptionAndroidProps | null | undefined;\n\n if (!normalizedRequest?.skus?.length) {\n throw new Error(\n 'Invalid request for Google. The `skus` property is required and must be a non-empty array.\\n\\n' +\n 'Expected format:\\n' +\n ' requestPurchase({\\n' +\n ' request: {\\n' +\n ' apple: { sku: \"subscription_id\" },\\n' +\n ' google: { skus: [\"subscription_id\"] }\\n' +\n ' },\\n' +\n ' type: \"subs\"\\n' +\n ' })\\n\\n' +\n 'See: https://openiap.dev/docs/apis/request-purchase',\n );\n }\n\n const {\n skus,\n obfuscatedAccountId,\n obfuscatedProfileId,\n isOfferPersonalized,\n subscriptionOffers,\n purchaseToken: purchaseTokenInput,\n originalExternalTransactionId,\n developerBillingOption,\n subscriptionProductReplacementParams,\n } = normalizedRequest;\n\n const normalizedOffers = subscriptionOffers ?? [];\n const purchaseToken = purchaseTokenInput ?? undefined;\n\n const result = (await invokeNativeWithPurchaseError(\n () =>\n ExpoIapModule.requestPurchase({\n type: native,\n skus,\n purchaseToken,\n originalExternalTransactionId:\n originalExternalTransactionId ?? undefined,\n obfuscatedAccountId: obfuscatedAccountId,\n obfuscatedProfileId: obfuscatedProfileId,\n subscriptionOffers: normalizedOffers,\n isOfferPersonalized: isOfferPersonalized ?? false,\n developerBillingOption: developerBillingOption ?? undefined,\n subscriptionProductReplacementParams:\n subscriptionProductReplacementParams ?? undefined,\n }),\n 'android',\n {\n code: ErrorCode.PurchaseError,\n message: 'Failed to request purchase',\n productId: skus[0],\n productIds: skus,\n productType: canonical,\n },\n )) as Purchase[];\n\n return result;\n }\n\n throw new Error(\n \"Invalid request for Android: Expected a valid request object with 'skus' array.\",\n );\n }\n\n throw unsupportedPlatformError();\n};\n\n/**\n * Complete a purchase transaction. Call after server-side verification to remove it\n * from the queue.\n *\n * @param args.purchase The `Purchase` to finalize.\n * @param args.isConsumable `true` for consumables (consumes the token so the SKU can be\n * re-bought, e.g. coins); `false` (default) for non-consumables and subscriptions.\n * @returns Promise that resolves once the platform finalizes the transaction.\n * @throws When the platform finalize call fails.\n *\n * @example\n * ```ts\n * // Inside purchaseUpdatedListener:\n * if (await verifyOnServer(purchase)) {\n * await finishTransaction({ purchase, isConsumable: false });\n * }\n * ```\n *\n * @remarks **Critical:** Android purchases must be finalized within 3 days or Google\n * auto-refunds. iOS unfinished transactions replay on every app launch.\n *\n * @see {@link https://openiap.dev/docs/apis/finish-transaction}\n */\nexport const finishTransaction: MutationField<'finishTransaction'> = async ({\n purchase,\n isConsumable = false,\n}) => {\n if (Platform.OS === 'ios') {\n await ExpoIapModule.finishTransaction(purchase, isConsumable);\n return;\n }\n\n if (isAndroidStoreRuntime()) {\n const token = purchase.purchaseToken ?? undefined;\n\n if (!token) {\n throw createPurchaseError({\n message: 'Purchase token is required to finish transaction',\n code: ErrorCode.DeveloperError,\n productId: purchase.productId,\n platform: 'android',\n });\n }\n\n if (isConsumable) {\n await ExpoIapModule.consumePurchaseAndroid(token);\n return;\n }\n\n await ExpoIapModule.acknowledgePurchaseAndroid(token);\n return;\n }\n\n throw unsupportedPlatformError();\n};\n\n/**\n * Restore completed transactions (cross-platform behavior)\n *\n * - iOS: perform a lightweight sync, or Onside restore when OnsideKit is active,\n * then fetch available purchases to surface restored items to the app.\n * - Android: simply fetch available purchases (restoration happens via query).\n *\n * This helper triggers the refresh flows but does not return the purchases; consumers should\n * call `getAvailablePurchases` or rely on hook state to inspect the latest items.\n *\n * @see {@link https://openiap.dev/docs/apis/restore-purchases}\n */\nexport const restorePurchases: MutationField<'restorePurchases'> = async () => {\n if (Platform.OS === 'ios') {\n await restorePurchasesIOSNative();\n }\n\n await getAvailablePurchases({\n alsoPublishToEventListenerIOS: false,\n onlyIncludeActiveItemsIOS: true,\n });\n};\n\n/**\n * Deeplinks to native interface that allows users to manage their subscriptions\n * @param options.skuAndroid - Required for Android to locate specific subscription (ignored on iOS)\n * @param options.packageNameAndroid - Required for Android to identify your app (ignored on iOS)\n *\n * @returns Promise that resolves when the deep link is successfully opened\n *\n * @throws {Error} When called on unsupported platform or when required Android parameters are missing\n *\n * @example\n * import { deepLinkToSubscriptions } from 'expo-iap';\n *\n * // Works on both iOS and Android\n * await deepLinkToSubscriptions({\n * skuAndroid: 'your_subscription_sku',\n * packageNameAndroid: 'com.example.app'\n * });\n *\n * @see {@link https://openiap.dev/docs/apis/deep-link-to-subscriptions}\n */\nexport const deepLinkToSubscriptions: MutationField<\n 'deepLinkToSubscriptions'\n> = async (options) => {\n if (Platform.OS === 'ios') {\n await deepLinkToSubscriptionsIOS();\n return;\n }\n\n if (Platform.OS === 'android') {\n await deepLinkToSubscriptionsAndroid((options as DeepLinkOptions) ?? null);\n return;\n }\n\n throw unsupportedPlatformError();\n};\n\n/**\n * Verify purchase with the configured providers\n *\n * This function uses the native OpenIAP verifyPurchase implementation\n * which validates purchases using platform-specific methods.\n *\n * @param options - Receipt validation options containing the SKU\n * @returns Promise resolving to receipt validation result\n *\n * @see {@link https://openiap.dev/docs/features/validation#verify-purchase}\n */\nexport const verifyPurchase: MutationField<'verifyPurchase'> = async (\n options,\n) => {\n if (!isStorePlatform()) {\n throw unsupportedPlatformError();\n }\n\n return ExpoIapModule.verifyPurchase(options);\n};\n\n/**\n * Verify purchase with a specific provider (e.g., IAPKit)\n *\n * This function allows you to verify purchases using external verification\n * services like IAPKit, which provide additional validation and security.\n *\n * @param options - Verification options including provider and credentials\n * @returns Promise resolving to provider-specific verification result\n *\n * @example\n * ```typescript\n * const result = await verifyPurchaseWithProvider({\n * provider: 'iapkit',\n * iapkit: {\n * apiKey: 'your-api-key',\n * // Choose exactly one store payload.\n * // apple: { jws: purchase.purchaseToken },\n * // google: { purchaseToken: purchase.purchaseToken },\n * amazon: {\n * userId: amazonUserId,\n * receiptId: purchase.purchaseToken,\n * sandbox: __DEV__,\n * }\n * }\n * });\n * ```\n *\n * @see {@link https://openiap.dev/docs/features/validation#verify-purchase-with-provider}\n */\nexport const verifyPurchaseWithProvider: MutationField<\n 'verifyPurchaseWithProvider'\n> = async (options) => {\n if (!isStoreRuntime()) {\n throw unsupportedPlatformError();\n }\n\n let resolvedOptions = options;\n\n if (\n resolvedOptions.provider === 'iapkit' &&\n resolvedOptions.iapkit &&\n !resolvedOptions.iapkit.apiKey\n ) {\n try {\n // Dynamically import expo-constants to avoid hard dependency\n const {default: Constants} = await import('expo-constants');\n const configApiKey = Constants.expoConfig?.extra?.iapkitApiKey;\n if (typeof configApiKey === 'string' && configApiKey.length > 0) {\n resolvedOptions = {\n ...resolvedOptions,\n iapkit: {\n ...resolvedOptions.iapkit,\n apiKey: configApiKey,\n },\n };\n }\n } catch {\n throw new Error(\n 'expo-constants is required for auto-filling iapkitApiKey from config. ' +\n 'Please install it: npx expo install expo-constants\\n' +\n 'Or provide apiKey directly in verifyPurchaseWithProvider options.',\n );\n }\n }\n\n const result = await ExpoIapModule.verifyPurchaseWithProvider(\n resolvedOptions,\n );\n if (result.iapkit == null) {\n return result;\n }\n\n const {clientPayload, productId, ...iapkit} = result.iapkit;\n return {\n ...result,\n iapkit: {\n ...iapkit,\n ...(clientPayload == null ? {} : {clientPayload}),\n ...(productId == null ? {} : {productId}),\n },\n };\n};\n\nexport * from './useIAP';\nexport {kitApi, KitApiError} from './kit-api';\nexport type {\n KitApiOptions,\n KitClientPayloadCache,\n KitClientPayloadOptions,\n KitClientPayloadResponse,\n KitProduct,\n KitProductClientPayload,\n KitProductOffer,\n KitProductPlatform,\n KitProductsOptions,\n KitProductsResponse,\n KitSubscription,\n EntitlementsResponse,\n StatusResponse,\n} from './kit-api';\nexport {\n ErrorCodeUtils,\n ErrorCodeMapping,\n createPurchaseError,\n createPurchaseErrorFromPlatform,\n} from './utils/errorMapping';\nexport type {\n PurchaseError as ExpoPurchaseError,\n PurchaseErrorProps,\n} from './utils/errorMapping';\nexport {ExpoIapConsole} from './utils/debug';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.kepler.d.ts","sourceRoot":"","sources":["../src/index.kepler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,aAAa,EAEb,8BAA8B,EAC9B,UAAU,EAGX,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.kepler.d.ts","sourceRoot":"","sources":["../src/index.kepler.ts"],"names":[],"mappings":"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"}
|
package/build/index.kepler.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getVegaIapModule } from './vega';
|
|
2
2
|
import { ErrorCode } from './types';
|
|
3
|
+
import { decodeAndroidPurchases } from './utils/availablePurchases';
|
|
3
4
|
export * from './types';
|
|
4
5
|
export * from './vega';
|
|
5
6
|
export * from './useIAP';
|
|
@@ -30,7 +31,7 @@ const normalizeProductType = (type) => {
|
|
|
30
31
|
return type;
|
|
31
32
|
throw new Error(`Unsupported product type: ${String(type)}. Use in-app, subs, or all.`);
|
|
32
33
|
};
|
|
33
|
-
const normalizePurchaseArray = (purchases) => purchases;
|
|
34
|
+
const normalizePurchaseArray = (purchases) => decodeAndroidPurchases(purchases);
|
|
34
35
|
const getAndroidRequest = (request) => {
|
|
35
36
|
return request?.google;
|
|
36
37
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.kepler.js","sourceRoot":"","sources":["../src/index.kepler.ts"],"names":[],"mappings":"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","sourcesContent":["import {getVegaIapModule} from './vega';\nimport {ErrorCode} from './types';\nimport type {\n MutationField,\n ProductQueryType,\n ProductRequest,\n Purchase,\n PurchaseError,\n PurchaseOptions,\n PurchaseUpdatedListenerOptions,\n QueryField,\n RequestPurchasePropsByPlatforms,\n RequestSubscriptionPropsByPlatforms,\n} from './types';\n\nexport * from './types';\nexport * from './vega';\nexport * from './useIAP';\nexport {kitApi, KitApiError} from './kit-api';\nexport type {\n EntitlementsResponse,\n KitApiOptions,\n KitClientPayloadCache,\n KitClientPayloadOptions,\n KitClientPayloadResponse,\n KitProduct,\n KitProductClientPayload,\n KitProductOffer,\n KitProductPlatform,\n KitProductsOptions,\n KitProductsResponse,\n KitSubscription,\n StatusResponse,\n} from './kit-api';\n\nexport enum OpenIapEvent {\n PurchaseUpdated = 'purchase-updated',\n PurchaseError = 'purchase-error',\n PromotedProductIOS = 'promoted-product-ios',\n UserChoiceBillingAndroid = 'user-choice-billing-android',\n DeveloperProvidedBillingAndroid = 'developer-provided-billing-android',\n SubscriptionBillingIssue = 'subscription-billing-issue',\n}\n\nexport type ProductTypeInput = ProductQueryType;\n\nexport interface EventSubscription {\n remove(): void;\n}\n\nconst getModule = () => {\n const module = getVegaIapModule();\n if (!module) {\n throw new Error(\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;\n};\n\nconst unsupported = (feature: string): never => {\n throw new Error(`${feature} is not supported on Amazon Vega.`);\n};\n\nconst normalizeProductType = (\n type?: ProductTypeInput | null,\n): ProductQueryType => {\n if (type == null || type === 'in-app') return 'in-app';\n if (type === 'subs' || type === 'all') return type;\n throw new Error(\n `Unsupported product type: ${String(type)}. Use in-app, subs, or all.`,\n );\n};\n\nconst normalizePurchaseArray = (purchases: Purchase[]): Purchase[] => purchases;\n\nconst getAndroidRequest = (\n request?:\n | RequestPurchasePropsByPlatforms\n | RequestSubscriptionPropsByPlatforms\n | null,\n) => {\n return request?.google;\n};\n\nconst createPurchaseTokenError = (purchase: Purchase): Error => {\n const error = new Error(\n 'Purchase token is required to finish Amazon Vega transaction',\n ) as Error & PurchaseError;\n error.code = ErrorCode.DeveloperError;\n error.productId = purchase.productId;\n return error;\n};\n\nexport const emitter = {\n addListener(\n eventName: OpenIapEvent,\n listener: (payload: Purchase | PurchaseError) => void,\n ): EventSubscription {\n return getModule().addListener(eventName, listener);\n },\n removeListener(\n eventName: OpenIapEvent,\n listener: (payload: Purchase | PurchaseError) => void,\n ): void {\n return getModule().removeListener(eventName, listener);\n },\n};\n\nexport const purchaseUpdatedListener = (\n listener: (event: Purchase) => void,\n options?: PurchaseUpdatedListenerOptions | null,\n): EventSubscription => {\n return getModule().addListener(OpenIapEvent.PurchaseUpdated, (purchase) => {\n listener(purchase as Purchase);\n });\n};\n\nexport const purchaseErrorListener = (\n listener: (error: PurchaseError) => void,\n): EventSubscription => {\n return getModule().addListener(OpenIapEvent.PurchaseError, (error) => {\n listener(error as PurchaseError);\n });\n};\n\nexport const initConnection: MutationField<'initConnection'> = async (\n config,\n) => {\n return getModule().initConnection(config ?? null);\n};\n\nexport const endConnection: MutationField<'endConnection'> = async () => {\n return getModule().endConnection();\n};\n\nexport const fetchProducts = async (\n request: Omit<ProductRequest, 'type'> & {\n type?: ProductTypeInput | null;\n },\n): ReturnType<QueryField<'fetchProducts'>> => {\n const {skus, type} = request;\n return getModule().fetchProducts(normalizeProductType(type), skus);\n};\n\nexport const requestPurchase: MutationField<'requestPurchase'> = async (\n args,\n) => {\n const androidRequest = getAndroidRequest(args.request);\n if (!androidRequest?.skus?.length) {\n throw new Error(\n 'Invalid request for Amazon Vega. The `request.google.skus` property is required and must be a non-empty array.',\n );\n }\n\n return normalizePurchaseArray(\n await getModule().requestPurchase({\n skus: androidRequest.skus,\n type: normalizeProductType(args.type),\n }),\n );\n};\n\nexport const getAvailablePurchases: QueryField<\n 'getAvailablePurchases'\n> = async (options) => {\n return normalizePurchaseArray(\n await getModule().getAvailableItems((options ?? {}) as PurchaseOptions),\n );\n};\n\nexport const finishTransaction: MutationField<'finishTransaction'> = async ({\n purchase,\n isConsumable = false,\n}) => {\n const token = purchase.purchaseToken ?? undefined;\n if (!token) {\n throw createPurchaseTokenError(purchase);\n }\n\n if (isConsumable) {\n await getModule().consumePurchaseAndroid(token);\n return;\n }\n\n await getModule().acknowledgePurchaseAndroid(token);\n};\n\nexport const restorePurchases: MutationField<'restorePurchases'> = async () => {\n await getAvailablePurchases({\n includeSuspendedAndroid: false,\n });\n};\n\nexport const getActiveSubscriptions: QueryField<\n 'getActiveSubscriptions'\n> = async (subscriptionIds) => {\n return getModule().getActiveSubscriptions(subscriptionIds ?? null);\n};\n\nexport const hasActiveSubscriptions: QueryField<\n 'hasActiveSubscriptions'\n> = async (subscriptionIds) => {\n return getModule().hasActiveSubscriptions(subscriptionIds ?? null);\n};\n\nexport const getStorefront: QueryField<'getStorefront'> = async () => {\n return getModule().getStorefront();\n};\n\nexport const verifyPurchaseWithProvider: MutationField<\n 'verifyPurchaseWithProvider'\n> = async (options) => {\n return getModule().verifyPurchaseWithProvider(options);\n};\n\nexport const verifyPurchase: MutationField<'verifyPurchase'> = async () =>\n unsupported('verifyPurchase');\n\nexport const acknowledgePurchaseAndroid: MutationField<\n 'acknowledgePurchaseAndroid'\n> = async (purchaseToken) => {\n await getModule().acknowledgePurchaseAndroid(purchaseToken);\n return true;\n};\n\nexport const consumePurchaseAndroid: MutationField<\n 'consumePurchaseAndroid'\n> = async (purchaseToken) => {\n await getModule().consumePurchaseAndroid(purchaseToken);\n return true;\n};\n\nexport const syncIOS: MutationField<'syncIOS'> = async () =>\n unsupported('syncIOS');\nexport const getAppTransactionIOS: QueryField<\n 'getAppTransactionIOS'\n> = async () => null;\nexport const getPromotedProductIOS: QueryField<\n 'getPromotedProductIOS'\n> = async () => null;\n\nexport const showManageSubscriptionsIOS: MutationField<\n 'showManageSubscriptionsIOS'\n> = async () => [];\nexport const presentCodeRedemptionSheetIOS: MutationField<\n 'presentCodeRedemptionSheetIOS'\n> = async () => null;\nexport const presentExternalPurchaseLinkIOS: MutationField<\n 'presentExternalPurchaseLinkIOS'\n> = async () => unsupported('presentExternalPurchaseLinkIOS');\n\nexport const deepLinkToSubscriptions: MutationField<\n 'deepLinkToSubscriptions'\n> = async () => unsupported('deepLinkToSubscriptions');\nexport const openRedeemOfferCodeAndroid: MutationField<\n 'openRedeemOfferCodeAndroid'\n> = async () => false;\n\nexport const promotedProductListenerIOS = (): EventSubscription => ({\n remove: () => {},\n});\nexport const userChoiceBillingListenerAndroid = (): EventSubscription => ({\n remove: () => {},\n});\nexport const developerProvidedBillingListenerAndroid =\n (): EventSubscription => ({\n remove: () => {},\n });\nexport const subscriptionBillingIssueListener = (): EventSubscription => ({\n remove: () => {},\n});\n\nexport const isBillingProgramAvailableAndroid: MutationField<\n 'isBillingProgramAvailableAndroid'\n> = async () => unsupported('isBillingProgramAvailableAndroid');\nexport const getBillingChoiceInfoAndroid: QueryField<\n 'getBillingChoiceInfoAndroid'\n> = async () => unsupported('getBillingChoiceInfoAndroid');\nexport const launchExternalLinkAndroid: MutationField<\n 'launchExternalLinkAndroid'\n> = async () => unsupported('launchExternalLinkAndroid');\nexport const createBillingProgramReportingDetailsAndroid: MutationField<\n 'createBillingProgramReportingDetailsAndroid'\n> = async () => unsupported('createBillingProgramReportingDetailsAndroid');\nexport const showBillingProgramInformationDialogAndroid: MutationField<\n 'showBillingProgramInformationDialogAndroid'\n> = async () => unsupported('showBillingProgramInformationDialogAndroid');\nexport const showInAppMessagesAndroid: MutationField<\n 'showInAppMessagesAndroid'\n> = async () => unsupported('showInAppMessagesAndroid');\n"]}
|
|
1
|
+
{"version":3,"file":"index.kepler.js","sourceRoot":"","sources":["../src/index.kepler.ts"],"names":[],"mappings":"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","sourcesContent":["import {getVegaIapModule} from './vega';\nimport {ErrorCode} from './types';\nimport type {\n MutationField,\n ProductQueryType,\n ProductRequest,\n Purchase,\n PurchaseError,\n PurchaseOptions,\n PurchaseUpdatedListenerOptions,\n QueryField,\n RequestPurchasePropsByPlatforms,\n RequestSubscriptionPropsByPlatforms,\n} from './types';\nimport {decodeAndroidPurchases} from './utils/availablePurchases';\n\nexport * from './types';\nexport * from './vega';\nexport * from './useIAP';\nexport {kitApi, KitApiError} from './kit-api';\nexport type {\n EntitlementsResponse,\n KitApiOptions,\n KitClientPayloadCache,\n KitClientPayloadOptions,\n KitClientPayloadResponse,\n KitProduct,\n KitProductClientPayload,\n KitProductOffer,\n KitProductPlatform,\n KitProductsOptions,\n KitProductsResponse,\n KitSubscription,\n StatusResponse,\n} from './kit-api';\n\nexport enum OpenIapEvent {\n PurchaseUpdated = 'purchase-updated',\n PurchaseError = 'purchase-error',\n PromotedProductIOS = 'promoted-product-ios',\n UserChoiceBillingAndroid = 'user-choice-billing-android',\n DeveloperProvidedBillingAndroid = 'developer-provided-billing-android',\n SubscriptionBillingIssue = 'subscription-billing-issue',\n}\n\nexport type ProductTypeInput = ProductQueryType;\n\nexport interface EventSubscription {\n remove(): void;\n}\n\nconst getModule = () => {\n const module = getVegaIapModule();\n if (!module) {\n throw new Error(\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;\n};\n\nconst unsupported = (feature: string): never => {\n throw new Error(`${feature} is not supported on Amazon Vega.`);\n};\n\nconst normalizeProductType = (\n type?: ProductTypeInput | null,\n): ProductQueryType => {\n if (type == null || type === 'in-app') return 'in-app';\n if (type === 'subs' || type === 'all') return type;\n throw new Error(\n `Unsupported product type: ${String(type)}. Use in-app, subs, or all.`,\n );\n};\n\nconst normalizePurchaseArray = (purchases: Purchase[]): Purchase[] =>\n decodeAndroidPurchases(purchases);\n\nconst getAndroidRequest = (\n request?:\n | RequestPurchasePropsByPlatforms\n | RequestSubscriptionPropsByPlatforms\n | null,\n) => {\n return request?.google;\n};\n\nconst createPurchaseTokenError = (purchase: Purchase): Error => {\n const error = new Error(\n 'Purchase token is required to finish Amazon Vega transaction',\n ) as Error & PurchaseError;\n error.code = ErrorCode.DeveloperError;\n error.productId = purchase.productId;\n return error;\n};\n\nexport const emitter = {\n addListener(\n eventName: OpenIapEvent,\n listener: (payload: Purchase | PurchaseError) => void,\n ): EventSubscription {\n return getModule().addListener(eventName, listener);\n },\n removeListener(\n eventName: OpenIapEvent,\n listener: (payload: Purchase | PurchaseError) => void,\n ): void {\n return getModule().removeListener(eventName, listener);\n },\n};\n\nexport const purchaseUpdatedListener = (\n listener: (event: Purchase) => void,\n options?: PurchaseUpdatedListenerOptions | null,\n): EventSubscription => {\n return getModule().addListener(OpenIapEvent.PurchaseUpdated, (purchase) => {\n listener(purchase as Purchase);\n });\n};\n\nexport const purchaseErrorListener = (\n listener: (error: PurchaseError) => void,\n): EventSubscription => {\n return getModule().addListener(OpenIapEvent.PurchaseError, (error) => {\n listener(error as PurchaseError);\n });\n};\n\nexport const initConnection: MutationField<'initConnection'> = async (\n config,\n) => {\n return getModule().initConnection(config ?? null);\n};\n\nexport const endConnection: MutationField<'endConnection'> = async () => {\n return getModule().endConnection();\n};\n\nexport const fetchProducts = async (\n request: Omit<ProductRequest, 'type'> & {\n type?: ProductTypeInput | null;\n },\n): ReturnType<QueryField<'fetchProducts'>> => {\n const {skus, type} = request;\n return getModule().fetchProducts(normalizeProductType(type), skus);\n};\n\nexport const requestPurchase: MutationField<'requestPurchase'> = async (\n args,\n) => {\n const androidRequest = getAndroidRequest(args.request);\n if (!androidRequest?.skus?.length) {\n throw new Error(\n 'Invalid request for Amazon Vega. The `request.google.skus` property is required and must be a non-empty array.',\n );\n }\n\n return normalizePurchaseArray(\n await getModule().requestPurchase({\n skus: androidRequest.skus,\n type: normalizeProductType(args.type),\n }),\n );\n};\n\nexport const getAvailablePurchases: QueryField<\n 'getAvailablePurchases'\n> = async (options) => {\n return normalizePurchaseArray(\n await getModule().getAvailableItems((options ?? {}) as PurchaseOptions),\n );\n};\n\nexport const finishTransaction: MutationField<'finishTransaction'> = async ({\n purchase,\n isConsumable = false,\n}) => {\n const token = purchase.purchaseToken ?? undefined;\n if (!token) {\n throw createPurchaseTokenError(purchase);\n }\n\n if (isConsumable) {\n await getModule().consumePurchaseAndroid(token);\n return;\n }\n\n await getModule().acknowledgePurchaseAndroid(token);\n};\n\nexport const restorePurchases: MutationField<'restorePurchases'> = async () => {\n await getAvailablePurchases({\n includeSuspendedAndroid: false,\n });\n};\n\nexport const getActiveSubscriptions: QueryField<\n 'getActiveSubscriptions'\n> = async (subscriptionIds) => {\n return getModule().getActiveSubscriptions(subscriptionIds ?? null);\n};\n\nexport const hasActiveSubscriptions: QueryField<\n 'hasActiveSubscriptions'\n> = async (subscriptionIds) => {\n return getModule().hasActiveSubscriptions(subscriptionIds ?? null);\n};\n\nexport const getStorefront: QueryField<'getStorefront'> = async () => {\n return getModule().getStorefront();\n};\n\nexport const verifyPurchaseWithProvider: MutationField<\n 'verifyPurchaseWithProvider'\n> = async (options) => {\n return getModule().verifyPurchaseWithProvider(options);\n};\n\nexport const verifyPurchase: MutationField<'verifyPurchase'> = async () =>\n unsupported('verifyPurchase');\n\nexport const acknowledgePurchaseAndroid: MutationField<\n 'acknowledgePurchaseAndroid'\n> = async (purchaseToken) => {\n await getModule().acknowledgePurchaseAndroid(purchaseToken);\n return true;\n};\n\nexport const consumePurchaseAndroid: MutationField<\n 'consumePurchaseAndroid'\n> = async (purchaseToken) => {\n await getModule().consumePurchaseAndroid(purchaseToken);\n return true;\n};\n\nexport const syncIOS: MutationField<'syncIOS'> = async () =>\n unsupported('syncIOS');\nexport const getAppTransactionIOS: QueryField<\n 'getAppTransactionIOS'\n> = async () => null;\nexport const getPromotedProductIOS: QueryField<\n 'getPromotedProductIOS'\n> = async () => null;\n\nexport const showManageSubscriptionsIOS: MutationField<\n 'showManageSubscriptionsIOS'\n> = async () => [];\nexport const presentCodeRedemptionSheetIOS: MutationField<\n 'presentCodeRedemptionSheetIOS'\n> = async () => null;\nexport const presentExternalPurchaseLinkIOS: MutationField<\n 'presentExternalPurchaseLinkIOS'\n> = async () => unsupported('presentExternalPurchaseLinkIOS');\n\nexport const deepLinkToSubscriptions: MutationField<\n 'deepLinkToSubscriptions'\n> = async () => unsupported('deepLinkToSubscriptions');\nexport const openRedeemOfferCodeAndroid: MutationField<\n 'openRedeemOfferCodeAndroid'\n> = async () => false;\n\nexport const promotedProductListenerIOS = (): EventSubscription => ({\n remove: () => {},\n});\nexport const userChoiceBillingListenerAndroid = (): EventSubscription => ({\n remove: () => {},\n});\nexport const developerProvidedBillingListenerAndroid =\n (): EventSubscription => ({\n remove: () => {},\n });\nexport const subscriptionBillingIssueListener = (): EventSubscription => ({\n remove: () => {},\n});\n\nexport const isBillingProgramAvailableAndroid: MutationField<\n 'isBillingProgramAvailableAndroid'\n> = async () => unsupported('isBillingProgramAvailableAndroid');\nexport const getBillingChoiceInfoAndroid: QueryField<\n 'getBillingChoiceInfoAndroid'\n> = async () => unsupported('getBillingChoiceInfoAndroid');\nexport const launchExternalLinkAndroid: MutationField<\n 'launchExternalLinkAndroid'\n> = async () => unsupported('launchExternalLinkAndroid');\nexport const createBillingProgramReportingDetailsAndroid: MutationField<\n 'createBillingProgramReportingDetailsAndroid'\n> = async () => unsupported('createBillingProgramReportingDetailsAndroid');\nexport const showBillingProgramInformationDialogAndroid: MutationField<\n 'showBillingProgramInformationDialogAndroid'\n> = async () => unsupported('showBillingProgramInformationDialogAndroid');\nexport const showInAppMessagesAndroid: MutationField<\n 'showInAppMessagesAndroid'\n> = async () => unsupported('showInAppMessagesAndroid');\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ios.d.ts","sourceRoot":"","sources":["../../src/modules/ios.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAKV,aAAa,EAEb,QAAQ,EAER,UAAU,EAEX,MAAM,UAAU,CAAC;AAClB,OAAO,EAAC,KAAK,aAAa,EAAC,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"ios.d.ts","sourceRoot":"","sources":["../../src/modules/ios.ts"],"names":[],"mappings":"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"}
|