//! Server process use log::*; use nostr_rs_relay::config; use nostr_rs_relay::error::{Error, Result}; use nostr_rs_relay::server::start_server; use std::env; use std::sync::mpsc as syncmpsc; use std::sync::mpsc::{Receiver as MpscReceiver, Sender as MpscSender}; use std::thread; use console_subscriber::ConsoleLayer; /// Return a requested DB name from command line arguments. fn db_from_args(args: Vec) -> Option { if args.len() == 3 && args.get(1) == Some(&"--db".to_owned()) { return args.get(2).map(|x| x.to_owned()); } None } /// Start running a Nostr relay server. fn main() -> Result<(), Error> { // setup logger let _ = env_logger::try_init(); info!("Starting up from main"); // get database directory from args let args: Vec = env::args().collect(); let db_dir: Option = db_from_args(args); // configure settings from config.toml // replace default settings with those read from config.toml let mut settings = config::Settings::new(); if settings.diagnostics.tracing { // enable tracing with tokio-console ConsoleLayer::builder().with_default_env().init(); } // update with database location if let Some(db) = db_dir { settings.database.data_directory = db; } let (_, ctrl_rx): (MpscSender<()>, MpscReceiver<()>) = syncmpsc::channel(); // run this in a new thread let handle = thread::spawn(|| { // we should have a 'control plane' channel to monitor and bump the server. // this will let us do stuff like clear the database, shutdown, etc. let _ = start_server(settings, ctrl_rx); }); // block on nostr thread to finish. handle.join().unwrap(); Ok(()) }