@@ -9,6 +9,40 @@ function build(E, _D, _log) {
9
9
let http ;
10
10
const adminHandles = new Set ( ) ;
11
11
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
+ } ;
12
46
13
47
const { publish : pursesPublish , subscribe : purseSubscribe } = pubsub ( E ) ;
14
48
const { publish : inboxPublish , subscribe : inboxSubscribe } = pubsub ( E ) ;
@@ -70,7 +104,7 @@ function build(E, _D, _log) {
70
104
71
105
case 'walletGetOffers' :
72
106
case 'walletGetOfferDescriptions' : {
73
- const result = await wallet . getOffers ( data ) ;
107
+ const result = await wallet . getOffers ( { origin : meta . origin } ) ;
74
108
return {
75
109
type : 'walletOfferDescriptions' ,
76
110
data : result ,
@@ -118,7 +152,10 @@ function build(E, _D, _log) {
118
152
[ ...adminHandles . keys ( ) ] ,
119
153
) ;
120
154
121
- // TODO: Get subscribed offers, too.
155
+ // Get subscribed offers, too.
156
+ for ( const channelHandle of offerSubscriptions . keys ( ) ) {
157
+ pushOfferSubscriptions ( channelHandle , inboxState ) ;
158
+ }
122
159
}
123
160
} ,
124
161
} ) ,
@@ -148,26 +185,50 @@ function build(E, _D, _log) {
148
185
} ,
149
186
onClose ( _obj , meta ) {
150
187
bridgeHandles . delete ( meta . channelHandle ) ;
188
+ offerSubscriptions . delete ( meta . channelHandle ) ;
151
189
} ,
152
190
153
191
async onMessage ( obj , meta ) {
154
192
const { type } = obj ;
155
193
switch ( type ) {
156
194
case 'walletGetPurses' :
157
195
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,
162
213
} ) ;
214
+ return {
215
+ type : 'walletSubscribedOffers' ,
216
+ data : true ,
217
+ } ;
218
+ }
163
219
164
220
case 'walletGetOffers' : {
165
- const { status = null } = obj ;
221
+ const { dappOrigin, status = null } = obj ;
222
+
166
223
// 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
+
171
232
return {
172
233
type : 'walletOfferDescriptions' ,
173
234
data : result ,
0 commit comments