From 2dce9987f7ae2e5c410a23ac6954de681f23808f Mon Sep 17 00:00:00 2001 From: Mike Dilger Date: Wed, 22 May 2024 10:00:35 +1200 Subject: [PATCH] Advertise both relay lists --- gossip-lib/src/comms.rs | 4 +- gossip-lib/src/overlord/minion/mod.rs | 16 ++++- gossip-lib/src/overlord/mod.rs | 85 ++++++++++++++++++--------- 3 files changed, 72 insertions(+), 33 deletions(-) diff --git a/gossip-lib/src/comms.rs b/gossip-lib/src/comms.rs index 631fe220..c44d7465 100644 --- a/gossip-lib/src/comms.rs +++ b/gossip-lib/src/comms.rs @@ -24,7 +24,7 @@ pub enum ToOverlordMessage { AdvertiseRelayList, /// internal - AdvertiseRelayListNextChunk(Box, Vec), + AdvertiseRelayListNextChunk(Box, Box, Vec), /// Calls [auth_approved](crate::Overlord::auth_approved) /// pass 'true' as the second parameter for a permanent approval @@ -242,7 +242,7 @@ impl PartialEq for ToMinionPayload { #[derive(Debug, Clone, PartialEq)] pub(crate) enum ToMinionPayloadDetail { - AdvertiseRelayList(Box), + AdvertiseRelayList(Box, Box), AuthApproved, AuthDeclined, FetchEvent(Id), diff --git a/gossip-lib/src/overlord/minion/mod.rs b/gossip-lib/src/overlord/minion/mod.rs index ac291ea4..e991f1d1 100644 --- a/gossip-lib/src/overlord/minion/mod.rs +++ b/gossip-lib/src/overlord/minion/mod.rs @@ -144,7 +144,7 @@ impl Minion { let mut short_timeout = false; for m in &messages { // When advertising relay lists, use a short timeout - if matches!(m.detail, ToMinionPayloadDetail::AdvertiseRelayList(_)) { + if matches!(m.detail, ToMinionPayloadDetail::AdvertiseRelayList(_, _)) { short_timeout = true; } } @@ -476,7 +476,7 @@ impl Minion { message: ToMinionPayload, ) -> Result<(), Error> { match message.detail { - ToMinionPayloadDetail::AdvertiseRelayList(event) => { + ToMinionPayloadDetail::AdvertiseRelayList(event, dmevent) => { let id = event.id; self.postings.insert(id); let msg = ClientMessage::Event(event); @@ -484,7 +484,17 @@ impl Minion { let ws_stream = self.stream.as_mut().unwrap(); self.last_message_sent = wire.clone(); ws_stream.send(WsMessage::Text(wire)).await?; - tracing::info!("Advertised relay list to {}", &self.url); + + let id = dmevent.id; + self.postings.insert(id); + let msg = ClientMessage::Event(dmevent); + let wire = serde_json::to_string(&msg)?; + let ws_stream = self.stream.as_mut().unwrap(); + self.last_message_sent = wire.clone(); + ws_stream.send(WsMessage::Text(wire)).await?; + + tracing::info!("Advertised relay lists to {}", &self.url); + self.to_overlord.send(ToOverlordMessage::MinionJobComplete( self.url.clone(), message.job_id, diff --git a/gossip-lib/src/overlord/mod.rs b/gossip-lib/src/overlord/mod.rs index 876878f6..eae4fb6a 100644 --- a/gossip-lib/src/overlord/mod.rs +++ b/gossip-lib/src/overlord/mod.rs @@ -606,8 +606,9 @@ impl Overlord { ToOverlordMessage::AdvertiseRelayList => { self.advertise_relay_list().await?; } - ToOverlordMessage::AdvertiseRelayListNextChunk(event, relays) => { - self.advertise_relay_list_next_chunk(event, relays).await?; + ToOverlordMessage::AdvertiseRelayListNextChunk(event, dmevent, relays) => { + self.advertise_relay_list_next_chunk(event, dmevent, relays) + .await?; } ToOverlordMessage::AuthApproved(relay_url, permanent) => { self.auth_approved(relay_url, permanent)?; @@ -835,34 +836,56 @@ impl Overlord { } }; - let inbox_or_outbox_relays: Vec = GLOBALS - .storage - .filter_relays(|r| r.has_usage_bits(Relay::INBOX) || r.has_usage_bits(Relay::OUTBOX))?; - let mut tags: Vec = Vec::new(); - for relay in inbox_or_outbox_relays.iter() { - let marker = - if relay.has_usage_bits(Relay::INBOX) && relay.has_usage_bits(Relay::OUTBOX) { - None - } else if relay.has_usage_bits(Relay::INBOX) { - Some("read".to_owned()) // NIP-65 uses the term 'read' instead of 'inbox' - } else if relay.has_usage_bits(Relay::OUTBOX) { - Some("write".to_owned()) // NIP-65 uses the term 'write' instead of 'outbox' - } else { - unreachable!() - }; + let event = { + let inbox_or_outbox_relays: Vec = GLOBALS.storage.filter_relays(|r| { + r.has_usage_bits(Relay::INBOX) || r.has_usage_bits(Relay::OUTBOX) + })?; + let mut tags: Vec = Vec::new(); + for relay in inbox_or_outbox_relays.iter() { + let marker = + if relay.has_usage_bits(Relay::INBOX) && relay.has_usage_bits(Relay::OUTBOX) { + None + } else if relay.has_usage_bits(Relay::INBOX) { + Some("read".to_owned()) // NIP-65 uses the term 'read' instead of 'inbox' + } else if relay.has_usage_bits(Relay::OUTBOX) { + Some("write".to_owned()) // NIP-65 uses the term 'write' instead of 'outbox' + } else { + unreachable!() + }; - tags.push(Tag::new_relay(relay.url.to_unchecked_url(), marker)); - } + tags.push(Tag::new_relay(relay.url.to_unchecked_url(), marker)); + } - let pre_event = PreEvent { - pubkey: public_key, - created_at: Unixtime::now().unwrap(), - kind: EventKind::RelayList, - tags, - content: "".to_string(), + let pre_event = PreEvent { + pubkey: public_key, + created_at: Unixtime::now().unwrap(), + kind: EventKind::RelayList, + tags, + content: "".to_string(), + }; + + GLOBALS.identity.sign_event(pre_event)? }; - let event = GLOBALS.identity.sign_event(pre_event)?; + let dm_event = { + let dm_relays: Vec = GLOBALS + .storage + .filter_relays(|r| r.has_usage_bits(Relay::DM))?; + let mut tags: Vec = Vec::new(); + for relay in dm_relays.iter() { + tags.push(Tag::new(&["relay", relay.url.as_str()])); + } + + let pre_event = PreEvent { + pubkey: public_key, + created_at: Unixtime::now().unwrap(), + kind: EventKind::DmRelayList, + tags, + content: "".to_string(), + }; + + GLOBALS.identity.sign_event(pre_event)? + }; let relays: Vec = GLOBALS .storage @@ -878,6 +901,7 @@ impl Overlord { .to_overlord .send(ToOverlordMessage::AdvertiseRelayListNextChunk( Box::new(event), + Box::new(dm_event), relays, )); @@ -888,10 +912,11 @@ impl Overlord { pub async fn advertise_relay_list_next_chunk( &mut self, event: Box, + dmevent: Box, relays: Vec, ) -> Result<(), Error> { tracing::info!( - "Advertising relay list, {} more relays to go...", + "Advertising relay lists, {} more relays to go...", relays.len() ); @@ -909,7 +934,10 @@ impl Overlord { reason: RelayConnectionReason::Advertising, payload: ToMinionPayload { job_id, - detail: ToMinionPayloadDetail::AdvertiseRelayList(event.clone()), + detail: ToMinionPayloadDetail::AdvertiseRelayList( + event.clone(), + dmevent.clone(), + ), }, }], ) @@ -934,6 +962,7 @@ impl Overlord { .to_overlord .send(ToOverlordMessage::AdvertiseRelayListNextChunk( event, + dmevent, relays[10..].to_owned(), )); }