@@ -27,18 +27,20 @@ async function fetchPeers() {
27
27
return new Set ( await res . json ( ) ) ;
28
28
}
29
29
30
- /** @param {Set<string> } peers */
31
- async function announce ( peers ) {
32
- const data = {
33
- id : 'mutiny.example.chat' ,
34
- nick : state . nick . value ,
35
- } ;
36
- for ( const peer of peers ) {
37
- await fetch ( "/_api/v1/announcements/outbox" , {
38
- method : 'POST' ,
39
- body : JSON . stringify ( { peer, data} ) ,
40
- } ) ;
41
- }
30
+ const announced = new Set ( ) ;
31
+ async function announce ( ) {
32
+ const data = {
33
+ id : 'mutiny.example.chat' ,
34
+ nick : state . nick . value ,
35
+ } ;
36
+ for ( const peer of state . peers . value . difference ( announced ) ) {
37
+ console . log ( 'announcing to' , peer ) ;
38
+ await fetch ( "/_api/v1/announcements/outbox" , {
39
+ method : 'POST' ,
40
+ body : JSON . stringify ( { peer, data} ) ,
41
+ } ) ;
42
+ announced . add ( peer ) ;
43
+ }
42
44
}
43
45
44
46
async function fetchAnnouncements ( ) {
@@ -91,25 +93,28 @@ state.announcements.value = await fetchAnnouncements();
91
93
state . peers . value = await fetchPeers ( ) ;
92
94
await fetchMessages ( ) ;
93
95
94
- // Announce app to newly discovered peers
95
- announce ( state . peers . value ) ;
96
-
97
- // Announce to all peers when nick changes
98
- watch ( [ state . nick ] , ( ) => announce ( state . peers . value ) ) ;
96
+ // Announce app when new peers discovered or nick changes
97
+ watch ( [ state . peers ] , announce ) ;
98
+ watch ( [ state . nick ] , ( ) => {
99
+ // Re-announce to all peers on nick change
100
+ announced . clear ( ) ;
101
+ announce ( ) ;
102
+ } ) ;
103
+ announce ( ) ;
99
104
100
105
// Ask user for nickname
101
106
askNick ( ) ;
102
107
103
108
// Subscribe to server-sent events
104
109
const peer_events = new EventSource ( "/_api/v1/peers/events" ) ;
105
- peer_events . addEventListener ( "PeerDiscovered" , peer_id => {
106
- console . log ( 'Peer discovered' , peer_id ) ;
107
- state . peers . value . add ( peer_id ) ;
110
+ peer_events . addEventListener ( "PeerDiscovered" , event => {
111
+ console . log ( 'Peer discovered' , event . data ) ;
112
+ state . peers . value . add ( event . data ) ;
108
113
state . peers . signal ( ) ;
109
114
} ) ;
110
- peer_events . addEventListener ( "PeerExpired" , peer_id => {
111
- console . log ( 'Peer expired' , peer_id ) ;
112
- state . peers . value . delete ( peer_id ) ;
115
+ peer_events . addEventListener ( "PeerExpired" , event => {
116
+ console . log ( 'Peer expired' , event . data ) ;
117
+ state . peers . value . delete ( event . data ) ;
113
118
state . peers . signal ( ) ;
114
119
} ) ;
115
120
0 commit comments