@@ -1573,67 +1573,55 @@ impl Multimint {
15731573 // Get the connection status stream from the client
15741574 let status_stream = client. api ( ) . connection_status_stream ( ) ;
15751575
1576- // Fold the guardian version into each peer status so the UI reflects
1577- // upgrades in real time without a separate timer. The version only needs
1578- // (re)fetching when a peer comes online: a guardian upgrade restarts
1579- // fedimintd, which surfaces here as an offline->online transition. We
1580- // cache the last-known version per peer and refetch only on that
1581- // transition (or if we never managed to fetch it) to avoid hitting every
1582- // guardian on each unrelated connectivity change.
1583- let mapped_stream = stream:: unfold (
1584- (
1585- Box :: pin ( status_stream) ,
1586- client,
1587- peers,
1588- BTreeMap :: < u16 , Option < String > > :: new ( ) ,
1589- BTreeMap :: < u16 , bool > :: new ( ) ,
1590- ) ,
1591- |( mut status_stream, client, peers, mut cached_versions, mut prev_online) | async move {
1592- let status_map = status_stream. next ( ) . await ?;
1593-
1594- let mut peers_status = Vec :: with_capacity ( peers. len ( ) ) ;
1595- for ( peer_id, ( name, url) ) in peers. iter ( ) {
1596- let ( online, connectivity) = match status_map. get ( & ( * peer_id) . into ( ) ) {
1597- Some ( FedimintPeerStatus :: Connected ( c) ) => ( true , ( * c) . into ( ) ) ,
1598- Some ( FedimintPeerStatus :: Disconnected ) | None => {
1599- ( false , PeerConnectivity :: Unknown )
1600- }
1601- } ;
1576+ // Guardian versions are refreshed out-of-band by the periodic meta cache
1577+ // task (`spawn_cache_task` -> `cache_federation_meta`) and persisted under
1578+ // `FederationMetaKey`. We read them from that cache rather than fetching
1579+ // inline, so this stream stays a cheap, purely-local mapping of
1580+ // connectivity -> status: the sidebar's online indicator updates the
1581+ // instant fedimint reports a peer up/down, with no per-guardian network
1582+ // round-trips gating the emission.
1583+ let db = self . db . clone ( ) ;
1584+ let federation_id = client. federation_id ( ) ;
1585+ let peers = Arc :: new ( peers) ;
1586+ let mapped_stream = status_stream. then ( move |status_map| {
1587+ let db = db. clone ( ) ;
1588+ let peers = peers. clone ( ) ;
1589+ async move {
1590+ // A single local read returns every guardian's last-known version.
1591+ let cached_versions: BTreeMap < u16 , Option < String > > = {
1592+ let mut dbtx = db. begin_transaction_nc ( ) . await ;
1593+ dbtx. get_value ( & FederationMetaKey { federation_id } )
1594+ . await
1595+ . map ( |meta| {
1596+ meta. guardians
1597+ . into_iter ( )
1598+ . map ( |g| ( g. peer_id , g. version ) )
1599+ . collect ( )
1600+ } )
1601+ . unwrap_or_default ( )
1602+ } ;
16021603
1603- let version = if online {
1604- let was_online = prev_online. get ( peer_id) . copied ( ) . unwrap_or ( false ) ;
1605- let have_version =
1606- cached_versions. get ( peer_id) . is_some_and ( |v| v. is_some ( ) ) ;
1607- if was_online && have_version {
1608- cached_versions. get ( peer_id) . cloned ( ) . flatten ( )
1609- } else {
1610- let fetched =
1611- client. api ( ) . fedimintd_version ( ( * peer_id) . into ( ) ) . await . ok ( ) ;
1612- cached_versions. insert ( * peer_id, fetched. clone ( ) ) ;
1613- fetched
1604+ peers
1605+ . iter ( )
1606+ . map ( |( peer_id, ( name, url) ) | {
1607+ let ( online, connectivity) = match status_map. get ( & ( * peer_id) . into ( ) ) {
1608+ Some ( FedimintPeerStatus :: Connected ( c) ) => ( true , ( * c) . into ( ) ) ,
1609+ Some ( FedimintPeerStatus :: Disconnected ) | None => {
1610+ ( false , PeerConnectivity :: Unknown )
1611+ }
1612+ } ;
1613+ PeerStatus {
1614+ peer_id : * peer_id,
1615+ name : name. clone ( ) ,
1616+ online,
1617+ connectivity,
1618+ url : url. clone ( ) ,
1619+ version : cached_versions. get ( peer_id) . cloned ( ) . flatten ( ) ,
16141620 }
1615- } else {
1616- None
1617- } ;
1618-
1619- prev_online. insert ( * peer_id, online) ;
1620-
1621- peers_status. push ( PeerStatus {
1622- peer_id : * peer_id,
1623- name : name. clone ( ) ,
1624- online,
1625- connectivity,
1626- url : url. clone ( ) ,
1627- version,
1628- } ) ;
1629- }
1630-
1631- Some ( (
1632- peers_status,
1633- ( status_stream, client, peers, cached_versions, prev_online) ,
1634- ) )
1635- } ,
1636- ) ;
1621+ } )
1622+ . collect :: < Vec < _ > > ( )
1623+ }
1624+ } ) ;
16371625
16381626 Ok ( mapped_stream. boxed ( ) )
16391627 }
0 commit comments