@metamask/ocap-kernel
Version:
OCap kernel core components
1 lines • 5.89 kB
Source Map (JSON)
{"version":3,"file":"syscall.cjs","sourceRoot":"","sources":["../../src/services/syscall.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n insistVatSyscallObject,\n insistVatSyscallResult,\n} from '@agoric/swingset-liveslots';\nimport type {\n VatSyscallObject,\n VatOneResolution,\n} from '@agoric/swingset-liveslots';\nimport type { CapData } from '@endo/marshal';\nimport type { KVStore } from '@metamask/kernel-store';\nimport type { Logger } from '@metamask/logger';\n\nimport type { Syscall, SyscallResult } from './types.ts';\nimport type { VatSupervisor } from '../VatSupervisor.ts';\n\n/**\n * This returns a function that is provided to liveslots as the 'syscall'\n * argument: an object with one method per syscall type. These methods return\n * data, or nothing. If the kernel experiences a problem executing the syscall,\n * the method will throw, or the kernel will kill the vat, or both.\n *\n * I should be given a `syscallToManager` function that accepts a\n * VatSyscallObject and (synchronously) returns a VatSyscallResult.\n *\n * @param supervisor - The VatSupervisor for which we're providing syscall services.\n * @param kv - A key/value store for holding the vat's persistent state.\n * @param logger - The logger to use.\n *\n * @returns a syscall object suitable for use by liveslots.\n */\nfunction makeSupervisorSyscall(\n supervisor: VatSupervisor,\n kv: KVStore,\n logger?: Logger,\n): Syscall {\n /**\n * Actually perform the syscall operation.\n *\n * @param vso - A descriptor for the syscall to be performed.\n * @returns the result from performing the syscall.\n */\n function doSyscall(vso: VatSyscallObject): SyscallResult {\n insistVatSyscallObject(vso);\n let syscallResult;\n try {\n syscallResult = supervisor.executeSyscall(vso);\n } catch (problem) {\n logger?.warn(`supervisor got error during syscall:`, problem);\n throw problem;\n }\n const vsr = syscallResult;\n insistVatSyscallResult(vsr);\n const [type, ...rest] = vsr;\n switch (type) {\n case 'ok': {\n const [data] = rest;\n return data;\n }\n case 'error': {\n const [problem] = rest;\n throw Error(`syscall.${vso[0]} failed: ${problem as string}`);\n }\n default:\n throw Error(`unknown result type ${type as string}`);\n }\n }\n\n // this will be given to liveslots, it should have distinct methods that\n // return immediate results or throw errors\n const syscallForVat: Syscall = {\n send: (target: string, methargs: CapData<string>, result?: string) =>\n doSyscall(['send', target, { methargs, result }]),\n subscribe: (vpid: string) => doSyscall(['subscribe', vpid]),\n resolve: (resolutions: VatOneResolution[]) =>\n doSyscall(['resolve', resolutions]),\n exit: (isFailure: boolean, info: CapData<string>) =>\n doSyscall(['exit', isFailure, info]),\n dropImports: (vrefs: string[]) => doSyscall(['dropImports', vrefs]),\n retireImports: (vrefs: string[]) => doSyscall(['retireImports', vrefs]),\n retireExports: (vrefs: string[]) => doSyscall(['retireExports', vrefs]),\n abandonExports: (vrefs: string[]) => doSyscall(['abandonExports', vrefs]),\n callNow: (_target: string, _method: string, _args: unknown[]) => {\n throw Error(`callNow not supported (we have no devices)`);\n },\n\n vatstoreGet: (key: string) => kv.get(key),\n vatstoreGetNextKey: (priorKey: string) => kv.getNextKey(priorKey),\n vatstoreSet: (key: string, value: string) => kv.set(key, value),\n vatstoreDelete: (key: string) => kv.delete(key),\n };\n\n return harden(syscallForVat);\n}\n\nharden(makeSupervisorSyscall);\nexport { makeSupervisorSyscall };\n"]}