{"version":3,"file":"controller.mjs","sourceRoot":"","sources":["../../../src/backup-and-sync/utils/controller.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n  AccountWalletType,\n  toMultichainAccountGroupId,\n  toMultichainAccountWalletId,\n} from '@metamask/account-api';\nimport type { AccountWalletId } from '@metamask/account-api';\n\nimport type { AccountGroupMultichainAccountObject } from '../../group';\nimport { backupAndSyncLogger } from '../../logger';\nimport type { AccountTreeControllerState } from '../../types';\nimport type { AccountWalletEntropyObject } from '../../wallet';\nimport type { BackupAndSyncContext } from '../types';\n\n/**\n * Gets all local entropy wallets that can be synced.\n *\n * @param context - The backup and sync context.\n * @returns Array of entropy wallet objects.\n */\nexport function getLocalEntropyWallets(\n  context: BackupAndSyncContext,\n): AccountWalletEntropyObject[] {\n  return Object.values(context.controller.state.accountTree.wallets).filter(\n    (wallet) => wallet.type === AccountWalletType.Entropy,\n  ) as AccountWalletEntropyObject[];\n}\n\n/**\n * Gets the local group for a specific entropy wallet by its source ID and group index.\n *\n * @param context - The backup and sync context.\n * @param entropySourceId - The entropy source ID.\n * @param groupIndex - The group index.\n * @returns The local group object if it exists, undefined otherwise.\n */\nexport const getLocalGroupForEntropyWallet = (\n  context: BackupAndSyncContext,\n  entropySourceId: string,\n  groupIndex: number,\n): AccountGroupMultichainAccountObject | undefined => {\n  const walletId = toMultichainAccountWalletId(entropySourceId);\n  const wallet = context.controller.state.accountTree.wallets[walletId];\n\n  if (wallet?.type !== AccountWalletType.Entropy) {\n    backupAndSyncLogger(\n      `Wallet ${walletId} not found or is not an entropy wallet`,\n    );\n    return undefined;\n  }\n\n  const groupId = toMultichainAccountGroupId(walletId, groupIndex);\n\n  return wallet.groups[groupId];\n};\n\n/**\n * Gets all groups for a specific entropy wallet.\n *\n * @param context - The backup and sync context.\n * @param walletId - The wallet ID to get groups for.\n * @returns Array of multichain account group objects.\n */\nexport function getLocalGroupsForEntropyWallet(\n  context: BackupAndSyncContext,\n  walletId: AccountWalletId,\n): AccountGroupMultichainAccountObject[] {\n  const wallet = context.controller.state.accountTree.wallets[walletId];\n  if (wallet?.type !== AccountWalletType.Entropy) {\n    backupAndSyncLogger(\n      `Wallet ${walletId} not found or is not an entropy wallet`,\n    );\n    return [];\n  }\n\n  return Object.values(wallet.groups);\n}\n\n/**\n * State snapshot type for rollback operations.\n * Captures all the state that needs to be restored in case of sync failures.\n */\nexport type StateSnapshot = {\n  accountGroupsMetadata: AccountTreeControllerState['accountGroupsMetadata'];\n  accountWalletsMetadata: AccountTreeControllerState['accountWalletsMetadata'];\n  selectedAccountGroup: AccountTreeControllerState['selectedAccountGroup'];\n  accountTreeWallets: AccountTreeControllerState['accountTree']['wallets'];\n};\n\n/**\n * Creates a snapshot of the current controller state for rollback purposes.\n * Captures all state including the account tree structure.\n *\n * @param context - The backup and sync context containing controller and messenger.\n * @returns A deep copy of relevant state that can be restored later.\n */\nexport function createStateSnapshot(\n  context: BackupAndSyncContext,\n): StateSnapshot {\n  return {\n    accountGroupsMetadata: JSON.parse(\n      JSON.stringify(context.controller.state.accountGroupsMetadata),\n    ),\n    accountWalletsMetadata: JSON.parse(\n      JSON.stringify(context.controller.state.accountWalletsMetadata),\n    ),\n    selectedAccountGroup: context.controller.state.selectedAccountGroup,\n    accountTreeWallets: JSON.parse(\n      JSON.stringify(context.controller.state.accountTree.wallets),\n    ),\n  };\n}\n\n/**\n * Restores state using an update callback.\n * Restores both persisted metadata and the complete account tree structure.\n * Uses the controller's init() method to rebuild internal maps correctly.\n *\n * @param context - The backup and sync context containing controller and messenger.\n * @param snapshot - The state snapshot to restore.\n */\nexport function restoreStateFromSnapshot(\n  context: BackupAndSyncContext,\n  snapshot: StateSnapshot,\n): void {\n  context.controllerStateUpdateFn((state) => {\n    state.accountGroupsMetadata = snapshot.accountGroupsMetadata;\n    state.accountWalletsMetadata = snapshot.accountWalletsMetadata;\n    state.selectedAccountGroup = snapshot.selectedAccountGroup;\n    state.accountTree.wallets = snapshot.accountTreeWallets;\n  });\n\n  // Use init() to rebuild the internal maps from the restored account tree state\n  // This ensures that the internal maps (#accountIdToContext and #groupIdToWalletId)\n  // are correctly synchronized with the restored account tree structure\n  context.controller.init();\n}\n"]}