1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
use crate::prelude::*; use message::pty::MainShutdown; use simplelog::{CombinedLogger, TermLogger, TerminalMode}; use std::time::Duration; use tab_api::{launch::*, pty::PtyWebsocketRequest}; use lifeline::dyn_bus::DynBus; use service::main::MainService; use tab_websocket::resource::connection::WebsocketResource; mod bus; mod message; mod prelude; mod service; pub fn pty_main() -> anyhow::Result<()> { info!("pty process started"); let mut runtime = tokio::runtime::Builder::new() .threaded_scheduler() .enable_io() .enable_time() .build() .unwrap(); let result = runtime.block_on(async { main_async().await }); runtime.shutdown_timeout(Duration::from_millis(25)); info!("pty process terminated"); result?; Ok(()) } fn init() { CombinedLogger::init(vec![TermLogger::new( LevelFilter::Info, simplelog::Config::default(), TerminalMode::Stderr, )]) .unwrap(); } async fn main_async() -> anyhow::Result<()> { let _matches = init(); let (_tx, rx, _lifeline) = spawn().await?; wait_for_shutdown(rx).await; Ok(()) } async fn spawn() -> anyhow::Result<( impl Sender<PtyWebsocketRequest>, impl Receiver<MainShutdown>, MainService, )> { let config = launch_daemon().await?; let bus = MainBus::default(); bus.capacity::<PtyWebsocketRequest>(64)?; let ws_url = format!("ws://127.0.0.1:{}/pty", config.port); let websocket = tab_websocket::connect_authorized(ws_url, config.auth_token.clone()).await?; bus.store_resource(WebsocketResource(websocket)); bus.store_resource(config); let main = MainService::spawn(&bus)?; let tx = bus.tx::<PtyWebsocketRequest>()?; let main_shutdown = bus.rx::<MainShutdown>()?; Ok((tx, main_shutdown, main)) }