federation-api: Add support for partial state in send_join
According to MSC3706
This commit is contained in:
		
							parent
							
								
									12e4aa47b6
								
							
						
					
					
						commit
						9b239663fb
					
				| @ -4,9 +4,14 @@ Bug fixes: | ||||
| 
 | ||||
| * Add the `event` field to `RoomState` according to MSC3083 / Matrix v1.2 | ||||
| 
 | ||||
| Breaking changes: | ||||
| 
 | ||||
| * Split `membership::create_join_event::RoomState` into separate types in the `v1` and `v2` modules | ||||
| 
 | ||||
| Improvements: | ||||
| 
 | ||||
| * Add unstable support to get an event by timestamp (MSC3030) | ||||
| * Add unstable support to request partial state in `send_join` (MSC3706) | ||||
| 
 | ||||
| # 0.6.0 | ||||
| 
 | ||||
|  | ||||
| @ -23,6 +23,7 @@ unstable-exhaustive-types = [] | ||||
| unstable-msc2448 = [] | ||||
| unstable-msc3030 = [] | ||||
| unstable-msc3618 = [] | ||||
| unstable-msc3706 = [] | ||||
| unstable-msc3723 = [] | ||||
| unstable-unspecified = [] | ||||
| 
 | ||||
|  | ||||
| @ -4,56 +4,3 @@ | ||||
| 
 | ||||
| pub mod v1; | ||||
| pub mod v2; | ||||
| 
 | ||||
| use serde::{Deserialize, Serialize}; | ||||
| use serde_json::value::RawValue as RawJsonValue; | ||||
| 
 | ||||
| /// Full state of the room.
 | ||||
| #[derive(Clone, Debug, Deserialize, Serialize)] | ||||
| #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] | ||||
| pub struct RoomState { | ||||
|     #[cfg(not(feature = "unstable-unspecified"))] | ||||
|     /// The resident server's DNS name.
 | ||||
|     pub origin: String, | ||||
| 
 | ||||
|     /// The full set of authorization events that make up the state of the room,
 | ||||
|     /// and their authorization events, recursively.
 | ||||
|     pub auth_chain: Vec<Box<RawJsonValue>>, | ||||
| 
 | ||||
|     /// The room state.
 | ||||
|     pub state: Vec<Box<RawJsonValue>>, | ||||
| 
 | ||||
|     /// The signed copy of the membership event sent to other servers by the
 | ||||
|     /// resident server, including the resident server's signature.
 | ||||
|     ///
 | ||||
|     /// Required if the room version supports restricted join rules.
 | ||||
|     #[serde(skip_serializing_if = "Option::is_none")] | ||||
|     pub event: Option<Box<RawJsonValue>>, | ||||
| } | ||||
| 
 | ||||
