@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
|
@@ -9,100 +9,33 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
9
9
|
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");
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
|
-
var _SubscriptionService_instances, _SubscriptionService_env, _SubscriptionService_fetch, _SubscriptionService_captureException,
|
|
13
|
-
import {
|
|
14
|
-
import { handleWhen, HttpError } from "@metamask/controller-utils";
|
|
15
|
-
import { create } from "@metamask/superstruct";
|
|
16
|
-
import { bytesToHex, sha256, stringToBytes } from "@metamask/utils";
|
|
17
|
-
import { Env, getEnvUrls, SubscriptionControllerErrorMessage, SubscriptionServiceErrorMessage } from "./constants.mjs";
|
|
12
|
+
var _SubscriptionService_instances, _SubscriptionService_env, _SubscriptionService_fetch, _SubscriptionService_captureException, _SubscriptionService_makeRequest, _SubscriptionService_getAuthorizationHeader, _SubscriptionService_getSubscriptionApiUrl;
|
|
13
|
+
import { getEnvUrls, SubscriptionControllerErrorMessage, SubscriptionServiceErrorMessage } from "./constants.mjs";
|
|
18
14
|
import { createSentryError, getSubscriptionErrorFromResponse, SubscriptionServiceError } from "./errors.mjs";
|
|
19
15
|
import { createModuleLogger, projectLogger } from "./logger.mjs";
|
|
20
|
-
import { BillingPortalResponseStruct, GetSubscriptionsResponseStruct, PricingResponseStruct, StartCryptoSubscriptionResponseStruct, StartSubscriptionResponseStruct, SubscriptionApiGeneralResponseStruct, SubscriptionEligibilityArrayStruct, SubscriptionStruct, UpdatePaymentMethodCardResponseStruct } from "./SubscriptionService-structs.mjs";
|
|
21
|
-
export const serviceName = 'SubscriptionService';
|
|
22
16
|
export const SUBSCRIPTION_URL = (env, path) => `${getEnvUrls(env).subscriptionApiUrl}/v1/${path}`;
|
|
23
|
-
const MESSENGER_EXPOSED_METHODS = [
|
|
24
|
-
'getSubscriptions',
|
|
25
|
-
'cancelSubscription',
|
|
26
|
-
'unCancelSubscription',
|
|
27
|
-
'startSubscriptionWithCard',
|
|
28
|
-
'startSubscriptionWithCrypto',
|
|
29
|
-
'updatePaymentMethodCard',
|
|
30
|
-
'updatePaymentMethodCrypto',
|
|
31
|
-
'getSubscriptionsEligibilities',
|
|
32
|
-
'submitUserEvent',
|
|
33
|
-
'assignUserToCohort',
|
|
34
|
-
'submitSponsorshipIntents',
|
|
35
|
-
'linkRewards',
|
|
36
|
-
'getPricing',
|
|
37
|
-
'getBillingPortalUrl',
|
|
38
|
-
];
|
|
39
17
|
const log = createModuleLogger(projectLogger, 'SubscriptionService');
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
if (error.httpStatus === 429) {
|
|
43
|
-
return true;
|
|
44
|
-
}
|
|
45
|
-
return error.httpStatus < 400 || error.httpStatus >= 500;
|
|
46
|
-
}
|
|
47
|
-
return true;
|
|
48
|
-
}
|
|
49
|
-
const DEFAULT_POLICY_OPTIONS = {
|
|
50
|
-
retryFilterPolicy: handleWhen(isRetryableError),
|
|
51
|
-
};
|
|
52
|
-
/**
|
|
53
|
-
* Data service for the Subscription API.
|
|
54
|
-
*
|
|
55
|
-
* All requests are authenticated via JWT Bearer tokens obtained from the
|
|
56
|
-
* `AuthenticationController:getBearerToken` messenger action.
|
|
57
|
-
*/
|
|
58
|
-
export class SubscriptionService extends BaseDataService {
|
|
59
|
-
constructor({ messenger, fetchFunction, env = Env.PRD, captureException, queryClientConfig = {}, policyOptions = {}, }) {
|
|
60
|
-
super({
|
|
61
|
-
name: serviceName,
|
|
62
|
-
messenger,
|
|
63
|
-
queryClientConfig,
|
|
64
|
-
policyOptions: { ...DEFAULT_POLICY_OPTIONS, ...policyOptions },
|
|
65
|
-
});
|
|
18
|
+
export class SubscriptionService {
|
|
19
|
+
constructor(config) {
|
|
66
20
|
_SubscriptionService_instances.add(this);
|
|
67
21
|
_SubscriptionService_env.set(this, void 0);
|
|
68
22
|
_SubscriptionService_fetch.set(this, void 0);
|
|
69
23
|
_SubscriptionService_captureException.set(this, void 0);
|
|
70
|
-
__classPrivateFieldSet(this, _SubscriptionService_env, env, "f");
|
|
71
|
-
|
|
72
|
-
__classPrivateFieldSet(this,
|
|
73
|
-
|
|
24
|
+
__classPrivateFieldSet(this, _SubscriptionService_env, config.env, "f");
|
|
25
|
+
this.authUtils = config.auth;
|
|
26
|
+
__classPrivateFieldSet(this, _SubscriptionService_fetch, config.fetchFunction, "f");
|
|
27
|
+
__classPrivateFieldSet(this, _SubscriptionService_captureException, config.captureException, "f");
|
|
74
28
|
}
|
|
75
|
-
/**
|
|
76
|
-
* Fetches the user's subscriptions.
|
|
77
|
-
*
|
|
78
|
-
* @returns The subscriptions response.
|
|
79
|
-
*/
|
|
80
29
|
async getSubscriptions() {
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
bearerToken,
|
|
85
|
-
methodName: 'getSubscriptions',
|
|
86
|
-
requestParams: null,
|
|
87
|
-
path: 'subscriptions',
|
|
30
|
+
const path = 'subscriptions';
|
|
31
|
+
return await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
32
|
+
path,
|
|
88
33
|
errorMessage: SubscriptionServiceErrorMessage.FailedToGetSubscriptions,
|
|
89
34
|
});
|
|
90
|
-
return create(jsonResponse, GetSubscriptionsResponseStruct);
|
|
91
35
|
}
|
|
92
|
-
/**
|
|
93
|
-
* Cancels a subscription.
|
|
94
|
-
*
|
|
95
|
-
* @param params - The cancel subscription request.
|
|
96
|
-
* @returns The updated subscription.
|
|
97
|
-
*/
|
|
98
36
|
async cancelSubscription(params) {
|
|
99
|
-
const { profileKey, bearerToken } = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getAuthenticatedContext).call(this);
|
|
100
37
|
const path = `subscriptions/${params.subscriptionId}/cancel`;
|
|
101
|
-
|
|
102
|
-
profileKey,
|
|
103
|
-
bearerToken,
|
|
104
|
-
methodName: 'cancelSubscription',
|
|
105
|
-
requestParams: params,
|
|
38
|
+
return await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
106
39
|
path,
|
|
107
40
|
method: 'POST',
|
|
108
41
|
body: {
|
|
@@ -110,87 +43,40 @@ export class SubscriptionService extends BaseDataService {
|
|
|
110
43
|
},
|
|
111
44
|
errorMessage: SubscriptionServiceErrorMessage.FailedToCancelSubscription,
|
|
112
45
|
});
|
|
113
|
-
return create(jsonResponse, SubscriptionStruct);
|
|
114
46
|
}
|
|
115
|
-
/**
|
|
116
|
-
* Reverses a pending subscription cancellation.
|
|
117
|
-
*
|
|
118
|
-
* @param params - The uncancel subscription request.
|
|
119
|
-
* @param params.subscriptionId - The subscription ID to uncancel.
|
|
120
|
-
* @returns The updated subscription.
|
|
121
|
-
*/
|
|
122
47
|
async unCancelSubscription(params) {
|
|
123
|
-
const { profileKey, bearerToken } = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getAuthenticatedContext).call(this);
|
|
124
48
|
const path = `subscriptions/${params.subscriptionId}/uncancel`;
|
|
125
|
-
|
|
126
|
-
profileKey,
|
|
127
|
-
bearerToken,
|
|
128
|
-
methodName: 'unCancelSubscription',
|
|
129
|
-
requestParams: params,
|
|
49
|
+
return await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
130
50
|
path,
|
|
131
51
|
method: 'POST',
|
|
132
52
|
body: {},
|
|
133
53
|
errorMessage: SubscriptionServiceErrorMessage.FailedToUncancelSubscription,
|
|
134
54
|
});
|
|
135
|
-
return create(jsonResponse, SubscriptionStruct);
|
|
136
55
|
}
|
|
137
|
-
/**
|
|
138
|
-
* Starts a subscription with a card payment method.
|
|
139
|
-
*
|
|
140
|
-
* @param request - The start subscription request.
|
|
141
|
-
* @returns The checkout session response.
|
|
142
|
-
*/
|
|
143
56
|
async startSubscriptionWithCard(request) {
|
|
144
57
|
if (request.products.length === 0) {
|
|
145
58
|
throw new SubscriptionServiceError(SubscriptionControllerErrorMessage.SubscriptionProductsEmpty);
|
|
146
59
|
}
|
|
147
|
-
const
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
bearerToken,
|
|
151
|
-
methodName: 'startSubscriptionWithCard',
|
|
152
|
-
requestParams: request,
|
|
153
|
-
path: 'subscriptions/card',
|
|
60
|
+
const path = 'subscriptions/card';
|
|
61
|
+
return await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
62
|
+
path,
|
|
154
63
|
method: 'POST',
|
|
155
64
|
body: request,
|
|
156
65
|
errorMessage: SubscriptionServiceErrorMessage.FailedToStartSubscriptionWithCard,
|
|
157
66
|
});
|
|
158
|
-
return create(jsonResponse, StartSubscriptionResponseStruct);
|
|
159
67
|
}
|
|
160
|
-
/**
|
|
161
|
-
* Starts a subscription with a crypto payment method.
|
|
162
|
-
*
|
|
163
|
-
* @param request - The start crypto subscription request.
|
|
164
|
-
* @returns The created subscription response.
|
|
165
|
-
*/
|
|
166
68
|
async startSubscriptionWithCrypto(request) {
|
|
167
|
-
const
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
bearerToken,
|
|
171
|
-
methodName: 'startSubscriptionWithCrypto',
|
|
172
|
-
requestParams: request,
|
|
173
|
-
path: 'subscriptions/crypto',
|
|
69
|
+
const path = 'subscriptions/crypto';
|
|
70
|
+
return await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
71
|
+
path,
|
|
174
72
|
method: 'POST',
|
|
175
73
|
body: request,
|
|
176
74
|
errorMessage: SubscriptionServiceErrorMessage.FailedToStartSubscriptionWithCrypto,
|
|
177
75
|
});
|
|
178
|
-
return create(jsonResponse, StartCryptoSubscriptionResponseStruct);
|
|
179
76
|
}
|
|
180
|
-
/**
|
|
181
|
-
* Updates a subscription's card payment method.
|
|
182
|
-
*
|
|
183
|
-
* @param request - The update payment method request.
|
|
184
|
-
* @returns The redirect URL response.
|
|
185
|
-
*/
|
|
186
77
|
async updatePaymentMethodCard(request) {
|
|
187
|
-
const { profileKey, bearerToken } = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getAuthenticatedContext).call(this);
|
|
188
78
|
const path = `subscriptions/${request.subscriptionId}/payment-method/card`;
|
|
189
|
-
|
|
190
|
-
profileKey,
|
|
191
|
-
bearerToken,
|
|
192
|
-
methodName: 'updatePaymentMethodCard',
|
|
193
|
-
requestParams: request,
|
|
79
|
+
return await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
194
80
|
path,
|
|
195
81
|
method: 'PATCH',
|
|
196
82
|
body: {
|
|
@@ -199,21 +85,10 @@ export class SubscriptionService extends BaseDataService {
|
|
|
199
85
|
},
|
|
200
86
|
errorMessage: SubscriptionServiceErrorMessage.FailedToUpdatePaymentMethodCard,
|
|
201
87
|
});
|
|
202
|
-
return create(jsonResponse, UpdatePaymentMethodCardResponseStruct);
|
|
203
88
|
}
|
|
204
|
-
/**
|
|
205
|
-
* Updates a subscription's crypto payment method.
|
|
206
|
-
*
|
|
207
|
-
* @param request - The update payment method request.
|
|
208
|
-
*/
|
|
209
89
|
async updatePaymentMethodCrypto(request) {
|
|
210
|
-
const { profileKey, bearerToken } = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getAuthenticatedContext).call(this);
|
|
211
90
|
const path = `subscriptions/${request.subscriptionId}/payment-method/crypto`;
|
|
212
|
-
await __classPrivateFieldGet(this, _SubscriptionService_instances, "m",
|
|
213
|
-
profileKey,
|
|
214
|
-
bearerToken,
|
|
215
|
-
methodName: 'updatePaymentMethodCrypto',
|
|
216
|
-
requestParams: request,
|
|
91
|
+
await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
217
92
|
path,
|
|
218
93
|
method: 'PATCH',
|
|
219
94
|
body: {
|
|
@@ -230,28 +105,23 @@ export class SubscriptionService extends BaseDataService {
|
|
|
230
105
|
* @returns The eligibility for a shield subscription
|
|
231
106
|
*/
|
|
232
107
|
async getSubscriptionsEligibilities(request) {
|
|
233
|
-
const
|
|
234
|
-
let
|
|
108
|
+
const path = 'subscriptions/eligibility';
|
|
109
|
+
let query;
|
|
235
110
|
if (request?.balanceCategory !== undefined) {
|
|
236
|
-
|
|
111
|
+
query = { balanceCategory: request.balanceCategory };
|
|
237
112
|
}
|
|
238
|
-
const
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
methodName: 'getSubscriptionsEligibilities',
|
|
242
|
-
requestParams: request ?? null,
|
|
243
|
-
path: 'subscriptions/eligibility',
|
|
244
|
-
queryParams,
|
|
113
|
+
const results = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
114
|
+
path,
|
|
115
|
+
queryParams: query,
|
|
245
116
|
errorMessage: SubscriptionServiceErrorMessage.FailedToGetSubscriptionsEligibilities,
|
|
246
117
|
});
|
|
247
|
-
const results = create(jsonResponse, SubscriptionEligibilityArrayStruct);
|
|
248
118
|
return results.map((result) => ({
|
|
249
119
|
...result,
|
|
250
|
-
canSubscribe: result.canSubscribe
|
|
251
|
-
canViewEntryModal: result.canViewEntryModal
|
|
252
|
-
cohorts: result.cohorts
|
|
120
|
+
canSubscribe: result.canSubscribe || false,
|
|
121
|
+
canViewEntryModal: result.canViewEntryModal || false,
|
|
122
|
+
cohorts: result.cohorts || [],
|
|
253
123
|
assignedCohort: result.assignedCohort ?? null,
|
|
254
|
-
hasAssignedCohortExpired: result.hasAssignedCohortExpired
|
|
124
|
+
hasAssignedCohortExpired: result.hasAssignedCohortExpired || false,
|
|
255
125
|
}));
|
|
256
126
|
}
|
|
257
127
|
/**
|
|
@@ -261,13 +131,9 @@ export class SubscriptionService extends BaseDataService {
|
|
|
261
131
|
* @example { event: SubscriptionUserEvent.ShieldEntryModalViewed, cohort: 'post_tx' }
|
|
262
132
|
*/
|
|
263
133
|
async submitUserEvent(request) {
|
|
264
|
-
const
|
|
265
|
-
await __classPrivateFieldGet(this, _SubscriptionService_instances, "m",
|
|
266
|
-
|
|
267
|
-
bearerToken,
|
|
268
|
-
methodName: 'submitUserEvent',
|
|
269
|
-
requestParams: request,
|
|
270
|
-
path: 'user-events',
|
|
134
|
+
const path = 'user-events';
|
|
135
|
+
await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
136
|
+
path,
|
|
271
137
|
method: 'POST',
|
|
272
138
|
body: request,
|
|
273
139
|
errorMessage: SubscriptionServiceErrorMessage.FailedToSubmitUserEvent,
|
|
@@ -280,13 +146,9 @@ export class SubscriptionService extends BaseDataService {
|
|
|
280
146
|
* @example { cohort: 'post_tx' }
|
|
281
147
|
*/
|
|
282
148
|
async assignUserToCohort(request) {
|
|
283
|
-
const
|
|
284
|
-
await __classPrivateFieldGet(this, _SubscriptionService_instances, "m",
|
|
285
|
-
|
|
286
|
-
bearerToken,
|
|
287
|
-
methodName: 'assignUserToCohort',
|
|
288
|
-
requestParams: request,
|
|
289
|
-
path: 'cohorts/assign',
|
|
149
|
+
const path = 'cohorts/assign';
|
|
150
|
+
await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
151
|
+
path,
|
|
290
152
|
method: 'POST',
|
|
291
153
|
body: request,
|
|
292
154
|
errorMessage: SubscriptionServiceErrorMessage.FailedToAssignUserToCohort,
|
|
@@ -302,13 +164,9 @@ export class SubscriptionService extends BaseDataService {
|
|
|
302
164
|
* @example { address: '0x1234567890123456789012345678901234567890', products: [ProductType.Shield] }
|
|
303
165
|
*/
|
|
304
166
|
async submitSponsorshipIntents(request) {
|
|
305
|
-
const
|
|
306
|
-
await __classPrivateFieldGet(this, _SubscriptionService_instances, "m",
|
|
307
|
-
|
|
308
|
-
bearerToken,
|
|
309
|
-
methodName: 'submitSponsorshipIntents',
|
|
310
|
-
requestParams: request,
|
|
311
|
-
path: 'transaction-sponsorship/intents',
|
|
167
|
+
const path = 'transaction-sponsorship/intents';
|
|
168
|
+
await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
169
|
+
path,
|
|
312
170
|
method: 'POST',
|
|
313
171
|
body: request,
|
|
314
172
|
errorMessage: SubscriptionServiceErrorMessage.FailedToSubmitSponsorshipIntents,
|
|
@@ -322,104 +180,80 @@ export class SubscriptionService extends BaseDataService {
|
|
|
322
180
|
* @returns The response from the API.
|
|
323
181
|
*/
|
|
324
182
|
async linkRewards(request) {
|
|
325
|
-
const
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
bearerToken,
|
|
329
|
-
methodName: 'linkRewards',
|
|
330
|
-
requestParams: request,
|
|
331
|
-
path: 'rewards/link',
|
|
183
|
+
const path = 'rewards/link';
|
|
184
|
+
return await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
185
|
+
path,
|
|
332
186
|
method: 'POST',
|
|
333
187
|
body: request,
|
|
334
188
|
errorMessage: SubscriptionServiceErrorMessage.FailedToLinkRewards,
|
|
335
189
|
});
|
|
336
|
-
return create(jsonResponse, SubscriptionApiGeneralResponseStruct);
|
|
337
190
|
}
|
|
338
|
-
/**
|
|
339
|
-
* Fetches subscription pricing information.
|
|
340
|
-
*
|
|
341
|
-
* @returns The pricing response.
|
|
342
|
-
*/
|
|
343
191
|
async getPricing() {
|
|
344
|
-
const
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
bearerToken,
|
|
348
|
-
methodName: 'getPricing',
|
|
349
|
-
requestParams: null,
|
|
350
|
-
path: 'pricing',
|
|
192
|
+
const path = 'pricing';
|
|
193
|
+
return await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
194
|
+
path,
|
|
351
195
|
errorMessage: SubscriptionServiceErrorMessage.FailedToGetPricing,
|
|
352
196
|
});
|
|
353
|
-
return create(jsonResponse, PricingResponseStruct);
|
|
354
197
|
}
|
|
355
|
-
/**
|
|
356
|
-
* Fetches the billing portal URL.
|
|
357
|
-
*
|
|
358
|
-
* @returns The billing portal response.
|
|
359
|
-
*/
|
|
360
198
|
async getBillingPortalUrl() {
|
|
361
|
-
const
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
bearerToken,
|
|
365
|
-
methodName: 'getBillingPortalUrl',
|
|
366
|
-
requestParams: null,
|
|
367
|
-
path: 'billing-portal',
|
|
199
|
+
const path = 'billing-portal';
|
|
200
|
+
return await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_makeRequest).call(this, {
|
|
201
|
+
path,
|
|
368
202
|
errorMessage: SubscriptionServiceErrorMessage.FailedToGetBillingPortalUrl,
|
|
369
203
|
});
|
|
370
|
-
return create(jsonResponse, BillingPortalResponseStruct);
|
|
371
204
|
}
|
|
372
205
|
}
|
|
373
|
-
_SubscriptionService_env = new WeakMap(), _SubscriptionService_fetch = new WeakMap(), _SubscriptionService_captureException = new WeakMap(), _SubscriptionService_instances = new WeakSet(),
|
|
206
|
+
_SubscriptionService_env = new WeakMap(), _SubscriptionService_fetch = new WeakMap(), _SubscriptionService_captureException = new WeakMap(), _SubscriptionService_instances = new WeakSet(), _SubscriptionService_makeRequest =
|
|
207
|
+
/**
|
|
208
|
+
* Makes a request to the Subscription Service backend.
|
|
209
|
+
*
|
|
210
|
+
* @param params - The request object containing the path, method, body, query parameters, and error message.
|
|
211
|
+
* @param params.path - The path of the request.
|
|
212
|
+
* @param params.method - The method of the request.
|
|
213
|
+
* @param params.body - The body of the request.
|
|
214
|
+
* @param params.queryParams - The query parameters of the request.
|
|
215
|
+
* @param params.errorMessage - The error message to throw if the request fails.
|
|
216
|
+
* @returns The result of the request.
|
|
217
|
+
*/
|
|
218
|
+
async function _SubscriptionService_makeRequest({ path, method = 'GET', body, queryParams, errorMessage, }) {
|
|
374
219
|
const url = __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getSubscriptionApiUrl).call(this, path);
|
|
375
|
-
|
|
376
|
-
Object.entries(queryParams).forEach(([key, value]) => {
|
|
377
|
-
url.searchParams.append(key, value);
|
|
378
|
-
});
|
|
379
|
-
}
|
|
220
|
+
const headers = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getAuthorizationHeader).call(this);
|
|
380
221
|
try {
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
method,
|
|
392
|
-
headers: {
|
|
393
|
-
'Content-Type': 'application/json',
|
|
394
|
-
...__classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_headersForToken).call(this, bearerToken),
|
|
395
|
-
},
|
|
396
|
-
body: body ? JSON.stringify(body) : undefined,
|
|
397
|
-
});
|
|
398
|
-
if (!response.ok) {
|
|
399
|
-
const apiError = await getSubscriptionErrorFromResponse(response);
|
|
400
|
-
throw new HttpError(response.status, apiError.message);
|
|
401
|
-
}
|
|
402
|
-
return response.json();
|
|
222
|
+
if (queryParams) {
|
|
223
|
+
Object.entries(queryParams).forEach(([key, value]) => {
|
|
224
|
+
url.searchParams.append(key, value);
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
const response = await __classPrivateFieldGet(this, _SubscriptionService_fetch, "f").call(this, url.toString(), {
|
|
228
|
+
method,
|
|
229
|
+
headers: {
|
|
230
|
+
'Content-Type': 'application/json',
|
|
231
|
+
...headers,
|
|
403
232
|
},
|
|
233
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
404
234
|
});
|
|
235
|
+
if (!response.ok) {
|
|
236
|
+
const error = await getSubscriptionErrorFromResponse(response);
|
|
237
|
+
throw error;
|
|
238
|
+
}
|
|
239
|
+
const data = await response.json();
|
|
240
|
+
return data;
|
|
405
241
|
}
|
|
406
242
|
catch (error) {
|
|
407
243
|
log(errorMessage, error);
|
|
408
244
|
const errorMessageWithUrl = `${errorMessage} (url: ${url.toString()})`;
|
|
409
245
|
const errorToCapture = error instanceof Error ? error : new Error(errorMessage);
|
|
410
246
|
__classPrivateFieldGet(this, _SubscriptionService_captureException, "f")?.call(this, createSentryError(errorMessageWithUrl, errorToCapture));
|
|
411
|
-
if (error instanceof SubscriptionServiceError) {
|
|
412
|
-
throw error;
|
|
413
|
-
}
|
|
414
247
|
throw new SubscriptionServiceError(`Failed to make request. ${errorMessageWithUrl}`, {
|
|
415
248
|
cause: errorToCapture,
|
|
416
249
|
});
|
|
417
250
|
}
|
|
418
|
-
},
|
|
251
|
+
}, _SubscriptionService_getAuthorizationHeader =
|
|
252
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
253
|
+
async function _SubscriptionService_getAuthorizationHeader() {
|
|
419
254
|
try {
|
|
420
|
-
const
|
|
421
|
-
|
|
422
|
-
return { profileKey, bearerToken };
|
|
255
|
+
const accessToken = await this.authUtils.getAccessToken();
|
|
256
|
+
return { Authorization: `Bearer ${accessToken}` };
|
|
423
257
|
}
|
|
424
258
|
catch (error) {
|
|
425
259
|
const errorMessage = error instanceof Error
|
|
@@ -430,11 +264,10 @@ _SubscriptionService_env = new WeakMap(), _SubscriptionService_fetch = new WeakM
|
|
|
430
264
|
cause: error instanceof Error ? error : new Error(errorMessage),
|
|
431
265
|
});
|
|
432
266
|
}
|
|
433
|
-
}, _SubscriptionService_headersForToken = function _SubscriptionService_headersForToken(bearerToken) {
|
|
434
|
-
return { Authorization: `Bearer ${bearerToken}` };
|
|
435
267
|
}, _SubscriptionService_getSubscriptionApiUrl = function _SubscriptionService_getSubscriptionApiUrl(path) {
|
|
436
268
|
try {
|
|
437
|
-
|
|
269
|
+
const url = new URL(SUBSCRIPTION_URL(__classPrivateFieldGet(this, _SubscriptionService_env, "f"), path));
|
|
270
|
+
return url;
|
|
438
271
|
}
|
|
439
272
|
catch (error) {
|
|
440
273
|
const errorMessage = error instanceof Error
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubscriptionService.mjs","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.mjs","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"]}
|
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.SubscriptionService = exports.SubscriptionServiceErrorMessage = exports.SubscriptionControllerErrorMessage = exports.Env = exports.SubscriptionServiceError = exports.MODAL_TYPE = exports.BALANCE_CATEGORIES = exports.COHORT_NAMES = exports.SubscriptionUserEvent = exports.PAYMENT_TYPES = exports.RECURRING_INTERVALS = exports.PRODUCT_TYPES = exports.SUBSCRIPTION_STATUSES = exports.CRYPTO_PAYMENT_METHOD_ERRORS = exports.CANCEL_TYPES = exports.getDefaultSubscriptionControllerState = exports.SubscriptionController = void 0;
|
|
4
4
|
var SubscriptionController_js_1 = require("./SubscriptionController.cjs");
|
|
5
5
|
Object.defineProperty(exports, "SubscriptionController", { enumerable: true, get: function () { return SubscriptionController_js_1.SubscriptionController; } });
|
|
6
6
|
Object.defineProperty(exports, "getDefaultSubscriptionControllerState", { enumerable: true, get: function () { return SubscriptionController_js_1.getDefaultSubscriptionControllerState; } });
|
|
@@ -23,6 +23,4 @@ Object.defineProperty(exports, "SubscriptionControllerErrorMessage", { enumerabl
|
|
|
23
23
|
Object.defineProperty(exports, "SubscriptionServiceErrorMessage", { enumerable: true, get: function () { return constants_js_1.SubscriptionServiceErrorMessage; } });
|
|
24
24
|
var SubscriptionService_js_1 = require("./SubscriptionService.cjs");
|
|
25
25
|
Object.defineProperty(exports, "SubscriptionService", { enumerable: true, get: function () { return SubscriptionService_js_1.SubscriptionService; } });
|
|
26
|
-
Object.defineProperty(exports, "subscriptionServiceName", { enumerable: true, get: function () { return SubscriptionService_js_1.serviceName; } });
|
|
27
|
-
Object.defineProperty(exports, "SUBSCRIPTION_URL", { enumerable: true, get: function () { return SubscriptionService_js_1.SUBSCRIPTION_URL; } });
|
|
28
26
|
//# sourceMappingURL=index.cjs.map
|