diff --git a/crates/matrix-sdk/src/widget/machine/from_widget.rs b/crates/matrix-sdk/src/widget/machine/from_widget.rs index 14a9af62c..81fa98609 100644 --- a/crates/matrix-sdk/src/widget/machine/from_widget.rs +++ b/crates/matrix-sdk/src/widget/machine/from_widget.rs @@ -15,6 +15,5 @@ use serde::Deserialize; #[derive(Deserialize)] -pub(super) enum FromWidgetRequest { - // TODO -} +#[serde(rename_all = "camelCase")] +pub(super) enum FromWidgetRequest {} diff --git a/crates/matrix-sdk/src/widget/machine/incoming.rs b/crates/matrix-sdk/src/widget/machine/incoming.rs index ba3bbcdd9..fca7a5447 100644 --- a/crates/matrix-sdk/src/widget/machine/incoming.rs +++ b/crates/matrix-sdk/src/widget/machine/incoming.rs @@ -58,7 +58,13 @@ pub(crate) enum MatrixDriverResponse { MatrixEventSent(OwnedEventId), } -pub(super) enum IncomingWidgetMessage { +pub(super) struct IncomingWidgetMessage { + pub(super) widget_id: String, + pub(super) request_id: String, + pub(super) kind: IncomingWidgetMessageKind, +} + +pub(super) enum IncomingWidgetMessageKind { Request(FromWidgetRequest), Response(ToWidgetResponse), } @@ -78,16 +84,25 @@ impl<'de> Deserialize<'de> for IncomingWidgetMessage { } #[derive(Deserialize)] - struct ExtractApiTag { + #[serde(rename_all = "camelCase")] + struct ExtractHeader { api: ApiTag, + widget_id: String, + request_id: String, } - let ExtractApiTag { api } = serde_json::from_str(raw.get()).map_err(de::Error::custom)?; + let ExtractHeader { api, widget_id, request_id } = + serde_json::from_str(raw.get()).map_err(de::Error::custom)?; - let res = match api { - ApiTag::FromWidget => serde_json::from_str(raw.get()).map(Self::Request), - ApiTag::ToWidget => serde_json::from_str(raw.get()).map(Self::Response), + let kind = match api { + ApiTag::FromWidget => serde_json::from_str(raw.get()) + .map(IncomingWidgetMessageKind::Request) + .map_err(de::Error::custom)?, + ApiTag::ToWidget => serde_json::from_str(raw.get()) + .map(IncomingWidgetMessageKind::Response) + .map_err(de::Error::custom)?, }; - res.map_err(de::Error::custom) + + Ok(Self { widget_id, request_id, kind }) } } diff --git a/crates/matrix-sdk/src/widget/machine/mod.rs b/crates/matrix-sdk/src/widget/machine/mod.rs index 158dcc896..87c9bbb35 100644 --- a/crates/matrix-sdk/src/widget/machine/mod.rs +++ b/crates/matrix-sdk/src/widget/machine/mod.rs @@ -25,7 +25,7 @@ use uuid::Uuid; use self::{ driver_req::{AcquirePermissions, MatrixDriverRequest, MatrixDriverRequestHandle}, - incoming::IncomingWidgetMessage, + incoming::{IncomingWidgetMessage, IncomingWidgetMessageKind}, to_widget::{ NotifyPermissionsChanged, RequestPermissions, ToWidgetRequest, ToWidgetRequestHandle, ToWidgetResponse, @@ -106,26 +106,28 @@ impl WidgetMachine { return; } }; - let widget_id_from_msg = match &message { - IncomingWidgetMessage::Request(req) => match *req {}, - IncomingWidgetMessage::Response(res) => &res.widget_id, - }; - if *widget_id_from_msg != self.widget_id { + + if message.widget_id != self.widget_id { error!("Received a message from a wrong widget, ignoring"); return; } - match message { - IncomingWidgetMessage::Request(req) => match req {}, - IncomingWidgetMessage::Response(response) => { - self.process_to_widget_response(response); + match message.kind { + IncomingWidgetMessageKind::Request(req) => match req {}, + IncomingWidgetMessageKind::Response(response) => { + self.process_to_widget_response(message.request_id, response); } } } - #[instrument(skip_all, fields(request_id = ?response.request_id))] - fn process_to_widget_response(&mut self, response: ToWidgetResponse) { - let Some(request) = self.pending_to_widget_requests.remove(&response.request_id) else { + #[instrument(skip_all, fields(request_id = ?request_id))] + fn process_to_widget_response(&mut self, request_id: String, response: ToWidgetResponse) { + let Ok(request_id) = Uuid::parse_str(&request_id) else { + error!("Response's request_id is not a valid UUID"); + return; + }; + + let Some(request) = self.pending_to_widget_requests.remove(&request_id) else { warn!("Received response for an unknown request"); return; }; diff --git a/crates/matrix-sdk/src/widget/machine/to_widget.rs b/crates/matrix-sdk/src/widget/machine/to_widget.rs index 3fba7f5bc..3c893e5c4 100644 --- a/crates/matrix-sdk/src/widget/machine/to_widget.rs +++ b/crates/matrix-sdk/src/widget/machine/to_widget.rs @@ -17,7 +17,6 @@ use std::marker::PhantomData; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use serde_json::value::RawValue as RawJsonValue; use tracing::error; -use uuid::Uuid; use super::{ToWidgetRequestMeta, WidgetMachine}; use crate::widget::Permissions; @@ -58,12 +57,6 @@ where #[derive(Deserialize)] #[serde(rename_all = "camelCase")] pub(super) struct ToWidgetResponse { - /// The ID of the widget that sent this. - pub(super) widget_id: String, - - /// The request ID that this response corresponds to. - pub(super) request_id: Uuid, - /// The action from the original request. pub(super) action: String,