From f2be5c7806de93388e2641962539218313489fad Mon Sep 17 00:00:00 2001 From: Michael FIG Date: Wed, 11 Mar 2020 18:19:02 -0600 Subject: [PATCH] fix: allow vats under SwingSet to unwrap their promises Use @agoric/make-promise to make Promises that can be unwrapped (currently via the HandledPromise shim, but that may change). --- packages/SwingSet/package.json | 1 + packages/SwingSet/src/devices/command.js | 2 +- packages/SwingSet/src/kernel/kernel.js | 2 +- .../src/kernel/vatAdmin/vatAdminWrapper.js | 2 +- packages/SwingSet/src/makePromise.js | 45 ------------------- 5 files changed, 4 insertions(+), 48 deletions(-) delete mode 100644 packages/SwingSet/src/makePromise.js diff --git a/packages/SwingSet/package.json b/packages/SwingSet/package.json index 760e65b56ae..d31ed537822 100644 --- a/packages/SwingSet/package.json +++ b/packages/SwingSet/package.json @@ -35,6 +35,7 @@ "@agoric/evaluate": "^2.2.0", "@agoric/eventual-send": "^0.5.0", "@agoric/harden": "^0.0.4", + "@agoric/make-promise": "^0.0.1", "@agoric/marshal": "^0.1.1", "@agoric/nat": "^2.0.1", "@agoric/swing-store-simple": "^0.1.0", diff --git a/packages/SwingSet/src/devices/command.js b/packages/SwingSet/src/devices/command.js index 431fdfde6d4..76834192e55 100644 --- a/packages/SwingSet/src/devices/command.js +++ b/packages/SwingSet/src/devices/command.js @@ -1,5 +1,5 @@ import Nat from '@agoric/nat'; -import makePromise from '../makePromise'; +import makePromise from '@agoric/make-promise'; export default function buildCommand(broadcastCallback) { if (!broadcastCallback) { diff --git a/packages/SwingSet/src/kernel/kernel.js b/packages/SwingSet/src/kernel/kernel.js index 28c7ee4f7a8..dbc45167fda 100644 --- a/packages/SwingSet/src/kernel/kernel.js +++ b/packages/SwingSet/src/kernel/kernel.js @@ -3,10 +3,10 @@ import harden from '@agoric/harden'; import { makeMarshal } from '@agoric/marshal'; import evaluateProgram from '@agoric/evaluate'; import { assert, details } from '@agoric/assert'; +import makePromise from '@agoric/make-promise'; import makeVatManager from './vatManager'; import { makeLiveSlots } from './liveSlots'; import { makeDeviceSlots } from './deviceSlots'; -import makePromise from '../makePromise'; import makeDeviceManager from './deviceManager'; import { wrapStorage } from './state/storageWrapper'; import makeKernelKeeper from './state/kernelKeeper'; diff --git a/packages/SwingSet/src/kernel/vatAdmin/vatAdminWrapper.js b/packages/SwingSet/src/kernel/vatAdmin/vatAdminWrapper.js index e5a97fe3786..3fedf6622dd 100644 --- a/packages/SwingSet/src/kernel/vatAdmin/vatAdminWrapper.js +++ b/packages/SwingSet/src/kernel/vatAdmin/vatAdminWrapper.js @@ -6,7 +6,7 @@ * device affordances into objects that can be used by code in other vats. */ import harden from '@agoric/harden'; -import makePromise from '../../makePromise'; +import makePromise from '@agoric/make-promise'; export default function setup(syscall, state, helpers) { function build(E, D) { diff --git a/packages/SwingSet/src/makePromise.js b/packages/SwingSet/src/makePromise.js deleted file mode 100644 index 0bad48a5551..00000000000 --- a/packages/SwingSet/src/makePromise.js +++ /dev/null @@ -1,45 +0,0 @@ -import harden from '@agoric/harden'; - -/** - * Create a new promise and return an object containing the promise, the - * resolver, and the rejector. - * - * This is a helper function to allow JavaScript promises to be used more like - * E promises. In E, promise creation returns a promise/resolver pair, whereas - * JS provides the resolver to a callback function passed to the promise - * constructor (which is inside out to minds coming from the E tradition). - * Another E/JS difference is that the JS API distinguishes the resolver from - * the rejector, a refinement which this E-inspired API embraces. - * - * @return an object {p, res, reject} holding the promise, resolver, and - * rejector. - */ -export default function makePromise() { - let res; - let rej; - const p = new Promise((resolve, reject) => { - res = resolve; - rej = reject; - }); - // Node.js adds the `domain` property which is not a standard - // property on Promise. Because we do not know it to be ocap-safe, - // we remove it. - if (p.domain) { - // deleting p.domain may break functionality. To retain current - // functionality at the expense of safety, set unsafe to true. - const unsafe = false; - if (unsafe) { - const originalDomain = p.domain; - Object.defineProperty(p, 'domain', { - get() { - return originalDomain; - }, - }); - } else { - delete p.domain; - } - } - // TODO: Retire name 'rej' as it looks too much like 'res'. - return harden({ p, res, rej, reject: rej }); -} -harden(makePromise);