mod connect;
mod identity;
mod script;
mod serve;
use std::time::Duration;
use notochord::NetworkId;
use personae::{IdentityProvider, InMemoryProvider};
use crate::connect::{PeerSource, connect};
use crate::identity::env_hash;
use crate::serve::serve;
pub(crate) const ROOT_AUTHORITY: [u8; 32] = [7; 32];
pub(crate) const DIAL_DEADLINE: Duration = Duration::from_secs(20);
fn init_tracing() {
if std::env::var_os("RUST_LOG").is_some() {
tracing_subscriber::fmt()
.with_env_filter(tracing_subscriber::EnvFilter::from_default_env())
.with_writer(std::io::stderr)
.init();
}
}
#[tokio::main(flavor = "multi_thread")]
async fn main() -> Result<(), String> {
init_tracing();
let mut args = std::env::args().skip(1);
let mode = args.next().unwrap_or_default();
let mut peer_ticket = None;
let mut revoked = false;
let mut discover = false;
while let Some(arg) = args.next() {
match arg.as_str() {
"--peer" => peer_ticket = args.next(),
"--discover" => discover = true,
"--revoked" => revoked = true,
other => return Err(format!("unexpected argument {other:?}")),
}
}
let owner = InMemoryProvider::from_seed(env_hash("G5_OWNER")?);
let seed = env_hash("G5_SEED")?;
let me = InMemoryProvider::from_seed(seed);
let network = NetworkId(env_hash("G5_NETWORK")?);
match mode.as_str() {
"serve" => serve(owner, me, seed, network, revoked).await,
"connect" if discover => {
let peer_key = InMemoryProvider::from_seed(env_hash("G5_PEER")?).master_public_key();
let peer = transport::PeerID::from_bytes(&peer_key.to_bytes())
.map_err(|e| format!("peer id: {e}"))?;
connect(owner, me, seed, network, PeerSource::Discovered(peer)).await
}
"connect" => {
let ticket = peer_ticket.ok_or("connect needs --peer <ticket> or --discover")?;
connect(owner, me, seed, network, PeerSource::Ticket(ticket)).await
}
other => Err(format!(
"usage: g5_peer serve [--revoked] | g5_peer connect --peer <ticket>\n\
(got {other:?})"
)),
}
}