@metamask-previews/subscription-controller 6.2.2-preview-58a4a8b71 → 6.2.2-preview-4c8a5dfcb
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/CHANGELOG.md +8 -1
- package/dist/SubscriptionController.cjs +18 -26
- package/dist/SubscriptionController.cjs.map +1 -1
- package/dist/SubscriptionController.d.cts +5 -9
- package/dist/SubscriptionController.d.cts.map +1 -1
- package/dist/SubscriptionController.d.mts +5 -9
- package/dist/SubscriptionController.d.mts.map +1 -1
- package/dist/SubscriptionController.mjs +18 -26
- package/dist/SubscriptionController.mjs.map +1 -1
- package/dist/SubscriptionService-method-action-types.cjs +7 -0
- package/dist/SubscriptionService-method-action-types.cjs.map +1 -0
- package/dist/SubscriptionService-method-action-types.d.cts +151 -0
- package/dist/SubscriptionService-method-action-types.d.cts.map +1 -0
- package/dist/SubscriptionService-method-action-types.d.mts +151 -0
- package/dist/SubscriptionService-method-action-types.d.mts.map +1 -0
- package/dist/SubscriptionService-method-action-types.mjs +6 -0
- package/dist/SubscriptionService-method-action-types.mjs.map +1 -0
- package/dist/SubscriptionService-structs.cjs +135 -0
- package/dist/SubscriptionService-structs.cjs.map +1 -0
- package/dist/SubscriptionService-structs.d.cts +773 -0
- package/dist/SubscriptionService-structs.d.cts.map +1 -0
- package/dist/SubscriptionService-structs.d.mts +773 -0
- package/dist/SubscriptionService-structs.d.mts.map +1 -0
- package/dist/SubscriptionService-structs.mjs +132 -0
- package/dist/SubscriptionService-structs.mjs.map +1 -0
- package/dist/SubscriptionService.cjs +257 -87
- package/dist/SubscriptionService.cjs.map +1 -1
- package/dist/SubscriptionService.d.cts +90 -10
- package/dist/SubscriptionService.d.cts.map +1 -1
- package/dist/SubscriptionService.d.mts +90 -10
- package/dist/SubscriptionService.d.mts.map +1 -1
- package/dist/SubscriptionService.mjs +257 -87
- package/dist/SubscriptionService.mjs.map +1 -1
- package/dist/index.cjs +3 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -3
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +4 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -2
package/CHANGELOG.md
CHANGED
|
@@ -9,7 +9,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
9
9
|
|
|
10
10
|
### Changed
|
|
11
11
|
|
|
12
|
-
-
|
|
12
|
+
- **BREAKING:** Refactor subscription API access behind a messenger-backed `SubscriptionService` ([#9598](https://github.com/MetaMask/core/pull/9598))
|
|
13
|
+
- `SubscriptionService` now extends `BaseDataService`, authenticates via `AuthenticationController:getBearerToken`, exposes all endpoint methods as `SubscriptionService:*` messenger actions, validates responses with `@metamask/superstruct`, and scopes query keys by `profileId` from `AuthenticationController:getSessionProfile`.
|
|
14
|
+
- New exports: `SubscriptionServiceOptions`, `SubscriptionServiceMessenger`, service action/event types, and `subscriptionServiceName`. Construct `SubscriptionService` with `{ messenger, fetchFunction?, env?, captureException?, queryClientConfig?, policyOptions? }`.
|
|
15
|
+
- `fetchFunction` is optional and defaults to `globalThis.fetch`.
|
|
16
|
+
- `SubscriptionController` no longer constructs or accepts a `SubscriptionService` instance. `SubscriptionControllerOptions` now accepts only `{ messenger, state?, pollingInterval? }`, and the controller calls `SubscriptionService:*` messenger actions instead of invoking a service directly.
|
|
17
|
+
- Removed `SubscriptionControllerServiceOptions`, `SubscriptionServiceConfig`, and direct `auth: AuthUtils` construction.
|
|
18
|
+
- Removed the `AuthenticationController:stateChange` event from `SubscriptionControllerMessenger` (and the `AllowedEvents` type export); the controller never subscribed to this event.
|
|
19
|
+
- Bump `@metamask/transaction-controller` from `^69.4.0` to `^69.5.1` ([#9780](https://github.com/MetaMask/core/pull/9780), [#9798](https://github.com/MetaMask/core/pull/9798))
|
|
13
20
|
|
|
14
21
|
## [6.2.2]
|
|
15
22
|
|
|
@@ -1,16 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
-
};
|
|
8
2
|
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
3
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
4
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
5
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
6
|
};
|
|
13
|
-
var _SubscriptionController_instances,
|
|
7
|
+
var _SubscriptionController_instances, _SubscriptionController_getSubscriptionPriceAmount, _SubscriptionController_getSubscriptionBalanceAmount, _SubscriptionController_getProductPriceByProductAndPlan, _SubscriptionController_assertValidSubscriptionStateForCryptoApproval, _SubscriptionController_assertIsUserNotSubscribed, _SubscriptionController_assertIsUserSubscribed, _SubscriptionController_assertIsPaymentMethodCrypto, _SubscriptionController_getIsEligibleForTrialedSponsorship, _SubscriptionController_getChainSupportsSponsorship, _SubscriptionController_areTrialedProductsEqual, _SubscriptionController_areSubscriptionsEqual, _SubscriptionController_isSubscriptionEqual, _SubscriptionController_stringifySubscription;
|
|
14
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
9
|
exports.SubscriptionController = exports.getDefaultSubscriptionControllerState = void 0;
|
|
16
10
|
const polling_controller_1 = require("@metamask/polling-controller");
|
|
@@ -113,10 +107,10 @@ class SubscriptionController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
113
107
|
* @param options - The options for the SubscriptionController.
|
|
114
108
|
* @param options.messenger - A restricted messenger.
|
|
115
109
|
* @param options.state - Initial state to set on this controller.
|
|
116
|
-
* @param options.subscriptionService - The subscription service for communicating with subscription server.
|
|
117
110
|
* @param options.pollingInterval - The polling interval to use for the subscription controller.
|
|
118
111
|
*/
|
|
119
|
-
constructor(
|
|
112
|
+
constructor(options) {
|
|
113
|
+
const { messenger, state, pollingInterval = constants_js_1.DEFAULT_POLLING_INTERVAL, } = options;
|
|
120
114
|
super({
|
|
121
115
|
name: constants_js_1.controllerName,
|
|
122
116
|
metadata: subscriptionControllerMetadata,
|
|
@@ -127,9 +121,7 @@ class SubscriptionController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
127
121
|
messenger,
|
|
128
122
|
});
|
|
129
123
|
_SubscriptionController_instances.add(this);
|
|
130
|
-
_SubscriptionController_subscriptionService.set(this, void 0);
|
|
131
124
|
this.setIntervalLength(pollingInterval);
|
|
132
|
-
__classPrivateFieldSet(this, _SubscriptionController_subscriptionService, subscriptionService, "f");
|
|
133
125
|
this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
|
|
134
126
|
}
|
|
135
127
|
/**
|
|
@@ -138,7 +130,7 @@ class SubscriptionController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
138
130
|
* @returns The pricing information.
|
|
139
131
|
*/
|
|
140
132
|
async getPricing() {
|
|
141
|
-
const pricing = await
|
|
133
|
+
const pricing = await this.messenger.call('SubscriptionService:getPricing');
|
|
142
134
|
this.update((state) => {
|
|
143
135
|
state.pricing = pricing;
|
|
144
136
|
});
|
|
@@ -150,7 +142,7 @@ class SubscriptionController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
150
142
|
const currentCustomerId = this.state.customerId;
|
|
151
143
|
const currentLastSubscription = this.state.lastSubscription;
|
|
152
144
|
const currentRewardAccountId = this.state.rewardAccountId;
|
|
153
|
-
const { customerId: newCustomerId, subscriptions: newSubscriptions, trialedProducts: newTrialedProducts, lastSubscription: newLastSubscription, rewardAccountId: newRewardAccountId, } = await
|
|
145
|
+
const { customerId: newCustomerId, subscriptions: newSubscriptions, trialedProducts: newTrialedProducts, lastSubscription: newLastSubscription, rewardAccountId: newRewardAccountId, } = await this.messenger.call('SubscriptionService:getSubscriptions');
|
|
154
146
|
// check if the new subscriptions are different from the current subscriptions
|
|
155
147
|
const areSubscriptionsEqual = __classPrivateFieldGet(this, _SubscriptionController_instances, "m", _SubscriptionController_areSubscriptionsEqual).call(this, currentSubscriptions, newSubscriptions);
|
|
156
148
|
// check if the new trialed products are different from the current trialed products
|
|
@@ -194,11 +186,11 @@ class SubscriptionController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
194
186
|
* @returns The subscriptions eligibilities.
|
|
195
187
|
*/
|
|
196
188
|
async getSubscriptionsEligibilities(request) {
|
|
197
|
-
return await
|
|
189
|
+
return await this.messenger.call('SubscriptionService:getSubscriptionsEligibilities', request);
|
|
198
190
|
}
|
|
199
191
|
async cancelSubscription(request) {
|
|
200
192
|
__classPrivateFieldGet(this, _SubscriptionController_instances, "m", _SubscriptionController_assertIsUserSubscribed).call(this, { subscriptionId: request.subscriptionId });
|
|
201
|
-
const cancelledSubscription = await
|
|
193
|
+
const cancelledSubscription = await this.messenger.call('SubscriptionService:cancelSubscription', request);
|
|
202
194
|
this.update((state) => {
|
|
203
195
|
state.subscriptions = state.subscriptions.map((subscription) => subscription.id === request.subscriptionId
|
|
204
196
|
? { ...subscription, ...cancelledSubscription }
|
|
@@ -208,7 +200,7 @@ class SubscriptionController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
208
200
|
}
|
|
209
201
|
async unCancelSubscription(request) {
|
|
210
202
|
__classPrivateFieldGet(this, _SubscriptionController_instances, "m", _SubscriptionController_assertIsUserSubscribed).call(this, { subscriptionId: request.subscriptionId });
|
|
211
|
-
const uncancelledSubscription = await
|
|
203
|
+
const uncancelledSubscription = await this.messenger.call('SubscriptionService:unCancelSubscription', {
|
|
212
204
|
subscriptionId: request.subscriptionId,
|
|
213
205
|
});
|
|
214
206
|
this.update((state) => {
|
|
@@ -220,13 +212,13 @@ class SubscriptionController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
220
212
|
}
|
|
221
213
|
async startShieldSubscriptionWithCard(request) {
|
|
222
214
|
__classPrivateFieldGet(this, _SubscriptionController_instances, "m", _SubscriptionController_assertIsUserNotSubscribed).call(this, { products: request.products });
|
|
223
|
-
const response = await
|
|
215
|
+
const response = await this.messenger.call('SubscriptionService:startSubscriptionWithCard', request);
|
|
224
216
|
// note: no need to trigger access token refresh after startSubscriptionWithCard request because this only return stripe checkout session url, subscription not created yet
|
|
225
217
|
return response;
|
|
226
218
|
}
|
|
227
219
|
async startSubscriptionWithCrypto(request) {
|
|
228
220
|
__classPrivateFieldGet(this, _SubscriptionController_instances, "m", _SubscriptionController_assertIsUserNotSubscribed).call(this, { products: request.products });
|
|
229
|
-
const response = await
|
|
221
|
+
const response = await this.messenger.call('SubscriptionService:startSubscriptionWithCrypto', request);
|
|
230
222
|
return response;
|
|
231
223
|
}
|
|
232
224
|
/**
|
|
@@ -342,11 +334,11 @@ class SubscriptionController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
342
334
|
async updatePaymentMethod(opts) {
|
|
343
335
|
if (opts.paymentType === types_js_1.PAYMENT_TYPES.byCard) {
|
|
344
336
|
const { paymentType, ...cardRequest } = opts;
|
|
345
|
-
return await
|
|
337
|
+
return await this.messenger.call('SubscriptionService:updatePaymentMethodCard', cardRequest);
|
|
346
338
|
}
|
|
347
339
|
else if (opts.paymentType === types_js_1.PAYMENT_TYPES.byCrypto) {
|
|
348
340
|
const { paymentType, ...cryptoRequest } = opts;
|
|
349
|
-
await
|
|
341
|
+
await this.messenger.call('SubscriptionService:updatePaymentMethodCrypto', cryptoRequest);
|
|
350
342
|
return await this.getSubscriptions();
|
|
351
343
|
}
|
|
352
344
|
throw new Error('Invalid payment type');
|
|
@@ -357,7 +349,7 @@ class SubscriptionController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
357
349
|
* @returns The billing portal URL
|
|
358
350
|
*/
|
|
359
351
|
async getBillingPortalUrl() {
|
|
360
|
-
return await
|
|
352
|
+
return await this.messenger.call('SubscriptionService:getBillingPortalUrl');
|
|
361
353
|
}
|
|
362
354
|
/**
|
|
363
355
|
* Cache the last selected payment method for a specific product.
|
|
@@ -426,7 +418,7 @@ class SubscriptionController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
426
418
|
// we only support one product at a time for now
|
|
427
419
|
request.products[0], plan);
|
|
428
420
|
const billingCycles = productPrice.minBillingCycles;
|
|
429
|
-
await
|
|
421
|
+
await this.messenger.call('SubscriptionService:submitSponsorshipIntents', {
|
|
430
422
|
...request,
|
|
431
423
|
paymentTokenSymbol,
|
|
432
424
|
billingCycles,
|
|
@@ -441,7 +433,7 @@ class SubscriptionController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
441
433
|
* @example { event: SubscriptionUserEvent.ShieldEntryModalViewed, cohort: 'post_tx' }
|
|
442
434
|
*/
|
|
443
435
|
async submitUserEvent(request) {
|
|
444
|
-
await
|
|
436
|
+
await this.messenger.call('SubscriptionService:submitUserEvent', request);
|
|
445
437
|
}
|
|
446
438
|
/**
|
|
447
439
|
* Assign user to a cohort.
|
|
@@ -450,7 +442,7 @@ class SubscriptionController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
450
442
|
* @example { cohort: 'post_tx' }
|
|
451
443
|
*/
|
|
452
444
|
async assignUserToCohort(request) {
|
|
453
|
-
await
|
|
445
|
+
await this.messenger.call('SubscriptionService:assignUserToCohort', request);
|
|
454
446
|
}
|
|
455
447
|
/**
|
|
456
448
|
* Link rewards to a subscription.
|
|
@@ -465,7 +457,7 @@ class SubscriptionController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
465
457
|
// assert that the user is subscribed to the subscription
|
|
466
458
|
__classPrivateFieldGet(this, _SubscriptionController_instances, "m", _SubscriptionController_assertIsUserSubscribed).call(this, { subscriptionId: request.subscriptionId });
|
|
467
459
|
// link rewards to the subscription
|
|
468
|
-
const response = await
|
|
460
|
+
const response = await this.messenger.call('SubscriptionService:linkRewards', {
|
|
469
461
|
rewardAccountId: request.rewardAccountId,
|
|
470
462
|
});
|
|
471
463
|
if (!response.success) {
|
|
@@ -534,7 +526,7 @@ class SubscriptionController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
534
526
|
}
|
|
535
527
|
}
|
|
536
528
|
exports.SubscriptionController = SubscriptionController;
|
|
537
|
-
|
|
529
|
+
_SubscriptionController_instances = new WeakSet(), _SubscriptionController_getSubscriptionPriceAmount = function _SubscriptionController_getSubscriptionPriceAmount(price) {
|
|
538
530
|
// no need to use BigInt since max unitDecimals are always 2 for price
|
|
539
531
|
const amount = new bignumber_js_1.BigNumber(price.unitAmount)
|
|
540
532
|
.div(10 ** price.unitDecimals)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubscriptionController.cjs","sourceRoot":"","sources":["../src/SubscriptionController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n StateMetadata,\n ControllerStateChangeEvent,\n ControllerGetStateAction,\n} from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type { AuthenticationController } from '@metamask/profile-sync-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type { CaipAccountId, Hex } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport {\n ACTIVE_SUBSCRIPTION_STATUSES,\n controllerName,\n DEFAULT_POLLING_INTERVAL,\n SubscriptionControllerErrorMessage,\n} from './constants.js';\nimport type { SubscriptionControllerMethodActions } from './SubscriptionController-method-action-types.js';\nimport {\n PAYMENT_TYPES,\n PRODUCT_TYPES,\n SUBSCRIPTION_STATUSES,\n} from './types.js';\nimport type {\n AssignCohortRequest,\n BillingPortalResponse,\n GetCryptoApproveTransactionRequest,\n GetCryptoApproveTransactionResponse,\n GetSubscriptionsEligibilitiesRequest,\n ProductPrice,\n SubscriptionEligibility,\n StartCryptoSubscriptionRequest,\n SubmitUserEventRequest,\n TokenPaymentInfo,\n UpdatePaymentMethodCardResponse,\n UpdatePaymentMethodOpts,\n CachedLastSelectedPaymentMethod,\n SubmitSponsorshipIntentsMethodParams,\n RecurringInterval,\n SubscriptionStatus,\n LinkRewardsRequest,\n StartCryptoSubscriptionResponse,\n StartSubscriptionResponse,\n CancelSubscriptionRequest,\n} from './types.js';\nimport type {\n ISubscriptionService,\n PricingResponse,\n ProductType,\n StartSubscriptionRequest,\n Subscription,\n} from './types.js';\n\nexport type SubscriptionControllerState = {\n customerId?: string;\n trialedProducts: ProductType[];\n subscriptions: Subscription[];\n pricing?: PricingResponse;\n /** The last subscription that user has subscribed to if any. */\n lastSubscription?: Subscription;\n /** The reward account ID if user has linked rewards to the subscription. */\n rewardAccountId?: CaipAccountId;\n /**\n * The last selected payment method for the user.\n * This is used to display the last selected payment method in the UI.\n * This state is also meant to be used internally to track the last selected payment method for the user. (e.g. for crypto subscriptions)\n */\n lastSelectedPaymentMethod?: Record<\n ProductType,\n CachedLastSelectedPaymentMethod\n >;\n};\n\nexport type SubscriptionControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n SubscriptionControllerState\n>;\nexport type SubscriptionControllerActions =\n | SubscriptionControllerGetStateAction\n | SubscriptionControllerMethodActions;\n\nexport type AllowedActions =\n | AuthenticationController.AuthenticationControllerGetBearerTokenAction\n | AuthenticationController.AuthenticationControllerPerformSignOutAction;\n\n// Events\nexport type SubscriptionControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n SubscriptionControllerState\n>;\nexport type SubscriptionControllerEvents =\n SubscriptionControllerStateChangeEvent;\n\nexport type AllowedEvents =\n AuthenticationController.AuthenticationControllerStateChangeEvent;\n\n// Messenger\nexport type SubscriptionControllerMessenger = Messenger<\n typeof controllerName,\n SubscriptionControllerActions | AllowedActions,\n SubscriptionControllerEvents | AllowedEvents\n>;\n\n/**\n * Subscription Controller Options.\n */\nexport type SubscriptionControllerOptions = {\n messenger: SubscriptionControllerMessenger;\n\n /**\n * Initial state to set on this controller.\n */\n state?: Partial<SubscriptionControllerState>;\n\n /**\n * Subscription service to use for the subscription controller.\n */\n subscriptionService: ISubscriptionService;\n\n /**\n * Polling interval to use for the subscription controller.\n *\n * @default 5 minutes.\n */\n pollingInterval?: number;\n};\n\n/**\n * Get the default state for the Subscription Controller.\n *\n * @returns The default state for the Subscription Controller.\n */\nexport function getDefaultSubscriptionControllerState(): SubscriptionControllerState {\n return {\n subscriptions: [],\n trialedProducts: [],\n };\n}\n\n/**\n * Seedless Onboarding Controller State Metadata.\n *\n * This allows us to choose if fields of the state should be persisted or not\n * using the `persist` flag; and if they can be sent to Sentry or not, using\n * the `anonymous` flag.\n */\nconst subscriptionControllerMetadata: StateMetadata<SubscriptionControllerState> =\n {\n subscriptions: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastSubscription: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n customerId: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n rewardAccountId: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n trialedProducts: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n pricing: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n lastSelectedPaymentMethod: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n };\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getPricing',\n 'getSubscriptions',\n 'getSubscriptionByProduct',\n 'getSubscriptionsEligibilities',\n 'cancelSubscription',\n 'unCancelSubscription',\n 'startShieldSubscriptionWithCard',\n 'startSubscriptionWithCrypto',\n 'stopAllPolling',\n 'submitShieldSubscriptionCryptoApproval',\n 'getCryptoApproveTransactionParams',\n 'updatePaymentMethod',\n 'getBillingPortalUrl',\n 'cacheLastSelectedPaymentMethod',\n 'clearLastSelectedPaymentMethod',\n 'submitSponsorshipIntents',\n 'submitUserEvent',\n 'assignUserToCohort',\n 'linkRewards',\n 'getTokenApproveAmount',\n 'getTokenMinimumBalanceAmount',\n 'clearState',\n 'triggerAccessTokenRefresh',\n] as const;\n\nexport class SubscriptionController extends StaticIntervalPollingController()<\n typeof controllerName,\n SubscriptionControllerState,\n SubscriptionControllerMessenger\n> {\n readonly #subscriptionService: ISubscriptionService;\n\n /**\n * Creates a new SubscriptionController instance.\n *\n * @param options - The options for the SubscriptionController.\n * @param options.messenger - A restricted messenger.\n * @param options.state - Initial state to set on this controller.\n * @param options.subscriptionService - The subscription service for communicating with subscription server.\n * @param options.pollingInterval - The polling interval to use for the subscription controller.\n */\n constructor({\n messenger,\n state,\n subscriptionService,\n pollingInterval = DEFAULT_POLLING_INTERVAL,\n }: SubscriptionControllerOptions) {\n super({\n name: controllerName,\n metadata: subscriptionControllerMetadata,\n state: {\n ...getDefaultSubscriptionControllerState(),\n ...state,\n },\n messenger,\n });\n\n this.setIntervalLength(pollingInterval);\n this.#subscriptionService = subscriptionService;\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Gets the pricing information from the subscription service.\n *\n * @returns The pricing information.\n */\n async getPricing(): Promise<PricingResponse> {\n const pricing = await this.#subscriptionService.getPricing();\n this.update((state) => {\n state.pricing = pricing;\n });\n return pricing;\n }\n\n async getSubscriptions(): Promise<Subscription[]> {\n const currentSubscriptions = this.state.subscriptions;\n const currentTrialedProducts = this.state.trialedProducts;\n const currentCustomerId = this.state.customerId;\n const currentLastSubscription = this.state.lastSubscription;\n const currentRewardAccountId = this.state.rewardAccountId;\n\n const {\n customerId: newCustomerId,\n subscriptions: newSubscriptions,\n trialedProducts: newTrialedProducts,\n lastSubscription: newLastSubscription,\n rewardAccountId: newRewardAccountId,\n } = await this.#subscriptionService.getSubscriptions();\n\n // check if the new subscriptions are different from the current subscriptions\n const areSubscriptionsEqual = this.#areSubscriptionsEqual(\n currentSubscriptions,\n newSubscriptions,\n );\n // check if the new trialed products are different from the current trialed products\n const areTrialedProductsEqual = this.#areTrialedProductsEqual(\n currentTrialedProducts,\n newTrialedProducts,\n );\n // check if the new last subscription is different from the current last subscription\n const isLastSubscriptionEqual = this.#isSubscriptionEqual(\n currentLastSubscription,\n newLastSubscription,\n );\n\n const areCustomerIdsEqual = currentCustomerId === newCustomerId;\n const areRewardAccountIdsEqual =\n currentRewardAccountId === newRewardAccountId;\n // only update the state if the subscriptions or trialed products are different\n // this prevents unnecessary state updates events, easier for the clients to handle\n if (\n !areSubscriptionsEqual ||\n !isLastSubscriptionEqual ||\n !areTrialedProductsEqual ||\n !areCustomerIdsEqual ||\n !areRewardAccountIdsEqual\n ) {\n this.update((state) => {\n state.subscriptions = newSubscriptions;\n state.customerId = newCustomerId;\n state.trialedProducts = newTrialedProducts;\n state.lastSubscription = newLastSubscription;\n state.rewardAccountId = newRewardAccountId;\n });\n // trigger access token refresh to ensure the user has the latest access token if subscription state change\n this.triggerAccessTokenRefresh();\n }\n\n return newSubscriptions;\n }\n\n /**\n * Get the subscription by product.\n *\n * @param productType - The product type.\n * @returns The subscription.\n */\n getSubscriptionByProduct(productType: ProductType): Subscription | undefined {\n return this.state.subscriptions.find((subscription) =>\n subscription.products.some((product) => product.name === productType),\n );\n }\n\n /**\n * Get the subscriptions eligibilities.\n *\n * @param request - Optional request object containing user balance to check cohort eligibility.\n * @returns The subscriptions eligibilities.\n */\n async getSubscriptionsEligibilities(\n request?: GetSubscriptionsEligibilitiesRequest,\n ): Promise<SubscriptionEligibility[]> {\n return await this.#subscriptionService.getSubscriptionsEligibilities(\n request,\n );\n }\n\n async cancelSubscription(request: CancelSubscriptionRequest): Promise<void> {\n this.#assertIsUserSubscribed({ subscriptionId: request.subscriptionId });\n\n const cancelledSubscription =\n await this.#subscriptionService.cancelSubscription(request);\n\n this.update((state) => {\n state.subscriptions = state.subscriptions.map((subscription) =>\n subscription.id === request.subscriptionId\n ? { ...subscription, ...cancelledSubscription }\n : subscription,\n );\n });\n\n this.triggerAccessTokenRefresh();\n }\n\n async unCancelSubscription(request: {\n subscriptionId: string;\n }): Promise<void> {\n this.#assertIsUserSubscribed({ subscriptionId: request.subscriptionId });\n\n const uncancelledSubscription =\n await this.#subscriptionService.unCancelSubscription({\n subscriptionId: request.subscriptionId,\n });\n\n this.update((state) => {\n state.subscriptions = state.subscriptions.map((subscription) =>\n subscription.id === request.subscriptionId\n ? { ...subscription, ...uncancelledSubscription }\n : subscription,\n );\n });\n\n this.triggerAccessTokenRefresh();\n }\n\n async startShieldSubscriptionWithCard(\n request: StartSubscriptionRequest,\n ): Promise<StartSubscriptionResponse> {\n this.#assertIsUserNotSubscribed({ products: request.products });\n\n const response =\n await this.#subscriptionService.startSubscriptionWithCard(request);\n // note: no need to trigger access token refresh after startSubscriptionWithCard request because this only return stripe checkout session url, subscription not created yet\n\n return response;\n }\n\n async startSubscriptionWithCrypto(\n request: StartCryptoSubscriptionRequest,\n ): Promise<StartCryptoSubscriptionResponse> {\n this.#assertIsUserNotSubscribed({ products: request.products });\n const response =\n await this.#subscriptionService.startSubscriptionWithCrypto(request);\n\n return response;\n }\n\n /**\n * Handles shield subscription crypto approval transactions.\n *\n * @param txMeta - The transaction metadata.\n * @param isSponsored - Whether the transaction is sponsored.\n * @param rewardAccountId - The account ID of the reward subscription to link to the shield subscription.\n * @returns void\n */\n async submitShieldSubscriptionCryptoApproval(\n txMeta: TransactionMeta,\n isSponsored?: boolean,\n rewardAccountId?: CaipAccountId,\n ): Promise<void> {\n if (txMeta.type !== TransactionType.shieldSubscriptionApprove) {\n return;\n }\n\n const { chainId, rawTx } = txMeta;\n if (!chainId || !rawTx) {\n throw new Error('Chain ID or raw transaction not found');\n }\n\n const { pricing, trialedProducts, lastSelectedPaymentMethod } = this.state;\n if (!pricing) {\n throw new Error('Subscription pricing not found');\n }\n if (!lastSelectedPaymentMethod) {\n throw new Error('Last selected payment method not found');\n }\n const lastSelectedPaymentMethodShield =\n lastSelectedPaymentMethod[PRODUCT_TYPES.SHIELD];\n this.#assertIsPaymentMethodCrypto(lastSelectedPaymentMethodShield);\n\n const productPrice = this.#getProductPriceByProductAndPlan(\n PRODUCT_TYPES.SHIELD,\n lastSelectedPaymentMethodShield.plan,\n );\n const isTrialed = trialedProducts?.includes(PRODUCT_TYPES.SHIELD);\n // get the latest subscriptions state to check if the user has an active shield subscription\n await this.getSubscriptions();\n const currentSubscription = this.state.subscriptions.find((subscription) =>\n subscription.products.some(\n (product) => product.name === PRODUCT_TYPES.SHIELD,\n ),\n );\n\n this.#assertValidSubscriptionStateForCryptoApproval({\n productType: PRODUCT_TYPES.SHIELD,\n });\n // if shield subscription exists, this transaction is for changing payment method\n const isChangePaymentMethod = Boolean(currentSubscription);\n\n if (isChangePaymentMethod) {\n await this.updatePaymentMethod({\n paymentType: PAYMENT_TYPES.byCrypto,\n subscriptionId: (currentSubscription as Subscription).id,\n chainId,\n payerAddress: txMeta.txParams.from as Hex,\n tokenSymbol: lastSelectedPaymentMethodShield.paymentTokenSymbol,\n rawTransaction: rawTx as Hex,\n recurringInterval: productPrice.interval,\n billingCycles: productPrice.minBillingCycles,\n });\n } else {\n const params = {\n products: [PRODUCT_TYPES.SHIELD],\n isTrialRequested: !isTrialed,\n recurringInterval: productPrice.interval,\n billingCycles: productPrice.minBillingCycles,\n chainId,\n payerAddress: txMeta.txParams.from as Hex,\n tokenSymbol: lastSelectedPaymentMethodShield.paymentTokenSymbol,\n rawTransaction: rawTx as Hex,\n isSponsored,\n useTestClock: lastSelectedPaymentMethodShield.useTestClock,\n rewardAccountId,\n };\n await this.startSubscriptionWithCrypto(params);\n }\n\n // update the subscriptions state after subscription created in server\n await this.getSubscriptions();\n }\n\n /**\n * Get transaction params to create crypto approve transaction for subscription payment\n *\n * @param request - The request object\n * @param request.chainId - The chain ID\n * @param request.tokenAddress - The address of the token\n * @param request.productType - The product type\n * @param request.interval - The interval\n * @returns The crypto approve transaction params\n */\n getCryptoApproveTransactionParams(\n request: GetCryptoApproveTransactionRequest,\n ): GetCryptoApproveTransactionResponse {\n const { pricing } = this.state;\n if (!pricing) {\n throw new Error('Subscription pricing not found');\n }\n const product = pricing.products.find(\n (productInfo) => productInfo.name === request.productType,\n );\n if (!product) {\n throw new Error('Product price not found');\n }\n\n const price = product.prices.find(\n (productPrice) => productPrice.interval === request.interval,\n );\n if (!price) {\n throw new Error('Price not found');\n }\n\n const chainsPaymentInfo = pricing.paymentMethods.find(\n (paymentMethod) => paymentMethod.type === PAYMENT_TYPES.byCrypto,\n );\n if (!chainsPaymentInfo) {\n throw new Error('Chains payment info not found');\n }\n const chainPaymentInfo = chainsPaymentInfo.chains?.find(\n (chain) => chain.chainId === request.chainId,\n );\n if (!chainPaymentInfo) {\n throw new Error('Invalid chain id');\n }\n const tokenPaymentInfo = chainPaymentInfo.tokens.find(\n (token) =>\n token.address.toLowerCase() ===\n request.paymentTokenAddress.toLowerCase(),\n );\n if (!tokenPaymentInfo) {\n throw new Error('Invalid token address');\n }\n\n const tokenApproveAmount = this.getTokenApproveAmount(\n price,\n tokenPaymentInfo,\n );\n\n return {\n approveAmount: tokenApproveAmount,\n paymentAddress: chainPaymentInfo.paymentAddress,\n paymentTokenAddress: request.paymentTokenAddress,\n chainId: request.chainId,\n };\n }\n\n async updatePaymentMethod(\n opts: UpdatePaymentMethodOpts,\n ): Promise<UpdatePaymentMethodCardResponse | Subscription[]> {\n if (opts.paymentType === PAYMENT_TYPES.byCard) {\n const { paymentType, ...cardRequest } = opts;\n return await this.#subscriptionService.updatePaymentMethodCard(\n cardRequest,\n );\n } else if (opts.paymentType === PAYMENT_TYPES.byCrypto) {\n const { paymentType, ...cryptoRequest } = opts;\n await this.#subscriptionService.updatePaymentMethodCrypto(cryptoRequest);\n return await this.getSubscriptions();\n }\n throw new Error('Invalid payment type');\n }\n\n /**\n * Gets the billing portal URL.\n *\n * @returns The billing portal URL\n */\n async getBillingPortalUrl(): Promise<BillingPortalResponse> {\n return await this.#subscriptionService.getBillingPortalUrl();\n }\n\n /**\n * Cache the last selected payment method for a specific product.\n *\n * @param product - The product to cache the payment method for.\n * @param paymentMethod - The payment method to cache.\n * @param paymentMethod.type - The type of the payment method.\n * @param paymentMethod.paymentTokenAddress - The payment token address.\n * @param paymentMethod.plan - The plan of the payment method.\n * @param paymentMethod.product - The product of the payment method.\n */\n cacheLastSelectedPaymentMethod(\n product: ProductType,\n paymentMethod: CachedLastSelectedPaymentMethod,\n ): void {\n if (\n paymentMethod.type === PAYMENT_TYPES.byCrypto &&\n (!paymentMethod.paymentTokenAddress || !paymentMethod.paymentTokenSymbol)\n ) {\n throw new Error(\n SubscriptionControllerErrorMessage.PaymentTokenAddressAndSymbolRequiredForCrypto,\n );\n }\n\n this.update((state) => {\n state.lastSelectedPaymentMethod = {\n ...state.lastSelectedPaymentMethod,\n [product]: paymentMethod,\n };\n });\n }\n\n /**\n * Clear the last selected payment method for a specific product.\n *\n * @param product - The product to clear the payment method for.\n */\n clearLastSelectedPaymentMethod(product: ProductType): void {\n this.update((state) => {\n if (state.lastSelectedPaymentMethod) {\n const { [product]: _, ...rest } = state.lastSelectedPaymentMethod;\n state.lastSelectedPaymentMethod =\n rest as typeof state.lastSelectedPaymentMethod;\n }\n });\n }\n\n /**\n * Submit sponsorship intents to the Subscription Service backend.\n *\n * This is intended to be used together with the crypto subscription flow.\n * When the user has enabled the smart transaction feature, we will sponsor the gas fees for the subscription approval transaction.\n *\n * @param request - Request object containing the address and products.\n * @example {\n * address: '0x1234567890123456789012345678901234567890',\n * products: [ProductType.Shield],\n * recurringInterval: RecurringInterval.Month,\n * billingCycles: 1,\n * }\n * @returns resolves to true if the sponsorship is supported and intents were submitted successfully, false otherwise\n */\n async submitSponsorshipIntents(\n request: SubmitSponsorshipIntentsMethodParams,\n ): Promise<boolean> {\n if (request.products.length === 0) {\n throw new Error(\n SubscriptionControllerErrorMessage.SubscriptionProductsEmpty,\n );\n }\n\n this.#assertIsUserNotSubscribed({ products: request.products });\n\n const selectedPaymentMethod =\n this.state.lastSelectedPaymentMethod?.[request.products[0]];\n this.#assertIsPaymentMethodCrypto(selectedPaymentMethod);\n\n const isEligibleForTrialedSponsorship =\n this.#getIsEligibleForTrialedSponsorship(\n request.chainId,\n request.products,\n );\n if (!isEligibleForTrialedSponsorship) {\n return false;\n }\n\n const { paymentTokenSymbol, plan } = selectedPaymentMethod;\n const productPrice = this.#getProductPriceByProductAndPlan(\n // we only support one product at a time for now\n request.products[0],\n plan,\n );\n const billingCycles = productPrice.minBillingCycles;\n\n await this.#subscriptionService.submitSponsorshipIntents({\n ...request,\n paymentTokenSymbol,\n billingCycles,\n recurringInterval: plan,\n });\n return true;\n }\n\n /**\n * Submit a user event from the UI. (e.g. shield modal viewed)\n *\n * @param request - Request object containing the event to submit.\n * @example { event: SubscriptionUserEvent.ShieldEntryModalViewed, cohort: 'post_tx' }\n */\n async submitUserEvent(request: SubmitUserEventRequest): Promise<void> {\n await this.#subscriptionService.submitUserEvent(request);\n }\n\n /**\n * Assign user to a cohort.\n *\n * @param request - Request object containing the cohort to assign the user to.\n * @example { cohort: 'post_tx' }\n */\n async assignUserToCohort(request: AssignCohortRequest): Promise<void> {\n await this.#subscriptionService.assignUserToCohort(request);\n }\n\n /**\n * Link rewards to a subscription.\n *\n * @param request - Request object containing the reward subscription ID.\n * @param request.subscriptionId - The ID of the subscription to link rewards to.\n * @param request.rewardAccountId - The account ID of the reward subscription to link to the subscription.\n * @example { subscriptionId: '1234567890', rewardAccountId: 'eip155:1:0x1234567890123456789012345678901234567890' }\n * @returns Resolves when the rewards are linked successfully.\n */\n async linkRewards(\n request: LinkRewardsRequest & { subscriptionId: string },\n ): Promise<void> {\n // assert that the user is subscribed to the subscription\n this.#assertIsUserSubscribed({ subscriptionId: request.subscriptionId });\n\n // link rewards to the subscription\n const response = await this.#subscriptionService.linkRewards({\n rewardAccountId: request.rewardAccountId,\n });\n if (!response.success) {\n throw new Error(SubscriptionControllerErrorMessage.LinkRewardsFailed);\n }\n }\n\n async _executePoll(): Promise<void> {\n await this.getSubscriptions();\n }\n\n /**\n * Calculate total subscription price amount (approval amount) from price info\n * e.g: $8 per month * 12 months min billing cycles = $96\n *\n * @param price - The price info\n * @returns The price amount\n */\n #getSubscriptionPriceAmount(price: ProductPrice): string {\n // no need to use BigInt since max unitDecimals are always 2 for price\n const amount = new BigNumber(price.unitAmount)\n .div(10 ** price.unitDecimals)\n .multipliedBy(price.minBillingCycles)\n .toString();\n return amount;\n }\n\n /**\n * Calculate minimum subscription balance amount from price info\n *\n * @param price - The price info\n * @returns The balance amount\n */\n #getSubscriptionBalanceAmount(price: ProductPrice): string {\n // no need to use BigInt since max unitDecimals are always 2 for price\n const amount = new BigNumber(price.unitAmount)\n .div(10 ** price.unitDecimals)\n .multipliedBy(price.minBillingCyclesForBalance)\n .toString();\n return amount;\n }\n\n /**\n * Calculate token approve amount from price info\n *\n * @param price - The price info\n * @param tokenPaymentInfo - The token price info\n * @returns The token approve amount\n */\n getTokenApproveAmount(\n price: ProductPrice,\n tokenPaymentInfo: TokenPaymentInfo,\n ): string {\n const conversionRate =\n tokenPaymentInfo.conversionRate[\n price.currency as keyof typeof tokenPaymentInfo.conversionRate\n ];\n if (!conversionRate) {\n throw new Error('Conversion rate not found');\n }\n // price of the product\n const priceAmount = new BigNumber(this.#getSubscriptionPriceAmount(price));\n\n const tokenDecimal = new BigNumber(10).pow(tokenPaymentInfo.decimals);\n const tokenAmount = priceAmount\n .multipliedBy(tokenDecimal)\n .div(conversionRate);\n return tokenAmount.toFixed(0);\n }\n\n /**\n * Calculate token minimum balance amount from price info\n *\n * @param price - The price info\n * @param tokenPaymentInfo - The token price info\n * @returns The token balance amount\n */\n getTokenMinimumBalanceAmount(\n price: ProductPrice,\n tokenPaymentInfo: TokenPaymentInfo,\n ): string {\n const conversionRate =\n tokenPaymentInfo.conversionRate[\n price.currency as keyof typeof tokenPaymentInfo.conversionRate\n ];\n if (!conversionRate) {\n throw new Error('Conversion rate not found');\n }\n const balanceAmount = new BigNumber(\n this.#getSubscriptionBalanceAmount(price),\n );\n\n const tokenDecimal = new BigNumber(10).pow(tokenPaymentInfo.decimals);\n const tokenAmount = balanceAmount\n .multipliedBy(tokenDecimal)\n .div(conversionRate);\n return tokenAmount.toFixed(0);\n }\n\n /**\n * Clears the subscription state and resets to default values.\n */\n clearState(): void {\n const defaultState = getDefaultSubscriptionControllerState();\n this.update(() => {\n return defaultState;\n });\n }\n\n /**\n * Triggers an access token refresh.\n */\n triggerAccessTokenRefresh(): void {\n // We perform a sign out to clear the access token from the authentication\n // controller. Next time the access token is requested, a new access token\n // will be fetched.\n this.messenger.call('AuthenticationController:performSignOut');\n }\n\n #getProductPriceByProductAndPlan(\n productType: ProductType,\n plan: RecurringInterval,\n ): ProductPrice {\n const { pricing } = this.state;\n const productPricing = pricing?.products.find(\n (product) => product.name === productType,\n );\n const productPrice = productPricing?.prices.find(\n (price) => price.interval === plan,\n );\n if (!productPrice) {\n throw new Error(SubscriptionControllerErrorMessage.ProductPriceNotFound);\n }\n return productPrice;\n }\n\n #assertValidSubscriptionStateForCryptoApproval({\n productType,\n }: {\n productType: ProductType;\n }): void {\n const subscription = this.state.subscriptions.find((sub) =>\n sub.products.some((product) => product.name === productType),\n );\n\n const isValid =\n !subscription ||\n (\n [\n SUBSCRIPTION_STATUSES.pastDue,\n SUBSCRIPTION_STATUSES.unpaid,\n SUBSCRIPTION_STATUSES.paused,\n SUBSCRIPTION_STATUSES.provisional,\n SUBSCRIPTION_STATUSES.active,\n SUBSCRIPTION_STATUSES.trialing,\n ] as SubscriptionStatus[]\n ).includes(subscription.status);\n if (!isValid) {\n throw new Error(\n SubscriptionControllerErrorMessage.SubscriptionNotValidForCryptoApproval,\n );\n }\n }\n\n #assertIsUserNotSubscribed({ products }: { products: ProductType[] }): void {\n const subscription = this.state.subscriptions.find((sub) =>\n sub.products.some((product) => products.includes(product.name)),\n );\n\n if (\n subscription &&\n ACTIVE_SUBSCRIPTION_STATUSES.includes(subscription.status)\n ) {\n throw new Error(SubscriptionControllerErrorMessage.UserAlreadySubscribed);\n }\n }\n\n #assertIsUserSubscribed(request: { subscriptionId: string }): void {\n if (\n !this.state.subscriptions.find(\n (subscription) => subscription.id === request.subscriptionId,\n )\n ) {\n throw new Error(SubscriptionControllerErrorMessage.UserNotSubscribed);\n }\n }\n\n /**\n * Asserts that the value is a valid crypto payment method.\n *\n * @param value - The value to assert.\n * @throws an error if the value is not a valid crypto payment method.\n */\n #assertIsPaymentMethodCrypto(\n value: CachedLastSelectedPaymentMethod | undefined,\n ): asserts value is Required<CachedLastSelectedPaymentMethod> {\n if (\n value?.type !== PAYMENT_TYPES.byCrypto ||\n !value.paymentTokenAddress ||\n !value.paymentTokenSymbol\n ) {\n throw new Error(\n SubscriptionControllerErrorMessage.PaymentMethodNotCrypto,\n );\n }\n }\n\n /**\n * Determines if the user is eligible for trialed sponsorship for the given chain and products.\n * The user is eligible if the chain supports sponsorship and the user has not trialed the provided products before.\n *\n * @param chainId - The chain ID\n * @param products - The products to check eligibility for\n * @returns True if the user is eligible for trialed sponsorship, false otherwise\n */\n #getIsEligibleForTrialedSponsorship(\n chainId: Hex,\n products: ProductType[],\n ): boolean {\n const isSponsorshipSupported = this.#getChainSupportsSponsorship(chainId);\n\n // verify if the user has trialed the provided products before\n const hasTrialedBefore = this.state.trialedProducts.some((product) =>\n products.includes(product),\n );\n\n return isSponsorshipSupported && !hasTrialedBefore;\n }\n\n #getChainSupportsSponsorship(chainId: Hex): boolean {\n const cryptoPaymentInfo = this.state.pricing?.paymentMethods.find(\n (paymentMethod) => paymentMethod.type === PAYMENT_TYPES.byCrypto,\n );\n\n const isSponsorshipSupported = cryptoPaymentInfo?.chains?.find(\n (chain) => chain.chainId === chainId,\n )?.isSponsorshipSupported;\n return Boolean(isSponsorshipSupported);\n }\n\n /**\n * Determines whether two trialed products arrays are equal by comparing all products in the arrays.\n *\n * @param oldTrialedProducts - The first trialed products array to compare.\n * @param newTrialedProducts - The second trialed products array to compare.\n * @returns True if the trialed products arrays are equal, false otherwise.\n */\n #areTrialedProductsEqual(\n oldTrialedProducts: ProductType[],\n newTrialedProducts: ProductType[],\n ): boolean {\n return (\n oldTrialedProducts.length === newTrialedProducts?.length &&\n oldTrialedProducts.every((product) =>\n newTrialedProducts?.includes(product),\n )\n );\n }\n\n /**\n * Determines whether two subscription arrays are equal by comparing all properties\n * of each subscription in the arrays.\n *\n * @param oldSubs - The first subscription array to compare.\n * @param newSubs - The second subscription array to compare.\n * @returns True if the subscription arrays are equal, false otherwise.\n */\n #areSubscriptionsEqual(\n oldSubs: Subscription[],\n newSubs: Subscription[],\n ): boolean {\n // Check if arrays have different lengths\n if (oldSubs.length !== newSubs.length) {\n return false;\n }\n\n // Sort both arrays by id to ensure consistent comparison\n const sortedOldSubs = [...oldSubs].sort((a, b) => a.id.localeCompare(b.id));\n const sortedNewSubs = [...newSubs].sort((a, b) => a.id.localeCompare(b.id));\n\n // Check if all subscriptions are equal\n return sortedOldSubs.every((oldSub, index) => {\n const newSub = sortedNewSubs[index];\n return this.#isSubscriptionEqual(oldSub, newSub);\n });\n }\n\n #isSubscriptionEqual(oldSub?: Subscription, newSub?: Subscription): boolean {\n // not equal if one is undefined and the other is defined\n if (!oldSub || !newSub) {\n if (!oldSub && !newSub) {\n return true;\n }\n return false;\n }\n\n return (\n this.#stringifySubscription(oldSub) ===\n this.#stringifySubscription(newSub)\n );\n }\n\n #stringifySubscription(subscription: Subscription): string {\n const subsWithSortedProducts = {\n ...subscription,\n // order the products by name\n products: [...subscription.products].sort((a, b) =>\n a.name.localeCompare(b.name),\n ),\n };\n\n return JSON.stringify(subsWithSortedProducts);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SubscriptionController.cjs","sourceRoot":"","sources":["../src/SubscriptionController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n StateMetadata,\n ControllerStateChangeEvent,\n ControllerGetStateAction,\n} from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type { AuthenticationController } from '@metamask/profile-sync-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type { CaipAccountId, Hex } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport {\n ACTIVE_SUBSCRIPTION_STATUSES,\n controllerName,\n DEFAULT_POLLING_INTERVAL,\n SubscriptionControllerErrorMessage,\n} from './constants.js';\nimport type { SubscriptionControllerMethodActions } from './SubscriptionController-method-action-types.js';\nimport type {\n SubscriptionServiceAssignUserToCohortAction,\n SubscriptionServiceCancelSubscriptionAction,\n SubscriptionServiceGetBillingPortalUrlAction,\n SubscriptionServiceGetPricingAction,\n SubscriptionServiceGetSubscriptionsAction,\n SubscriptionServiceGetSubscriptionsEligibilitiesAction,\n SubscriptionServiceLinkRewardsAction,\n SubscriptionServiceStartSubscriptionWithCardAction,\n SubscriptionServiceStartSubscriptionWithCryptoAction,\n SubscriptionServiceSubmitSponsorshipIntentsAction,\n SubscriptionServiceSubmitUserEventAction,\n SubscriptionServiceUnCancelSubscriptionAction,\n SubscriptionServiceUpdatePaymentMethodCardAction,\n SubscriptionServiceUpdatePaymentMethodCryptoAction,\n} from './SubscriptionService-method-action-types.js';\nimport {\n PAYMENT_TYPES,\n PRODUCT_TYPES,\n SUBSCRIPTION_STATUSES,\n} from './types.js';\nimport type {\n AssignCohortRequest,\n BillingPortalResponse,\n GetCryptoApproveTransactionRequest,\n GetCryptoApproveTransactionResponse,\n GetSubscriptionsEligibilitiesRequest,\n ProductPrice,\n SubscriptionEligibility,\n StartCryptoSubscriptionRequest,\n SubmitUserEventRequest,\n TokenPaymentInfo,\n UpdatePaymentMethodCardResponse,\n UpdatePaymentMethodOpts,\n CachedLastSelectedPaymentMethod,\n SubmitSponsorshipIntentsMethodParams,\n RecurringInterval,\n SubscriptionStatus,\n LinkRewardsRequest,\n StartCryptoSubscriptionResponse,\n StartSubscriptionResponse,\n CancelSubscriptionRequest,\n} from './types.js';\nimport type {\n PricingResponse,\n ProductType,\n StartSubscriptionRequest,\n Subscription,\n} from './types.js';\n\nexport type SubscriptionControllerState = {\n customerId?: string;\n trialedProducts: ProductType[];\n subscriptions: Subscription[];\n pricing?: PricingResponse;\n /** The last subscription that user has subscribed to if any. */\n lastSubscription?: Subscription;\n /** The reward account ID if user has linked rewards to the subscription. */\n rewardAccountId?: CaipAccountId;\n /**\n * The last selected payment method for the user.\n * This is used to display the last selected payment method in the UI.\n * This state is also meant to be used internally to track the last selected payment method for the user. (e.g. for crypto subscriptions)\n */\n lastSelectedPaymentMethod?: Record<\n ProductType,\n CachedLastSelectedPaymentMethod\n >;\n};\n\nexport type SubscriptionControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n SubscriptionControllerState\n>;\nexport type SubscriptionControllerActions =\n | SubscriptionControllerGetStateAction\n | SubscriptionControllerMethodActions;\n\ntype AllowedActions =\n | SubscriptionServiceGetPricingAction\n | SubscriptionServiceGetSubscriptionsAction\n | SubscriptionServiceGetSubscriptionsEligibilitiesAction\n | SubscriptionServiceCancelSubscriptionAction\n | SubscriptionServiceUnCancelSubscriptionAction\n | SubscriptionServiceStartSubscriptionWithCardAction\n | SubscriptionServiceStartSubscriptionWithCryptoAction\n | SubscriptionServiceUpdatePaymentMethodCardAction\n | SubscriptionServiceUpdatePaymentMethodCryptoAction\n | SubscriptionServiceGetBillingPortalUrlAction\n | SubscriptionServiceSubmitSponsorshipIntentsAction\n | SubscriptionServiceSubmitUserEventAction\n | SubscriptionServiceAssignUserToCohortAction\n | SubscriptionServiceLinkRewardsAction\n | AuthenticationController.AuthenticationControllerPerformSignOutAction;\n\n// Events\nexport type SubscriptionControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n SubscriptionControllerState\n>;\nexport type SubscriptionControllerEvents =\n SubscriptionControllerStateChangeEvent;\n\ntype AllowedEvents = never;\n\n// Messenger\nexport type SubscriptionControllerMessenger = Messenger<\n typeof controllerName,\n SubscriptionControllerActions | AllowedActions,\n SubscriptionControllerEvents | AllowedEvents\n>;\n\n/**\n * Subscription Controller Options.\n */\nexport type SubscriptionControllerOptions = {\n messenger: SubscriptionControllerMessenger;\n\n /**\n * Initial state to set on this controller.\n */\n state?: Partial<SubscriptionControllerState>;\n\n /**\n * Polling interval to use for the subscription controller.\n *\n * @default 5 minutes.\n */\n pollingInterval?: number;\n};\n\n/**\n * Get the default state for the Subscription Controller.\n *\n * @returns The default state for the Subscription Controller.\n */\nexport function getDefaultSubscriptionControllerState(): SubscriptionControllerState {\n return {\n subscriptions: [],\n trialedProducts: [],\n };\n}\n\n/**\n * Seedless Onboarding Controller State Metadata.\n *\n * This allows us to choose if fields of the state should be persisted or not\n * using the `persist` flag; and if they can be sent to Sentry or not, using\n * the `anonymous` flag.\n */\nconst subscriptionControllerMetadata: StateMetadata<SubscriptionControllerState> =\n {\n subscriptions: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastSubscription: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n customerId: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n rewardAccountId: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n trialedProducts: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n pricing: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n lastSelectedPaymentMethod: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n };\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getPricing',\n 'getSubscriptions',\n 'getSubscriptionByProduct',\n 'getSubscriptionsEligibilities',\n 'cancelSubscription',\n 'unCancelSubscription',\n 'startShieldSubscriptionWithCard',\n 'startSubscriptionWithCrypto',\n 'stopAllPolling',\n 'submitShieldSubscriptionCryptoApproval',\n 'getCryptoApproveTransactionParams',\n 'updatePaymentMethod',\n 'getBillingPortalUrl',\n 'cacheLastSelectedPaymentMethod',\n 'clearLastSelectedPaymentMethod',\n 'submitSponsorshipIntents',\n 'submitUserEvent',\n 'assignUserToCohort',\n 'linkRewards',\n 'getTokenApproveAmount',\n 'getTokenMinimumBalanceAmount',\n 'clearState',\n 'triggerAccessTokenRefresh',\n] as const;\n\nexport class SubscriptionController extends StaticIntervalPollingController()<\n typeof controllerName,\n SubscriptionControllerState,\n SubscriptionControllerMessenger\n> {\n /**\n * Creates a new SubscriptionController instance.\n *\n * @param options - The options for the SubscriptionController.\n * @param options.messenger - A restricted messenger.\n * @param options.state - Initial state to set on this controller.\n * @param options.pollingInterval - The polling interval to use for the subscription controller.\n */\n constructor(options: SubscriptionControllerOptions) {\n const {\n messenger,\n state,\n pollingInterval = DEFAULT_POLLING_INTERVAL,\n } = options;\n super({\n name: controllerName,\n metadata: subscriptionControllerMetadata,\n state: {\n ...getDefaultSubscriptionControllerState(),\n ...state,\n },\n messenger,\n });\n\n this.setIntervalLength(pollingInterval);\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Gets the pricing information from the subscription service.\n *\n * @returns The pricing information.\n */\n async getPricing(): Promise<PricingResponse> {\n const pricing = await this.messenger.call('SubscriptionService:getPricing');\n this.update((state) => {\n state.pricing = pricing;\n });\n return pricing;\n }\n\n async getSubscriptions(): Promise<Subscription[]> {\n const currentSubscriptions = this.state.subscriptions;\n const currentTrialedProducts = this.state.trialedProducts;\n const currentCustomerId = this.state.customerId;\n const currentLastSubscription = this.state.lastSubscription;\n const currentRewardAccountId = this.state.rewardAccountId;\n\n const {\n customerId: newCustomerId,\n subscriptions: newSubscriptions,\n trialedProducts: newTrialedProducts,\n lastSubscription: newLastSubscription,\n rewardAccountId: newRewardAccountId,\n } = await this.messenger.call('SubscriptionService:getSubscriptions');\n\n // check if the new subscriptions are different from the current subscriptions\n const areSubscriptionsEqual = this.#areSubscriptionsEqual(\n currentSubscriptions,\n newSubscriptions,\n );\n // check if the new trialed products are different from the current trialed products\n const areTrialedProductsEqual = this.#areTrialedProductsEqual(\n currentTrialedProducts,\n newTrialedProducts,\n );\n // check if the new last subscription is different from the current last subscription\n const isLastSubscriptionEqual = this.#isSubscriptionEqual(\n currentLastSubscription,\n newLastSubscription,\n );\n\n const areCustomerIdsEqual = currentCustomerId === newCustomerId;\n const areRewardAccountIdsEqual =\n currentRewardAccountId === newRewardAccountId;\n // only update the state if the subscriptions or trialed products are different\n // this prevents unnecessary state updates events, easier for the clients to handle\n if (\n !areSubscriptionsEqual ||\n !isLastSubscriptionEqual ||\n !areTrialedProductsEqual ||\n !areCustomerIdsEqual ||\n !areRewardAccountIdsEqual\n ) {\n this.update((state) => {\n state.subscriptions = newSubscriptions;\n state.customerId = newCustomerId;\n state.trialedProducts = newTrialedProducts;\n state.lastSubscription = newLastSubscription;\n state.rewardAccountId = newRewardAccountId;\n });\n // trigger access token refresh to ensure the user has the latest access token if subscription state change\n this.triggerAccessTokenRefresh();\n }\n\n return newSubscriptions;\n }\n\n /**\n * Get the subscription by product.\n *\n * @param productType - The product type.\n * @returns The subscription.\n */\n getSubscriptionByProduct(productType: ProductType): Subscription | undefined {\n return this.state.subscriptions.find((subscription) =>\n subscription.products.some((product) => product.name === productType),\n );\n }\n\n /**\n * Get the subscriptions eligibilities.\n *\n * @param request - Optional request object containing user balance to check cohort eligibility.\n * @returns The subscriptions eligibilities.\n */\n async getSubscriptionsEligibilities(\n request?: GetSubscriptionsEligibilitiesRequest,\n ): Promise<SubscriptionEligibility[]> {\n return await this.messenger.call(\n 'SubscriptionService:getSubscriptionsEligibilities',\n request,\n );\n }\n\n async cancelSubscription(request: CancelSubscriptionRequest): Promise<void> {\n this.#assertIsUserSubscribed({ subscriptionId: request.subscriptionId });\n\n const cancelledSubscription = await this.messenger.call(\n 'SubscriptionService:cancelSubscription',\n request,\n );\n\n this.update((state) => {\n state.subscriptions = state.subscriptions.map((subscription) =>\n subscription.id === request.subscriptionId\n ? { ...subscription, ...cancelledSubscription }\n : subscription,\n );\n });\n\n this.triggerAccessTokenRefresh();\n }\n\n async unCancelSubscription(request: {\n subscriptionId: string;\n }): Promise<void> {\n this.#assertIsUserSubscribed({ subscriptionId: request.subscriptionId });\n\n const uncancelledSubscription = await this.messenger.call(\n 'SubscriptionService:unCancelSubscription',\n {\n subscriptionId: request.subscriptionId,\n },\n );\n\n this.update((state) => {\n state.subscriptions = state.subscriptions.map((subscription) =>\n subscription.id === request.subscriptionId\n ? { ...subscription, ...uncancelledSubscription }\n : subscription,\n );\n });\n\n this.triggerAccessTokenRefresh();\n }\n\n async startShieldSubscriptionWithCard(\n request: StartSubscriptionRequest,\n ): Promise<StartSubscriptionResponse> {\n this.#assertIsUserNotSubscribed({ products: request.products });\n\n const response = await this.messenger.call(\n 'SubscriptionService:startSubscriptionWithCard',\n request,\n );\n // note: no need to trigger access token refresh after startSubscriptionWithCard request because this only return stripe checkout session url, subscription not created yet\n\n return response;\n }\n\n async startSubscriptionWithCrypto(\n request: StartCryptoSubscriptionRequest,\n ): Promise<StartCryptoSubscriptionResponse> {\n this.#assertIsUserNotSubscribed({ products: request.products });\n const response = await this.messenger.call(\n 'SubscriptionService:startSubscriptionWithCrypto',\n request,\n );\n\n return response;\n }\n\n /**\n * Handles shield subscription crypto approval transactions.\n *\n * @param txMeta - The transaction metadata.\n * @param isSponsored - Whether the transaction is sponsored.\n * @param rewardAccountId - The account ID of the reward subscription to link to the shield subscription.\n * @returns void\n */\n async submitShieldSubscriptionCryptoApproval(\n txMeta: TransactionMeta,\n isSponsored?: boolean,\n rewardAccountId?: CaipAccountId,\n ): Promise<void> {\n if (txMeta.type !== TransactionType.shieldSubscriptionApprove) {\n return;\n }\n\n const { chainId, rawTx } = txMeta;\n if (!chainId || !rawTx) {\n throw new Error('Chain ID or raw transaction not found');\n }\n\n const { pricing, trialedProducts, lastSelectedPaymentMethod } = this.state;\n if (!pricing) {\n throw new Error('Subscription pricing not found');\n }\n if (!lastSelectedPaymentMethod) {\n throw new Error('Last selected payment method not found');\n }\n const lastSelectedPaymentMethodShield =\n lastSelectedPaymentMethod[PRODUCT_TYPES.SHIELD];\n this.#assertIsPaymentMethodCrypto(lastSelectedPaymentMethodShield);\n\n const productPrice = this.#getProductPriceByProductAndPlan(\n PRODUCT_TYPES.SHIELD,\n lastSelectedPaymentMethodShield.plan,\n );\n const isTrialed = trialedProducts?.includes(PRODUCT_TYPES.SHIELD);\n // get the latest subscriptions state to check if the user has an active shield subscription\n await this.getSubscriptions();\n const currentSubscription = this.state.subscriptions.find((subscription) =>\n subscription.products.some(\n (product) => product.name === PRODUCT_TYPES.SHIELD,\n ),\n );\n\n this.#assertValidSubscriptionStateForCryptoApproval({\n productType: PRODUCT_TYPES.SHIELD,\n });\n // if shield subscription exists, this transaction is for changing payment method\n const isChangePaymentMethod = Boolean(currentSubscription);\n\n if (isChangePaymentMethod) {\n await this.updatePaymentMethod({\n paymentType: PAYMENT_TYPES.byCrypto,\n subscriptionId: (currentSubscription as Subscription).id,\n chainId,\n payerAddress: txMeta.txParams.from as Hex,\n tokenSymbol: lastSelectedPaymentMethodShield.paymentTokenSymbol,\n rawTransaction: rawTx as Hex,\n recurringInterval: productPrice.interval,\n billingCycles: productPrice.minBillingCycles,\n });\n } else {\n const params = {\n products: [PRODUCT_TYPES.SHIELD],\n isTrialRequested: !isTrialed,\n recurringInterval: productPrice.interval,\n billingCycles: productPrice.minBillingCycles,\n chainId,\n payerAddress: txMeta.txParams.from as Hex,\n tokenSymbol: lastSelectedPaymentMethodShield.paymentTokenSymbol,\n rawTransaction: rawTx as Hex,\n isSponsored,\n useTestClock: lastSelectedPaymentMethodShield.useTestClock,\n rewardAccountId,\n };\n await this.startSubscriptionWithCrypto(params);\n }\n\n // update the subscriptions state after subscription created in server\n await this.getSubscriptions();\n }\n\n /**\n * Get transaction params to create crypto approve transaction for subscription payment\n *\n * @param request - The request object\n * @param request.chainId - The chain ID\n * @param request.tokenAddress - The address of the token\n * @param request.productType - The product type\n * @param request.interval - The interval\n * @returns The crypto approve transaction params\n */\n getCryptoApproveTransactionParams(\n request: GetCryptoApproveTransactionRequest,\n ): GetCryptoApproveTransactionResponse {\n const { pricing } = this.state;\n if (!pricing) {\n throw new Error('Subscription pricing not found');\n }\n const product = pricing.products.find(\n (productInfo) => productInfo.name === request.productType,\n );\n if (!product) {\n throw new Error('Product price not found');\n }\n\n const price = product.prices.find(\n (productPrice) => productPrice.interval === request.interval,\n );\n if (!price) {\n throw new Error('Price not found');\n }\n\n const chainsPaymentInfo = pricing.paymentMethods.find(\n (paymentMethod) => paymentMethod.type === PAYMENT_TYPES.byCrypto,\n );\n if (!chainsPaymentInfo) {\n throw new Error('Chains payment info not found');\n }\n const chainPaymentInfo = chainsPaymentInfo.chains?.find(\n (chain) => chain.chainId === request.chainId,\n );\n if (!chainPaymentInfo) {\n throw new Error('Invalid chain id');\n }\n const tokenPaymentInfo = chainPaymentInfo.tokens.find(\n (token) =>\n token.address.toLowerCase() ===\n request.paymentTokenAddress.toLowerCase(),\n );\n if (!tokenPaymentInfo) {\n throw new Error('Invalid token address');\n }\n\n const tokenApproveAmount = this.getTokenApproveAmount(\n price,\n tokenPaymentInfo,\n );\n\n return {\n approveAmount: tokenApproveAmount,\n paymentAddress: chainPaymentInfo.paymentAddress,\n paymentTokenAddress: request.paymentTokenAddress,\n chainId: request.chainId,\n };\n }\n\n async updatePaymentMethod(\n opts: UpdatePaymentMethodOpts,\n ): Promise<UpdatePaymentMethodCardResponse | Subscription[]> {\n if (opts.paymentType === PAYMENT_TYPES.byCard) {\n const { paymentType, ...cardRequest } = opts;\n return await this.messenger.call(\n 'SubscriptionService:updatePaymentMethodCard',\n cardRequest,\n );\n } else if (opts.paymentType === PAYMENT_TYPES.byCrypto) {\n const { paymentType, ...cryptoRequest } = opts;\n await this.messenger.call(\n 'SubscriptionService:updatePaymentMethodCrypto',\n cryptoRequest,\n );\n return await this.getSubscriptions();\n }\n throw new Error('Invalid payment type');\n }\n\n /**\n * Gets the billing portal URL.\n *\n * @returns The billing portal URL\n */\n async getBillingPortalUrl(): Promise<BillingPortalResponse> {\n return await this.messenger.call('SubscriptionService:getBillingPortalUrl');\n }\n\n /**\n * Cache the last selected payment method for a specific product.\n *\n * @param product - The product to cache the payment method for.\n * @param paymentMethod - The payment method to cache.\n * @param paymentMethod.type - The type of the payment method.\n * @param paymentMethod.paymentTokenAddress - The payment token address.\n * @param paymentMethod.plan - The plan of the payment method.\n * @param paymentMethod.product - The product of the payment method.\n */\n cacheLastSelectedPaymentMethod(\n product: ProductType,\n paymentMethod: CachedLastSelectedPaymentMethod,\n ): void {\n if (\n paymentMethod.type === PAYMENT_TYPES.byCrypto &&\n (!paymentMethod.paymentTokenAddress || !paymentMethod.paymentTokenSymbol)\n ) {\n throw new Error(\n SubscriptionControllerErrorMessage.PaymentTokenAddressAndSymbolRequiredForCrypto,\n );\n }\n\n this.update((state) => {\n state.lastSelectedPaymentMethod = {\n ...state.lastSelectedPaymentMethod,\n [product]: paymentMethod,\n };\n });\n }\n\n /**\n * Clear the last selected payment method for a specific product.\n *\n * @param product - The product to clear the payment method for.\n */\n clearLastSelectedPaymentMethod(product: ProductType): void {\n this.update((state) => {\n if (state.lastSelectedPaymentMethod) {\n const { [product]: _, ...rest } = state.lastSelectedPaymentMethod;\n state.lastSelectedPaymentMethod =\n rest as typeof state.lastSelectedPaymentMethod;\n }\n });\n }\n\n /**\n * Submit sponsorship intents to the Subscription Service backend.\n *\n * This is intended to be used together with the crypto subscription flow.\n * When the user has enabled the smart transaction feature, we will sponsor the gas fees for the subscription approval transaction.\n *\n * @param request - Request object containing the address and products.\n * @example {\n * address: '0x1234567890123456789012345678901234567890',\n * products: [ProductType.Shield],\n * recurringInterval: RecurringInterval.Month,\n * billingCycles: 1,\n * }\n * @returns resolves to true if the sponsorship is supported and intents were submitted successfully, false otherwise\n */\n async submitSponsorshipIntents(\n request: SubmitSponsorshipIntentsMethodParams,\n ): Promise<boolean> {\n if (request.products.length === 0) {\n throw new Error(\n SubscriptionControllerErrorMessage.SubscriptionProductsEmpty,\n );\n }\n\n this.#assertIsUserNotSubscribed({ products: request.products });\n\n const selectedPaymentMethod =\n this.state.lastSelectedPaymentMethod?.[request.products[0]];\n this.#assertIsPaymentMethodCrypto(selectedPaymentMethod);\n\n const isEligibleForTrialedSponsorship =\n this.#getIsEligibleForTrialedSponsorship(\n request.chainId,\n request.products,\n );\n if (!isEligibleForTrialedSponsorship) {\n return false;\n }\n\n const { paymentTokenSymbol, plan } = selectedPaymentMethod;\n const productPrice = this.#getProductPriceByProductAndPlan(\n // we only support one product at a time for now\n request.products[0],\n plan,\n );\n const billingCycles = productPrice.minBillingCycles;\n\n await this.messenger.call('SubscriptionService:submitSponsorshipIntents', {\n ...request,\n paymentTokenSymbol,\n billingCycles,\n recurringInterval: plan,\n });\n return true;\n }\n\n /**\n * Submit a user event from the UI. (e.g. shield modal viewed)\n *\n * @param request - Request object containing the event to submit.\n * @example { event: SubscriptionUserEvent.ShieldEntryModalViewed, cohort: 'post_tx' }\n */\n async submitUserEvent(request: SubmitUserEventRequest): Promise<void> {\n await this.messenger.call('SubscriptionService:submitUserEvent', request);\n }\n\n /**\n * Assign user to a cohort.\n *\n * @param request - Request object containing the cohort to assign the user to.\n * @example { cohort: 'post_tx' }\n */\n async assignUserToCohort(request: AssignCohortRequest): Promise<void> {\n await this.messenger.call(\n 'SubscriptionService:assignUserToCohort',\n request,\n );\n }\n\n /**\n * Link rewards to a subscription.\n *\n * @param request - Request object containing the reward subscription ID.\n * @param request.subscriptionId - The ID of the subscription to link rewards to.\n * @param request.rewardAccountId - The account ID of the reward subscription to link to the subscription.\n * @example { subscriptionId: '1234567890', rewardAccountId: 'eip155:1:0x1234567890123456789012345678901234567890' }\n * @returns Resolves when the rewards are linked successfully.\n */\n async linkRewards(\n request: LinkRewardsRequest & { subscriptionId: string },\n ): Promise<void> {\n // assert that the user is subscribed to the subscription\n this.#assertIsUserSubscribed({ subscriptionId: request.subscriptionId });\n\n // link rewards to the subscription\n const response = await this.messenger.call(\n 'SubscriptionService:linkRewards',\n {\n rewardAccountId: request.rewardAccountId,\n },\n );\n if (!response.success) {\n throw new Error(SubscriptionControllerErrorMessage.LinkRewardsFailed);\n }\n }\n\n async _executePoll(): Promise<void> {\n await this.getSubscriptions();\n }\n\n /**\n * Calculate total subscription price amount (approval amount) from price info\n * e.g: $8 per month * 12 months min billing cycles = $96\n *\n * @param price - The price info\n * @returns The price amount\n */\n #getSubscriptionPriceAmount(price: ProductPrice): string {\n // no need to use BigInt since max unitDecimals are always 2 for price\n const amount = new BigNumber(price.unitAmount)\n .div(10 ** price.unitDecimals)\n .multipliedBy(price.minBillingCycles)\n .toString();\n return amount;\n }\n\n /**\n * Calculate minimum subscription balance amount from price info\n *\n * @param price - The price info\n * @returns The balance amount\n */\n #getSubscriptionBalanceAmount(price: ProductPrice): string {\n // no need to use BigInt since max unitDecimals are always 2 for price\n const amount = new BigNumber(price.unitAmount)\n .div(10 ** price.unitDecimals)\n .multipliedBy(price.minBillingCyclesForBalance)\n .toString();\n return amount;\n }\n\n /**\n * Calculate token approve amount from price info\n *\n * @param price - The price info\n * @param tokenPaymentInfo - The token price info\n * @returns The token approve amount\n */\n getTokenApproveAmount(\n price: ProductPrice,\n tokenPaymentInfo: TokenPaymentInfo,\n ): string {\n const conversionRate =\n tokenPaymentInfo.conversionRate[\n price.currency as keyof typeof tokenPaymentInfo.conversionRate\n ];\n if (!conversionRate) {\n throw new Error('Conversion rate not found');\n }\n // price of the product\n const priceAmount = new BigNumber(this.#getSubscriptionPriceAmount(price));\n\n const tokenDecimal = new BigNumber(10).pow(tokenPaymentInfo.decimals);\n const tokenAmount = priceAmount\n .multipliedBy(tokenDecimal)\n .div(conversionRate);\n return tokenAmount.toFixed(0);\n }\n\n /**\n * Calculate token minimum balance amount from price info\n *\n * @param price - The price info\n * @param tokenPaymentInfo - The token price info\n * @returns The token balance amount\n */\n getTokenMinimumBalanceAmount(\n price: ProductPrice,\n tokenPaymentInfo: TokenPaymentInfo,\n ): string {\n const conversionRate =\n tokenPaymentInfo.conversionRate[\n price.currency as keyof typeof tokenPaymentInfo.conversionRate\n ];\n if (!conversionRate) {\n throw new Error('Conversion rate not found');\n }\n const balanceAmount = new BigNumber(\n this.#getSubscriptionBalanceAmount(price),\n );\n\n const tokenDecimal = new BigNumber(10).pow(tokenPaymentInfo.decimals);\n const tokenAmount = balanceAmount\n .multipliedBy(tokenDecimal)\n .div(conversionRate);\n return tokenAmount.toFixed(0);\n }\n\n /**\n * Clears the subscription state and resets to default values.\n */\n clearState(): void {\n const defaultState = getDefaultSubscriptionControllerState();\n this.update(() => {\n return defaultState;\n });\n }\n\n /**\n * Triggers an access token refresh.\n */\n triggerAccessTokenRefresh(): void {\n // We perform a sign out to clear the access token from the authentication\n // controller. Next time the access token is requested, a new access token\n // will be fetched.\n this.messenger.call('AuthenticationController:performSignOut');\n }\n\n #getProductPriceByProductAndPlan(\n productType: ProductType,\n plan: RecurringInterval,\n ): ProductPrice {\n const { pricing } = this.state;\n const productPricing = pricing?.products.find(\n (product) => product.name === productType,\n );\n const productPrice = productPricing?.prices.find(\n (price) => price.interval === plan,\n );\n if (!productPrice) {\n throw new Error(SubscriptionControllerErrorMessage.ProductPriceNotFound);\n }\n return productPrice;\n }\n\n #assertValidSubscriptionStateForCryptoApproval({\n productType,\n }: {\n productType: ProductType;\n }): void {\n const subscription = this.state.subscriptions.find((sub) =>\n sub.products.some((product) => product.name === productType),\n );\n\n const isValid =\n !subscription ||\n (\n [\n SUBSCRIPTION_STATUSES.pastDue,\n SUBSCRIPTION_STATUSES.unpaid,\n SUBSCRIPTION_STATUSES.paused,\n SUBSCRIPTION_STATUSES.provisional,\n SUBSCRIPTION_STATUSES.active,\n SUBSCRIPTION_STATUSES.trialing,\n ] as SubscriptionStatus[]\n ).includes(subscription.status);\n if (!isValid) {\n throw new Error(\n SubscriptionControllerErrorMessage.SubscriptionNotValidForCryptoApproval,\n );\n }\n }\n\n #assertIsUserNotSubscribed({ products }: { products: ProductType[] }): void {\n const subscription = this.state.subscriptions.find((sub) =>\n sub.products.some((product) => products.includes(product.name)),\n );\n\n if (\n subscription &&\n ACTIVE_SUBSCRIPTION_STATUSES.includes(subscription.status)\n ) {\n throw new Error(SubscriptionControllerErrorMessage.UserAlreadySubscribed);\n }\n }\n\n #assertIsUserSubscribed(request: { subscriptionId: string }): void {\n if (\n !this.state.subscriptions.find(\n (subscription) => subscription.id === request.subscriptionId,\n )\n ) {\n throw new Error(SubscriptionControllerErrorMessage.UserNotSubscribed);\n }\n }\n\n /**\n * Asserts that the value is a valid crypto payment method.\n *\n * @param value - The value to assert.\n * @throws an error if the value is not a valid crypto payment method.\n */\n #assertIsPaymentMethodCrypto(\n value: CachedLastSelectedPaymentMethod | undefined,\n ): asserts value is Required<CachedLastSelectedPaymentMethod> {\n if (\n value?.type !== PAYMENT_TYPES.byCrypto ||\n !value.paymentTokenAddress ||\n !value.paymentTokenSymbol\n ) {\n throw new Error(\n SubscriptionControllerErrorMessage.PaymentMethodNotCrypto,\n );\n }\n }\n\n /**\n * Determines if the user is eligible for trialed sponsorship for the given chain and products.\n * The user is eligible if the chain supports sponsorship and the user has not trialed the provided products before.\n *\n * @param chainId - The chain ID\n * @param products - The products to check eligibility for\n * @returns True if the user is eligible for trialed sponsorship, false otherwise\n */\n #getIsEligibleForTrialedSponsorship(\n chainId: Hex,\n products: ProductType[],\n ): boolean {\n const isSponsorshipSupported = this.#getChainSupportsSponsorship(chainId);\n\n // verify if the user has trialed the provided products before\n const hasTrialedBefore = this.state.trialedProducts.some((product) =>\n products.includes(product),\n );\n\n return isSponsorshipSupported && !hasTrialedBefore;\n }\n\n #getChainSupportsSponsorship(chainId: Hex): boolean {\n const cryptoPaymentInfo = this.state.pricing?.paymentMethods.find(\n (paymentMethod) => paymentMethod.type === PAYMENT_TYPES.byCrypto,\n );\n\n const isSponsorshipSupported = cryptoPaymentInfo?.chains?.find(\n (chain) => chain.chainId === chainId,\n )?.isSponsorshipSupported;\n return Boolean(isSponsorshipSupported);\n }\n\n /**\n * Determines whether two trialed products arrays are equal by comparing all products in the arrays.\n *\n * @param oldTrialedProducts - The first trialed products array to compare.\n * @param newTrialedProducts - The second trialed products array to compare.\n * @returns True if the trialed products arrays are equal, false otherwise.\n */\n #areTrialedProductsEqual(\n oldTrialedProducts: ProductType[],\n newTrialedProducts: ProductType[],\n ): boolean {\n return (\n oldTrialedProducts.length === newTrialedProducts?.length &&\n oldTrialedProducts.every((product) =>\n newTrialedProducts?.includes(product),\n )\n );\n }\n\n /**\n * Determines whether two subscription arrays are equal by comparing all properties\n * of each subscription in the arrays.\n *\n * @param oldSubs - The first subscription array to compare.\n * @param newSubs - The second subscription array to compare.\n * @returns True if the subscription arrays are equal, false otherwise.\n */\n #areSubscriptionsEqual(\n oldSubs: Subscription[],\n newSubs: Subscription[],\n ): boolean {\n // Check if arrays have different lengths\n if (oldSubs.length !== newSubs.length) {\n return false;\n }\n\n // Sort both arrays by id to ensure consistent comparison\n const sortedOldSubs = [...oldSubs].sort((a, b) => a.id.localeCompare(b.id));\n const sortedNewSubs = [...newSubs].sort((a, b) => a.id.localeCompare(b.id));\n\n // Check if all subscriptions are equal\n return sortedOldSubs.every((oldSub, index) => {\n const newSub = sortedNewSubs[index];\n return this.#isSubscriptionEqual(oldSub, newSub);\n });\n }\n\n #isSubscriptionEqual(oldSub?: Subscription, newSub?: Subscription): boolean {\n // not equal if one is undefined and the other is defined\n if (!oldSub || !newSub) {\n if (!oldSub && !newSub) {\n return true;\n }\n return false;\n }\n\n return (\n this.#stringifySubscription(oldSub) ===\n this.#stringifySubscription(newSub)\n );\n }\n\n #stringifySubscription(subscription: Subscription): string {\n const subsWithSortedProducts = {\n ...subscription,\n // order the products by name\n products: [...subscription.products].sort((a, b) =>\n a.name.localeCompare(b.name),\n ),\n };\n\n return JSON.stringify(subsWithSortedProducts);\n }\n}\n"]}
|
|
@@ -5,8 +5,9 @@ import type { TransactionMeta } from "@metamask/transaction-controller";
|
|
|
5
5
|
import type { CaipAccountId } from "@metamask/utils";
|
|
6
6
|
import { controllerName } from "./constants.cjs";
|
|
7
7
|
import type { SubscriptionControllerMethodActions } from "./SubscriptionController-method-action-types.cjs";
|
|
8
|
+
import type { SubscriptionServiceAssignUserToCohortAction, SubscriptionServiceCancelSubscriptionAction, SubscriptionServiceGetBillingPortalUrlAction, SubscriptionServiceGetPricingAction, SubscriptionServiceGetSubscriptionsAction, SubscriptionServiceGetSubscriptionsEligibilitiesAction, SubscriptionServiceLinkRewardsAction, SubscriptionServiceStartSubscriptionWithCardAction, SubscriptionServiceStartSubscriptionWithCryptoAction, SubscriptionServiceSubmitSponsorshipIntentsAction, SubscriptionServiceSubmitUserEventAction, SubscriptionServiceUnCancelSubscriptionAction, SubscriptionServiceUpdatePaymentMethodCardAction, SubscriptionServiceUpdatePaymentMethodCryptoAction } from "./SubscriptionService-method-action-types.cjs";
|
|
8
9
|
import type { AssignCohortRequest, BillingPortalResponse, GetCryptoApproveTransactionRequest, GetCryptoApproveTransactionResponse, GetSubscriptionsEligibilitiesRequest, ProductPrice, SubscriptionEligibility, StartCryptoSubscriptionRequest, SubmitUserEventRequest, TokenPaymentInfo, UpdatePaymentMethodCardResponse, UpdatePaymentMethodOpts, CachedLastSelectedPaymentMethod, SubmitSponsorshipIntentsMethodParams, LinkRewardsRequest, StartCryptoSubscriptionResponse, StartSubscriptionResponse, CancelSubscriptionRequest } from "./types.cjs";
|
|
9
|
-
import type {
|
|
10
|
+
import type { PricingResponse, ProductType, StartSubscriptionRequest, Subscription } from "./types.cjs";
|
|
10
11
|
export type SubscriptionControllerState = {
|
|
11
12
|
customerId?: string;
|
|
12
13
|
trialedProducts: ProductType[];
|
|
@@ -25,10 +26,10 @@ export type SubscriptionControllerState = {
|
|
|
25
26
|
};
|
|
26
27
|
export type SubscriptionControllerGetStateAction = ControllerGetStateAction<typeof controllerName, SubscriptionControllerState>;
|
|
27
28
|
export type SubscriptionControllerActions = SubscriptionControllerGetStateAction | SubscriptionControllerMethodActions;
|
|
28
|
-
|
|
29
|
+
type AllowedActions = SubscriptionServiceGetPricingAction | SubscriptionServiceGetSubscriptionsAction | SubscriptionServiceGetSubscriptionsEligibilitiesAction | SubscriptionServiceCancelSubscriptionAction | SubscriptionServiceUnCancelSubscriptionAction | SubscriptionServiceStartSubscriptionWithCardAction | SubscriptionServiceStartSubscriptionWithCryptoAction | SubscriptionServiceUpdatePaymentMethodCardAction | SubscriptionServiceUpdatePaymentMethodCryptoAction | SubscriptionServiceGetBillingPortalUrlAction | SubscriptionServiceSubmitSponsorshipIntentsAction | SubscriptionServiceSubmitUserEventAction | SubscriptionServiceAssignUserToCohortAction | SubscriptionServiceLinkRewardsAction | AuthenticationController.AuthenticationControllerPerformSignOutAction;
|
|
29
30
|
export type SubscriptionControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, SubscriptionControllerState>;
|
|
30
31
|
export type SubscriptionControllerEvents = SubscriptionControllerStateChangeEvent;
|
|
31
|
-
|
|
32
|
+
type AllowedEvents = never;
|
|
32
33
|
export type SubscriptionControllerMessenger = Messenger<typeof controllerName, SubscriptionControllerActions | AllowedActions, SubscriptionControllerEvents | AllowedEvents>;
|
|
33
34
|
/**
|
|
34
35
|
* Subscription Controller Options.
|
|
@@ -39,10 +40,6 @@ export type SubscriptionControllerOptions = {
|
|
|
39
40
|
* Initial state to set on this controller.
|
|
40
41
|
*/
|
|
41
42
|
state?: Partial<SubscriptionControllerState>;
|
|
42
|
-
/**
|
|
43
|
-
* Subscription service to use for the subscription controller.
|
|
44
|
-
*/
|
|
45
|
-
subscriptionService: ISubscriptionService;
|
|
46
43
|
/**
|
|
47
44
|
* Polling interval to use for the subscription controller.
|
|
48
45
|
*
|
|
@@ -79,10 +76,9 @@ export declare class SubscriptionController extends SubscriptionController_base<
|
|
|
79
76
|
* @param options - The options for the SubscriptionController.
|
|
80
77
|
* @param options.messenger - A restricted messenger.
|
|
81
78
|
* @param options.state - Initial state to set on this controller.
|
|
82
|
-
* @param options.subscriptionService - The subscription service for communicating with subscription server.
|
|
83
79
|
* @param options.pollingInterval - The polling interval to use for the subscription controller.
|
|
84
80
|
*/
|
|
85
|
-
constructor(
|
|
81
|
+
constructor(options: SubscriptionControllerOptions);
|
|
86
82
|
/**
|
|
87
83
|
* Gets the pricing information from the subscription service.
|
|
88
84
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubscriptionController.d.cts","sourceRoot":"","sources":["../src/SubscriptionController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,0BAA0B,EAC1B,wBAAwB,EACzB,kCAAkC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AAErD,OAAO,KAAK,EAAE,wBAAwB,EAAE,0CAA0C;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAExE,OAAO,KAAK,EAAE,aAAa,EAAO,wBAAwB;AAG1D,OAAO,EAEL,cAAc,EAGf,wBAAuB;AACxB,OAAO,KAAK,EAAE,mCAAmC,EAAE,yDAAwD;
|
|
1
|
+
{"version":3,"file":"SubscriptionController.d.cts","sourceRoot":"","sources":["../src/SubscriptionController.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,8 +5,9 @@ import type { TransactionMeta } from "@metamask/transaction-controller";
|
|
|
5
5
|
import type { CaipAccountId } from "@metamask/utils";
|
|
6
6
|
import { controllerName } from "./constants.mjs";
|
|
7
7
|
import type { SubscriptionControllerMethodActions } from "./SubscriptionController-method-action-types.mjs";
|
|
8
|
+
import type { SubscriptionServiceAssignUserToCohortAction, SubscriptionServiceCancelSubscriptionAction, SubscriptionServiceGetBillingPortalUrlAction, SubscriptionServiceGetPricingAction, SubscriptionServiceGetSubscriptionsAction, SubscriptionServiceGetSubscriptionsEligibilitiesAction, SubscriptionServiceLinkRewardsAction, SubscriptionServiceStartSubscriptionWithCardAction, SubscriptionServiceStartSubscriptionWithCryptoAction, SubscriptionServiceSubmitSponsorshipIntentsAction, SubscriptionServiceSubmitUserEventAction, SubscriptionServiceUnCancelSubscriptionAction, SubscriptionServiceUpdatePaymentMethodCardAction, SubscriptionServiceUpdatePaymentMethodCryptoAction } from "./SubscriptionService-method-action-types.mjs";
|
|
8
9
|
import type { AssignCohortRequest, BillingPortalResponse, GetCryptoApproveTransactionRequest, GetCryptoApproveTransactionResponse, GetSubscriptionsEligibilitiesRequest, ProductPrice, SubscriptionEligibility, StartCryptoSubscriptionRequest, SubmitUserEventRequest, TokenPaymentInfo, UpdatePaymentMethodCardResponse, UpdatePaymentMethodOpts, CachedLastSelectedPaymentMethod, SubmitSponsorshipIntentsMethodParams, LinkRewardsRequest, StartCryptoSubscriptionResponse, StartSubscriptionResponse, CancelSubscriptionRequest } from "./types.mjs";
|
|
9
|
-
import type {
|
|
10
|
+
import type { PricingResponse, ProductType, StartSubscriptionRequest, Subscription } from "./types.mjs";
|
|
10
11
|
export type SubscriptionControllerState = {
|
|
11
12
|
customerId?: string;
|
|
12
13
|
trialedProducts: ProductType[];
|
|
@@ -25,10 +26,10 @@ export type SubscriptionControllerState = {
|
|
|
25
26
|
};
|
|
26
27
|
export type SubscriptionControllerGetStateAction = ControllerGetStateAction<typeof controllerName, SubscriptionControllerState>;
|
|
27
28
|
export type SubscriptionControllerActions = SubscriptionControllerGetStateAction | SubscriptionControllerMethodActions;
|
|
28
|
-
|
|
29
|
+
type AllowedActions = SubscriptionServiceGetPricingAction | SubscriptionServiceGetSubscriptionsAction | SubscriptionServiceGetSubscriptionsEligibilitiesAction | SubscriptionServiceCancelSubscriptionAction | SubscriptionServiceUnCancelSubscriptionAction | SubscriptionServiceStartSubscriptionWithCardAction | SubscriptionServiceStartSubscriptionWithCryptoAction | SubscriptionServiceUpdatePaymentMethodCardAction | SubscriptionServiceUpdatePaymentMethodCryptoAction | SubscriptionServiceGetBillingPortalUrlAction | SubscriptionServiceSubmitSponsorshipIntentsAction | SubscriptionServiceSubmitUserEventAction | SubscriptionServiceAssignUserToCohortAction | SubscriptionServiceLinkRewardsAction | AuthenticationController.AuthenticationControllerPerformSignOutAction;
|
|
29
30
|
export type SubscriptionControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, SubscriptionControllerState>;
|
|
30
31
|
export type SubscriptionControllerEvents = SubscriptionControllerStateChangeEvent;
|
|
31
|
-
|
|
32
|
+
type AllowedEvents = never;
|
|
32
33
|
export type SubscriptionControllerMessenger = Messenger<typeof controllerName, SubscriptionControllerActions | AllowedActions, SubscriptionControllerEvents | AllowedEvents>;
|
|
33
34
|
/**
|
|
34
35
|
* Subscription Controller Options.
|
|
@@ -39,10 +40,6 @@ export type SubscriptionControllerOptions = {
|
|
|
39
40
|
* Initial state to set on this controller.
|
|
40
41
|
*/
|
|
41
42
|
state?: Partial<SubscriptionControllerState>;
|
|
42
|
-
/**
|
|
43
|
-
* Subscription service to use for the subscription controller.
|
|
44
|
-
*/
|
|
45
|
-
subscriptionService: ISubscriptionService;
|
|
46
43
|
/**
|
|
47
44
|
* Polling interval to use for the subscription controller.
|
|
48
45
|
*
|
|
@@ -79,10 +76,9 @@ export declare class SubscriptionController extends SubscriptionController_base<
|
|
|
79
76
|
* @param options - The options for the SubscriptionController.
|
|
80
77
|
* @param options.messenger - A restricted messenger.
|
|
81
78
|
* @param options.state - Initial state to set on this controller.
|
|
82
|
-
* @param options.subscriptionService - The subscription service for communicating with subscription server.
|
|
83
79
|
* @param options.pollingInterval - The polling interval to use for the subscription controller.
|
|
84
80
|
*/
|
|
85
|
-
constructor(
|
|
81
|
+
constructor(options: SubscriptionControllerOptions);
|
|
86
82
|
/**
|
|
87
83
|
* Gets the pricing information from the subscription service.
|
|
88
84
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubscriptionController.d.mts","sourceRoot":"","sources":["../src/SubscriptionController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,0BAA0B,EAC1B,wBAAwB,EACzB,kCAAkC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AAErD,OAAO,KAAK,EAAE,wBAAwB,EAAE,0CAA0C;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAExE,OAAO,KAAK,EAAE,aAAa,EAAO,wBAAwB;AAG1D,OAAO,EAEL,cAAc,EAGf,wBAAuB;AACxB,OAAO,KAAK,EAAE,mCAAmC,EAAE,yDAAwD;
|
|
1
|
+
{"version":3,"file":"SubscriptionController.d.mts","sourceRoot":"","sources":["../src/SubscriptionController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,0BAA0B,EAC1B,wBAAwB,EACzB,kCAAkC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AAErD,OAAO,KAAK,EAAE,wBAAwB,EAAE,0CAA0C;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAExE,OAAO,KAAK,EAAE,aAAa,EAAO,wBAAwB;AAG1D,OAAO,EAEL,cAAc,EAGf,wBAAuB;AACxB,OAAO,KAAK,EAAE,mCAAmC,EAAE,yDAAwD;AAC3G,OAAO,KAAK,EACV,2CAA2C,EAC3C,2CAA2C,EAC3C,4CAA4C,EAC5C,mCAAmC,EACnC,yCAAyC,EACzC,sDAAsD,EACtD,oCAAoC,EACpC,kDAAkD,EAClD,oDAAoD,EACpD,iDAAiD,EACjD,wCAAwC,EACxC,6CAA6C,EAC7C,gDAAgD,EAChD,kDAAkD,EACnD,sDAAqD;AAMtD,OAAO,KAAK,EACV,mBAAmB,EACnB,qBAAqB,EACrB,kCAAkC,EAClC,mCAAmC,EACnC,oCAAoC,EACpC,YAAY,EACZ,uBAAuB,EACvB,8BAA8B,EAC9B,sBAAsB,EACtB,gBAAgB,EAChB,+BAA+B,EAC/B,uBAAuB,EACvB,+BAA+B,EAC/B,oCAAoC,EAGpC,kBAAkB,EAClB,+BAA+B,EAC/B,yBAAyB,EACzB,yBAAyB,EAC1B,oBAAmB;AACpB,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,wBAAwB,EACxB,YAAY,EACb,oBAAmB;AAEpB,MAAM,MAAM,2BAA2B,GAAG;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,WAAW,EAAE,CAAC;IAC/B,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,YAAY,CAAC;IAChC,4EAA4E;IAC5E,eAAe,CAAC,EAAE,aAAa,CAAC;IAChC;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAChC,WAAW,EACX,+BAA+B,CAChC,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,oCAAoC,GAAG,wBAAwB,CACzE,OAAO,cAAc,EACrB,2BAA2B,CAC5B,CAAC;AACF,MAAM,MAAM,6BAA6B,GACrC,oCAAoC,GACpC,mCAAmC,CAAC;AAExC,KAAK,cAAc,GACf,mCAAmC,GACnC,yCAAyC,GACzC,sDAAsD,GACtD,2CAA2C,GAC3C,6CAA6C,GAC7C,kDAAkD,GAClD,oDAAoD,GACpD,gDAAgD,GAChD,kDAAkD,GAClD,4CAA4C,GAC5C,iDAAiD,GACjD,wCAAwC,GACxC,2CAA2C,GAC3C,oCAAoC,GACpC,wBAAwB,CAAC,4CAA4C,CAAC;AAG1E,MAAM,MAAM,sCAAsC,GAAG,0BAA0B,CAC7E,OAAO,cAAc,EACrB,2BAA2B,CAC5B,CAAC;AACF,MAAM,MAAM,4BAA4B,GACtC,sCAAsC,CAAC;AAEzC,KAAK,aAAa,GAAG,KAAK,CAAC;AAG3B,MAAM,MAAM,+BAA+B,GAAG,SAAS,CACrD,OAAO,cAAc,EACrB,6BAA6B,GAAG,cAAc,EAC9C,4BAA4B,GAAG,aAAa,CAC7C,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,6BAA6B,GAAG;IAC1C,SAAS,EAAE,+BAA+B,CAAC;IAE3C;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAE7C;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,qCAAqC,IAAI,2BAA2B,CAKnF;;;;;;;;;;;;;;;;AAiFD,qBAAa,sBAAuB,SAAQ,4BAC1C,OAAO,cAAc,EACrB,2BAA2B,EAC3B,+BAA+B,CAChC;;IACC;;;;;;;OAOG;gBACS,OAAO,EAAE,6BAA6B;IAuBlD;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,eAAe,CAAC;IAQtC,gBAAgB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAyDjD;;;;;OAKG;IACH,wBAAwB,CAAC,WAAW,EAAE,WAAW,GAAG,YAAY,GAAG,SAAS;IAM5E;;;;;OAKG;IACG,6BAA6B,CACjC,OAAO,CAAC,EAAE,oCAAoC,GAC7C,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAO/B,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBrE,oBAAoB,CAAC,OAAO,EAAE;QAClC,cAAc,EAAE,MAAM,CAAC;KACxB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBX,+BAA+B,CACnC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,yBAAyB,CAAC;IAY/B,2BAA2B,CAC/B,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,+BAA+B,CAAC;IAU3C;;;;;;;OAOG;IACG,sCAAsC,CAC1C,MAAM,EAAE,eAAe,EACvB,WAAW,CAAC,EAAE,OAAO,EACrB,eAAe,CAAC,EAAE,aAAa,GAC9B,OAAO,CAAC,IAAI,CAAC;IAwEhB;;;;;;;;;OASG;IACH,iCAAiC,CAC/B,OAAO,EAAE,kCAAkC,GAC1C,mCAAmC;IAqDhC,mBAAmB,CACvB,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,+BAA+B,GAAG,YAAY,EAAE,CAAC;IAkB5D;;;;OAIG;IACG,mBAAmB,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAI3D;;;;;;;;;OASG;IACH,8BAA8B,CAC5B,OAAO,EAAE,WAAW,EACpB,aAAa,EAAE,+BAA+B,GAC7C,IAAI;IAkBP;;;;OAIG;IACH,8BAA8B,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAU1D;;;;;;;;;;;;;;OAcG;IACG,wBAAwB,CAC5B,OAAO,EAAE,oCAAoC,GAC5C,OAAO,CAAC,OAAO,CAAC;IAuCnB;;;;;OAKG;IACG,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE;;;;;OAKG;IACG,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrE;;;;;;;;OAQG;IACG,WAAW,CACf,OAAO,EAAE,kBAAkB,GAAG;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,GACvD,OAAO,CAAC,IAAI,CAAC;IAgBV,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAmCnC;;;;;;OAMG;IACH,qBAAqB,CACnB,KAAK,EAAE,YAAY,EACnB,gBAAgB,EAAE,gBAAgB,GACjC,MAAM;IAkBT;;;;;;OAMG;IACH,4BAA4B,CAC1B,KAAK,EAAE,YAAY,EACnB,gBAAgB,EAAE,gBAAgB,GACjC,MAAM;IAmBT;;OAEG;IACH,UAAU,IAAI,IAAI;IAOlB;;OAEG;IACH,yBAAyB,IAAI,IAAI;CAyMlC"}
|