tx_bakery_ogmios/
launcher.rs

1use tx_bakery::chain_query::Network;
2use anyhow::anyhow;
3use derive_builder::Builder;
4use serde::Deserialize;
5
6use std::path::PathBuf;
7use std::process::Stdio;
8use tokio::process::{Child, Command};
9use tokio::sync::Mutex;
10
11use super::error::{OgmiosError, Result};
12
13#[derive(Debug, Builder, Clone, Deserialize)]
14pub struct OgmiosLauncherConfig {
15    #[builder(default = r#""".try_into().unwrap()"#)]
16    pub node_socket: PathBuf,
17    #[builder(default = r#"".node.config".try_into().unwrap()"#)]
18    pub node_config: PathBuf,
19    #[builder(default = r#""127.0.0.1".to_string()"#)]
20    pub host: String,
21    #[builder(default = "1337")]
22    pub port: u16,
23    #[builder(default = "false")]
24    pub verbose: bool,
25    #[builder(default = r#"Network::Testnet"#)]
26    pub network: Network,
27    #[builder(default = "180")]
28    pub timeout: u32,
29    #[builder(default = "1000")]
30    pub max_in_flight: u32,
31    #[builder(default = "90")]
32    pub startup_timeout: u64,
33}
34
35pub struct OgmiosLauncher {
36    handler: Mutex<Option<Child>>,
37    config: OgmiosLauncherConfig,
38}
39
40impl OgmiosLauncher {
41    pub async fn start(config: OgmiosLauncherConfig) -> Result<Self> {
42        let handler = Command::new("ogmios")
43            .arg("--strict-rpc")
44            .arg("--node-socket")
45            .arg(&config.node_socket)
46            .arg("--node-config")
47            .arg(&config.node_config)
48            .arg("--host")
49            .arg(&config.host)
50            .arg("--port")
51            .arg(config.port.to_string())
52            .arg("--timeout")
53            .arg(config.timeout.to_string())
54            .arg("--max-in-flight")
55            .arg(config.max_in_flight.to_string())
56            .stdout(if config.verbose {
57                Stdio::inherit()
58            } else {
59                Stdio::null()
60            })
61            .stderr(if config.verbose {
62                Stdio::inherit()
63            } else {
64                Stdio::null()
65            })
66            .kill_on_drop(true)
67            .spawn()
68            .map_err(|err| OgmiosError::StartupError(anyhow!("Unable to spawn ogmios: {}", err)))?;
69
70        Ok(Self {
71            handler: Mutex::new(Some(handler)),
72            config,
73        })
74    }
75
76    pub fn get_config(&self) -> &OgmiosLauncherConfig {
77        &self.config
78    }
79
80    /// Kill ogmios process
81    pub async fn kill(&mut self) {
82        let mut guard = self.handler.lock().await;
83
84        if let Some(mut child) = guard.take() {
85            let _ = child.kill().await;
86            let _ = child.wait().await;
87        }
88    }
89}