use std::sync::Arc;
use async_trait::async_trait;
use crate::{
Entry, Result,
sync::{
handler::SyncHandler,
peer_types::Address,
protocol::{SyncRequest, SyncResponse},
},
};
pub mod http;
pub mod iroh;
pub mod shared;
#[async_trait]
pub trait SyncTransport: Send + Sync {
fn can_handle_address(&self, address: &Address) -> bool;
async fn start_server(&mut self, addr: &str, handler: Arc<dyn SyncHandler>) -> Result<()>;
async fn stop_server(&mut self) -> Result<()>;
async fn send_request(&self, address: &Address, request: &SyncRequest) -> Result<SyncResponse>;
async fn send_entries(&self, address: &Address, entries: &[Entry]) -> Result<()> {
let request = SyncRequest::SendEntries(entries.to_vec());
let response = self.send_request(address, &request).await?;
match response {
SyncResponse::Ack | SyncResponse::Count(_) => Ok(()),
SyncResponse::Error(msg) => Err(crate::sync::SyncError::Network(msg).into()),
_ => Err(crate::sync::SyncError::UnexpectedResponse {
expected: "Ack or Count",
actual: format!("{response:?}"),
}
.into()),
}
}
fn is_server_running(&self) -> bool;
fn get_server_address(&self) -> Result<String>;
}