expo-iap 2.2.0-rc.3 → 2.2.0-rc.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/build/ExpoIap.types.d.ts +80 -0
  2. package/build/ExpoIap.types.d.ts.map +1 -0
  3. package/build/ExpoIap.types.js +1 -0
  4. package/build/ExpoIap.types.js.map +1 -0
  5. package/build/ExpoIapModule.d.ts +3 -0
  6. package/build/ExpoIapModule.d.ts.map +1 -0
  7. package/build/ExpoIapModule.js +1 -0
  8. package/build/ExpoIapModule.js.map +1 -0
  9. package/build/index.d.ts +37 -0
  10. package/build/index.d.ts.map +1 -0
  11. package/build/index.js +1 -0
  12. package/build/index.js.map +1 -0
  13. package/build/modules/android.d.ts +48 -0
  14. package/build/modules/android.d.ts.map +1 -0
  15. package/build/modules/android.js +1 -0
  16. package/build/modules/android.js.map +1 -0
  17. package/build/modules/ios.d.ts +49 -0
  18. package/build/modules/ios.d.ts.map +1 -0
  19. package/build/modules/ios.js +1 -0
  20. package/build/modules/ios.js.map +1 -0
  21. package/build/types/ExpoIapAndroid.types.d.ts +113 -0
  22. package/build/types/ExpoIapAndroid.types.d.ts.map +1 -0
  23. package/build/types/ExpoIapAndroid.types.js +1 -0
  24. package/build/types/ExpoIapAndroid.types.js.map +1 -0
  25. package/build/types/ExpoIapIos.types.d.ts +118 -0
  26. package/build/types/ExpoIapIos.types.d.ts.map +1 -0
  27. package/build/types/ExpoIapIos.types.js +1 -0
  28. package/build/types/ExpoIapIos.types.js.map +1 -0
  29. package/build/useIap.d.ts +23 -0
  30. package/build/useIap.d.ts.map +1 -0
  31. package/build/useIap.js +1 -0
  32. package/build/useIap.js.map +1 -0
  33. package/iap.md +16 -0
  34. package/package.json +3 -2
  35. package/tsconfig.json +1 -6
  36. package/build/ExpoIap.types.ts +0 -125
  37. package/build/ExpoIapModule.ts +0 -5
  38. package/build/index.ts +0 -354
  39. package/build/modules/android.ts +0 -99
  40. package/build/modules/ios.ts +0 -84
  41. package/build/types/ExpoIapAndroid.types.ts +0 -127
  42. package/build/types/ExpoIapIos.types.ts +0 -136
  43. package/build/useIap.ts +0 -185
