webterm_agent/messaging/
process_r2a.rs

1use 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}