From ab0a8f5782d11a264a63f2fc1c2ffa292759df4e Mon Sep 17 00:00:00 2001 From: tv Date: Tue, 27 Oct 2026 02:14:12 +0100 Subject: add transports option --- src/main.rs | 59 ++++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 15 deletions(-) (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs index b5e7fc6..435f83a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -69,7 +69,8 @@ async fn main() -> Result<()> { // A broken htpasswd will abort startup. let auth_state = AuthState::new(&args.htpasswd)?; - let mycelium_setup = { + let uses = |name: &str| args.transports.iter().any(|transport| transport == name); + let mut mycelium_setup = if uses("mycelium") { let spawn_config = MyceliumSpawnConfig { rest_url_opt: args.mycelium_rest_url(), key_file_opt: args.mycelium_key_file.clone(), @@ -78,22 +79,24 @@ async fn main() -> Result<()> { tcp_port: args.mycelium_tcp_listen_port, peers: args.mycelium_peers.clone(), }; - tokio::select! { + let setup = tokio::select! { setup = MyceliumSetup::bootstrap(spawn_config) => setup?, _ = stopped(stop.clone()) => return Ok(()), - } + }; + // Without a password it may carry (the option is secret). + let mut shown_url = setup.rest_url.clone(); + let _ = shown_url.set_password(None); + debug!(url = shown_url.to_string(), "Using Mycelium REST API"); + Some(setup) + } else { + None }; - let mycelium_rest_url = mycelium_setup.rest_url.clone(); - info!( bind_addr = args.bind_addr.to_string(), + transports = ?args.transports, "Starting replication service" ); - // Without a password it may carry (the option is secret). - let mut shown_url = mycelium_rest_url.clone(); - let _ = shown_url.set_password(None); - debug!(url = shown_url.to_string(), "Using Mycelium REST API"); let force = force::Force::parse(args.force.iter().map(String::as_str), config::FORCE) .map_err(anyhow::Error::msg)?; @@ -160,9 +163,35 @@ async fn main() -> Result<()> { }; debug!(epoch = %initial_epoch, "Local epoch"); - let mycelium_transport = Arc::new(mycelium::MyceliumTransport::connect(mycelium_setup).await?); - debug!(address = mycelium_transport.local_id(), "Transport ready"); - let delivery_limit = mycelium_transport.delivery_limit(); + // In the order of preference (`--transports`, checked when loading). + let mut transports: Vec<(&'static str, Arc)> = Vec::new(); + for name in &args.transports { + let transport: (&'static str, Arc) = match name.as_str() { + "mycelium" => { + let setup = mycelium_setup + .take() + .context("Mycelium named twice in transports")?; + ( + "mycelium", + Arc::new(mycelium::MyceliumTransport::connect(setup).await?), + ) + } + other => anyhow::bail!("transports: no {other} in this build"), + }; + debug!( + transport = transport.0, + address = transport.1.local_id(), + "Transport ready" + ); + transports.push(transport); + } + let delivery_limit = transports + .iter() + .map(|(_, transport)| transport.delivery_limit()) + .max() + .unwrap_or_default(); + let mut transports = transports.into_iter(); + let (scheme, transport) = transports.next().context("No transports")?; let document_file = args.document_file.clone().map(|path| { Arc::new(document::file::DocumentFile::new( @@ -173,11 +202,11 @@ async fn main() -> Result<()> { )) }); let node = node::Node::new(node::NodeConfig { - transport: mycelium_transport, + transport, identity: Some(transport::identity::IdentityConfig { key: Arc::new(node_key), - scheme: "mycelium", - more: Vec::new(), + scheme, + more: transports.collect(), }), initial_epoch, initial_doc, -- cgit v1.3.1