combined curret main (with sled) and RPC server

This commit is contained in:
Maxime Van Hees
2025-09-11 17:23:46 +02:00
parent 4bb24b38dd
commit 9fa9832605
7 changed files with 1396 additions and 21 deletions

59
src/rpc_server.rs Normal file
View File

@@ -0,0 +1,59 @@
use std::net::SocketAddr;
use jsonrpsee::server::{ServerBuilder, ServerHandle};
use jsonrpsee::RpcModule;
use crate::rpc::{RpcServer, RpcServerImpl};
use crate::options::DBOption;
/// Start the RPC server on the specified address
pub async fn start_rpc_server(addr: SocketAddr, base_dir: String, db_option: DBOption) -> Result<ServerHandle, Box<dyn std::error::Error + Send + Sync>> {
// Create the RPC server implementation
let rpc_impl = RpcServerImpl::new(base_dir, db_option);
// Create the RPC module
let mut module = RpcModule::new(());
module.merge(RpcServer::into_rpc(rpc_impl))?;
// Build the server with both HTTP and WebSocket support
let server = ServerBuilder::default()
.build(addr)
.await?;
// Start the server
let handle = server.start(module);
println!("RPC server started on {}", addr);
Ok(handle)
}
#[cfg(test)]
mod tests {
use super::*;
use std::time::Duration;
#[tokio::test]
async fn test_rpc_server_startup() {
let addr = "127.0.0.1:0".parse().unwrap(); // Use port 0 for auto-assignment
let base_dir = "/tmp/test_rpc".to_string();
// Create a dummy DBOption for testing
let db_option = crate::options::DBOption {
dir: base_dir.clone(),
port: 0,
debug: false,
encryption_key: None,
encrypt: false,
backend: crate::options::BackendType::Redb,
};
let handle = start_rpc_server(addr, base_dir, db_option).await.unwrap();
// Give the server a moment to start
tokio::time::sleep(Duration::from_millis(100)).await;
// Stop the server
handle.stop().unwrap();
handle.stopped().await;
}
}