Skip to content

Commit b3e214d

Browse files
committed
fix: hydrateHooks on the HTTP handler instead of addOffer
Now we pass a real object as a hooks parameter. This should make it easier to use the wallet.addOffer programatically.
1 parent b50690b commit b3e214d

File tree

2 files changed

+68
-26
lines changed

2 files changed

+68
-26
lines changed

packages/cosmic-swingset/lib/ag-solo/vats/lib-wallet.js

+65-25
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ export async function makeWallet(
172172
.map(p => harden(p[1]));
173173
}
174174

175-
async function compileOfferDesc(id, offerDesc) {
175+
async function compileOfferDesc(id, offerDesc, hooks = {}) {
176176
const {
177177
instanceRegKey,
178178
contractIssuerIndexToRole = [], // FIXME: Only for compatibility with Zoe pre-Roles
@@ -379,10 +379,14 @@ export async function makeWallet(
379379
roleOfferRules,
380380
rolePurses,
381381
);
382-
return { zoeKind, publicAPI, offerRules, purses };
382+
return { zoeKind, publicAPI, offerRules, purses, hooks };
383383
}
384384

385-
async function addOffer(rawOfferDesc, requestContext) {
385+
async function addOffer(
386+
rawOfferDesc,
387+
hooks = undefined,
388+
requestContext = {},
389+
) {
386390
const { id } = rawOfferDesc;
387391
const offerDesc = {
388392
...rawOfferDesc,
@@ -394,7 +398,7 @@ export async function makeWallet(
394398
updateInboxState(id, offerDesc);
395399

396400
// Start compiling the template, saving a promise for it.
397-
idToCompiledOfferDescP.set(id, compileOfferDesc(id, offerDesc));
401+
idToCompiledOfferDescP.set(id, compileOfferDesc(id, offerDesc, hooks));
398402

399403
// Our inbox state may have an enriched offerDesc.
400404
updateInboxState(id, idToOfferDesc.get(id));
@@ -423,12 +427,6 @@ export async function makeWallet(
423427
let ret = {};
424428
let alreadyAccepted = false;
425429
const offerDesc = idToOfferDesc.get(id);
426-
const objectInvokeHookP = (obj, [hookMethod, ...hookArgs] = []) => {
427-
if (hookMethod === undefined) {
428-
return undefined;
429-
}
430-
return E(obj)[hookMethod](...hookArgs);
431-
};
432430
const rejected = e => {
433431
if (alreadyAccepted) {
434432
return;
@@ -452,14 +450,12 @@ export async function makeWallet(
452450
idToOfferDesc.set(id, pendingOfferDesc);
453451
const compiledOfferDesc = await idToCompiledOfferDescP.get(id);
454452

455-
const { publicAPI } = compiledOfferDesc;
456453
const {
457-
instanceInviteHook,
458-
seatTriggerHook,
459-
instanceAcceptedHook,
460-
} = offerDesc;
461-
const inviteP = objectInvokeHookP(publicAPI, instanceInviteHook);
454+
publicAPI,
455+
hooks: { publicAPI: publicAPIHooks = {}, seat: seatHooks = {} } = {},
456+
} = compiledOfferDesc;
462457

458+
const inviteP = E(publicAPIHooks).getInvite(publicAPI);
463459
const { seat, depositedP, cancelObj } = await executeOffer(
464460
compiledOfferDesc,
465461
inviteP,
@@ -472,17 +468,25 @@ export async function makeWallet(
472468
// === AWAITING TURN ===
473469
// =====================
474470

475-
objectInvokeHookP(seat, seatTriggerHook).catch(rejected);
471+
// Don't wait for the offer to finish performing...
472+
// we need to return control to our caller.
473+
E(seatHooks)
474+
.performOffer(seat)
475+
.catch(e =>
476+
assert(false, details`seatHooks.performOffer failed with ${e}`),
477+
);
476478

477479
// Update status, drop the offerRules
478-
depositedP.then(_ => {
479-
// We got something back, so no longer pending or rejected.
480-
alreadyAccepted = true;
481-
const acceptOfferDesc = { ...pendingOfferDesc, wait: undefined };
482-
idToOfferDesc.set(id, acceptOfferDesc);
483-
updateInboxState(id, acceptOfferDesc);
484-
return objectInvokeHookP(publicAPI, instanceAcceptedHook);
485-
}, rejected);
480+
depositedP
481+
.then(_ => {
482+
// We got something back, so no longer pending or rejected.
483+
alreadyAccepted = true;
484+
const acceptOfferDesc = { ...pendingOfferDesc, wait: undefined };
485+
idToOfferDesc.set(id, acceptOfferDesc);
486+
updateInboxState(id, acceptOfferDesc);
487+
return E(publicAPIHooks).offerAccepted(publicAPI);
488+
})
489+
.catch(rejected);
486490
} catch (e) {
487491
rejected(e);
488492
}
@@ -493,6 +497,41 @@ export async function makeWallet(
493497
return Array.from(issuerPetnameToIssuer);
494498
}
495499

500+
const hydrateHook = ([hookMethod, ...hookArgs] = []) => object => {
501+
if (hookMethod === undefined) {
502+
return undefined;
503+
}
504+
return E(object)[hookMethod](...hookArgs);
505+
};
506+
507+
function hydrateHooks({
508+
publicAPI: { getInvite, offerAccepted, ...publicAPIRest } = {},
509+
seat: { performOffer, ...seatRest } = {},
510+
...targetsRest
511+
} = {}) {
512+
const assertSpecs = [
513+
[targetsRest, 'targets'],
514+
[publicAPIRest, 'publicAPI hooks'],
515+
[seatRest, 'seat hooks'],
516+
];
517+
for (const [rest, desc] of assertSpecs) {
518+
assert(
519+
Object.keys(rest).length === 0,
520+
details`Unrecognized extra ${desc} ${rest}`,
521+
);
522+
}
523+
524+
return harden({
525+
publicAPI: {
526+
getInvite: hydrateHook(getInvite),
527+
accepted: hydrateHook(offerAccepted),
528+
},
529+
seat: {
530+
performOffer: hydrateHook(performOffer),
531+
},
532+
});
533+
}
534+
496535
const wallet = harden({
497536
addIssuer,
498537
makeEmptyPurse,
@@ -502,6 +541,7 @@ export async function makeWallet(
502541
getPurse: petnameToPurse.get,
503542
getPurseIssuer: petname => purseToIssuer.get(petnameToPurse.get(petname)),
504543
getIssuerNames: issuerToIssuerNames.get,
544+
hydrateHooks,
505545
addOffer,
506546
declineOffer,
507547
cancelOffer,

packages/cosmic-swingset/lib/ag-solo/vats/vat-wallet.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,11 @@ function build(E, D, _log) {
4343
};
4444
}
4545
case 'walletAddOffer': {
46+
// We only need to do this because we can't reach addOffer.
47+
const hooks = wallet.hydrateHooks(data.hooks);
4648
return {
4749
type: 'walletOfferAdded',
48-
data: await wallet.addOffer(data, requestContext),
50+
data: await wallet.addOffer(data, hooks, requestContext),
4951
};
5052
}
5153
case 'walletDeclineOffer': {

0 commit comments

Comments
 (0)