Skip to content

Commit 5ad56e6

Browse files
committed
feat: allow subscribing to wallet offer changes
1 parent d4450bd commit 5ad56e6

File tree

3 files changed

+76
-18
lines changed

3 files changed

+76
-18
lines changed

packages/cosmic-swingset/lib/ag-solo/start.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -252,9 +252,7 @@ export default async function start(basedir, withSES, argv) {
252252
}
253253
break;
254254
case 'fake-chain': {
255-
log(
256-
`adding follower/sender for fake chain ${c.role} ${c.GCI}`,
257-
);
255+
log(`adding follower/sender for fake chain ${c.role} ${c.GCI}`);
258256
const deliverator = await connectToFakeChain(
259257
basedir,
260258
c.GCI,

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

+3-4
Original file line numberDiff line numberDiff line change
@@ -205,15 +205,14 @@ export async function makeWallet(
205205
return petnameToPurse.entries();
206206
}
207207

208-
function getOffers({ status = 'accept', origin = null } = {}) {
208+
function getOffers({ origin = null } = {}) {
209209
// return the offers sorted by id
210210
return idToOffer
211211
.entries()
212212
.filter(
213213
([_id, offer]) =>
214-
(status === null || offer.status === status) &&
215-
(origin === null ||
216-
(offer.requestContext && offer.requestContext.origin === origin)),
214+
origin === null ||
215+
(offer.requestContext && offer.requestContext.origin === origin),
217216
)
218217
.sort(([id1], [id2]) => id1 > id2)
219218
.map(([_id, offer]) => harden(offer));

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

+72-11
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,40 @@ function build(E, _D, _log) {
99
let http;
1010
const adminHandles = new Set();
1111
const bridgeHandles = new Set();
12+
const offerSubscriptions = new Map();
13+
14+
const pushOfferSubscriptions = (channelHandle, offersStr) => {
15+
const offers = JSON.parse(offersStr);
16+
const subs = offerSubscriptions.get(channelHandle);
17+
(subs || []).forEach(({ origin, status }) => {
18+
// Filter by optional status and origin.
19+
const result = harden(
20+
offers.filter(
21+
offer =>
22+
(status === null || offer.status === status) &&
23+
offer.requestContext &&
24+
offer.requestContext.origin === origin,
25+
),
26+
);
27+
E(http).send(
28+
{
29+
type: 'walletOfferDescriptions',
30+
data: result,
31+
},
32+
[channelHandle],
33+
);
34+
});
35+
};
36+
37+
const subscribeToOffers = (channelHandle, { origin, status = null }) => {
38+
let subs = offerSubscriptions.get(channelHandle);
39+
if (!subs) {
40+
subs = [];
41+
offerSubscriptions.set(channelHandle, subs);
42+
}
43+
subs.push({ origin, status });
44+
pushOfferSubscriptions(channelHandle, inboxState);
45+
};
1246

1347
const { publish: pursesPublish, subscribe: purseSubscribe } = pubsub(E);
1448
const { publish: inboxPublish, subscribe: inboxSubscribe } = pubsub(E);
@@ -70,7 +104,7 @@ function build(E, _D, _log) {
70104

71105
case 'walletGetOffers':
72106
case 'walletGetOfferDescriptions': {
73-
const result = await wallet.getOffers(data);
107+
const result = await wallet.getOffers({ origin: meta.origin });
74108
return {
75109
type: 'walletOfferDescriptions',
76110
data: result,
@@ -118,7 +152,10 @@ function build(E, _D, _log) {
118152
[...adminHandles.keys()],
119153
);
120154

121-
// TODO: Get subscribed offers, too.
155+
// Get subscribed offers, too.
156+
for (const channelHandle of offerSubscriptions.keys()) {
157+
pushOfferSubscriptions(channelHandle, inboxState);
158+
}
122159
}
123160
},
124161
}),
@@ -148,26 +185,50 @@ function build(E, _D, _log) {
148185
},
149186
onClose(_obj, meta) {
150187
bridgeHandles.delete(meta.channelHandle);
188+
offerSubscriptions.delete(meta.channelHandle);
151189
},
152190

153191
async onMessage(obj, meta) {
154192
const { type } = obj;
155193
switch (type) {
156194
case 'walletGetPurses':
157195
case 'walletAddOffer':
158-
// Override the origin since we got it from the bridge.
159-
return adminOnMessage(obj, {
160-
...meta,
161-
origin: obj.dappOrigin,
196+
return adminOnMessage(obj, meta);
197+
198+
case 'walletSubscribeOffers': {
199+
const { status = null, dappOrigin } = obj;
200+
const { channelHandle } = meta;
201+
202+
if (!channelHandle) {
203+
return {
204+
type: 'walletSubscribedOffers',
205+
data: false,
206+
};
207+
}
208+
209+
// TODO: Maybe use the contract instanceId instead.
210+
subscribeToOffers(channelHandle, {
211+
origin: dappOrigin,
212+
status,
162213
});
214+
return {
215+
type: 'walletSubscribedOffers',
216+
data: true,
217+
};
218+
}
163219

164220
case 'walletGetOffers': {
165-
const { status = null } = obj;
221+
const { dappOrigin, status = null } = obj;
222+
166223
// Override the origin since we got it from the bridge.
167-
const result = await wallet.getOffers({
168-
origin: obj.dappOrigin,
169-
status,
170-
});
224+
let result = await wallet.getOffers({ origin: dappOrigin });
225+
if (status !== null) {
226+
// Filter by status.
227+
result = harden(
228+
result.filter(offer => offer.status === status),
229+
);
230+
}
231+
171232
return {
172233
type: 'walletOfferDescriptions',
173234
data: result,

0 commit comments

Comments
 (0)