webterm_agent/models/
send_payload.rs1use 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 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 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}