@@ -172,7 +172,7 @@ export async function makeWallet(
172
172
. map ( p => harden ( p [ 1 ] ) ) ;
173
173
}
174
174
175
- async function compileOfferDesc ( id , offerDesc ) {
175
+ async function compileOfferDesc ( id , offerDesc , hooks = { } ) {
176
176
const {
177
177
instanceRegKey,
178
178
contractIssuerIndexToRole = [ ] , // FIXME: Only for compatibility with Zoe pre-Roles
@@ -379,10 +379,14 @@ export async function makeWallet(
379
379
roleOfferRules ,
380
380
rolePurses ,
381
381
) ;
382
- return { zoeKind, publicAPI, offerRules, purses } ;
382
+ return { zoeKind, publicAPI, offerRules, purses, hooks } ;
383
383
}
384
384
385
- async function addOffer ( rawOfferDesc , requestContext ) {
385
+ async function addOffer (
386
+ rawOfferDesc ,
387
+ hooks = undefined ,
388
+ requestContext = { } ,
389
+ ) {
386
390
const { id } = rawOfferDesc ;
387
391
const offerDesc = {
388
392
...rawOfferDesc ,
@@ -394,7 +398,7 @@ export async function makeWallet(
394
398
updateInboxState ( id , offerDesc ) ;
395
399
396
400
// Start compiling the template, saving a promise for it.
397
- idToCompiledOfferDescP . set ( id , compileOfferDesc ( id , offerDesc ) ) ;
401
+ idToCompiledOfferDescP . set ( id , compileOfferDesc ( id , offerDesc , hooks ) ) ;
398
402
399
403
// Our inbox state may have an enriched offerDesc.
400
404
updateInboxState ( id , idToOfferDesc . get ( id ) ) ;
@@ -423,12 +427,6 @@ export async function makeWallet(
423
427
let ret = { } ;
424
428
let alreadyAccepted = false ;
425
429
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
- } ;
432
430
const rejected = e => {
433
431
if ( alreadyAccepted ) {
434
432
return ;
@@ -452,14 +450,12 @@ export async function makeWallet(
452
450
idToOfferDesc . set ( id , pendingOfferDesc ) ;
453
451
const compiledOfferDesc = await idToCompiledOfferDescP . get ( id ) ;
454
452
455
- const { publicAPI } = compiledOfferDesc ;
456
453
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 ;
462
457
458
+ const inviteP = E ( publicAPIHooks ) . getInvite ( publicAPI ) ;
463
459
const { seat, depositedP, cancelObj } = await executeOffer (
464
460
compiledOfferDesc ,
465
461
inviteP ,
@@ -472,17 +468,25 @@ export async function makeWallet(
472
468
// === AWAITING TURN ===
473
469
// =====================
474
470
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
+ ) ;
476
478
477
479
// 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 ) ;
486
490
} catch ( e ) {
487
491
rejected ( e ) ;
488
492
}
@@ -493,6 +497,41 @@ export async function makeWallet(
493
497
return Array . from ( issuerPetnameToIssuer ) ;
494
498
}
495
499
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
+
496
535
const wallet = harden ( {
497
536
addIssuer,
498
537
makeEmptyPurse,
@@ -502,6 +541,7 @@ export async function makeWallet(
502
541
getPurse : petnameToPurse . get ,
503
542
getPurseIssuer : petname => purseToIssuer . get ( petnameToPurse . get ( petname ) ) ,
504
543
getIssuerNames : issuerToIssuerNames . get ,
544
+ hydrateHooks,
505
545
addOffer,
506
546
declineOffer,
507
547
cancelOffer,
0 commit comments