UNPKG

@metamask/ocap-kernel

Version:
1 lines 19.6 kB
{"version":3,"file":"KernelRouter.cjs","sourceRoot":"","sources":["../src/KernelRouter.ts"],"names":[],"mappings":"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","sourcesContent":["import type { VatOneResolution } from '@agoric/swingset-liveslots';\nimport type { CapData } from '@endo/marshal';\n\nimport { KernelQueue } from './KernelQueue.ts';\nimport { kser } from './services/kernel-marshal.ts';\nimport type { KernelStore } from './store/index.ts';\nimport { extractSingleRef } from './store/utils/extract-ref.ts';\nimport { parseRef } from './store/utils/parse-ref.ts';\nimport { isPromiseRef } from './store/utils/promise-ref.ts';\nimport type {\n VatId,\n KRef,\n RunQueueItem,\n RunQueueItemSend,\n RunQueueItemBringOutYourDead,\n RunQueueItemNotify,\n RunQueueItemGCAction,\n CrankResults,\n} from './types.ts';\nimport { insistVatId, insistMessage } from './types.ts';\nimport { assert, Fail } from './utils/assert.ts';\nimport { VatHandle } from './VatHandle.ts';\n\ntype MessageRoute = {\n vatId?: VatId;\n target: KRef;\n} | null;\n\n/**\n * The KernelRouter is responsible for routing messages to the correct vat.\n *\n * This class is responsible for routing messages to the correct vat, including\n * sending messages, resolving promises, and dropping imports.\n */\nexport class KernelRouter {\n /** The kernel's store. */\n readonly #kernelStore: KernelStore;\n\n /** The kernel's queue. */\n readonly #kernelQueue: KernelQueue;\n\n /** A function that returns a vat handle for a given vat id. */\n readonly #getVat: (vatId: VatId) => VatHandle;\n\n /**\n * Construct a new KernelRouter.\n *\n * @param kernelStore - The kernel's store.\n * @param kernelQueue - The kernel's queue.\n * @param getVat - A function that returns a vat handle for a given vat id.\n */\n constructor(\n kernelStore: KernelStore,\n kernelQueue: KernelQueue,\n getVat: (vatId: VatId) => VatHandle,\n ) {\n this.#kernelStore = kernelStore;\n this.#kernelQueue = kernelQueue;\n this.#getVat = getVat;\n }\n\n /**\n * Deliver a run queue item to its target.\n *\n * If the item being delivered is message whose target is a promise, it is\n * delivered based on the kernel's model of the promise's state:\n * - unresolved: it is put onto the queue that the kernel maintains for that promise\n * - fulfilled: it is forwarded to the promise resolution target\n * - rejected: the result promise of the message is in turn rejected according\n * to the kernel's model of the promise's rejection value\n *\n * If the item being delivered is a notification, the kernel's model of the\n * state of the promise being notified is updated, and any queue items\n * enqueued for that promise are placed onto the run queue. The notification\n * is also forwarded to all of the promise's registered subscribers.\n *\n * @param item - The message/notification to deliver.\n * @returns The crank outcome.\n */\n async deliver(item: RunQueueItem): Promise<CrankResults | undefined> {\n switch (item.type) {\n case 'send':\n return await this.#deliverSend(item);\n case 'notify':\n return await this.#deliverNotify(item);\n case 'dropExports':\n case 'retireExports':\n case 'retireImports':\n return await this.#deliverGCAction(item);\n case 'bringOutYourDead':\n return await this.#deliverBringOutYourDead(item);\n default:\n // @ts-expect-error Runtime does not respect \"never\".\n Fail`unsupported or unknown run queue item type ${item.type}`;\n }\n return undefined;\n }\n\n /**\n * Determine a message's destination route based on the target type and\n * state. In the most general case, this route consists of a vatId and a\n * destination object reference.\n *\n * There are three possible outcomes:\n * - splat: message should be dropped (with optional error resolution),\n * indicated by a null return value\n * - send: message should be delivered to a specific object in a specific vat\n * - requeue: message should be put back on the run queue for later delivery\n * (for unresolved promises), indicated by absence of a target vat in the\n * return value\n *\n * @param item - The message to route.\n * @returns the route for the message.\n */\n #routeMessage(item: RunQueueItemSend): MessageRoute {\n const { target, message } = item;\n insistMessage(message);\n\n const routeAsSplat = (error?: CapData<KRef>): MessageRoute => {\n if (message.result && error) {\n this.#kernelQueue.resolvePromises(undefined, [\n [message.result, true, error],\n ]);\n }\n return null;\n };\n const routeAsSend = (targetObject: KRef): MessageRoute => {\n if (this.#kernelStore.isRevoked(targetObject)) {\n return routeAsSplat(kser('revoked object'));\n }\n const vatId = this.#kernelStore.getOwner(targetObject);\n if (!vatId) {\n return routeAsSplat(kser('no vat'));\n }\n return { vatId, target: targetObject };\n };\n const routeAsRequeue = (targetObject: KRef): MessageRoute => {\n return { target: targetObject };\n };\n\n if (isPromiseRef(target)) {\n const promise = this.#kernelStore.getKernelPromise(target);\n switch (promise.state) {\n case 'fulfilled': {\n if (promise.value) {\n const targetObject = extractSingleRef(promise.value);\n if (targetObject) {\n if (isPromiseRef(targetObject)) {\n return routeAsRequeue(targetObject);\n }\n return routeAsSend(targetObject);\n }\n }\n return routeAsSplat(kser('no object'));\n }\n case 'rejected':\n return routeAsSplat(promise.value);\n case 'unresolved':\n return routeAsRequeue(target);\n default:\n throw Fail`unknown promise state ${promise.state}`;\n }\n } else {\n return routeAsSend(target);\n }\n }\n\n /**\n * Deliver a 'send' run queue item.\n *\n * @param item - The send item to deliver.\n * @returns The crank outcome.\n */\n async #deliverSend(\n item: RunQueueItemSend,\n ): Promise<CrankResults | undefined> {\n const route = this.#routeMessage(item);\n let crankResults: CrankResults | undefined;\n\n // Message went splat\n if (!route) {\n this.#kernelStore.decrementRefCount(item.target, 'deliver|splat|target');\n if (item.message.result) {\n this.#kernelStore.decrementRefCount(\n item.message.result,\n 'deliver|splat|result',\n );\n }\n for (const slot of item.message.methargs.slots) {\n this.#kernelStore.decrementRefCount(slot, 'deliver|splat|slot');\n }\n console.log(\n `@@@@ message went splat ${item.target}<-${JSON.stringify(item.message)}`,\n );\n return crankResults;\n }\n\n const { vatId, target } = route;\n const { message } = item;\n console.log(\n `@@@@ deliver ${vatId} send ${target}<-${JSON.stringify(message)}`,\n );\n if (vatId) {\n const vat = this.#getVat(vatId);\n if (vat) {\n if (message.result) {\n if (typeof message.result !== 'string') {\n throw TypeError('message result must be a string');\n }\n this.#kernelStore.setPromiseDecider(message.result, vatId);\n this.#kernelStore.decrementRefCount(\n message.result,\n 'deliver|send|result',\n );\n }\n const vatTarget = this.#kernelStore.translateRefKtoV(\n vatId,\n target,\n false,\n );\n const vatMessage = this.#kernelStore.translateMessageKtoV(\n vatId,\n message,\n );\n crankResults = await vat.deliverMessage(vatTarget, vatMessage);\n this.#kernelStore.decrementRefCount(target, 'deliver|send|target');\n for (const slot of message.methargs.slots) {\n this.#kernelStore.decrementRefCount(slot, 'deliver|send|slot');\n }\n } else {\n Fail`no owner for kernel object ${target}`;\n }\n } else {\n this.#kernelStore.enqueuePromiseMessage(target, message);\n }\n console.log(\n `@@@@ done ${vatId} send ${target}<-${JSON.stringify(message)}`,\n );\n\n return crankResults;\n }\n\n /**\n * Deliver a 'notify' run queue item.\n *\n * @param item - The notify item to deliver.\n * @returns The crank outcome.\n */\n async #deliverNotify(item: RunQueueItemNotify): Promise<CrankResults> {\n const { vatId, kpid } = item;\n insistVatId(vatId);\n const { context, isPromise } = parseRef(kpid);\n assert(\n context === 'kernel' && isPromise,\n `${kpid} is not a kernel promise`,\n );\n console.log(`@@@@ deliver ${vatId} notify ${vatId} ${kpid}`);\n const promise = this.#kernelStore.getKernelPromise(kpid);\n const { state, value } = promise;\n assert(value, `no value for promise ${kpid}`);\n if (state === 'unresolved') {\n Fail`notification on unresolved promise ${kpid}`;\n }\n if (!this.#kernelStore.krefToEref(vatId, kpid)) {\n // no c-list entry, already done\n return { didDelivery: vatId };\n }\n const targets = this.#kernelStore.getKpidsToRetire(kpid, value);\n if (targets.length === 0) {\n // no kpids to retire, already done\n return { didDelivery: vatId };\n }\n const resolutions: VatOneResolution[] = [];\n for (const toResolve of targets) {\n const tPromise = this.#kernelStore.getKernelPromise(toResolve);\n if (tPromise.state === 'unresolved') {\n Fail`target promise ${toResolve} is unresolved`;\n }\n if (!tPromise.value) {\n throw Fail`target promise ${toResolve} has no value`;\n }\n resolutions.push([\n this.#kernelStore.translateRefKtoV(vatId, toResolve, true),\n tPromise.state === 'rejected',\n this.#kernelStore.translateCapDataKtoV(vatId, tPromise.value),\n ]);\n // decrement refcount for the promise being notified\n if (toResolve !== kpid) {\n this.#kernelStore.decrementRefCount(toResolve, 'deliver|notify|slot');\n }\n }\n const vat = this.#getVat(vatId);\n const crankResults = await vat.deliverNotify(resolutions);\n // Decrement reference count for processed 'notify' item\n this.#kernelStore.decrementRefCount(kpid, 'deliver|notify');\n console.log(`@@@@ done ${vatId} notify ${vatId} ${kpid}`);\n return crankResults;\n }\n\n /**\n * Deliver a Garbage Collection action run queue item.\n *\n * @param item - The dropExports | retireExports | retireImports item to deliver.\n * @returns The crank outcome.\n */\n async #deliverGCAction(item: RunQueueItemGCAction): Promise<CrankResults> {\n const { type, vatId, krefs } = item;\n console.log(`@@@@ deliver ${vatId} ${type}`, krefs);\n const vat = this.#getVat(vatId);\n const vrefs = this.#kernelStore.krefsToExistingErefs(vatId, krefs);\n const method =\n `deliver${(type[0] as string).toUpperCase()}${type.slice(1)}` as\n | 'deliverDropExports'\n | 'deliverRetireExports'\n | 'deliverRetireImports';\n const crankResults = await vat[method](vrefs);\n console.log(`@@@@ done ${vatId} ${type}`, krefs);\n return crankResults;\n }\n\n /**\n * Deliver a 'bringOutYourDead' run queue item.\n *\n * @param item - The bringOutYourDead item to deliver.\n * @returns The crank outcome.\n */\n async #deliverBringOutYourDead(\n item: RunQueueItemBringOutYourDead,\n ): Promise<CrankResults | undefined> {\n const { vatId } = item;\n console.log(`@@@@ deliver ${vatId} bringOutYourDead`);\n const vat = this.#getVat(vatId);\n const crankResults = await vat.deliverBringOutYourDead();\n console.log(`@@@@ done ${vatId} bringOutYourDead`);\n return crankResults;\n }\n}\n"]}