@@ -3,6 +3,7 @@ import { Agent } from 'mesh/service';
33import { AgentId } from 'mesh/service/Agent' ;
44import { AgentPod , AgentEvent , AgentPodEventType , AgentSetChangeEvent , AgentSetChange } from 'mesh/service/AgentPod' ;
55import { Event , EventRelay , Observer } from 'util/events' ;
6+ import { MultiMap } from 'util/multimap' ;
67import { Endpoint } from '../network' ;
78import { StateSyncAgent } from './StateSyncAgent' ;
89
@@ -45,9 +46,11 @@ class SyncObserverAgent implements Agent {
4546
4647 pod ?: AgentPod ;
4748
48- relays : Map < AgentId , [ EventRelay < HashedObject > , SyncObserver ] > ;
49+ observers : MultiMap < AgentId , SyncObserver > ;
50+ relays : Map < AgentId , [ EventRelay < HashedObject > , SyncObserver , MutableObject ] > ;
4951
5052 constructor ( ) {
53+ this . observers = new MultiMap ( ) ;
5154 this . relays = new Map ( ) ;
5255 }
5356
@@ -68,47 +71,53 @@ class SyncObserverAgent implements Agent {
6871 const syncAgentId = mut . getSyncAgentId ( peerGroupId ) ;
6972 const syncAgent = this . pod . getAgent ( syncAgentId ) as StateSyncAgent | undefined ;
7073
71- let pair = this . relays . get ( syncAgentId ) ;
74+ let tuple = this . relays . get ( syncAgentId ) ;
7275
73-
74- if ( pair === undefined ) {
76+ if ( tuple === undefined ) {
7577
7678 const relay = new EventRelay < HashedObject > ( mut ) ;
7779 const syncAgentObs = ( ev : SyncEvent ) => {
7880 relay . emit ( ev ) ;
7981 }
8082
81- pair = [ relay , syncAgentObs ] ;
83+ tuple = [ relay , syncAgentObs , mut ] ;
8284
83- this . relays . set ( syncAgentId , [ relay , syncAgentObs ] ) ;
85+ this . relays . set ( syncAgentId , tuple ) ;
8486
8587
8688 if ( syncAgent !== undefined ) {
8789 syncAgent . getSyncEventSource ( ) . addObserver ( syncAgentObs ) ;
8890 }
8991 }
9092
91- pair [ 0 ] . addObserver ( obs ) ;
93+ tuple [ 0 ] . addObserver ( obs ) ;
9294
9395 if ( syncAgent !== undefined ) {
9496 obs ( {
9597 emitter : mut ,
9698 action : SyncObserverEventTypes . SyncStateUpdate ,
9799 data : syncAgent . getSyncState ( )
98100 } ) ;
101+ } else {
102+ obs ( {
103+ emitter : mut ,
104+ action : SyncObserverEventTypes . SyncStateUpdate ,
105+ data : { allPeersInSync : false , opsToFetch : 0 , remoteStateHashes : { } , synchronizing : false }
106+ } ) ;
99107 }
100108 }
101109
102110 removeSyncObserver ( obs : SyncObserver , mut : MutableObject , peerGroupId : PeerGroupId ) {
111+
103112 if ( this . pod === undefined ) {
104113 throw new Error ( 'Trying to remove a sync observer, but the SyncObserverAgent is not ready.' ) ;
105114 }
106115
107116 const syncAgentId = mut . getSyncAgentId ( peerGroupId ) ;
108- const pair = this . relays . get ( syncAgentId ) ;
117+ const tuple = this . relays . get ( syncAgentId ) ;
109118
110- if ( pair !== undefined ) {
111- const [ relay , syncAgentObs ] = pair ;
119+ if ( tuple !== undefined ) {
120+ const [ relay , syncAgentObs , _mut ] = tuple ;
112121 relay . removeObserver ( obs ) ;
113122
114123 if ( relay . observers . size === 0 ) {
@@ -130,19 +139,34 @@ class SyncObserverAgent implements Agent {
130139 const agentEv = ev as AgentSetChangeEvent ;
131140
132141 const syncAgentId = agentEv . content . agentId ;
133- const pair = this . relays . get ( syncAgentId ) ;
142+ const tuple = this . relays . get ( syncAgentId ) ;
134143
135- if ( pair !== undefined ) {
144+ if ( tuple !== undefined ) {
145+ const [ relay , syncAgentObserver , mut ] = tuple ;
136146 if ( agentEv . content . change === AgentSetChange . Addition ) {
147+
137148 const syncAgent = this . pod ?. getAgent ( syncAgentId ) as StateSyncAgent ;
138- const [ _relay , syncAgentObserver ] = pair ;
139149 syncAgent . getSyncEventSource ( ) . addObserver ( syncAgentObserver ) ;
150+
151+ relay . emit ( {
152+ emitter : mut ,
153+ action : SyncObserverEventTypes . SyncStateUpdate ,
154+ data : syncAgent . getSyncState ( )
155+ } ) ;
156+
140157 } else if ( agentEv . content . change === AgentSetChange . Removal ) {
158+
159+ console . log ( 'SENDING LAST EV FOR ' + mut . getLastHash ( ) ) ;
160+
141161 const syncAgent = this . pod ?. getAgent ( syncAgentId ) as StateSyncAgent | undefined ;
142- const [ _relay , syncAgentObserver ] = pair ;
143- syncAgent ?. getSyncEventSource ( ) . addObserver ( syncAgentObserver ) ;
162+ syncAgent ?. getSyncEventSource ( ) . removeObserver ( syncAgentObserver ) ; // I think this will have no effect
163+ relay . emit ( {
164+ emitter : mut ,
165+ action : SyncObserverEventTypes . SyncStateUpdate ,
166+ data : { allPeersInSync : false , opsToFetch : 0 , remoteStateHashes : { } , synchronizing : false }
167+ } ) ;
168+
144169 }
145-
146170 }
147171 }
148172 }
0 commit comments