summaryrefslogtreecommitdiffstats
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs59
1 files changed, 44 insertions, 15 deletions
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<dyn Transport>)> = Vec::new();
+ for name in &args.transports {
+ let transport: (&'static str, Arc<dyn Transport>) = 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,