22
33use std:: cmp:: Ordering ;
44use std:: collections:: HashSet ;
5- use std:: num:: NonZeroUsize ;
65use std:: sync:: Arc ;
76
7+ use indexmap:: IndexMap ;
88use lru:: LruCache ;
99use nostr:: nips:: nip17;
1010use nostr:: nips:: nip65:: { self , RelayMetadata } ;
@@ -27,15 +27,15 @@ struct PkRelayData {
2727struct PkData {
2828 last_nip17_update : Option < Timestamp > ,
2929 last_nip65_update : Option < Timestamp > ,
30- relays : LruCache < RelayUrl , PkRelayData > ,
30+ relays : IndexMap < RelayUrl , PkRelayData > ,
3131}
3232
3333impl Default for PkData {
3434 fn default ( ) -> Self {
3535 Self {
3636 last_nip17_update : None ,
3737 last_nip65_update : None ,
38- relays : LruCache :: new ( NonZeroUsize :: new ( 25 ) . expect ( "Invalid cache size" ) ) ,
38+ relays : IndexMap :: new ( ) ,
3939 }
4040 }
4141}
@@ -86,13 +86,19 @@ impl NostrGossipMemory {
8686 let mut read_write_mask: Flags = Flags :: READ ;
8787 read_write_mask. add ( Flags :: WRITE ) ;
8888
89- let relay_data = pk_data
90- . relays
91- . get_or_insert_mut ( relay_url. clone ( ) , PkRelayData :: default) ;
89+ match pk_data. relays . get_mut ( relay_url) {
90+ Some ( relay_data) => {
91+ // Update the bitflag: remove the previous READ and WRITE values and apply the new bitflag (preserves any other flag)
92+ relay_data. bitflags . remove ( read_write_mask) ;
93+ relay_data. bitflags . add ( bitflag) ;
94+ }
95+ None => {
96+ let mut relay_data = PkRelayData :: default ( ) ;
97+ relay_data. bitflags . add ( bitflag) ;
9298
93- // Update the bitflag: remove the previous READ and WRITE values and apply the new bitflag (preserves any other flag)
94- relay_data . bitflags . remove ( read_write_mask ) ;
95- relay_data . bitflags . add ( bitflag ) ;
99+ pk_data . relays . insert ( relay_url . clone ( ) , relay_data ) ;
100+ }
101+ }
96102 }
97103 }
98104 // Extract NIP-17 relays
@@ -101,11 +107,17 @@ impl NostrGossipMemory {
101107 public_keys. get_or_insert_mut ( event. pubkey , PkData :: default) ;
102108
103109 for relay_url in nip17:: extract_relay_list ( event) . take ( MAX_NIP17_SIZE ) {
104- let relay_data = pk_data
105- . relays
106- . get_or_insert_mut ( relay_url. clone ( ) , PkRelayData :: default) ;
110+ match pk_data. relays . get_mut ( relay_url) {
111+ Some ( relay_data) => {
112+ relay_data. bitflags . add ( Flags :: PRIVATE_MESSAGE ) ;
113+ }
114+ None => {
115+ let mut relay_data = PkRelayData :: default ( ) ;
116+ relay_data. bitflags . add ( Flags :: PRIVATE_MESSAGE ) ;
107117
108- relay_data. bitflags . add ( Flags :: PRIVATE_MESSAGE ) ;
118+ pk_data. relays . insert ( relay_url. clone ( ) , relay_data) ;
119+ }
120+ }
109121 }
110122 }
111123 // Extract hints
@@ -300,13 +312,22 @@ impl NostrGossipMemory {
300312
301313/// Add relay per user or update the received events and bitflags.
302314fn update_relay_per_user ( pk_data : & mut PkData , relay_url : RelayUrl , flags : Flags ) {
303- let relay_data = pk_data
304- . relays
305- . get_or_insert_mut ( relay_url, PkRelayData :: default) ;
315+ match pk_data. relays . get_mut ( & relay_url) {
316+ Some ( relay_data) => {
317+ relay_data. bitflags . add ( flags) ;
318+ relay_data. received_events = relay_data. received_events . saturating_add ( 1 ) ;
319+ relay_data. last_received_event = Some ( Timestamp :: now ( ) ) ;
320+ }
321+ None => {
322+ let mut relay_data = PkRelayData :: default ( ) ;
306323
307- relay_data. bitflags . add ( flags) ;
308- relay_data. received_events = relay_data. received_events . saturating_add ( 1 ) ;
309- relay_data. last_received_event = Some ( Timestamp :: now ( ) ) ;
324+ relay_data. bitflags . add ( flags) ;
325+ relay_data. received_events = relay_data. received_events . saturating_add ( 1 ) ;
326+ relay_data. last_received_event = Some ( Timestamp :: now ( ) ) ;
327+
328+ pk_data. relays . insert ( relay_url, relay_data) ;
329+ }
330+ }
310331}
311332
312333impl NostrGossip for NostrGossipMemory {
0 commit comments