@@ -22,7 +22,7 @@ use serde::{ser::SerializeSeq, Deserialize, Deserializer, Serialize, Serializer}
2222use tracing:: { debug, warn} ;
2323
2424use super :: {
25- filter:: { Filter , FilterInput } ,
25+ filter:: { Filter , FilterInput , ToDeviceEventFilter } ,
2626 MessageLikeEventFilter , StateEventFilter ,
2727} ;
2828
@@ -102,11 +102,13 @@ impl Capabilities {
102102 }
103103}
104104
105- const SEND_EVENT : & str = "org.matrix.msc2762.send.event" ;
106- const READ_EVENT : & str = "org.matrix.msc2762.receive.event" ;
107- const SEND_STATE : & str = "org.matrix.msc2762.send.state_event" ;
108- const READ_STATE : & str = "org.matrix.msc2762.receive.state_event" ;
109- const REQUIRES_CLIENT : & str = "io.element.requires_client" ;
105+ pub ( super ) const SEND_EVENT : & str = "org.matrix.msc2762.send.event" ;
106+ pub ( super ) const READ_EVENT : & str = "org.matrix.msc2762.receive.event" ;
107+ pub ( super ) const SEND_STATE : & str = "org.matrix.msc2762.send.state_event" ;
108+ pub ( super ) const READ_STATE : & str = "org.matrix.msc2762.receive.state_event" ;
109+ pub ( super ) const SEND_TODEVICE : & str = "org.matrix.msc3819.send.to_device" ;
110+ pub ( super ) const READ_TODEVICE : & str = "org.matrix.msc3819.receive.to_device" ;
111+ pub ( super ) const REQUIRES_CLIENT : & str = "io.element.requires_client" ;
110112pub ( super ) const SEND_DELAYED_EVENT : & str = "org.matrix.msc4157.send.delayed_event" ;
111113pub ( super ) const UPDATE_DELAYED_EVENT : & str = "org.matrix.msc4157.update_delayed_event" ;
112114
@@ -169,13 +171,15 @@ impl Serialize for Capabilities {
169171 let name = match filter {
170172 Filter :: MessageLike ( _) => READ_EVENT ,
171173 Filter :: State ( _) => READ_STATE ,
174+ Filter :: ToDevice ( _) => READ_TODEVICE ,
172175 } ;
173176 seq. serialize_element ( & format ! ( "{name}:{}" , PrintEventFilter ( filter) ) ) ?;
174177 }
175178 for filter in & self . send {
176179 let name = match filter {
177180 Filter :: MessageLike ( _) => SEND_EVENT ,
178181 Filter :: State ( _) => SEND_STATE ,
182+ Filter :: ToDevice ( _) => SEND_TODEVICE ,
179183 } ;
180184 seq. serialize_element ( & format ! ( "{name}:{}" , PrintEventFilter ( filter) ) ) ?;
181185 }
@@ -227,6 +231,12 @@ impl<'de> Deserialize<'de> for Capabilities {
227231 Some ( ( SEND_STATE , filter_s) ) => {
228232 Ok ( Permission :: Send ( Filter :: State ( parse_state_event_filter ( filter_s) ) ) )
229233 }
234+ Some ( ( READ_TODEVICE , filter_s) ) => Ok ( Permission :: Read ( Filter :: ToDevice (
235+ parse_to_device_event_filter ( filter_s) ,
236+ ) ) ) ,
237+ Some ( ( SEND_TODEVICE , filter_s) ) => Ok ( Permission :: Send ( Filter :: ToDevice (
238+ parse_to_device_event_filter ( filter_s) ,
239+ ) ) ) ,
230240 _ => {
231241 debug ! ( "Unknown capability `{s}`" ) ;
232242 Ok ( Self :: Unknown )
@@ -253,6 +263,10 @@ impl<'de> Deserialize<'de> for Capabilities {
253263 }
254264 }
255265
266+ fn parse_to_device_event_filter ( s : & str ) -> ToDeviceEventFilter {
267+ ToDeviceEventFilter :: new ( s. into ( ) )
268+ }
269+
256270 let mut capabilities = Capabilities :: default ( ) ;
257271 for capability in Vec :: < Permission > :: deserialize ( deserializer) ? {
258272 match capability {
@@ -274,6 +288,8 @@ impl<'de> Deserialize<'de> for Capabilities {
274288mod tests {
275289 use ruma:: events:: StateEventType ;
276290
291+ use crate :: widget:: filter:: ToDeviceEventFilter ;
292+
277293 use super :: * ;
278294
279295 #[ test]
@@ -294,8 +310,10 @@ mod tests {
294310 "org.matrix.msc2762.receive.event:org.matrix.rageshake_request",
295311 "org.matrix.msc2762.receive.state_event:m.room.member",
296312 "org.matrix.msc2762.receive.state_event:org.matrix.msc3401.call.member",
313+ "org.matrix.msc3819.receive.to_device:io.element.call.encryption_keys",
297314 "org.matrix.msc2762.send.event:org.matrix.rageshake_request",
298315 "org.matrix.msc2762.send.state_event:org.matrix.msc3401.call.member#@user:matrix.server",
316+ "org.matrix.msc3819.send.to_device:io.element.call.encryption_keys",
299317 "org.matrix.msc4157.send.delayed_event",
300318 "org.matrix.msc4157.update_delayed_event"
301319 ]"# ;
@@ -308,6 +326,9 @@ mod tests {
308326 ) ) ,
309327 Filter :: State ( StateEventFilter :: WithType ( StateEventType :: RoomMember ) ) ,
310328 Filter :: State ( StateEventFilter :: WithType ( "org.matrix.msc3401.call.member" . into( ) ) ) ,
329+ Filter :: ToDevice ( ToDeviceEventFilter :: new(
330+ "io.element.call.encryption_keys" . into( ) ,
331+ ) ) ,
311332 ] ,
312333 send : vec ! [
313334 Filter :: MessageLike ( MessageLikeEventFilter :: WithType (
@@ -317,6 +338,9 @@ mod tests {
317338 "org.matrix.msc3401.call.member" . into( ) ,
318339 "@user:matrix.server" . into( ) ,
319340 ) ) ,
341+ Filter :: ToDevice ( ToDeviceEventFilter :: new(
342+ "io.element.call.encryption_keys" . into( ) ,
343+ ) ) ,
320344 ] ,
321345 requires_client : true ,
322346 update_delayed_event : true ,
@@ -336,13 +360,17 @@ mod tests {
336360 "org.matrix.msc3401.call.member" . into( ) ,
337361 "@user:matrix.server" . into( ) ,
338362 ) ) ,
363+ Filter :: ToDevice ( ToDeviceEventFilter :: new(
364+ "io.element.call.encryption_keys" . into( ) ,
365+ ) ) ,
339366 ] ,
340367 send : vec ! [
341368 Filter :: MessageLike ( MessageLikeEventFilter :: WithType ( "io.element.custom" . into( ) ) ) ,
342369 Filter :: State ( StateEventFilter :: WithTypeAndStateKey (
343370 "org.matrix.msc3401.call.member" . into( ) ,
344371 "@user:matrix.server" . into( ) ,
345372 ) ) ,
373+ Filter :: ToDevice ( ToDeviceEventFilter :: new( "my.org.other.to_device_event" . into( ) ) ) ,
346374 ] ,
347375 requires_client : true ,
348376 update_delayed_event : false ,
0 commit comments