tx_bakery_ogmios/
launcher.rs1use 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 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}