Optimize formatted event serializations.

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk
2025-11-29 02:01:30 +00:00
parent e84d6666c0
commit c9362b8605
3 changed files with 125 additions and 143 deletions

20
Cargo.lock generated
View File

@@ -3659,7 +3659,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma" name = "ruma"
version = "0.13.0" version = "0.13.0"
source = "git+https://github.com/matrix-construct/ruma?rev=4a3dd12e76c80eb60ba5f9324435c8a749cff303#4a3dd12e76c80eb60ba5f9324435c8a749cff303" source = "git+https://github.com/matrix-construct/ruma?rev=f8aa292ce48f28ee6c82b29a811d26c6ccb5aad2#f8aa292ce48f28ee6c82b29a811d26c6ccb5aad2"
dependencies = [ dependencies = [
"assign", "assign",
"js_int", "js_int",
@@ -3678,7 +3678,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-appservice-api" name = "ruma-appservice-api"
version = "0.13.0" version = "0.13.0"
source = "git+https://github.com/matrix-construct/ruma?rev=4a3dd12e76c80eb60ba5f9324435c8a749cff303#4a3dd12e76c80eb60ba5f9324435c8a749cff303" source = "git+https://github.com/matrix-construct/ruma?rev=f8aa292ce48f28ee6c82b29a811d26c6ccb5aad2#f8aa292ce48f28ee6c82b29a811d26c6ccb5aad2"
dependencies = [ dependencies = [
"js_int", "js_int",
"ruma-common", "ruma-common",
@@ -3690,7 +3690,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-client-api" name = "ruma-client-api"
version = "0.21.0" version = "0.21.0"
source = "git+https://github.com/matrix-construct/ruma?rev=4a3dd12e76c80eb60ba5f9324435c8a749cff303#4a3dd12e76c80eb60ba5f9324435c8a749cff303" source = "git+https://github.com/matrix-construct/ruma?rev=f8aa292ce48f28ee6c82b29a811d26c6ccb5aad2#f8aa292ce48f28ee6c82b29a811d26c6ccb5aad2"
dependencies = [ dependencies = [
"as_variant", "as_variant",
"assign", "assign",
@@ -3715,7 +3715,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-common" name = "ruma-common"
version = "0.16.0" version = "0.16.0"
source = "git+https://github.com/matrix-construct/ruma?rev=4a3dd12e76c80eb60ba5f9324435c8a749cff303#4a3dd12e76c80eb60ba5f9324435c8a749cff303" source = "git+https://github.com/matrix-construct/ruma?rev=f8aa292ce48f28ee6c82b29a811d26c6ccb5aad2#f8aa292ce48f28ee6c82b29a811d26c6ccb5aad2"
dependencies = [ dependencies = [
"as_variant", "as_variant",
"base64", "base64",
@@ -3749,7 +3749,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-events" name = "ruma-events"
version = "0.31.0" version = "0.31.0"
source = "git+https://github.com/matrix-construct/ruma?rev=4a3dd12e76c80eb60ba5f9324435c8a749cff303#4a3dd12e76c80eb60ba5f9324435c8a749cff303" source = "git+https://github.com/matrix-construct/ruma?rev=f8aa292ce48f28ee6c82b29a811d26c6ccb5aad2#f8aa292ce48f28ee6c82b29a811d26c6ccb5aad2"
dependencies = [ dependencies = [
"as_variant", "as_variant",
"indexmap", "indexmap",
@@ -3776,7 +3776,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-federation-api" name = "ruma-federation-api"
version = "0.12.0" version = "0.12.0"
source = "git+https://github.com/matrix-construct/ruma?rev=4a3dd12e76c80eb60ba5f9324435c8a749cff303#4a3dd12e76c80eb60ba5f9324435c8a749cff303" source = "git+https://github.com/matrix-construct/ruma?rev=f8aa292ce48f28ee6c82b29a811d26c6ccb5aad2#f8aa292ce48f28ee6c82b29a811d26c6ccb5aad2"
dependencies = [ dependencies = [
"bytes", "bytes",
"headers", "headers",
@@ -3799,7 +3799,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-identifiers-validation" name = "ruma-identifiers-validation"
version = "0.11.0" version = "0.11.0"
source = "git+https://github.com/matrix-construct/ruma?rev=4a3dd12e76c80eb60ba5f9324435c8a749cff303#4a3dd12e76c80eb60ba5f9324435c8a749cff303" source = "git+https://github.com/matrix-construct/ruma?rev=f8aa292ce48f28ee6c82b29a811d26c6ccb5aad2#f8aa292ce48f28ee6c82b29a811d26c6ccb5aad2"
dependencies = [ dependencies = [
"js_int", "js_int",
"thiserror 2.0.17", "thiserror 2.0.17",
@@ -3808,7 +3808,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-macros" name = "ruma-macros"
version = "0.16.0" version = "0.16.0"
source = "git+https://github.com/matrix-construct/ruma?rev=4a3dd12e76c80eb60ba5f9324435c8a749cff303#4a3dd12e76c80eb60ba5f9324435c8a749cff303" source = "git+https://github.com/matrix-construct/ruma?rev=f8aa292ce48f28ee6c82b29a811d26c6ccb5aad2#f8aa292ce48f28ee6c82b29a811d26c6ccb5aad2"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"proc-macro-crate", "proc-macro-crate",
@@ -3823,7 +3823,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-push-gateway-api" name = "ruma-push-gateway-api"
version = "0.12.0" version = "0.12.0"
source = "git+https://github.com/matrix-construct/ruma?rev=4a3dd12e76c80eb60ba5f9324435c8a749cff303#4a3dd12e76c80eb60ba5f9324435c8a749cff303" source = "git+https://github.com/matrix-construct/ruma?rev=f8aa292ce48f28ee6c82b29a811d26c6ccb5aad2#f8aa292ce48f28ee6c82b29a811d26c6ccb5aad2"
dependencies = [ dependencies = [
"js_int", "js_int",
"ruma-common", "ruma-common",
@@ -3835,7 +3835,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-signatures" name = "ruma-signatures"
version = "0.18.0" version = "0.18.0"
source = "git+https://github.com/matrix-construct/ruma?rev=4a3dd12e76c80eb60ba5f9324435c8a749cff303#4a3dd12e76c80eb60ba5f9324435c8a749cff303" source = "git+https://github.com/matrix-construct/ruma?rev=f8aa292ce48f28ee6c82b29a811d26c6ccb5aad2#f8aa292ce48f28ee6c82b29a811d26c6ccb5aad2"
dependencies = [ dependencies = [
"base64", "base64",
"ed25519-dalek", "ed25519-dalek",

View File

@@ -320,7 +320,7 @@ default-features = false
[workspace.dependencies.ruma] [workspace.dependencies.ruma]
git = "https://github.com/matrix-construct/ruma" git = "https://github.com/matrix-construct/ruma"
rev = "4a3dd12e76c80eb60ba5f9324435c8a749cff303" rev = "f8aa292ce48f28ee6c82b29a811d26c6ccb5aad2"
features = [ features = [
"__compat", "__compat",
"appservice-api-c", "appservice-api-c",

View File

@@ -1,4 +1,5 @@
use ruma::{ use ruma::{
CanonicalJsonMemberOptional as JsonMember, CanonicalJsonMembersOptional as JsonMembers,
events::{ events::{
AnyMessageLikeEvent, AnyStateEvent, AnyStrippedStateEvent, AnySyncMessageLikeEvent, AnyMessageLikeEvent, AnyStateEvent, AnyStrippedStateEvent, AnySyncMessageLikeEvent,
AnySyncStateEvent, AnySyncTimelineEvent, AnyTimelineEvent, StateEvent, AnySyncStateEvent, AnySyncTimelineEvent, AnyTimelineEvent, StateEvent,
@@ -6,7 +7,7 @@ use ruma::{
}, },
serde::Raw, serde::Raw,
}; };
use serde_json::json; use serde_json::value::to_raw_value;
use super::{Event, redact}; use super::{Event, redact};
@@ -22,25 +23,20 @@ impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnySyncTimelineEvent> {
fn from(event: Ref<'a, E>) -> Self { fn from(event: Ref<'a, E>) -> Self {
let event = event.0; let event = event.0;
let (redacts, content) = redact::copy(event); let (redacts, content) = redact::copy(event);
let mut json = json!({ let members: [JsonMember<_>; _] = [
"content": content, ("content", Some(content.into())),
"event_id": event.event_id(), ("event_id", Some(event.event_id().as_str().into())),
"origin_server_ts": event.origin_server_ts(), ("origin_server_ts", Some(event.origin_server_ts().get().into())),
"sender": event.sender(), ("redacts", redacts.map(|e| e.as_str().into())),
"type": event.event_type(), ("sender", Some(event.sender().as_str().into())),
}); ("state_key", event.state_key().map(Into::into)),
("type", Some(event.event_type().to_string().into())),
("unsigned", event.unsigned().map(Into::into)),
];
if let Some(redacts) = redacts { to_raw_value(&JsonMembers(&members))
json["redacts"] = json!(redacts); .map(Self::from_json)
} .expect("Failed to serialize Event value")
if let Some(state_key) = event.state_key() {
json["state_key"] = json!(state_key);
}
if let Some(unsigned) = event.unsigned() {
json["unsigned"] = json!(unsigned);
}
serde_json::from_value(json).expect("Failed to serialize Event value")
} }
} }
@@ -52,26 +48,21 @@ impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnyTimelineEvent> {
fn from(event: Ref<'a, E>) -> Self { fn from(event: Ref<'a, E>) -> Self {
let event = event.0; let event = event.0;
let (redacts, content) = redact::copy(event); let (redacts, content) = redact::copy(event);
let mut json = json!({ let members: [JsonMember<_>; _] = [
"content": content, ("content", Some(content.into())),
"event_id": event.event_id(), ("event_id", Some(event.event_id().as_str().into())),
"origin_server_ts": event.origin_server_ts(), ("origin_server_ts", Some(event.origin_server_ts().get().into())),
"room_id": event.room_id(), ("redacts", redacts.map(|e| e.as_str().into())),
"sender": event.sender(), ("room_id", Some(event.room_id().as_str().into())),
"type": event.kind(), ("sender", Some(event.sender().as_str().into())),
}); ("state_key", event.state_key().map(Into::into)),
("type", Some(event.event_type().to_string().into())),
("unsigned", event.unsigned().map(Into::into)),
];
if let Some(redacts) = redacts { to_raw_value(&JsonMembers(&members))
json["redacts"] = json!(redacts); .map(Self::from_json)
} .expect("Failed to serialize Event value")
if let Some(state_key) = event.state_key() {
json["state_key"] = json!(state_key);
}
if let Some(unsigned) = event.unsigned() {
json["unsigned"] = json!(unsigned);
}
serde_json::from_value(json).expect("Failed to serialize Event value")
} }
} }
@@ -83,26 +74,21 @@ impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnyMessageLikeEvent> {
fn from(event: Ref<'a, E>) -> Self { fn from(event: Ref<'a, E>) -> Self {
let event = event.0; let event = event.0;
let (redacts, content) = redact::copy(event); let (redacts, content) = redact::copy(event);
let mut json = json!({ let members: [JsonMember<_>; _] = [
"content": content, ("content", Some(content.into())),
"event_id": event.event_id(), ("event_id", Some(event.event_id().as_str().into())),
"origin_server_ts": event.origin_server_ts(), ("origin_server_ts", Some(event.origin_server_ts().get().into())),
"room_id": event.room_id(), ("redacts", redacts.map(|e| e.as_str().into())),
"sender": event.sender(), ("room_id", Some(event.room_id().as_str().into())),
"type": event.kind(), ("sender", Some(event.sender().as_str().into())),
}); ("state_key", event.state_key().map(Into::into)),
("type", Some(event.event_type().to_string().into())),
("unsigned", event.unsigned().map(Into::into)),
];
if let Some(redacts) = &redacts { to_raw_value(&JsonMembers(&members))
json["redacts"] = json!(redacts); .map(Self::from_json)
} .expect("Failed to serialize Event value")
if let Some(state_key) = event.state_key() {
json["state_key"] = json!(state_key);
}
if let Some(unsigned) = event.unsigned() {
json["unsigned"] = json!(unsigned);
}
serde_json::from_value(json).expect("Failed to serialize Event value")
} }
} }
@@ -114,25 +100,20 @@ impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnySyncMessageLikeEvent> {
fn from(event: Ref<'a, E>) -> Self { fn from(event: Ref<'a, E>) -> Self {
let event = event.0; let event = event.0;
let (redacts, content) = redact::copy(event); let (redacts, content) = redact::copy(event);
let mut json = json!({ let members: [JsonMember<_>; _] = [
"content": content, ("content", Some(content.into())),
"event_id": event.event_id(), ("event_id", Some(event.event_id().as_str().into())),
"origin_server_ts": event.origin_server_ts(), ("origin_server_ts", Some(event.origin_server_ts().get().into())),
"sender": event.sender(), ("redacts", redacts.map(|e| e.as_str().into())),
"type": event.kind(), ("sender", Some(event.sender().as_str().into())),
}); ("state_key", event.state_key().map(Into::into)),
("type", Some(event.event_type().to_string().into())),
("unsigned", event.unsigned().map(Into::into)),
];
if let Some(redacts) = &redacts { to_raw_value(&JsonMembers(&members))
json["redacts"] = json!(redacts); .map(Self::from_json)
} .expect("Failed to serialize Event value")
if let Some(state_key) = event.state_key() {
json["state_key"] = json!(state_key);
}
if let Some(unsigned) = event.unsigned() {
json["unsigned"] = json!(unsigned);
}
serde_json::from_value(json).expect("Failed to serialize Event value")
} }
} }
@@ -143,21 +124,20 @@ impl<E: Event> From<Owned<E>> for Raw<AnyStateEvent> {
impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnyStateEvent> { impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnyStateEvent> {
fn from(event: Ref<'a, E>) -> Self { fn from(event: Ref<'a, E>) -> Self {
let event = event.0; let event = event.0;
let mut json = json!({ let members: [JsonMember<_>; _] = [
"content": event.content(), ("content", Some(event.content().into())),
"event_id": event.event_id(), ("event_id", Some(event.event_id().as_str().into())),
"origin_server_ts": event.origin_server_ts(), ("origin_server_ts", Some(event.origin_server_ts().get().into())),
"room_id": event.room_id(), ("room_id", Some(event.room_id().as_str().into())),
"sender": event.sender(), ("sender", Some(event.sender().as_str().into())),
"state_key": event.state_key(), ("state_key", event.state_key().map(Into::into)),
"type": event.kind(), ("type", Some(event.event_type().to_string().into())),
}); ("unsigned", event.unsigned().map(Into::into)),
];
if let Some(unsigned) = event.unsigned() { to_raw_value(&JsonMembers(&members))
json["unsigned"] = json!(unsigned); .map(Self::from_json)
} .expect("Failed to serialize Event value")
serde_json::from_value(json).expect("Failed to serialize Event value")
} }
} }
@@ -168,20 +148,19 @@ impl<E: Event> From<Owned<E>> for Raw<AnySyncStateEvent> {
impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnySyncStateEvent> { impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnySyncStateEvent> {
fn from(event: Ref<'a, E>) -> Self { fn from(event: Ref<'a, E>) -> Self {
let event = event.0; let event = event.0;
let mut json = json!({ let members: [JsonMember<_>; _] = [
"content": event.content(), ("content", Some(event.content().into())),
"event_id": event.event_id(), ("event_id", Some(event.event_id().as_str().into())),
"origin_server_ts": event.origin_server_ts(), ("origin_server_ts", Some(event.origin_server_ts().get().into())),
"sender": event.sender(), ("sender", Some(event.sender().as_str().into())),
"state_key": event.state_key(), ("state_key", event.state_key().map(Into::into)),
"type": event.kind(), ("type", Some(event.event_type().to_string().into())),
}); ("unsigned", event.unsigned().map(Into::into)),
];
if let Some(unsigned) = event.unsigned() { to_raw_value(&JsonMembers(&members))
json["unsigned"] = json!(unsigned); .map(Self::from_json)
} .expect("Failed to serialize Event value")
serde_json::from_value(json).expect("Failed to serialize Event value")
} }
} }
@@ -192,14 +171,16 @@ impl<E: Event> From<Owned<E>> for Raw<AnyStrippedStateEvent> {
impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnyStrippedStateEvent> { impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnyStrippedStateEvent> {
fn from(event: Ref<'a, E>) -> Self { fn from(event: Ref<'a, E>) -> Self {
let event = event.0; let event = event.0;
let json = json!({ let members: [JsonMember<_>; _] = [
"content": event.content(), ("content", Some(event.content().into())),
"sender": event.sender(), ("sender", Some(event.sender().as_str().into())),
"state_key": event.state_key(), ("state_key", event.state_key().map(Into::into)),
"type": event.kind(), ("type", Some(event.event_type().to_string().into())),
}); ];
serde_json::from_value(json).expect("Failed to serialize Event value") to_raw_value(&JsonMembers(&members))
.map(Self::from_json)
.expect("Failed to serialize Event value")
} }
} }
@@ -210,15 +191,17 @@ impl<E: Event> From<Owned<E>> for Raw<HierarchySpaceChildEvent> {
impl<'a, E: Event> From<Ref<'a, E>> for Raw<HierarchySpaceChildEvent> { impl<'a, E: Event> From<Ref<'a, E>> for Raw<HierarchySpaceChildEvent> {
fn from(event: Ref<'a, E>) -> Self { fn from(event: Ref<'a, E>) -> Self {
let event = event.0; let event = event.0;
let json = json!({ let members: [JsonMember<_>; _] = [
"content": event.content(), ("content", Some(event.content().into())),
"origin_server_ts": event.origin_server_ts(), ("origin_server_ts", Some(event.origin_server_ts().get().into())),
"sender": event.sender(), ("sender", Some(event.sender().as_str().into())),
"state_key": event.state_key(), ("state_key", event.state_key().map(Into::into)),
"type": event.kind(), ("type", Some(event.event_type().to_string().into())),
}); ];
serde_json::from_value(json).expect("Failed to serialize Event value") to_raw_value(&JsonMembers(&members))
.map(Self::from_json)
.expect("Failed to serialize Event value")
} }
} }
@@ -229,21 +212,20 @@ impl<E: Event> From<Owned<E>> for Raw<StateEvent<RoomMemberEventContent>> {
impl<'a, E: Event> From<Ref<'a, E>> for Raw<StateEvent<RoomMemberEventContent>> { impl<'a, E: Event> From<Ref<'a, E>> for Raw<StateEvent<RoomMemberEventContent>> {
fn from(event: Ref<'a, E>) -> Self { fn from(event: Ref<'a, E>) -> Self {
let event = event.0; let event = event.0;
let mut json = json!({ let members: [JsonMember<_>; _] = [
"content": event.content(), ("content", Some(event.content().into())),
"event_id": event.event_id(), ("event_id", Some(event.event_id().as_str().into())),
"origin_server_ts": event.origin_server_ts(), ("origin_server_ts", Some(event.origin_server_ts().get().into())),
"redacts": event.redacts(), ("redacts", event.redacts().map(|e| e.as_str().into())),
"room_id": event.room_id(), ("room_id", Some(event.room_id().as_str().into())),
"sender": event.sender(), ("sender", Some(event.sender().as_str().into())),
"state_key": event.state_key(), ("state_key", event.state_key().map(Into::into)),
"type": event.kind(), ("type", Some(event.event_type().to_string().into())),
}); ("unsigned", event.unsigned().map(Into::into)),
];
if let Some(unsigned) = event.unsigned() { to_raw_value(&JsonMembers(&members))
json["unsigned"] = json!(unsigned); .map(Self::from_json)
} .expect("Failed to serialize Event value")
serde_json::from_value(json).expect("Failed to serialize Event value")
} }
} }