2026-05-26 06:24:57 +00:00
|
|
|
use crate::log::error;
|
2026-05-24 17:56:57 +00:00
|
|
|
use crate::records::memory::response_channels::Command;
|
|
|
|
|
use crate::rpc::server::handshake::handle_handshake;
|
|
|
|
|
use crate::sled::Db;
|
2026-06-01 14:29:11 +00:00
|
|
|
use crate::wallets::structures::Wallet;
|
2026-05-24 17:56:57 +00:00
|
|
|
use crate::Arc;
|
|
|
|
|
use crate::Mutex;
|
|
|
|
|
use crate::SocketAddr;
|
|
|
|
|
use crate::TcpListener;
|
|
|
|
|
|
|
|
|
|
// wait incomming connections
|
|
|
|
|
pub async fn start_rpc(
|
|
|
|
|
db: &Db,
|
|
|
|
|
server_address: String,
|
2026-06-01 14:29:11 +00:00
|
|
|
wallet: Arc<Wallet>,
|
2026-05-24 17:56:57 +00:00
|
|
|
map: Arc<Mutex<Command>>,
|
|
|
|
|
) {
|
|
|
|
|
// Parse once at startup so the accept loop can work with a concrete
|
|
|
|
|
// socket address instead of reparsing the settings string each time.
|
|
|
|
|
let server_socket: SocketAddr = server_address
|
|
|
|
|
.parse()
|
|
|
|
|
.expect("Failed to parse server address");
|
|
|
|
|
let db_clone = db.clone();
|
|
|
|
|
|
|
|
|
|
// The listener runs in the background while startup continues with
|
|
|
|
|
// the rest of node initialization.
|
|
|
|
|
tokio::spawn(async move {
|
2026-06-01 14:29:11 +00:00
|
|
|
rpc_server(server_socket, &db_clone, wallet, map).await;
|
2026-05-24 17:56:57 +00:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// generate a connection when it comes in
|
|
|
|
|
async fn rpc_server(
|
|
|
|
|
server_socket: SocketAddr,
|
|
|
|
|
db: &Db,
|
2026-06-01 14:29:11 +00:00
|
|
|
wallet: Arc<Wallet>,
|
2026-05-24 17:56:57 +00:00
|
|
|
map: Arc<Mutex<Command>>,
|
|
|
|
|
) {
|
|
|
|
|
// Bind failure means this node cannot accept RPC traffic, so log the
|
|
|
|
|
// reason and leave the background task instead of panicking.
|
|
|
|
|
let listener = match TcpListener::bind(&server_socket).await {
|
|
|
|
|
Ok(listener) => listener,
|
|
|
|
|
Err(e) => {
|
|
|
|
|
error!("Failed to bind to socket: {e:?}");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
loop {
|
|
|
|
|
match listener.accept().await {
|
|
|
|
|
Ok((stream, _)) => {
|
|
|
|
|
// Every accepted socket gets its own handshake task so
|
|
|
|
|
// slow peers do not block the listener from accepting.
|
|
|
|
|
let stream = Arc::new(Mutex::new(stream));
|
|
|
|
|
let db_clone = db.clone();
|
2026-06-01 14:29:11 +00:00
|
|
|
let wallet_clone = wallet.clone();
|
2026-05-24 17:56:57 +00:00
|
|
|
let map_clone = map.clone();
|
|
|
|
|
tokio::spawn(async move {
|
2026-06-01 14:29:11 +00:00
|
|
|
handle_handshake(stream, db_clone, wallet_clone, map_clone).await;
|
2026-05-24 17:56:57 +00:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
Err(e) => {
|
|
|
|
|
error!("Error accepting connection: {e:?}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|