mirror of
https://github.com/chatmail/core.git
synced 2026-09-22 13:01:21 +03:00
Deduplicate relay candidates
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
//! [`Config::AutorelayFinished`] is set and nothing is ever added again,
|
//! [`Config::AutorelayFinished`] is set and nothing is ever added again,
|
||||||
//! so deleting a transport later does not pull in a replacement.
|
//! so deleting a transport later does not pull in a replacement.
|
||||||
|
|
||||||
|
use std::collections::BTreeSet;
|
||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
@@ -53,18 +54,25 @@ const DEFAULT_RELAY_CANDIDATES: &[&str] = &[
|
|||||||
pub(crate) async fn init_transports_inner(
|
pub(crate) async fn init_transports_inner(
|
||||||
context: &Context,
|
context: &Context,
|
||||||
addrs_from_qr: Vec<String>,
|
addrs_from_qr: Vec<String>,
|
||||||
|
skip_network: bool,
|
||||||
) -> Result<(), anyhow::Error> {
|
) -> Result<(), anyhow::Error> {
|
||||||
let mut candidates: Vec<&str> = DEFAULT_RELAY_CANDIDATES.into();
|
let mut default_relays: Vec<&str> = DEFAULT_RELAY_CANDIDATES.into();
|
||||||
candidates.shuffle(&mut rng());
|
default_relays.shuffle(&mut rng());
|
||||||
|
|
||||||
let (relays_sender, relays_receiver) = async_channel::unbounded::<String>();
|
let (relays_sender, relays_receiver) = async_channel::unbounded::<String>();
|
||||||
for addr in addrs_from_qr {
|
let relays_from_qr: BTreeSet<_> = addrs_from_qr
|
||||||
let email = EmailAddress::new(&addr)?;
|
.into_iter()
|
||||||
relays_sender.try_send(email.domain)?;
|
.filter_map(|addr| EmailAddress::new(&addr).ok())
|
||||||
}
|
.map(|email| email.domain)
|
||||||
for relay in candidates {
|
.collect();
|
||||||
|
for relay in &relays_from_qr {
|
||||||
relays_sender.try_send(relay.to_string())?;
|
relays_sender.try_send(relay.to_string())?;
|
||||||
}
|
}
|
||||||
|
for relay in default_relays {
|
||||||
|
if !relays_from_qr.contains(relay) {
|
||||||
|
relays_sender.try_send(relay.to_string())?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let mut join_set = JoinSet::new();
|
let mut join_set = JoinSet::new();
|
||||||
for _ in 0..NUM_TRANSPORTS_TARGET {
|
for _ in 0..NUM_TRANSPORTS_TARGET {
|
||||||
@@ -80,7 +88,6 @@ pub(crate) async fn init_transports_inner(
|
|||||||
return false; // No more relays to try
|
return false; // No more relays to try
|
||||||
};
|
};
|
||||||
let param = login_param_from_host(&host);
|
let param = login_param_from_host(&host);
|
||||||
let skip_network = false;
|
|
||||||
let res = crate::configure::configure(&context, ¶m, skip_network).await;
|
let res = crate::configure::configure(&context, ¶m, skip_network).await;
|
||||||
if let Err(err) = res {
|
if let Err(err) = res {
|
||||||
warn!(context, "Failed to init transport {host}: {err:#}.");
|
warn!(context, "Failed to init transport {host}: {err:#}.");
|
||||||
|
|||||||
@@ -217,7 +217,8 @@ impl Context {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
autorelay::init_transports_inner(self, addrs_from_qr).await?;
|
let skip_network = false;
|
||||||
|
autorelay::init_transports_inner(self, addrs_from_qr, skip_network).await?;
|
||||||
|
|
||||||
self.start_io().await;
|
self.start_io().await;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user