@metamask-previews/account-tree-controller 7.5.3-preview-c97a549b1 → 7.5.3-preview-ef063ff2d
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 +2 -0
- package/dist/AccountTreeController.cjs +2 -0
- package/dist/AccountTreeController.cjs.map +1 -1
- package/dist/AccountTreeController.d.cts +0 -6
- package/dist/AccountTreeController.d.cts.map +1 -1
- package/dist/AccountTreeController.d.mts +0 -6
- package/dist/AccountTreeController.d.mts.map +1 -1
- package/dist/AccountTreeController.mjs +2 -0
- package/dist/AccountTreeController.mjs.map +1 -1
- package/dist/backup-and-sync/service/index.cjs +25 -5
- package/dist/backup-and-sync/service/index.cjs.map +1 -1
- package/dist/backup-and-sync/service/index.d.cts.map +1 -1
- package/dist/backup-and-sync/service/index.d.mts.map +1 -1
- package/dist/backup-and-sync/service/index.mjs +25 -5
- package/dist/backup-and-sync/service/index.mjs.map +1 -1
- package/dist/backup-and-sync/syncing/group.cjs +1 -0
- package/dist/backup-and-sync/syncing/group.cjs.map +1 -1
- package/dist/backup-and-sync/syncing/group.d.cts.map +1 -1
- package/dist/backup-and-sync/syncing/group.d.mts.map +1 -1
- package/dist/backup-and-sync/syncing/group.mjs +1 -0
- package/dist/backup-and-sync/syncing/group.mjs.map +1 -1
- package/dist/backup-and-sync/syncing/legacy.cjs +1 -0
- package/dist/backup-and-sync/syncing/legacy.cjs.map +1 -1
- package/dist/backup-and-sync/syncing/legacy.d.cts.map +1 -1
- package/dist/backup-and-sync/syncing/legacy.d.mts.map +1 -1
- package/dist/backup-and-sync/syncing/legacy.mjs +1 -0
- package/dist/backup-and-sync/syncing/legacy.mjs.map +1 -1
- package/dist/backup-and-sync/syncing/metadata.cjs +1 -0
- package/dist/backup-and-sync/syncing/metadata.cjs.map +1 -1
- package/dist/backup-and-sync/syncing/metadata.d.cts.map +1 -1
- package/dist/backup-and-sync/syncing/metadata.d.mts.map +1 -1
- package/dist/backup-and-sync/syncing/metadata.mjs +1 -0
- package/dist/backup-and-sync/syncing/metadata.mjs.map +1 -1
- package/dist/backup-and-sync/types.cjs.map +1 -1
- package/dist/backup-and-sync/types.d.cts +22 -0
- package/dist/backup-and-sync/types.d.cts.map +1 -1
- package/dist/backup-and-sync/types.d.mts +22 -0
- package/dist/backup-and-sync/types.d.mts.map +1 -1
- package/dist/backup-and-sync/types.mjs.map +1 -1
- package/dist/backup-and-sync/user-storage/network-operations.cjs +9 -3
- package/dist/backup-and-sync/user-storage/network-operations.cjs.map +1 -1
- package/dist/backup-and-sync/user-storage/network-operations.d.cts.map +1 -1
- package/dist/backup-and-sync/user-storage/network-operations.d.mts.map +1 -1
- package/dist/backup-and-sync/user-storage/network-operations.mjs +9 -3
- package/dist/backup-and-sync/user-storage/network-operations.mjs.map +1 -1
- package/dist/backup-and-sync/utils/index.cjs +3 -1
- package/dist/backup-and-sync/utils/index.cjs.map +1 -1
- package/dist/backup-and-sync/utils/index.d.cts +1 -0
- package/dist/backup-and-sync/utils/index.d.cts.map +1 -1
- package/dist/backup-and-sync/utils/index.d.mts +1 -0
- package/dist/backup-and-sync/utils/index.d.mts.map +1 -1
- package/dist/backup-and-sync/utils/index.mjs +1 -0
- package/dist/backup-and-sync/utils/index.mjs.map +1 -1
- package/dist/backup-and-sync/utils/mutation-tracker.cjs +29 -0
- package/dist/backup-and-sync/utils/mutation-tracker.cjs.map +1 -0
- package/dist/backup-and-sync/utils/mutation-tracker.d.cts +9 -0
- package/dist/backup-and-sync/utils/mutation-tracker.d.cts.map +1 -0
- package/dist/backup-and-sync/utils/mutation-tracker.d.mts +9 -0
- package/dist/backup-and-sync/utils/mutation-tracker.d.mts.map +1 -0
- package/dist/backup-and-sync/utils/mutation-tracker.mjs +25 -0
- package/dist/backup-and-sync/utils/mutation-tracker.mjs.map +1 -0
- package/package.json +2 -2
|
@@ -53,6 +53,7 @@ export const performLegacyAccountSyncing = async (context, entropySourceId, prof
|
|
|
53
53
|
const localGroup = localAccountGroups.find((group) => group.accounts.includes(localAccountId));
|
|
54
54
|
if (localGroup) {
|
|
55
55
|
context.controller.setAccountGroupName(localGroup.id, n, true);
|
|
56
|
+
context.mutationTracker?.setLocalWrite(true);
|
|
56
57
|
context.emitAnalyticsEventFn({
|
|
57
58
|
action: BackupAndSyncAnalyticsEvent.LegacyGroupRenamed,
|
|
58
59
|
profileId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legacy.mjs","sourceRoot":"","sources":["../../../src/backup-and-sync/syncing/legacy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,8BAA8B;AACpE,OAAO,EAAE,iCAAiC,EAAE,sCAAsC;AAElF,OAAO,EAAE,mBAAmB,EAAE,yBAAqB;AACnD,OAAO,EAAE,2BAA2B,EAAE,+BAAqB;AAG3D,OAAO,EAAE,+BAA+B,EAAE,kCAAwB;AAClE,OAAO,EAAE,8BAA8B,EAAE,2BAAiB;AAC1D,OAAO,EAAE,kCAAkC,EAAE,oBAAgB;AAE7D;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,EAC9C,OAA6B,EAC7B,eAAuB,EACvB,SAAoB,EACL,EAAE;IACjB,qCAAqC;IACrC,MAAM,6BAA6B,GAAG,MAAM,+BAA+B,CACzE,OAAO,EACP,eAAe,CAChB,CAAC;IACF,IAAI,6BAA6B,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,mBAAmB,CAAC,qDAAqD,CAAC,CAAC;QAE3E,OAAO,CAAC,oBAAoB,CAAC;YAC3B,MAAM,EAAE,2BAA2B,CAAC,iBAAiB;YACrD,SAAS;SACV,CAAC,CAAC;QAEH,OAAO;IACT,CAAC;IAED,uCAAuC;IACvC,MAAM,6BAA6B,GAAG,6BAA6B,CAAC,MAAM,CAAC;IAE3E,mBAAmB,CACjB,YAAY,6BAA6B,qCAAqC,CAC/E,CAAC;IAEF,IAAI,6BAA6B,GAAG,CAAC,EAAE,CAAC;QACtC,oEAAoE;QACpE,0CAA0C;QAC1C,6CAA6C;QAC7C,MAAM,aAAa,GAAG,6BAA6B,GAAG,CAAC,CAAC,CAAC,6BAA6B;QACtF,MAAM,kCAAkC,CACtC,OAAO,EACP,eAAe,EACf,aAAa,EACb,SAAS,EACT,2BAA2B,CAAC,2BAA2B,CACxD,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,MAAM,kBAAkB,GAAG,8BAA8B,CACvD,OAAO,EACP,2BAA2B,CAAC,eAAe,CAAC,CAC7C,CAAC;IACF,KAAK,MAAM,aAAa,IAAI,6BAA6B,EAAE,CAAC;QAC1D,UAAU;QACV,iBAAiB;QACjB,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,aAAa,CAAC;QAC/B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACb,mBAAmB,CACjB,qEAAqE,IAAI,CAAC,SAAS,CACjF,aAAa,CACd,EAAE,CACJ,CAAC;YACF,SAAS;QACX,CAAC;QAED,IAAI,CAAC,EAAE,CAAC;YACN,4DAA4D;YAC5D,MAAM,cAAc,GAAG,iCAAiC,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACnD,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CACxC,CAAC;YACF,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"legacy.mjs","sourceRoot":"","sources":["../../../src/backup-and-sync/syncing/legacy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,8BAA8B;AACpE,OAAO,EAAE,iCAAiC,EAAE,sCAAsC;AAElF,OAAO,EAAE,mBAAmB,EAAE,yBAAqB;AACnD,OAAO,EAAE,2BAA2B,EAAE,+BAAqB;AAG3D,OAAO,EAAE,+BAA+B,EAAE,kCAAwB;AAClE,OAAO,EAAE,8BAA8B,EAAE,2BAAiB;AAC1D,OAAO,EAAE,kCAAkC,EAAE,oBAAgB;AAE7D;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,EAC9C,OAA6B,EAC7B,eAAuB,EACvB,SAAoB,EACL,EAAE;IACjB,qCAAqC;IACrC,MAAM,6BAA6B,GAAG,MAAM,+BAA+B,CACzE,OAAO,EACP,eAAe,CAChB,CAAC;IACF,IAAI,6BAA6B,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,mBAAmB,CAAC,qDAAqD,CAAC,CAAC;QAE3E,OAAO,CAAC,oBAAoB,CAAC;YAC3B,MAAM,EAAE,2BAA2B,CAAC,iBAAiB;YACrD,SAAS;SACV,CAAC,CAAC;QAEH,OAAO;IACT,CAAC;IAED,uCAAuC;IACvC,MAAM,6BAA6B,GAAG,6BAA6B,CAAC,MAAM,CAAC;IAE3E,mBAAmB,CACjB,YAAY,6BAA6B,qCAAqC,CAC/E,CAAC;IAEF,IAAI,6BAA6B,GAAG,CAAC,EAAE,CAAC;QACtC,oEAAoE;QACpE,0CAA0C;QAC1C,6CAA6C;QAC7C,MAAM,aAAa,GAAG,6BAA6B,GAAG,CAAC,CAAC,CAAC,6BAA6B;QACtF,MAAM,kCAAkC,CACtC,OAAO,EACP,eAAe,EACf,aAAa,EACb,SAAS,EACT,2BAA2B,CAAC,2BAA2B,CACxD,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,MAAM,kBAAkB,GAAG,8BAA8B,CACvD,OAAO,EACP,2BAA2B,CAAC,eAAe,CAAC,CAC7C,CAAC;IACF,KAAK,MAAM,aAAa,IAAI,6BAA6B,EAAE,CAAC;QAC1D,UAAU;QACV,iBAAiB;QACjB,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,aAAa,CAAC;QAC/B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACb,mBAAmB,CACjB,qEAAqE,IAAI,CAAC,SAAS,CACjF,aAAa,CACd,EAAE,CACJ,CAAC;YACF,SAAS;QACX,CAAC;QAED,IAAI,CAAC,EAAE,CAAC;YACN,4DAA4D;YAC5D,MAAM,cAAc,GAAG,iCAAiC,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACnD,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CACxC,CAAC;YACF,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC/D,OAAO,CAAC,eAAe,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;gBAE7C,OAAO,CAAC,oBAAoB,CAAC;oBAC3B,MAAM,EAAE,2BAA2B,CAAC,kBAAkB;oBACtD,SAAS;oBACT,qBAAqB,EAAE,wBAAwB,UAAU,CAAC,EAAE,OAAO,CAAC,EAAE;iBACvE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,oBAAoB,CAAC;QAC3B,MAAM,EAAE,2BAA2B,CAAC,iBAAiB;QACrD,SAAS;KACV,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { toMultichainAccountWalletId } from '@metamask/account-api';\nimport { getUUIDFromAddressOfNormalAccount } from '@metamask/accounts-controller';\n\nimport { backupAndSyncLogger } from '../../logger';\nimport { BackupAndSyncAnalyticsEvent } from '../analytics';\nimport type { ProfileId } from '../authentication';\nimport type { BackupAndSyncContext } from '../types';\nimport { getAllLegacyUserStorageAccounts } from '../user-storage';\nimport { getLocalGroupsForEntropyWallet } from '../utils';\nimport { createMultichainAccountGroupsBatch } from './group';\n\n/**\n * Performs a stripped down version of legacy account syncing, replacing the current\n * UserStorageController:syncInternalAccountsWithUserStorage call.\n * This ensures legacy (V1) account syncing data is correctly migrated to\n * the new AccountTreeController data structure. It should only happen\n * once per wallet.\n *\n * @param context - The sync context containing controller and messenger.\n * @param entropySourceId - The entropy source ID.\n * @param profileId - The profile ID for analytics.\n */\nexport const performLegacyAccountSyncing = async (\n context: BackupAndSyncContext,\n entropySourceId: string,\n profileId: ProfileId,\n): Promise<void> => {\n // 1. Get legacy account syncing data\n const legacyAccountsFromUserStorage = await getAllLegacyUserStorageAccounts(\n context,\n entropySourceId,\n );\n if (legacyAccountsFromUserStorage.length === 0) {\n backupAndSyncLogger('No legacy accounts, skipping legacy account syncing');\n\n context.emitAnalyticsEventFn({\n action: BackupAndSyncAnalyticsEvent.LegacySyncingDone,\n profileId,\n });\n\n return;\n }\n\n // 2. Create account groups accordingly\n const numberOfAccountGroupsToCreate = legacyAccountsFromUserStorage.length;\n\n backupAndSyncLogger(\n `Creating ${numberOfAccountGroupsToCreate} account groups for legacy accounts`,\n );\n\n if (numberOfAccountGroupsToCreate > 0) {\n // Creating multichain account group is idempotent, so we can safely\n // re-create every groups starting from 0.\n // Use batch creation for better performance.\n const maxGroupIndex = numberOfAccountGroupsToCreate - 1; // Group index is zero-based.\n await createMultichainAccountGroupsBatch(\n context,\n entropySourceId,\n maxGroupIndex,\n profileId,\n BackupAndSyncAnalyticsEvent.LegacyGroupAddedFromAccount,\n );\n }\n\n // 3. Rename account groups if needed\n const localAccountGroups = getLocalGroupsForEntropyWallet(\n context,\n toMultichainAccountWalletId(entropySourceId),\n );\n for (const legacyAccount of legacyAccountsFromUserStorage) {\n // n: name\n // a: EVM address\n const { n, a } = legacyAccount;\n if (!a || !n) {\n backupAndSyncLogger(\n `Legacy account data is missing name or address, skipping account: ${JSON.stringify(\n legacyAccount,\n )}`,\n );\n continue;\n }\n\n if (n) {\n // Find the local group that corresponds to this EVM address\n const localAccountId = getUUIDFromAddressOfNormalAccount(a);\n const localGroup = localAccountGroups.find((group) =>\n group.accounts.includes(localAccountId),\n );\n if (localGroup) {\n context.controller.setAccountGroupName(localGroup.id, n, true);\n context.mutationTracker?.setLocalWrite(true);\n\n context.emitAnalyticsEventFn({\n action: BackupAndSyncAnalyticsEvent.LegacyGroupRenamed,\n profileId,\n additionalDescription: `Renamed legacy group ${localGroup.id} to ${n}`,\n });\n }\n }\n }\n\n context.emitAnalyticsEventFn({\n action: BackupAndSyncAnalyticsEvent.LegacySyncingDone,\n profileId,\n });\n};\n"]}
|
|
@@ -40,6 +40,7 @@ async function compareAndSyncMetadata({ context, localMetadata, userStorageMetad
|
|
|
40
40
|
if ((isUserStorageMoreRecent || !localMetadata) && isUserStorageValueValid) {
|
|
41
41
|
// User storage is more recent and valid, apply it locally
|
|
42
42
|
await applyLocalUpdate(userStorageValue);
|
|
43
|
+
context.mutationTracker?.setLocalWrite(true);
|
|
43
44
|
// Emit analytics event if provided
|
|
44
45
|
if (analytics) {
|
|
45
46
|
context.emitAnalyticsEventFn({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.cjs","sourceRoot":"","sources":["../../../src/backup-and-sync/syncing/metadata.ts"],"names":[],"mappings":";;;;;;AAAA,sEAAwC;AAMxC;;;;;;;;;;;;;;;;;GAiBG;AACI,KAAK,UAAU,sBAAsB,CAAI,EAC9C,OAAO,EACP,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,SAAS,GAWV;IACC,MAAM,UAAU,GAAG,aAAa,EAAE,KAAK,CAAC;IACxC,MAAM,cAAc,GAAG,aAAa,EAAE,aAAa,CAAC;IACpD,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,KAAK,CAAC;IACpD,MAAM,oBAAoB,GAAG,mBAAmB,EAAE,aAAa,CAAC;IAEhE,MAAM,WAAW,GAAG,IAAA,yBAAS,EAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;IAE5D,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC,CAAC,sCAAsC;IACtD,CAAC;IAED,MAAM,uBAAuB,GAC3B,cAAc,KAAK,SAAS;QAC5B,oBAAoB,KAAK,SAAS;QAClC,cAAc,GAAG,oBAAoB,CAAC;IAExC,2DAA2D;IAC3D,MAAM,uBAAuB,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;IAE3E,IAAI,CAAC,uBAAuB,IAAI,CAAC,aAAa,CAAC,IAAI,uBAAuB,EAAE,CAAC;QAC3E,0DAA0D;QAC1D,MAAM,gBAAgB,CAAC,gBAAqB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"metadata.cjs","sourceRoot":"","sources":["../../../src/backup-and-sync/syncing/metadata.ts"],"names":[],"mappings":";;;;;;AAAA,sEAAwC;AAMxC;;;;;;;;;;;;;;;;;GAiBG;AACI,KAAK,UAAU,sBAAsB,CAAI,EAC9C,OAAO,EACP,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,SAAS,GAWV;IACC,MAAM,UAAU,GAAG,aAAa,EAAE,KAAK,CAAC;IACxC,MAAM,cAAc,GAAG,aAAa,EAAE,aAAa,CAAC;IACpD,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,KAAK,CAAC;IACpD,MAAM,oBAAoB,GAAG,mBAAmB,EAAE,aAAa,CAAC;IAEhE,MAAM,WAAW,GAAG,IAAA,yBAAS,EAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;IAE5D,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC,CAAC,sCAAsC;IACtD,CAAC;IAED,MAAM,uBAAuB,GAC3B,cAAc,KAAK,SAAS;QAC5B,oBAAoB,KAAK,SAAS;QAClC,cAAc,GAAG,oBAAoB,CAAC;IAExC,2DAA2D;IAC3D,MAAM,uBAAuB,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;IAE3E,IAAI,CAAC,uBAAuB,IAAI,CAAC,aAAa,CAAC,IAAI,uBAAuB,EAAE,CAAC;QAC3E,0DAA0D;QAC1D,MAAM,gBAAgB,CAAC,gBAAqB,CAAC,CAAC;QAC9C,OAAO,CAAC,eAAe,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;QAE7C,mCAAmC;QACnC,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,oBAAoB,CAAC;gBAC3B,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,SAAS,EAAE,SAAS,CAAC,SAAS;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC,CAAC,0DAA0D;IAC1E,CAAC;IAED,OAAO,IAAI,CAAC,CAAC,+EAA+E;AAC9F,CAAC;AAtDD,wDAsDC","sourcesContent":["import deepEqual from 'fast-deep-equal';\n\nimport type { BackupAndSyncAnalyticsAction } from '../analytics';\nimport type { ProfileId } from '../authentication';\nimport type { BackupAndSyncContext } from '../types';\n\n/**\n * Compares metadata between local and user storage, applying the most recent version.\n *\n * @param options - Configuration object for metadata comparison.\n * @param options.context - The backup and sync context containing controller and messenger.\n * @param options.localMetadata - The local metadata object.\n * @param options.localMetadata.value - The local metadata value.\n * @param options.localMetadata.lastUpdatedAt - The local metadata timestamp.\n * @param options.userStorageMetadata - The user storage metadata object.\n * @param options.userStorageMetadata.value - The user storage metadata value.\n * @param options.userStorageMetadata.lastUpdatedAt - The user storage metadata timestamp.\n * @param options.applyLocalUpdate - Function to apply the user storage value locally.\n * @param options.validateUserStorageValue - Function to validate user storage data.\n * @param options.analytics - Optional analytics configuration for tracking updates.\n * @param options.analytics.action - The analytics action for the event.\n * @param options.analytics.profileId - The profile ID for analytics.\n * @returns Promise resolving to true if local data should be pushed to user storage.\n */\nexport async function compareAndSyncMetadata<T>({\n context,\n localMetadata,\n userStorageMetadata,\n applyLocalUpdate,\n validateUserStorageValue,\n analytics,\n}: {\n context: BackupAndSyncContext;\n localMetadata?: { value?: T; lastUpdatedAt?: number };\n userStorageMetadata?: { value?: T; lastUpdatedAt?: number };\n applyLocalUpdate: (value: T) => Promise<void> | void;\n validateUserStorageValue: (value: T | undefined) => boolean;\n analytics?: {\n action: BackupAndSyncAnalyticsAction;\n profileId: ProfileId;\n };\n}): Promise<boolean> {\n const localValue = localMetadata?.value;\n const localTimestamp = localMetadata?.lastUpdatedAt;\n const userStorageValue = userStorageMetadata?.value;\n const userStorageTimestamp = userStorageMetadata?.lastUpdatedAt;\n\n const isSameValue = deepEqual(localValue, userStorageValue);\n\n if (isSameValue) {\n return false; // No sync needed, values are the same\n }\n\n const isUserStorageMoreRecent =\n localTimestamp !== undefined &&\n userStorageTimestamp !== undefined &&\n localTimestamp < userStorageTimestamp;\n\n // Validate user storage value using the provided validator\n const isUserStorageValueValid = validateUserStorageValue(userStorageValue);\n\n if ((isUserStorageMoreRecent || !localMetadata) && isUserStorageValueValid) {\n // User storage is more recent and valid, apply it locally\n await applyLocalUpdate(userStorageValue as T);\n context.mutationTracker?.setLocalWrite(true);\n\n // Emit analytics event if provided\n if (analytics) {\n context.emitAnalyticsEventFn({\n action: analytics.action,\n profileId: analytics.profileId,\n });\n }\n\n return false; // Don't push to user storage since we just pulled from it\n }\n\n return true; // Local is more recent or user storage is invalid, should push to user storage\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.d.cts","sourceRoot":"","sources":["../../../src/backup-and-sync/syncing/metadata.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,4BAA4B,EAAE,+BAAqB;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,oCAA0B;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAiB;AAErD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,EAC9C,OAAO,EACP,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,SAAS,GACV,EAAE;IACD,OAAO,EAAE,oBAAoB,CAAC;IAC9B,aAAa,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,mBAAmB,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5D,gBAAgB,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACrD,wBAAwB,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,KAAK,OAAO,CAAC;IAC5D,SAAS,CAAC,EAAE;QACV,MAAM,EAAE,4BAA4B,CAAC;QACrC,SAAS,EAAE,SAAS,CAAC;KACtB,CAAC;CACH,GAAG,OAAO,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"metadata.d.cts","sourceRoot":"","sources":["../../../src/backup-and-sync/syncing/metadata.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,4BAA4B,EAAE,+BAAqB;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,oCAA0B;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAiB;AAErD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,EAC9C,OAAO,EACP,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,SAAS,GACV,EAAE;IACD,OAAO,EAAE,oBAAoB,CAAC;IAC9B,aAAa,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,mBAAmB,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5D,gBAAgB,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACrD,wBAAwB,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,KAAK,OAAO,CAAC;IAC5D,SAAS,CAAC,EAAE;QACV,MAAM,EAAE,4BAA4B,CAAC;QACrC,SAAS,EAAE,SAAS,CAAC;KACtB,CAAC;CACH,GAAG,OAAO,CAAC,OAAO,CAAC,CAqCnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.d.mts","sourceRoot":"","sources":["../../../src/backup-and-sync/syncing/metadata.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,4BAA4B,EAAE,+BAAqB;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,oCAA0B;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAiB;AAErD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,EAC9C,OAAO,EACP,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,SAAS,GACV,EAAE;IACD,OAAO,EAAE,oBAAoB,CAAC;IAC9B,aAAa,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,mBAAmB,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5D,gBAAgB,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACrD,wBAAwB,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,KAAK,OAAO,CAAC;IAC5D,SAAS,CAAC,EAAE;QACV,MAAM,EAAE,4BAA4B,CAAC;QACrC,SAAS,EAAE,SAAS,CAAC;KACtB,CAAC;CACH,GAAG,OAAO,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"metadata.d.mts","sourceRoot":"","sources":["../../../src/backup-and-sync/syncing/metadata.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,4BAA4B,EAAE,+BAAqB;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,oCAA0B;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAiB;AAErD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,EAC9C,OAAO,EACP,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,SAAS,GACV,EAAE;IACD,OAAO,EAAE,oBAAoB,CAAC;IAC9B,aAAa,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,mBAAmB,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5D,gBAAgB,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACrD,wBAAwB,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,KAAK,OAAO,CAAC;IAC5D,SAAS,CAAC,EAAE;QACV,MAAM,EAAE,4BAA4B,CAAC;QACrC,SAAS,EAAE,SAAS,CAAC;KACtB,CAAC;CACH,GAAG,OAAO,CAAC,OAAO,CAAC,CAqCnB"}
|
|
@@ -41,6 +41,7 @@ export async function compareAndSyncMetadata({ context, localMetadata, userStora
|
|
|
41
41
|
if ((isUserStorageMoreRecent || !localMetadata) && isUserStorageValueValid) {
|
|
42
42
|
// User storage is more recent and valid, apply it locally
|
|
43
43
|
await applyLocalUpdate(userStorageValue);
|
|
44
|
+
context.mutationTracker?.setLocalWrite(true);
|
|
44
45
|
// Emit analytics event if provided
|
|
45
46
|
if (analytics) {
|
|
46
47
|
context.emitAnalyticsEventFn({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.mjs","sourceRoot":"","sources":["../../../src/backup-and-sync/syncing/metadata.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,UAAS,wBAAwB;;AAMxC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAI,EAC9C,OAAO,EACP,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,SAAS,GAWV;IACC,MAAM,UAAU,GAAG,aAAa,EAAE,KAAK,CAAC;IACxC,MAAM,cAAc,GAAG,aAAa,EAAE,aAAa,CAAC;IACpD,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,KAAK,CAAC;IACpD,MAAM,oBAAoB,GAAG,mBAAmB,EAAE,aAAa,CAAC;IAEhE,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;IAE5D,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC,CAAC,sCAAsC;IACtD,CAAC;IAED,MAAM,uBAAuB,GAC3B,cAAc,KAAK,SAAS;QAC5B,oBAAoB,KAAK,SAAS;QAClC,cAAc,GAAG,oBAAoB,CAAC;IAExC,2DAA2D;IAC3D,MAAM,uBAAuB,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;IAE3E,IAAI,CAAC,uBAAuB,IAAI,CAAC,aAAa,CAAC,IAAI,uBAAuB,EAAE,CAAC;QAC3E,0DAA0D;QAC1D,MAAM,gBAAgB,CAAC,gBAAqB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"metadata.mjs","sourceRoot":"","sources":["../../../src/backup-and-sync/syncing/metadata.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,UAAS,wBAAwB;;AAMxC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAI,EAC9C,OAAO,EACP,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,SAAS,GAWV;IACC,MAAM,UAAU,GAAG,aAAa,EAAE,KAAK,CAAC;IACxC,MAAM,cAAc,GAAG,aAAa,EAAE,aAAa,CAAC;IACpD,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,KAAK,CAAC;IACpD,MAAM,oBAAoB,GAAG,mBAAmB,EAAE,aAAa,CAAC;IAEhE,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;IAE5D,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC,CAAC,sCAAsC;IACtD,CAAC;IAED,MAAM,uBAAuB,GAC3B,cAAc,KAAK,SAAS;QAC5B,oBAAoB,KAAK,SAAS;QAClC,cAAc,GAAG,oBAAoB,CAAC;IAExC,2DAA2D;IAC3D,MAAM,uBAAuB,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;IAE3E,IAAI,CAAC,uBAAuB,IAAI,CAAC,aAAa,CAAC,IAAI,uBAAuB,EAAE,CAAC;QAC3E,0DAA0D;QAC1D,MAAM,gBAAgB,CAAC,gBAAqB,CAAC,CAAC;QAC9C,OAAO,CAAC,eAAe,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;QAE7C,mCAAmC;QACnC,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,oBAAoB,CAAC;gBAC3B,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,SAAS,EAAE,SAAS,CAAC,SAAS;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC,CAAC,0DAA0D;IAC1E,CAAC;IAED,OAAO,IAAI,CAAC,CAAC,+EAA+E;AAC9F,CAAC","sourcesContent":["import deepEqual from 'fast-deep-equal';\n\nimport type { BackupAndSyncAnalyticsAction } from '../analytics';\nimport type { ProfileId } from '../authentication';\nimport type { BackupAndSyncContext } from '../types';\n\n/**\n * Compares metadata between local and user storage, applying the most recent version.\n *\n * @param options - Configuration object for metadata comparison.\n * @param options.context - The backup and sync context containing controller and messenger.\n * @param options.localMetadata - The local metadata object.\n * @param options.localMetadata.value - The local metadata value.\n * @param options.localMetadata.lastUpdatedAt - The local metadata timestamp.\n * @param options.userStorageMetadata - The user storage metadata object.\n * @param options.userStorageMetadata.value - The user storage metadata value.\n * @param options.userStorageMetadata.lastUpdatedAt - The user storage metadata timestamp.\n * @param options.applyLocalUpdate - Function to apply the user storage value locally.\n * @param options.validateUserStorageValue - Function to validate user storage data.\n * @param options.analytics - Optional analytics configuration for tracking updates.\n * @param options.analytics.action - The analytics action for the event.\n * @param options.analytics.profileId - The profile ID for analytics.\n * @returns Promise resolving to true if local data should be pushed to user storage.\n */\nexport async function compareAndSyncMetadata<T>({\n context,\n localMetadata,\n userStorageMetadata,\n applyLocalUpdate,\n validateUserStorageValue,\n analytics,\n}: {\n context: BackupAndSyncContext;\n localMetadata?: { value?: T; lastUpdatedAt?: number };\n userStorageMetadata?: { value?: T; lastUpdatedAt?: number };\n applyLocalUpdate: (value: T) => Promise<void> | void;\n validateUserStorageValue: (value: T | undefined) => boolean;\n analytics?: {\n action: BackupAndSyncAnalyticsAction;\n profileId: ProfileId;\n };\n}): Promise<boolean> {\n const localValue = localMetadata?.value;\n const localTimestamp = localMetadata?.lastUpdatedAt;\n const userStorageValue = userStorageMetadata?.value;\n const userStorageTimestamp = userStorageMetadata?.lastUpdatedAt;\n\n const isSameValue = deepEqual(localValue, userStorageValue);\n\n if (isSameValue) {\n return false; // No sync needed, values are the same\n }\n\n const isUserStorageMoreRecent =\n localTimestamp !== undefined &&\n userStorageTimestamp !== undefined &&\n localTimestamp < userStorageTimestamp;\n\n // Validate user storage value using the provided validator\n const isUserStorageValueValid = validateUserStorageValue(userStorageValue);\n\n if ((isUserStorageMoreRecent || !localMetadata) && isUserStorageValueValid) {\n // User storage is more recent and valid, apply it locally\n await applyLocalUpdate(userStorageValue as T);\n context.mutationTracker?.setLocalWrite(true);\n\n // Emit analytics event if provided\n if (analytics) {\n context.emitAnalyticsEventFn({\n action: analytics.action,\n profileId: analytics.profileId,\n });\n }\n\n return false; // Don't push to user storage since we just pulled from it\n }\n\n return true; // Local is more recent or user storage is invalid, should push to user storage\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.cjs","sourceRoot":"","sources":["../../src/backup-and-sync/types.ts"],"names":[],"mappings":";;;AAQA,uDAM+B;AAa/B;;;;;GAKG;AACH,MAAM,oBAAoB,GAAG,CAAI,WAAsB,EAAE,EAAE,CACzD,IAAA,oBAAM,EAAC;IACL,KAAK,EAAE,WAAW;IAClB,aAAa,EAAE,IAAA,oBAAM,GAAE;CACxB,CAAC,CAAC;AAEL;;GAEG;AACU,QAAA,6BAA6B,GAAG,IAAA,oBAAM,EAAC;IAClD,IAAI,EAAE,IAAA,sBAAQ,EAAC,oBAAoB,CAAC,IAAA,oBAAM,GAAE,CAAC,CAAC;IAC9C,8BAA8B,EAAE,IAAA,sBAAQ,EAAC,IAAA,qBAAO,GAAE,CAAC;CACpD,CAAC,CAAC;AAEH;;GAEG;AACU,QAAA,kCAAkC,GAAG,IAAA,oBAAM,EAAC;IACvD,IAAI,EAAE,IAAA,sBAAQ,EAAC,oBAAoB,CAAC,IAAA,oBAAM,GAAE,CAAC,CAAC;IAC9C,MAAM,EAAE,IAAA,sBAAQ,EAAC,oBAAoB,CAAC,IAAA,qBAAO,GAAE,CAAC,CAAC;IACjD,MAAM,EAAE,IAAA,sBAAQ,EAAC,oBAAoB,CAAC,IAAA,qBAAO,GAAE,CAAC,CAAC;IACjD,UAAU,EAAE,IAAA,oBAAM,GAAE;CACrB,CAAC,CAAC;AAEH;;GAEG;AACU,QAAA,oCAAoC,GAAG,IAAA,oBAAM,EAAC;IACzD,CAAC,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;IACrB,CAAC,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;IACrB,CAAC,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;IACrB,CAAC,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;IACrB,GAAG,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;CACxB,CAAC,CAAC","sourcesContent":["import type {\n AccountGroupId,\n AccountGroupType,\n AccountWalletId,\n AccountWalletType,\n} from '@metamask/account-api';\nimport type { TraceCallback } from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport {\n object,\n string,\n boolean,\n number,\n optional,\n} from '@metamask/superstruct';\nimport type { Infer, Struct } from '@metamask/superstruct';\n\nimport type { AccountTreeController } from '../AccountTreeController';\nimport type {\n AccountGroupMultichainAccountObject,\n AccountTreeGroupPersistedMetadata,\n} from '../group';\nimport type { RuleResult } from '../rule';\nimport type { AccountTreeControllerMessenger } from '../types';\nimport type { AccountTreeWalletPersistedMetadata } from '../wallet';\nimport type { BackupAndSyncEmitAnalyticsEventParams } from './analytics';\n\n/**\n * Schema for an updatable field with value and timestamp.\n *\n * @param valueSchema - The schema for the value field.\n * @returns A superstruct schema for an updatable field.\n */\nconst UpdatableFieldSchema = <T>(valueSchema: Struct<T>) =>\n object({\n value: valueSchema,\n lastUpdatedAt: number(),\n });\n\n/**\n * Superstruct schema for UserStorageSyncedWallet validation.\n */\nexport const UserStorageSyncedWalletSchema = object({\n name: optional(UpdatableFieldSchema(string())),\n isLegacyAccountSyncingDisabled: optional(boolean()),\n});\n\n/**\n * Superstruct schema for UserStorageSyncedWalletGroup validation.\n */\nexport const UserStorageSyncedWalletGroupSchema = object({\n name: optional(UpdatableFieldSchema(string())),\n pinned: optional(UpdatableFieldSchema(boolean())),\n hidden: optional(UpdatableFieldSchema(boolean())),\n groupIndex: number(),\n});\n\n/**\n * Superstruct schema for LegacyUserStorageSyncedAccount validation.\n */\nexport const LegacyUserStorageSyncedAccountSchema = object({\n v: optional(string()),\n i: optional(string()),\n a: optional(string()),\n n: optional(string()),\n nlu: optional(number()),\n});\n\nexport type UserStorageSyncedWallet = AccountTreeWalletPersistedMetadata &\n Infer<typeof UserStorageSyncedWalletSchema>;\n\nexport type UserStorageSyncedWalletGroup = AccountTreeGroupPersistedMetadata & {\n groupIndex: AccountGroupMultichainAccountObject['metadata']['entropy']['groupIndex'];\n} & Infer<typeof UserStorageSyncedWalletGroupSchema>;\n\nexport type LegacyUserStorageSyncedAccount = Infer<\n typeof LegacyUserStorageSyncedAccountSchema\n>;\n\nexport type BackupAndSyncContext = {\n messenger: AccountTreeControllerMessenger;\n controller: AccountTreeController;\n controllerStateUpdateFn: AccountTreeController['update'];\n traceFn: TraceCallback;\n groupIdToWalletId: Map<AccountGroupId, AccountWalletId>;\n emitAnalyticsEventFn: (event: BackupAndSyncEmitAnalyticsEventParams) => void;\n};\n\nexport type LegacyAccountSyncingContext = {\n listAccounts: () => InternalAccount[];\n getEntropyRule: () => {\n match: (\n account: InternalAccount,\n ) =>\n | RuleResult<\n AccountWalletType.Entropy,\n AccountGroupType.MultichainAccount\n >\n | undefined;\n };\n};\n\nexport type AtomicSyncEvent = {\n execute: () => Promise<void>;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"types.cjs","sourceRoot":"","sources":["../../src/backup-and-sync/types.ts"],"names":[],"mappings":";;;AAQA,uDAM+B;AAa/B;;;;;GAKG;AACH,MAAM,oBAAoB,GAAG,CAAI,WAAsB,EAAE,EAAE,CACzD,IAAA,oBAAM,EAAC;IACL,KAAK,EAAE,WAAW;IAClB,aAAa,EAAE,IAAA,oBAAM,GAAE;CACxB,CAAC,CAAC;AAEL;;GAEG;AACU,QAAA,6BAA6B,GAAG,IAAA,oBAAM,EAAC;IAClD,IAAI,EAAE,IAAA,sBAAQ,EAAC,oBAAoB,CAAC,IAAA,oBAAM,GAAE,CAAC,CAAC;IAC9C,8BAA8B,EAAE,IAAA,sBAAQ,EAAC,IAAA,qBAAO,GAAE,CAAC;CACpD,CAAC,CAAC;AAEH;;GAEG;AACU,QAAA,kCAAkC,GAAG,IAAA,oBAAM,EAAC;IACvD,IAAI,EAAE,IAAA,sBAAQ,EAAC,oBAAoB,CAAC,IAAA,oBAAM,GAAE,CAAC,CAAC;IAC9C,MAAM,EAAE,IAAA,sBAAQ,EAAC,oBAAoB,CAAC,IAAA,qBAAO,GAAE,CAAC,CAAC;IACjD,MAAM,EAAE,IAAA,sBAAQ,EAAC,oBAAoB,CAAC,IAAA,qBAAO,GAAE,CAAC,CAAC;IACjD,UAAU,EAAE,IAAA,oBAAM,GAAE;CACrB,CAAC,CAAC;AAEH;;GAEG;AACU,QAAA,oCAAoC,GAAG,IAAA,oBAAM,EAAC;IACzD,CAAC,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;IACrB,CAAC,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;IACrB,CAAC,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;IACrB,CAAC,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;IACrB,GAAG,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;CACxB,CAAC,CAAC","sourcesContent":["import type {\n AccountGroupId,\n AccountGroupType,\n AccountWalletId,\n AccountWalletType,\n} from '@metamask/account-api';\nimport type { TraceCallback } from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport {\n object,\n string,\n boolean,\n number,\n optional,\n} from '@metamask/superstruct';\nimport type { Infer, Struct } from '@metamask/superstruct';\n\nimport type { AccountTreeController } from '../AccountTreeController';\nimport type {\n AccountGroupMultichainAccountObject,\n AccountTreeGroupPersistedMetadata,\n} from '../group';\nimport type { RuleResult } from '../rule';\nimport type { AccountTreeControllerMessenger } from '../types';\nimport type { AccountTreeWalletPersistedMetadata } from '../wallet';\nimport type { BackupAndSyncEmitAnalyticsEventParams } from './analytics';\n\n/**\n * Schema for an updatable field with value and timestamp.\n *\n * @param valueSchema - The schema for the value field.\n * @returns A superstruct schema for an updatable field.\n */\nconst UpdatableFieldSchema = <T>(valueSchema: Struct<T>) =>\n object({\n value: valueSchema,\n lastUpdatedAt: number(),\n });\n\n/**\n * Superstruct schema for UserStorageSyncedWallet validation.\n */\nexport const UserStorageSyncedWalletSchema = object({\n name: optional(UpdatableFieldSchema(string())),\n isLegacyAccountSyncingDisabled: optional(boolean()),\n});\n\n/**\n * Superstruct schema for UserStorageSyncedWalletGroup validation.\n */\nexport const UserStorageSyncedWalletGroupSchema = object({\n name: optional(UpdatableFieldSchema(string())),\n pinned: optional(UpdatableFieldSchema(boolean())),\n hidden: optional(UpdatableFieldSchema(boolean())),\n groupIndex: number(),\n});\n\n/**\n * Superstruct schema for LegacyUserStorageSyncedAccount validation.\n */\nexport const LegacyUserStorageSyncedAccountSchema = object({\n v: optional(string()),\n i: optional(string()),\n a: optional(string()),\n n: optional(string()),\n nlu: optional(number()),\n});\n\nexport type UserStorageSyncedWallet = AccountTreeWalletPersistedMetadata &\n Infer<typeof UserStorageSyncedWalletSchema>;\n\nexport type UserStorageSyncedWalletGroup = AccountTreeGroupPersistedMetadata & {\n groupIndex: AccountGroupMultichainAccountObject['metadata']['entropy']['groupIndex'];\n} & Infer<typeof UserStorageSyncedWalletGroupSchema>;\n\nexport type LegacyUserStorageSyncedAccount = Infer<\n typeof LegacyUserStorageSyncedAccountSchema\n>;\n\n/**\n * Tracks whether the current full sync run performed a real write, so the\n * service can gate emission of the full-sync trace.\n *\n * Writes are split by durability:\n * - Remote writes (pushes to user storage) are durable and always count.\n * - Local writes can be reverted by a per-wallet rollback, so the service\n * reads the flag before a wallet and writes it back if that wallet rolls back.\n */\nexport type SyncMutationTracker = {\n /** Sets (or clears) the durable remote-write flag — a push to user storage. */\n setRemoteWrite: (value: boolean) => void;\n /** Gets the local-write flag — a write a per-wallet rollback would revert. */\n getLocalWrite: () => boolean;\n /** Sets, clears, or restores the local-write flag. */\n setLocalWrite: (value: boolean) => void;\n /** Whether any write (remote or local) is currently recorded. */\n hasOccurred: () => boolean;\n /** Clears all recorded writes at the start of a sync run. */\n reset: () => void;\n};\n\nexport type BackupAndSyncContext = {\n messenger: AccountTreeControllerMessenger;\n controller: AccountTreeController;\n controllerStateUpdateFn: AccountTreeController['update'];\n traceFn: TraceCallback;\n groupIdToWalletId: Map<AccountGroupId, AccountWalletId>;\n emitAnalyticsEventFn: (event: BackupAndSyncEmitAnalyticsEventParams) => void;\n mutationTracker?: SyncMutationTracker;\n};\n\nexport type LegacyAccountSyncingContext = {\n listAccounts: () => InternalAccount[];\n getEntropyRule: () => {\n match: (\n account: InternalAccount,\n ) =>\n | RuleResult<\n AccountWalletType.Entropy,\n AccountGroupType.MultichainAccount\n >\n | undefined;\n };\n};\n\nexport type AtomicSyncEvent = {\n execute: () => Promise<void>;\n};\n"]}
|
|
@@ -89,6 +89,27 @@ export type UserStorageSyncedWalletGroup = AccountTreeGroupPersistedMetadata & {
|
|
|
89
89
|
groupIndex: AccountGroupMultichainAccountObject['metadata']['entropy']['groupIndex'];
|
|
90
90
|
} & Infer<typeof UserStorageSyncedWalletGroupSchema>;
|
|
91
91
|
export type LegacyUserStorageSyncedAccount = Infer<typeof LegacyUserStorageSyncedAccountSchema>;
|
|
92
|
+
/**
|
|
93
|
+
* Tracks whether the current full sync run performed a real write, so the
|
|
94
|
+
* service can gate emission of the full-sync trace.
|
|
95
|
+
*
|
|
96
|
+
* Writes are split by durability:
|
|
97
|
+
* - Remote writes (pushes to user storage) are durable and always count.
|
|
98
|
+
* - Local writes can be reverted by a per-wallet rollback, so the service
|
|
99
|
+
* reads the flag before a wallet and writes it back if that wallet rolls back.
|
|
100
|
+
*/
|
|
101
|
+
export type SyncMutationTracker = {
|
|
102
|
+
/** Sets (or clears) the durable remote-write flag — a push to user storage. */
|
|
103
|
+
setRemoteWrite: (value: boolean) => void;
|
|
104
|
+
/** Gets the local-write flag — a write a per-wallet rollback would revert. */
|
|
105
|
+
getLocalWrite: () => boolean;
|
|
106
|
+
/** Sets, clears, or restores the local-write flag. */
|
|
107
|
+
setLocalWrite: (value: boolean) => void;
|
|
108
|
+
/** Whether any write (remote or local) is currently recorded. */
|
|
109
|
+
hasOccurred: () => boolean;
|
|
110
|
+
/** Clears all recorded writes at the start of a sync run. */
|
|
111
|
+
reset: () => void;
|
|
112
|
+
};
|
|
92
113
|
export type BackupAndSyncContext = {
|
|
93
114
|
messenger: AccountTreeControllerMessenger;
|
|
94
115
|
controller: AccountTreeController;
|
|
@@ -96,6 +117,7 @@ export type BackupAndSyncContext = {
|
|
|
96
117
|
traceFn: TraceCallback;
|
|
97
118
|
groupIdToWalletId: Map<AccountGroupId, AccountWalletId>;
|
|
98
119
|
emitAnalyticsEventFn: (event: BackupAndSyncEmitAnalyticsEventParams) => void;
|
|
120
|
+
mutationTracker?: SyncMutationTracker;
|
|
99
121
|
};
|
|
100
122
|
export type LegacyAccountSyncingContext = {
|
|
101
123
|
listAccounts: () => InternalAccount[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.cts","sourceRoot":"","sources":["../../src/backup-and-sync/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EAClB,8BAA8B;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,mCAAmC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AAQtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,8BAA8B;AAE3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,qCAAiC;AACtE,OAAO,KAAK,EACV,mCAAmC,EACnC,iCAAiC,EAClC,qBAAiB;AAClB,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAgB;AAC1C,OAAO,KAAK,EAAE,8BAA8B,EAAE,qBAAiB;AAC/D,OAAO,KAAK,EAAE,kCAAkC,EAAE,sBAAkB;AACpE,OAAO,KAAK,EAAE,qCAAqC,EAAE,8BAAoB;AAczE;;GAEG;AACH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;EAGxC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK7C,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,oCAAoC;;;;;;;;;;;;EAM/C,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,kCAAkC,GACtE,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAE9C,MAAM,MAAM,4BAA4B,GAAG,iCAAiC,GAAG;IAC7E,UAAU,EAAE,mCAAmC,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC;CACtF,GAAG,KAAK,CAAC,OAAO,kCAAkC,CAAC,CAAC;AAErD,MAAM,MAAM,8BAA8B,GAAG,KAAK,CAChD,OAAO,oCAAoC,CAC5C,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,8BAA8B,CAAC;IAC1C,UAAU,EAAE,qBAAqB,CAAC;IAClC,uBAAuB,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACzD,OAAO,EAAE,aAAa,CAAC;IACvB,iBAAiB,EAAE,GAAG,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;IACxD,oBAAoB,EAAE,CAAC,KAAK,EAAE,qCAAqC,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.cts","sourceRoot":"","sources":["../../src/backup-and-sync/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EAClB,8BAA8B;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,mCAAmC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AAQtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,8BAA8B;AAE3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,qCAAiC;AACtE,OAAO,KAAK,EACV,mCAAmC,EACnC,iCAAiC,EAClC,qBAAiB;AAClB,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAgB;AAC1C,OAAO,KAAK,EAAE,8BAA8B,EAAE,qBAAiB;AAC/D,OAAO,KAAK,EAAE,kCAAkC,EAAE,sBAAkB;AACpE,OAAO,KAAK,EAAE,qCAAqC,EAAE,8BAAoB;AAczE;;GAEG;AACH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;EAGxC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK7C,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,oCAAoC;;;;;;;;;;;;EAM/C,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,kCAAkC,GACtE,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAE9C,MAAM,MAAM,4BAA4B,GAAG,iCAAiC,GAAG;IAC7E,UAAU,EAAE,mCAAmC,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC;CACtF,GAAG,KAAK,CAAC,OAAO,kCAAkC,CAAC,CAAC;AAErD,MAAM,MAAM,8BAA8B,GAAG,KAAK,CAChD,OAAO,oCAAoC,CAC5C,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,+EAA+E;IAC/E,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,8EAA8E;IAC9E,aAAa,EAAE,MAAM,OAAO,CAAC;IAC7B,sDAAsD;IACtD,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,iEAAiE;IACjE,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,6DAA6D;IAC7D,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,8BAA8B,CAAC;IAC1C,UAAU,EAAE,qBAAqB,CAAC;IAClC,uBAAuB,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACzD,OAAO,EAAE,aAAa,CAAC;IACvB,iBAAiB,EAAE,GAAG,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;IACxD,oBAAoB,EAAE,CAAC,KAAK,EAAE,qCAAqC,KAAK,IAAI,CAAC;IAC7E,eAAe,CAAC,EAAE,mBAAmB,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,YAAY,EAAE,MAAM,eAAe,EAAE,CAAC;IACtC,cAAc,EAAE,MAAM;QACpB,KAAK,EAAE,CACL,OAAO,EAAE,eAAe,KAEtB,UAAU,CACR,iBAAiB,CAAC,OAAO,EACzB,gBAAgB,CAAC,iBAAiB,CACnC,GACD,SAAS,CAAC;KACf,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC"}
|
|
@@ -89,6 +89,27 @@ export type UserStorageSyncedWalletGroup = AccountTreeGroupPersistedMetadata & {
|
|
|
89
89
|
groupIndex: AccountGroupMultichainAccountObject['metadata']['entropy']['groupIndex'];
|
|
90
90
|
} & Infer<typeof UserStorageSyncedWalletGroupSchema>;
|
|
91
91
|
export type LegacyUserStorageSyncedAccount = Infer<typeof LegacyUserStorageSyncedAccountSchema>;
|
|
92
|
+
/**
|
|
93
|
+
* Tracks whether the current full sync run performed a real write, so the
|
|
94
|
+
* service can gate emission of the full-sync trace.
|
|
95
|
+
*
|
|
96
|
+
* Writes are split by durability:
|
|
97
|
+
* - Remote writes (pushes to user storage) are durable and always count.
|
|
98
|
+
* - Local writes can be reverted by a per-wallet rollback, so the service
|
|
99
|
+
* reads the flag before a wallet and writes it back if that wallet rolls back.
|
|
100
|
+
*/
|
|
101
|
+
export type SyncMutationTracker = {
|
|
102
|
+
/** Sets (or clears) the durable remote-write flag — a push to user storage. */
|
|
103
|
+
setRemoteWrite: (value: boolean) => void;
|
|
104
|
+
/** Gets the local-write flag — a write a per-wallet rollback would revert. */
|
|
105
|
+
getLocalWrite: () => boolean;
|
|
106
|
+
/** Sets, clears, or restores the local-write flag. */
|
|
107
|
+
setLocalWrite: (value: boolean) => void;
|
|
108
|
+
/** Whether any write (remote or local) is currently recorded. */
|
|
109
|
+
hasOccurred: () => boolean;
|
|
110
|
+
/** Clears all recorded writes at the start of a sync run. */
|
|
111
|
+
reset: () => void;
|
|
112
|
+
};
|
|
92
113
|
export type BackupAndSyncContext = {
|
|
93
114
|
messenger: AccountTreeControllerMessenger;
|
|
94
115
|
controller: AccountTreeController;
|
|
@@ -96,6 +117,7 @@ export type BackupAndSyncContext = {
|
|
|
96
117
|
traceFn: TraceCallback;
|
|
97
118
|
groupIdToWalletId: Map<AccountGroupId, AccountWalletId>;
|
|
98
119
|
emitAnalyticsEventFn: (event: BackupAndSyncEmitAnalyticsEventParams) => void;
|
|
120
|
+
mutationTracker?: SyncMutationTracker;
|
|
99
121
|
};
|
|
100
122
|
export type LegacyAccountSyncingContext = {
|
|
101
123
|
listAccounts: () => InternalAccount[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","sourceRoot":"","sources":["../../src/backup-and-sync/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EAClB,8BAA8B;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,mCAAmC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AAQtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,8BAA8B;AAE3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,qCAAiC;AACtE,OAAO,KAAK,EACV,mCAAmC,EACnC,iCAAiC,EAClC,qBAAiB;AAClB,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAgB;AAC1C,OAAO,KAAK,EAAE,8BAA8B,EAAE,qBAAiB;AAC/D,OAAO,KAAK,EAAE,kCAAkC,EAAE,sBAAkB;AACpE,OAAO,KAAK,EAAE,qCAAqC,EAAE,8BAAoB;AAczE;;GAEG;AACH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;EAGxC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK7C,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,oCAAoC;;;;;;;;;;;;EAM/C,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,kCAAkC,GACtE,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAE9C,MAAM,MAAM,4BAA4B,GAAG,iCAAiC,GAAG;IAC7E,UAAU,EAAE,mCAAmC,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC;CACtF,GAAG,KAAK,CAAC,OAAO,kCAAkC,CAAC,CAAC;AAErD,MAAM,MAAM,8BAA8B,GAAG,KAAK,CAChD,OAAO,oCAAoC,CAC5C,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,8BAA8B,CAAC;IAC1C,UAAU,EAAE,qBAAqB,CAAC;IAClC,uBAAuB,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACzD,OAAO,EAAE,aAAa,CAAC;IACvB,iBAAiB,EAAE,GAAG,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;IACxD,oBAAoB,EAAE,CAAC,KAAK,EAAE,qCAAqC,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.mts","sourceRoot":"","sources":["../../src/backup-and-sync/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EAClB,8BAA8B;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,mCAAmC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AAQtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,8BAA8B;AAE3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,qCAAiC;AACtE,OAAO,KAAK,EACV,mCAAmC,EACnC,iCAAiC,EAClC,qBAAiB;AAClB,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAgB;AAC1C,OAAO,KAAK,EAAE,8BAA8B,EAAE,qBAAiB;AAC/D,OAAO,KAAK,EAAE,kCAAkC,EAAE,sBAAkB;AACpE,OAAO,KAAK,EAAE,qCAAqC,EAAE,8BAAoB;AAczE;;GAEG;AACH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;EAGxC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK7C,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,oCAAoC;;;;;;;;;;;;EAM/C,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,kCAAkC,GACtE,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAE9C,MAAM,MAAM,4BAA4B,GAAG,iCAAiC,GAAG;IAC7E,UAAU,EAAE,mCAAmC,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC;CACtF,GAAG,KAAK,CAAC,OAAO,kCAAkC,CAAC,CAAC;AAErD,MAAM,MAAM,8BAA8B,GAAG,KAAK,CAChD,OAAO,oCAAoC,CAC5C,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,+EAA+E;IAC/E,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,8EAA8E;IAC9E,aAAa,EAAE,MAAM,OAAO,CAAC;IAC7B,sDAAsD;IACtD,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,iEAAiE;IACjE,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,6DAA6D;IAC7D,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,8BAA8B,CAAC;IAC1C,UAAU,EAAE,qBAAqB,CAAC;IAClC,uBAAuB,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACzD,OAAO,EAAE,aAAa,CAAC;IACvB,iBAAiB,EAAE,GAAG,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;IACxD,oBAAoB,EAAE,CAAC,KAAK,EAAE,qCAAqC,KAAK,IAAI,CAAC;IAC7E,eAAe,CAAC,EAAE,mBAAmB,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,YAAY,EAAE,MAAM,eAAe,EAAE,CAAC;IACtC,cAAc,EAAE,MAAM;QACpB,KAAK,EAAE,CACL,OAAO,EAAE,eAAe,KAEtB,UAAU,CACR,iBAAiB,CAAC,OAAO,EACzB,gBAAgB,CAAC,iBAAiB,CACnC,GACD,SAAS,CAAC;KACf,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.mjs","sourceRoot":"","sources":["../../src/backup-and-sync/types.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,MAAM,EACN,MAAM,EACN,OAAO,EACP,MAAM,EACN,QAAQ,EACT,8BAA8B;AAa/B;;;;;GAKG;AACH,MAAM,oBAAoB,GAAG,CAAI,WAAsB,EAAE,EAAE,CACzD,MAAM,CAAC;IACL,KAAK,EAAE,WAAW;IAClB,aAAa,EAAE,MAAM,EAAE;CACxB,CAAC,CAAC;AAEL;;GAEG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,MAAM,CAAC;IAClD,IAAI,EAAE,QAAQ,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,8BAA8B,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;CACpD,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,MAAM,CAAC;IACvD,IAAI,EAAE,QAAQ,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,MAAM,EAAE,QAAQ,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC,CAAC;IACjD,MAAM,EAAE,QAAQ,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC,CAAC;IACjD,UAAU,EAAE,MAAM,EAAE;CACrB,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAG,MAAM,CAAC;IACzD,CAAC,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IACrB,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;CACxB,CAAC,CAAC","sourcesContent":["import type {\n AccountGroupId,\n AccountGroupType,\n AccountWalletId,\n AccountWalletType,\n} from '@metamask/account-api';\nimport type { TraceCallback } from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport {\n object,\n string,\n boolean,\n number,\n optional,\n} from '@metamask/superstruct';\nimport type { Infer, Struct } from '@metamask/superstruct';\n\nimport type { AccountTreeController } from '../AccountTreeController';\nimport type {\n AccountGroupMultichainAccountObject,\n AccountTreeGroupPersistedMetadata,\n} from '../group';\nimport type { RuleResult } from '../rule';\nimport type { AccountTreeControllerMessenger } from '../types';\nimport type { AccountTreeWalletPersistedMetadata } from '../wallet';\nimport type { BackupAndSyncEmitAnalyticsEventParams } from './analytics';\n\n/**\n * Schema for an updatable field with value and timestamp.\n *\n * @param valueSchema - The schema for the value field.\n * @returns A superstruct schema for an updatable field.\n */\nconst UpdatableFieldSchema = <T>(valueSchema: Struct<T>) =>\n object({\n value: valueSchema,\n lastUpdatedAt: number(),\n });\n\n/**\n * Superstruct schema for UserStorageSyncedWallet validation.\n */\nexport const UserStorageSyncedWalletSchema = object({\n name: optional(UpdatableFieldSchema(string())),\n isLegacyAccountSyncingDisabled: optional(boolean()),\n});\n\n/**\n * Superstruct schema for UserStorageSyncedWalletGroup validation.\n */\nexport const UserStorageSyncedWalletGroupSchema = object({\n name: optional(UpdatableFieldSchema(string())),\n pinned: optional(UpdatableFieldSchema(boolean())),\n hidden: optional(UpdatableFieldSchema(boolean())),\n groupIndex: number(),\n});\n\n/**\n * Superstruct schema for LegacyUserStorageSyncedAccount validation.\n */\nexport const LegacyUserStorageSyncedAccountSchema = object({\n v: optional(string()),\n i: optional(string()),\n a: optional(string()),\n n: optional(string()),\n nlu: optional(number()),\n});\n\nexport type UserStorageSyncedWallet = AccountTreeWalletPersistedMetadata &\n Infer<typeof UserStorageSyncedWalletSchema>;\n\nexport type UserStorageSyncedWalletGroup = AccountTreeGroupPersistedMetadata & {\n groupIndex: AccountGroupMultichainAccountObject['metadata']['entropy']['groupIndex'];\n} & Infer<typeof UserStorageSyncedWalletGroupSchema>;\n\nexport type LegacyUserStorageSyncedAccount = Infer<\n typeof LegacyUserStorageSyncedAccountSchema\n>;\n\nexport type BackupAndSyncContext = {\n messenger: AccountTreeControllerMessenger;\n controller: AccountTreeController;\n controllerStateUpdateFn: AccountTreeController['update'];\n traceFn: TraceCallback;\n groupIdToWalletId: Map<AccountGroupId, AccountWalletId>;\n emitAnalyticsEventFn: (event: BackupAndSyncEmitAnalyticsEventParams) => void;\n};\n\nexport type LegacyAccountSyncingContext = {\n listAccounts: () => InternalAccount[];\n getEntropyRule: () => {\n match: (\n account: InternalAccount,\n ) =>\n | RuleResult<\n AccountWalletType.Entropy,\n AccountGroupType.MultichainAccount\n >\n | undefined;\n };\n};\n\nexport type AtomicSyncEvent = {\n execute: () => Promise<void>;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"types.mjs","sourceRoot":"","sources":["../../src/backup-and-sync/types.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,MAAM,EACN,MAAM,EACN,OAAO,EACP,MAAM,EACN,QAAQ,EACT,8BAA8B;AAa/B;;;;;GAKG;AACH,MAAM,oBAAoB,GAAG,CAAI,WAAsB,EAAE,EAAE,CACzD,MAAM,CAAC;IACL,KAAK,EAAE,WAAW;IAClB,aAAa,EAAE,MAAM,EAAE;CACxB,CAAC,CAAC;AAEL;;GAEG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,MAAM,CAAC;IAClD,IAAI,EAAE,QAAQ,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,8BAA8B,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;CACpD,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,MAAM,CAAC;IACvD,IAAI,EAAE,QAAQ,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,MAAM,EAAE,QAAQ,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC,CAAC;IACjD,MAAM,EAAE,QAAQ,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC,CAAC;IACjD,UAAU,EAAE,MAAM,EAAE;CACrB,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAG,MAAM,CAAC;IACzD,CAAC,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IACrB,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;CACxB,CAAC,CAAC","sourcesContent":["import type {\n AccountGroupId,\n AccountGroupType,\n AccountWalletId,\n AccountWalletType,\n} from '@metamask/account-api';\nimport type { TraceCallback } from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport {\n object,\n string,\n boolean,\n number,\n optional,\n} from '@metamask/superstruct';\nimport type { Infer, Struct } from '@metamask/superstruct';\n\nimport type { AccountTreeController } from '../AccountTreeController';\nimport type {\n AccountGroupMultichainAccountObject,\n AccountTreeGroupPersistedMetadata,\n} from '../group';\nimport type { RuleResult } from '../rule';\nimport type { AccountTreeControllerMessenger } from '../types';\nimport type { AccountTreeWalletPersistedMetadata } from '../wallet';\nimport type { BackupAndSyncEmitAnalyticsEventParams } from './analytics';\n\n/**\n * Schema for an updatable field with value and timestamp.\n *\n * @param valueSchema - The schema for the value field.\n * @returns A superstruct schema for an updatable field.\n */\nconst UpdatableFieldSchema = <T>(valueSchema: Struct<T>) =>\n object({\n value: valueSchema,\n lastUpdatedAt: number(),\n });\n\n/**\n * Superstruct schema for UserStorageSyncedWallet validation.\n */\nexport const UserStorageSyncedWalletSchema = object({\n name: optional(UpdatableFieldSchema(string())),\n isLegacyAccountSyncingDisabled: optional(boolean()),\n});\n\n/**\n * Superstruct schema for UserStorageSyncedWalletGroup validation.\n */\nexport const UserStorageSyncedWalletGroupSchema = object({\n name: optional(UpdatableFieldSchema(string())),\n pinned: optional(UpdatableFieldSchema(boolean())),\n hidden: optional(UpdatableFieldSchema(boolean())),\n groupIndex: number(),\n});\n\n/**\n * Superstruct schema for LegacyUserStorageSyncedAccount validation.\n */\nexport const LegacyUserStorageSyncedAccountSchema = object({\n v: optional(string()),\n i: optional(string()),\n a: optional(string()),\n n: optional(string()),\n nlu: optional(number()),\n});\n\nexport type UserStorageSyncedWallet = AccountTreeWalletPersistedMetadata &\n Infer<typeof UserStorageSyncedWalletSchema>;\n\nexport type UserStorageSyncedWalletGroup = AccountTreeGroupPersistedMetadata & {\n groupIndex: AccountGroupMultichainAccountObject['metadata']['entropy']['groupIndex'];\n} & Infer<typeof UserStorageSyncedWalletGroupSchema>;\n\nexport type LegacyUserStorageSyncedAccount = Infer<\n typeof LegacyUserStorageSyncedAccountSchema\n>;\n\n/**\n * Tracks whether the current full sync run performed a real write, so the\n * service can gate emission of the full-sync trace.\n *\n * Writes are split by durability:\n * - Remote writes (pushes to user storage) are durable and always count.\n * - Local writes can be reverted by a per-wallet rollback, so the service\n * reads the flag before a wallet and writes it back if that wallet rolls back.\n */\nexport type SyncMutationTracker = {\n /** Sets (or clears) the durable remote-write flag — a push to user storage. */\n setRemoteWrite: (value: boolean) => void;\n /** Gets the local-write flag — a write a per-wallet rollback would revert. */\n getLocalWrite: () => boolean;\n /** Sets, clears, or restores the local-write flag. */\n setLocalWrite: (value: boolean) => void;\n /** Whether any write (remote or local) is currently recorded. */\n hasOccurred: () => boolean;\n /** Clears all recorded writes at the start of a sync run. */\n reset: () => void;\n};\n\nexport type BackupAndSyncContext = {\n messenger: AccountTreeControllerMessenger;\n controller: AccountTreeController;\n controllerStateUpdateFn: AccountTreeController['update'];\n traceFn: TraceCallback;\n groupIdToWalletId: Map<AccountGroupId, AccountWalletId>;\n emitAnalyticsEventFn: (event: BackupAndSyncEmitAnalyticsEventParams) => void;\n mutationTracker?: SyncMutationTracker;\n};\n\nexport type LegacyAccountSyncingContext = {\n listAccounts: () => InternalAccount[];\n getEntropyRule: () => {\n match: (\n account: InternalAccount,\n ) =>\n | RuleResult<\n AccountWalletType.Entropy,\n AccountGroupType.MultichainAccount\n >\n | undefined;\n };\n};\n\nexport type AtomicSyncEvent = {\n execute: () => Promise<void>;\n};\n"]}
|
|
@@ -49,7 +49,9 @@ const pushWalletToUserStorage = async (context, wallet) => {
|
|
|
49
49
|
const stringifiedWallet = JSON.stringify(formattedWallet);
|
|
50
50
|
const entropySourceId = wallet.metadata.entropy.id;
|
|
51
51
|
(0, logger_1.backupAndSyncLogger)(`Pushing wallet to user storage: ${stringifiedWallet}`);
|
|
52
|
-
|
|
52
|
+
const result = await context.messenger.call('UserStorageController:performSetStorage', `${constants_1.USER_STORAGE_WALLETS_FEATURE_KEY}.${constants_1.USER_STORAGE_WALLETS_FEATURE_ENTRY_KEY}`, stringifiedWallet, entropySourceId);
|
|
53
|
+
context.mutationTracker?.setRemoteWrite(true);
|
|
54
|
+
return result;
|
|
53
55
|
});
|
|
54
56
|
};
|
|
55
57
|
exports.pushWalletToUserStorage = pushWalletToUserStorage;
|
|
@@ -126,7 +128,9 @@ const pushGroupToUserStorage = async (context, group, entropySourceId) => {
|
|
|
126
128
|
const formattedGroup = (0, format_utils_1.formatGroupForUserStorageUsage)(context, group);
|
|
127
129
|
const stringifiedGroup = JSON.stringify(formattedGroup);
|
|
128
130
|
(0, logger_1.backupAndSyncLogger)(`Pushing group to user storage: ${stringifiedGroup}`);
|
|
129
|
-
|
|
131
|
+
const result = await context.messenger.call('UserStorageController:performSetStorage', `${constants_1.USER_STORAGE_GROUPS_FEATURE_KEY}.${formattedGroup.groupIndex}`, stringifiedGroup, entropySourceId);
|
|
132
|
+
context.mutationTracker?.setRemoteWrite(true);
|
|
133
|
+
return result;
|
|
130
134
|
});
|
|
131
135
|
};
|
|
132
136
|
exports.pushGroupToUserStorage = pushGroupToUserStorage;
|
|
@@ -149,7 +153,9 @@ const pushGroupToUserStorageBatch = async (context, groups, entropySourceId) =>
|
|
|
149
153
|
JSON.stringify(group),
|
|
150
154
|
]);
|
|
151
155
|
(0, logger_1.backupAndSyncLogger)(`Pushing groups to user storage: ${entries.map(([_, value]) => value).join(', ')}`);
|
|
152
|
-
|
|
156
|
+
const result = await context.messenger.call('UserStorageController:performBatchSetStorage', constants_1.USER_STORAGE_GROUPS_FEATURE_KEY, entries, entropySourceId);
|
|
157
|
+
context.mutationTracker?.setRemoteWrite(true);
|
|
158
|
+
return result;
|
|
153
159
|
});
|
|
154
160
|
};
|
|
155
161
|
exports.pushGroupToUserStorageBatch = pushGroupToUserStorageBatch;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-operations.cjs","sourceRoot":"","sources":["../../../src/backup-and-sync/user-storage/network-operations.ts"],"names":[],"mappings":"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","sourcesContent":["import { SDK } from '@metamask/profile-sync-controller';\n\nimport type { AccountGroupMultichainAccountObject } from '../../group';\nimport { backupAndSyncLogger } from '../../logger';\nimport type { AccountWalletEntropyObject } from '../../wallet';\nimport type {\n BackupAndSyncContext,\n LegacyUserStorageSyncedAccount,\n UserStorageSyncedWallet,\n UserStorageSyncedWalletGroup,\n} from '../types';\nimport { toErrorMessage } from '../utils/errors';\nimport {\n USER_STORAGE_GROUPS_FEATURE_KEY,\n USER_STORAGE_WALLETS_FEATURE_ENTRY_KEY,\n USER_STORAGE_WALLETS_FEATURE_KEY,\n} from './constants';\nimport {\n formatWalletForUserStorageUsage,\n formatGroupForUserStorageUsage,\n parseWalletFromUserStorageResponse,\n parseGroupFromUserStorageResponse,\n parseLegacyAccountFromUserStorageResponse,\n} from './format-utils';\nimport { executeWithRetry } from './network-utils';\n\n/**\n * Retrieves the wallet from user storage.\n *\n * @param context - The backup and sync context.\n * @param entropySourceId - The entropy source ID.\n * @returns The wallet from user storage or null if not found or invalid.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n */\nexport const getWalletFromUserStorage = async (\n context: BackupAndSyncContext,\n entropySourceId: string,\n): Promise<UserStorageSyncedWallet | null> => {\n return executeWithRetry(async () => {\n const walletData = await context.messenger.call(\n 'UserStorageController:performGetStorage',\n `${USER_STORAGE_WALLETS_FEATURE_KEY}.${USER_STORAGE_WALLETS_FEATURE_ENTRY_KEY}`,\n entropySourceId,\n );\n if (!walletData) {\n return null;\n }\n\n try {\n backupAndSyncLogger(\n `Retrieved wallet data from user storage: ${JSON.stringify(walletData)}`,\n );\n return parseWalletFromUserStorageResponse(walletData);\n } catch (error) {\n backupAndSyncLogger(\n `Failed to parse wallet data from user storage: ${toErrorMessage(error)}`,\n );\n return null;\n }\n });\n};\n\n/**\n * Pushes the wallet to user storage.\n *\n * @param context - The backup and sync context.\n * @param wallet - The wallet to push to user storage.\n * @returns A promise that resolves when the operation is complete.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n * @throws When JSON.stringify fails on the formatted wallet data.\n */\nexport const pushWalletToUserStorage = async (\n context: BackupAndSyncContext,\n wallet: AccountWalletEntropyObject,\n): Promise<void> => {\n return executeWithRetry(async () => {\n const formattedWallet = formatWalletForUserStorageUsage(context, wallet);\n const stringifiedWallet = JSON.stringify(formattedWallet);\n const entropySourceId = wallet.metadata.entropy.id;\n\n backupAndSyncLogger(`Pushing wallet to user storage: ${stringifiedWallet}`);\n\n return await context.messenger.call(\n 'UserStorageController:performSetStorage',\n `${USER_STORAGE_WALLETS_FEATURE_KEY}.${USER_STORAGE_WALLETS_FEATURE_ENTRY_KEY}`,\n stringifiedWallet,\n entropySourceId,\n );\n });\n};\n\n/**\n * Retrieves all groups from user storage.\n *\n * @param context - The backup and sync context.\n * @param entropySourceId - The entropy source ID.\n * @returns An array of groups from user storage.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n */\nexport const getAllGroupsFromUserStorage = async (\n context: BackupAndSyncContext,\n entropySourceId: string,\n): Promise<UserStorageSyncedWalletGroup[]> => {\n return executeWithRetry(async () => {\n const groupData = await context.messenger.call(\n 'UserStorageController:performGetStorageAllFeatureEntries',\n `${USER_STORAGE_GROUPS_FEATURE_KEY}`,\n entropySourceId,\n );\n if (!groupData) {\n return [];\n }\n\n const allGroups = groupData\n .map((stringifiedGroup) => {\n try {\n return parseGroupFromUserStorageResponse(stringifiedGroup);\n } catch (error) {\n backupAndSyncLogger(\n `Failed to parse group data from user storage: ${toErrorMessage(error)}`,\n );\n return null;\n }\n })\n .filter((group): group is UserStorageSyncedWalletGroup => group !== null);\n\n backupAndSyncLogger(\n `Retrieved groups from user storage: ${JSON.stringify(allGroups)}`,\n );\n\n return allGroups;\n });\n};\n\n/**\n * Retrieves a single group from user storage by group index.\n *\n * @param context - The backup and sync context.\n * @param entropySourceId - The entropy source ID.\n * @param groupIndex - The group index to retrieve.\n * @returns The group from user storage or null if not found or invalid.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n */\nexport const getGroupFromUserStorage = async (\n context: BackupAndSyncContext,\n entropySourceId: string,\n groupIndex: number,\n): Promise<UserStorageSyncedWalletGroup | null> => {\n return executeWithRetry(async () => {\n const groupData = await context.messenger.call(\n 'UserStorageController:performGetStorage',\n `${USER_STORAGE_GROUPS_FEATURE_KEY}.${groupIndex}`,\n entropySourceId,\n );\n if (!groupData) {\n return null;\n }\n\n try {\n return parseGroupFromUserStorageResponse(groupData);\n } catch (error) {\n backupAndSyncLogger(\n `Failed to parse group data from user storage: ${toErrorMessage(error)}`,\n );\n return null;\n }\n });\n};\n\n/**\n * Pushes a group to user storage.\n *\n * @param context - The backup and sync context.\n * @param group - The group to push to user storage.\n * @param entropySourceId - The entropy source ID.\n * @returns A promise that resolves when the operation is complete.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n * @throws When JSON.stringify fails on the formatted group data.\n */\nexport const pushGroupToUserStorage = async (\n context: BackupAndSyncContext,\n group: AccountGroupMultichainAccountObject,\n entropySourceId: string,\n): Promise<void> => {\n return executeWithRetry(async () => {\n const formattedGroup = formatGroupForUserStorageUsage(context, group);\n const stringifiedGroup = JSON.stringify(formattedGroup);\n\n backupAndSyncLogger(`Pushing group to user storage: ${stringifiedGroup}`);\n\n return await context.messenger.call(\n 'UserStorageController:performSetStorage',\n `${USER_STORAGE_GROUPS_FEATURE_KEY}.${formattedGroup.groupIndex}`,\n stringifiedGroup,\n entropySourceId,\n );\n });\n};\n\n/**\n * Pushes a batch of groups to user storage.\n *\n * @param context - The backup and sync context.\n * @param groups - The groups to push to user storage.\n * @param entropySourceId - The entropy source ID.\n * @returns A promise that resolves when the operation is complete.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n * @throws When JSON.stringify fails on any of the formatted group data.\n */\nexport const pushGroupToUserStorageBatch = async (\n context: BackupAndSyncContext,\n groups: AccountGroupMultichainAccountObject[],\n entropySourceId: string,\n): Promise<void> => {\n return executeWithRetry(async () => {\n const formattedGroups = groups.map((group) =>\n formatGroupForUserStorageUsage(context, group),\n );\n\n const entries: [string, string][] = formattedGroups.map((group) => [\n String(group.groupIndex),\n JSON.stringify(group),\n ]);\n\n backupAndSyncLogger(\n `Pushing groups to user storage: ${entries.map(([_, value]) => value).join(', ')}`,\n );\n\n return await context.messenger.call(\n 'UserStorageController:performBatchSetStorage',\n USER_STORAGE_GROUPS_FEATURE_KEY,\n entries,\n entropySourceId,\n );\n });\n};\n\n/**\n * Retrieves legacy user storage accounts for a specific entropy source ID.\n *\n * @param context - The backup and sync context.\n * @param entropySourceId - The entropy source ID to retrieve data for.\n * @returns A promise that resolves with the legacy user storage accounts.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n */\nexport const getAllLegacyUserStorageAccounts = async (\n context: BackupAndSyncContext,\n entropySourceId: string,\n): Promise<LegacyUserStorageSyncedAccount[]> => {\n return executeWithRetry(async () => {\n const accountsData = await context.messenger.call(\n 'UserStorageController:performGetStorageAllFeatureEntries',\n SDK.USER_STORAGE_FEATURE_NAMES.accounts,\n entropySourceId,\n );\n\n if (!accountsData) {\n return [];\n }\n\n const allAccounts = accountsData\n .map((stringifiedAccount) => {\n try {\n return parseLegacyAccountFromUserStorageResponse(stringifiedAccount);\n } catch (error) {\n backupAndSyncLogger(\n `Failed to parse legacy account data from user storage: ${toErrorMessage(error)}`,\n );\n return null;\n }\n })\n .filter(\n (account): account is LegacyUserStorageSyncedAccount =>\n account !== null,\n );\n\n backupAndSyncLogger(\n `Retrieved legacy accounts from user storage: ${JSON.stringify(allAccounts)}`,\n );\n\n return allAccounts;\n });\n};\n"]}
|
|
1
|
+
{"version":3,"file":"network-operations.cjs","sourceRoot":"","sources":["../../../src/backup-and-sync/user-storage/network-operations.ts"],"names":[],"mappings":"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","sourcesContent":["import { SDK } from '@metamask/profile-sync-controller';\n\nimport type { AccountGroupMultichainAccountObject } from '../../group';\nimport { backupAndSyncLogger } from '../../logger';\nimport type { AccountWalletEntropyObject } from '../../wallet';\nimport type {\n BackupAndSyncContext,\n LegacyUserStorageSyncedAccount,\n UserStorageSyncedWallet,\n UserStorageSyncedWalletGroup,\n} from '../types';\nimport { toErrorMessage } from '../utils/errors';\nimport {\n USER_STORAGE_GROUPS_FEATURE_KEY,\n USER_STORAGE_WALLETS_FEATURE_ENTRY_KEY,\n USER_STORAGE_WALLETS_FEATURE_KEY,\n} from './constants';\nimport {\n formatWalletForUserStorageUsage,\n formatGroupForUserStorageUsage,\n parseWalletFromUserStorageResponse,\n parseGroupFromUserStorageResponse,\n parseLegacyAccountFromUserStorageResponse,\n} from './format-utils';\nimport { executeWithRetry } from './network-utils';\n\n/**\n * Retrieves the wallet from user storage.\n *\n * @param context - The backup and sync context.\n * @param entropySourceId - The entropy source ID.\n * @returns The wallet from user storage or null if not found or invalid.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n */\nexport const getWalletFromUserStorage = async (\n context: BackupAndSyncContext,\n entropySourceId: string,\n): Promise<UserStorageSyncedWallet | null> => {\n return executeWithRetry(async () => {\n const walletData = await context.messenger.call(\n 'UserStorageController:performGetStorage',\n `${USER_STORAGE_WALLETS_FEATURE_KEY}.${USER_STORAGE_WALLETS_FEATURE_ENTRY_KEY}`,\n entropySourceId,\n );\n if (!walletData) {\n return null;\n }\n\n try {\n backupAndSyncLogger(\n `Retrieved wallet data from user storage: ${JSON.stringify(walletData)}`,\n );\n return parseWalletFromUserStorageResponse(walletData);\n } catch (error) {\n backupAndSyncLogger(\n `Failed to parse wallet data from user storage: ${toErrorMessage(error)}`,\n );\n return null;\n }\n });\n};\n\n/**\n * Pushes the wallet to user storage.\n *\n * @param context - The backup and sync context.\n * @param wallet - The wallet to push to user storage.\n * @returns A promise that resolves when the operation is complete.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n * @throws When JSON.stringify fails on the formatted wallet data.\n */\nexport const pushWalletToUserStorage = async (\n context: BackupAndSyncContext,\n wallet: AccountWalletEntropyObject,\n): Promise<void> => {\n return executeWithRetry(async () => {\n const formattedWallet = formatWalletForUserStorageUsage(context, wallet);\n const stringifiedWallet = JSON.stringify(formattedWallet);\n const entropySourceId = wallet.metadata.entropy.id;\n\n backupAndSyncLogger(`Pushing wallet to user storage: ${stringifiedWallet}`);\n\n const result = await context.messenger.call(\n 'UserStorageController:performSetStorage',\n `${USER_STORAGE_WALLETS_FEATURE_KEY}.${USER_STORAGE_WALLETS_FEATURE_ENTRY_KEY}`,\n stringifiedWallet,\n entropySourceId,\n );\n context.mutationTracker?.setRemoteWrite(true);\n return result;\n });\n};\n\n/**\n * Retrieves all groups from user storage.\n *\n * @param context - The backup and sync context.\n * @param entropySourceId - The entropy source ID.\n * @returns An array of groups from user storage.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n */\nexport const getAllGroupsFromUserStorage = async (\n context: BackupAndSyncContext,\n entropySourceId: string,\n): Promise<UserStorageSyncedWalletGroup[]> => {\n return executeWithRetry(async () => {\n const groupData = await context.messenger.call(\n 'UserStorageController:performGetStorageAllFeatureEntries',\n `${USER_STORAGE_GROUPS_FEATURE_KEY}`,\n entropySourceId,\n );\n if (!groupData) {\n return [];\n }\n\n const allGroups = groupData\n .map((stringifiedGroup) => {\n try {\n return parseGroupFromUserStorageResponse(stringifiedGroup);\n } catch (error) {\n backupAndSyncLogger(\n `Failed to parse group data from user storage: ${toErrorMessage(error)}`,\n );\n return null;\n }\n })\n .filter((group): group is UserStorageSyncedWalletGroup => group !== null);\n\n backupAndSyncLogger(\n `Retrieved groups from user storage: ${JSON.stringify(allGroups)}`,\n );\n\n return allGroups;\n });\n};\n\n/**\n * Retrieves a single group from user storage by group index.\n *\n * @param context - The backup and sync context.\n * @param entropySourceId - The entropy source ID.\n * @param groupIndex - The group index to retrieve.\n * @returns The group from user storage or null if not found or invalid.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n */\nexport const getGroupFromUserStorage = async (\n context: BackupAndSyncContext,\n entropySourceId: string,\n groupIndex: number,\n): Promise<UserStorageSyncedWalletGroup | null> => {\n return executeWithRetry(async () => {\n const groupData = await context.messenger.call(\n 'UserStorageController:performGetStorage',\n `${USER_STORAGE_GROUPS_FEATURE_KEY}.${groupIndex}`,\n entropySourceId,\n );\n if (!groupData) {\n return null;\n }\n\n try {\n return parseGroupFromUserStorageResponse(groupData);\n } catch (error) {\n backupAndSyncLogger(\n `Failed to parse group data from user storage: ${toErrorMessage(error)}`,\n );\n return null;\n }\n });\n};\n\n/**\n * Pushes a group to user storage.\n *\n * @param context - The backup and sync context.\n * @param group - The group to push to user storage.\n * @param entropySourceId - The entropy source ID.\n * @returns A promise that resolves when the operation is complete.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n * @throws When JSON.stringify fails on the formatted group data.\n */\nexport const pushGroupToUserStorage = async (\n context: BackupAndSyncContext,\n group: AccountGroupMultichainAccountObject,\n entropySourceId: string,\n): Promise<void> => {\n return executeWithRetry(async () => {\n const formattedGroup = formatGroupForUserStorageUsage(context, group);\n const stringifiedGroup = JSON.stringify(formattedGroup);\n\n backupAndSyncLogger(`Pushing group to user storage: ${stringifiedGroup}`);\n\n const result = await context.messenger.call(\n 'UserStorageController:performSetStorage',\n `${USER_STORAGE_GROUPS_FEATURE_KEY}.${formattedGroup.groupIndex}`,\n stringifiedGroup,\n entropySourceId,\n );\n context.mutationTracker?.setRemoteWrite(true);\n return result;\n });\n};\n\n/**\n * Pushes a batch of groups to user storage.\n *\n * @param context - The backup and sync context.\n * @param groups - The groups to push to user storage.\n * @param entropySourceId - The entropy source ID.\n * @returns A promise that resolves when the operation is complete.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n * @throws When JSON.stringify fails on any of the formatted group data.\n */\nexport const pushGroupToUserStorageBatch = async (\n context: BackupAndSyncContext,\n groups: AccountGroupMultichainAccountObject[],\n entropySourceId: string,\n): Promise<void> => {\n return executeWithRetry(async () => {\n const formattedGroups = groups.map((group) =>\n formatGroupForUserStorageUsage(context, group),\n );\n\n const entries: [string, string][] = formattedGroups.map((group) => [\n String(group.groupIndex),\n JSON.stringify(group),\n ]);\n\n backupAndSyncLogger(\n `Pushing groups to user storage: ${entries.map(([_, value]) => value).join(', ')}`,\n );\n\n const result = await context.messenger.call(\n 'UserStorageController:performBatchSetStorage',\n USER_STORAGE_GROUPS_FEATURE_KEY,\n entries,\n entropySourceId,\n );\n context.mutationTracker?.setRemoteWrite(true);\n return result;\n });\n};\n\n/**\n * Retrieves legacy user storage accounts for a specific entropy source ID.\n *\n * @param context - The backup and sync context.\n * @param entropySourceId - The entropy source ID to retrieve data for.\n * @returns A promise that resolves with the legacy user storage accounts.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n */\nexport const getAllLegacyUserStorageAccounts = async (\n context: BackupAndSyncContext,\n entropySourceId: string,\n): Promise<LegacyUserStorageSyncedAccount[]> => {\n return executeWithRetry(async () => {\n const accountsData = await context.messenger.call(\n 'UserStorageController:performGetStorageAllFeatureEntries',\n SDK.USER_STORAGE_FEATURE_NAMES.accounts,\n entropySourceId,\n );\n\n if (!accountsData) {\n return [];\n }\n\n const allAccounts = accountsData\n .map((stringifiedAccount) => {\n try {\n return parseLegacyAccountFromUserStorageResponse(stringifiedAccount);\n } catch (error) {\n backupAndSyncLogger(\n `Failed to parse legacy account data from user storage: ${toErrorMessage(error)}`,\n );\n return null;\n }\n })\n .filter(\n (account): account is LegacyUserStorageSyncedAccount =>\n account !== null,\n );\n\n backupAndSyncLogger(\n `Retrieved legacy accounts from user storage: ${JSON.stringify(allAccounts)}`,\n );\n\n return allAccounts;\n });\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-operations.d.cts","sourceRoot":"","sources":["../../../src/backup-and-sync/user-storage/network-operations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mCAAmC,EAAE,wBAAoB;AAEvE,OAAO,KAAK,EAAE,0BAA0B,EAAE,yBAAqB;AAC/D,OAAO,KAAK,EACV,oBAAoB,EACpB,8BAA8B,EAC9B,uBAAuB,EACvB,4BAA4B,EAC7B,qBAAiB;AAgBlB;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,YAC1B,oBAAoB,mBACZ,MAAM,KACtB,QAAQ,uBAAuB,GAAG,IAAI,CAuBxC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,YACzB,oBAAoB,UACrB,0BAA0B,KACjC,QAAQ,IAAI,
|
|
1
|
+
{"version":3,"file":"network-operations.d.cts","sourceRoot":"","sources":["../../../src/backup-and-sync/user-storage/network-operations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mCAAmC,EAAE,wBAAoB;AAEvE,OAAO,KAAK,EAAE,0BAA0B,EAAE,yBAAqB;AAC/D,OAAO,KAAK,EACV,oBAAoB,EACpB,8BAA8B,EAC9B,uBAAuB,EACvB,4BAA4B,EAC7B,qBAAiB;AAgBlB;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,YAC1B,oBAAoB,mBACZ,MAAM,KACtB,QAAQ,uBAAuB,GAAG,IAAI,CAuBxC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,YACzB,oBAAoB,UACrB,0BAA0B,KACjC,QAAQ,IAAI,CAiBd,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,YAC7B,oBAAoB,mBACZ,MAAM,KACtB,QAAQ,4BAA4B,EAAE,CA8BxC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,YACzB,oBAAoB,mBACZ,MAAM,cACX,MAAM,KACjB,QAAQ,4BAA4B,GAAG,IAAI,CAoB7C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,YACxB,oBAAoB,SACtB,mCAAmC,mBACzB,MAAM,KACtB,QAAQ,IAAI,CAgBd,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,2BAA2B,YAC7B,oBAAoB,UACrB,mCAAmC,EAAE,mBAC5B,MAAM,KACtB,QAAQ,IAAI,CAwBd,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,+BAA+B,YACjC,oBAAoB,mBACZ,MAAM,KACtB,QAAQ,8BAA8B,EAAE,CAkC1C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-operations.d.mts","sourceRoot":"","sources":["../../../src/backup-and-sync/user-storage/network-operations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mCAAmC,EAAE,wBAAoB;AAEvE,OAAO,KAAK,EAAE,0BAA0B,EAAE,yBAAqB;AAC/D,OAAO,KAAK,EACV,oBAAoB,EACpB,8BAA8B,EAC9B,uBAAuB,EACvB,4BAA4B,EAC7B,qBAAiB;AAgBlB;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,YAC1B,oBAAoB,mBACZ,MAAM,KACtB,QAAQ,uBAAuB,GAAG,IAAI,CAuBxC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,YACzB,oBAAoB,UACrB,0BAA0B,KACjC,QAAQ,IAAI,
|
|
1
|
+
{"version":3,"file":"network-operations.d.mts","sourceRoot":"","sources":["../../../src/backup-and-sync/user-storage/network-operations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mCAAmC,EAAE,wBAAoB;AAEvE,OAAO,KAAK,EAAE,0BAA0B,EAAE,yBAAqB;AAC/D,OAAO,KAAK,EACV,oBAAoB,EACpB,8BAA8B,EAC9B,uBAAuB,EACvB,4BAA4B,EAC7B,qBAAiB;AAgBlB;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,YAC1B,oBAAoB,mBACZ,MAAM,KACtB,QAAQ,uBAAuB,GAAG,IAAI,CAuBxC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,YACzB,oBAAoB,UACrB,0BAA0B,KACjC,QAAQ,IAAI,CAiBd,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,YAC7B,oBAAoB,mBACZ,MAAM,KACtB,QAAQ,4BAA4B,EAAE,CA8BxC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,YACzB,oBAAoB,mBACZ,MAAM,cACX,MAAM,KACjB,QAAQ,4BAA4B,GAAG,IAAI,CAoB7C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,YACxB,oBAAoB,SACtB,mCAAmC,mBACzB,MAAM,KACtB,QAAQ,IAAI,CAgBd,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,2BAA2B,YAC7B,oBAAoB,UACrB,mCAAmC,EAAE,mBAC5B,MAAM,KACtB,QAAQ,IAAI,CAwBd,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,+BAA+B,YACjC,oBAAoB,mBACZ,MAAM,KACtB,QAAQ,8BAA8B,EAAE,CAkC1C,CAAC"}
|
|
@@ -45,7 +45,9 @@ export const pushWalletToUserStorage = async (context, wallet) => {
|
|
|
45
45
|
const stringifiedWallet = JSON.stringify(formattedWallet);
|
|
46
46
|
const entropySourceId = wallet.metadata.entropy.id;
|
|
47
47
|
backupAndSyncLogger(`Pushing wallet to user storage: ${stringifiedWallet}`);
|
|
48
|
-
|
|
48
|
+
const result = await context.messenger.call('UserStorageController:performSetStorage', `${USER_STORAGE_WALLETS_FEATURE_KEY}.${USER_STORAGE_WALLETS_FEATURE_ENTRY_KEY}`, stringifiedWallet, entropySourceId);
|
|
49
|
+
context.mutationTracker?.setRemoteWrite(true);
|
|
50
|
+
return result;
|
|
49
51
|
});
|
|
50
52
|
};
|
|
51
53
|
/**
|
|
@@ -119,7 +121,9 @@ export const pushGroupToUserStorage = async (context, group, entropySourceId) =>
|
|
|
119
121
|
const formattedGroup = formatGroupForUserStorageUsage(context, group);
|
|
120
122
|
const stringifiedGroup = JSON.stringify(formattedGroup);
|
|
121
123
|
backupAndSyncLogger(`Pushing group to user storage: ${stringifiedGroup}`);
|
|
122
|
-
|
|
124
|
+
const result = await context.messenger.call('UserStorageController:performSetStorage', `${USER_STORAGE_GROUPS_FEATURE_KEY}.${formattedGroup.groupIndex}`, stringifiedGroup, entropySourceId);
|
|
125
|
+
context.mutationTracker?.setRemoteWrite(true);
|
|
126
|
+
return result;
|
|
123
127
|
});
|
|
124
128
|
};
|
|
125
129
|
/**
|
|
@@ -141,7 +145,9 @@ export const pushGroupToUserStorageBatch = async (context, groups, entropySource
|
|
|
141
145
|
JSON.stringify(group),
|
|
142
146
|
]);
|
|
143
147
|
backupAndSyncLogger(`Pushing groups to user storage: ${entries.map(([_, value]) => value).join(', ')}`);
|
|
144
|
-
|
|
148
|
+
const result = await context.messenger.call('UserStorageController:performBatchSetStorage', USER_STORAGE_GROUPS_FEATURE_KEY, entries, entropySourceId);
|
|
149
|
+
context.mutationTracker?.setRemoteWrite(true);
|
|
150
|
+
return result;
|
|
145
151
|
});
|
|
146
152
|
};
|
|
147
153
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-operations.mjs","sourceRoot":"","sources":["../../../src/backup-and-sync/user-storage/network-operations.ts"],"names":[],"mappings":"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","sourcesContent":["import { SDK } from '@metamask/profile-sync-controller';\n\nimport type { AccountGroupMultichainAccountObject } from '../../group';\nimport { backupAndSyncLogger } from '../../logger';\nimport type { AccountWalletEntropyObject } from '../../wallet';\nimport type {\n BackupAndSyncContext,\n LegacyUserStorageSyncedAccount,\n UserStorageSyncedWallet,\n UserStorageSyncedWalletGroup,\n} from '../types';\nimport { toErrorMessage } from '../utils/errors';\nimport {\n USER_STORAGE_GROUPS_FEATURE_KEY,\n USER_STORAGE_WALLETS_FEATURE_ENTRY_KEY,\n USER_STORAGE_WALLETS_FEATURE_KEY,\n} from './constants';\nimport {\n formatWalletForUserStorageUsage,\n formatGroupForUserStorageUsage,\n parseWalletFromUserStorageResponse,\n parseGroupFromUserStorageResponse,\n parseLegacyAccountFromUserStorageResponse,\n} from './format-utils';\nimport { executeWithRetry } from './network-utils';\n\n/**\n * Retrieves the wallet from user storage.\n *\n * @param context - The backup and sync context.\n * @param entropySourceId - The entropy source ID.\n * @returns The wallet from user storage or null if not found or invalid.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n */\nexport const getWalletFromUserStorage = async (\n context: BackupAndSyncContext,\n entropySourceId: string,\n): Promise<UserStorageSyncedWallet | null> => {\n return executeWithRetry(async () => {\n const walletData = await context.messenger.call(\n 'UserStorageController:performGetStorage',\n `${USER_STORAGE_WALLETS_FEATURE_KEY}.${USER_STORAGE_WALLETS_FEATURE_ENTRY_KEY}`,\n entropySourceId,\n );\n if (!walletData) {\n return null;\n }\n\n try {\n backupAndSyncLogger(\n `Retrieved wallet data from user storage: ${JSON.stringify(walletData)}`,\n );\n return parseWalletFromUserStorageResponse(walletData);\n } catch (error) {\n backupAndSyncLogger(\n `Failed to parse wallet data from user storage: ${toErrorMessage(error)}`,\n );\n return null;\n }\n });\n};\n\n/**\n * Pushes the wallet to user storage.\n *\n * @param context - The backup and sync context.\n * @param wallet - The wallet to push to user storage.\n * @returns A promise that resolves when the operation is complete.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n * @throws When JSON.stringify fails on the formatted wallet data.\n */\nexport const pushWalletToUserStorage = async (\n context: BackupAndSyncContext,\n wallet: AccountWalletEntropyObject,\n): Promise<void> => {\n return executeWithRetry(async () => {\n const formattedWallet = formatWalletForUserStorageUsage(context, wallet);\n const stringifiedWallet = JSON.stringify(formattedWallet);\n const entropySourceId = wallet.metadata.entropy.id;\n\n backupAndSyncLogger(`Pushing wallet to user storage: ${stringifiedWallet}`);\n\n return await context.messenger.call(\n 'UserStorageController:performSetStorage',\n `${USER_STORAGE_WALLETS_FEATURE_KEY}.${USER_STORAGE_WALLETS_FEATURE_ENTRY_KEY}`,\n stringifiedWallet,\n entropySourceId,\n );\n });\n};\n\n/**\n * Retrieves all groups from user storage.\n *\n * @param context - The backup and sync context.\n * @param entropySourceId - The entropy source ID.\n * @returns An array of groups from user storage.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n */\nexport const getAllGroupsFromUserStorage = async (\n context: BackupAndSyncContext,\n entropySourceId: string,\n): Promise<UserStorageSyncedWalletGroup[]> => {\n return executeWithRetry(async () => {\n const groupData = await context.messenger.call(\n 'UserStorageController:performGetStorageAllFeatureEntries',\n `${USER_STORAGE_GROUPS_FEATURE_KEY}`,\n entropySourceId,\n );\n if (!groupData) {\n return [];\n }\n\n const allGroups = groupData\n .map((stringifiedGroup) => {\n try {\n return parseGroupFromUserStorageResponse(stringifiedGroup);\n } catch (error) {\n backupAndSyncLogger(\n `Failed to parse group data from user storage: ${toErrorMessage(error)}`,\n );\n return null;\n }\n })\n .filter((group): group is UserStorageSyncedWalletGroup => group !== null);\n\n backupAndSyncLogger(\n `Retrieved groups from user storage: ${JSON.stringify(allGroups)}`,\n );\n\n return allGroups;\n });\n};\n\n/**\n * Retrieves a single group from user storage by group index.\n *\n * @param context - The backup and sync context.\n * @param entropySourceId - The entropy source ID.\n * @param groupIndex - The group index to retrieve.\n * @returns The group from user storage or null if not found or invalid.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n */\nexport const getGroupFromUserStorage = async (\n context: BackupAndSyncContext,\n entropySourceId: string,\n groupIndex: number,\n): Promise<UserStorageSyncedWalletGroup | null> => {\n return executeWithRetry(async () => {\n const groupData = await context.messenger.call(\n 'UserStorageController:performGetStorage',\n `${USER_STORAGE_GROUPS_FEATURE_KEY}.${groupIndex}`,\n entropySourceId,\n );\n if (!groupData) {\n return null;\n }\n\n try {\n return parseGroupFromUserStorageResponse(groupData);\n } catch (error) {\n backupAndSyncLogger(\n `Failed to parse group data from user storage: ${toErrorMessage(error)}`,\n );\n return null;\n }\n });\n};\n\n/**\n * Pushes a group to user storage.\n *\n * @param context - The backup and sync context.\n * @param group - The group to push to user storage.\n * @param entropySourceId - The entropy source ID.\n * @returns A promise that resolves when the operation is complete.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n * @throws When JSON.stringify fails on the formatted group data.\n */\nexport const pushGroupToUserStorage = async (\n context: BackupAndSyncContext,\n group: AccountGroupMultichainAccountObject,\n entropySourceId: string,\n): Promise<void> => {\n return executeWithRetry(async () => {\n const formattedGroup = formatGroupForUserStorageUsage(context, group);\n const stringifiedGroup = JSON.stringify(formattedGroup);\n\n backupAndSyncLogger(`Pushing group to user storage: ${stringifiedGroup}`);\n\n return await context.messenger.call(\n 'UserStorageController:performSetStorage',\n `${USER_STORAGE_GROUPS_FEATURE_KEY}.${formattedGroup.groupIndex}`,\n stringifiedGroup,\n entropySourceId,\n );\n });\n};\n\n/**\n * Pushes a batch of groups to user storage.\n *\n * @param context - The backup and sync context.\n * @param groups - The groups to push to user storage.\n * @param entropySourceId - The entropy source ID.\n * @returns A promise that resolves when the operation is complete.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n * @throws When JSON.stringify fails on any of the formatted group data.\n */\nexport const pushGroupToUserStorageBatch = async (\n context: BackupAndSyncContext,\n groups: AccountGroupMultichainAccountObject[],\n entropySourceId: string,\n): Promise<void> => {\n return executeWithRetry(async () => {\n const formattedGroups = groups.map((group) =>\n formatGroupForUserStorageUsage(context, group),\n );\n\n const entries: [string, string][] = formattedGroups.map((group) => [\n String(group.groupIndex),\n JSON.stringify(group),\n ]);\n\n backupAndSyncLogger(\n `Pushing groups to user storage: ${entries.map(([_, value]) => value).join(', ')}`,\n );\n\n return await context.messenger.call(\n 'UserStorageController:performBatchSetStorage',\n USER_STORAGE_GROUPS_FEATURE_KEY,\n entries,\n entropySourceId,\n );\n });\n};\n\n/**\n * Retrieves legacy user storage accounts for a specific entropy source ID.\n *\n * @param context - The backup and sync context.\n * @param entropySourceId - The entropy source ID to retrieve data for.\n * @returns A promise that resolves with the legacy user storage accounts.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n */\nexport const getAllLegacyUserStorageAccounts = async (\n context: BackupAndSyncContext,\n entropySourceId: string,\n): Promise<LegacyUserStorageSyncedAccount[]> => {\n return executeWithRetry(async () => {\n const accountsData = await context.messenger.call(\n 'UserStorageController:performGetStorageAllFeatureEntries',\n SDK.USER_STORAGE_FEATURE_NAMES.accounts,\n entropySourceId,\n );\n\n if (!accountsData) {\n return [];\n }\n\n const allAccounts = accountsData\n .map((stringifiedAccount) => {\n try {\n return parseLegacyAccountFromUserStorageResponse(stringifiedAccount);\n } catch (error) {\n backupAndSyncLogger(\n `Failed to parse legacy account data from user storage: ${toErrorMessage(error)}`,\n );\n return null;\n }\n })\n .filter(\n (account): account is LegacyUserStorageSyncedAccount =>\n account !== null,\n );\n\n backupAndSyncLogger(\n `Retrieved legacy accounts from user storage: ${JSON.stringify(allAccounts)}`,\n );\n\n return allAccounts;\n });\n};\n"]}
|
|
1
|
+
{"version":3,"file":"network-operations.mjs","sourceRoot":"","sources":["../../../src/backup-and-sync/user-storage/network-operations.ts"],"names":[],"mappings":"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","sourcesContent":["import { SDK } from '@metamask/profile-sync-controller';\n\nimport type { AccountGroupMultichainAccountObject } from '../../group';\nimport { backupAndSyncLogger } from '../../logger';\nimport type { AccountWalletEntropyObject } from '../../wallet';\nimport type {\n BackupAndSyncContext,\n LegacyUserStorageSyncedAccount,\n UserStorageSyncedWallet,\n UserStorageSyncedWalletGroup,\n} from '../types';\nimport { toErrorMessage } from '../utils/errors';\nimport {\n USER_STORAGE_GROUPS_FEATURE_KEY,\n USER_STORAGE_WALLETS_FEATURE_ENTRY_KEY,\n USER_STORAGE_WALLETS_FEATURE_KEY,\n} from './constants';\nimport {\n formatWalletForUserStorageUsage,\n formatGroupForUserStorageUsage,\n parseWalletFromUserStorageResponse,\n parseGroupFromUserStorageResponse,\n parseLegacyAccountFromUserStorageResponse,\n} from './format-utils';\nimport { executeWithRetry } from './network-utils';\n\n/**\n * Retrieves the wallet from user storage.\n *\n * @param context - The backup and sync context.\n * @param entropySourceId - The entropy source ID.\n * @returns The wallet from user storage or null if not found or invalid.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n */\nexport const getWalletFromUserStorage = async (\n context: BackupAndSyncContext,\n entropySourceId: string,\n): Promise<UserStorageSyncedWallet | null> => {\n return executeWithRetry(async () => {\n const walletData = await context.messenger.call(\n 'UserStorageController:performGetStorage',\n `${USER_STORAGE_WALLETS_FEATURE_KEY}.${USER_STORAGE_WALLETS_FEATURE_ENTRY_KEY}`,\n entropySourceId,\n );\n if (!walletData) {\n return null;\n }\n\n try {\n backupAndSyncLogger(\n `Retrieved wallet data from user storage: ${JSON.stringify(walletData)}`,\n );\n return parseWalletFromUserStorageResponse(walletData);\n } catch (error) {\n backupAndSyncLogger(\n `Failed to parse wallet data from user storage: ${toErrorMessage(error)}`,\n );\n return null;\n }\n });\n};\n\n/**\n * Pushes the wallet to user storage.\n *\n * @param context - The backup and sync context.\n * @param wallet - The wallet to push to user storage.\n * @returns A promise that resolves when the operation is complete.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n * @throws When JSON.stringify fails on the formatted wallet data.\n */\nexport const pushWalletToUserStorage = async (\n context: BackupAndSyncContext,\n wallet: AccountWalletEntropyObject,\n): Promise<void> => {\n return executeWithRetry(async () => {\n const formattedWallet = formatWalletForUserStorageUsage(context, wallet);\n const stringifiedWallet = JSON.stringify(formattedWallet);\n const entropySourceId = wallet.metadata.entropy.id;\n\n backupAndSyncLogger(`Pushing wallet to user storage: ${stringifiedWallet}`);\n\n const result = await context.messenger.call(\n 'UserStorageController:performSetStorage',\n `${USER_STORAGE_WALLETS_FEATURE_KEY}.${USER_STORAGE_WALLETS_FEATURE_ENTRY_KEY}`,\n stringifiedWallet,\n entropySourceId,\n );\n context.mutationTracker?.setRemoteWrite(true);\n return result;\n });\n};\n\n/**\n * Retrieves all groups from user storage.\n *\n * @param context - The backup and sync context.\n * @param entropySourceId - The entropy source ID.\n * @returns An array of groups from user storage.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n */\nexport const getAllGroupsFromUserStorage = async (\n context: BackupAndSyncContext,\n entropySourceId: string,\n): Promise<UserStorageSyncedWalletGroup[]> => {\n return executeWithRetry(async () => {\n const groupData = await context.messenger.call(\n 'UserStorageController:performGetStorageAllFeatureEntries',\n `${USER_STORAGE_GROUPS_FEATURE_KEY}`,\n entropySourceId,\n );\n if (!groupData) {\n return [];\n }\n\n const allGroups = groupData\n .map((stringifiedGroup) => {\n try {\n return parseGroupFromUserStorageResponse(stringifiedGroup);\n } catch (error) {\n backupAndSyncLogger(\n `Failed to parse group data from user storage: ${toErrorMessage(error)}`,\n );\n return null;\n }\n })\n .filter((group): group is UserStorageSyncedWalletGroup => group !== null);\n\n backupAndSyncLogger(\n `Retrieved groups from user storage: ${JSON.stringify(allGroups)}`,\n );\n\n return allGroups;\n });\n};\n\n/**\n * Retrieves a single group from user storage by group index.\n *\n * @param context - The backup and sync context.\n * @param entropySourceId - The entropy source ID.\n * @param groupIndex - The group index to retrieve.\n * @returns The group from user storage or null if not found or invalid.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n */\nexport const getGroupFromUserStorage = async (\n context: BackupAndSyncContext,\n entropySourceId: string,\n groupIndex: number,\n): Promise<UserStorageSyncedWalletGroup | null> => {\n return executeWithRetry(async () => {\n const groupData = await context.messenger.call(\n 'UserStorageController:performGetStorage',\n `${USER_STORAGE_GROUPS_FEATURE_KEY}.${groupIndex}`,\n entropySourceId,\n );\n if (!groupData) {\n return null;\n }\n\n try {\n return parseGroupFromUserStorageResponse(groupData);\n } catch (error) {\n backupAndSyncLogger(\n `Failed to parse group data from user storage: ${toErrorMessage(error)}`,\n );\n return null;\n }\n });\n};\n\n/**\n * Pushes a group to user storage.\n *\n * @param context - The backup and sync context.\n * @param group - The group to push to user storage.\n * @param entropySourceId - The entropy source ID.\n * @returns A promise that resolves when the operation is complete.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n * @throws When JSON.stringify fails on the formatted group data.\n */\nexport const pushGroupToUserStorage = async (\n context: BackupAndSyncContext,\n group: AccountGroupMultichainAccountObject,\n entropySourceId: string,\n): Promise<void> => {\n return executeWithRetry(async () => {\n const formattedGroup = formatGroupForUserStorageUsage(context, group);\n const stringifiedGroup = JSON.stringify(formattedGroup);\n\n backupAndSyncLogger(`Pushing group to user storage: ${stringifiedGroup}`);\n\n const result = await context.messenger.call(\n 'UserStorageController:performSetStorage',\n `${USER_STORAGE_GROUPS_FEATURE_KEY}.${formattedGroup.groupIndex}`,\n stringifiedGroup,\n entropySourceId,\n );\n context.mutationTracker?.setRemoteWrite(true);\n return result;\n });\n};\n\n/**\n * Pushes a batch of groups to user storage.\n *\n * @param context - The backup and sync context.\n * @param groups - The groups to push to user storage.\n * @param entropySourceId - The entropy source ID.\n * @returns A promise that resolves when the operation is complete.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n * @throws When JSON.stringify fails on any of the formatted group data.\n */\nexport const pushGroupToUserStorageBatch = async (\n context: BackupAndSyncContext,\n groups: AccountGroupMultichainAccountObject[],\n entropySourceId: string,\n): Promise<void> => {\n return executeWithRetry(async () => {\n const formattedGroups = groups.map((group) =>\n formatGroupForUserStorageUsage(context, group),\n );\n\n const entries: [string, string][] = formattedGroups.map((group) => [\n String(group.groupIndex),\n JSON.stringify(group),\n ]);\n\n backupAndSyncLogger(\n `Pushing groups to user storage: ${entries.map(([_, value]) => value).join(', ')}`,\n );\n\n const result = await context.messenger.call(\n 'UserStorageController:performBatchSetStorage',\n USER_STORAGE_GROUPS_FEATURE_KEY,\n entries,\n entropySourceId,\n );\n context.mutationTracker?.setRemoteWrite(true);\n return result;\n });\n};\n\n/**\n * Retrieves legacy user storage accounts for a specific entropy source ID.\n *\n * @param context - The backup and sync context.\n * @param entropySourceId - The entropy source ID to retrieve data for.\n * @returns A promise that resolves with the legacy user storage accounts.\n * @throws When network operations fail after maximum retry attempts.\n * @throws When messenger calls to UserStorageController fail due to authentication errors, encryption/decryption failures, or network issues.\n */\nexport const getAllLegacyUserStorageAccounts = async (\n context: BackupAndSyncContext,\n entropySourceId: string,\n): Promise<LegacyUserStorageSyncedAccount[]> => {\n return executeWithRetry(async () => {\n const accountsData = await context.messenger.call(\n 'UserStorageController:performGetStorageAllFeatureEntries',\n SDK.USER_STORAGE_FEATURE_NAMES.accounts,\n entropySourceId,\n );\n\n if (!accountsData) {\n return [];\n }\n\n const allAccounts = accountsData\n .map((stringifiedAccount) => {\n try {\n return parseLegacyAccountFromUserStorageResponse(stringifiedAccount);\n } catch (error) {\n backupAndSyncLogger(\n `Failed to parse legacy account data from user storage: ${toErrorMessage(error)}`,\n );\n return null;\n }\n })\n .filter(\n (account): account is LegacyUserStorageSyncedAccount =>\n account !== null,\n );\n\n backupAndSyncLogger(\n `Retrieved legacy accounts from user storage: ${JSON.stringify(allAccounts)}`,\n );\n\n return allAccounts;\n });\n};\n"]}
|
|
@@ -14,8 +14,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.toErrorMessage = void 0;
|
|
17
|
+
exports.createSyncMutationTracker = exports.toErrorMessage = void 0;
|
|
18
18
|
__exportStar(require("./controller.cjs"), exports);
|
|
19
19
|
var errors_1 = require("./errors.cjs");
|
|
20
20
|
Object.defineProperty(exports, "toErrorMessage", { enumerable: true, get: function () { return errors_1.toErrorMessage; } });
|
|
21
|
+
var mutation_tracker_1 = require("./mutation-tracker.cjs");
|
|
22
|
+
Object.defineProperty(exports, "createSyncMutationTracker", { enumerable: true, get: function () { return mutation_tracker_1.createSyncMutationTracker; } });
|
|
21
23
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../../src/backup-and-sync/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,mDAA6B;AAC7B,uCAA0C;AAAjC,wGAAA,cAAc,OAAA","sourcesContent":["export * from './controller';\nexport { toErrorMessage } from './errors';\n"]}
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../../src/backup-and-sync/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,mDAA6B;AAC7B,uCAA0C;AAAjC,wGAAA,cAAc,OAAA;AACvB,2DAA+D;AAAtD,6HAAA,yBAAyB,OAAA","sourcesContent":["export * from './controller';\nexport { toErrorMessage } from './errors';\nexport { createSyncMutationTracker } from './mutation-tracker';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/backup-and-sync/utils/index.ts"],"names":[],"mappings":"AAAA,iCAA6B;AAC7B,OAAO,EAAE,cAAc,EAAE,qBAAiB"}
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/backup-and-sync/utils/index.ts"],"names":[],"mappings":"AAAA,iCAA6B;AAC7B,OAAO,EAAE,cAAc,EAAE,qBAAiB;AAC1C,OAAO,EAAE,yBAAyB,EAAE,+BAA2B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/backup-and-sync/utils/index.ts"],"names":[],"mappings":"AAAA,iCAA6B;AAC7B,OAAO,EAAE,cAAc,EAAE,qBAAiB"}
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/backup-and-sync/utils/index.ts"],"names":[],"mappings":"AAAA,iCAA6B;AAC7B,OAAO,EAAE,cAAc,EAAE,qBAAiB;AAC1C,OAAO,EAAE,yBAAyB,EAAE,+BAA2B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../src/backup-and-sync/utils/index.ts"],"names":[],"mappings":"AAAA,iCAA6B;AAC7B,OAAO,EAAE,cAAc,EAAE,qBAAiB","sourcesContent":["export * from './controller';\nexport { toErrorMessage } from './errors';\n"]}
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../src/backup-and-sync/utils/index.ts"],"names":[],"mappings":"AAAA,iCAA6B;AAC7B,OAAO,EAAE,cAAc,EAAE,qBAAiB;AAC1C,OAAO,EAAE,yBAAyB,EAAE,+BAA2B","sourcesContent":["export * from './controller';\nexport { toErrorMessage } from './errors';\nexport { createSyncMutationTracker } from './mutation-tracker';\n"]}
|