apt_swarm/p2p/
sync.rs

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}