use anyhow::Result;
use clap::Parser;
use std::path::PathBuf;
use tracing::info;
use sentinel_agent_js::JsAgent;
use sentinel_agent_protocol::AgentServer;
#[derive(Parser, Debug)]
#[command(name = "sentinel-js-agent")]
#[command(about = "JavaScript scripting agent for Sentinel reverse proxy")]
struct Args {
#[arg(long, default_value = "/tmp/sentinel-js.sock", env = "AGENT_SOCKET")]
socket: PathBuf,
#[arg(long, env = "JS_SCRIPT")]
script: PathBuf,
#[arg(short, long, env = "JS_VERBOSE")]
verbose: bool,
#[arg(long, env = "FAIL_OPEN")]
fail_open: bool,
}
#[tokio::main]
async fn main() -> Result<()> {
let args = Args::parse();
let log_level = if args.verbose { "debug" } else { "info" };
tracing_subscriber::fmt()
.with_env_filter(format!(
"{}={},sentinel_agent_protocol=info",
env!("CARGO_CRATE_NAME"),
log_level
))
.json()
.init();
info!("Starting Sentinel JavaScript Agent");
let agent = JsAgent::new(args.script.clone(), args.fail_open)?;
info!(
script = ?args.script,
fail_open = args.fail_open,
"Agent configured"
);
info!(socket = ?args.socket, "Starting agent server");
let server = AgentServer::new("sentinel-js-agent", args.socket, Box::new(agent));
server.run().await.map_err(|e| anyhow::anyhow!("{}", e))?;
Ok(())
}