Advertise both relay lists

This commit is contained in:
Mike Dilger 2024-05-22 10:00:35 +12:00
parent ec1178a6a6
commit 2dce9987f7
3 changed files with 72 additions and 33 deletions

View File

@ -24,7 +24,7 @@ pub enum ToOverlordMessage {
AdvertiseRelayList,
/// internal
AdvertiseRelayListNextChunk(Box<Event>, Vec<RelayUrl>),
AdvertiseRelayListNextChunk(Box<Event>, Box<Event>, Vec<RelayUrl>),
/// 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<Event>),
AdvertiseRelayList(Box<Event>, Box<Event>),
AuthApproved,
AuthDeclined,
FetchEvent(Id),

View File

@ -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,

View File

@ -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<Relay> = GLOBALS
.storage
.filter_relays(|r| r.has_usage_bits(Relay::INBOX) || r.has_usage_bits(Relay::OUTBOX))?;
let mut tags: Vec<Tag> = 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<Relay> = GLOBALS.storage.filter_relays(|r| {
r.has_usage_bits(Relay::INBOX) || r.has_usage_bits(Relay::OUTBOX)
})?;
let mut tags: Vec<Tag> = 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<Relay> = GLOBALS
.storage
.filter_relays(|r| r.has_usage_bits(Relay::DM))?;
let mut tags: Vec<Tag> = 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<RelayUrl> = 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<Event>,
dmevent: Box<Event>,
relays: Vec<RelayUrl>,
) -> 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(),
));
}