@@ -1,99 +0,0 @@
1
- import {Linking} from 'react-native';
2
- import {PurchaseResult} from '../ExpoIap.types';
3
- import {ReceiptAndroid} from '../types/ExpoIapAndroid.types';
4
- import ExpoIapModule from '../ExpoIapModule';
5
-
6
- // Type guards
7
- export function isProductAndroid<T extends {platform?: string}>(
8
- item: unknown,
9
- ): item is T & {platform: 'android'} {
10
- return (
11
- item != null &&
12
- typeof item === 'object' &&
13
- 'platform' in item &&
14
- item.platform === 'android'
15
- );
16
- }
17
-
18
- export function isSubscriptionProductAndroid<T extends {platform?: string}>(
19
- item: unknown,
20
- ): item is T & {platform: 'android'} {
21
- return isProductAndroid(item);
22
- }
23
-
24
- /**
25
- * Deep link to subscriptions screen on Android.
26
- * @param {string} sku The product's SKU (on Android)
27
- * @returns {Promise<void>}
28
- */
29
- export const deepLinkToSubscriptionsAndroid = async ({
30
- sku,
31
- }: {
32
- sku: string;
33
- }): Promise<void> => {
34
- return Linking.openURL(
35
- `https://play.google.com/store/account/subscriptions?package=${await ExpoIapModule.getPackageName()}&sku=${sku}`,
36
- );
37
- };
38
-
39
- /**
40
- * Validate receipt for Android. NOTE: This method is here for debugging purposes only. Including
41
- * your access token in the binary you ship to users is potentially dangerous.
42
- * Use server side validation instead for your production builds
43
- * @param {string} packageName package name of your app.
44
- * @param {string} productId product id for your in app product.
45
- * @param {string} productToken token for your purchase.
46
- * @param {string} accessToken accessToken from googleApis.
47
- * @param {boolean} isSub whether this is subscription or inapp. `true` for subscription.
48
- * @returns {Promise<object>}
49
- */
50
- export const validateReceiptAndroid = async ({
51
- packageName,
52
- productId,
53
- productToken,
54
- accessToken,
55
- isSub,
56
- }: {
57
- packageName: string;
58
- productId: string;
59
- productToken: string;
60
- accessToken: string;
61
- isSub?: boolean;
62
- }): Promise<ReceiptAndroid> => {
63
- const type = isSub ? 'subscriptions' : 'products';
64
-
65
- const url =
66
- 'https://androidpublisher.googleapis.com/androidpublisher/v3/applications' +
67
- `/${packageName}/purchases/${type}/${productId}` +
68
- `/tokens/${productToken}?access_token=${accessToken}`;
69
-
70
- const response = await fetch(url, {
71
- method: 'GET',
72
- headers: {
73
- 'Content-Type': 'application/json',
74
- },
75
- });
76
-
77
- if (!response.ok) {
78
- throw Object.assign(new Error(response.statusText), {
79
- statusCode: response.status,
80
- });
81
- }
82
-
83
- return response.json();
84
- };
85
-
86
- /**
87
- * Acknowledge a product (on Android.) No-op on iOS.
88
- * @param {string} token The product's token (on Android)
89
- * @returns {Promise<PurchaseResult | void>}
90
- */
91
- export const acknowledgePurchaseAndroid = ({
92
- token,
93
- developerPayload,
94
- }: {
95
- token: string;
96
- developerPayload?: string;
97
- }): Promise<PurchaseResult | boolean | void> => {
98
- return ExpoIapModule.acknowledgePurchase(token, developerPayload);
99
- };
@@ -1,84 +0,0 @@
1
- import {Platform} from 'react-native';
2
- import {emitter, IapEvent} from '..';
3
- import {ProductPurchase, PurchaseError} from '../ExpoIap.types';
4
- import type {ProductStatusIos} from '../types/ExpoIapIos.types';
5
- import ExpoIapModule from '../ExpoIapModule';
6
-
7
- export type TransactionEvent = {
8
- transaction?: ProductPurchase;
9
- error?: PurchaseError;
10
- };
11
-
12
- // Listeners
13
- export const transactionUpdatedIos = (
14
- listener: (event: TransactionEvent) => void,
15
- ) => {
16
- if (Platform.OS !== 'ios') {
17
- throw new Error('This method is only available on iOS');
18
- }
19
-
20
- return emitter.addListener(IapEvent.TransactionIapUpdated, listener);
21
- };
22
-
23
- // Type guards
24
- export function isProductIos<T extends {platform?: string}>(
25
- item: unknown,
26
- ): item is T & {platform: 'ios'} {
27
- return (
28
- item != null &&
29
- typeof item === 'object' &&
30
- 'platform' in item &&
31
- item.platform === 'ios'
32
- );
33
- }
34
-
35
- export function isSubscriptionProductIos<T extends {platform?: string}>(
36
- item: unknown,
37
- ): item is T & {platform: 'ios'} {
38
- return isProductIos(item);
39
- }
40
-
41
- // Functions
42
- /**
43
- * Sync state with Appstore (iOS only)
44
- * https://developer.apple.com/documentation/storekit/appstore/3791906-sync
45
- */
46
- export const sync = (): Promise<null> => ExpoIapModule.sync();
47
-
48
- /**
49
- *
50
- */
51
- export const isEligibleForIntroOffer = (groupID: string): Promise<boolean> =>
52
- ExpoIapModule.isEligibleForIntroOffer(groupID);
53
-
54
- /**
55
- *
56
- */
57
-
58
- export const subscriptionStatus = (sku: string): Promise<ProductStatusIos[]> =>
59
- ExpoIapModule.subscriptionStatus(sku);
60
-
61
- /**
62
- *
63
- */
64
- export const currentEntitlement = (sku: string): Promise<ProductPurchase> =>
65
- ExpoIapModule.currentEntitlement(sku);
66
-
67
- /**
68
- *
69
- */
70
- export const latestTransaction = (sku: string): Promise<ProductPurchase> =>
71
- ExpoIapModule.latestTransaction(sku);
72
-
73
- /**
74
- *
75
- */
76
- type RefundRequestStatus = 'success' | 'userCancelled';
77
- export const beginRefundRequest = (sku: string): Promise<RefundRequestStatus> =>
78
- ExpoIapModule.beginRefundRequest(sku);
79
-
80
- /**
81
- *
82
- */
83
- export const showManageSubscriptions = (): Promise<null> =>
84
- ExpoIapModule.showManageSubscriptions();
@@ -1,127 +0,0 @@
1
- import {PurchaseBase, ProductBase} from '../ExpoIap.types';
2
-
3
- type OneTimePurchaseOfferDetails = {
4
- priceCurrencyCode: string;
5
- formattedPrice: string;
6
- priceAmountMicros: string;
7
- };
8
-
9
- type PricingPhaseAndroid = {
10
- formattedPrice: string;
11
- priceCurrencyCode: string;
12
- // P1W, P1M, P1Y
13
- billingPeriod: string;
14
- billingCycleCount: number;
15
- priceAmountMicros: string;
16
- recurrenceMode: number;
17
- };
18
-
19
- type PricingPhasesAndroid = {
20
- pricingPhaseList: PricingPhaseAndroid[];
21
- };
22
-
23
- type SubscriptionOfferDetail = {
24
- basePlanId: string;
25
- offerId: string;
26
- offerToken: string;
27
- offerTags: string[];
28
- pricingPhases: PricingPhasesAndroid;
29
- };
30
-
31
- export type ProductAndroid = ProductBase & {
32
- name: string;
33
- oneTimePurchaseOfferDetails?: OneTimePurchaseOfferDetails;
34
- subscriptionOfferDetails?: SubscriptionOfferDetail[];
35
- };
36
-
37
- type SubscriptionOfferAndroid = {
38
- basePlanId: string;
39
- offerId: string | null;
40
- offerToken: string;
41
- pricingPhases: PricingPhasesAndroid;
42
- offerTags: string[];
43
- };
44
-
45
- export type SubscriptionProductAndroid = ProductAndroid & {
46
- subscriptionOfferDetails: SubscriptionOfferAndroid[];
47
- };
48
-
49
- export type RequestPurchaseAndroidProps = {
50
- skus: string[];
51
- obfuscatedAccountIdAndroid?: string;
52
- obfuscatedProfileIdAndroid?: string;
53
- isOfferPersonalized?: boolean; // For AndroidBilling V5 https://developer.android.com/google/play/billing/integrate#personalized-price
54
- };
55
-
56
- enum ReplacementModesAndroid {
57
- UNKNOWN_REPLACEMENT_MODE = 0,
58
- WITH_TIME_PRORATION = 1,
59
- CHARGE_PRORATED_PRICE = 2,
60
- WITHOUT_PRORATION = 3,
61
- CHARGE_FULL_PRICE = 5,
62
- DEFERRED = 6,
63
- }
64
-
65
- type SubscriptionOffer = {
66
- sku: string;
67
- offerToken: string;
68
- };
69
-
70
- export type RequestSubscriptionAndroidProps = RequestPurchaseAndroidProps & {
71
- purchaseTokenAndroid?: string;
72
- replacementModeAndroid?: ReplacementModesAndroid;
73
- subscriptionOffers: SubscriptionOffer[];
74
- };
75
-
76
- export type ReceiptAndroid = {
77
- autoRenewing: boolean;
78
- betaProduct: boolean;
79
- cancelDate: number | null;
80
- cancelReason: string;
81
- deferredDate: number | null;
82
- deferredSku: number | null;
83
- freeTrialEndDate: number;
84
- gracePeriodEndDate: number;
85
- parentProductId: string;
86
- productId: string;
87
- productType: string;
88
- purchaseDate: number;
89
- quantity: number;
90
- receiptId: string;
91
- renewalDate: number;
92
- term: string;
93
- termSku: string;
94
- testTransaction: boolean;
95
- };
96
-
97
- export enum FeatureTypeAndroid {
98
- /** Show in-app messages. Included in documentation by the annotations: */
99
- IN_APP_MESSAGING = 'IN_APP_MESSAGING',
100
- /** Launch a price change confirmation flow. */
101
- PRICE_CHANGE_CONFIRMATION = 'PRICE_CHANGE_CONFIRMATION',
102
- /** Play billing library support for querying and purchasing with ProductDetails. */
103
- PRODUCT_DETAILS = 'PRODUCT_DETAILS',
104
- /** Purchase/query for subscriptions. */
105
- SUBSCRIPTIONS = 'SUBSCRIPTIONS',
106
- /** Subscriptions update/replace. */
107
- SUBSCRIPTIONS_UPDATE = 'SUBSCRIPTIONS_UPDATE',
108
- }
109
-
110
- export enum PurchaseStateAndroid {
111
- UNSPECIFIED_STATE = 0,
112
- PURCHASED = 1,
113
- PENDING = 2,
114
- }
115
-
116
- export type ProductPurchaseAndroid = PurchaseBase & {
117
- ids?: string[];
118
- dataAndroid?: string;
119
- signatureAndroid?: string;
120
- autoRenewingAndroid?: boolean;
121
- purchaseStateAndroid?: PurchaseStateAndroid;
122
- isAcknowledgedAndroid?: boolean;
123
- packageNameAndroid?: string;
124
- developerPayloadAndroid?: string;
125
- obfuscatedAccountIdAndroid?: string;
126
- obfuscatedProfileIdAndroid?: string;
127
- };
@@ -1,136 +0,0 @@
1
- import {PurchaseBase, ProductBase} from '../ExpoIap.types';
2
-
3
- type SubscriptionIosPeriod = 'DAY' | 'WEEK' | 'MONTH' | 'YEAR' | '';
4
- type PaymentMode = '' | 'FREETRIAL' | 'PAYASYOUGO' | 'PAYUPFRONT';
5
-
6
- type SubscriptionOffer = {
7
- displayPrice: string;
8
- id: string;
9
- paymentMode: PaymentMode;
10
- period: SubscriptionIosPeriod;
11
- periodCount: number;
12
- price: number;
13
- type: 'introductory' | 'promotional';
14
- };
15
-
16
- type SubscriptionInfo = {
17
- introductoryOffer?: SubscriptionOffer;
18
- promotionalOffers?: SubscriptionOffer[];
19
- subscriptionGroupID: string;
20
- subscriptionPeriod: SubscriptionIosPeriod;
21
- };
22
-
23
- export type ProductIos = ProductBase & {
24
- displayName: string;
25
- displayPrice: string;
26
- isFamilyShareable: boolean;
27
- jsonRepresentation: string;
28
- subscription: SubscriptionInfo;
29
- introductoryPriceNumberOfPeriodsIOS?: string;
30
- introductoryPriceSubscriptionPeriodIOS?: SubscriptionIosPeriod;
31
- };
32
-
33
- export type Discount = {
34
- identifier: string;
35
- type: string;
36
- numberOfPeriods: string;
37
- price: string;
38
- localizedPrice: string;
39
- paymentMode: PaymentMode;
40
- subscriptionPeriod: string;
41
- };
42
-
43
- export type SubscriptionProductIos = ProductIos & {
44
- discounts?: Discount[];
45
- introductoryPrice?: string;
46
- introductoryPriceAsAmountIOS?: string;
47
- introductoryPricePaymentModeIOS?: PaymentMode;
48
- introductoryPriceNumberOfPeriodsIOS?: string;
49
- introductoryPriceSubscriptionPeriodIOS?: SubscriptionIosPeriod;
50
- subscriptionPeriodNumberIOS?: string;
51
- subscriptionPeriodUnitIOS?: SubscriptionIosPeriod;
52
- };
53
-
54
- export type PaymentDiscount = {
55
- /**
56
- * A string used to uniquely identify a discount offer for a product.
57
- */
58
- identifier: string;
59
- /**
60
- * A string that identifies the key used to generate the signature.
61
- */
62
- keyIdentifier: string;
63
- /**
64
- * A universally unique ID (UUID) value that you define.
65
- */
66
- nonce: string;
67
- /**
68
- * A UTF-8 string representing the properties of a specific discount offer, cryptographically signed.
69
- */
70
- signature: string;
71
- /**
72
- * The date and time of the signature's creation in milliseconds, formatted in Unix epoch time.
73
- */
74
- timestamp: number;
75
- };
76
-
77
- export type RequestPurchaseIosProps = {
78
- sku: string;
79
- /**
80
- * UUID representing user account
81
- */
82
- appAccountToken?: string;
83
- quantity?: number;
84
- withOffer?: PaymentDiscount;
85
- };
86
-
87
- export type RequestSubscriptionIosProps = RequestPurchaseIosProps;
88
-
89
- type SubscriptionStatus =
90
- | 'expired'
91
- | 'inBillingRetryPeriod'
92
- | 'inGracePeriod'
93
- | 'revoked'
94
- | 'subscribed';
95
-
96
- type RenewalInfo = {
97
- jsonRepresentation?: string;
98
- willAutoRenew: boolean;
99
- autoRenewPreference?: string;
100
- };
101
-
102
- export type ProductStatusIos = {
103
- state: SubscriptionStatus;
104
- renewalInfo?: RenewalInfo;
105
- };
106
-
107
- export type ProductPurchaseIos = PurchaseBase & {
108
- // iOS basic fields
109
- quantityIos?: number;
110
- originalTransactionDateIos?: number;
111
- originalTransactionIdentifierIos?: string;
112
- verificationResultIos?: string;
113
- appAccountToken?: string;
114
- // iOS additional fields from StoreKit 2
115
- expirationDateIos?: number;
116
- webOrderLineItemIdIos?: number;
117
- environmentIos?: string;
118
- storefrontCountryCodeIos?: string;
119
- appBundleIdIos?: string;
120
- productTypeIos?: string;
121
- subscriptionGroupIdIos?: string;
122
- isUpgradedIos?: boolean;
123
- ownershipTypeIos?: string;
124
- reasonIos?: string;
125
- reasonStringRepresentationIos?: string;
126
- transactionReasonIos?: 'PURCHASE' | 'RENEWAL' | string;
127
- revocationDateIos?: number;
128
- revocationReasonIos?: string;
129
- offerIos?: {
130
- id: string;
131
- type: string;
132
- paymentMode: string;
133
- };
134
- priceIos?: number;
135
- currencyIos?: string;
136
- };
package/build/useIap.ts DELETED
@@ -1,185 +0,0 @@
1
- import {
2
- endConnection,
3
- initConnection,
4
- purchaseErrorListener,
5
- purchaseUpdatedListener,
6
- transactionUpdatedIos,
7
- getProducts,
8
- getAvailablePurchases,
9
- getPurchaseHistory,
10
- getSubscriptions,
11
- } from './';
12
- import {useCallback, useEffect, useState} from 'react';
13
- import {
14
- Product,
15
- ProductPurchase,
16
- Purchase,
17
- PurchaseError,
18
- PurchaseResult,
19
- SubscriptionProduct,
20
- SubscriptionPurchase,
21
- } from './ExpoIap.types';
22
- import {TransactionEvent} from './modules/ios';
23
- import {Subscription} from 'expo-modules-core';
24
-
25
- type IAP_STATUS = {
26
- connected: boolean;
27
- products: Product[];
28
- promotedProductsIOS: ProductPurchase[];
29
- subscriptions: SubscriptionProduct[];
30
- purchaseHistories: ProductPurchase[];
31
- availablePurchases: ProductPurchase[];
32
- currentPurchase?: ProductPurchase;
33
- currentPurchaseError?: PurchaseError;
34
- finishTransaction: ({
35
- purchase,
36
- isConsumable,
37
- developerPayloadAndroid,
38
- }: {
39
- purchase: Purchase;
40
- isConsumable?: boolean;
41
- developerPayloadAndroid?: string;
42
- }) => Promise<string | boolean | PurchaseResult | void>;
43
- getAvailablePurchases: () => Promise<void>;
44
- getPurchaseHistories: () => Promise<void>;
45
- getProducts: (skus: string[]) => Promise<void>;
46
- getSubscriptions: (skus: string[]) => Promise<void>;
47
- };
48
-
49
- let purchaseUpdateSubscription: Subscription;
50
- let purchaseErrorSubscription: Subscription;
51
- let promotedProductsSubscription: Subscription;
52
-
53
- export function useIAP(): IAP_STATUS {
54
- const [connected, setConnected] = useState<boolean>(false);
55
- const [products, setProducts] = useState<Product[]>([]);
56
- const [promotedProductsIOS, setPromotedProductsIOS] = useState<
57
- ProductPurchase[]
58
- >([]);
59
- const [subscriptions, setSubscriptions] = useState<SubscriptionProduct[]>([]);
60
- const [purchaseHistories, setPurchaseHistories] = useState<ProductPurchase[]>(
61
- [],
62
- );
63
- const [availablePurchases, setAvailablePurchases] = useState<
64
- ProductPurchase[]
65
- >([]);
66
- const [currentPurchase, setCurrentPurchase] = useState<ProductPurchase>();
67
- const [currentPurchaseError, setCurrentPurchaseError] =
68
- useState<PurchaseError>();
69
-
70
- const requestProducts = useCallback(async (skus: string[]): Promise<void> => {
71
- setProducts(await getProducts(skus));
72
- }, []);
73
-
74
- const requestSubscriptions = useCallback(
75
- async (skus: string[]): Promise<void> => {
76
- setSubscriptions(await getSubscriptions(skus));
77
- },
78
- [],
79
- );
80
-
81
- const requestAvailablePurchases = useCallback(async (): Promise<void> => {
82
- setAvailablePurchases(await getAvailablePurchases());
83
- }, []);
84
-
85
- const requestPurchaseHistories = useCallback(async (): Promise<void> => {
86
- setPurchaseHistories(await getPurchaseHistory());
87
- }, []);
88
-
89
- const finishTransaction = useCallback(
90
- async ({
91
- purchase,
92
- isConsumable,
93
- developerPayloadAndroid,
94
- }: {
95
- purchase: ProductPurchase;
96
- isConsumable?: boolean;
97
- developerPayloadAndroid?: string;
98
- }): Promise<string | boolean | PurchaseResult | void> => {
99
- try {
100
- return await finishTransaction({
101
- purchase,
102
- isConsumable,
103
- developerPayloadAndroid,
104
- });
105
- } catch (err) {
106
- throw err;
107
- } finally {
108
- if (purchase.id === currentPurchase?.id) {
109
- setCurrentPurchase(undefined);
110
- }
111
-
112
- if (purchase.id === currentPurchaseError?.productId) { // Note that PurchaseError still uses productId
113
- setCurrentPurchaseError(undefined);
114
- }
115
- }
116
- },
117
- [
118
- currentPurchase?.id,
119
- currentPurchaseError?.productId,
120
- setCurrentPurchase,
121
- setCurrentPurchaseError,
122
- ],
123
- );
124
-
125
- const initIapWithSubscriptions = useCallback(async (): Promise<void> => {
126
- const result = await initConnection();
127
-
128
- setConnected(result);
129
-
130
- if (result) {
131
- purchaseUpdateSubscription = purchaseUpdatedListener(
132
- async (purchase: Purchase | SubscriptionPurchase) => {
133
- setCurrentPurchaseError(undefined);
134
- setCurrentPurchase(purchase);
135
- },
136
- );
137
-
138
- purchaseErrorSubscription = purchaseErrorListener(
139
- (error: PurchaseError) => {
140
- setCurrentPurchase(undefined);
141
- setCurrentPurchaseError(error);
142
- },
143
- );
144
-
145
- promotedProductsSubscription = transactionUpdatedIos(
146
- (event: TransactionEvent) => {
147
- setPromotedProductsIOS((prevProducts) =>
148
- event.transaction
149
- ? [...prevProducts, event.transaction]
150
- : prevProducts,
151
- );
152
- },
153
- );
154
- }
155
- }, []);
156
-
157
- useEffect(() => {
158
- initIapWithSubscriptions();
159
-
160
- return (): void => {
161
- if (purchaseUpdateSubscription) purchaseUpdateSubscription.remove();
162
- if (purchaseErrorSubscription) purchaseErrorSubscription.remove();
163
- if (promotedProductsSubscription) promotedProductsSubscription.remove();
164
-
165
- endConnection();
166
- setConnected(false);
167
- };
168
- }, [initIapWithSubscriptions]);
169
-
170
- return {
171
- connected,
172
- products,
173
- promotedProductsIOS,
174
- subscriptions,
175
- purchaseHistories,
176
- finishTransaction,
177
- availablePurchases,
178
- currentPurchase,
179
- currentPurchaseError,
180
- getProducts: requestProducts,
181
- getSubscriptions: requestSubscriptions,
182
- getAvailablePurchases: requestAvailablePurchases,
183
- getPurchaseHistories: requestPurchaseHistories,
184
- };
185
- }