webterm_agent/messaging/
process_r2a.rs1use crate::config::Config;
2use crate::messaging::process_f2a::process_f2a;
3use crate::models::agent_error::AgentError;
4use crate::models::send_payload::SendPayload;
5use webterm_core::flatbuffers_helpers::read_message;
6use webterm_core::generated::flatbuffers_schema::talk_v1::{
7 R2aFromFrontend, R2aRoot, R2aRootPayload,
8};
9use webterm_core::types::FrontendId;
10
11pub async fn process_r2a(
12 message: &[u8],
13 send: SendPayload,
14 config: &Config,
15) -> Result<SendPayload, AgentError> {
16 let message = read_message::<R2aRoot>(message)?;
17 let type_ = message.root_payload_type();
18
19 match type_ {
20 R2aRootPayload::FromFrontend => {
21 let payload = message.root_payload_as_from_frontend();
22
23 if let Some(payload) = payload {
24 process_from_frontend(payload, send, config).await
25 } else {
26 Err(AgentError::FBParseError(
27 "R2aRootPayload::FromFrontend".to_string(),
28 ))
29 }
30 }
31
32 R2aRootPayload::RelayShuttingDown => process_relay_shutting_down(send).await,
33
34 _ => Err(AgentError::FBParseError(format!(
35 "Received unknown R2aRootPayload: {:?}",
36 type_
37 ))),
38 }
39}
40
41async fn process_from_frontend(
42 message: R2aFromFrontend<'_>,
43 send: SendPayload,
44 config: &Config,
45) -> Result<SendPayload, AgentError> {
46 process_f2a(
47 FrontendId(message.frontend_id()),
48 message.payload().unwrap_or_default().bytes(),
49 send,
50 config,
51 )
52 .await
53}
54
55async fn process_relay_shutting_down(mut send: SendPayload) -> Result<SendPayload, AgentError> {
56 send.prepare_for_relay_shutdown();
57 Ok(send)
58}