Skip to main content

txtx_supervisor_ui/
lib.rs

1pub mod http;
2
3use std::{collections::BTreeMap, sync::Arc};
4
5use actix_web::dev::ServerHandle;
6use include_dir::{include_dir, Dir};
7use tokio::sync::{broadcast::Sender as TokioBroadcastSender, RwLock};
8use txtx_addon_kit::{
9    channel::Sender,
10    types::frontend::{
11        ActionItemResponse, Block as ActionBlock, BlockEvent, LogEvent, SupervisorAddonData,
12    },
13};
14use txtx_gql::Context as GqlContext;
15
16pub const OUT_DIR: &str = env!("OUT_DIR");
17pub static ASSETS: Dir<'_> = include_dir!("$OUT_DIR/supervisor");
18
19pub const DEFAULT_BINDING_PORT: &str = "8488";
20pub const DEFAULT_BINDING_ADDRESS: &str = "localhost";
21
22#[derive(Debug, Clone)]
23pub enum SupervisorEvents {
24    /// The supervisor has started, with the network binding it's running on.
25    Started(String),
26}
27
28pub async fn start_supervisor_ui(
29    runbook_name: String,
30    runbook_description: Option<String>,
31    supervisor_addon_data: Vec<SupervisorAddonData>,
32    block_store: Arc<RwLock<BTreeMap<usize, ActionBlock>>>,
33    log_store: Arc<RwLock<Vec<LogEvent>>>,
34    block_broadcaster: TokioBroadcastSender<BlockEvent>,
35    log_broadcaster: TokioBroadcastSender<LogEvent>,
36    action_item_events_tx: TokioBroadcastSender<ActionItemResponse>,
37    _kill_loops_tx: Sender<bool>,
38    network_binding_ip_address: &str,
39    network_binding_port: u16,
40    supervisor_events_tx: Sender<SupervisorEvents>,
41) -> Result<ServerHandle, String> {
42    let gql_context = GqlContext {
43        protocol_name: runbook_name.clone(),
44        runbook_name,
45        supervisor_addon_data,
46        runbook_description,
47        block_store,
48        log_store,
49        block_broadcaster: block_broadcaster.clone(),
50        log_broadcaster: log_broadcaster.clone(),
51        action_item_events_tx: action_item_events_tx.clone(),
52    };
53
54    let network_binding = format!("{}:{}", network_binding_ip_address, network_binding_port);
55    let _ = supervisor_events_tx.send(SupervisorEvents::Started(network_binding.clone()));
56
57    let handle = http::start_server(gql_context, &network_binding)
58        .await
59        .map_err(|e| format!("Failed to start web ui: {e}"))?;
60
61    Ok(handle)
62}