@metamask/profile-sync-controller 0.9.6 → 0.9.8

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 (50) hide show
  1. package/CHANGELOG.md +23 -1
  2. package/dist/controllers/user-storage/UserStorageController.cjs +32 -10
  3. package/dist/controllers/user-storage/UserStorageController.cjs.map +1 -1
  4. package/dist/controllers/user-storage/UserStorageController.d.cts +8 -0
  5. package/dist/controllers/user-storage/UserStorageController.d.cts.map +1 -1
  6. package/dist/controllers/user-storage/UserStorageController.d.mts +8 -0
  7. package/dist/controllers/user-storage/UserStorageController.d.mts.map +1 -1
  8. package/dist/controllers/user-storage/UserStorageController.mjs +33 -11
  9. package/dist/controllers/user-storage/UserStorageController.mjs.map +1 -1
  10. package/dist/controllers/user-storage/__fixtures__/mockResponses.cjs +9 -1
  11. package/dist/controllers/user-storage/__fixtures__/mockResponses.cjs.map +1 -1
  12. package/dist/controllers/user-storage/__fixtures__/mockResponses.d.cts +5 -0
  13. package/dist/controllers/user-storage/__fixtures__/mockResponses.d.cts.map +1 -1
  14. package/dist/controllers/user-storage/__fixtures__/mockResponses.d.mts +5 -0
  15. package/dist/controllers/user-storage/__fixtures__/mockResponses.d.mts.map +1 -1
  16. package/dist/controllers/user-storage/__fixtures__/mockResponses.mjs +7 -0
  17. package/dist/controllers/user-storage/__fixtures__/mockResponses.mjs.map +1 -1
  18. package/dist/controllers/user-storage/__fixtures__/mockServices.cjs +10 -1
  19. package/dist/controllers/user-storage/__fixtures__/mockServices.cjs.map +1 -1
  20. package/dist/controllers/user-storage/__fixtures__/mockServices.d.cts +1 -0
  21. package/dist/controllers/user-storage/__fixtures__/mockServices.d.cts.map +1 -1
  22. package/dist/controllers/user-storage/__fixtures__/mockServices.d.mts +1 -0
  23. package/dist/controllers/user-storage/__fixtures__/mockServices.d.mts.map +1 -1
  24. package/dist/controllers/user-storage/__fixtures__/mockServices.mjs +9 -1
  25. package/dist/controllers/user-storage/__fixtures__/mockServices.mjs.map +1 -1
  26. package/dist/controllers/user-storage/services.cjs +26 -3
  27. package/dist/controllers/user-storage/services.cjs.map +1 -1
  28. package/dist/controllers/user-storage/services.d.cts +6 -0
  29. package/dist/controllers/user-storage/services.d.cts.map +1 -1
  30. package/dist/controllers/user-storage/services.d.mts +6 -0
  31. package/dist/controllers/user-storage/services.d.mts.map +1 -1
  32. package/dist/controllers/user-storage/services.mjs +24 -2
  33. package/dist/controllers/user-storage/services.mjs.map +1 -1
  34. package/dist/sdk/__fixtures__/mock-userstorage.cjs +10 -1
  35. package/dist/sdk/__fixtures__/mock-userstorage.cjs.map +1 -1
  36. package/dist/sdk/__fixtures__/mock-userstorage.d.cts +1 -0
  37. package/dist/sdk/__fixtures__/mock-userstorage.d.cts.map +1 -1
  38. package/dist/sdk/__fixtures__/mock-userstorage.d.mts +1 -0
  39. package/dist/sdk/__fixtures__/mock-userstorage.d.mts.map +1 -1
  40. package/dist/sdk/__fixtures__/mock-userstorage.mjs +8 -0
  41. package/dist/sdk/__fixtures__/mock-userstorage.mjs.map +1 -1
  42. package/dist/sdk/user-storage.cjs +33 -1
  43. package/dist/sdk/user-storage.cjs.map +1 -1
  44. package/dist/sdk/user-storage.d.cts +1 -0
  45. package/dist/sdk/user-storage.d.cts.map +1 -1
  46. package/dist/sdk/user-storage.d.mts +1 -0
  47. package/dist/sdk/user-storage.d.mts.map +1 -1
  48. package/dist/sdk/user-storage.mjs +33 -1
  49. package/dist/sdk/user-storage.mjs.map +1 -1
  50. package/package.json +6 -5
