#![allow(dead_code)]
#![allow(unused_imports)]
use super::types::*;
use async_trait::async_trait;
use rpcnet::{RpcConfig, RpcError, RpcServer};
use std::sync::Arc;
#[async_trait]
pub trait FileTransferHandler: Send + Sync + 'static {
async fn upload_chunk(
&self,
request: UploadChunkRequest,
) -> Result<UploadChunkResponse, FileTransferError>;
async fn download_chunk(
&self,
request: DownloadChunkRequest,
) -> Result<DownloadChunkResponse, FileTransferError>;
async fn get_file_info(
&self,
request: FileInfoRequest,
) -> Result<FileInfoResponse, FileTransferError>;
}
pub struct FileTransferServer<H: FileTransferHandler> {
handler: Arc<H>,
rpc_server: RpcServer,
}
impl<H: FileTransferHandler> FileTransferServer<H> {
pub fn new(handler: H, config: RpcConfig) -> Self {
Self {
handler: Arc::new(handler),
rpc_server: RpcServer::new(config),
}
}
pub async fn register_all(&mut self) {
{
let handler = self.handler.clone();
self.rpc_server
.register("FileTransfer.upload_chunk", move |params| {
let handler = handler.clone();
async move {
let request: UploadChunkRequest =
bincode::deserialize(¶ms).map_err(RpcError::SerializationError)?;
match handler.upload_chunk(request).await {
Ok(response) => {
bincode::serialize(&response).map_err(RpcError::SerializationError)
}
Err(e) => Err(RpcError::StreamError(format!("{:?}", e))),
}
}
})
.await;
}
{
let handler = self.handler.clone();
self.rpc_server
.register("FileTransfer.download_chunk", move |params| {
let handler = handler.clone();
async move {
let request: DownloadChunkRequest =
bincode::deserialize(¶ms).map_err(RpcError::SerializationError)?;
match handler.download_chunk(request).await {
Ok(response) => {
bincode::serialize(&response).map_err(RpcError::SerializationError)
}
Err(e) => Err(RpcError::StreamError(format!("{:?}", e))),
}
}
})
.await;
}
{
let handler = self.handler.clone();
self.rpc_server
.register("FileTransfer.get_file_info", move |params| {
let handler = handler.clone();
async move {
let request: FileInfoRequest =
bincode::deserialize(¶ms).map_err(RpcError::SerializationError)?;
match handler.get_file_info(request).await {
Ok(response) => {
bincode::serialize(&response).map_err(RpcError::SerializationError)
}
Err(e) => Err(RpcError::StreamError(format!("{:?}", e))),
}
}
})
.await;
}
}
pub async fn serve(mut self) -> Result<(), RpcError> {
self.register_all().await;
let quic_server = self.rpc_server.bind()?;
println!("Server listening on: {:?}", self.rpc_server.socket_addr);
self.rpc_server.start(quic_server).await
}
}