🔊 Trace events from Matrix client callbacks to domain methods

This commit is contained in:
2024-05-21 12:22:04 +02:00
parent b5da0ee992
commit cd6506fb03
11 changed files with 405 additions and 163 deletions

View File

@@ -28,13 +28,12 @@ use matrix_sdk::{
},
Client as MatrixClient, RoomMemberships, RoomState,
};
use tokio::sync::{
broadcast,
broadcast::{error::SendError, Receiver, Sender},
mpsc::{unbounded_channel, UnboundedReceiver},
};
use tracing::{debug, error, warn};
use tracing::{debug, debug_span, error, instrument, warn, Instrument, Span};
use super::{
account_event::AccountEvent,
@@ -75,7 +74,7 @@ impl Senders {
if let Some(room_sender) = room_senders.get(room_id) {
if let Err(err) = room_sender.send(event) {
error!("Unable to send event to the {room_id} room: {err}");
warn!("Unable to send event to the {room_id} room: {err}");
return Err(err);
}
} else {
@@ -117,12 +116,15 @@ impl Client {
}
}
#[instrument(skip_all)]
async fn create_space(
senders: &Ctx<Senders>,
room_id: &OwnedRoomId,
room: Option<&Room>,
) -> anyhow::Result<(), SendError<AccountEvent>> {
if let Some(receiver) = senders.add_room(&room_id) {
if let Some(receiver) = senders.add_room(room_id) {
let current_span = Span::current();
let mut name = None;
let mut topic = None;
if let Some(room) = room {
@@ -139,19 +141,21 @@ impl Client {
topic.clone(),
receiver,
reply,
current_span.clone(),
);
if let Err(err) = senders.account_events_sender.send(event) {
return Err(err);
}
senders.account_events_sender.send(event)?;
// We're expecting a response indicating that the client is able to compute the next RoomEvent
response.recv().await;
let events = vec![RoomEvent::NewTopic(topic), RoomEvent::NewName(name)];
let events = vec![
RoomEvent::NewTopic(topic, current_span.clone()),
RoomEvent::NewName(name, current_span),
];
for event in events {
if let Err(_err) = senders.send(&room_id, event.clone()) {
if let Err(_err) = senders.send(room_id, event.clone()) {
// TODO: Return an error
}
}
@@ -160,6 +164,7 @@ impl Client {
Ok(())
}
#[instrument(skip_all)]
async fn create_room(
senders: &Ctx<Senders>,
room: &Room,
@@ -172,7 +177,7 @@ impl Client {
let is_direct = match room.is_direct().await {
Ok(is_direct) => Some(is_direct),
Err(err) => {
error!("Unable to know if the {room_id} room is direct: {err}");
warn!("Unable to know if the {room_id} room is direct: {err}");
None
}
};
@@ -205,11 +210,10 @@ impl Client {
room.state(),
receiver,
reply,
Span::current(),
);
if let Err(err) = senders.account_events_sender.send(event) {
return Err(err);
}
senders.account_events_sender.send(event)?;
// We're expecting a response indicating that the client is able to compute the next RoomEvent
response.recv().await;
@@ -217,6 +221,7 @@ impl Client {
Ok(())
}
#[instrument(skip_all)]
async fn add_room(
senders: &Ctx<Senders>,
room: &Room,
@@ -255,7 +260,7 @@ impl Client {
let _ = Self::create_space(senders, &parent, None).await;
}
let event = RoomEvent::NewChild(room_id.clone());
let event = RoomEvent::NewChild(room_id.clone(), Span::current());
if let Err(_err) = senders.send(&parent, event) {
// TODO: Return an error
}
@@ -270,7 +275,9 @@ impl Client {
room: Room,
senders: Ctx<Senders>,
) {
let _ = Self::add_room(&senders, &room).await;
let span = debug_span!("Matrix::NewRoom", r = ?room.room_id());
let _ = Self::add_room(&senders, &room).instrument(span).await;
}
// SyncStateEvent: A possibly-redacted state event without a room_id.
@@ -279,9 +286,12 @@ impl Client {
room: Room,
senders: Ctx<Senders>,
) {
let _ = Self::add_room(&senders, &room).await;
let span = debug_span!("Matrix::NewRoom", r = ?room.room_id());
let _ = Self::add_room(&senders, &room).instrument(span).await;
}
#[instrument(skip_all)]
fn on_invite_room_member_event(
user_id: OwnedUserId,
inviter_id: OwnedUserId,
@@ -290,15 +300,16 @@ impl Client {
senders: &Ctx<Senders>,
) {
if let Some(client_user_id) = matrix_client.user_id() {
let is_account_user = user_id == client_user_id;
let room_id = room.room_id();
let is_account_user = user_id == client_user_id;
debug!(
"{} (account user: {is_account_user}) invited by {} to join the {} room",
&user_id, &inviter_id, &room_id
);
let event = RoomEvent::Invitation(user_id, inviter_id, is_account_user);
let event =
RoomEvent::Invitation(user_id, inviter_id, is_account_user, Span::current());
if let Err(_err) = senders.send(room_id, event) {
// TODO: Return an error
@@ -306,6 +317,7 @@ impl Client {
}
}
#[instrument(skip_all)]
fn on_join_room_member_event(
user_id: OwnedUserId,
displayname: Option<String>,
@@ -318,9 +330,15 @@ impl Client {
let is_account_user = user_id == client_user_id;
let room_id = room.room_id();
error!("{} has joined the {} room", &user_id, &room_id);
debug!("{} has joined the {} room", &user_id, &room_id);
let event = RoomEvent::Join(user_id, displayname, avatar_url, is_account_user);
let event = RoomEvent::Join(
user_id,
displayname,
avatar_url,
is_account_user,
Span::current(),
);
if let Err(_err) = senders.send(room_id, event) {
// TODO: Return an error
@@ -340,21 +358,35 @@ impl Client {
let user_id = &ev.state_key;
match ev.content.membership {
MembershipState::Invite => Self::on_invite_room_member_event(
user_id.clone(),
ev.sender,
&room,
&matrix_client,
&senders,
),
MembershipState::Join => Self::on_join_room_member_event(
ev.sender,
ev.content.displayname,
ev.content.avatar_url,
&room,
&matrix_client,
&senders,
),
MembershipState::Invite => {
let span = debug_span!("Matrix::RoomInvitation", r = ?room.room_id());
span.in_scope(|| {
Self::on_invite_room_member_event(
user_id.clone(),
ev.sender,
&room,
&matrix_client,
&senders,
)
});
}
MembershipState::Join => {
let span =
debug_span!("Matrix::RoomJoin", r = ?room.room_id(), u = ?user_id)
.entered();
span.in_scope(|| {
Self::on_join_room_member_event(
ev.sender,
ev.content.displayname,
ev.content.avatar_url,
&room,
&matrix_client,
&senders,
)
});
}
_ => {
error!("TODO: {:?}", ev);
}
@@ -377,33 +409,42 @@ impl Client {
if let SyncStateEvent::Original(ev) = ev {
match ev.content.membership {
MembershipState::Invite => {
let invitee_id = ev.state_key;
let span = debug_span!("Matrix::RoomInvitation", r = ?room.room_id());
Self::on_invite_room_member_event(
invitee_id,
ev.sender,
&room,
&matrix_client,
&senders,
)
// .await
span.in_scope(|| {
let invitee_id = ev.state_key;
Self::on_invite_room_member_event(
invitee_id,
ev.sender,
&room,
&matrix_client,
&senders,
)
});
}
MembershipState::Join => {
Self::on_join_room_member_event(
ev.sender,
ev.content.displayname,
ev.content.avatar_url,
&room,
&matrix_client,
&senders,
)
// .await
let user_id = ev.sender;
let span = debug_span!("Matrix::RoomJoin", r = ?room.room_id(), u = ?user_id)
.entered();
span.in_scope(|| {
Self::on_join_room_member_event(
user_id,
ev.content.displayname,
ev.content.avatar_url,
&room,
&matrix_client,
&senders,
)
});
}
_ => error!("TODO"),
}
}
}
#[instrument(skip_all)]
async fn on_room_avatar_event(room: &Room, senders: &Ctx<Senders>) {
let room_id = room.room_id();
let avatar = match room
@@ -416,12 +457,12 @@ impl Client {
{
Ok(avatar) => avatar,
Err(err) => {
error!("Unable to fetch avatar for {}: {err}", &room_id);
warn!("Unable to fetch avatar for {}: {err}", &room_id);
None
}
};
let event = RoomEvent::NewAvatar(avatar);
let event = RoomEvent::NewAvatar(avatar, Span::current());
if let Err(_err) = senders.send(room_id, event) {
// TODO: Return an error
@@ -433,7 +474,11 @@ impl Client {
room: Room,
senders: Ctx<Senders>,
) {
Self::on_room_avatar_event(&room, &senders).await;
let span = debug_span!("Matrix::RoomAvatar", r = ?room.room_id());
Self::on_room_avatar_event(&room, &senders)
.instrument(span)
.await;
}
async fn on_sync_room_avatar_event(
@@ -443,13 +488,18 @@ impl Client {
) {
if let SyncStateEvent::Original(_ev) = ev {
dioxus::prelude::spawn(async move {
Self::on_room_avatar_event(&room, &senders).await;
let span = debug_span!("Matrix::RoomAvatar", r = ?room.room_id());
Self::on_room_avatar_event(&room, &senders)
.instrument(span)
.await;
});
}
}
#[instrument(skip_all)]
fn on_room_name_event(name: Option<String>, room: &Room, senders: &Ctx<Senders>) {
let event = RoomEvent::NewName(name);
let event = RoomEvent::NewName(name, Span::current());
if let Err(_err) = senders.send(room.room_id(), event) {
// TODO: Return an error
@@ -461,7 +511,11 @@ impl Client {
room: Room,
senders: Ctx<Senders>,
) {
Self::on_room_name_event(ev.content.name, &room, &senders);
let span = debug_span!("Matrix::RoomName", r = ?room.room_id());
span.in_scope(|| {
Self::on_room_name_event(ev.content.name, &room, &senders);
});
}
async fn on_sync_room_name_event(
@@ -470,12 +524,17 @@ impl Client {
senders: Ctx<Senders>,
) {
if let SyncStateEvent::Original(ev) = ev {
Self::on_room_name_event(Some(ev.content.name), &room, &senders);
let span = debug_span!("Matrix::RoomName", r = ?room.room_id());
span.in_scope(|| {
Self::on_room_name_event(Some(ev.content.name), &room, &senders);
});
}
}
#[instrument(skip_all)]
fn on_room_topic_event(topic: Option<String>, room: &Room, senders: &Ctx<Senders>) {
let event = RoomEvent::NewTopic(topic);
let event = RoomEvent::NewTopic(topic, Span::current());
if let Err(_err) = senders.send(room.room_id(), event) {
// TODO: Return an error
@@ -487,7 +546,11 @@ impl Client {
room: Room,
senders: Ctx<Senders>,
) {
Self::on_room_topic_event(ev.content.topic, &room, &senders);
let span = debug_span!("Matrix::RoomTopic", r = ?room.room_id());
span.in_scope(|| {
Self::on_room_topic_event(ev.content.topic, &room, &senders);
});
}
async fn on_sync_room_topic_event(
@@ -496,7 +559,11 @@ impl Client {
senders: Ctx<Senders>,
) {
if let SyncStateEvent::Original(ev) = ev {
Self::on_room_topic_event(Some(ev.content.topic), &room, &senders);
let span = debug_span!("Matrix::RoomTopic", r = ?room.room_id());
span.in_scope(|| {
Self::on_room_topic_event(Some(ev.content.topic), &room, &senders);
});
}
}
@@ -629,7 +696,7 @@ impl Client {
Err(err) => Err(err.into()),
}
} else {
error!("No room found with the \"{}\" id", room_id.as_str());
warn!("No room found with the \"{}\" id", room_id.as_str());
// TODO: Return an error if the room has not been found
Ok(None)
}
@@ -644,7 +711,7 @@ impl Client {
Err(err) => Err(err.into()),
}
} else {
error!("No room found with the \"{}\" id", room_id.as_str());
warn!("No room found with the \"{}\" id", room_id.as_str());
// TODO: Return an error if the room has not been found
Ok(vec![])
}
@@ -681,8 +748,8 @@ impl Client {
// TODO: Check if we can get member before fetching the data and received an error...
match room.get_member(user_id).await {
Ok(room_member) => match room_member {
Some(room_member) => {
Ok(room_member) => {
if let Some(room_member) = room_member {
let res = match room_member
.avatar(MediaFormat::Thumbnail(MediaThumbnailSize {
method: Method::Scale,
@@ -696,16 +763,14 @@ impl Client {
};
return res;
}
// TODO: Error msg
None => (),
},
}
Err(err) => {
error!("Unable to get room member {user_id}: {err}");
warn!("Unable to get room member {user_id}: {err}");
if let Some(avatar_url) = avatar_url {
let thumbnail = self.get_thumbnail(avatar_url.clone()).await;
return Ok(Some(thumbnail?));
} else {
error!("No avatar url set for the {room_id} room");
debug!("No avatar url set for the {room_id} room");
}
}
}