implement unix and ws using jsonrpsee
This commit is contained in:
95
interfaces/openrpc/server/cmd/main.rs
Normal file
95
interfaces/openrpc/server/cmd/main.rs
Normal file
@@ -0,0 +1,95 @@
|
||||
use anyhow::Result;
|
||||
use clap::{Parser, Subcommand};
|
||||
use hero_openrpc_server::{OpenRpcServer, OpenRpcServerConfig, Transport};
|
||||
use std::net::SocketAddr;
|
||||
use std::path::PathBuf;
|
||||
use tracing::{info, Level};
|
||||
use tracing_subscriber;
|
||||
|
||||
#[derive(Parser)]
|
||||
#[command(name = "hero-openrpc-server")]
|
||||
#[command(about = "Hero OpenRPC Server - WebSocket and Unix socket JSON-RPC server")]
|
||||
struct Cli {
|
||||
#[command(subcommand)]
|
||||
command: Commands,
|
||||
|
||||
/// Path to supervisor configuration file
|
||||
#[arg(long)]
|
||||
supervisor_config: Option<PathBuf>,
|
||||
|
||||
/// Database path for supervisor
|
||||
#[arg(long, default_value = "./supervisor.db")]
|
||||
db_path: PathBuf,
|
||||
|
||||
/// Log level
|
||||
#[arg(long, default_value = "info")]
|
||||
log_level: String,
|
||||
}
|
||||
|
||||
#[derive(Subcommand)]
|
||||
enum Commands {
|
||||
/// Start WebSocket server
|
||||
Websocket {
|
||||
/// Address to bind to
|
||||
#[arg(long, default_value = "127.0.0.1:9944")]
|
||||
addr: SocketAddr,
|
||||
},
|
||||
/// Start Unix socket server
|
||||
Unix {
|
||||
/// Unix socket path
|
||||
#[arg(long, default_value = "/tmp/hero-openrpc.sock")]
|
||||
socket_path: PathBuf,
|
||||
},
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<()> {
|
||||
let cli = Cli::parse();
|
||||
|
||||
// Initialize tracing
|
||||
let log_level = match cli.log_level.to_lowercase().as_str() {
|
||||
"trace" => Level::TRACE,
|
||||
"debug" => Level::DEBUG,
|
||||
"info" => Level::INFO,
|
||||
"warn" => Level::WARN,
|
||||
"error" => Level::ERROR,
|
||||
_ => Level::INFO,
|
||||
};
|
||||
|
||||
tracing_subscriber::fmt()
|
||||
.with_max_level(log_level)
|
||||
.init();
|
||||
|
||||
let transport = match cli.command {
|
||||
Commands::Websocket { addr } => {
|
||||
info!("Starting WebSocket server on {}", addr);
|
||||
Transport::WebSocket(addr)
|
||||
}
|
||||
Commands::Unix { socket_path } => {
|
||||
info!("Starting Unix socket server on {:?}", socket_path);
|
||||
// Remove existing socket file if it exists
|
||||
if socket_path.exists() {
|
||||
std::fs::remove_file(&socket_path)?;
|
||||
}
|
||||
Transport::Unix(socket_path)
|
||||
}
|
||||
};
|
||||
|
||||
let config = OpenRpcServerConfig {
|
||||
transport: transport.clone(),
|
||||
supervisor_config_path: cli.supervisor_config,
|
||||
db_path: cli.db_path,
|
||||
};
|
||||
|
||||
// Create and start the server
|
||||
let server = OpenRpcServer::new(config.clone()).await?;
|
||||
let handle = server.start(config).await?;
|
||||
|
||||
info!("Server started successfully");
|
||||
|
||||
// Wait for the server to finish
|
||||
handle.stopped().await;
|
||||
|
||||
info!("Server stopped");
|
||||
Ok(())
|
||||
}
|
Reference in New Issue
Block a user