wip
This commit is contained in:
@@ -1,7 +1,5 @@
|
||||
use hero_websocket_server::{ServerBuilder, TlsConfigError};
|
||||
use hero_websocket_server::{ServerBuilder, ServerConfig};
|
||||
use clap::Parser;
|
||||
use dotenv::dotenv;
|
||||
use log::info;
|
||||
|
||||
#[derive(Parser, Debug)]
|
||||
#[clap(author, version, about, long_about = None)]
|
||||
@@ -39,14 +37,62 @@ struct Args {
|
||||
#[clap(long, help = "Enable webhook handling")]
|
||||
webhooks: bool,
|
||||
|
||||
#[clap(long, value_parser, help = "Worker ID for the server")]
|
||||
worker_id: String,
|
||||
#[clap(short, long, value_parser, help = "Path to configuration file")]
|
||||
config: Option<String>,
|
||||
|
||||
#[clap(long, help = "Generate a sample configuration file")]
|
||||
generate_config: bool,
|
||||
}
|
||||
|
||||
#[actix_web::main]
|
||||
async fn main() -> std::io::Result<()> {
|
||||
let args = Args::parse();
|
||||
|
||||
// Handle config file generation
|
||||
if args.generate_config {
|
||||
let sample_config = ServerConfig::create_sample();
|
||||
let config_path = "config.json";
|
||||
match sample_config.to_file(config_path) {
|
||||
Ok(_) => {
|
||||
println!("✅ Sample configuration file generated: {}", config_path);
|
||||
println!("📝 Edit the file to customize your server configuration.");
|
||||
return Ok(());
|
||||
}
|
||||
Err(e) => {
|
||||
eprintln!("❌ Failed to generate config file: {}", e);
|
||||
std::process::exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Load configuration from file if provided, otherwise use CLI args
|
||||
let config = if let Some(config_path) = &args.config {
|
||||
match ServerConfig::from_file(config_path) {
|
||||
Ok(config) => {
|
||||
println!("📄 Loaded configuration from: {}", config_path);
|
||||
config
|
||||
}
|
||||
Err(e) => {
|
||||
eprintln!("❌ Failed to load config file {}: {}", config_path, e);
|
||||
std::process::exit(1);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Create config from CLI arguments
|
||||
ServerConfig {
|
||||
host: args.host.clone(),
|
||||
port: args.port,
|
||||
redis_url: args.redis_url.clone(),
|
||||
auth: args.auth,
|
||||
tls: args.tls,
|
||||
cert: args.cert.clone(),
|
||||
key: args.key.clone(),
|
||||
tls_port: args.tls_port,
|
||||
webhooks: args.webhooks,
|
||||
circles: std::collections::HashMap::new(), // Empty circles when using CLI
|
||||
}
|
||||
};
|
||||
|
||||
// Configure logging based on verbosity level
|
||||
let log_config = match args.verbose {
|
||||
0 => {
|
||||
@@ -78,39 +124,14 @@ async fn main() -> std::io::Result<()> {
|
||||
env_logger::init();
|
||||
}
|
||||
|
||||
// Validate TLS configuration
|
||||
if args.tls && (args.cert.is_none() || args.key.is_none()) {
|
||||
eprintln!("Error: TLS is enabled but certificate or key path is missing");
|
||||
eprintln!("Use --cert and --key to specify certificate and key files");
|
||||
// Validate configuration
|
||||
if let Err(e) = config.validate() {
|
||||
eprintln!("❌ Configuration validation failed: {}", e);
|
||||
std::process::exit(1);
|
||||
}
|
||||
|
||||
let mut builder = ServerBuilder::new()
|
||||
.host(args.host.clone())
|
||||
.port(args.port)
|
||||
.redis_url(args.redis_url.clone())
|
||||
.worker_id(args.worker_id.clone());
|
||||
|
||||
if args.auth {
|
||||
builder = builder.with_auth();
|
||||
}
|
||||
|
||||
if args.tls {
|
||||
if let (Some(cert), Some(key)) = (args.cert.clone(), args.key.clone()) {
|
||||
builder = builder.with_tls(cert, key);
|
||||
} else {
|
||||
eprintln!("Error: TLS is enabled but --cert or --key is missing.");
|
||||
std::process::exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(tls_port) = args.tls_port {
|
||||
builder = builder.with_tls_port(tls_port);
|
||||
}
|
||||
|
||||
if args.webhooks {
|
||||
builder = builder.with_webhooks();
|
||||
}
|
||||
// Build server from configuration
|
||||
let builder = ServerBuilder::new().from_config(config.clone());
|
||||
|
||||
let server = match builder.build() {
|
||||
Ok(server) => server,
|
||||
@@ -122,27 +143,36 @@ async fn main() -> std::io::Result<()> {
|
||||
|
||||
println!("🚀 Starting Circles WebSocket Server");
|
||||
println!("📋 Configuration:");
|
||||
println!(" Host: {}", args.host);
|
||||
println!(" Port: {}", args.port);
|
||||
if let Some(tls_port) = args.tls_port {
|
||||
println!(" Host: {}", config.host);
|
||||
println!(" Port: {}", config.port);
|
||||
println!(" Redis URL: {}", config.redis_url);
|
||||
if let Some(tls_port) = config.tls_port {
|
||||
println!(" TLS Port: {}", tls_port);
|
||||
}
|
||||
println!(" Authentication: {}", if args.auth { "ENABLED" } else { "DISABLED" });
|
||||
println!(" TLS/WSS: {}", if args.tls { "ENABLED" } else { "DISABLED" });
|
||||
println!(" Webhooks: {}", if args.webhooks { "ENABLED" } else { "DISABLED" });
|
||||
println!(" Authentication: {}", if config.auth { "ENABLED" } else { "DISABLED" });
|
||||
println!(" TLS/WSS: {}", if config.tls { "ENABLED" } else { "DISABLED" });
|
||||
println!(" Webhooks: {}", if config.webhooks { "ENABLED" } else { "DISABLED" });
|
||||
println!(" Circles configured: {}", config.circles.len());
|
||||
|
||||
if args.tls {
|
||||
if let (Some(cert), Some(key)) = (&args.cert, &args.key) {
|
||||
if config.tls {
|
||||
if let (Some(cert), Some(key)) = (&config.cert, &config.key) {
|
||||
println!(" Certificate: {}", cert);
|
||||
println!(" Private Key: {}", key);
|
||||
}
|
||||
}
|
||||
|
||||
if args.webhooks {
|
||||
if config.webhooks {
|
||||
println!(" Webhook secrets loaded from environment variables:");
|
||||
println!(" - STRIPE_WEBHOOK_SECRET");
|
||||
println!(" - IDENFY_WEBHOOK_SECRET");
|
||||
}
|
||||
|
||||
if config.auth && !config.circles.is_empty() {
|
||||
println!(" Configured circles:");
|
||||
for (circle_name, members) in &config.circles {
|
||||
println!(" - {}: {} members", circle_name, members.len());
|
||||
}
|
||||
}
|
||||
println!();
|
||||
|
||||
let (server_task, _server_handle) = server.spawn_circle_server()?;
|
||||
|
Reference in New Issue
Block a user