@metamask-previews/subscription-controller 6.2.1-preview-b156b30ed → 6.2.1-preview-d79fb25d4
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 +0 -6
- package/dist/SubscriptionController.cjs +26 -18
- package/dist/SubscriptionController.cjs.map +1 -1
- package/dist/SubscriptionController.d.cts +9 -5
- package/dist/SubscriptionController.d.cts.map +1 -1
- package/dist/SubscriptionController.d.mts +9 -5
- package/dist/SubscriptionController.d.mts.map +1 -1
- package/dist/SubscriptionController.mjs +26 -18
- package/dist/SubscriptionController.mjs.map +1 -1
- package/dist/SubscriptionService.cjs +87 -254
- package/dist/SubscriptionService.cjs.map +1 -1
- package/dist/SubscriptionService.d.cts +9 -84
- package/dist/SubscriptionService.d.cts.map +1 -1
- package/dist/SubscriptionService.d.mts +9 -84
- package/dist/SubscriptionService.d.mts.map +1 -1
- package/dist/SubscriptionService.mjs +87 -254
- package/dist/SubscriptionService.mjs.map +1 -1
- package/dist/index.cjs +1 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -4
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +3 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -4
- package/dist/SubscriptionService-method-action-types.cjs +0 -7
- package/dist/SubscriptionService-method-action-types.cjs.map +0 -1
- package/dist/SubscriptionService-method-action-types.d.cts +0 -151
- package/dist/SubscriptionService-method-action-types.d.cts.map +0 -1
- package/dist/SubscriptionService-method-action-types.d.mts +0 -151
- package/dist/SubscriptionService-method-action-types.d.mts.map +0 -1
- package/dist/SubscriptionService-method-action-types.mjs +0 -6
- package/dist/SubscriptionService-method-action-types.mjs.map +0 -1
- package/dist/SubscriptionService-structs.cjs +0 -135
- package/dist/SubscriptionService-structs.cjs.map +0 -1
- package/dist/SubscriptionService-structs.d.cts +0 -773
- package/dist/SubscriptionService-structs.d.cts.map +0 -1
- package/dist/SubscriptionService-structs.d.mts +0 -773
- package/dist/SubscriptionService-structs.d.mts.map +0 -1
- package/dist/SubscriptionService-structs.mjs +0 -132
- package/dist/SubscriptionService-structs.mjs.map +0 -1
|
@@ -10,103 +10,36 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
10
|
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
11
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
12
|
};
|
|
13
|
-
var _SubscriptionService_instances, _SubscriptionService_env, _SubscriptionService_fetch, _SubscriptionService_captureException,
|
|
13
|
+
var _SubscriptionService_instances, _SubscriptionService_env, _SubscriptionService_fetch, _SubscriptionService_captureException, _SubscriptionService_makeRequest, _SubscriptionService_getAuthorizationHeader, _SubscriptionService_getSubscriptionApiUrl;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.SubscriptionService = exports.SUBSCRIPTION_URL =
|
|
16
|
-
const base_data_service_1 = require("@metamask/base-data-service");
|
|
17
|
-
const controller_utils_1 = require("@metamask/controller-utils");
|
|
18
|
-
const superstruct_1 = require("@metamask/superstruct");
|
|
19
|
-
const utils_1 = require("@metamask/utils");
|
|
15
|
+
exports.SubscriptionService = exports.SUBSCRIPTION_URL = void 0;
|
|
20
16
|
const constants_js_1 = require("./constants.cjs");
|
|
21
17
|
const errors_js_1 = require("./errors.cjs");
|
|
22
18
|
const logger_js_1 = require("./logger.cjs");
|
|
23
|
-
const SubscriptionService_structs_js_1 = require("./SubscriptionService-structs.cjs");
|
|
24
|
-
exports.serviceName = 'SubscriptionService';
|
|
25
19
|
const SUBSCRIPTION_URL = (env, path) => `${(0, constants_js_1.getEnvUrls)(env).subscriptionApiUrl}/v1/${path}`;
|
|
26
20
|
exports.SUBSCRIPTION_URL = SUBSCRIPTION_URL;
|
|
27
|
-
const MESSENGER_EXPOSED_METHODS = [
|
|
28
|
-
'getSubscriptions',
|
|
29
|
-
'cancelSubscription',
|
|
30
|
-
'unCancelSubscription',
|
|
31
|
-
'startSubscriptionWithCard',
|
|
32
|
-
'startSubscriptionWithCrypto',
|
|
33
|
-
'updatePaymentMethodCard',
|
|
34
|
-
'updatePaymentMethodCrypto',
|
|
35
|
-
'getSubscriptionsEligibilities',
|
|
36
|
-
'submitUserEvent',
|
|
37
|
-
'assignUserToCohort',
|
|
38
|
-
'submitSponsorshipIntents',
|
|
39
|
-
'linkRewards',
|
|
40
|
-
'getPricing',
|
|
41
|
-
'getBillingPortalUrl',
|
|
42
|
-
];
|
|
43
21
|
const log = (0, logger_js_1.createModuleLogger)(logger_js_1.projectLogger, 'SubscriptionService');
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if (error.httpStatus === 429) {
|
|
47
|
-
return true;
|
|
48
|
-
}
|
|
49
|
-
return error.httpStatus < 400 || error.httpStatus >= 500;
|
|
50
|
-
}
|
|
51
|
-
return true;
|
|
52
|
-
}
|
|
53
|
-
const DEFAULT_POLICY_OPTIONS = {
|
|
54
|
-
retryFilterPolicy: (0, controller_utils_1.handleWhen)(isRetryableError),
|
|
55
|
-
};
|
|
56
|
-
/**
|
|
57
|
-
* Data service for the Subscription API.
|
|
58
|
-
*
|
|
59
|
-
* All requests are authenticated via JWT Bearer tokens obtained from the
|
|
60
|
-
* `AuthenticationController:getBearerToken` messenger action.
|
|
61
|
-
*/
|
|
62
|
-
class SubscriptionService extends base_data_service_1.BaseDataService {
|
|
63
|
-
constructor({ messenger, fetchFunction, env = constants_js_1.Env.PRD, captureException, queryClientConfig = {}, policyOptions = {}, }) {
|
|
64
|
-
super({
|
|
65
|
-
name: exports.serviceName,
|
|
66
|
-
messenger,
|
|
67
|
-
queryClientConfig,
|
|
68
|
-
policyOptions: { ...DEFAULT_POLICY_OPTIONS, ...policyOptions },
|
|
69
|
-
});
|
|
22
|
+
class SubscriptionService {
|
|
23
|
+
constructor(config) {
|
|
70
24
|
_SubscriptionService_instances.add(this);
|
|
71
25
|
_SubscriptionService_env.set(this, void 0);
|
|
72
26
|
_SubscriptionService_fetch.set(this, void 0);
|
|
73
27
|
_SubscriptionService_captureException.set(this, void 0);
|
|
74
|
-
__classPrivateFieldSet(this, _SubscriptionService_env, env, "f");
|
|
75
|
-
|
|
76
|
-
__classPrivateFieldSet(this,
|
|
77
|
-
|
|
28
|
+
__classPrivateFieldSet(this, _SubscriptionService_env, config.env, "f");
|
|
29
|
+
this.authUtils = config.auth;
|
|
30
|
+
__classPrivateFieldSet(this, _SubscriptionService_fetch, config.fetchFunction, "f");
|
|
31
|
+
__classPrivateFieldSet(this, _SubscriptionService_captureException, config.captureException, "f");
|
|
78
32
|
}
|
|
79
|
-
/**
|
|
80
|
-
* Fetches the user's subscriptions.
|
|
81
|
-
*
|
|
82
|
-
* @returns The subscriptions response.
|
|
83
|
-
*/
|
|
84
33
|
async getSubscriptions() {
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
bearerToken,
|
|
89
|
-
methodName: 'getSubscriptions',
|
|
90
|
-
requestParams: null,
|
|
91
|
-
path: 'subscriptions',
|
|
34
|
+
const path = 'subscriptions';
|
|
35
|
+
return await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
36
|
+
path,
|
|
92
37
|
errorMessage: constants_js_1.SubscriptionServiceErrorMessage.FailedToGetSubscriptions,
|
|
93
38
|
});
|
|
94
|
-
return (0, superstruct_1.create)(jsonResponse, SubscriptionService_structs_js_1.GetSubscriptionsResponseStruct);
|
|
95
39
|
}
|
|
96
|
-
/**
|
|
97
|
-
* Cancels a subscription.
|
|
98
|
-
*
|
|
99
|
-
* @param params - The cancel subscription request.
|
|
100
|
-
* @returns The updated subscription.
|
|
101
|
-
*/
|
|
102
40
|
async cancelSubscription(params) {
|
|
103
|
-
const { profileKey, bearerToken } = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getAuthenticatedContext).call(this);
|
|
104
41
|
const path = `subscriptions/${params.subscriptionId}/cancel`;
|
|
105
|
-
|
|
106
|
-
profileKey,
|
|
107
|
-
bearerToken,
|
|
108
|
-
methodName: 'cancelSubscription',
|
|
109
|
-
requestParams: params,
|
|
42
|
+
return await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
110
43
|
path,
|
|
111
44
|
method: 'POST',
|
|
112
45
|
body: {
|
|
@@ -114,87 +47,40 @@ class SubscriptionService extends base_data_service_1.BaseDataService {
|
|
|
114
47
|
},
|
|
115
48
|
errorMessage: constants_js_1.SubscriptionServiceErrorMessage.FailedToCancelSubscription,
|
|
116
49
|
});
|
|
117
|
-
return (0, superstruct_1.create)(jsonResponse, SubscriptionService_structs_js_1.SubscriptionStruct);
|
|
118
50
|
}
|
|
119
|
-
/**
|
|
120
|
-
* Reverses a pending subscription cancellation.
|
|
121
|
-
*
|
|
122
|
-
* @param params - The uncancel subscription request.
|
|
123
|
-
* @param params.subscriptionId - The subscription ID to uncancel.
|
|
124
|
-
* @returns The updated subscription.
|
|
125
|
-
*/
|
|
126
51
|
async unCancelSubscription(params) {
|
|
127
|
-
const { profileKey, bearerToken } = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getAuthenticatedContext).call(this);
|
|
128
52
|
const path = `subscriptions/${params.subscriptionId}/uncancel`;
|
|
129
|
-
|
|
130
|
-
profileKey,
|
|
131
|
-
bearerToken,
|
|
132
|
-
methodName: 'unCancelSubscription',
|
|
133
|
-
requestParams: params,
|
|
53
|
+
return await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
134
54
|
path,
|
|
135
55
|
method: 'POST',
|
|
136
56
|
body: {},
|
|
137
57
|
errorMessage: constants_js_1.SubscriptionServiceErrorMessage.FailedToUncancelSubscription,
|
|
138
58
|
});
|
|
139
|
-
return (0, superstruct_1.create)(jsonResponse, SubscriptionService_structs_js_1.SubscriptionStruct);
|
|
140
59
|
}
|
|
141
|
-
/**
|
|
142
|
-
* Starts a subscription with a card payment method.
|
|
143
|
-
*
|
|
144
|
-
* @param request - The start subscription request.
|
|
145
|
-
* @returns The checkout session response.
|
|
146
|
-
*/
|
|
147
60
|
async startSubscriptionWithCard(request) {
|
|
148
61
|
if (request.products.length === 0) {
|
|
149
62
|
throw new errors_js_1.SubscriptionServiceError(constants_js_1.SubscriptionControllerErrorMessage.SubscriptionProductsEmpty);
|
|
150
63
|
}
|
|
151
|
-
const
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
bearerToken,
|
|
155
|
-
methodName: 'startSubscriptionWithCard',
|
|
156
|
-
requestParams: request,
|
|
157
|
-
path: 'subscriptions/card',
|
|
64
|
+
const path = 'subscriptions/card';
|
|
65
|
+
return await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
66
|
+
path,
|
|
158
67
|
method: 'POST',
|
|
159
68
|
body: request,
|
|
160
69
|
errorMessage: constants_js_1.SubscriptionServiceErrorMessage.FailedToStartSubscriptionWithCard,
|
|
161
70
|
});
|
|
162
|
-
return (0, superstruct_1.create)(jsonResponse, SubscriptionService_structs_js_1.StartSubscriptionResponseStruct);
|
|
163
71
|
}
|
|
164
|
-
/**
|
|
165
|
-
* Starts a subscription with a crypto payment method.
|
|
166
|
-
*
|
|
167
|
-
* @param request - The start crypto subscription request.
|
|
168
|
-
* @returns The created subscription response.
|
|
169
|
-
*/
|
|
170
72
|
async startSubscriptionWithCrypto(request) {
|
|
171
|
-
const
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
bearerToken,
|
|
175
|
-
methodName: 'startSubscriptionWithCrypto',
|
|
176
|
-
requestParams: request,
|
|
177
|
-
path: 'subscriptions/crypto',
|
|
73
|
+
const path = 'subscriptions/crypto';
|
|
74
|
+
return await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
75
|
+
path,
|
|
178
76
|
method: 'POST',
|
|
179
77
|
body: request,
|
|
180
78
|
errorMessage: constants_js_1.SubscriptionServiceErrorMessage.FailedToStartSubscriptionWithCrypto,
|
|
181
79
|
});
|
|
182
|
-
return (0, superstruct_1.create)(jsonResponse, SubscriptionService_structs_js_1.StartCryptoSubscriptionResponseStruct);
|
|
183
80
|
}
|
|
184
|
-
/**
|
|
185
|
-
* Updates a subscription's card payment method.
|
|
186
|
-
*
|
|
187
|
-
* @param request - The update payment method request.
|
|
188
|
-
* @returns The redirect URL response.
|
|
189
|
-
*/
|
|
190
81
|
async updatePaymentMethodCard(request) {
|
|
191
|
-
const { profileKey, bearerToken } = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getAuthenticatedContext).call(this);
|
|
192
82
|
const path = `subscriptions/${request.subscriptionId}/payment-method/card`;
|
|
193
|
-
|
|
194
|
-
profileKey,
|
|
195
|
-
bearerToken,
|
|
196
|
-
methodName: 'updatePaymentMethodCard',
|
|
197
|
-
requestParams: request,
|
|
83
|
+
return await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
198
84
|
path,
|
|
199
85
|
method: 'PATCH',
|
|
200
86
|
body: {
|
|
@@ -203,21 +89,10 @@ class SubscriptionService extends base_data_service_1.BaseDataService {
|
|
|
203
89
|
},
|
|
204
90
|
errorMessage: constants_js_1.SubscriptionServiceErrorMessage.FailedToUpdatePaymentMethodCard,
|
|
205
91
|
});
|
|
206
|
-
return (0, superstruct_1.create)(jsonResponse, SubscriptionService_structs_js_1.UpdatePaymentMethodCardResponseStruct);
|
|
207
92
|
}
|
|
208
|
-
/**
|
|
209
|
-
* Updates a subscription's crypto payment method.
|
|
210
|
-
*
|
|
211
|
-
* @param request - The update payment method request.
|
|
212
|
-
*/
|
|
213
93
|
async updatePaymentMethodCrypto(request) {
|
|
214
|
-
const { profileKey, bearerToken } = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getAuthenticatedContext).call(this);
|
|
215
94
|
const path = `subscriptions/${request.subscriptionId}/payment-method/crypto`;
|
|
216
|
-
await __classPrivateFieldGet(this, _SubscriptionService_instances, "m",
|
|
217
|
-
profileKey,
|
|
218
|
-
bearerToken,
|
|
219
|
-
methodName: 'updatePaymentMethodCrypto',
|
|
220
|
-
requestParams: request,
|
|
95
|
+
await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
221
96
|
path,
|
|
222
97
|
method: 'PATCH',
|
|
223
98
|
body: {
|
|
@@ -234,28 +109,23 @@ class SubscriptionService extends base_data_service_1.BaseDataService {
|
|
|
234
109
|
* @returns The eligibility for a shield subscription
|
|
235
110
|
*/
|
|
236
111
|
async getSubscriptionsEligibilities(request) {
|
|
237
|
-
const
|
|
238
|
-
let
|
|
112
|
+
const path = 'subscriptions/eligibility';
|
|
113
|
+
let query;
|
|
239
114
|
if (request?.balanceCategory !== undefined) {
|
|
240
|
-
|
|
115
|
+
query = { balanceCategory: request.balanceCategory };
|
|
241
116
|
}
|
|
242
|
-
const
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
methodName: 'getSubscriptionsEligibilities',
|
|
246
|
-
requestParams: request ?? null,
|
|
247
|
-
path: 'subscriptions/eligibility',
|
|
248
|
-
queryParams,
|
|
117
|
+
const results = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
118
|
+
path,
|
|
119
|
+
queryParams: query,
|
|
249
120
|
errorMessage: constants_js_1.SubscriptionServiceErrorMessage.FailedToGetSubscriptionsEligibilities,
|
|
250
121
|
});
|
|
251
|
-
const results = (0, superstruct_1.create)(jsonResponse, SubscriptionService_structs_js_1.SubscriptionEligibilityArrayStruct);
|
|
252
122
|
return results.map((result) => ({
|
|
253
123
|
...result,
|
|
254
|
-
canSubscribe: result.canSubscribe
|
|
255
|
-
canViewEntryModal: result.canViewEntryModal
|
|
256
|
-
cohorts: result.cohorts
|
|
124
|
+
canSubscribe: result.canSubscribe || false,
|
|
125
|
+
canViewEntryModal: result.canViewEntryModal || false,
|
|
126
|
+
cohorts: result.cohorts || [],
|
|
257
127
|
assignedCohort: result.assignedCohort ?? null,
|
|
258
|
-
hasAssignedCohortExpired: result.hasAssignedCohortExpired
|
|
128
|
+
hasAssignedCohortExpired: result.hasAssignedCohortExpired || false,
|
|
259
129
|
}));
|
|
260
130
|
}
|
|
261
131
|
/**
|
|
@@ -265,13 +135,9 @@ class SubscriptionService extends base_data_service_1.BaseDataService {
|
|
|
265
135
|
* @example { event: SubscriptionUserEvent.ShieldEntryModalViewed, cohort: 'post_tx' }
|
|
266
136
|
*/
|
|
267
137
|
async submitUserEvent(request) {
|
|
268
|
-
const
|
|
269
|
-
await __classPrivateFieldGet(this, _SubscriptionService_instances, "m",
|
|
270
|
-
|
|
271
|
-
bearerToken,
|
|
272
|
-
methodName: 'submitUserEvent',
|
|
273
|
-
requestParams: request,
|
|
274
|
-
path: 'user-events',
|
|
138
|
+
const path = 'user-events';
|
|
139
|
+
await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
140
|
+
path,
|
|
275
141
|
method: 'POST',
|
|
276
142
|
body: request,
|
|
277
143
|
errorMessage: constants_js_1.SubscriptionServiceErrorMessage.FailedToSubmitUserEvent,
|
|
@@ -284,13 +150,9 @@ class SubscriptionService extends base_data_service_1.BaseDataService {
|
|
|
284
150
|
* @example { cohort: 'post_tx' }
|
|
285
151
|
*/
|
|
286
152
|
async assignUserToCohort(request) {
|
|
287
|
-
const
|
|
288
|
-
await __classPrivateFieldGet(this, _SubscriptionService_instances, "m",
|
|
289
|
-
|
|
290
|
-
bearerToken,
|
|
291
|
-
methodName: 'assignUserToCohort',
|
|
292
|
-
requestParams: request,
|
|
293
|
-
path: 'cohorts/assign',
|
|
153
|
+
const path = 'cohorts/assign';
|
|
154
|
+
await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
155
|
+
path,
|
|
294
156
|
method: 'POST',
|
|
295
157
|
body: request,
|
|
296
158
|
errorMessage: constants_js_1.SubscriptionServiceErrorMessage.FailedToAssignUserToCohort,
|
|
@@ -306,13 +168,9 @@ class SubscriptionService extends base_data_service_1.BaseDataService {
|
|
|
306
168
|
* @example { address: '0x1234567890123456789012345678901234567890', products: [ProductType.Shield] }
|
|
307
169
|
*/
|
|
308
170
|
async submitSponsorshipIntents(request) {
|
|
309
|
-
const
|
|
310
|
-
await __classPrivateFieldGet(this, _SubscriptionService_instances, "m",
|
|
311
|
-
|
|
312
|
-
bearerToken,
|
|
313
|
-
methodName: 'submitSponsorshipIntents',
|
|
314
|
-
requestParams: request,
|
|
315
|
-
path: 'transaction-sponsorship/intents',
|
|
171
|
+
const path = 'transaction-sponsorship/intents';
|
|
172
|
+
await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
173
|
+
path,
|
|
316
174
|
method: 'POST',
|
|
317
175
|
body: request,
|
|
318
176
|
errorMessage: constants_js_1.SubscriptionServiceErrorMessage.FailedToSubmitSponsorshipIntents,
|
|
@@ -326,105 +184,81 @@ class SubscriptionService extends base_data_service_1.BaseDataService {
|
|
|
326
184
|
* @returns The response from the API.
|
|
327
185
|
*/
|
|
328
186
|
async linkRewards(request) {
|
|
329
|
-
const
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
bearerToken,
|
|
333
|
-
methodName: 'linkRewards',
|
|
334
|
-
requestParams: request,
|
|
335
|
-
path: 'rewards/link',
|
|
187
|
+
const path = 'rewards/link';
|
|
188
|
+
return await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
189
|
+
path,
|
|
336
190
|
method: 'POST',
|
|
337
191
|
body: request,
|
|
338
192
|
errorMessage: constants_js_1.SubscriptionServiceErrorMessage.FailedToLinkRewards,
|
|
339
193
|
});
|
|
340
|
-
return (0, superstruct_1.create)(jsonResponse, SubscriptionService_structs_js_1.SubscriptionApiGeneralResponseStruct);
|
|
341
194
|
}
|
|
342
|
-
/**
|
|
343
|
-
* Fetches subscription pricing information.
|
|
344
|
-
*
|
|
345
|
-
* @returns The pricing response.
|
|
346
|
-
*/
|
|
347
195
|
async getPricing() {
|
|
348
|
-
const
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
bearerToken,
|
|
352
|
-
methodName: 'getPricing',
|
|
353
|
-
requestParams: null,
|
|
354
|
-
path: 'pricing',
|
|
196
|
+
const path = 'pricing';
|
|
197
|
+
return await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
198
|
+
path,
|
|
355
199
|
errorMessage: constants_js_1.SubscriptionServiceErrorMessage.FailedToGetPricing,
|
|
356
200
|
});
|
|
357
|
-
return (0, superstruct_1.create)(jsonResponse, SubscriptionService_structs_js_1.PricingResponseStruct);
|
|
358
201
|
}
|
|
359
|
-
/**
|
|
360
|
-
* Fetches the billing portal URL.
|
|
361
|
-
*
|
|
362
|
-
* @returns The billing portal response.
|
|
363
|
-
*/
|
|
364
202
|
async getBillingPortalUrl() {
|
|
365
|
-
const
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
bearerToken,
|
|
369
|
-
methodName: 'getBillingPortalUrl',
|
|
370
|
-
requestParams: null,
|
|
371
|
-
path: 'billing-portal',
|
|
203
|
+
const path = 'billing-portal';
|
|
204
|
+
return await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
205
|
+
path,
|
|
372
206
|
errorMessage: constants_js_1.SubscriptionServiceErrorMessage.FailedToGetBillingPortalUrl,
|
|
373
207
|
});
|
|
374
|
-
return (0, superstruct_1.create)(jsonResponse, SubscriptionService_structs_js_1.BillingPortalResponseStruct);
|
|
375
208
|
}
|
|
376
209
|
}
|
|
377
210
|
exports.SubscriptionService = SubscriptionService;
|
|
378
|
-
_SubscriptionService_env = new WeakMap(), _SubscriptionService_fetch = new WeakMap(), _SubscriptionService_captureException = new WeakMap(), _SubscriptionService_instances = new WeakSet(),
|
|
211
|
+
_SubscriptionService_env = new WeakMap(), _SubscriptionService_fetch = new WeakMap(), _SubscriptionService_captureException = new WeakMap(), _SubscriptionService_instances = new WeakSet(), _SubscriptionService_makeRequest =
|
|
212
|
+
/**
|
|
213
|
+
* Makes a request to the Subscription Service backend.
|
|
214
|
+
*
|
|
215
|
+
* @param params - The request object containing the path, method, body, query parameters, and error message.
|
|
216
|
+
* @param params.path - The path of the request.
|
|
217
|
+
* @param params.method - The method of the request.
|
|
218
|
+
* @param params.body - The body of the request.
|
|
219
|
+
* @param params.queryParams - The query parameters of the request.
|
|
220
|
+
* @param params.errorMessage - The error message to throw if the request fails.
|
|
221
|
+
* @returns The result of the request.
|
|
222
|
+
*/
|
|
223
|
+
async function _SubscriptionService_makeRequest({ path, method = 'GET', body, queryParams, errorMessage, }) {
|
|
379
224
|
const url = __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getSubscriptionApiUrl).call(this, path);
|
|
380
|
-
|
|
381
|
-
Object.entries(queryParams).forEach(([key, value]) => {
|
|
382
|
-
url.searchParams.append(key, value);
|
|
383
|
-
});
|
|
384
|
-
}
|
|
225
|
+
const headers = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getAuthorizationHeader).call(this);
|
|
385
226
|
try {
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
method,
|
|
397
|
-
headers: {
|
|
398
|
-
'Content-Type': 'application/json',
|
|
399
|
-
...__classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_headersForToken).call(this, bearerToken),
|
|
400
|
-
},
|
|
401
|
-
body: body ? JSON.stringify(body) : undefined,
|
|
402
|
-
});
|
|
403
|
-
if (!response.ok) {
|
|
404
|
-
const apiError = await (0, errors_js_1.getSubscriptionErrorFromResponse)(response);
|
|
405
|
-
throw new controller_utils_1.HttpError(response.status, apiError.message);
|
|
406
|
-
}
|
|
407
|
-
return response.json();
|
|
227
|
+
if (queryParams) {
|
|
228
|
+
Object.entries(queryParams).forEach(([key, value]) => {
|
|
229
|
+
url.searchParams.append(key, value);
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
const response = await __classPrivateFieldGet(this, _SubscriptionService_fetch, "f").call(this, url.toString(), {
|
|
233
|
+
method,
|
|
234
|
+
headers: {
|
|
235
|
+
'Content-Type': 'application/json',
|
|
236
|
+
...headers,
|
|
408
237
|
},
|
|
238
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
409
239
|
});
|
|
240
|
+
if (!response.ok) {
|
|
241
|
+
const error = await (0, errors_js_1.getSubscriptionErrorFromResponse)(response);
|
|
242
|
+
throw error;
|
|
243
|
+
}
|
|
244
|
+
const data = await response.json();
|
|
245
|
+
return data;
|
|
410
246
|
}
|
|
411
247
|
catch (error) {
|
|
412
248
|
log(errorMessage, error);
|
|
413
249
|
const errorMessageWithUrl = `${errorMessage} (url: ${url.toString()})`;
|
|
414
250
|
const errorToCapture = error instanceof Error ? error : new Error(errorMessage);
|
|
415
251
|
__classPrivateFieldGet(this, _SubscriptionService_captureException, "f")?.call(this, (0, errors_js_1.createSentryError)(errorMessageWithUrl, errorToCapture));
|
|
416
|
-
if (error instanceof errors_js_1.SubscriptionServiceError) {
|
|
417
|
-
throw error;
|
|
418
|
-
}
|
|
419
252
|
throw new errors_js_1.SubscriptionServiceError(`Failed to make request. ${errorMessageWithUrl}`, {
|
|
420
253
|
cause: errorToCapture,
|
|
421
254
|
});
|
|
422
255
|
}
|
|
423
|
-
},
|
|
256
|
+
}, _SubscriptionService_getAuthorizationHeader =
|
|
257
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
258
|
+
async function _SubscriptionService_getAuthorizationHeader() {
|
|
424
259
|
try {
|
|
425
|
-
const
|
|
426
|
-
|
|
427
|
-
return { profileKey, bearerToken };
|
|
260
|
+
const accessToken = await this.authUtils.getAccessToken();
|
|
261
|
+
return { Authorization: `Bearer ${accessToken}` };
|
|
428
262
|
}
|
|
429
263
|
catch (error) {
|
|
430
264
|
const errorMessage = error instanceof Error
|
|
@@ -435,11 +269,10 @@ _SubscriptionService_env = new WeakMap(), _SubscriptionService_fetch = new WeakM
|
|
|
435
269
|
cause: error instanceof Error ? error : new Error(errorMessage),
|
|
436
270
|
});
|
|
437
271
|
}
|
|
438
|
-
}, _SubscriptionService_headersForToken = function _SubscriptionService_headersForToken(bearerToken) {
|
|
439
|
-
return { Authorization: `Bearer ${bearerToken}` };
|
|
440
272
|
}, _SubscriptionService_getSubscriptionApiUrl = function _SubscriptionService_getSubscriptionApiUrl(path) {
|
|
441
273
|
try {
|
|
442
|
-
|
|
274
|
+
const url = new URL((0, exports.SUBSCRIPTION_URL)(__classPrivateFieldGet(this, _SubscriptionService_env, "f"), path));
|
|
275
|
+
return url;
|
|
443
276
|
}
|
|
444
277
|
catch (error) {
|
|
445
278
|
const errorMessage = error instanceof Error
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubscriptionService.cjs","sourceRoot":"","sources":["../src/SubscriptionService.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n DataServiceCacheUpdatedEvent,\n DataServiceGranularCacheUpdatedEvent,\n DataServiceInvalidateQueriesAction,\n} from '@metamask/base-data-service';\nimport { BaseDataService } from '@metamask/base-data-service';\nimport type { CreateServicePolicyOptions } from '@metamask/controller-utils';\nimport { handleWhen, HttpError } from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type { AuthenticationController } from '@metamask/profile-sync-controller';\nimport { create } from '@metamask/superstruct';\nimport { bytesToHex, sha256, stringToBytes } from '@metamask/utils';\nimport type { Json } from '@metamask/utils';\nimport type { QueryClientConfig } from '@tanstack/query-core';\n\nimport {\n Env,\n getEnvUrls,\n SubscriptionControllerErrorMessage,\n SubscriptionServiceErrorMessage,\n} from './constants.js';\nimport {\n createSentryError,\n getSubscriptionErrorFromResponse,\n SubscriptionServiceError,\n} from './errors.js';\nimport { createModuleLogger, projectLogger } from './logger.js';\nimport type { SubscriptionServiceMethodActions } from './SubscriptionService-method-action-types.js';\nimport {\n BillingPortalResponseStruct,\n GetSubscriptionsResponseStruct,\n PricingResponseStruct,\n StartCryptoSubscriptionResponseStruct,\n StartSubscriptionResponseStruct,\n SubscriptionApiGeneralResponseStruct,\n SubscriptionEligibilityArrayStruct,\n SubscriptionStruct,\n UpdatePaymentMethodCardResponseStruct,\n} from './SubscriptionService-structs.js';\nimport type {\n AssignCohortRequest,\n BillingPortalResponse,\n CancelSubscriptionRequest,\n GetSubscriptionsEligibilitiesRequest,\n GetSubscriptionsResponse,\n LinkRewardsRequest,\n PricingResponse,\n StartCryptoSubscriptionRequest,\n StartCryptoSubscriptionResponse,\n StartSubscriptionRequest,\n StartSubscriptionResponse,\n SubmitSponsorshipIntentsRequest,\n SubmitUserEventRequest,\n Subscription,\n SubscriptionApiGeneralResponse,\n SubscriptionEligibility,\n UpdatePaymentMethodCardRequest,\n UpdatePaymentMethodCardResponse,\n UpdatePaymentMethodCryptoRequest,\n} from './types.js';\n\nexport const serviceName = 'SubscriptionService';\n\nexport const SUBSCRIPTION_URL = (env: Env, path: string): string =>\n `${getEnvUrls(env).subscriptionApiUrl}/v1/${path}`;\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getSubscriptions',\n 'cancelSubscription',\n 'unCancelSubscription',\n 'startSubscriptionWithCard',\n 'startSubscriptionWithCrypto',\n 'updatePaymentMethodCard',\n 'updatePaymentMethodCrypto',\n 'getSubscriptionsEligibilities',\n 'submitUserEvent',\n 'assignUserToCohort',\n 'submitSponsorshipIntents',\n 'linkRewards',\n 'getPricing',\n 'getBillingPortalUrl',\n] as const;\n\nexport type SubscriptionServiceInvalidateQueriesAction =\n DataServiceInvalidateQueriesAction<typeof serviceName>;\n\nexport type SubscriptionServiceActions =\n | SubscriptionServiceMethodActions\n | SubscriptionServiceInvalidateQueriesAction;\n\ntype AllowedActions =\n AuthenticationController.AuthenticationControllerGetBearerTokenAction;\n\ntype AllowedEvents = never;\n\nexport type SubscriptionServiceCacheUpdatedEvent = DataServiceCacheUpdatedEvent<\n typeof serviceName\n>;\n\nexport type SubscriptionServiceGranularCacheUpdatedEvent =\n DataServiceGranularCacheUpdatedEvent<typeof serviceName>;\n\nexport type SubscriptionServiceEvents =\n | SubscriptionServiceCacheUpdatedEvent\n | SubscriptionServiceGranularCacheUpdatedEvent;\n\nexport type SubscriptionServiceMessenger = Messenger<\n typeof serviceName,\n SubscriptionServiceActions | AllowedActions,\n SubscriptionServiceEvents | AllowedEvents\n>;\n\nexport type SubscriptionServiceOptions = {\n messenger: SubscriptionServiceMessenger;\n fetchFunction: typeof fetch;\n env?: Env;\n captureException?: (error: Error) => void;\n queryClientConfig?: QueryClientConfig;\n policyOptions?: CreateServicePolicyOptions;\n};\n\nconst log = createModuleLogger(projectLogger, 'SubscriptionService');\n\nfunction isRetryableError(error: unknown): boolean {\n if (error instanceof HttpError) {\n if (error.httpStatus === 429) {\n return true;\n }\n return error.httpStatus < 400 || error.httpStatus >= 500;\n }\n return true;\n}\n\nconst DEFAULT_POLICY_OPTIONS: CreateServicePolicyOptions = {\n retryFilterPolicy: handleWhen(isRetryableError),\n};\n\n/**\n * Data service for the Subscription API.\n *\n * All requests are authenticated via JWT Bearer tokens obtained from the\n * `AuthenticationController:getBearerToken` messenger action.\n */\nexport class SubscriptionService extends BaseDataService<\n typeof serviceName,\n SubscriptionServiceMessenger\n> {\n readonly #env: Env;\n\n readonly #fetch: typeof fetch;\n\n readonly #captureException?: (error: Error) => void;\n\n constructor({\n messenger,\n fetchFunction,\n env = Env.PRD,\n captureException,\n queryClientConfig = {},\n policyOptions = {},\n }: SubscriptionServiceOptions) {\n super({\n name: serviceName,\n messenger,\n queryClientConfig,\n policyOptions: { ...DEFAULT_POLICY_OPTIONS, ...policyOptions },\n });\n\n this.#env = env;\n this.#fetch = fetchFunction;\n this.#captureException = captureException;\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Fetches the user's subscriptions.\n *\n * @returns The subscriptions response.\n */\n async getSubscriptions(): Promise<GetSubscriptionsResponse> {\n const { profileKey, bearerToken } = await this.#getAuthenticatedContext();\n const jsonResponse = await this.#fetchJson({\n profileKey,\n bearerToken,\n methodName: 'getSubscriptions',\n requestParams: null,\n path: 'subscriptions',\n errorMessage: SubscriptionServiceErrorMessage.FailedToGetSubscriptions,\n });\n\n return create(jsonResponse, GetSubscriptionsResponseStruct);\n }\n\n /**\n * Cancels a subscription.\n *\n * @param params - The cancel subscription request.\n * @returns The updated subscription.\n */\n async cancelSubscription(\n params: CancelSubscriptionRequest,\n ): Promise<Subscription> {\n const { profileKey, bearerToken } = await this.#getAuthenticatedContext();\n const path = `subscriptions/${params.subscriptionId}/cancel`;\n const jsonResponse = await this.#fetchJson({\n profileKey,\n bearerToken,\n methodName: 'cancelSubscription',\n requestParams: params,\n path,\n method: 'POST',\n body: {\n cancelAtPeriodEnd: params.cancelAtPeriodEnd,\n },\n errorMessage: SubscriptionServiceErrorMessage.FailedToCancelSubscription,\n });\n\n return create(jsonResponse, SubscriptionStruct);\n }\n\n /**\n * Reverses a pending subscription cancellation.\n *\n * @param params - The uncancel subscription request.\n * @param params.subscriptionId - The subscription ID to uncancel.\n * @returns The updated subscription.\n */\n async unCancelSubscription(params: {\n subscriptionId: string;\n }): Promise<Subscription> {\n const { profileKey, bearerToken } = await this.#getAuthenticatedContext();\n const path = `subscriptions/${params.subscriptionId}/uncancel`;\n const jsonResponse = await this.#fetchJson({\n profileKey,\n bearerToken,\n methodName: 'unCancelSubscription',\n requestParams: params,\n path,\n method: 'POST',\n body: {},\n errorMessage:\n SubscriptionServiceErrorMessage.FailedToUncancelSubscription,\n });\n\n return create(jsonResponse, SubscriptionStruct);\n }\n\n /**\n * Starts a subscription with a card payment method.\n *\n * @param request - The start subscription request.\n * @returns The checkout session response.\n */\n async startSubscriptionWithCard(\n request: StartSubscriptionRequest,\n ): Promise<StartSubscriptionResponse> {\n if (request.products.length === 0) {\n throw new SubscriptionServiceError(\n SubscriptionControllerErrorMessage.SubscriptionProductsEmpty,\n );\n }\n\n const { profileKey, bearerToken } = await this.#getAuthenticatedContext();\n const jsonResponse = await this.#fetchJson({\n profileKey,\n bearerToken,\n methodName: 'startSubscriptionWithCard',\n requestParams: request,\n path: 'subscriptions/card',\n method: 'POST',\n body: request,\n errorMessage:\n SubscriptionServiceErrorMessage.FailedToStartSubscriptionWithCard,\n });\n\n return create(jsonResponse, StartSubscriptionResponseStruct);\n }\n\n /**\n * Starts a subscription with a crypto payment method.\n *\n * @param request - The start crypto subscription request.\n * @returns The created subscription response.\n */\n async startSubscriptionWithCrypto(\n request: StartCryptoSubscriptionRequest,\n ): Promise<StartCryptoSubscriptionResponse> {\n const { profileKey, bearerToken } = await this.#getAuthenticatedContext();\n const jsonResponse = await this.#fetchJson({\n profileKey,\n bearerToken,\n methodName: 'startSubscriptionWithCrypto',\n requestParams: request,\n path: 'subscriptions/crypto',\n method: 'POST',\n body: request,\n errorMessage:\n SubscriptionServiceErrorMessage.FailedToStartSubscriptionWithCrypto,\n });\n\n return create(jsonResponse, StartCryptoSubscriptionResponseStruct);\n }\n\n /**\n * Updates a subscription's card payment method.\n *\n * @param request - The update payment method request.\n * @returns The redirect URL response.\n */\n async updatePaymentMethodCard(\n request: UpdatePaymentMethodCardRequest,\n ): Promise<UpdatePaymentMethodCardResponse> {\n const { profileKey, bearerToken } = await this.#getAuthenticatedContext();\n const path = `subscriptions/${request.subscriptionId}/payment-method/card`;\n const jsonResponse = await this.#fetchJson({\n profileKey,\n bearerToken,\n methodName: 'updatePaymentMethodCard',\n requestParams: request,\n path,\n method: 'PATCH',\n body: {\n ...request,\n subscriptionId: undefined,\n },\n errorMessage:\n SubscriptionServiceErrorMessage.FailedToUpdatePaymentMethodCard,\n });\n\n return create(jsonResponse, UpdatePaymentMethodCardResponseStruct);\n }\n\n /**\n * Updates a subscription's crypto payment method.\n *\n * @param request - The update payment method request.\n */\n async updatePaymentMethodCrypto(\n request: UpdatePaymentMethodCryptoRequest,\n ): Promise<void> {\n const { profileKey, bearerToken } = await this.#getAuthenticatedContext();\n const path = `subscriptions/${request.subscriptionId}/payment-method/crypto`;\n await this.#fetchJson({\n profileKey,\n bearerToken,\n methodName: 'updatePaymentMethodCrypto',\n requestParams: request,\n path,\n method: 'PATCH',\n body: {\n ...request,\n subscriptionId: undefined,\n },\n errorMessage:\n SubscriptionServiceErrorMessage.FailedToUpdatePaymentMethodCrypto,\n });\n }\n\n /**\n * Get the eligibility for a shield subscription.\n *\n * @param request - Optional request object containing user balance category to check cohort eligibility\n * @returns The eligibility for a shield subscription\n */\n async getSubscriptionsEligibilities(\n request?: GetSubscriptionsEligibilitiesRequest,\n ): Promise<SubscriptionEligibility[]> {\n const { profileKey, bearerToken } = await this.#getAuthenticatedContext();\n let queryParams: Record<string, string> | undefined;\n if (request?.balanceCategory !== undefined) {\n queryParams = { balanceCategory: request.balanceCategory };\n }\n\n const jsonResponse = await this.#fetchJson({\n profileKey,\n bearerToken,\n methodName: 'getSubscriptionsEligibilities',\n requestParams: request ?? null,\n path: 'subscriptions/eligibility',\n queryParams,\n errorMessage:\n SubscriptionServiceErrorMessage.FailedToGetSubscriptionsEligibilities,\n });\n\n const results = create(jsonResponse, SubscriptionEligibilityArrayStruct);\n\n return results.map((result) => ({\n ...result,\n canSubscribe: result.canSubscribe ?? false,\n canViewEntryModal: result.canViewEntryModal ?? false,\n cohorts: result.cohorts ?? [],\n assignedCohort: result.assignedCohort ?? null,\n hasAssignedCohortExpired: result.hasAssignedCohortExpired ?? false,\n }));\n }\n\n /**\n * Submit a user event. (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 const { profileKey, bearerToken } = await this.#getAuthenticatedContext();\n await this.#fetchJson({\n profileKey,\n bearerToken,\n methodName: 'submitUserEvent',\n requestParams: request,\n path: 'user-events',\n method: 'POST',\n body: request,\n errorMessage: SubscriptionServiceErrorMessage.FailedToSubmitUserEvent,\n });\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 const { profileKey, bearerToken } = await this.#getAuthenticatedContext();\n await this.#fetchJson({\n profileKey,\n bearerToken,\n methodName: 'assignUserToCohort',\n requestParams: request,\n path: 'cohorts/assign',\n method: 'POST',\n body: request,\n errorMessage: SubscriptionServiceErrorMessage.FailedToAssignUserToCohort,\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 { address: '0x1234567890123456789012345678901234567890', products: [ProductType.Shield] }\n */\n async submitSponsorshipIntents(\n request: SubmitSponsorshipIntentsRequest,\n ): Promise<void> {\n const { profileKey, bearerToken } = await this.#getAuthenticatedContext();\n await this.#fetchJson({\n profileKey,\n bearerToken,\n methodName: 'submitSponsorshipIntents',\n requestParams: request,\n path: 'transaction-sponsorship/intents',\n method: 'POST',\n body: request,\n errorMessage:\n SubscriptionServiceErrorMessage.FailedToSubmitSponsorshipIntents,\n });\n }\n\n /**\n * Link rewards to a subscription.\n *\n * @param request - Request object containing the reward account ID.\n * @example { rewardAccountId: 'eip155:1:0x1234567890123456789012345678901234567890' }\n * @returns The response from the API.\n */\n async linkRewards(\n request: LinkRewardsRequest,\n ): Promise<SubscriptionApiGeneralResponse> {\n const { profileKey, bearerToken } = await this.#getAuthenticatedContext();\n const jsonResponse = await this.#fetchJson({\n profileKey,\n bearerToken,\n methodName: 'linkRewards',\n requestParams: request,\n path: 'rewards/link',\n method: 'POST',\n body: request,\n errorMessage: SubscriptionServiceErrorMessage.FailedToLinkRewards,\n });\n\n return create(jsonResponse, SubscriptionApiGeneralResponseStruct);\n }\n\n /**\n * Fetches subscription pricing information.\n *\n * @returns The pricing response.\n */\n async getPricing(): Promise<PricingResponse> {\n const { profileKey, bearerToken } = await this.#getAuthenticatedContext();\n const jsonResponse = await this.#fetchJson({\n profileKey,\n bearerToken,\n methodName: 'getPricing',\n requestParams: null,\n path: 'pricing',\n errorMessage: SubscriptionServiceErrorMessage.FailedToGetPricing,\n });\n\n return create(jsonResponse, PricingResponseStruct);\n }\n\n /**\n * Fetches the billing portal URL.\n *\n * @returns The billing portal response.\n */\n async getBillingPortalUrl(): Promise<BillingPortalResponse> {\n const { profileKey, bearerToken } = await this.#getAuthenticatedContext();\n const jsonResponse = await this.#fetchJson({\n profileKey,\n bearerToken,\n methodName: 'getBillingPortalUrl',\n requestParams: null,\n path: 'billing-portal',\n errorMessage: SubscriptionServiceErrorMessage.FailedToGetBillingPortalUrl,\n });\n\n return create(jsonResponse, BillingPortalResponseStruct);\n }\n\n async #fetchJson({\n profileKey,\n bearerToken,\n methodName,\n requestParams,\n path,\n method = 'GET',\n body,\n queryParams,\n errorMessage,\n }: {\n profileKey: string;\n bearerToken: string;\n methodName: string;\n requestParams: unknown;\n path: string;\n method?: 'GET' | 'POST' | 'DELETE' | 'PUT' | 'PATCH';\n body?: Record<string, unknown>;\n queryParams?: Record<string, string>;\n errorMessage: string;\n }): Promise<unknown> {\n const url = this.#getSubscriptionApiUrl(path);\n\n if (queryParams) {\n Object.entries(queryParams).forEach(([key, value]) => {\n url.searchParams.append(key, value);\n });\n }\n\n try {\n return await this.fetchQuery({\n queryKey: [\n `${this.name}:${methodName}`,\n profileKey,\n requestParams as Json,\n ],\n staleTime: 0,\n cacheTime: 0,\n queryFn: async () => {\n const response = await this.#fetch(url.toString(), {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...this.#headersForToken(bearerToken),\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const apiError = await getSubscriptionErrorFromResponse(response);\n throw new HttpError(response.status, apiError.message);\n }\n\n return response.json();\n },\n });\n } catch (error) {\n log(errorMessage, error);\n\n const errorMessageWithUrl = `${errorMessage} (url: ${url.toString()})`;\n const errorToCapture =\n error instanceof Error ? error : new Error(errorMessage);\n this.#captureException?.(\n createSentryError(errorMessageWithUrl, errorToCapture),\n );\n\n if (error instanceof SubscriptionServiceError) {\n throw error;\n }\n\n throw new SubscriptionServiceError(\n `Failed to make request. ${errorMessageWithUrl}`,\n {\n cause: errorToCapture,\n },\n );\n }\n }\n\n async #getAuthenticatedContext(): Promise<{\n profileKey: string;\n bearerToken: string;\n }> {\n try {\n const bearerToken = await this.messenger.call(\n 'AuthenticationController:getBearerToken',\n );\n const profileKey = bytesToHex(await sha256(stringToBytes(bearerToken)));\n\n return { profileKey, bearerToken };\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Unknown error when getting authorization header';\n\n this.#captureException?.(\n createSentryError(\n `Failed to get authorization header. ${errorMessage}`,\n error instanceof Error ? error : new Error(errorMessage),\n ),\n );\n\n throw new SubscriptionServiceError(\n `Failed to get authorization header. ${errorMessage}`,\n {\n cause: error instanceof Error ? error : new Error(errorMessage),\n },\n );\n }\n }\n\n #headersForToken(bearerToken: string): Record<string, string> {\n return { Authorization: `Bearer ${bearerToken}` };\n }\n\n #getSubscriptionApiUrl(path: string): URL {\n try {\n return new URL(SUBSCRIPTION_URL(this.#env, path));\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Unknown error when getting subscription API URL';\n this.#captureException?.(\n createSentryError(\n `Failed to get subscription API URL. ${errorMessage}`,\n error instanceof Error ? error : new Error(errorMessage),\n ),\n );\n\n throw error;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SubscriptionService.cjs","sourceRoot":"","sources":["../src/SubscriptionService.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getEnvUrls,\n SubscriptionControllerErrorMessage,\n SubscriptionServiceErrorMessage,\n} from './constants.js';\nimport type { Env } from './constants.js';\nimport {\n createSentryError,\n getSubscriptionErrorFromResponse,\n SubscriptionServiceError,\n} from './errors.js';\nimport { createModuleLogger, projectLogger } from './logger.js';\nimport type {\n AssignCohortRequest,\n AuthUtils,\n BillingPortalResponse,\n GetSubscriptionsEligibilitiesRequest,\n GetSubscriptionsResponse,\n ISubscriptionService,\n PricingResponse,\n SubscriptionEligibility,\n StartCryptoSubscriptionRequest,\n StartCryptoSubscriptionResponse,\n StartSubscriptionRequest,\n StartSubscriptionResponse,\n SubmitUserEventRequest,\n Subscription,\n UpdatePaymentMethodCardRequest,\n UpdatePaymentMethodCardResponse,\n UpdatePaymentMethodCryptoRequest,\n SubmitSponsorshipIntentsRequest,\n LinkRewardsRequest,\n SubscriptionApiGeneralResponse,\n CancelSubscriptionRequest,\n} from './types.js';\n\nexport type SubscriptionServiceConfig = {\n env: Env;\n auth: AuthUtils;\n fetchFunction: typeof fetch;\n captureException?: (error: Error) => void;\n};\n\nexport const SUBSCRIPTION_URL = (env: Env, path: string): string =>\n `${getEnvUrls(env).subscriptionApiUrl}/v1/${path}`;\n\nconst log = createModuleLogger(projectLogger, 'SubscriptionService');\n\nexport class SubscriptionService implements ISubscriptionService {\n readonly #env: Env;\n\n readonly #fetch: typeof fetch;\n\n readonly #captureException?: (error: Error) => void;\n\n public authUtils: AuthUtils;\n\n constructor(config: SubscriptionServiceConfig) {\n this.#env = config.env;\n this.authUtils = config.auth;\n this.#fetch = config.fetchFunction;\n this.#captureException = config.captureException;\n }\n\n async getSubscriptions(): Promise<GetSubscriptionsResponse> {\n const path = 'subscriptions';\n return await this.#makeRequest<GetSubscriptionsResponse>({\n path,\n errorMessage: SubscriptionServiceErrorMessage.FailedToGetSubscriptions,\n });\n }\n\n async cancelSubscription(\n params: CancelSubscriptionRequest,\n ): Promise<Subscription> {\n const path = `subscriptions/${params.subscriptionId}/cancel`;\n return await this.#makeRequest<Subscription>({\n path,\n method: 'POST',\n body: {\n cancelAtPeriodEnd: params.cancelAtPeriodEnd,\n },\n errorMessage: SubscriptionServiceErrorMessage.FailedToCancelSubscription,\n });\n }\n\n async unCancelSubscription(params: {\n subscriptionId: string;\n }): Promise<Subscription> {\n const path = `subscriptions/${params.subscriptionId}/uncancel`;\n return await this.#makeRequest<Subscription>({\n path,\n method: 'POST',\n body: {},\n errorMessage:\n SubscriptionServiceErrorMessage.FailedToUncancelSubscription,\n });\n }\n\n async startSubscriptionWithCard(\n request: StartSubscriptionRequest,\n ): Promise<StartSubscriptionResponse> {\n if (request.products.length === 0) {\n throw new SubscriptionServiceError(\n SubscriptionControllerErrorMessage.SubscriptionProductsEmpty,\n );\n }\n const path = 'subscriptions/card';\n\n return await this.#makeRequest<StartSubscriptionResponse>({\n path,\n method: 'POST',\n body: request,\n errorMessage:\n SubscriptionServiceErrorMessage.FailedToStartSubscriptionWithCard,\n });\n }\n\n async startSubscriptionWithCrypto(\n request: StartCryptoSubscriptionRequest,\n ): Promise<StartCryptoSubscriptionResponse> {\n const path = 'subscriptions/crypto';\n return await this.#makeRequest<StartCryptoSubscriptionResponse>({\n path,\n method: 'POST',\n body: request,\n errorMessage:\n SubscriptionServiceErrorMessage.FailedToStartSubscriptionWithCrypto,\n });\n }\n\n async updatePaymentMethodCard(\n request: UpdatePaymentMethodCardRequest,\n ): Promise<UpdatePaymentMethodCardResponse> {\n const path = `subscriptions/${request.subscriptionId}/payment-method/card`;\n return await this.#makeRequest<UpdatePaymentMethodCardResponse>({\n path,\n method: 'PATCH',\n body: {\n ...request,\n subscriptionId: undefined,\n },\n errorMessage:\n SubscriptionServiceErrorMessage.FailedToUpdatePaymentMethodCard,\n });\n }\n\n async updatePaymentMethodCrypto(\n request: UpdatePaymentMethodCryptoRequest,\n ): Promise<void> {\n const path = `subscriptions/${request.subscriptionId}/payment-method/crypto`;\n await this.#makeRequest({\n path,\n method: 'PATCH',\n body: {\n ...request,\n subscriptionId: undefined,\n },\n errorMessage:\n SubscriptionServiceErrorMessage.FailedToUpdatePaymentMethodCrypto,\n });\n }\n\n /**\n * Get the eligibility for a shield subscription.\n *\n * @param request - Optional request object containing user balance category to check cohort eligibility\n * @returns The eligibility for a shield subscription\n */\n async getSubscriptionsEligibilities(\n request?: GetSubscriptionsEligibilitiesRequest,\n ): Promise<SubscriptionEligibility[]> {\n const path = 'subscriptions/eligibility';\n let query: Record<string, string> | undefined;\n if (request?.balanceCategory !== undefined) {\n query = { balanceCategory: request.balanceCategory };\n }\n const results = await this.#makeRequest<SubscriptionEligibility[]>({\n path,\n queryParams: query,\n errorMessage:\n SubscriptionServiceErrorMessage.FailedToGetSubscriptionsEligibilities,\n });\n\n return results.map((result) => ({\n ...result,\n canSubscribe: result.canSubscribe || false,\n canViewEntryModal: result.canViewEntryModal || false,\n cohorts: result.cohorts || [],\n assignedCohort: result.assignedCohort ?? null,\n hasAssignedCohortExpired: result.hasAssignedCohortExpired || false,\n }));\n }\n\n /**\n * Submit a user event. (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 const path = 'user-events';\n await this.#makeRequest({\n path,\n method: 'POST',\n body: request,\n errorMessage: SubscriptionServiceErrorMessage.FailedToSubmitUserEvent,\n });\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 const path = 'cohorts/assign';\n await this.#makeRequest({\n path,\n method: 'POST',\n body: request,\n errorMessage: SubscriptionServiceErrorMessage.FailedToAssignUserToCohort,\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 { address: '0x1234567890123456789012345678901234567890', products: [ProductType.Shield] }\n */\n async submitSponsorshipIntents(\n request: SubmitSponsorshipIntentsRequest,\n ): Promise<void> {\n const path = 'transaction-sponsorship/intents';\n await this.#makeRequest({\n path,\n method: 'POST',\n body: request,\n errorMessage:\n SubscriptionServiceErrorMessage.FailedToSubmitSponsorshipIntents,\n });\n }\n\n /**\n * Link rewards to a subscription.\n *\n * @param request - Request object containing the reward account ID.\n * @example { rewardAccountId: 'eip155:1:0x1234567890123456789012345678901234567890' }\n * @returns The response from the API.\n */\n async linkRewards(\n request: LinkRewardsRequest,\n ): Promise<SubscriptionApiGeneralResponse> {\n const path = 'rewards/link';\n return await this.#makeRequest<SubscriptionApiGeneralResponse>({\n path,\n method: 'POST',\n body: request,\n errorMessage: SubscriptionServiceErrorMessage.FailedToLinkRewards,\n });\n }\n\n async getPricing(): Promise<PricingResponse> {\n const path = 'pricing';\n return await this.#makeRequest<PricingResponse>({\n path,\n errorMessage: SubscriptionServiceErrorMessage.FailedToGetPricing,\n });\n }\n\n async getBillingPortalUrl(): Promise<BillingPortalResponse> {\n const path = 'billing-portal';\n return await this.#makeRequest<BillingPortalResponse>({\n path,\n errorMessage: SubscriptionServiceErrorMessage.FailedToGetBillingPortalUrl,\n });\n }\n\n /**\n * Makes a request to the Subscription Service backend.\n *\n * @param params - The request object containing the path, method, body, query parameters, and error message.\n * @param params.path - The path of the request.\n * @param params.method - The method of the request.\n * @param params.body - The body of the request.\n * @param params.queryParams - The query parameters of the request.\n * @param params.errorMessage - The error message to throw if the request fails.\n * @returns The result of the request.\n */\n async #makeRequest<Result>({\n path,\n method = 'GET',\n body,\n queryParams,\n errorMessage,\n }: {\n path: string;\n method?: 'GET' | 'POST' | 'DELETE' | 'PUT' | 'PATCH';\n body?: Record<string, unknown>;\n queryParams?: Record<string, string>;\n errorMessage: string;\n }): Promise<Result> {\n const url = this.#getSubscriptionApiUrl(path);\n const headers = await this.#getAuthorizationHeader();\n\n try {\n if (queryParams) {\n Object.entries(queryParams).forEach(([key, value]) => {\n url.searchParams.append(key, value);\n });\n }\n\n const response = await this.#fetch(url.toString(), {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const error = await getSubscriptionErrorFromResponse(response);\n throw error;\n }\n\n const data = await response.json();\n return data;\n } catch (error) {\n log(errorMessage, error);\n\n const errorMessageWithUrl = `${errorMessage} (url: ${url.toString()})`;\n const errorToCapture =\n error instanceof Error ? error : new Error(errorMessage);\n this.#captureException?.(\n createSentryError(errorMessageWithUrl, errorToCapture),\n );\n\n throw new SubscriptionServiceError(\n `Failed to make request. ${errorMessageWithUrl}`,\n {\n cause: errorToCapture,\n },\n );\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n async #getAuthorizationHeader(): Promise<{ Authorization: string }> {\n try {\n const accessToken = await this.authUtils.getAccessToken();\n return { Authorization: `Bearer ${accessToken}` };\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Unknown error when getting authorization header';\n\n this.#captureException?.(\n createSentryError(\n `Failed to get authorization header. ${errorMessage}`,\n error instanceof Error ? error : new Error(errorMessage),\n ),\n );\n\n throw new SubscriptionServiceError(\n `Failed to get authorization header. ${errorMessage}`,\n {\n cause: error instanceof Error ? error : new Error(errorMessage),\n },\n );\n }\n }\n\n #getSubscriptionApiUrl(path: string): URL {\n try {\n const url = new URL(SUBSCRIPTION_URL(this.#env, path));\n return url;\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Unknown error when getting subscription API URL';\n this.#captureException?.(\n createSentryError(\n `Failed to get subscription API URL. ${errorMessage}`,\n error instanceof Error ? error : new Error(errorMessage),\n ),\n );\n\n throw error;\n }\n }\n}\n"]}
|