From c70b8a10b04c5554b1a952daa584216227858bc5 Mon Sep 17 00:00:00 2001 From: Michael FIG Date: Tue, 17 Mar 2020 13:37:35 -0600 Subject: [PATCH] fix: improve command device support Propagate inboundHandler errors better. Prevent asynchronous rejection errors. --- packages/SwingSet/src/devices/command-src.js | 6 +++++- packages/cosmic-swingset/lib/ag-solo/start.js | 13 +++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/SwingSet/src/devices/command-src.js b/packages/SwingSet/src/devices/command-src.js index 9080a29d049..3665b2bef83 100644 --- a/packages/SwingSet/src/devices/command-src.js +++ b/packages/SwingSet/src/devices/command-src.js @@ -21,7 +21,7 @@ export default function setup(syscall, state, helpers, endowments) { const body = JSON.parse(`${bodyString}`); SO(inboundHandler).inbound(Nat(count), body); } catch (e) { - console.log(`error during inboundCallback: ${e}`); + console.log(`error during inboundCallback`, e); throw new Error(`error during inboundCallback: ${e}`); } }); @@ -33,6 +33,10 @@ export default function setup(syscall, state, helpers, endowments) { }, sendResponse(count, isReject, obj) { + if (isReject && obj instanceof Error) { + console.log('inboundHandler rejected with:', obj); + obj = { message: obj.message }; + } try { deliverResponse(count, isReject, JSON.stringify(obj)); } catch (e) { diff --git a/packages/cosmic-swingset/lib/ag-solo/start.js b/packages/cosmic-swingset/lib/ag-solo/start.js index c3941b6de6d..2520903a3c7 100644 --- a/packages/cosmic-swingset/lib/ag-solo/start.js +++ b/packages/cosmic-swingset/lib/ag-solo/start.js @@ -137,10 +137,19 @@ async function buildSwingset( // this promise could take an arbitrarily long time to resolve, so don't // wait on it const p = cm.inboundCommand(obj); + + // Register a handler so that we don't get complaints about + // asynchronously-handled callbacks. + p.catch(_ => {}); + // TODO: synchronize this somehow, make sure it doesn't overlap with the - // processKernel() call in deliverInbound() + // processKernel() call in deliverInboundToMbx() await processKernel(); - return p; + + // Rethrow any exception so that our caller must handle it. + return p.catch(e => { + throw e; + }); } const intervalMillis = 1200;