@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.
Files changed (42) hide show
  1. package/CHANGELOG.md +0 -6
  2. package/dist/SubscriptionController.cjs +26 -18
  3. package/dist/SubscriptionController.cjs.map +1 -1
  4. package/dist/SubscriptionController.d.cts +9 -5
  5. package/dist/SubscriptionController.d.cts.map +1 -1
  6. package/dist/SubscriptionController.d.mts +9 -5
  7. package/dist/SubscriptionController.d.mts.map +1 -1
  8. package/dist/SubscriptionController.mjs +26 -18
  9. package/dist/SubscriptionController.mjs.map +1 -1
  10. package/dist/SubscriptionService.cjs +87 -254
  11. package/dist/SubscriptionService.cjs.map +1 -1
  12. package/dist/SubscriptionService.d.cts +9 -84
  13. package/dist/SubscriptionService.d.cts.map +1 -1
  14. package/dist/SubscriptionService.d.mts +9 -84
  15. package/dist/SubscriptionService.d.mts.map +1 -1
  16. package/dist/SubscriptionService.mjs +87 -254
  17. package/dist/SubscriptionService.mjs.map +1 -1
  18. package/dist/index.cjs +1 -3
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.cts +3 -4
  21. package/dist/index.d.cts.map +1 -1
  22. package/dist/index.d.mts +3 -4
  23. package/dist/index.d.mts.map +1 -1
  24. package/dist/index.mjs +1 -1
  25. package/dist/index.mjs.map +1 -1
  26. package/package.json +1 -4
  27. package/dist/SubscriptionService-method-action-types.cjs +0 -7
  28. package/dist/SubscriptionService-method-action-types.cjs.map +0 -1
  29. package/dist/SubscriptionService-method-action-types.d.cts +0 -151
  30. package/dist/SubscriptionService-method-action-types.d.cts.map +0 -1
  31. package/dist/SubscriptionService-method-action-types.d.mts +0 -151
  32. package/dist/SubscriptionService-method-action-types.d.mts.map +0 -1
  33. package/dist/SubscriptionService-method-action-types.mjs +0 -6
  34. package/dist/SubscriptionService-method-action-types.mjs.map +0 -1
  35. package/dist/SubscriptionService-structs.cjs +0 -135
  36. package/dist/SubscriptionService-structs.cjs.map +0 -1
  37. package/dist/SubscriptionService-structs.d.cts +0 -773
  38. package/dist/SubscriptionService-structs.d.cts.map +0 -1
  39. package/dist/SubscriptionService-structs.d.mts +0 -773
  40. package/dist/SubscriptionService-structs.d.mts.map +0 -1
  41. package/dist/SubscriptionService-structs.mjs +0 -132
  42. 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, _SubscriptionService_fetchJson, _SubscriptionService_getAuthenticatedContext, _SubscriptionService_headersForToken, _SubscriptionService_getSubscriptionApiUrl;