| #[cfg(feature = "unstable-unspecified")] | ||||
| impl Default for RoomState { | ||||
|     fn default() -> Self { | ||||
|         Self::new() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl RoomState { | ||||
|     #[cfg(not(feature = "unstable-unspecified"))] | ||||
|     /// Creates an empty `RoomState` with the given `origin`.
 | ||||
|     ///
 | ||||
|     /// With the `unstable-unspecified` feature, this method doesn't take any parameters.
 | ||||
|     /// See [matrix-spec#374](https://github.com/matrix-org/matrix-spec/issues/374).
 | ||||
|     pub fn new(origin: String) -> Self { | ||||
|         Self { origin, auth_chain: Vec::new(), state: Vec::new(), event: None } | ||||
|     } | ||||
| 
 | ||||
|     #[cfg(feature = "unstable-unspecified")] | ||||
|     /// Creates an empty `RoomState` with the given `origin`.
 | ||||
|     ///
 | ||||
|     /// Without the `unstable-unspecified` feature, this method takes a parameter for the origin
 | ||||
|     /// See [matrix-spec#374](https://github.com/matrix-org/matrix-spec/issues/374).
 | ||||
|     pub fn new() -> Self { | ||||
|         Self { auth_chain: Vec::new(), state: Vec::new(), event: None } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -6,10 +6,9 @@ use ruma_common::{ | ||||
|     api::{request, response, Metadata}, | ||||
|     metadata, OwnedEventId, OwnedRoomId, | ||||
| }; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| use serde_json::value::RawValue as RawJsonValue; | ||||
| 
 | ||||
| use super::RoomState; | ||||
| 
 | ||||
| const METADATA: Metadata = metadata! { | ||||
|     method: PUT, | ||||
|     rate_limited: false, | ||||
| @ -60,12 +59,62 @@ impl Response { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /// Full state of the room.
 | ||||
| #[derive(Clone, Debug, Deserialize, Serialize)] | ||||
| #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] | ||||
| pub struct RoomState { | ||||
|     #[cfg(not(feature = "unstable-unspecified"))] | ||||
|     /// The resident server's DNS name.
 | ||||
|     pub origin: String, | ||||
| 
 | ||||
|     /// The full set of authorization events that make up the state of the room,
 | ||||
|     /// and their authorization events, recursively.
 | ||||
|     pub auth_chain: Vec<Box<RawJsonValue>>, | ||||
| 
 | ||||
|     /// The room state.
 | ||||
|     pub state: Vec<Box<RawJsonValue>>, | ||||
| 
 | ||||
|     /// The signed copy of the membership event sent to other servers by the
 | ||||
|     /// resident server, including the resident server's signature.
 | ||||
|     ///
 | ||||
|     /// Required if the room version supports restricted join rules.
 | ||||
|     #[serde(skip_serializing_if = "Option::is_none")] | ||||
|     pub event: Option<Box<RawJsonValue>>, | ||||
| } | ||||
| 
 | ||||
| #[cfg(feature = "unstable-unspecified")] | ||||
| impl Default for RoomState { | ||||
|     fn default() -> Self { | ||||
|         Self::new() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl RoomState { | ||||
|     #[cfg(not(feature = "unstable-unspecified"))] | ||||
|     /// Creates an empty `RoomState` with the given `origin`.
 | ||||
|     ///
 | ||||
|     /// With the `unstable-unspecified` feature, this method doesn't take any parameters.
 | ||||
|     /// See [matrix-spec#374](https://github.com/matrix-org/matrix-spec/issues/374).
 | ||||
|     pub fn new(origin: String) -> Self { | ||||
|         Self { origin, auth_chain: Vec::new(), state: Vec::new(), event: None } | ||||
|     } | ||||
| 
 | ||||
|     #[cfg(feature = "unstable-unspecified")] | ||||
|     /// Creates an empty `RoomState` with the given `origin`.
 | ||||
|     ///
 | ||||
|     /// Without the `unstable-unspecified` feature, this method takes a parameter for the origin.
 | ||||
|     /// See [matrix-spec#374](https://github.com/matrix-org/matrix-spec/issues/374).
 | ||||
|     pub fn new() -> Self { | ||||
|         Self { auth_chain: Vec::new(), state: Vec::new(), event: None } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[cfg(all(test, feature = "server", not(feature = "unstable-unspecified")))] | ||||
| mod tests { | ||||
|     use ruma_common::api::OutgoingResponse; | ||||
|     use serde_json::{from_slice as from_json_slice, json, Value as JsonValue}; | ||||
| 
 | ||||
|     use super::{super::RoomState, Response}; | ||||
|     use super::{Response, RoomState}; | ||||
| 
 | ||||
|     #[test] | ||||
|     fn response_body() { | ||||
|  | ||||
| @ -6,10 +6,9 @@ use ruma_common::{ | ||||
|     api::{request, response, Metadata}, | ||||
|     metadata, OwnedEventId, OwnedRoomId, | ||||
| }; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| use serde_json::value::RawValue as RawJsonValue; | ||||
| 
 | ||||
| use super::RoomState; | ||||
| 
 | ||||
| const METADATA: Metadata = metadata! { | ||||
|     method: PUT, | ||||
|     rate_limited: false, | ||||
| @ -35,6 +34,19 @@ pub struct Request { | ||||
|     /// The PDU.
 | ||||
|     #[ruma_api(body)] | ||||
|     pub pdu: Box<RawJsonValue>, | ||||
| 
 | ||||
|     /// Indicates whether the calling server can accept a reduced response.
 | ||||
|     ///
 | ||||
|     /// If `true`, membership events are omitted from `state` and redundant events are omitted from
 | ||||
|     /// `auth_chain` in the response.
 | ||||
|     #[cfg(feature = "unstable-msc3706")] | ||||
|     #[ruma_api(query)] | ||||
|     #[serde(
 | ||||
|         rename = "org.matrix.msc3706.partial_state", | ||||
|         default, | ||||
|         skip_serializing_if = "ruma_common::serde::is_default" | ||||
|     )] | ||||
|     pub omit_members: bool, | ||||
| } | ||||
| 
 | ||||
| /// Response type for the `create_join_event` endpoint.
 | ||||
| @ -48,7 +60,13 @@ pub struct Response { | ||||
| impl Request { | ||||
|     /// Creates a new `Request` from the given room ID, event ID and PDU.
 | ||||
|     pub fn new(room_id: OwnedRoomId, event_id: OwnedEventId, pdu: Box<RawJsonValue>) -> Self { | ||||
|         Self { room_id, event_id, pdu } | ||||
|         Self { | ||||
|             room_id, | ||||
|             event_id, | ||||
|             pdu, | ||||
|             #[cfg(feature = "unstable-msc3706")] | ||||
|             omit_members: false, | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -58,3 +76,99 @@ impl Response { | ||||
|         Self { room_state } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /// Full state of the room.
 | ||||
| #[derive(Clone, Debug, Deserialize, Serialize)] | ||||
| #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] | ||||
| pub struct RoomState { | ||||
|     #[cfg(not(feature = "unstable-unspecified"))] | ||||
|     /// The resident server's DNS name.
 | ||||
|     pub origin: String, | ||||
| 
 | ||||
|     /// Whether `m.room.member` events have been omitted from `state`.
 | ||||
|     ///
 | ||||
|     /// Defaults to `false`.
 | ||||
|     #[cfg(feature = "unstable-msc3706")] | ||||
|     #[serde(
 | ||||
|         rename = "org.matrix.msc3706.partial_state", | ||||
|         default, | ||||
|         skip_serializing_if = "ruma_common::serde::is_default" | ||||
|     )] | ||||
|     pub members_omitted: bool, | ||||
| 
 | ||||
|     /// The full set of authorization events that make up the state of the room,
 | ||||
|     /// and their authorization events, recursively.
 | ||||
|     ///
 | ||||
|     /// With the `unstable-msc3706` feature, if the request had `omit_members` set to `true`, then
 | ||||
|     /// any events that are returned in `state` may be omitted from `auth_chain`, whether or
 | ||||
|     /// not membership events are omitted from `state`.
 | ||||
|     pub auth_chain: Vec<Box<RawJsonValue>>, | ||||
| 
 | ||||
|     /// The room state.
 | ||||
|     ///
 | ||||
|     /// With the `unstable-msc3706` feature, if the request had `omit_members` set to `true`,
 | ||||
|     /// events of type `m.room.member` may be omitted from the response to reduce the size of
 | ||||
|     /// the response. If this is done, `members_omitted` must be set to `true`.
 | ||||
|     pub state: Vec<Box<RawJsonValue>>, | ||||
| 
 | ||||
|     /// The signed copy of the membership event sent to other servers by the
 | ||||
|     /// resident server, including the resident server's signature.
 | ||||
|     ///
 | ||||
|     /// Required if the room version supports restricted join rules.
 | ||||
|     #[serde(skip_serializing_if = "Option::is_none")] | ||||
|     pub event: Option<Box<RawJsonValue>>, | ||||
| 
 | ||||
|     /// A list of the servers active in the room (ie, those with joined members) before the join.
 | ||||
|     ///
 | ||||
|     /// Required if `members_omitted` is set to `true`.
 | ||||
|     #[cfg(feature = "unstable-msc3706")] | ||||
|     #[serde(
 | ||||
|         rename = "org.matrix.msc3706.servers_in_room", | ||||
|         skip_serializing_if = "Option::is_none" | ||||
|     )] | ||||
|     pub servers_in_room: Option<Vec<String>>, | ||||
| } | ||||
| 
 | ||||
| #[cfg(feature = "unstable-unspecified")] | ||||
| impl Default for RoomState { | ||||
|     fn default() -> Self { | ||||
|         Self::new() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl RoomState { | ||||
|     #[cfg(not(feature = "unstable-unspecified"))] | ||||
|     /// Creates an empty `RoomState` with the given `origin`.
 | ||||
|     ///
 | ||||
|     /// With the `unstable-unspecified` feature, this method doesn't take any parameters.
 | ||||
|     /// See [matrix-spec#374](https://github.com/matrix-org/matrix-spec/issues/374).
 | ||||
|     pub fn new(origin: String) -> Self { | ||||
|         Self { | ||||
|             origin, | ||||
|             auth_chain: Vec::new(), | ||||
|             state: Vec::new(), | ||||
|             event: None, | ||||
|             #[cfg(feature = "unstable-msc3706")] | ||||
|             members_omitted: false, | ||||
|             #[cfg(feature = "unstable-msc3706")] | ||||
|             servers_in_room: None, | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     #[cfg(feature = "unstable-unspecified")] | ||||
|     /// Creates an empty `RoomState` with the given `origin`.
 | ||||
|     ///
 | ||||
|     /// Without the `unstable-unspecified` feature, this method takes a parameter for the origin.
 | ||||
|     /// See [matrix-spec#374](https://github.com/matrix-org/matrix-spec/issues/374).
 | ||||
|     pub fn new() -> Self { | ||||
|         Self { | ||||
|             auth_chain: Vec::new(), | ||||
|             state: Vec::new(), | ||||
|             event: None, | ||||
|             #[cfg(feature = "unstable-msc3706")] | ||||
|             members_omitted: false, | ||||
|             #[cfg(feature = "unstable-msc3706")] | ||||
|             servers_in_room: None, | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -74,7 +74,7 @@ mod tests { | ||||
|     use serde_json::{json, to_value as to_json_value}; | ||||
| 
 | ||||
|     use super::{deserialize, serialize}; | ||||
|     use crate::membership::create_join_event::RoomState; | ||||
|     use crate::membership::create_join_event::v1::RoomState; | ||||
| 
 | ||||
|     #[test] | ||||
|     fn deserialize_response() { | ||||
|  | ||||
| @ -153,6 +153,7 @@ unstable-msc3553 = ["ruma-common/unstable-msc3553"] | ||||
| unstable-msc3554 = ["ruma-common/unstable-msc3554"] | ||||
| unstable-msc3575 = ["ruma-client-api?/unstable-msc3575"] | ||||
| unstable-msc3618 = ["ruma-federation-api?/unstable-msc3618"] | ||||
| unstable-msc3706 = ["ruma-federation-api?/unstable-msc3706"] | ||||
| unstable-msc3723 = ["ruma-federation-api?/unstable-msc3723"] | ||||
| unstable-msc3783 = ["ruma-common/unstable-msc3783"] | ||||
| unstable-msc3931 = ["ruma-common/unstable-msc3931"] | ||||
| @ -193,6 +194,7 @@ __ci = [ | ||||
|     "unstable-msc3554", | ||||
|     "unstable-msc3575", | ||||
|     "unstable-msc3618", | ||||
|     "unstable-msc3706", | ||||
|     "unstable-msc3723", | ||||
|     "unstable-msc3783", | ||||
|     "unstable-msc3932", | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user