UNPKG

@metamask/ocap-kernel

Version:
1 lines 12.7 kB
{"version":3,"file":"subclusters.cjs","sourceRoot":"","sources":["../../../src/store/methods/subclusters.ts"],"names":[],"mappings":"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","sourcesContent":["import { Fail } from '@endo/errors';\nimport { SubclusterNotFoundError } from '@metamask/kernel-errors';\n\nimport type {\n ClusterConfig,\n Subcluster,\n SubclusterId,\n VatId,\n} from '../../types.ts';\nimport type { StoreContext } from '../types.ts';\nimport { getBaseMethods } from './base.ts';\n\n/**\n * Get a subcluster store object that provides functionality for managing subcluster records.\n *\n * @param ctx - The store context.\n * @returns A subcluster store object that maps various persistent kernel data\n * structures.\n */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nexport function getSubclusterMethods(ctx: StoreContext) {\n const { kv } = ctx;\n const { incCounter } = getBaseMethods(kv);\n\n /**\n * Retrieves all subclusters from persistent storage.\n *\n * @returns An array of all stored subclusters.\n */\n function getSubclusters(): Subcluster[] {\n const subclustersJSON = ctx.subclusters.get();\n return subclustersJSON ? (JSON.parse(subclustersJSON) as Subcluster[]) : [];\n }\n\n /**\n * Saves all subclusters to persistent storage.\n *\n * @param subclusters - The array of subclusters to save.\n */\n function saveAllSubclustersToStorage(subclusters: Subcluster[]): void {\n ctx.subclusters.set(JSON.stringify(subclusters));\n }\n\n /**\n * Retrieves the vat to subcluster mapping from persistent storage.\n *\n * @returns A record mapping VatIds to SubclusterIds.\n */\n function getVatToSubclusterMap(): Record<VatId, SubclusterId> {\n const mapJSON = ctx.vatToSubclusterMap.get();\n return mapJSON ? (JSON.parse(mapJSON) as Record<VatId, SubclusterId>) : {};\n }\n\n /**\n * Saves the vat to subcluster mapping to persistent storage.\n *\n * @param map - The vat to subcluster map to save.\n */\n function saveVatToSubclusterMapToStorage(\n map: Record<VatId, SubclusterId>,\n ): void {\n ctx.vatToSubclusterMap.set(JSON.stringify(map));\n }\n\n /**\n * Adds a new subcluster with the given configuration.\n *\n * @param config - The configuration for the new subcluster.\n * @returns The ID of the newly created subcluster.\n */\n function addSubcluster(config: ClusterConfig): SubclusterId {\n const currentSubclusters = getSubclusters();\n const newId = `s${incCounter(ctx.nextSubclusterId)}`;\n const newSubcluster: Subcluster = {\n id: newId,\n config,\n vats: [],\n };\n currentSubclusters.push(newSubcluster);\n saveAllSubclustersToStorage(currentSubclusters);\n return newId;\n }\n\n /**\n * Retrieves a specific subcluster by its ID.\n *\n * @param subclusterId - The ID of the subcluster to retrieve.\n * @returns The subcluster if found, otherwise undefined.\n */\n function getSubcluster(subclusterId: SubclusterId): Subcluster | undefined {\n const currentSubclusters = getSubclusters();\n return currentSubclusters.find((sc) => sc.id === subclusterId);\n }\n\n /**\n * Adds a vat to the specified subcluster.\n *\n * @param subclusterId - The ID of the subcluster.\n * @param vatId - The ID of the vat to add.\n * @throws If the subcluster is not found.\n */\n function addSubclusterVat(subclusterId: SubclusterId, vatId: VatId): void {\n const currentSubclusters = getSubclusters();\n const subcluster = currentSubclusters.find((sc) => sc.id === subclusterId);\n\n if (!subcluster) {\n throw new SubclusterNotFoundError(subclusterId);\n }\n\n // Update vat mapping\n const currentMap = getVatToSubclusterMap();\n\n // Check if vat is already in another subcluster\n if (currentMap[vatId] && currentMap[vatId] !== subclusterId) {\n throw new Error(\n `Cannot add vat ${vatId} to subcluster ${subclusterId} as it already belongs to subcluster ${currentMap[vatId]}.`,\n );\n }\n\n // Add vat to subcluster if not already present\n if (!subcluster.vats.includes(vatId)) {\n subcluster.vats.push(vatId);\n }\n\n // Update the map and save all changes\n currentMap[vatId] = subclusterId;\n saveVatToSubclusterMapToStorage(currentMap);\n saveAllSubclustersToStorage(currentSubclusters);\n }\n\n /**\n * Retrieves all VATs associated with a specific subcluster.\n *\n * @param subclusterId - The ID of the subcluster.\n * @returns An array of VatIds associated with the subcluster.\n * @throws If the subcluster is not found.\n */\n function getSubclusterVats(subclusterId: SubclusterId): VatId[] {\n const subcluster = getSubcluster(subclusterId);\n if (!subcluster) {\n throw new SubclusterNotFoundError(subclusterId);\n }\n return [...subcluster.vats];\n }\n\n /**\n * Deletes a vat from a specified subcluster.\n *\n * @param subclusterId - The ID of the subcluster.\n * @param vatId - The ID of the vat to delete.\n */\n function deleteSubclusterVat(subclusterId: SubclusterId, vatId: VatId): void {\n const currentSubclusters = getSubclusters();\n const subcluster = currentSubclusters.find((sc) => sc.id === subclusterId);\n\n // Remove vat from subcluster's vats array if subcluster exists\n if (subcluster) {\n const vatIndex = subcluster.vats.indexOf(vatId);\n if (vatIndex > -1) {\n subcluster.vats.splice(vatIndex, 1);\n saveAllSubclustersToStorage(currentSubclusters);\n }\n }\n\n // Always remove vat from the mapping if it points to this subcluster\n const currentMap = getVatToSubclusterMap();\n if (currentMap[vatId] === subclusterId) {\n delete currentMap[vatId];\n saveVatToSubclusterMapToStorage(currentMap);\n }\n }\n\n /**\n * Deletes a subcluster and removes its VATs from the vat-to-subcluster map.\n *\n * @param subclusterId - The ID of the subcluster to delete.\n */\n function deleteSubcluster(subclusterId: SubclusterId): void {\n const currentSubclusters = getSubclusters();\n const subclusterToDelete = currentSubclusters.find(\n (sc) => sc.id === subclusterId,\n );\n\n if (!subclusterToDelete) {\n return;\n }\n\n // Remove subcluster from the list\n const updatedSubclusters = currentSubclusters.filter(\n (sc) => sc.id !== subclusterId,\n );\n saveAllSubclustersToStorage(updatedSubclusters);\n\n // Remove all vats from the mapping\n const currentMap = getVatToSubclusterMap();\n const vatsToRemove = subclusterToDelete.vats.filter(\n (vatId) => currentMap[vatId] === subclusterId,\n );\n\n if (vatsToRemove.length > 0) {\n for (const vatId of vatsToRemove) {\n delete currentMap[vatId];\n }\n saveVatToSubclusterMapToStorage(currentMap);\n }\n }\n\n /**\n * Retrieves the subcluster ID for a given vat ID.\n *\n * @param vatId - The ID of the vat.\n * @returns The ID of the subcluster the vat belongs to, or undefined if not found.\n */\n function getVatSubcluster(vatId: VatId): SubclusterId {\n const currentMap = getVatToSubclusterMap();\n return currentMap[vatId] ?? Fail`Vat ${vatId} has no subcluster`;\n }\n\n /**\n * Clears empty subclusters.\n */\n function clearEmptySubclusters(): void {\n const currentSubclusters = getSubclusters();\n const nonEmptySubclusters = currentSubclusters.filter(\n (sc) => sc.vats.length > 0,\n );\n if (nonEmptySubclusters.length !== currentSubclusters.length) {\n saveAllSubclustersToStorage(nonEmptySubclusters);\n }\n }\n\n /**\n * Removes a vat from its subcluster.\n *\n * @param vatId - The ID of the vat to remove.\n */\n function removeVatFromSubcluster(vatId: VatId): void {\n const subclusterId = getVatSubcluster(vatId);\n deleteSubclusterVat(subclusterId, vatId);\n }\n\n return {\n addSubcluster,\n getSubcluster,\n getSubclusters,\n deleteSubcluster,\n addSubclusterVat,\n getSubclusterVats,\n deleteSubclusterVat,\n getVatSubcluster,\n clearEmptySubclusters,\n removeVatFromSubcluster,\n };\n}\n"]}