@metamask/profile-sync-controller 0.9.7 → 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.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,16 @@ 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
+
10
20
  ## [0.9.7]
11
21
 
12
22
  ### Added
@@ -278,7 +288,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
278
288
 
279
289
  - Initial release
280
290
 
281
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/profile-sync-controller@0.9.7...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
282
293
  [0.9.7]: https://github.com/MetaMask/core/compare/@metamask/profile-sync-controller@0.9.6...@metamask/profile-sync-controller@0.9.7
283
294
  [0.9.6]: https://github.com/MetaMask/core/compare/@metamask/profile-sync-controller@0.9.5...@metamask/profile-sync-controller@0.9.6
284
295
  [0.9.5]: https://github.com/MetaMask/core/compare/@metamask/profile-sync-controller@0.9.4...@metamask/profile-sync-controller@0.9.5
@@ -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,7 +106,7 @@ 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);
@@ -161,6 +168,8 @@ class UserStorageController extends base_controller_1.BaseController {
161
168
  _UserStorageController__snapSignMessageCache.set(this, {});
162
169
  __classPrivateFieldSet(this, _UserStorageController_config, config, "f");
163
170
  __classPrivateFieldGet(this, _UserStorageController_accounts, "f").isAccountSyncingEnabled = Boolean(env?.isAccountSyncingEnabled);
171
+ __classPrivateFieldGet(this, _UserStorageController_accounts, "f").maxNumberOfAccountsToAdd =
172
+ config?.accountSyncing?.maxNumberOfAccountsToAdd ?? 100;
164
173
  this.getMetaMetricsState = getMetaMetricsState;
165
174
  __classPrivateFieldGet(this, _UserStorageController_keyringController, "f").setupLockedStateSubscriptions();
166
175
  __classPrivateFieldGet(this, _UserStorageController_instances, "m", _UserStorageController_registerMessageHandlers).call(this);
@@ -354,7 +363,6 @@ class UserStorageController extends base_controller_1.BaseController {
354
363
  }
355
364
  try {
356
365
  __classPrivateFieldGet(this, _UserStorageController_accounts, "f").isAccountSyncingInProgress = true;
357
- __classPrivateFieldGet(this, _UserStorageController_accounts, "f").addedAccountsCount = 0;
358
366
  const profileId = await __classPrivateFieldGet(this, _UserStorageController_auth, "f").getProfileId();
359
367
  const userStorageAccountsList = await __classPrivateFieldGet(this, _UserStorageController_accounts, "f").getUserStorageAccountsList();
360
368
  if (!userStorageAccountsList || !userStorageAccountsList.length) {
@@ -373,7 +381,7 @@ class UserStorageController extends base_controller_1.BaseController {
373
381
  // We don't want to remove existing accounts for a user
374
382
  // so we only add new accounts if the user has more accounts than the internal accounts list
375
383
  if (!hasMoreInternalAccountsThanUserStorageAccounts) {
376
- const numberOfAccountsToAdd = userStorageAccountsList.length - internalAccountsList.length;
384
+ const numberOfAccountsToAdd = Math.min(userStorageAccountsList.length, __classPrivateFieldGet(this, _UserStorageController_accounts, "f").maxNumberOfAccountsToAdd) - internalAccountsList.length;
377
385
  // Create new accounts to match the user storage accounts list
378
386
  for (let i = 0; i < numberOfAccountsToAdd; i++) {
379
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 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 /**\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 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.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 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.
@@ -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":"AAAA,OAAO,KAAK,EACV,oCAAoC,EACpC,6CAA6C,EAC7C,qCAAqC,EACrC,mCAAmC,EACpC,sCAAsC;AACvC,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAC1B,6BAA6B,EAE9B,kCAAkC;AACnC,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,EAAE,KAAK,eAAe,EAAoB,8BAA8B;AAC/E,OAAO,EACL,KAAK,+BAA+B,EACpC,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,oCAAoC,EAE1C,qCAAqC;AACtC,OAAO,KAAK,EAAE,oBAAoB,EAAE,qCAAqC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,oCAAoC;AAGrE,OAAO,KAAK,EACV,gCAAgC,EAChC,8BAA8B,EAC9B,0BAA0B,EAC3B,wCAAoC;AACrC,OAAO,KAAK,EAAE,YAAY,EAAE,0CAAsC;AAElE,OAAO,KAAK,EACV,sCAAsC,EACtC,yCAAyC,EACzC,kCAAkC,EAClC,qCAAqC,EACrC,sCAAsC,EACvC,uDAAmD;AAkBpD,KAAK,kCAAkC,GAAG;IACxC,IAAI,EAAE,gCAAgC,CAAC;IACvC,OAAO,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;CACvD,CAAC;AAIF,KAAK,oCAAoC,GAAG;IAC1C,IAAI,EAAE,kCAAkC,CAAC;IACzC,OAAO,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;CACvD,CAAC;AAIF,KAAK,oCAAoC,GAAG;IAC1C,IAAI,EAAE,kCAAkC,CAAC;IACzC,OAAO,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;CACvD,CAAC;AAGF,MAAM,CAAC,OAAO,MAAM,yDAAyD,GAC3E;IACE,IAAI,EAAE,4DAA4D,CAAC;IACnE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC;AAEJ,MAAM,CAAC,OAAO,MAAM,iEAAiE,GACnF;IACE,IAAI,EAAE,oEAAoE,CAAC;IAC3E,OAAO,EAAE,MAAM,OAAO,CAAC;CACxB,CAAC;AAEJ,QAAA,MAAM,cAAc,0BAA0B,CAAC;AAG/C,MAAM,MAAM,0BAA0B,GAAG;IACvC;;OAEG;IACH,uBAAuB,EAAE,OAAO,GAAG,IAAI,CAAC;IACxC;;OAEG;IACH,6BAA6B,EAAE,OAAO,CAAC;CACxC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,0BAG1B,CAAC;AAaF,KAAK,gBAAgB,GAAG;IACtB,cAAc,CAAC,EAAE;QACf,wBAAwB,CAAC,EAAE,MAAM,CAAC;QAClC;;;WAGG;QACH,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;QAE7C;;;WAGG;QACH,oBAAoB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;KACpD,CAAC;CACH,CAAC;AAGF,KAAK,gBAAgB,CAAC,UAAU,SAAS,MAAM,qBAAqB,IAAI;KACrE,CAAC,IAAI,UAAU,GAAG;QACjB,IAAI,EAAE,GAAG,OAAO,cAAc,IAAI,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;KACnC;CACF,CAAC;AACF,KAAK,UAAU,GAAG,gBAAgB,CAC9B,mBAAmB,GACnB,oCAAoC,GACpC,mBAAmB,GACnB,eAAe,GACf,sBAAsB,GACtB,uBAAuB,GACvB,qCAAqC,GACrC,kCAAkC,CACrC,CAAC;AACF,MAAM,MAAM,mCAAmC,GAAG,wBAAwB,CACxE,OAAO,cAAc,EACrB,0BAA0B,CAC3B,CAAC;AACF,MAAM,MAAM,OAAO,GACf,UAAU,CAAC,MAAM,UAAU,CAAC,GAC5B,mCAAmC,CAAC;AACxC,MAAM,MAAM,sCAAsC,GAChD,UAAU,CAAC,mBAAmB,CAAC,CAAC;AAClC,MAAM,MAAM,uDAAuD,GACjE,UAAU,CAAC,oCAAoC,CAAC,CAAC;AACnD,MAAM,MAAM,sCAAsC,GAChD,UAAU,CAAC,mBAAmB,CAAC,CAAC;AAClC,MAAM,MAAM,kCAAkC,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;AAC7E,MAAM,MAAM,yCAAyC,GACnD,UAAU,CAAC,sBAAsB,CAAC,CAAC;AACrC,MAAM,MAAM,0CAA0C,GACpD,UAAU,CAAC,uBAAuB,CAAC,CAAC;AACtC,MAAM,MAAM,wDAAwD,GAClE,UAAU,CAAC,qCAAqC,CAAC,CAAC;AACpD,MAAM,MAAM,qDAAqD,GAC/D,UAAU,CAAC,kCAAkC,CAAC,CAAC;AAEjD,MAAM,MAAM,cAAc,GAEtB,+BAA+B,GAE/B,iBAAiB,GAEjB,sCAAsC,GACtC,yCAAyC,GACzC,qCAAqC,GACrC,kCAAkC,GAClC,sCAAsC,GAEtC,yDAAyD,GACzD,iEAAiE,GAEjE,oCAAoC,GACpC,6CAA6C,GAC7C,oCAAoC,CAAC;AAGzC,MAAM,MAAM,qCAAqC,GAAG,0BAA0B,CAC5E,OAAO,cAAc,EACrB,0BAA0B,CAC3B,CAAC;AACF,MAAM,MAAM,6CAA6C,GAAG;IAC1D,IAAI,EAAE,GAAG,OAAO,cAAc,2BAA2B,CAAC;IAC1D,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;CACpB,CAAC;AACF,MAAM,MAAM,2CAA2C,GAAG;IACxD,IAAI,EAAE,GAAG,OAAO,cAAc,yBAAyB,CAAC;IACxD,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;CACpB,CAAC;AACF,MAAM,MAAM,MAAM,GACd,qCAAqC,GACrC,6CAA6C,GAC7C,2CAA2C,CAAC;AAEhD,MAAM,MAAM,aAAa,GACrB,qCAAqC,GACrC,6CAA6C,GAC7C,2CAA2C,GAC3C,0BAA0B,GAC1B,4BAA4B,GAE5B,mCAAmC,GACnC,qCAAqC,GAErC,kCAAkC,GAClC,oCAAoC,GACpC,oCAAoC,CAAC;AAGzC,MAAM,MAAM,8BAA8B,GAAG,6BAA6B,CACxE,OAAO,cAAc,EACrB,OAAO,GAAG,cAAc,EACxB,MAAM,GAAG,aAAa,EACtB,cAAc,CAAC,MAAM,CAAC,EACtB,aAAa,CAAC,MAAM,CAAC,CACtB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,cAAc,CAC/D,OAAO,cAAc,EACrB,0BAA0B,EAC1B,8BAA8B,CAC/B;;IA2KC,mBAAmB,EAAE,MAAM,OAAO,CAAC;gBAEvB,EACV,SAAS,EACT,KAAK,EACL,GAAG,EACH,MAAM,EACN,mBAAmB,EACnB,kBAAkB,GACnB,EAAE;QACD,SAAS,EAAE,8BAA8B,CAAC;QAC1C,KAAK,CAAC,EAAE,0BAA0B,CAAC;QACnC,MAAM,CAAC,EAAE,gBAAgB,CAAC;QAC1B,GAAG,CAAC,EAAE;YACJ,uBAAuB,CAAC,EAAE,OAAO,CAAC;YAClC,uBAAuB,CAAC,EAAE,OAAO,CAAC;SACnC,CAAC;QACF,mBAAmB,EAAE,MAAM,OAAO,CAAC;QACnC,kBAAkB,CAAC,EAAE,YAAY,CAAC;KACnC;IAsFY,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBrC,0BAA0B,CACrC,uBAAuB,EAAE,OAAO,GAC/B,OAAO,CAAC,IAAI,CAAC;IAMH,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoCnD;;;;;;OAMG;IACU,iBAAiB,CAC5B,IAAI,EAAE,gCAAgC,GACrC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBzB;;;;;;OAMG;IACU,kCAAkC,CAC7C,IAAI,EAAE,8BAA8B,GACnC,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IAgB3B;;;;;;;OAOG;IACU,iBAAiB,CAC5B,IAAI,EAAE,gCAAgC,EACtC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;IAchB;;;;;;;OAOG;IACU,sBAAsB,CACjC,IAAI,EAAE,8BAA8B,EACpC,MAAM,EAAE,CAAC,0BAA0B,EAAE,MAAM,CAAC,EAAE,GAC7C,OAAO,CAAC,IAAI,CAAC;IAchB;;;;;OAKG;IACU,oBAAoB,CAC/B,IAAI,EAAE,gCAAgC,GACrC,OAAO,CAAC,IAAI,CAAC;IAahB;;;;;;OAMG;IACU,qCAAqC,CAChD,IAAI,EAAE,8BAA8B,GACnC,OAAO,CAAC,IAAI,CAAC;IAahB;;;;OAIG;IACU,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAmF7C;;;;OAIG;IACG,mCAAmC,IAAI,OAAO,CAAC,IAAI,CAAC;IAuJ1D;;;OAGG;IACG,gCAAgC,CACpC,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,IAAI,CAAC;CAkBjB"}
@@ -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.
@@ -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":"AAAA,OAAO,KAAK,EACV,oCAAoC,EACpC,6CAA6C,EAC7C,qCAAqC,EACrC,mCAAmC,EACpC,sCAAsC;AACvC,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAC1B,6BAA6B,EAE9B,kCAAkC;AACnC,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,EAAE,KAAK,eAAe,EAAoB,8BAA8B;AAC/E,OAAO,EACL,KAAK,+BAA+B,EACpC,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,oCAAoC,EAE1C,qCAAqC;AACtC,OAAO,KAAK,EAAE,oBAAoB,EAAE,qCAAqC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,oCAAoC;AAGrE,OAAO,KAAK,EACV,gCAAgC,EAChC,8BAA8B,EAC9B,0BAA0B,EAC3B,wCAAoC;AACrC,OAAO,KAAK,EAAE,YAAY,EAAE,0CAAsC;AAElE,OAAO,KAAK,EACV,sCAAsC,EACtC,yCAAyC,EACzC,kCAAkC,EAClC,qCAAqC,EACrC,sCAAsC,EACvC,uDAAmD;AAkBpD,KAAK,kCAAkC,GAAG;IACxC,IAAI,EAAE,gCAAgC,CAAC;IACvC,OAAO,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;CACvD,CAAC;AAIF,KAAK,oCAAoC,GAAG;IAC1C,IAAI,EAAE,kCAAkC,CAAC;IACzC,OAAO,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;CACvD,CAAC;AAIF,KAAK,oCAAoC,GAAG;IAC1C,IAAI,EAAE,kCAAkC,CAAC;IACzC,OAAO,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;CACvD,CAAC;AAGF,MAAM,CAAC,OAAO,MAAM,yDAAyD,GAC3E;IACE,IAAI,EAAE,4DAA4D,CAAC;IACnE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC;AAEJ,MAAM,CAAC,OAAO,MAAM,iEAAiE,GACnF;IACE,IAAI,EAAE,oEAAoE,CAAC;IAC3E,OAAO,EAAE,MAAM,OAAO,CAAC;CACxB,CAAC;AAEJ,QAAA,MAAM,cAAc,0BAA0B,CAAC;AAG/C,MAAM,MAAM,0BAA0B,GAAG;IACvC;;OAEG;IACH,uBAAuB,EAAE,OAAO,GAAG,IAAI,CAAC;IACxC;;OAEG;IACH,6BAA6B,EAAE,OAAO,CAAC;CACxC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,0BAG1B,CAAC;AAaF,KAAK,gBAAgB,GAAG;IACtB,cAAc,CAAC,EAAE;QACf,wBAAwB,CAAC,EAAE,MAAM,CAAC;QAClC;;;WAGG;QACH,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;QAE7C;;;WAGG;QACH,oBAAoB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;KACpD,CAAC;CACH,CAAC;AAGF,KAAK,gBAAgB,CAAC,UAAU,SAAS,MAAM,qBAAqB,IAAI;KACrE,CAAC,IAAI,UAAU,GAAG;QACjB,IAAI,EAAE,GAAG,OAAO,cAAc,IAAI,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;KACnC;CACF,CAAC;AACF,KAAK,UAAU,GAAG,gBAAgB,CAC9B,mBAAmB,GACnB,oCAAoC,GACpC,mBAAmB,GACnB,eAAe,GACf,sBAAsB,GACtB,uBAAuB,GACvB,qCAAqC,GACrC,kCAAkC,CACrC,CAAC;AACF,MAAM,MAAM,mCAAmC,GAAG,wBAAwB,CACxE,OAAO,cAAc,EACrB,0BAA0B,CAC3B,CAAC;AACF,MAAM,MAAM,OAAO,GACf,UAAU,CAAC,MAAM,UAAU,CAAC,GAC5B,mCAAmC,CAAC;AACxC,MAAM,MAAM,sCAAsC,GAChD,UAAU,CAAC,mBAAmB,CAAC,CAAC;AAClC,MAAM,MAAM,uDAAuD,GACjE,UAAU,CAAC,oCAAoC,CAAC,CAAC;AACnD,MAAM,MAAM,sCAAsC,GAChD,UAAU,CAAC,mBAAmB,CAAC,CAAC;AAClC,MAAM,MAAM,kCAAkC,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;AAC7E,MAAM,MAAM,yCAAyC,GACnD,UAAU,CAAC,sBAAsB,CAAC,CAAC;AACrC,MAAM,MAAM,0CAA0C,GACpD,UAAU,CAAC,uBAAuB,CAAC,CAAC;AACtC,MAAM,MAAM,wDAAwD,GAClE,UAAU,CAAC,qCAAqC,CAAC,CAAC;AACpD,MAAM,MAAM,qDAAqD,GAC/D,UAAU,CAAC,kCAAkC,CAAC,CAAC;AAEjD,MAAM,MAAM,cAAc,GAEtB,+BAA+B,GAE/B,iBAAiB,GAEjB,sCAAsC,GACtC,yCAAyC,GACzC,qCAAqC,GACrC,kCAAkC,GAClC,sCAAsC,GAEtC,yDAAyD,GACzD,iEAAiE,GAEjE,oCAAoC,GACpC,6CAA6C,GAC7C,oCAAoC,CAAC;AAGzC,MAAM,MAAM,qCAAqC,GAAG,0BAA0B,CAC5E,OAAO,cAAc,EACrB,0BAA0B,CAC3B,CAAC;AACF,MAAM,MAAM,6CAA6C,GAAG;IAC1D,IAAI,EAAE,GAAG,OAAO,cAAc,2BAA2B,CAAC;IAC1D,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;CACpB,CAAC;AACF,MAAM,MAAM,2CAA2C,GAAG;IACxD,IAAI,EAAE,GAAG,OAAO,cAAc,yBAAyB,CAAC;IACxD,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;CACpB,CAAC;AACF,MAAM,MAAM,MAAM,GACd,qCAAqC,GACrC,6CAA6C,GAC7C,2CAA2C,CAAC;AAEhD,MAAM,MAAM,aAAa,GACrB,qCAAqC,GACrC,6CAA6C,GAC7C,2CAA2C,GAC3C,0BAA0B,GAC1B,4BAA4B,GAE5B,mCAAmC,GACnC,qCAAqC,GAErC,kCAAkC,GAClC,oCAAoC,GACpC,oCAAoC,CAAC;AAGzC,MAAM,MAAM,8BAA8B,GAAG,6BAA6B,CACxE,OAAO,cAAc,EACrB,OAAO,GAAG,cAAc,EACxB,MAAM,GAAG,aAAa,EACtB,cAAc,CAAC,MAAM,CAAC,EACtB,aAAa,CAAC,MAAM,CAAC,CACtB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,cAAc,CAC/D,OAAO,cAAc,EACrB,0BAA0B,EAC1B,8BAA8B,CAC/B;;IA2KC,mBAAmB,EAAE,MAAM,OAAO,CAAC;gBAEvB,EACV,SAAS,EACT,KAAK,EACL,GAAG,EACH,MAAM,EACN,mBAAmB,EACnB,kBAAkB,GACnB,EAAE;QACD,SAAS,EAAE,8BAA8B,CAAC;QAC1C,KAAK,CAAC,EAAE,0BAA0B,CAAC;QACnC,MAAM,CAAC,EAAE,gBAAgB,CAAC;QAC1B,GAAG,CAAC,EAAE;YACJ,uBAAuB,CAAC,EAAE,OAAO,CAAC;YAClC,uBAAuB,CAAC,EAAE,OAAO,CAAC;SACnC,CAAC;QACF,mBAAmB,EAAE,MAAM,OAAO,CAAC;QACnC,kBAAkB,CAAC,EAAE,YAAY,CAAC;KACnC;IAsFY,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBrC,0BAA0B,CACrC,uBAAuB,EAAE,OAAO,GAC/B,OAAO,CAAC,IAAI,CAAC;IAMH,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoCnD;;;;;;OAMG;IACU,iBAAiB,CAC5B,IAAI,EAAE,gCAAgC,GACrC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBzB;;;;;;OAMG;IACU,kCAAkC,CAC7C,IAAI,EAAE,8BAA8B,GACnC,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IAgB3B;;;;;;;OAOG;IACU,iBAAiB,CAC5B,IAAI,EAAE,gCAAgC,EACtC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;IAchB;;;;;;;OAOG;IACU,sBAAsB,CACjC,IAAI,EAAE,8BAA8B,EACpC,MAAM,EAAE,CAAC,0BAA0B,EAAE,MAAM,CAAC,EAAE,GAC7C,OAAO,CAAC,IAAI,CAAC;IAchB;;;;;OAKG;IACU,oBAAoB,CAC/B,IAAI,EAAE,gCAAgC,GACrC,OAAO,CAAC,IAAI,CAAC;IAahB;;;;;;OAMG;IACU,qCAAqC,CAChD,IAAI,EAAE,8BAA8B,GACnC,OAAO,CAAC,IAAI,CAAC;IAahB;;;;OAIG;IACU,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAmF7C;;;;OAIG;IACG,mCAAmC,IAAI,OAAO,CAAC,IAAI,CAAC;IAuJ1D;;;OAGG;IACG,gCAAgC,CACpC,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,IAAI,CAAC;CAkBjB"}
@@ -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,7 +104,7 @@ 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);
@@ -159,6 +166,8 @@ class UserStorageController extends BaseController {
159
166
  _UserStorageController__snapSignMessageCache.set(this, {});
160
167
  __classPrivateFieldSet(this, _UserStorageController_config, config, "f");
161
168
  __classPrivateFieldGet(this, _UserStorageController_accounts, "f").isAccountSyncingEnabled = Boolean(env?.isAccountSyncingEnabled);
169
+ __classPrivateFieldGet(this, _UserStorageController_accounts, "f").maxNumberOfAccountsToAdd =
170
+ config?.accountSyncing?.maxNumberOfAccountsToAdd ?? 100;
162
171
  this.getMetaMetricsState = getMetaMetricsState;
163
172
  __classPrivateFieldGet(this, _UserStorageController_keyringController, "f").setupLockedStateSubscriptions();
164
173
  __classPrivateFieldGet(this, _UserStorageController_instances, "m", _UserStorageController_registerMessageHandlers).call(this);
@@ -352,7 +361,6 @@ class UserStorageController extends BaseController {
352
361
  }
353
362
  try {
354
363
  __classPrivateFieldGet(this, _UserStorageController_accounts, "f").isAccountSyncingInProgress = true;
355
- __classPrivateFieldGet(this, _UserStorageController_accounts, "f").addedAccountsCount = 0;
356
364
  const profileId = await __classPrivateFieldGet(this, _UserStorageController_auth, "f").getProfileId();
357
365
  const userStorageAccountsList = await __classPrivateFieldGet(this, _UserStorageController_accounts, "f").getUserStorageAccountsList();
358
366
  if (!userStorageAccountsList || !userStorageAccountsList.length) {
@@ -371,7 +379,7 @@ class UserStorageController extends BaseController {
371
379
  // We don't want to remove existing accounts for a user
372
380
  // so we only add new accounts if the user has more accounts than the internal accounts list
373
381
  if (!hasMoreInternalAccountsThanUserStorageAccounts) {
374
- const numberOfAccountsToAdd = userStorageAccountsList.length - internalAccountsList.length;
382
+ const numberOfAccountsToAdd = Math.min(userStorageAccountsList.length, __classPrivateFieldGet(this, _UserStorageController_accounts, "f").maxNumberOfAccountsToAdd) - internalAccountsList.length;
375
383
  // Create new accounts to match the user storage accounts list
376
384
  for (let i = 0; i < numberOfAccountsToAdd; i++) {
377
385
  await this.messagingSystem.call('KeyringController:addNewAccount');
@@ -1 +1 @@
1
- {"version":3,"file":"UserStorageController.mjs","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 /**\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 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.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 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.mjs","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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/profile-sync-controller",
3
- "version": "0.9.7",
3
+ "version": "0.9.8",
4
4
  "description": "The profile sync helps developers synchronize data across multiple clients and devices in a privacy-preserving way. All data saved in the user storage database is encrypted client-side to preserve privacy. The user storage provides a modular design, giving developers the flexibility to construct and manage their storage spaces in a way that best suits their needs",
5
5
  "keywords": [
6
6
  "MetaMask",
@@ -100,9 +100,10 @@
100
100
  "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch"
101
101
  },
102
102
  "dependencies": {
103
- "@metamask/base-controller": "^7.0.1",
103
+ "@metamask/base-controller": "^7.0.2",
104
104
  "@metamask/keyring-api": "^8.1.3",
105
- "@metamask/keyring-controller": "^17.2.2",
105
+ "@metamask/keyring-controller": "^17.3.1",
106
+ "@metamask/network-controller": "^22.0.1",
106
107
  "@metamask/snaps-sdk": "^6.5.0",
107
108
  "@metamask/snaps-utils": "^8.1.1",
108
109
  "@noble/ciphers": "^0.5.2",
@@ -113,9 +114,8 @@
113
114
  },
114
115
  "devDependencies": {
115
116
  "@lavamoat/allow-scripts": "^3.0.4",
116
- "@metamask/accounts-controller": "^18.2.2",
117
+ "@metamask/accounts-controller": "^18.2.3",
117
118
  "@metamask/auto-changelog": "^3.4.4",
118
- "@metamask/network-controller": "^21.0.1",
119
119
  "@metamask/snaps-controllers": "^9.7.0",
120
120
  "@types/jest": "^27.4.1",
121
121
  "deepmerge": "^4.2.2",
@@ -131,6 +131,7 @@
131
131
  "peerDependencies": {
132
132
  "@metamask/accounts-controller": "^18.1.1",
133
133
  "@metamask/keyring-controller": "^17.2.0",
134
+ "@metamask/network-controller": "^22.0.0",
134
135
  "@metamask/snaps-controllers": "^9.7.0"
135
136
  },
136
137
  "engines": {