use bft_json_crdt::json_crdt::{BaseCrdt, SignedOp}; use cli::{parse_args, Commands}; use crdt::TransactionList; use node::SideNode; use tokio::sync::mpsc; use websocket::WebSocketClient; pub(crate) mod cli; pub(crate) mod crdt; pub(crate) mod init; pub(crate) mod keys; pub(crate) mod node; pub(crate) mod utils; pub(crate) mod websocket; #[tokio::main] async fn main() { let args = parse_args(); match &args.command { Some(Commands::Init { name }) => { let config = init::config::SideNodeConfig { name: name.to_string(), }; let _ = init::init(utils::home(name), config); } Some(Commands::Run { name }) => { let mut node = setup(name).await; node.start().await; } None => println!("No command provided. Exiting. See --help for more information."), } } /// Wire everything up outside the application so we can test more easily later async fn setup(name: &String) -> SideNode { let side_dir = utils::home(name); let keys = keys::load_from_file(side_dir); let (incoming_sender, incoming_receiver) = mpsc::channel::(32); let crdt = BaseCrdt::::new(&keys); let node = SideNode::new(crdt, keys, incoming_receiver); WebSocketClient::start(incoming_sender).await; println!("Node setup complete."); node } // async fn maybe_autosend( // autosend: bool, // handle: ezsockets::Client, // mut node: SideNode, // ) { // if autosend { // let forever = task::spawn(async { // let mut interval = time::interval(Duration::from_millis(10)); // loop { // interval.tick().await; // let fake = utils::fake_transaction("foo123".to_string()); // let signed_op = node.add_transaction_local(fake); // let json = serde_json::to_string(&signed_op).unwrap(); // handle.text(json).unwrap(); // } // }); // forever.await.unwrap(); // } // }