13
- import { BaseDataService } from "@metamask/base-data-service";
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
- function isRetryableError(error) {
41
- if (error instanceof HttpError) {
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
- __classPrivateFieldSet(this, _SubscriptionService_fetch, fetchFunction, "f");
72
- __classPrivateFieldSet(this, _SubscriptionService_captureException, captureException, "f");
73
- this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
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 { profileKey, bearerToken } = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getAuthenticatedContext).call(this);
82
- const jsonResponse = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_fetchJson).call(this, {
83
- profileKey,
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
- const jsonResponse = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_fetchJson).call(this, {
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
- const jsonResponse = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_fetchJson).call(this, {
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 { profileKey, bearerToken } = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getAuthenticatedContext).call(this);
148
- const jsonResponse = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_fetchJson).call(this, {
149
- profileKey,
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 { profileKey, bearerToken } = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getAuthenticatedContext).call(this);
168
- const jsonResponse = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_fetchJson).call(this, {
169
- profileKey,
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
- const jsonResponse = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_fetchJson).call(this, {
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", _SubscriptionService_fetchJson).call(this, {
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 { profileKey, bearerToken } = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getAuthenticatedContext).call(this);
234
- let queryParams;
108
+ const path = 'subscriptions/eligibility';
109
+ let query;
235
110
  if (request?.balanceCategory !== undefined) {
236
- queryParams = { balanceCategory: request.balanceCategory };
111
+ query = { balanceCategory: request.balanceCategory };
237
112
  }
238
- const jsonResponse = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_fetchJson).call(this, {
239
- profileKey,
240
- bearerToken,
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 ?? false,
251
- canViewEntryModal: result.canViewEntryModal ?? false,
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 ?? false,
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 { profileKey, bearerToken } = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getAuthenticatedContext).call(this);
265
- await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_fetchJson).call(this, {
266
- profileKey,
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 { profileKey, bearerToken } = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getAuthenticatedContext).call(this);
284
- await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_fetchJson).call(this, {
285
- profileKey,
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 { profileKey, bearerToken } = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getAuthenticatedContext).call(this);
306
- await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_fetchJson).call(this, {
307
- profileKey,
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 { profileKey, bearerToken } = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getAuthenticatedContext).call(this);
326
- const jsonResponse = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_fetchJson).call(this, {
327
- profileKey,
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 { profileKey, bearerToken } = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getAuthenticatedContext).call(this);
345
- const jsonResponse = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_fetchJson).call(this, {
346
- profileKey,
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 { profileKey, bearerToken } = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_getAuthenticatedContext).call(this);
362
- const jsonResponse = await __classPrivateFieldGet(this, _SubscriptionService_instances, "m", _SubscriptionService_fetchJson).call(this, {
363
- profileKey,
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(), _SubscriptionService_fetchJson = async function _SubscriptionService_fetchJson({ profileKey, bearerToken, methodName, requestParams, path, method = 'GET', body, queryParams, errorMessage, }) {
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
- if (queryParams) {
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
- return await this.fetchQuery({
382
- queryKey: [
383
- `${this.name}:${methodName}`,
384
- profileKey,
385
- requestParams,
386
- ],
387
- staleTime: 0,
388
- cacheTime: 0,
389
- queryFn: async () => {
390
- const response = await __classPrivateFieldGet(this, _SubscriptionService_fetch, "f").call(this, url.toString(), {
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
- }, _SubscriptionService_getAuthenticatedContext = async function _SubscriptionService_getAuthenticatedContext() {
251
+ }, _SubscriptionService_getAuthorizationHeader =
252
+ // eslint-disable-next-line @typescript-eslint/naming-convention
253
+ async function _SubscriptionService_getAuthorizationHeader() {
419
254
  try {
420
- const bearerToken = await this.messenger.call('AuthenticationController:getBearerToken');
421
- const profileKey = bytesToHex(await sha256(stringToBytes(bearerToken)));
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
- return new URL(SUBSCRIPTION_URL(__classPrivateFieldGet(this, _SubscriptionService_env, "f"), path));
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":";;;;;;;;;;;;AAKA,OAAO,EAAE,eAAe,EAAE,oCAAoC;AAE9D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,mCAAmC;AAGnE,OAAO,EAAE,MAAM,EAAE,8BAA8B;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,wBAAwB;AAIpE,OAAO,EACL,GAAG,EACH,UAAU,EACV,kCAAkC,EAClC,+BAA+B,EAChC,wBAAuB;AACxB,OAAO,EACL,iBAAiB,EACjB,gCAAgC,EAChC,wBAAwB,EACzB,qBAAoB;AACrB,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,qBAAoB;AAEhE,OAAO,EACL,2BAA2B,EAC3B,8BAA8B,EAC9B,qBAAqB,EACrB,qCAAqC,EACrC,+BAA+B,EAC/B,oCAAoC,EACpC,kCAAkC,EAClC,kBAAkB,EAClB,qCAAqC,EACtC,0CAAyC;AAuB1C,MAAM,CAAC,MAAM,WAAW,GAAG,qBAAqB,CAAC;AAEjD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAAQ,EAAE,IAAY,EAAU,EAAE,CACjE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,kBAAkB,OAAO,IAAI,EAAE,CAAC;AAErD,MAAM,yBAAyB,GAAG;IAChC,kBAAkB;IAClB,oBAAoB;IACpB,sBAAsB;IACtB,2BAA2B;IAC3B,6BAA6B;IAC7B,yBAAyB;IACzB,2BAA2B;IAC3B,+BAA+B;IAC/B,iBAAiB;IACjB,oBAAoB;IACpB,0BAA0B;IAC1B,aAAa;IACb,YAAY;IACZ,qBAAqB;CACb,CAAC;AAwCX,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,qBAAqB,CAAC,CAAC;AAErE,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC,UAAU,GAAG,GAAG,IAAI,KAAK,CAAC,UAAU,IAAI,GAAG,CAAC;IAC3D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,sBAAsB,GAA+B;IACzD,iBAAiB,EAAE,UAAU,CAAC,gBAAgB,CAAC;CAChD,CAAC;AAEF;;;;;GAKG;AACH,MAAM,OAAO,mBAAoB,SAAQ,eAGxC;IAOC,YAAY,EACV,SAAS,EACT,aAAa,EACb,GAAG,GAAG,GAAG,CAAC,GAAG,EACb,gBAAgB,EAChB,iBAAiB,GAAG,EAAE,EACtB,aAAa,GAAG,EAAE,GACS;QAC3B,KAAK,CAAC;YACJ,IAAI,EAAE,WAAW;YACjB,SAAS;YACT,iBAAiB;YACjB,aAAa,EAAE,EAAE,GAAG,sBAAsB,EAAE,GAAG,aAAa,EAAE;SAC/D,CAAC,CAAC;;QAnBI,2CAAU;QAEV,6CAAqB;QAErB,wDAA2C;QAiBlD,uBAAA,IAAI,4BAAQ,GAAG,MAAA,CAAC;QAChB,uBAAA,IAAI,8BAAU,aAAa,MAAA,CAAC;QAC5B,uBAAA,IAAI,yCAAqB,gBAAgB,MAAA,CAAC;QAE1C,IAAI,CAAC,SAAS,CAAC,4BAA4B,CACzC,IAAI,EACJ,yBAAyB,CAC1B,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,gBAAgB;QACpB,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,CAA2B,CAAC;QAC1E,MAAM,YAAY,GAAG,MAAM,uBAAA,IAAI,sEAAW,MAAf,IAAI,EAAY;YACzC,UAAU;YACV,WAAW;YACX,UAAU,EAAE,kBAAkB;YAC9B,aAAa,EAAE,IAAI;YACnB,IAAI,EAAE,eAAe;YACrB,YAAY,EAAE,+BAA+B,CAAC,wBAAwB;SACvE,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,YAAY,EAAE,8BAA8B,CAAC,CAAC;IAC9D,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,kBAAkB,CACtB,MAAiC;QAEjC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,CAA2B,CAAC;QAC1E,MAAM,IAAI,GAAG,iBAAiB,MAAM,CAAC,cAAc,SAAS,CAAC;QAC7D,MAAM,YAAY,GAAG,MAAM,uBAAA,IAAI,sEAAW,MAAf,IAAI,EAAY;YACzC,UAAU;YACV,WAAW;YACX,UAAU,EAAE,oBAAoB;YAChC,aAAa,EAAE,MAAM;YACrB,IAAI;YACJ,MAAM,EAAE,MAAM;YACd,IAAI,EAAE;gBACJ,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;aAC5C;YACD,YAAY,EAAE,+BAA+B,CAAC,0BAA0B;SACzE,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;IAClD,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,oBAAoB,CAAC,MAE1B;QACC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,CAA2B,CAAC;QAC1E,MAAM,IAAI,GAAG,iBAAiB,MAAM,CAAC,cAAc,WAAW,CAAC;QAC/D,MAAM,YAAY,GAAG,MAAM,uBAAA,IAAI,sEAAW,MAAf,IAAI,EAAY;YACzC,UAAU;YACV,WAAW;YACX,UAAU,EAAE,sBAAsB;YAClC,aAAa,EAAE,MAAM;YACrB,IAAI;YACJ,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE;YACR,YAAY,EACV,+BAA+B,CAAC,4BAA4B;SAC/D,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;IAClD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,yBAAyB,CAC7B,OAAiC;QAEjC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,wBAAwB,CAChC,kCAAkC,CAAC,yBAAyB,CAC7D,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,CAA2B,CAAC;QAC1E,MAAM,YAAY,GAAG,MAAM,uBAAA,IAAI,sEAAW,MAAf,IAAI,EAAY;YACzC,UAAU;YACV,WAAW;YACX,UAAU,EAAE,2BAA2B;YACvC,aAAa,EAAE,OAAO;YACtB,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,OAAO;YACb,YAAY,EACV,+BAA+B,CAAC,iCAAiC;SACpE,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,YAAY,EAAE,+BAA+B,CAAC,CAAC;IAC/D,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,2BAA2B,CAC/B,OAAuC;QAEvC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,CAA2B,CAAC;QAC1E,MAAM,YAAY,GAAG,MAAM,uBAAA,IAAI,sEAAW,MAAf,IAAI,EAAY;YACzC,UAAU;YACV,WAAW;YACX,UAAU,EAAE,6BAA6B;YACzC,aAAa,EAAE,OAAO;YACtB,IAAI,EAAE,sBAAsB;YAC5B,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,OAAO;YACb,YAAY,EACV,+BAA+B,CAAC,mCAAmC;SACtE,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,YAAY,EAAE,qCAAqC,CAAC,CAAC;IACrE,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,uBAAuB,CAC3B,OAAuC;QAEvC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,CAA2B,CAAC;QAC1E,MAAM,IAAI,GAAG,iBAAiB,OAAO,CAAC,cAAc,sBAAsB,CAAC;QAC3E,MAAM,YAAY,GAAG,MAAM,uBAAA,IAAI,sEAAW,MAAf,IAAI,EAAY;YACzC,UAAU;YACV,WAAW;YACX,UAAU,EAAE,yBAAyB;YACrC,aAAa,EAAE,OAAO;YACtB,IAAI;YACJ,MAAM,EAAE,OAAO;YACf,IAAI,EAAE;gBACJ,GAAG,OAAO;gBACV,cAAc,EAAE,SAAS;aAC1B;YACD,YAAY,EACV,+BAA+B,CAAC,+BAA+B;SAClE,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,YAAY,EAAE,qCAAqC,CAAC,CAAC;IACrE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,yBAAyB,CAC7B,OAAyC;QAEzC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,CAA2B,CAAC;QAC1E,MAAM,IAAI,GAAG,iBAAiB,OAAO,CAAC,cAAc,wBAAwB,CAAC;QAC7E,MAAM,uBAAA,IAAI,sEAAW,MAAf,IAAI,EAAY;YACpB,UAAU;YACV,WAAW;YACX,UAAU,EAAE,2BAA2B;YACvC,aAAa,EAAE,OAAO;YACtB,IAAI;YACJ,MAAM,EAAE,OAAO;YACf,IAAI,EAAE;gBACJ,GAAG,OAAO;gBACV,cAAc,EAAE,SAAS;aAC1B;YACD,YAAY,EACV,+BAA+B,CAAC,iCAAiC;SACpE,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,6BAA6B,CACjC,OAA8C;QAE9C,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,CAA2B,CAAC;QAC1E,IAAI,WAA+C,CAAC;QACpD,IAAI,OAAO,EAAE,eAAe,KAAK,SAAS,EAAE,CAAC;YAC3C,WAAW,GAAG,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7D,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,uBAAA,IAAI,sEAAW,MAAf,IAAI,EAAY;YACzC,UAAU;YACV,WAAW;YACX,UAAU,EAAE,+BAA+B;YAC3C,aAAa,EAAE,OAAO,IAAI,IAAI;YAC9B,IAAI,EAAE,2BAA2B;YACjC,WAAW;YACX,YAAY,EACV,+BAA+B,CAAC,qCAAqC;SACxE,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,EAAE,kCAAkC,CAAC,CAAC;QAEzE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9B,GAAG,MAAM;YACT,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,KAAK;YAC1C,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,KAAK;YACpD,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;YAC7B,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI;YAC7C,wBAAwB,EAAE,MAAM,CAAC,wBAAwB,IAAI,KAAK;SACnE,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,eAAe,CAAC,OAA+B;QACnD,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,CAA2B,CAAC;QAC1E,MAAM,uBAAA,IAAI,sEAAW,MAAf,IAAI,EAAY;YACpB,UAAU;YACV,WAAW;YACX,UAAU,EAAE,iBAAiB;YAC7B,aAAa,EAAE,OAAO;YACtB,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,OAAO;YACb,YAAY,EAAE,+BAA+B,CAAC,uBAAuB;SACtE,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,kBAAkB,CAAC,OAA4B;QACnD,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,CAA2B,CAAC;QAC1E,MAAM,uBAAA,IAAI,sEAAW,MAAf,IAAI,EAAY;YACpB,UAAU;YACV,WAAW;YACX,UAAU,EAAE,oBAAoB;YAChC,aAAa,EAAE,OAAO;YACtB,IAAI,EAAE,gBAAgB;YACtB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,OAAO;YACb,YAAY,EAAE,+BAA+B,CAAC,0BAA0B;SACzE,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,wBAAwB,CAC5B,OAAwC;QAExC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,CAA2B,CAAC;QAC1E,MAAM,uBAAA,IAAI,sEAAW,MAAf,IAAI,EAAY;YACpB,UAAU;YACV,WAAW;YACX,UAAU,EAAE,0BAA0B;YACtC,aAAa,EAAE,OAAO;YACtB,IAAI,EAAE,iCAAiC;YACvC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,OAAO;YACb,YAAY,EACV,+BAA+B,CAAC,gCAAgC;SACnE,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,WAAW,CACf,OAA2B;QAE3B,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,CAA2B,CAAC;QAC1E,MAAM,YAAY,GAAG,MAAM,uBAAA,IAAI,sEAAW,MAAf,IAAI,EAAY;YACzC,UAAU;YACV,WAAW;YACX,UAAU,EAAE,aAAa;YACzB,aAAa,EAAE,OAAO;YACtB,IAAI,EAAE,cAAc;YACpB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,OAAO;YACb,YAAY,EAAE,+BAA+B,CAAC,mBAAmB;SAClE,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,YAAY,EAAE,oCAAoC,CAAC,CAAC;IACpE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,CAA2B,CAAC;QAC1E,MAAM,YAAY,GAAG,MAAM,uBAAA,IAAI,sEAAW,MAAf,IAAI,EAAY;YACzC,UAAU;YACV,WAAW;YACX,UAAU,EAAE,YAAY;YACxB,aAAa,EAAE,IAAI;YACnB,IAAI,EAAE,SAAS;YACf,YAAY,EAAE,+BAA+B,CAAC,kBAAkB;SACjE,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;IACrD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,mBAAmB;QACvB,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,CAA2B,CAAC;QAC1E,MAAM,YAAY,GAAG,MAAM,uBAAA,IAAI,sEAAW,MAAf,IAAI,EAAY;YACzC,UAAU;YACV,WAAW;YACX,UAAU,EAAE,qBAAqB;YACjC,aAAa,EAAE,IAAI;YACnB,IAAI,EAAE,gBAAgB;YACtB,YAAY,EAAE,+BAA+B,CAAC,2BAA2B;SAC1E,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,YAAY,EAAE,2BAA2B,CAAC,CAAC;IAC3D,CAAC;CAwIF;8NAtIC,KAAK,yCAAY,EACf,UAAU,EACV,WAAW,EACX,UAAU,EACV,aAAa,EACb,IAAI,EACJ,MAAM,GAAG,KAAK,EACd,IAAI,EACJ,WAAW,EACX,YAAY,GAWb;IACC,MAAM,GAAG,GAAG,uBAAA,IAAI,kFAAuB,MAA3B,IAAI,EAAwB,IAAI,CAAC,CAAC;IAE9C,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YACnD,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC;YAC3B,QAAQ,EAAE;gBACR,GAAG,IAAI,CAAC,IAAI,IAAI,UAAU,EAAE;gBAC5B,UAAU;gBACV,aAAqB;aACtB;YACD,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,MAAM,QAAQ,GAAG,MAAM,uBAAA,IAAI,kCAAO,MAAX,IAAI,EAAQ,GAAG,CAAC,QAAQ,EAAE,EAAE;oBACjD,MAAM;oBACN,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,GAAG,uBAAA,IAAI,4EAAiB,MAArB,IAAI,EAAkB,WAAW,CAAC;qBACtC;oBACD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;iBAC9C,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,QAAQ,GAAG,MAAM,gCAAgC,CAAC,QAAQ,CAAC,CAAC;oBAClE,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACzD,CAAC;gBAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;YACzB,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAEzB,MAAM,mBAAmB,GAAG,GAAG,YAAY,UAAU,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC;QACvE,MAAM,cAAc,GAClB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;QAC3D,uBAAA,IAAI,6CAAkB,EAAE,KAAxB,IAAI,EACF,iBAAiB,CAAC,mBAAmB,EAAE,cAAc,CAAC,CACvD,CAAC;QAEF,IAAI,KAAK,YAAY,wBAAwB,EAAE,CAAC;YAC9C,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,IAAI,wBAAwB,CAChC,2BAA2B,mBAAmB,EAAE,EAChD;YACE,KAAK,EAAE,cAAc;SACtB,CACF,CAAC;IACJ,CAAC;AACH,CAAC,iDAED,KAAK;IAIH,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAC3C,yCAAyC,CAC1C,CAAC;QACF,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAExE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK;YACpB,CAAC,CAAC,KAAK,CAAC,OAAO;YACf,CAAC,CAAC,iDAAiD,CAAC;QAExD,uBAAA,IAAI,6CAAkB,EAAE,KAAxB,IAAI,EACF,iBAAiB,CACf,uCAAuC,YAAY,EAAE,EACrD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CACzD,CACF,CAAC;QAEF,MAAM,IAAI,wBAAwB,CAChC,uCAAuC,YAAY,EAAE,EACrD;YACE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC;SAChE,CACF,CAAC;IACJ,CAAC;AACH,CAAC,uFAEgB,WAAmB;IAClC,OAAO,EAAE,aAAa,EAAE,UAAU,WAAW,EAAE,EAAE,CAAC;AACpD,CAAC,mGAEsB,IAAY;IACjC,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,gBAAgB,CAAC,uBAAA,IAAI,gCAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK;YACpB,CAAC,CAAC,KAAK,CAAC,OAAO;YACf,CAAC,CAAC,iDAAiD,CAAC;QACxD,uBAAA,IAAI,6CAAkB,EAAE,KAAxB,IAAI,EACF,iBAAiB,CACf,uCAAuC,YAAY,EAAE,EACrD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CACzD,CACF,CAAC;QAEF,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC","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.SUBSCRIPTION_URL = exports.subscriptionServiceName = 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;
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