@@ -22,7 +22,7 @@ use serde::{ser::SerializeSeq, Deserialize, Deserializer, Serialize, Serializer}
2222use tracing:: debug;
2323
2424use super :: {
25- filter:: { Filter , FilterInput } ,
25+ filter:: { Filter , FilterInput , ToDeviceEventFilter } ,
2626 MessageLikeEventFilter , StateEventFilter ,
2727} ;
2828
@@ -84,11 +84,13 @@ impl Capabilities {
8484 }
8585}
8686
87- const SEND_EVENT : & str = "org.matrix.msc2762.send.event" ;
88- const READ_EVENT : & str = "org.matrix.msc2762.receive.event" ;
89- const SEND_STATE : & str = "org.matrix.msc2762.send.state_event" ;
90- const READ_STATE : & str = "org.matrix.msc2762.receive.state_event" ;
91- const REQUIRES_CLIENT : & str = "io.element.requires_client" ;
87+ pub ( super ) const SEND_EVENT : & str = "org.matrix.msc2762.send.event" ;
88+ pub ( super ) const READ_EVENT : & str = "org.matrix.msc2762.receive.event" ;
89+ pub ( super ) const SEND_STATE : & str = "org.matrix.msc2762.send.state_event" ;
90+ pub ( super ) const READ_STATE : & str = "org.matrix.msc2762.receive.state_event" ;
91+ pub ( super ) const SEND_TODEVICE : & str = "org.matrix.msc3819.send.to_device" ;
92+ pub ( super ) const READ_TODEVICE : & str = "org.matrix.msc3819.receive.to_device" ;
93+ pub ( super ) const REQUIRES_CLIENT : & str = "io.element.requires_client" ;
9294pub ( super ) const SEND_DELAYED_EVENT : & str = "org.matrix.msc4157.send.delayed_event" ;
9395pub ( super ) const UPDATE_DELAYED_EVENT : & str = "org.matrix.msc4157.update_delayed_event" ;
9496
@@ -151,13 +153,15 @@ impl Serialize for Capabilities {
151153 let name = match filter {
152154 Filter :: MessageLike ( _) => READ_EVENT ,
153155 Filter :: State ( _) => READ_STATE ,
156+ Filter :: ToDevice ( _) => READ_TODEVICE ,
154157 } ;
155158 seq. serialize_element ( & format ! ( "{name}:{}" , PrintEventFilter ( filter) ) ) ?;
156159 }
157160 for filter in & self . send {
158161 let name = match filter {
159162 Filter :: MessageLike ( _) => SEND_EVENT ,
160163 Filter :: State ( _) => SEND_STATE ,
164+ Filter :: ToDevice ( _) => SEND_TODEVICE ,
161165 } ;
162166 seq. serialize_element ( & format ! ( "{name}:{}" , PrintEventFilter ( filter) ) ) ?;
163167 }
@@ -209,6 +213,12 @@ impl<'de> Deserialize<'de> for Capabilities {
209213 Some ( ( SEND_STATE , filter_s) ) => {
210214 Ok ( Permission :: Send ( Filter :: State ( parse_state_event_filter ( filter_s) ) ) )
211215 }
216+ Some ( ( READ_TODEVICE , filter_s) ) => Ok ( Permission :: Read ( Filter :: ToDevice (
217+ parse_to_device_event_filter ( filter_s) ,
218+ ) ) ) ,
219+ Some ( ( SEND_TODEVICE , filter_s) ) => Ok ( Permission :: Send ( Filter :: ToDevice (
220+ parse_to_device_event_filter ( filter_s) ,
221+ ) ) ) ,
212222 _ => {
213223 debug ! ( "Unknown capability `{s}`" ) ;
214224 Ok ( Self :: Unknown )
@@ -235,6 +245,10 @@ impl<'de> Deserialize<'de> for Capabilities {
235245 }
236246 }
237247
248+ fn parse_to_device_event_filter ( s : & str ) -> ToDeviceEventFilter {
249+ ToDeviceEventFilter :: new ( s. into ( ) )
250+ }
251+
238252 let mut capabilities = Capabilities :: default ( ) ;
239253 for capability in Vec :: < Permission > :: deserialize ( deserializer) ? {
240254 match capability {
@@ -256,6 +270,8 @@ impl<'de> Deserialize<'de> for Capabilities {
256270mod tests {
257271 use ruma:: events:: StateEventType ;
258272
273+ use crate :: widget:: filter:: ToDeviceEventFilter ;
274+
259275 use super :: * ;
260276
261277 #[ test]
@@ -276,8 +292,10 @@ mod tests {
276292 "org.matrix.msc2762.receive.event:org.matrix.rageshake_request",
277293 "org.matrix.msc2762.receive.state_event:m.room.member",
278294 "org.matrix.msc2762.receive.state_event:org.matrix.msc3401.call.member",
295+ "org.matrix.msc3819.receive.to_device:io.element.call.encryption_keys",
279296 "org.matrix.msc2762.send.event:org.matrix.rageshake_request",
280297 "org.matrix.msc2762.send.state_event:org.matrix.msc3401.call.member#@user:matrix.server",
298+ "org.matrix.msc3819.send.to_device:io.element.call.encryption_keys",
281299 "org.matrix.msc4157.send.delayed_event",
282300 "org.matrix.msc4157.update_delayed_event"
283301 ]"# ;
@@ -290,6 +308,9 @@ mod tests {
290308 ) ) ,
291309 Filter :: State ( StateEventFilter :: WithType ( StateEventType :: RoomMember ) ) ,
292310 Filter :: State ( StateEventFilter :: WithType ( "org.matrix.msc3401.call.member" . into( ) ) ) ,
311+ Filter :: ToDevice ( ToDeviceEventFilter :: new(
312+ "io.element.call.encryption_keys" . into( ) ,
313+ ) ) ,
293314 ] ,
294315 send : vec ! [
295316 Filter :: MessageLike ( MessageLikeEventFilter :: WithType (
@@ -299,6 +320,9 @@ mod tests {
299320 "org.matrix.msc3401.call.member" . into( ) ,
300321 "@user:matrix.server" . into( ) ,
301322 ) ) ,
323+ Filter :: ToDevice ( ToDeviceEventFilter :: new(
324+ "io.element.call.encryption_keys" . into( ) ,
325+ ) ) ,
302326 ] ,
303327 requires_client : true ,
304328 update_delayed_event : true ,
@@ -318,13 +342,17 @@ mod tests {
318342 "org.matrix.msc3401.call.member" . into( ) ,
319343 "@user:matrix.server" . into( ) ,
320344 ) ) ,
345+ Filter :: ToDevice ( ToDeviceEventFilter :: new(
346+ "io.element.call.encryption_keys" . into( ) ,
347+ ) ) ,
321348 ] ,
322349 send : vec ! [
323350 Filter :: MessageLike ( MessageLikeEventFilter :: WithType ( "io.element.custom" . into( ) ) ) ,
324351 Filter :: State ( StateEventFilter :: WithTypeAndStateKey (
325352 "org.matrix.msc3401.call.member" . into( ) ,
326353 "@user:matrix.server" . into( ) ,
327354 ) ) ,
355+ Filter :: ToDevice ( ToDeviceEventFilter :: new( "my.org.other.to_device_event" . into( ) ) ) ,
328356 ] ,
329357 requires_client : true ,
330358 update_delayed_event : false ,
0 commit comments