From 9d57c661957b840bfee2a40e8f820b8795baed52 Mon Sep 17 00:00:00 2001 From: Brian Warner Date: Fri, 12 May 2023 12:16:12 -0700 Subject: [PATCH] chore: switch to E.when for promise-space onResolve hook This is more defensive against sneaky promises, at the cost of delaying storage by a turn for non-promises. --- packages/vats/package.json | 1 + packages/vats/src/core/promise-space.js | 9 +++------ packages/vats/test/test-promise-space.js | 1 + 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/vats/package.json b/packages/vats/package.json index 0b919d89bc3b..feba8668e786 100644 --- a/packages/vats/package.json +++ b/packages/vats/package.json @@ -42,6 +42,7 @@ "@agoric/vat-data": "^0.4.3", "@agoric/zoe": "^0.25.3", "@agoric/zone": "^0.1.0", + "@endo/eventual-send": "^0.17.2", "@endo/far": "^0.2.18", "@endo/import-bundle": "^0.3.4", "@endo/init": "^0.5.56", diff --git a/packages/vats/src/core/promise-space.js b/packages/vats/src/core/promise-space.js index 9abbd92e0bec..6de261874fa9 100644 --- a/packages/vats/src/core/promise-space.js +++ b/packages/vats/src/core/promise-space.js @@ -1,7 +1,8 @@ // @ts-check +import { E } from '@endo/eventual-send'; import { assertKey } from '@agoric/store'; import { canBeDurable } from '@agoric/vat-data'; -import { isPromise, makePromiseKit } from '@endo/promise-kit'; +import { makePromiseKit } from '@endo/promise-kit'; /** * @typedef {{ @@ -59,11 +60,7 @@ export const makeStoreHooks = (store, log = noop) => { return harden({ ...logHooks, onResolve: (name, valueP) => { - if (isPromise(valueP)) { - void valueP.then(value => save(name, value)); - } else { - save(name, valueP); - } + void E.when(valueP, value => save(name, value)); }, onReset: name => { if (store.has(name)) { diff --git a/packages/vats/test/test-promise-space.js b/packages/vats/test/test-promise-space.js index 0bdb4539b430..38b7fda8fa8b 100644 --- a/packages/vats/test/test-promise-space.js +++ b/packages/vats/test/test-promise-space.js @@ -64,6 +64,7 @@ test('makePromiseSpace copied into store', async t => { produce.chocolate.resolve(doesNotResolve); const nonPassable = harden(() => {}); produce.strawberry.resolve(nonPassable); + await null; const actual = Object.fromEntries(store.entries()); t.deepEqual( actual,