1use crate::db::DatabaseServerClient;
2use crate::errors::*;
3use crate::p2p::{self, peerdb};
4use crate::sync;
5use std::convert::Infallible;
6use tokio::io::AsyncWriteExt;
7use tokio::net::{TcpListener, TcpStream};
8
9pub async fn serve_sync_client(
10 db: &mut DatabaseServerClient,
11 peerdb: peerdb::Client,
12 mut stream: TcpStream,
13) -> Result<()> {
14 let (rx, mut tx) = stream.split();
15 let result =
16 sync::sync_yield(db, Some(peerdb), rx, &mut tx, Some(p2p::SYNC_IDLE_TIMEOUT)).await;
17 tx.shutdown().await.ok();
18 result
19}
20
21pub async fn spawn_sync_server(
22 db: &DatabaseServerClient,
23 peerdb: peerdb::Client,
24 listener: TcpListener,
25) -> Result<Infallible> {
26 loop {
27 let (stream, src_addr) = listener.accept().await?;
28 debug!("Accepted connection from client: {:?}", src_addr);
29
30 let mut db = db.clone();
31 let peerdb = peerdb.clone();
32 tokio::spawn(async move {
33 if let Err(err) = serve_sync_client(&mut db, peerdb, stream).await {
34 error!("Error while serving client: {err:#}");
35 } else {
36 debug!("Client disconnected: {src_addr:?}");
37 }
38 });
39 }
40}