package/CHANGELOG.md CHANGED
@@ -7,6 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.9.8]
11
+
12
+ ### Changed
13
+
14
+ - **BREAKING:** Bump `@metamask/network-controller` peer dependency to `^22.0.0` ([#4841](https://github.com/MetaMask/core/pull/4841))
15
+
16
+ ### Fixed
17
+
18
+ - prevent multiple parallel account syncs by checking the value of `isAccountSyncingInProgress` before dispatching account syncing ([#4901](https://github.com/MetaMask/core/pull/4901))
19
+
20
+ ## [0.9.7]
21
+
22
+ ### Added
23
+
24
+ - add support for DELETE ONE endpoint ([#4776](https://github.com/MetaMask/core/pull/4776))
25
+
26
+ ### Fixed
27
+
28
+ - imported accounts won't be synced anymore by account syncing ([#4777](https://github.com/MetaMask/core/pull/4777))
29
+
10
30
  ## [0.9.6]
11
31
 
12
32
  ### Added
@@ -268,7 +288,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
268
288
 
269
289
  - Initial release
270
290
 
271
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/profile-sync-controller@0.9.6...HEAD
291
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/profile-sync-controller@0.9.8...HEAD
292
+ [0.9.8]: https://github.com/MetaMask/core/compare/@metamask/profile-sync-controller@0.9.7...@metamask/profile-sync-controller@0.9.8
293
+ [0.9.7]: https://github.com/MetaMask/core/compare/@metamask/profile-sync-controller@0.9.6...@metamask/profile-sync-controller@0.9.7
272
294
  [0.9.6]: https://github.com/MetaMask/core/compare/@metamask/profile-sync-controller@0.9.5...@metamask/profile-sync-controller@0.9.6
273
295
  [0.9.5]: https://github.com/MetaMask/core/compare/@metamask/profile-sync-controller@0.9.4...@metamask/profile-sync-controller@0.9.5
274
296
  [0.9.4]: https://github.com/MetaMask/core/compare/@metamask/profile-sync-controller@0.9.3...@metamask/profile-sync-controller@0.9.4
@@ -73,14 +73,22 @@ class UserStorageController extends base_controller_1.BaseController {
73
73
  });
74
74
  _UserStorageController_accounts.set(this, {
75
75
  // This is replaced with the actual value in the constructor
76
- // We will remove this once the feature will be released
77
76
  isAccountSyncingEnabled: false,
78
77
  isAccountSyncingInProgress: false,
79
- addedAccountsCount: 0,
78
+ maxNumberOfAccountsToAdd: 0,
80
79
  canSync: () => {
81
80
  try {
82
81
  __classPrivateFieldGet(this, _UserStorageController_instances, "m", _UserStorageController_assertProfileSyncingEnabled).call(this);
83
- return (__classPrivateFieldGet(this, _UserStorageController_accounts, "f").isAccountSyncingEnabled && __classPrivateFieldGet(this, _UserStorageController_auth, "f").isAuthEnabled());
82
+ if (__classPrivateFieldGet(this, _UserStorageController_accounts, "f").isAccountSyncingInProgress) {
83
+ return false;
84
+ }
85
+ if (!__classPrivateFieldGet(this, _UserStorageController_accounts, "f").isAccountSyncingEnabled) {
86
+ return false;
87
+ }
88
+ if (!__classPrivateFieldGet(this, _UserStorageController_auth, "f").isAuthEnabled()) {
89
+ return false;
90
+ }
91
+ return true;
84
92
  }
85
93
  catch {
86
94
  return false;
@@ -90,8 +98,7 @@ class UserStorageController extends base_controller_1.BaseController {
90
98
  this.messagingSystem.subscribe('AccountsController:accountAdded',
91
99
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
92
100
  async (account) => {
93
- if (__classPrivateFieldGet(this, _UserStorageController_accounts, "f").isAccountSyncingInProgress) {
94
- __classPrivateFieldGet(this, _UserStorageController_accounts, "f").addedAccountsCount += 1;
101
+ if (!__classPrivateFieldGet(this, _UserStorageController_accounts, "f").canSync()) {
95
102
  return;
96
103
  }
97
104
  await this.saveInternalAccountToUserStorage(account);
@@ -99,15 +106,14 @@ class UserStorageController extends base_controller_1.BaseController {
99
106
  this.messagingSystem.subscribe('AccountsController:accountRenamed',
100
107
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
101
108
  async (account) => {
102
- if (__classPrivateFieldGet(this, _UserStorageController_accounts, "f").isAccountSyncingInProgress) {
109
+ if (!__classPrivateFieldGet(this, _UserStorageController_accounts, "f").canSync()) {
103
110
  return;
104
111
  }
105
112
  await this.saveInternalAccountToUserStorage(account);
106
113
  });
107
114
  },
108
115
  doesInternalAccountHaveCorrectKeyringType: (account) => {
109
- return (account.metadata.keyring.type === keyring_controller_1.KeyringTypes.hd ||
110
- account.metadata.keyring.type === keyring_controller_1.KeyringTypes.simple);
116
+ return account.metadata.keyring.type === keyring_controller_1.KeyringTypes.hd;
111
117
  },
112
118
  getInternalAccountsList: async () => {
113
119
  // eslint-disable-next-line @typescript-eslint/await-thenable
@@ -162,6 +168,8 @@ class UserStorageController extends base_controller_1.BaseController {
162
168
  _UserStorageController__snapSignMessageCache.set(this, {});
163
169
  __classPrivateFieldSet(this, _UserStorageController_config, config, "f");
164
170
  __classPrivateFieldGet(this, _UserStorageController_accounts, "f").isAccountSyncingEnabled = Boolean(env?.isAccountSyncingEnabled);
171
+ __classPrivateFieldGet(this, _UserStorageController_accounts, "f").maxNumberOfAccountsToAdd =
172
+ config?.accountSyncing?.maxNumberOfAccountsToAdd ?? 100;
165
173
  this.getMetaMetricsState = getMetaMetricsState;
166
174
  __classPrivateFieldGet(this, _UserStorageController_keyringController, "f").setupLockedStateSubscriptions();
167
175
  __classPrivateFieldGet(this, _UserStorageController_instances, "m", _UserStorageController_registerMessageHandlers).call(this);
@@ -303,6 +311,21 @@ class UserStorageController extends base_controller_1.BaseController {
303
311
  nativeScryptCrypto: __classPrivateFieldGet(this, _UserStorageController_nativeScryptCrypto, "f"),
304
312
  });
305
313
  }
314
+ /**
315
+ * Allows deletion of user data. Developers can extend the entry path and entry name through the `schema.ts` file.
316
+ *
317
+ * @param path - string in the form of `${feature}.${key}` that matches schema
318
+ * @returns nothing. NOTE that an error is thrown if fails to delete data.
319
+ */
320
+ async performDeleteStorage(path) {
321
+ __classPrivateFieldGet(this, _UserStorageController_instances, "m", _UserStorageController_assertProfileSyncingEnabled).call(this);
322
+ const { bearerToken, storageKey } = await __classPrivateFieldGet(this, _UserStorageController_instances, "m", _UserStorageController_getStorageKeyAndBearerToken).call(this);
323
+ await (0, services_1.deleteUserStorage)({
324
+ path,
325
+ bearerToken,
326
+ storageKey,
327
+ });
328
+ }
306
329
  /**
307
330
  * Allows deletion of all user data entries for a specific feature.
308
331
  * Developers can extend the entry path through the `schema.ts` file.
@@ -340,7 +363,6 @@ class UserStorageController extends base_controller_1.BaseController {
340
363
  }
341
364
  try {
342
365
  __classPrivateFieldGet(this, _UserStorageController_accounts, "f").isAccountSyncingInProgress = true;
343
- __classPrivateFieldGet(this, _UserStorageController_accounts, "f").addedAccountsCount = 0;
344
366
  const profileId = await __classPrivateFieldGet(this, _UserStorageController_auth, "f").getProfileId();
345
367
  const userStorageAccountsList = await __classPrivateFieldGet(this, _UserStorageController_accounts, "f").getUserStorageAccountsList();
346
368
  if (!userStorageAccountsList || !userStorageAccountsList.length) {
@@ -359,7 +381,7 @@ class UserStorageController extends base_controller_1.BaseController {
359
381
  // We don't want to remove existing accounts for a user
360
382
  // so we only add new accounts if the user has more accounts than the internal accounts list
361
383
  if (!hasMoreInternalAccountsThanUserStorageAccounts) {
362
- const numberOfAccountsToAdd = userStorageAccountsList.length - internalAccountsList.length;
384
+ const numberOfAccountsToAdd = Math.min(userStorageAccountsList.length, __classPrivateFieldGet(this, _UserStorageController_accounts, "f").maxNumberOfAccountsToAdd) - internalAccountsList.length;
363
385
  // Create new accounts to match the user storage accounts list
364
386
  for (let i = 0; i < numberOfAccountsToAdd; i++) {
365
387
  await this.messagingSystem.call('KeyringController:addNewAccount');
@@ -1 +1 @@
1
- {"version":3,"file":"UserStorageController.cjs","sourceRoot":"","sources":["../../../src/controllers/user-storage/UserStorageController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccountsControllerListAccountsAction,\n AccountsControllerUpdateAccountMetadataAction,\n AccountsControllerAccountRenamedEvent,\n AccountsControllerAccountAddedEvent,\n} from '@metamask/accounts-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n RestrictedControllerMessenger,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport { type InternalAccount, isEvmAccountType } from '@metamask/keyring-api';\nimport {\n type KeyringControllerGetStateAction,\n type KeyringControllerLockEvent,\n type KeyringControllerUnlockEvent,\n type KeyringControllerAddNewAccountAction,\n KeyringTypes,\n} from '@metamask/keyring-controller';\nimport type { NetworkConfiguration } from '@metamask/network-controller';\nimport type { HandleSnapRequest } from '@metamask/snaps-controllers';\n\nimport { createSHA256Hash } from '../../shared/encryption';\nimport type {\n UserStoragePathWithFeatureAndKey,\n UserStoragePathWithFeatureOnly,\n UserStoragePathWithKeyOnly,\n} from '../../shared/storage-schema';\nimport type { NativeScrypt } from '../../shared/types/encryption';\nimport { createSnapSignMessageRequest } from '../authentication/auth-snap-requests';\nimport type {\n AuthenticationControllerGetBearerToken,\n AuthenticationControllerGetSessionProfile,\n AuthenticationControllerIsSignedIn,\n AuthenticationControllerPerformSignIn,\n AuthenticationControllerPerformSignOut,\n} from '../authentication/AuthenticationController';\nimport type { UserStorageAccount } from './accounts/user-storage';\nimport {\n isNameDefaultAccountName,\n mapInternalAccountToUserStorageAccount,\n} from './accounts/user-storage';\nimport { startNetworkSyncing } from './network-syncing/controller-integration';\nimport {\n batchUpsertUserStorage,\n deleteUserStorageAllFeatureEntries,\n getUserStorage,\n getUserStorageAllFeatureEntries,\n upsertUserStorage,\n} from './services';\n\n// TODO: add external NetworkController event\n// Need to listen for when a network gets added\ntype NetworkControllerNetworkAddedEvent = {\n type: 'NetworkController:networkAdded';\n payload: [networkConfiguration: NetworkConfiguration];\n};\n\n// TODO: add external NetworkController event\n// Need to listen for when a network is updated, or the default rpc/block explorer changes\ntype NetworkControllerNetworkChangedEvent = {\n type: 'NetworkController:networkChanged';\n payload: [networkConfiguration: NetworkConfiguration];\n};\n\n// TODO: add external NetworkController event\n// Need to listen for when a network gets deleted\ntype NetworkControllerNetworkDeletedEvent = {\n type: 'NetworkController:networkDeleted';\n payload: [networkConfiguration: NetworkConfiguration];\n};\n\n// TODO: fix external dependencies\nexport declare type NotificationServicesControllerDisableNotificationServices =\n {\n type: `NotificationServicesController:disableNotificationServices`;\n handler: () => Promise<void>;\n };\n\nexport declare type NotificationServicesControllerSelectIsNotificationServicesEnabled =\n {\n type: `NotificationServicesController:selectIsNotificationServicesEnabled`;\n handler: () => boolean;\n };\n\nconst controllerName = 'UserStorageController';\n\n// State\nexport type UserStorageControllerState = {\n /**\n * Condition used by UI and to determine if we can use some of the User Storage methods.\n */\n isProfileSyncingEnabled: boolean | null;\n /**\n * Loading state for the profile syncing update\n */\n isProfileSyncingUpdateLoading: boolean;\n};\n\nexport const defaultState: UserStorageControllerState = {\n isProfileSyncingEnabled: true,\n isProfileSyncingUpdateLoading: false,\n};\n\nconst metadata: StateMetadata<UserStorageControllerState> = {\n isProfileSyncingEnabled: {\n persist: true,\n anonymous: true,\n },\n isProfileSyncingUpdateLoading: {\n persist: false,\n anonymous: false,\n },\n};\n\ntype ControllerConfig = {\n accountSyncing?: {\n /**\n * Callback that fires when account sync adds an account.\n * This is used for analytics.\n */\n onAccountAdded?: (profileId: string) => void;\n\n /**\n * Callback that fires when account sync updates the name of an account.\n * This is used for analytics.\n */\n onAccountNameUpdated?: (profileId: string) => void;\n };\n};\n\n// Messenger Actions\ntype CreateActionsObj<Controller extends keyof UserStorageController> = {\n [K in Controller]: {\n type: `${typeof controllerName}:${K}`;\n handler: UserStorageController[K];\n };\n};\ntype ActionsObj = CreateActionsObj<\n | 'performGetStorage'\n | 'performGetStorageAllFeatureEntries'\n | 'performSetStorage'\n | 'getStorageKey'\n | 'enableProfileSyncing'\n | 'disableProfileSyncing'\n | 'syncInternalAccountsWithUserStorage'\n | 'saveInternalAccountToUserStorage'\n>;\nexport type UserStorageControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n UserStorageControllerState\n>;\nexport type Actions =\n | ActionsObj[keyof ActionsObj]\n | UserStorageControllerGetStateAction;\nexport type UserStorageControllerPerformGetStorage =\n ActionsObj['performGetStorage'];\nexport type UserStorageControllerPerformGetStorageAllFeatureEntries =\n ActionsObj['performGetStorageAllFeatureEntries'];\nexport type UserStorageControllerPerformSetStorage =\n ActionsObj['performSetStorage'];\nexport type UserStorageControllerGetStorageKey = ActionsObj['getStorageKey'];\nexport type UserStorageControllerEnableProfileSyncing =\n ActionsObj['enableProfileSyncing'];\nexport type UserStorageControllerDisableProfileSyncing =\n ActionsObj['disableProfileSyncing'];\nexport type UserStorageControllerSyncInternalAccountsWithUserStorage =\n ActionsObj['syncInternalAccountsWithUserStorage'];\nexport type UserStorageControllerSaveInternalAccountToUserStorage =\n ActionsObj['saveInternalAccountToUserStorage'];\n\nexport type AllowedActions =\n // Keyring Requests\n | KeyringControllerGetStateAction\n // Snap Requests\n | HandleSnapRequest\n // Auth Requests\n | AuthenticationControllerGetBearerToken\n | AuthenticationControllerGetSessionProfile\n | AuthenticationControllerPerformSignIn\n | AuthenticationControllerIsSignedIn\n | AuthenticationControllerPerformSignOut\n // Metamask Notifications\n | NotificationServicesControllerDisableNotificationServices\n | NotificationServicesControllerSelectIsNotificationServicesEnabled\n // Account syncing\n | AccountsControllerListAccountsAction\n | AccountsControllerUpdateAccountMetadataAction\n | KeyringControllerAddNewAccountAction;\n\n// Messenger events\nexport type UserStorageControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n UserStorageControllerState\n>;\nexport type UserStorageControllerAccountSyncingInProgress = {\n type: `${typeof controllerName}:accountSyncingInProgress`;\n payload: [boolean];\n};\nexport type UserStorageControllerAccountSyncingComplete = {\n type: `${typeof controllerName}:accountSyncingComplete`;\n payload: [boolean];\n};\nexport type Events =\n | UserStorageControllerStateChangeEvent\n | UserStorageControllerAccountSyncingInProgress\n | UserStorageControllerAccountSyncingComplete;\n\nexport type AllowedEvents =\n | UserStorageControllerStateChangeEvent\n | UserStorageControllerAccountSyncingInProgress\n | UserStorageControllerAccountSyncingComplete\n | KeyringControllerLockEvent\n | KeyringControllerUnlockEvent\n // Account Syncing Events\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRenamedEvent\n // Network Syncing Events\n | NetworkControllerNetworkAddedEvent\n | NetworkControllerNetworkChangedEvent\n | NetworkControllerNetworkDeletedEvent;\n\n// Messenger\nexport type UserStorageControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n Actions | AllowedActions,\n Events | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\n/**\n * Reusable controller that allows any team to store synchronized data for a given user.\n * These can be settings shared cross MetaMask clients, or data we want to persist when uninstalling/reinstalling.\n *\n * NOTE:\n * - data stored on UserStorage is FULLY encrypted, with the only keys stored/managed on the client.\n * - No one can access this data unless they are have the SRP and are able to run the signing snap.\n */\nexport default class UserStorageController extends BaseController<\n typeof controllerName,\n UserStorageControllerState,\n UserStorageControllerMessenger\n> {\n #auth = {\n getBearerToken: async () => {\n return await this.messagingSystem.call(\n 'AuthenticationController:getBearerToken',\n );\n },\n getProfileId: async () => {\n const sessionProfile = await this.messagingSystem.call(\n 'AuthenticationController:getSessionProfile',\n );\n return sessionProfile?.profileId;\n },\n isAuthEnabled: () => {\n return this.messagingSystem.call('AuthenticationController:isSignedIn');\n },\n signIn: async () => {\n return await this.messagingSystem.call(\n 'AuthenticationController:performSignIn',\n );\n },\n signOut: async () => {\n return this.messagingSystem.call(\n 'AuthenticationController:performSignOut',\n );\n },\n };\n\n #accounts = {\n // This is replaced with the actual value in the constructor\n // We will remove this once the feature will be released\n isAccountSyncingEnabled: false,\n isAccountSyncingInProgress: false,\n addedAccountsCount: 0,\n canSync: () => {\n try {\n this.#assertProfileSyncingEnabled();\n\n return (\n this.#accounts.isAccountSyncingEnabled && this.#auth.isAuthEnabled()\n );\n } catch {\n return false;\n }\n },\n setupAccountSyncingSubscriptions: () => {\n this.messagingSystem.subscribe(\n 'AccountsController:accountAdded',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n async (account) => {\n if (this.#accounts.isAccountSyncingInProgress) {\n this.#accounts.addedAccountsCount += 1;\n return;\n }\n\n await this.saveInternalAccountToUserStorage(account);\n },\n );\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountRenamed',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n async (account) => {\n if (this.#accounts.isAccountSyncingInProgress) {\n return;\n }\n await this.saveInternalAccountToUserStorage(account);\n },\n );\n },\n doesInternalAccountHaveCorrectKeyringType: (account: InternalAccount) => {\n return (\n account.metadata.keyring.type === KeyringTypes.hd ||\n account.metadata.keyring.type === KeyringTypes.simple\n );\n },\n getInternalAccountsList: async (): Promise<InternalAccount[]> => {\n // eslint-disable-next-line @typescript-eslint/await-thenable\n const internalAccountsList = await this.messagingSystem.call(\n 'AccountsController:listAccounts',\n );\n\n return internalAccountsList?.filter(\n this.#accounts.doesInternalAccountHaveCorrectKeyringType,\n );\n },\n getUserStorageAccountsList: async (): Promise<\n UserStorageAccount[] | null\n > => {\n const rawAccountsListResponse =\n await this.performGetStorageAllFeatureEntries('accounts');\n\n return (\n rawAccountsListResponse?.map((rawAccount) => JSON.parse(rawAccount)) ??\n null\n );\n },\n saveInternalAccountToUserStorage: async (\n internalAccount: InternalAccount,\n ) => {\n // Map the internal account to the user storage account schema\n const mappedAccount =\n mapInternalAccountToUserStorageAccount(internalAccount);\n\n await this.performSetStorage(\n `accounts.${internalAccount.address}`,\n JSON.stringify(mappedAccount),\n );\n },\n saveInternalAccountsListToUserStorage: async () => {\n const internalAccountsList =\n await this.#accounts.getInternalAccountsList();\n\n if (!internalAccountsList) {\n return;\n }\n\n const internalAccountsListFormattedForUserStorage =\n internalAccountsList.map(mapInternalAccountToUserStorageAccount);\n\n await this.performBatchSetStorage(\n 'accounts',\n internalAccountsListFormattedForUserStorage.map((account) => [\n account.a,\n JSON.stringify(account),\n ]),\n );\n },\n };\n\n #config?: ControllerConfig;\n\n #notificationServices = {\n disableNotificationServices: async () => {\n return await this.messagingSystem.call(\n 'NotificationServicesController:disableNotificationServices',\n );\n },\n selectIsNotificationServicesEnabled: async () => {\n return this.messagingSystem.call(\n 'NotificationServicesController:selectIsNotificationServicesEnabled',\n );\n },\n };\n\n #isUnlocked = false;\n\n #keyringController = {\n setupLockedStateSubscriptions: () => {\n const { isUnlocked } = this.messagingSystem.call(\n 'KeyringController:getState',\n );\n this.#isUnlocked = isUnlocked;\n\n this.messagingSystem.subscribe('KeyringController:unlock', () => {\n this.#isUnlocked = true;\n });\n\n this.messagingSystem.subscribe('KeyringController:lock', () => {\n this.#isUnlocked = false;\n });\n },\n };\n\n #nativeScryptCrypto: NativeScrypt | undefined = undefined;\n\n getMetaMetricsState: () => boolean;\n\n constructor({\n messenger,\n state,\n env,\n config,\n getMetaMetricsState,\n nativeScryptCrypto,\n }: {\n messenger: UserStorageControllerMessenger;\n state?: UserStorageControllerState;\n config?: ControllerConfig;\n env?: {\n isAccountSyncingEnabled?: boolean;\n isNetworkSyncingEnabled?: boolean;\n };\n getMetaMetricsState: () => boolean;\n nativeScryptCrypto?: NativeScrypt;\n }) {\n super({\n messenger,\n metadata,\n name: controllerName,\n state: { ...defaultState, ...state },\n });\n\n this.#config = config;\n\n this.#accounts.isAccountSyncingEnabled = Boolean(\n env?.isAccountSyncingEnabled,\n );\n\n this.getMetaMetricsState = getMetaMetricsState;\n this.#keyringController.setupLockedStateSubscriptions();\n this.#registerMessageHandlers();\n this.#nativeScryptCrypto = nativeScryptCrypto;\n this.#accounts.setupAccountSyncingSubscriptions();\n\n // Network Syncing\n if (env?.isNetworkSyncingEnabled) {\n startNetworkSyncing({\n messenger,\n getStorageConfig: async () => {\n const { storageKey, bearerToken } =\n await this.#getStorageKeyAndBearerToken();\n return {\n storageKey,\n bearerToken,\n nativeScryptCrypto: this.#nativeScryptCrypto,\n };\n },\n });\n }\n }\n\n /**\n * Constructor helper for registering this controller's messaging system\n * actions.\n */\n #registerMessageHandlers(): void {\n this.messagingSystem.registerActionHandler(\n 'UserStorageController:performGetStorage',\n this.performGetStorage.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'UserStorageController:performGetStorageAllFeatureEntries',\n this.performGetStorageAllFeatureEntries.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'UserStorageController:performSetStorage',\n this.performSetStorage.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'UserStorageController:getStorageKey',\n this.getStorageKey.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'UserStorageController:enableProfileSyncing',\n this.enableProfileSyncing.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'UserStorageController:disableProfileSyncing',\n this.disableProfileSyncing.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'UserStorageController:syncInternalAccountsWithUserStorage',\n this.syncInternalAccountsWithUserStorage.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'UserStorageController:saveInternalAccountToUserStorage',\n this.saveInternalAccountToUserStorage.bind(this),\n );\n }\n\n public async enableProfileSyncing(): Promise<void> {\n try {\n this.#setIsProfileSyncingUpdateLoading(true);\n\n const authEnabled = this.#auth.isAuthEnabled();\n if (!authEnabled) {\n await this.#auth.signIn();\n }\n\n this.update((state) => {\n state.isProfileSyncingEnabled = true;\n });\n\n this.#setIsProfileSyncingUpdateLoading(false);\n } catch (e) {\n this.#setIsProfileSyncingUpdateLoading(false);\n const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);\n throw new Error(\n `${controllerName} - failed to enable profile syncing - ${errorMessage}`,\n );\n }\n }\n\n public async setIsProfileSyncingEnabled(\n isProfileSyncingEnabled: boolean,\n ): Promise<void> {\n this.update((state) => {\n state.isProfileSyncingEnabled = isProfileSyncingEnabled;\n });\n }\n\n public async disableProfileSyncing(): Promise<void> {\n const isAlreadyDisabled = !this.state.isProfileSyncingEnabled;\n if (isAlreadyDisabled) {\n return;\n }\n\n try {\n this.#setIsProfileSyncingUpdateLoading(true);\n\n const isNotificationServicesEnabled =\n await this.#notificationServices.selectIsNotificationServicesEnabled();\n\n if (isNotificationServicesEnabled) {\n await this.#notificationServices.disableNotificationServices();\n }\n\n const isMetaMetricsParticipation = this.getMetaMetricsState();\n\n if (!isMetaMetricsParticipation) {\n await this.#auth.signOut();\n }\n\n this.#setIsProfileSyncingUpdateLoading(false);\n\n this.update((state) => {\n state.isProfileSyncingEnabled = false;\n });\n } catch (e) {\n this.#setIsProfileSyncingUpdateLoading(false);\n const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);\n throw new Error(\n `${controllerName} - failed to disable profile syncing - ${errorMessage}`,\n );\n }\n }\n\n /**\n * Allows retrieval of stored data. Data stored is string formatted.\n * Developers can extend the entry path and entry name through the `schema.ts` file.\n *\n * @param path - string in the form of `${feature}.${key}` that matches schema\n * @returns the decrypted string contents found from user storage (or null if not found)\n */\n public async performGetStorage(\n path: UserStoragePathWithFeatureAndKey,\n ): Promise<string | null> {\n this.#assertProfileSyncingEnabled();\n\n const { bearerToken, storageKey } =\n await this.#getStorageKeyAndBearerToken();\n\n const result = await getUserStorage({\n path,\n bearerToken,\n storageKey,\n nativeScryptCrypto: this.#nativeScryptCrypto,\n });\n\n return result;\n }\n\n /**\n * Allows retrieval of all stored data for a specific feature. Data stored is formatted as an array of strings.\n * Developers can extend the entry path through the `schema.ts` file.\n *\n * @param path - string in the form of `${feature}` that matches schema\n * @returns the array of decrypted string contents found from user storage (or null if not found)\n */\n public async performGetStorageAllFeatureEntries(\n path: UserStoragePathWithFeatureOnly,\n ): Promise<string[] | null> {\n this.#assertProfileSyncingEnabled();\n\n const { bearerToken, storageKey } =\n await this.#getStorageKeyAndBearerToken();\n\n const result = await getUserStorageAllFeatureEntries({\n path,\n bearerToken,\n storageKey,\n nativeScryptCrypto: this.#nativeScryptCrypto,\n });\n\n return result;\n }\n\n /**\n * Allows storage of user data. Data stored must be string formatted.\n * Developers can extend the entry path and entry name through the `schema.ts` file.\n *\n * @param path - string in the form of `${feature}.${key}` that matches schema\n * @param value - The string data you want to store.\n * @returns nothing. NOTE that an error is thrown if fails to store data.\n */\n public async performSetStorage(\n path: UserStoragePathWithFeatureAndKey,\n value: string,\n ): Promise<void> {\n this.#assertProfileSyncingEnabled();\n\n const { bearerToken, storageKey } =\n await this.#getStorageKeyAndBearerToken();\n\n await upsertUserStorage(value, {\n path,\n bearerToken,\n storageKey,\n nativeScryptCrypto: this.#nativeScryptCrypto,\n });\n }\n\n /**\n * Allows storage of multiple user data entries for one specific feature. Data stored must be string formatted.\n * Developers can extend the entry path through the `schema.ts` file.\n *\n * @param path - string in the form of `${feature}` that matches schema\n * @param values - data to store, in the form of an array of `[entryKey, entryValue]` pairs\n * @returns nothing. NOTE that an error is thrown if fails to store data.\n */\n public async performBatchSetStorage(\n path: UserStoragePathWithFeatureOnly,\n values: [UserStoragePathWithKeyOnly, string][],\n ): Promise<void> {\n this.#assertProfileSyncingEnabled();\n\n const { bearerToken, storageKey } =\n await this.#getStorageKeyAndBearerToken();\n\n await batchUpsertUserStorage(values, {\n path,\n bearerToken,\n storageKey,\n nativeScryptCrypto: this.#nativeScryptCrypto,\n });\n }\n\n /**\n * Allows deletion of all user data entries for a specific feature.\n * Developers can extend the entry path through the `schema.ts` file.\n *\n * @param path - string in the form of `${feature}` that matches schema\n * @returns nothing. NOTE that an error is thrown if fails to delete data.\n */\n public async performDeleteStorageAllFeatureEntries(\n path: UserStoragePathWithFeatureOnly,\n ): Promise<void> {\n this.#assertProfileSyncingEnabled();\n\n const { bearerToken, storageKey } =\n await this.#getStorageKeyAndBearerToken();\n\n await deleteUserStorageAllFeatureEntries({\n path,\n bearerToken,\n storageKey,\n });\n }\n\n /**\n * Retrieves the storage key, for internal use only!\n *\n * @returns the storage key\n */\n public async getStorageKey(): Promise<string> {\n this.#assertProfileSyncingEnabled();\n const storageKey = await this.#createStorageKey();\n return storageKey;\n }\n\n #assertProfileSyncingEnabled(): void {\n if (!this.state.isProfileSyncingEnabled) {\n throw new Error(\n `${controllerName}: Unable to call method, user is not authenticated`,\n );\n }\n }\n\n /**\n * Utility to get the bearer token and storage key\n */\n async #getStorageKeyAndBearerToken(): Promise<{\n bearerToken: string;\n storageKey: string;\n }> {\n const bearerToken = await this.#auth.getBearerToken();\n if (!bearerToken) {\n throw new Error('UserStorageController - unable to get bearer token');\n }\n const storageKey = await this.#createStorageKey();\n\n return { bearerToken, storageKey };\n }\n\n /**\n * Rather than storing the storage key, we can compute the storage key when needed.\n *\n * @returns the storage key\n */\n async #createStorageKey(): Promise<string> {\n const id: string = await this.#auth.getProfileId();\n if (!id) {\n throw new Error('UserStorageController - unable to create storage key');\n }\n\n const storageKeySignature = await this.#snapSignMessage(`metamask:${id}`);\n const storageKey = createSHA256Hash(storageKeySignature);\n return storageKey;\n }\n\n #_snapSignMessageCache: Record<`metamask:${string}`, string> = {};\n\n /**\n * Signs a specific message using an underlying auth snap.\n *\n * @param message - A specific tagged message to sign.\n * @returns A Signature created by the snap.\n */\n async #snapSignMessage(message: `metamask:${string}`): Promise<string> {\n if (this.#_snapSignMessageCache[message]) {\n return this.#_snapSignMessageCache[message];\n }\n\n if (!this.#isUnlocked) {\n throw new Error(\n '#snapSignMessage - unable to call snap, wallet is locked',\n );\n }\n\n const result = (await this.messagingSystem.call(\n 'SnapController:handleRequest',\n createSnapSignMessageRequest(message),\n )) as string;\n\n this.#_snapSignMessageCache[message] = result;\n\n return result;\n }\n\n #setIsProfileSyncingUpdateLoading(\n isProfileSyncingUpdateLoading: boolean,\n ): void {\n this.update((state) => {\n state.isProfileSyncingUpdateLoading = isProfileSyncingUpdateLoading;\n });\n }\n\n /**\n * Syncs the internal accounts list with the user storage accounts list.\n * This method is used to make sure that the internal accounts list is up-to-date with the user storage accounts list and vice-versa.\n * It will add new accounts to the internal accounts list, update/merge conflicting names and re-upload the results in some cases to the user storage.\n */\n async syncInternalAccountsWithUserStorage(): Promise<void> {\n if (!this.#accounts.canSync()) {\n return;\n }\n\n try {\n this.#accounts.isAccountSyncingInProgress = true;\n this.#accounts.addedAccountsCount = 0;\n\n const profileId = await this.#auth.getProfileId();\n\n const userStorageAccountsList =\n await this.#accounts.getUserStorageAccountsList();\n\n if (!userStorageAccountsList || !userStorageAccountsList.length) {\n await this.#accounts.saveInternalAccountsListToUserStorage();\n return;\n }\n\n // Prepare an array of internal accounts to be saved to the user storage\n const internalAccountsToBeSavedToUserStorage: InternalAccount[] = [];\n\n // Compare internal accounts list with user storage accounts list\n // First step: compare lengths\n let internalAccountsList = await this.#accounts.getInternalAccountsList();\n\n if (!internalAccountsList || !internalAccountsList.length) {\n throw new Error(`Failed to get internal accounts list`);\n }\n\n const hasMoreInternalAccountsThanUserStorageAccounts =\n internalAccountsList.length > userStorageAccountsList.length;\n\n // We don't want to remove existing accounts for a user\n // so we only add new accounts if the user has more accounts than the internal accounts list\n if (!hasMoreInternalAccountsThanUserStorageAccounts) {\n const numberOfAccountsToAdd =\n userStorageAccountsList.length - internalAccountsList.length;\n\n // Create new accounts to match the user storage accounts list\n\n for (let i = 0; i < numberOfAccountsToAdd; i++) {\n await this.messagingSystem.call('KeyringController:addNewAccount');\n\n this.#config?.accountSyncing?.onAccountAdded?.(profileId);\n }\n }\n\n // Second step: compare account names\n // Get the internal accounts list again since new accounts might have been added in the previous step\n internalAccountsList = await this.#accounts.getInternalAccountsList();\n\n for (const internalAccount of internalAccountsList) {\n const userStorageAccount = userStorageAccountsList.find(\n (account) => account.a === internalAccount.address,\n );\n\n if (!userStorageAccount) {\n internalAccountsToBeSavedToUserStorage.push(internalAccount);\n continue;\n }\n\n // One or both accounts have default names\n const isInternalAccountNameDefault = isNameDefaultAccountName(\n internalAccount.metadata.name,\n );\n const isUserStorageAccountNameDefault = isNameDefaultAccountName(\n userStorageAccount.n,\n );\n\n // Internal account has default name\n if (isInternalAccountNameDefault) {\n if (!isUserStorageAccountNameDefault) {\n this.messagingSystem.call(\n 'AccountsController:updateAccountMetadata',\n internalAccount.id,\n {\n name: userStorageAccount.n,\n },\n );\n\n this.#config?.accountSyncing?.onAccountNameUpdated?.(profileId);\n }\n continue;\n }\n\n // Internal account has custom name but user storage account has default name\n if (isUserStorageAccountNameDefault) {\n internalAccountsToBeSavedToUserStorage.push(internalAccount);\n continue;\n }\n\n // Both accounts have custom names\n\n // User storage account has a nameLastUpdatedAt timestamp\n // Note: not storing the undefined checks in constants to act as a type guard\n if (userStorageAccount.nlu !== undefined) {\n if (internalAccount.metadata.nameLastUpdatedAt !== undefined) {\n const isInternalAccountNameNewer =\n internalAccount.metadata.nameLastUpdatedAt >\n userStorageAccount.nlu;\n\n if (isInternalAccountNameNewer) {\n internalAccountsToBeSavedToUserStorage.push(internalAccount);\n continue;\n }\n }\n\n this.messagingSystem.call(\n 'AccountsController:updateAccountMetadata',\n internalAccount.id,\n {\n name: userStorageAccount.n,\n nameLastUpdatedAt: userStorageAccount.nlu,\n },\n );\n\n const areInternalAndUserStorageAccountNamesEqual =\n internalAccount.metadata.name === userStorageAccount.n;\n\n if (!areInternalAndUserStorageAccountNamesEqual) {\n this.#config?.accountSyncing?.onAccountNameUpdated?.(profileId);\n }\n\n continue;\n } else if (internalAccount.metadata.nameLastUpdatedAt !== undefined) {\n internalAccountsToBeSavedToUserStorage.push(internalAccount);\n continue;\n }\n }\n\n // Save the internal accounts list to the user storage\n await this.performBatchSetStorage(\n 'accounts',\n internalAccountsToBeSavedToUserStorage.map((account) => [\n account.address,\n JSON.stringify(mapInternalAccountToUserStorageAccount(account)),\n ]),\n );\n } catch (e) {\n const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);\n throw new Error(\n `${controllerName} - failed to sync user storage accounts list - ${errorMessage}`,\n );\n } finally {\n this.#accounts.isAccountSyncingInProgress = false;\n }\n }\n\n /**\n * Saves an individual internal account to the user storage.\n * @param internalAccount - The internal account to save\n */\n async saveInternalAccountToUserStorage(\n internalAccount: InternalAccount,\n ): Promise<void> {\n if (\n !this.#accounts.canSync() ||\n !isEvmAccountType(internalAccount.type) ||\n !this.#accounts.doesInternalAccountHaveCorrectKeyringType(internalAccount)\n ) {\n return;\n }\n\n try {\n await this.#accounts.saveInternalAccountToUserStorage(internalAccount);\n } catch (e) {\n const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);\n throw new Error(\n `${controllerName} - failed to save account to user storage - ${errorMessage}`,\n );\n }\n }\n}\n"]}
1
+ {"version":3,"file":"UserStorageController.cjs","sourceRoot":"","sources":["../../../src/controllers/user-storage/UserStorageController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccountsControllerListAccountsAction,\n AccountsControllerUpdateAccountMetadataAction,\n AccountsControllerAccountRenamedEvent,\n AccountsControllerAccountAddedEvent,\n} from '@metamask/accounts-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n RestrictedControllerMessenger,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport { type InternalAccount, isEvmAccountType } from '@metamask/keyring-api';\nimport {\n type KeyringControllerGetStateAction,\n type KeyringControllerLockEvent,\n type KeyringControllerUnlockEvent,\n type KeyringControllerAddNewAccountAction,\n KeyringTypes,\n} from '@metamask/keyring-controller';\nimport type { NetworkConfiguration } from '@metamask/network-controller';\nimport type { HandleSnapRequest } from '@metamask/snaps-controllers';\n\nimport { createSHA256Hash } from '../../shared/encryption';\nimport type {\n UserStoragePathWithFeatureAndKey,\n UserStoragePathWithFeatureOnly,\n UserStoragePathWithKeyOnly,\n} from '../../shared/storage-schema';\nimport type { NativeScrypt } from '../../shared/types/encryption';\nimport { createSnapSignMessageRequest } from '../authentication/auth-snap-requests';\nimport type {\n AuthenticationControllerGetBearerToken,\n AuthenticationControllerGetSessionProfile,\n AuthenticationControllerIsSignedIn,\n AuthenticationControllerPerformSignIn,\n AuthenticationControllerPerformSignOut,\n} from '../authentication/AuthenticationController';\nimport type { UserStorageAccount } from './accounts/user-storage';\nimport {\n isNameDefaultAccountName,\n mapInternalAccountToUserStorageAccount,\n} from './accounts/user-storage';\nimport { startNetworkSyncing } from './network-syncing/controller-integration';\nimport {\n batchUpsertUserStorage,\n deleteUserStorage,\n deleteUserStorageAllFeatureEntries,\n getUserStorage,\n getUserStorageAllFeatureEntries,\n upsertUserStorage,\n} from './services';\n\n// TODO: add external NetworkController event\n// Need to listen for when a network gets added\ntype NetworkControllerNetworkAddedEvent = {\n type: 'NetworkController:networkAdded';\n payload: [networkConfiguration: NetworkConfiguration];\n};\n\n// TODO: add external NetworkController event\n// Need to listen for when a network is updated, or the default rpc/block explorer changes\ntype NetworkControllerNetworkChangedEvent = {\n type: 'NetworkController:networkChanged';\n payload: [networkConfiguration: NetworkConfiguration];\n};\n\n// TODO: add external NetworkController event\n// Need to listen for when a network gets deleted\ntype NetworkControllerNetworkDeletedEvent = {\n type: 'NetworkController:networkDeleted';\n payload: [networkConfiguration: NetworkConfiguration];\n};\n\n// TODO: fix external dependencies\nexport declare type NotificationServicesControllerDisableNotificationServices =\n {\n type: `NotificationServicesController:disableNotificationServices`;\n handler: () => Promise<void>;\n };\n\nexport declare type NotificationServicesControllerSelectIsNotificationServicesEnabled =\n {\n type: `NotificationServicesController:selectIsNotificationServicesEnabled`;\n handler: () => boolean;\n };\n\nconst controllerName = 'UserStorageController';\n\n// State\nexport type UserStorageControllerState = {\n /**\n * Condition used by UI and to determine if we can use some of the User Storage methods.\n */\n isProfileSyncingEnabled: boolean | null;\n /**\n * Loading state for the profile syncing update\n */\n isProfileSyncingUpdateLoading: boolean;\n};\n\nexport const defaultState: UserStorageControllerState = {\n isProfileSyncingEnabled: true,\n isProfileSyncingUpdateLoading: false,\n};\n\nconst metadata: StateMetadata<UserStorageControllerState> = {\n isProfileSyncingEnabled: {\n persist: true,\n anonymous: true,\n },\n isProfileSyncingUpdateLoading: {\n persist: false,\n anonymous: false,\n },\n};\n\ntype ControllerConfig = {\n accountSyncing?: {\n maxNumberOfAccountsToAdd?: number;\n /**\n * Callback that fires when account sync adds an account.\n * This is used for analytics.\n */\n onAccountAdded?: (profileId: string) => void;\n\n /**\n * Callback that fires when account sync updates the name of an account.\n * This is used for analytics.\n */\n onAccountNameUpdated?: (profileId: string) => void;\n };\n};\n\n// Messenger Actions\ntype CreateActionsObj<Controller extends keyof UserStorageController> = {\n [K in Controller]: {\n type: `${typeof controllerName}:${K}`;\n handler: UserStorageController[K];\n };\n};\ntype ActionsObj = CreateActionsObj<\n | 'performGetStorage'\n | 'performGetStorageAllFeatureEntries'\n | 'performSetStorage'\n | 'getStorageKey'\n | 'enableProfileSyncing'\n | 'disableProfileSyncing'\n | 'syncInternalAccountsWithUserStorage'\n | 'saveInternalAccountToUserStorage'\n>;\nexport type UserStorageControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n UserStorageControllerState\n>;\nexport type Actions =\n | ActionsObj[keyof ActionsObj]\n | UserStorageControllerGetStateAction;\nexport type UserStorageControllerPerformGetStorage =\n ActionsObj['performGetStorage'];\nexport type UserStorageControllerPerformGetStorageAllFeatureEntries =\n ActionsObj['performGetStorageAllFeatureEntries'];\nexport type UserStorageControllerPerformSetStorage =\n ActionsObj['performSetStorage'];\nexport type UserStorageControllerGetStorageKey = ActionsObj['getStorageKey'];\nexport type UserStorageControllerEnableProfileSyncing =\n ActionsObj['enableProfileSyncing'];\nexport type UserStorageControllerDisableProfileSyncing =\n ActionsObj['disableProfileSyncing'];\nexport type UserStorageControllerSyncInternalAccountsWithUserStorage =\n ActionsObj['syncInternalAccountsWithUserStorage'];\nexport type UserStorageControllerSaveInternalAccountToUserStorage =\n ActionsObj['saveInternalAccountToUserStorage'];\n\nexport type AllowedActions =\n // Keyring Requests\n | KeyringControllerGetStateAction\n // Snap Requests\n | HandleSnapRequest\n // Auth Requests\n | AuthenticationControllerGetBearerToken\n | AuthenticationControllerGetSessionProfile\n | AuthenticationControllerPerformSignIn\n | AuthenticationControllerIsSignedIn\n | AuthenticationControllerPerformSignOut\n // Metamask Notifications\n | NotificationServicesControllerDisableNotificationServices\n | NotificationServicesControllerSelectIsNotificationServicesEnabled\n // Account syncing\n | AccountsControllerListAccountsAction\n | AccountsControllerUpdateAccountMetadataAction\n | KeyringControllerAddNewAccountAction;\n\n// Messenger events\nexport type UserStorageControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n UserStorageControllerState\n>;\nexport type UserStorageControllerAccountSyncingInProgress = {\n type: `${typeof controllerName}:accountSyncingInProgress`;\n payload: [boolean];\n};\nexport type UserStorageControllerAccountSyncingComplete = {\n type: `${typeof controllerName}:accountSyncingComplete`;\n payload: [boolean];\n};\nexport type Events =\n | UserStorageControllerStateChangeEvent\n | UserStorageControllerAccountSyncingInProgress\n | UserStorageControllerAccountSyncingComplete;\n\nexport type AllowedEvents =\n | UserStorageControllerStateChangeEvent\n | UserStorageControllerAccountSyncingInProgress\n | UserStorageControllerAccountSyncingComplete\n | KeyringControllerLockEvent\n | KeyringControllerUnlockEvent\n // Account Syncing Events\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRenamedEvent\n // Network Syncing Events\n | NetworkControllerNetworkAddedEvent\n | NetworkControllerNetworkChangedEvent\n | NetworkControllerNetworkDeletedEvent;\n\n// Messenger\nexport type UserStorageControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n Actions | AllowedActions,\n Events | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\n/**\n * Reusable controller that allows any team to store synchronized data for a given user.\n * These can be settings shared cross MetaMask clients, or data we want to persist when uninstalling/reinstalling.\n *\n * NOTE:\n * - data stored on UserStorage is FULLY encrypted, with the only keys stored/managed on the client.\n * - No one can access this data unless they are have the SRP and are able to run the signing snap.\n */\nexport default class UserStorageController extends BaseController<\n typeof controllerName,\n UserStorageControllerState,\n UserStorageControllerMessenger\n> {\n #auth = {\n getBearerToken: async () => {\n return await this.messagingSystem.call(\n 'AuthenticationController:getBearerToken',\n );\n },\n getProfileId: async () => {\n const sessionProfile = await this.messagingSystem.call(\n 'AuthenticationController:getSessionProfile',\n );\n return sessionProfile?.profileId;\n },\n isAuthEnabled: () => {\n return this.messagingSystem.call('AuthenticationController:isSignedIn');\n },\n signIn: async () => {\n return await this.messagingSystem.call(\n 'AuthenticationController:performSignIn',\n );\n },\n signOut: async () => {\n return this.messagingSystem.call(\n 'AuthenticationController:performSignOut',\n );\n },\n };\n\n #accounts = {\n // This is replaced with the actual value in the constructor\n isAccountSyncingEnabled: false,\n isAccountSyncingInProgress: false,\n maxNumberOfAccountsToAdd: 0,\n canSync: () => {\n try {\n this.#assertProfileSyncingEnabled();\n\n if (this.#accounts.isAccountSyncingInProgress) {\n return false;\n }\n\n if (!this.#accounts.isAccountSyncingEnabled) {\n return false;\n }\n\n if (!this.#auth.isAuthEnabled()) {\n return false;\n }\n\n return true;\n } catch {\n return false;\n }\n },\n setupAccountSyncingSubscriptions: () => {\n this.messagingSystem.subscribe(\n 'AccountsController:accountAdded',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n async (account) => {\n if (!this.#accounts.canSync()) {\n return;\n }\n\n await this.saveInternalAccountToUserStorage(account);\n },\n );\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountRenamed',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n async (account) => {\n if (!this.#accounts.canSync()) {\n return;\n }\n await this.saveInternalAccountToUserStorage(account);\n },\n );\n },\n doesInternalAccountHaveCorrectKeyringType: (account: InternalAccount) => {\n return account.metadata.keyring.type === KeyringTypes.hd;\n },\n getInternalAccountsList: async (): Promise<InternalAccount[]> => {\n // eslint-disable-next-line @typescript-eslint/await-thenable\n const internalAccountsList = await this.messagingSystem.call(\n 'AccountsController:listAccounts',\n );\n\n return internalAccountsList?.filter(\n this.#accounts.doesInternalAccountHaveCorrectKeyringType,\n );\n },\n getUserStorageAccountsList: async (): Promise<\n UserStorageAccount[] | null\n > => {\n const rawAccountsListResponse =\n await this.performGetStorageAllFeatureEntries('accounts');\n\n return (\n rawAccountsListResponse?.map((rawAccount) => JSON.parse(rawAccount)) ??\n null\n );\n },\n saveInternalAccountToUserStorage: async (\n internalAccount: InternalAccount,\n ) => {\n // Map the internal account to the user storage account schema\n const mappedAccount =\n mapInternalAccountToUserStorageAccount(internalAccount);\n\n await this.performSetStorage(\n `accounts.${internalAccount.address}`,\n JSON.stringify(mappedAccount),\n );\n },\n saveInternalAccountsListToUserStorage: async () => {\n const internalAccountsList =\n await this.#accounts.getInternalAccountsList();\n\n if (!internalAccountsList) {\n return;\n }\n\n const internalAccountsListFormattedForUserStorage =\n internalAccountsList.map(mapInternalAccountToUserStorageAccount);\n\n await this.performBatchSetStorage(\n 'accounts',\n internalAccountsListFormattedForUserStorage.map((account) => [\n account.a,\n JSON.stringify(account),\n ]),\n );\n },\n };\n\n #config?: ControllerConfig;\n\n #notificationServices = {\n disableNotificationServices: async () => {\n return await this.messagingSystem.call(\n 'NotificationServicesController:disableNotificationServices',\n );\n },\n selectIsNotificationServicesEnabled: async () => {\n return this.messagingSystem.call(\n 'NotificationServicesController:selectIsNotificationServicesEnabled',\n );\n },\n };\n\n #isUnlocked = false;\n\n #keyringController = {\n setupLockedStateSubscriptions: () => {\n const { isUnlocked } = this.messagingSystem.call(\n 'KeyringController:getState',\n );\n this.#isUnlocked = isUnlocked;\n\n this.messagingSystem.subscribe('KeyringController:unlock', () => {\n this.#isUnlocked = true;\n });\n\n this.messagingSystem.subscribe('KeyringController:lock', () => {\n this.#isUnlocked = false;\n });\n },\n };\n\n #nativeScryptCrypto: NativeScrypt | undefined = undefined;\n\n getMetaMetricsState: () => boolean;\n\n constructor({\n messenger,\n state,\n env,\n config,\n getMetaMetricsState,\n nativeScryptCrypto,\n }: {\n messenger: UserStorageControllerMessenger;\n state?: UserStorageControllerState;\n config?: ControllerConfig;\n env?: {\n isAccountSyncingEnabled?: boolean;\n isNetworkSyncingEnabled?: boolean;\n };\n getMetaMetricsState: () => boolean;\n nativeScryptCrypto?: NativeScrypt;\n }) {\n super({\n messenger,\n metadata,\n name: controllerName,\n state: { ...defaultState, ...state },\n });\n\n this.#config = config;\n\n this.#accounts.isAccountSyncingEnabled = Boolean(\n env?.isAccountSyncingEnabled,\n );\n\n this.#accounts.maxNumberOfAccountsToAdd =\n config?.accountSyncing?.maxNumberOfAccountsToAdd ?? 100;\n\n this.getMetaMetricsState = getMetaMetricsState;\n this.#keyringController.setupLockedStateSubscriptions();\n this.#registerMessageHandlers();\n this.#nativeScryptCrypto = nativeScryptCrypto;\n this.#accounts.setupAccountSyncingSubscriptions();\n\n // Network Syncing\n if (env?.isNetworkSyncingEnabled) {\n startNetworkSyncing({\n messenger,\n getStorageConfig: async () => {\n const { storageKey, bearerToken } =\n await this.#getStorageKeyAndBearerToken();\n return {\n storageKey,\n bearerToken,\n nativeScryptCrypto: this.#nativeScryptCrypto,\n };\n },\n });\n }\n }\n\n /**\n * Constructor helper for registering this controller's messaging system\n * actions.\n */\n #registerMessageHandlers(): void {\n this.messagingSystem.registerActionHandler(\n 'UserStorageController:performGetStorage',\n this.performGetStorage.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'UserStorageController:performGetStorageAllFeatureEntries',\n this.performGetStorageAllFeatureEntries.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'UserStorageController:performSetStorage',\n this.performSetStorage.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'UserStorageController:getStorageKey',\n this.getStorageKey.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'UserStorageController:enableProfileSyncing',\n this.enableProfileSyncing.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'UserStorageController:disableProfileSyncing',\n this.disableProfileSyncing.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'UserStorageController:syncInternalAccountsWithUserStorage',\n this.syncInternalAccountsWithUserStorage.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'UserStorageController:saveInternalAccountToUserStorage',\n this.saveInternalAccountToUserStorage.bind(this),\n );\n }\n\n public async enableProfileSyncing(): Promise<void> {\n try {\n this.#setIsProfileSyncingUpdateLoading(true);\n\n const authEnabled = this.#auth.isAuthEnabled();\n if (!authEnabled) {\n await this.#auth.signIn();\n }\n\n this.update((state) => {\n state.isProfileSyncingEnabled = true;\n });\n\n this.#setIsProfileSyncingUpdateLoading(false);\n } catch (e) {\n this.#setIsProfileSyncingUpdateLoading(false);\n const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);\n throw new Error(\n `${controllerName} - failed to enable profile syncing - ${errorMessage}`,\n );\n }\n }\n\n public async setIsProfileSyncingEnabled(\n isProfileSyncingEnabled: boolean,\n ): Promise<void> {\n this.update((state) => {\n state.isProfileSyncingEnabled = isProfileSyncingEnabled;\n });\n }\n\n public async disableProfileSyncing(): Promise<void> {\n const isAlreadyDisabled = !this.state.isProfileSyncingEnabled;\n if (isAlreadyDisabled) {\n return;\n }\n\n try {\n this.#setIsProfileSyncingUpdateLoading(true);\n\n const isNotificationServicesEnabled =\n await this.#notificationServices.selectIsNotificationServicesEnabled();\n\n if (isNotificationServicesEnabled) {\n await this.#notificationServices.disableNotificationServices();\n }\n\n const isMetaMetricsParticipation = this.getMetaMetricsState();\n\n if (!isMetaMetricsParticipation) {\n await this.#auth.signOut();\n }\n\n this.#setIsProfileSyncingUpdateLoading(false);\n\n this.update((state) => {\n state.isProfileSyncingEnabled = false;\n });\n } catch (e) {\n this.#setIsProfileSyncingUpdateLoading(false);\n const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);\n throw new Error(\n `${controllerName} - failed to disable profile syncing - ${errorMessage}`,\n );\n }\n }\n\n /**\n * Allows retrieval of stored data. Data stored is string formatted.\n * Developers can extend the entry path and entry name through the `schema.ts` file.\n *\n * @param path - string in the form of `${feature}.${key}` that matches schema\n * @returns the decrypted string contents found from user storage (or null if not found)\n */\n public async performGetStorage(\n path: UserStoragePathWithFeatureAndKey,\n ): Promise<string | null> {\n this.#assertProfileSyncingEnabled();\n\n const { bearerToken, storageKey } =\n await this.#getStorageKeyAndBearerToken();\n\n const result = await getUserStorage({\n path,\n bearerToken,\n storageKey,\n nativeScryptCrypto: this.#nativeScryptCrypto,\n });\n\n return result;\n }\n\n /**\n * Allows retrieval of all stored data for a specific feature. Data stored is formatted as an array of strings.\n * Developers can extend the entry path through the `schema.ts` file.\n *\n * @param path - string in the form of `${feature}` that matches schema\n * @returns the array of decrypted string contents found from user storage (or null if not found)\n */\n public async performGetStorageAllFeatureEntries(\n path: UserStoragePathWithFeatureOnly,\n ): Promise<string[] | null> {\n this.#assertProfileSyncingEnabled();\n\n const { bearerToken, storageKey } =\n await this.#getStorageKeyAndBearerToken();\n\n const result = await getUserStorageAllFeatureEntries({\n path,\n bearerToken,\n storageKey,\n nativeScryptCrypto: this.#nativeScryptCrypto,\n });\n\n return result;\n }\n\n /**\n * Allows storage of user data. Data stored must be string formatted.\n * Developers can extend the entry path and entry name through the `schema.ts` file.\n *\n * @param path - string in the form of `${feature}.${key}` that matches schema\n * @param value - The string data you want to store.\n * @returns nothing. NOTE that an error is thrown if fails to store data.\n */\n public async performSetStorage(\n path: UserStoragePathWithFeatureAndKey,\n value: string,\n ): Promise<void> {\n this.#assertProfileSyncingEnabled();\n\n const { bearerToken, storageKey } =\n await this.#getStorageKeyAndBearerToken();\n\n await upsertUserStorage(value, {\n path,\n bearerToken,\n storageKey,\n nativeScryptCrypto: this.#nativeScryptCrypto,\n });\n }\n\n /**\n * Allows storage of multiple user data entries for one specific feature. Data stored must be string formatted.\n * Developers can extend the entry path through the `schema.ts` file.\n *\n * @param path - string in the form of `${feature}` that matches schema\n * @param values - data to store, in the form of an array of `[entryKey, entryValue]` pairs\n * @returns nothing. NOTE that an error is thrown if fails to store data.\n */\n public async performBatchSetStorage(\n path: UserStoragePathWithFeatureOnly,\n values: [UserStoragePathWithKeyOnly, string][],\n ): Promise<void> {\n this.#assertProfileSyncingEnabled();\n\n const { bearerToken, storageKey } =\n await this.#getStorageKeyAndBearerToken();\n\n await batchUpsertUserStorage(values, {\n path,\n bearerToken,\n storageKey,\n nativeScryptCrypto: this.#nativeScryptCrypto,\n });\n }\n\n /**\n * Allows deletion of user data. Developers can extend the entry path and entry name through the `schema.ts` file.\n *\n * @param path - string in the form of `${feature}.${key}` that matches schema\n * @returns nothing. NOTE that an error is thrown if fails to delete data.\n */\n public async performDeleteStorage(\n path: UserStoragePathWithFeatureAndKey,\n ): Promise<void> {\n this.#assertProfileSyncingEnabled();\n\n const { bearerToken, storageKey } =\n await this.#getStorageKeyAndBearerToken();\n\n await deleteUserStorage({\n path,\n bearerToken,\n storageKey,\n });\n }\n\n /**\n * Allows deletion of all user data entries for a specific feature.\n * Developers can extend the entry path through the `schema.ts` file.\n *\n * @param path - string in the form of `${feature}` that matches schema\n * @returns nothing. NOTE that an error is thrown if fails to delete data.\n */\n public async performDeleteStorageAllFeatureEntries(\n path: UserStoragePathWithFeatureOnly,\n ): Promise<void> {\n this.#assertProfileSyncingEnabled();\n\n const { bearerToken, storageKey } =\n await this.#getStorageKeyAndBearerToken();\n\n await deleteUserStorageAllFeatureEntries({\n path,\n bearerToken,\n storageKey,\n });\n }\n\n /**\n * Retrieves the storage key, for internal use only!\n *\n * @returns the storage key\n */\n public async getStorageKey(): Promise<string> {\n this.#assertProfileSyncingEnabled();\n const storageKey = await this.#createStorageKey();\n return storageKey;\n }\n\n #assertProfileSyncingEnabled(): void {\n if (!this.state.isProfileSyncingEnabled) {\n throw new Error(\n `${controllerName}: Unable to call method, user is not authenticated`,\n );\n }\n }\n\n /**\n * Utility to get the bearer token and storage key\n */\n async #getStorageKeyAndBearerToken(): Promise<{\n bearerToken: string;\n storageKey: string;\n }> {\n const bearerToken = await this.#auth.getBearerToken();\n if (!bearerToken) {\n throw new Error('UserStorageController - unable to get bearer token');\n }\n const storageKey = await this.#createStorageKey();\n\n return { bearerToken, storageKey };\n }\n\n /**\n * Rather than storing the storage key, we can compute the storage key when needed.\n *\n * @returns the storage key\n */\n async #createStorageKey(): Promise<string> {\n const id: string = await this.#auth.getProfileId();\n if (!id) {\n throw new Error('UserStorageController - unable to create storage key');\n }\n\n const storageKeySignature = await this.#snapSignMessage(`metamask:${id}`);\n const storageKey = createSHA256Hash(storageKeySignature);\n return storageKey;\n }\n\n #_snapSignMessageCache: Record<`metamask:${string}`, string> = {};\n\n /**\n * Signs a specific message using an underlying auth snap.\n *\n * @param message - A specific tagged message to sign.\n * @returns A Signature created by the snap.\n */\n async #snapSignMessage(message: `metamask:${string}`): Promise<string> {\n if (this.#_snapSignMessageCache[message]) {\n return this.#_snapSignMessageCache[message];\n }\n\n if (!this.#isUnlocked) {\n throw new Error(\n '#snapSignMessage - unable to call snap, wallet is locked',\n );\n }\n\n const result = (await this.messagingSystem.call(\n 'SnapController:handleRequest',\n createSnapSignMessageRequest(message),\n )) as string;\n\n this.#_snapSignMessageCache[message] = result;\n\n return result;\n }\n\n #setIsProfileSyncingUpdateLoading(\n isProfileSyncingUpdateLoading: boolean,\n ): void {\n this.update((state) => {\n state.isProfileSyncingUpdateLoading = isProfileSyncingUpdateLoading;\n });\n }\n\n /**\n * Syncs the internal accounts list with the user storage accounts list.\n * This method is used to make sure that the internal accounts list is up-to-date with the user storage accounts list and vice-versa.\n * It will add new accounts to the internal accounts list, update/merge conflicting names and re-upload the results in some cases to the user storage.\n */\n async syncInternalAccountsWithUserStorage(): Promise<void> {\n if (!this.#accounts.canSync()) {\n return;\n }\n\n try {\n this.#accounts.isAccountSyncingInProgress = true;\n\n const profileId = await this.#auth.getProfileId();\n\n const userStorageAccountsList =\n await this.#accounts.getUserStorageAccountsList();\n\n if (!userStorageAccountsList || !userStorageAccountsList.length) {\n await this.#accounts.saveInternalAccountsListToUserStorage();\n return;\n }\n\n // Prepare an array of internal accounts to be saved to the user storage\n const internalAccountsToBeSavedToUserStorage: InternalAccount[] = [];\n\n // Compare internal accounts list with user storage accounts list\n // First step: compare lengths\n let internalAccountsList = await this.#accounts.getInternalAccountsList();\n\n if (!internalAccountsList || !internalAccountsList.length) {\n throw new Error(`Failed to get internal accounts list`);\n }\n\n const hasMoreInternalAccountsThanUserStorageAccounts =\n internalAccountsList.length > userStorageAccountsList.length;\n\n // We don't want to remove existing accounts for a user\n // so we only add new accounts if the user has more accounts than the internal accounts list\n if (!hasMoreInternalAccountsThanUserStorageAccounts) {\n const numberOfAccountsToAdd =\n Math.min(\n userStorageAccountsList.length,\n this.#accounts.maxNumberOfAccountsToAdd,\n ) - internalAccountsList.length;\n\n // Create new accounts to match the user storage accounts list\n\n for (let i = 0; i < numberOfAccountsToAdd; i++) {\n await this.messagingSystem.call('KeyringController:addNewAccount');\n\n this.#config?.accountSyncing?.onAccountAdded?.(profileId);\n }\n }\n\n // Second step: compare account names\n // Get the internal accounts list again since new accounts might have been added in the previous step\n internalAccountsList = await this.#accounts.getInternalAccountsList();\n\n for (const internalAccount of internalAccountsList) {\n const userStorageAccount = userStorageAccountsList.find(\n (account) => account.a === internalAccount.address,\n );\n\n if (!userStorageAccount) {\n internalAccountsToBeSavedToUserStorage.push(internalAccount);\n continue;\n }\n\n // One or both accounts have default names\n const isInternalAccountNameDefault = isNameDefaultAccountName(\n internalAccount.metadata.name,\n );\n const isUserStorageAccountNameDefault = isNameDefaultAccountName(\n userStorageAccount.n,\n );\n\n // Internal account has default name\n if (isInternalAccountNameDefault) {\n if (!isUserStorageAccountNameDefault) {\n this.messagingSystem.call(\n 'AccountsController:updateAccountMetadata',\n internalAccount.id,\n {\n name: userStorageAccount.n,\n },\n );\n\n this.#config?.accountSyncing?.onAccountNameUpdated?.(profileId);\n }\n continue;\n }\n\n // Internal account has custom name but user storage account has default name\n if (isUserStorageAccountNameDefault) {\n internalAccountsToBeSavedToUserStorage.push(internalAccount);\n continue;\n }\n\n // Both accounts have custom names\n\n // User storage account has a nameLastUpdatedAt timestamp\n // Note: not storing the undefined checks in constants to act as a type guard\n if (userStorageAccount.nlu !== undefined) {\n if (internalAccount.metadata.nameLastUpdatedAt !== undefined) {\n const isInternalAccountNameNewer =\n internalAccount.metadata.nameLastUpdatedAt >\n userStorageAccount.nlu;\n\n if (isInternalAccountNameNewer) {\n internalAccountsToBeSavedToUserStorage.push(internalAccount);\n continue;\n }\n }\n\n this.messagingSystem.call(\n 'AccountsController:updateAccountMetadata',\n internalAccount.id,\n {\n name: userStorageAccount.n,\n nameLastUpdatedAt: userStorageAccount.nlu,\n },\n );\n\n const areInternalAndUserStorageAccountNamesEqual =\n internalAccount.metadata.name === userStorageAccount.n;\n\n if (!areInternalAndUserStorageAccountNamesEqual) {\n this.#config?.accountSyncing?.onAccountNameUpdated?.(profileId);\n }\n\n continue;\n } else if (internalAccount.metadata.nameLastUpdatedAt !== undefined) {\n internalAccountsToBeSavedToUserStorage.push(internalAccount);\n continue;\n }\n }\n\n // Save the internal accounts list to the user storage\n await this.performBatchSetStorage(\n 'accounts',\n internalAccountsToBeSavedToUserStorage.map((account) => [\n account.address,\n JSON.stringify(mapInternalAccountToUserStorageAccount(account)),\n ]),\n );\n } catch (e) {\n const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);\n throw new Error(\n `${controllerName} - failed to sync user storage accounts list - ${errorMessage}`,\n );\n } finally {\n this.#accounts.isAccountSyncingInProgress = false;\n }\n }\n\n /**\n * Saves an individual internal account to the user storage.\n * @param internalAccount - The internal account to save\n */\n async saveInternalAccountToUserStorage(\n internalAccount: InternalAccount,\n ): Promise<void> {\n if (\n !this.#accounts.canSync() ||\n !isEvmAccountType(internalAccount.type) ||\n !this.#accounts.doesInternalAccountHaveCorrectKeyringType(internalAccount)\n ) {\n return;\n }\n\n try {\n await this.#accounts.saveInternalAccountToUserStorage(internalAccount);\n } catch (e) {\n const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);\n throw new Error(\n `${controllerName} - failed to save account to user storage - ${errorMessage}`,\n );\n }\n }\n}\n"]}
@@ -42,6 +42,7 @@ export type UserStorageControllerState = {
42
42
  export declare const defaultState: UserStorageControllerState;
43
43
  type ControllerConfig = {
44
44
  accountSyncing?: {
45
+ maxNumberOfAccountsToAdd?: number;
45
46
  /**
46
47
  * Callback that fires when account sync adds an account.
47
48
  * This is used for analytics.
@@ -143,6 +144,13 @@ export default class UserStorageController extends BaseController<typeof control
143
144
  * @returns nothing. NOTE that an error is thrown if fails to store data.
144
145
  */
145
146
  performBatchSetStorage(path: UserStoragePathWithFeatureOnly, values: [UserStoragePathWithKeyOnly, string][]): Promise<void>;
147
+ /**
148
+ * Allows deletion of user data. Developers can extend the entry path and entry name through the `schema.ts` file.
149
+ *
150
+ * @param path - string in the form of `${feature}.${key}` that matches schema
151
+ * @returns nothing. NOTE that an error is thrown if fails to delete data.
152
+ */
153
+ performDeleteStorage(path: UserStoragePathWithFeatureAndKey): Promise<void>;
146
154
  /**
147
155
  * Allows deletion of all user data entries for a specific feature.
148
156
  * Developers can extend the entry path through the `schema.ts` file.
@@ -1 +1 @@
1
- {"version":3,"file":"UserStorageController.d.cts","sourceRoot":"","sources":["../../../src/controllers/user-storage/UserStorageController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"UserStorageController.d.cts","sourceRoot":"","sources":["../../../src/controllers/user-storage/UserStorageController.ts"],"names":[],"mappings":"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"}
@@ -42,6 +42,7 @@ export type UserStorageControllerState = {
42
42
  export declare const defaultState: UserStorageControllerState;
43
43
  type ControllerConfig = {
44
44
  accountSyncing?: {
45
+ maxNumberOfAccountsToAdd?: number;
45
46
  /**
46
47
  * Callback that fires when account sync adds an account.
47
48
  * This is used for analytics.
@@ -143,6 +144,13 @@ export default class UserStorageController extends BaseController<typeof control
143
144
  * @returns nothing. NOTE that an error is thrown if fails to store data.
144
145
  */
145
146
  performBatchSetStorage(path: UserStoragePathWithFeatureOnly, values: [UserStoragePathWithKeyOnly, string][]): Promise<void>;
147
+ /**
148
+ * Allows deletion of user data. Developers can extend the entry path and entry name through the `schema.ts` file.
149
+ *
150
+ * @param path - string in the form of `${feature}.${key}` that matches schema
151
+ * @returns nothing. NOTE that an error is thrown if fails to delete data.
152
+ */
153
+ performDeleteStorage(path: UserStoragePathWithFeatureAndKey): Promise<void>;
146
154
  /**
147
155
  * Allows deletion of all user data entries for a specific feature.
148
156
  * Developers can extend the entry path through the `schema.ts` file.
@@ -1 +1 @@
1
- {"version":3,"file":"UserStorageController.d.mts","sourceRoot":"","sources":["../../../src/controllers/user-storage/UserStorageController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"UserStorageController.d.mts","sourceRoot":"","sources":["../../../src/controllers/user-storage/UserStorageController.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,7 @@ import { createSHA256Hash } from "../../shared/encryption/index.mjs";
18
18
  import { createSnapSignMessageRequest } from "../authentication/auth-snap-requests.mjs";
19
19
  import { isNameDefaultAccountName, mapInternalAccountToUserStorageAccount } from "./accounts/user-storage.mjs";
20
20
  import { startNetworkSyncing } from "./network-syncing/controller-integration.mjs";
21
- import { batchUpsertUserStorage, deleteUserStorageAllFeatureEntries, getUserStorage, getUserStorageAllFeatureEntries, upsertUserStorage } from "./services.mjs";
21
+ import { batchUpsertUserStorage, deleteUserStorage, deleteUserStorageAllFeatureEntries, getUserStorage, getUserStorageAllFeatureEntries, upsertUserStorage } from "./services.mjs";
22
22
  const controllerName = 'UserStorageController';
23
23
  export const defaultState = {
24
24
  isProfileSyncingEnabled: true,
@@ -71,14 +71,22 @@ class UserStorageController extends BaseController {
71
71
  });
72
72
  _UserStorageController_accounts.set(this, {
73
73
  // This is replaced with the actual value in the constructor
74
- // We will remove this once the feature will be released
75
74
  isAccountSyncingEnabled: false,
76
75
  isAccountSyncingInProgress: false,
77
- addedAccountsCount: 0,
76
+ maxNumberOfAccountsToAdd: 0,
78
77
  canSync: () => {
79
78
  try {
80
79
  __classPrivateFieldGet(this, _UserStorageController_instances, "m", _UserStorageController_assertProfileSyncingEnabled).call(this);
81
- return (__classPrivateFieldGet(this, _UserStorageController_accounts, "f").isAccountSyncingEnabled && __classPrivateFieldGet(this, _UserStorageController_auth, "f").isAuthEnabled());
80
+ if (__classPrivateFieldGet(this, _UserStorageController_accounts, "f").isAccountSyncingInProgress) {
81
+ return false;
82
+ }
83
+ if (!__classPrivateFieldGet(this, _UserStorageController_accounts, "f").isAccountSyncingEnabled) {
84
+ return false;
85
+ }
86
+ if (!__classPrivateFieldGet(this, _UserStorageController_auth, "f").isAuthEnabled()) {
87
+ return false;
88
+ }
89
+ return true;
82
90
  }
83
91
  catch {
84
92
  return false;
@@ -88,8 +96,7 @@ class UserStorageController extends BaseController {
88
96
  this.messagingSystem.subscribe('AccountsController:accountAdded',
89
97
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
90
98
  async (account) => {
91
- if (__classPrivateFieldGet(this, _UserStorageController_accounts, "f").isAccountSyncingInProgress) {
92
- __classPrivateFieldGet(this, _UserStorageController_accounts, "f").addedAccountsCount += 1;
99
+ if (!__classPrivateFieldGet(this, _UserStorageController_accounts, "f").canSync()) {
93
100
  return;
94
101
  }
95
102
  await this.saveInternalAccountToUserStorage(account);
@@ -97,15 +104,14 @@ class UserStorageController extends BaseController {
97
104
  this.messagingSystem.subscribe('AccountsController:accountRenamed',
98
105
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
99
106
  async (account) => {
100
- if (__classPrivateFieldGet(this, _UserStorageController_accounts, "f").isAccountSyncingInProgress) {
107
+ if (!__classPrivateFieldGet(this, _UserStorageController_accounts, "f").canSync()) {
101
108
  return;
102
109
  }
103
110
  await this.saveInternalAccountToUserStorage(account);
104
111
  });
105
112
  },
106
113
  doesInternalAccountHaveCorrectKeyringType: (account) => {
107
- return (account.metadata.keyring.type === KeyringTypes.hd ||
108
- account.metadata.keyring.type === KeyringTypes.simple);
114
+ return account.metadata.keyring.type === KeyringTypes.hd;
109
115
  },
110
116
  getInternalAccountsList: async () => {
111
117
  // eslint-disable-next-line @typescript-eslint/await-thenable
@@ -160,6 +166,8 @@ class UserStorageController extends BaseController {
160
166
  _UserStorageController__snapSignMessageCache.set(this, {});
161
167
  __classPrivateFieldSet(this, _UserStorageController_config, config, "f");
162
168
  __classPrivateFieldGet(this, _UserStorageController_accounts, "f").isAccountSyncingEnabled = Boolean(env?.isAccountSyncingEnabled);
169
+ __classPrivateFieldGet(this, _UserStorageController_accounts, "f").maxNumberOfAccountsToAdd =
170
+ config?.accountSyncing?.maxNumberOfAccountsToAdd ?? 100;
163
171
  this.getMetaMetricsState = getMetaMetricsState;
164
172
  __classPrivateFieldGet(this, _UserStorageController_keyringController, "f").setupLockedStateSubscriptions();
165
173
  __classPrivateFieldGet(this, _UserStorageController_instances, "m", _UserStorageController_registerMessageHandlers).call(this);
@@ -301,6 +309,21 @@ class UserStorageController extends BaseController {
301
309
  nativeScryptCrypto: __classPrivateFieldGet(this, _UserStorageController_nativeScryptCrypto, "f"),
302
310
  });
303
311
  }
312
+ /**
313
+ * Allows deletion of user data. Developers can extend the entry path and entry name through the `schema.ts` file.
314
+ *
315
+ * @param path - string in the form of `${feature}.${key}` that matches schema
316
+ * @returns nothing. NOTE that an error is thrown if fails to delete data.
317
+ */
318
+ async performDeleteStorage(path) {
319
+ __classPrivateFieldGet(this, _UserStorageController_instances, "m", _UserStorageController_assertProfileSyncingEnabled).call(this);
320
+ const { bearerToken, storageKey } = await __classPrivateFieldGet(this, _UserStorageController_instances, "m", _UserStorageController_getStorageKeyAndBearerToken).call(this);
321
+ await deleteUserStorage({
322
+ path,
323
+ bearerToken,
324
+ storageKey,
325
+ });
326
+ }
304
327
  /**
305
328
  * Allows deletion of all user data entries for a specific feature.
306
329
  * Developers can extend the entry path through the `schema.ts` file.
@@ -338,7 +361,6 @@ class UserStorageController extends BaseController {
338
361
  }
339
362
  try {
340
363
  __classPrivateFieldGet(this, _UserStorageController_accounts, "f").isAccountSyncingInProgress = true;
341
- __classPrivateFieldGet(this, _UserStorageController_accounts, "f").addedAccountsCount = 0;
342
364
  const profileId = await __classPrivateFieldGet(this, _UserStorageController_auth, "f").getProfileId();
343
365
  const userStorageAccountsList = await __classPrivateFieldGet(this, _UserStorageController_accounts, "f").getUserStorageAccountsList();
344
366
  if (!userStorageAccountsList || !userStorageAccountsList.length) {
@@ -357,7 +379,7 @@ class UserStorageController extends BaseController {
357
379
  // We don't want to remove existing accounts for a user
358
380
  // so we only add new accounts if the user has more accounts than the internal accounts list
359
381
  if (!hasMoreInternalAccountsThanUserStorageAccounts) {
360
- const numberOfAccountsToAdd = userStorageAccountsList.length - internalAccountsList.length;
382
+ const numberOfAccountsToAdd = Math.min(userStorageAccountsList.length, __classPrivateFieldGet(this, _UserStorageController_accounts, "f").maxNumberOfAccountsToAdd) - internalAccountsList.length;
361
383
  // Create new accounts to match the user storage accounts list
362
384
  for (let i = 0; i < numberOfAccountsToAdd; i++) {
363
385
  await this.messagingSystem.call('KeyringController:addNewAccount');