webterm_agent/models/
send_payload.rs

1use crate::models::activity::Activity;
2use crate::models::agent_error::AgentError;
3use crate::models::socket_writer::SocketPublisher;
4use std::sync::Arc;
5use tracing::debug;
6use webterm_core::pty_output_formatter::format_pty_output;
7use webterm_core::serialisers::talk_v1::a2f_builder::A2fRootBlob;
8use webterm_core::serialisers::talk_v1::a2r_builder::{A2rBuilder, A2rRootBlob};
9use webterm_core::serialisers::talk_v1::terminal_output_builder::ActivityInputBlob;
10use webterm_core::types::FrontendId;
11
12pub struct SendPayload {
13    to_relay: Option<A2rRootBlob>,
14    to_activity: Option<(Arc<Activity>, ActivityInputBlob)>,
15    is_relay_shutdown: bool,
16}
17
18impl SendPayload {
19    pub fn new() -> Self {
20        SendPayload {
21            to_relay: None,
22            to_activity: None,
23            is_relay_shutdown: false,
24        }
25    }
26
27    pub async fn dispatch(self, relay_pub: &SocketPublisher) -> Result<(), AgentError> {
28        if let Some(payload) = self.to_relay {
29            // debug!("dispatching to relay");
30            relay_pub.send(payload.0.into()).await?;
31        }
32
33        if let Some((activity, data)) = self.to_activity {
34            debug!("dispatching to pty {:?}", format_pty_output(&data.0));
35            activity.receive_input(data).await?;
36        }
37
38        Ok(())
39    }
40
41    pub fn prepare_for_frontend(&mut self, frontend_id: FrontendId, frontend_payload: A2fRootBlob) {
42        // debug!(
43        //     "prepare_for_frontend: {:?}",
44        //     format_pty_output(&frontend_payload.0)
45        // );
46        let a2r = A2rBuilder::new();
47        let payload = a2r
48            .root_payload_to_frontend(frontend_id, frontend_payload)
49            .to_flatbuffers();
50        self.prepare_for_relay(payload);
51    }
52
53    pub fn prepare_for_relay(&mut self, data: A2rRootBlob) {
54        self.to_relay = Some(data);
55    }
56
57    pub fn prepare_for_activity(&mut self, activity: Arc<Activity>, data: ActivityInputBlob) {
58        self.to_activity = Some((activity, data));
59    }
60
61    pub fn prepare_for_relay_shutdown(&mut self) {
62        self.is_relay_shutdown = true;
63    }
64
65    pub fn is_relay_shutdown(&self) -> bool {
66        self.is_relay_shutdown
67    }
68}