UNPKG

@metamask/ocap-kernel

Version:
1 lines 20.1 kB
{"version":3,"file":"vat.cjs","sourceRoot":"","sources":["../../../src/store/methods/vat.ts"],"names":[],"mappings":"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","sourcesContent":["import { Fail } from '@endo/errors';\n\nimport { getBaseMethods } from './base.ts';\nimport { getCListMethods } from './clist.ts';\nimport { getObjectMethods } from './object.ts';\nimport { getPromiseMethods } from './promise.ts';\nimport { getReachableMethods } from './reachable.ts';\nimport { getRefCountMethods } from './refcount.ts';\nimport { insistVatId } from '../../types.ts';\nimport type { EndpointId, KRef, VatConfig, VatId, VRef } from '../../types.ts';\nimport type { StoreContext, VatCleanupWork } from '../types.ts';\nimport { parseRef } from '../utils/parse-ref.ts';\nimport { parseReachableAndVatSlot } from '../utils/reachable.ts';\n\ntype VatRecord = {\n vatID: VatId;\n vatConfig: VatConfig;\n};\n\nconst VAT_CONFIG_BASE = 'vatConfig.';\nconst VAT_CONFIG_BASE_LEN = VAT_CONFIG_BASE.length;\n\n/**\n * Get a vat store object that provides functionality for managing vat records.\n *\n * @param ctx - The store context.\n * @returns A vat store object that maps various persistent kernel data\n */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nexport function getVatMethods(ctx: StoreContext) {\n const { kv } = ctx;\n const { getPrefixedKeys, getSlotKey, getOwnerKey } = getBaseMethods(ctx.kv);\n const { deleteCListEntry } = getCListMethods(ctx);\n const { getReachableAndVatSlot } = getReachableMethods(ctx);\n const { initKernelPromise, setPromiseDecider, getKernelPromise } =\n getPromiseMethods(ctx);\n const { initKernelObject } = getObjectMethods(ctx);\n const { addCListEntry } = getCListMethods(ctx);\n const { incrementRefCount, decrementRefCount } = getRefCountMethods(ctx);\n\n /**\n * Delete all persistent state associated with an endpoint.\n *\n * @param endpointId - The endpoint whose state is to be deleted.\n */\n function deleteEndpoint(endpointId: EndpointId): void {\n for (const key of getPrefixedKeys(`cle.${endpointId}.`)) {\n kv.delete(key);\n }\n for (const key of getPrefixedKeys(`clk.${endpointId}.`)) {\n kv.delete(key);\n }\n kv.delete(`e.nextObjectId.${endpointId}`);\n kv.delete(`e.nextPromiseId.${endpointId}`);\n }\n\n /**\n * Generator that yields the configurations of running vats.\n *\n * @yields a series of vat records for all configured vats.\n */\n function* getAllVatRecords(): Generator<VatRecord> {\n for (const vatKey of getPrefixedKeys(VAT_CONFIG_BASE)) {\n const vatID = vatKey.slice(VAT_CONFIG_BASE_LEN);\n const vatConfig = getVatConfig(vatID);\n yield { vatID, vatConfig };\n }\n }\n\n /**\n * Get all vat IDs from the store.\n *\n * @returns an array of vat IDs.\n */\n function getVatIDs(): VatId[] {\n return Array.from(getPrefixedKeys(VAT_CONFIG_BASE)).map((vatKey) =>\n vatKey.slice(VAT_CONFIG_BASE_LEN),\n );\n }\n\n /**\n * Fetch the stored configuration for a vat.\n *\n * @param vatID - The vat whose configuration is sought.\n *\n * @returns the configuration for the given vat.\n */\n function getVatConfig(vatID: VatId): VatConfig {\n return JSON.parse(\n kv.getRequired(`${VAT_CONFIG_BASE}${vatID}`),\n ) as VatConfig;\n }\n\n /**\n * Check if a vat is active.\n *\n * @param vatID - The ID of the vat to check.\n * @returns True if the vat is active, false otherwise.\n */\n function isVatActive(vatID: VatId): boolean {\n return kv.get(`${VAT_CONFIG_BASE}${vatID}`) !== undefined;\n }\n\n /**\n * Store the configuration for a vat.\n *\n * @param vatID - The vat whose configuration is to be set.\n * @param vatConfig - The configuration to write.\n */\n function setVatConfig(vatID: VatId, vatConfig: VatConfig): void {\n kv.set(`${VAT_CONFIG_BASE}${vatID}`, JSON.stringify(vatConfig));\n }\n\n /**\n * Delete the stored configuration for a vat.\n *\n * @param vatID - The vat whose configuration is to be deleted.\n */\n function deleteVatConfig(vatID: VatId): void {\n kv.delete(`${VAT_CONFIG_BASE}${vatID}`);\n }\n\n /**\n * Checks if a vat imports the specified kernel slot.\n *\n * @param vatID - The ID of the vat to check.\n * @param kernelSlot - The kernel slot reference.\n * @returns True if the vat imports the kernel slot, false otherwise.\n */\n function importsKernelSlot(vatID: VatId, kernelSlot: KRef): boolean {\n const data = ctx.kv.get(getSlotKey(vatID, kernelSlot));\n if (data) {\n const { vatSlot } = parseReachableAndVatSlot(data);\n const { direction } = parseRef(vatSlot);\n if (direction === 'import') {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Gets all vats that import a specific kernel object.\n *\n * @param koid - The kernel object ID.\n * @returns An array of vat IDs that import the kernel object.\n */\n function getImporters(koid: KRef): VatId[] {\n const importers = [];\n importers.push(\n ...getVatIDs().filter((vatID) => importsKernelSlot(vatID, koid)),\n );\n importers.sort();\n return importers;\n }\n\n /**\n * Get the list of terminated vats.\n *\n * @returns an array of terminated vat IDs.\n */\n function getTerminatedVats(): VatId[] {\n return JSON.parse(ctx.terminatedVats.get() ?? '[]');\n }\n\n /**\n * Check if a vat is terminated.\n *\n * @param vatID - The ID of the vat to check.\n * @returns True if the vat is terminated, false otherwise.\n */\n function isVatTerminated(vatID: VatId): boolean {\n return getTerminatedVats().includes(vatID);\n }\n\n /**\n * Add a vat to the list of terminated vats.\n *\n * @param vatID - The ID of the vat to add.\n */\n function markVatAsTerminated(vatID: VatId): void {\n const terminatedVats = getTerminatedVats();\n if (!terminatedVats.includes(vatID)) {\n terminatedVats.push(vatID);\n ctx.terminatedVats.set(JSON.stringify(terminatedVats));\n }\n }\n\n /**\n * Remove a vat from the list of terminated vats.\n *\n * @param vatID - The ID of the vat to remove.\n */\n function forgetTerminatedVat(vatID: VatId): void {\n const terminatedVats = getTerminatedVats().filter((id) => id !== vatID);\n ctx.terminatedVats.set(JSON.stringify(terminatedVats));\n }\n\n /**\n * Cleanup a terminated vat.\n *\n * @param vatID - The ID of the vat to cleanup.\n * @returns The work done during the cleanup.\n */\n function cleanupTerminatedVat(vatID: VatId): VatCleanupWork {\n const work = {\n exports: 0,\n imports: 0,\n promises: 0,\n kv: 0,\n };\n\n if (!isVatTerminated(vatID)) {\n return work;\n }\n\n const clistPrefix = `${vatID}.c.`;\n const exportPrefix = `${clistPrefix}o+`;\n const importPrefix = `${clistPrefix}o-`;\n const promisePrefix = `${clistPrefix}p`;\n\n // Note: ASCII order is \"+,-./\", and we rely upon this to split the\n // keyspace into the various o+NN/o-NN/etc spaces. If we were using a\n // more sophisticated database, we'd keep each section in a separate\n // table.\n\n // The current store semantics ensure this iteration is lexicographic.\n // Any changes to the creation of the list of promises to be rejected (and\n // thus to the order in which they *get* rejected) need to preserve this\n // ordering in order to preserve determinism.\n\n // first, scan for exported objects, which must be orphaned\n for (const key of getPrefixedKeys(exportPrefix)) {\n // The void for an object exported by a vat will always be of the form\n // `o+NN`. The '+' means that the vat exported the object (rather than\n // importing it) and therefore the object is owned by (i.e., within) the\n // vat. The corresponding void->koid c-list entry will thus always\n // begin with `vMM.c.o+`. In addition to deleting the c-list entry, we\n // must also delete the corresponding kernel owner entry for the object,\n // since the object will no longer be accessible.\n assert(key.startsWith(clistPrefix), key);\n const vref = key.slice(clistPrefix.length);\n assert(vref.startsWith('o+'), vref);\n const kref = ctx.kv.get(key);\n assert(kref, key);\n // deletes c-list and .owner, adds to maybeFreeKrefs\n const ownerKey = getOwnerKey(kref);\n const ownerVat = ctx.kv.get(ownerKey);\n ownerVat === vatID || Fail`export ${kref} not owned by old vat`;\n ctx.kv.delete(ownerKey);\n const { vatSlot } = getReachableAndVatSlot(vatID, kref);\n ctx.kv.delete(getSlotKey(vatID, kref));\n ctx.kv.delete(getSlotKey(vatID, vatSlot));\n // Decrease refcounts that belonged to the terminating vat\n decrementRefCount(kref, 'cleanup|export|baseline');\n ctx.maybeFreeKrefs.add(kref);\n work.exports += 1;\n }\n\n // then scan for imported objects, which must be decrefed\n for (const key of getPrefixedKeys(importPrefix)) {\n // abandoned imports: delete the clist entry as if the vat did a\n // drop+retire\n const kref = ctx.kv.get(key) ?? Fail`getNextKey ensures get`;\n assert(key.startsWith(clistPrefix), key);\n const vref = key.slice(clistPrefix.length);\n deleteCListEntry(vatID, kref, vref);\n // that will also delete both db keys\n work.imports += 1;\n }\n\n // The caller used enumeratePromisesByDecider() before calling us,\n // so they have already rejected the orphan promises, but those\n // kpids are still present in the dead vat's c-list. Clean those up now.\n for (const key of getPrefixedKeys(promisePrefix)) {\n const kref = ctx.kv.get(key) ?? Fail`getNextKey ensures get`;\n assert(key.startsWith(clistPrefix), key);\n const vref = key.slice(clistPrefix.length);\n // the following will also delete both db keys\n deleteCListEntry(vatID, kref, vref);\n // If the dead vat was still the decider, drop the decider’s refcount, too.\n const kp = getKernelPromise(kref);\n if (kp.decider === vatID) {\n decrementRefCount(kref, 'cleanup|promise|decider');\n }\n work.promises += 1;\n }\n\n // Finally, clean up any remaining KV entries for this vat\n for (const key of getPrefixedKeys(`${vatID}.`)) {\n ctx.kv.delete(key);\n work.kv += 1;\n }\n\n // Clean up any remaining c-list entries and vat-specific counters\n deleteEndpoint(vatID);\n\n // Remove the vat from the terminated vats list\n forgetTerminatedVat(vatID);\n\n // Log the cleanup work done\n ctx.logger?.debug(`Cleaned up terminated vat ${vatID}:`, work);\n\n return work;\n }\n\n /**\n * Get the next terminated vat to cleanup.\n *\n * @returns The work done during the cleanup.\n */\n function nextTerminatedVatCleanup(): boolean {\n const vatID = getTerminatedVats()?.[0];\n vatID && cleanupTerminatedVat(vatID);\n return getTerminatedVats().length > 0;\n }\n\n /**\n * Create the kernel's representation of an export from a vat.\n *\n * @param vatId - The vat doing the exporting.\n * @param vref - The vat's ref for the entity in question.\n *\n * @returns the kref corresponding to the export of `vref` from `vatId`.\n */\n function exportFromVat(vatId: VatId, vref: VRef): KRef {\n insistVatId(vatId);\n const { isPromise, context, direction } = parseRef(vref);\n assert(context === 'vat', `${vref} is not a VRef`);\n assert(direction === 'export', `${vref} is not an export reference`);\n let kref;\n if (isPromise) {\n kref = initKernelPromise()[0];\n setPromiseDecider(kref, vatId);\n } else {\n kref = initKernelObject(vatId);\n }\n addCListEntry(vatId, kref, vref);\n incrementRefCount(kref, 'export', {\n isExport: true,\n onlyRecognizable: true,\n });\n ctx.logger?.debug('exportFromVat', vatId, vref, kref);\n return kref;\n }\n\n return {\n deleteEndpoint,\n getAllVatRecords,\n getVatConfig,\n setVatConfig,\n deleteVatConfig,\n getVatIDs,\n importsKernelSlot,\n getImporters,\n getTerminatedVats,\n markVatAsTerminated,\n forgetTerminatedVat,\n isVatTerminated,\n cleanupTerminatedVat,\n nextTerminatedVatCleanup,\n exportFromVat,\n isVatActive,\n };\n}\n"]}