@metamask/ocap-kernel
Version:
OCap kernel core components
1 lines • 11.8 kB
Source Map (JSON)
{"version":3,"file":"translators.cjs","sourceRoot":"","sources":["../../../src/store/methods/translators.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n VatOneResolution,\n VatSyscallObject,\n} from '@agoric/swingset-liveslots';\nimport type { CapData } from '@endo/marshal';\n\nimport { coerceMessage } from '../../types.ts';\nimport type { Message, VatId, KRef, VRef } from '../../types.ts';\nimport type { StoreContext } from '../types.ts';\nimport { getCListMethods } from './clist.ts';\nimport { getVatMethods } from './vat.ts';\nimport { Fail } from '../../utils/assert.ts';\n\n/**\n * Create a translator object that provides functionality for translating\n * references and messages between kernel and vat spaces.\n *\n * @param ctx - The store context.\n * @returns A translator object that maps various kernel data structures\n * onto `kv`.\n */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nexport function getTranslators(ctx: StoreContext) {\n const { krefToEref, erefToKref, allocateErefForKref } = getCListMethods(ctx);\n const { exportFromVat } = getVatMethods(ctx);\n\n /**\n * Translate a reference from kernel space into vat space.\n *\n * @param vatId - The vat for whom translation is desired.\n * @param kref - The KRef of the entity of interest.\n * @param importIfNeeded - If true, allocate a new clist entry if necessary;\n * if false, require that such an entry already exist.\n *\n * @returns the VRef corresponding to `kref` in `vatId`.\n */\n function translateRefKtoV(\n vatId: VatId,\n kref: KRef,\n importIfNeeded: boolean,\n ): VRef {\n let eref = krefToEref(vatId, kref);\n if (!eref) {\n if (importIfNeeded) {\n eref = allocateErefForKref(vatId, kref);\n } else {\n throw Fail`unmapped kref ${kref} vat=${vatId}`;\n }\n }\n return eref;\n }\n\n /**\n * Translate a capdata object from kernel space into vat space.\n *\n * @param vatId - The vat for whom translation is desired.\n * @param capdata - The object to be translated.\n *\n * @returns a translated copy of `capdata` intelligible to `vatId`.\n */\n function translateCapDataKtoV(\n vatId: VatId,\n capdata: CapData<KRef>,\n ): CapData<VRef> {\n const slots: VRef[] = [];\n for (const slot of capdata.slots) {\n slots.push(translateRefKtoV(vatId, slot, true));\n }\n return { body: capdata.body, slots };\n }\n\n /**\n * Translate a message from kernel space into vat space.\n *\n * @param vatId - The vat for whom translation is desired.\n * @param message - The message to be translated.\n *\n * @returns a translated copy of `message` intelligible to `vatId`.\n */\n function translateMessageKtoV(vatId: VatId, message: Message): Message {\n const methargs = translateCapDataKtoV(\n vatId,\n message.methargs as CapData<KRef>,\n );\n const result = message.result\n ? translateRefKtoV(vatId, message.result, true)\n : message.result;\n const vatMessage = coerceMessage({ ...message, methargs, result });\n return vatMessage;\n }\n\n /**\n * Translate a reference from vat space into kernel space.\n *\n * @param vatId - The vat for whom translation is desired.\n * @param vref - The VRef of the entity of interest.\n *\n * @returns the KRef corresponding to `vref` in this vat.\n */\n function translateRefVtoK(vatId: VatId, vref: VRef): KRef {\n let kref = erefToKref(vatId, vref);\n kref ??= exportFromVat(vatId, vref);\n return kref;\n }\n\n /**\n * Translate a capdata object from vat space into kernel space.\n *\n * @param vatId - The vat for whom translation is desired.\n * @param capdata - The object to be translated.\n *\n * @returns a translated copy of `capdata` intelligible to the kernel.\n */\n function translateCapDataVtoK(\n vatId: VatId,\n capdata: CapData<VRef>,\n ): CapData<KRef> {\n const slots: KRef[] = [];\n for (const slot of capdata.slots) {\n slots.push(translateRefVtoK(vatId, slot));\n }\n return { body: capdata.body, slots };\n }\n\n /**\n * Translate a message from vat space into kernel space.\n *\n * @param vatId - The vat for whom translation is desired.\n * @param message - The message to be translated.\n *\n * @returns a translated copy of `message` intelligible to the kernel.\n */\n function translateMessageVtoK(vatId: VatId, message: Message): Message {\n const methargs = translateCapDataVtoK(\n vatId,\n message.methargs as CapData<VRef>,\n );\n if (typeof message.result !== 'string') {\n throw TypeError(`message result must be a string`);\n }\n const result = translateRefVtoK(vatId, message.result);\n return { methargs, result };\n }\n\n /**\n * Translate a syscall from vat space into kernel space.\n *\n * @param vatId - The vat for whom translation is desired.\n * @param vso - The syscall object to be translated.\n *\n * @returns a translated copy of `vso` intelligible to the kernel.\n */\n function translateSyscallVtoK(\n vatId: VatId,\n vso: VatSyscallObject,\n ): VatSyscallObject {\n let kso: VatSyscallObject;\n switch (vso[0]) {\n case 'send': {\n // [VRef, Message];\n const [op, target, message] = vso;\n kso = [\n op,\n translateRefVtoK(vatId, target),\n // @ts-expect-error: Agoric's Message type has the property `result: string | undefined | null`.\n // Ours is `result?: string | null`. We can safely ignore the `undefined` case.\n translateMessageVtoK(vatId, coerceMessage(message)),\n ];\n break;\n }\n case 'subscribe': {\n // [VRef];\n const [op, promise] = vso;\n kso = [op, translateRefVtoK(vatId, promise)];\n break;\n }\n case 'resolve': {\n // [VatOneResolution[]];\n const [op, resolutions] = vso;\n const kResolutions: VatOneResolution[] = resolutions.map(\n (resolution) => {\n const [vpid, rejected, data] = resolution;\n return [\n translateRefVtoK(vatId, vpid),\n rejected,\n translateCapDataVtoK(vatId, data as CapData<VRef>),\n ];\n },\n );\n kso = [op, kResolutions];\n break;\n }\n case 'exit': {\n // [boolean, SwingSetCapData];\n const [op, isFailure, info] = vso;\n kso = [\n op,\n isFailure,\n translateCapDataVtoK(vatId, info as CapData<VRef>),\n ];\n break;\n }\n case 'dropImports':\n case 'retireImports':\n case 'retireExports':\n case 'abandonExports': {\n // [VRef[]];\n const [op, vrefs] = vso;\n const krefs = vrefs.map((ref) => translateRefVtoK(vatId, ref));\n kso = [op, krefs];\n break;\n }\n case 'callNow':\n case 'vatstoreGet':\n case 'vatstoreGetNextKey':\n case 'vatstoreSet':\n case 'vatstoreDelete': {\n const [op] = vso;\n throw Error(`vat ${vatId} issued invalid syscall ${op}`);\n }\n default: {\n // Compile-time exhaustiveness check\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n throw Error(`vat ${vatId} issued unknown syscall ${vso[0]}`);\n }\n }\n return kso;\n }\n\n return {\n translateRefKtoV,\n translateCapDataKtoV,\n translateMessageKtoV,\n translateSyscallVtoK,\n };\n}\n"]}