@@ -97,6 +97,7 @@ use tokio::sync::Mutex;
97
97
use xmtp_common:: retry:: RetryableError ;
98
98
use xmtp_common:: time:: now_ns;
99
99
use xmtp_content_types:: reaction:: { LegacyReaction , ReactionCodec } ;
100
+ use xmtp_content_types:: should_push;
100
101
use xmtp_cryptography:: signature:: { sanitize_evm_addresses, AddressValidationError } ;
101
102
use xmtp_id:: { InboxId , InboxIdRef } ;
102
103
use xmtp_proto:: xmtp:: mls:: {
@@ -337,6 +338,7 @@ pub struct QueryableContentFields {
337
338
pub version_minor : i32 ,
338
339
pub authority_id : String ,
339
340
pub reference_id : Option < Vec < u8 > > ,
341
+ pub should_push : bool ,
340
342
}
341
343
342
344
impl Default for QueryableContentFields {
@@ -347,6 +349,7 @@ impl Default for QueryableContentFields {
347
349
version_minor : 0 ,
348
350
authority_id : String :: new ( ) ,
349
351
reference_id : None ,
352
+ should_push : false ,
350
353
}
351
354
}
352
355
}
@@ -356,10 +359,10 @@ impl TryFrom<EncodedContent> for QueryableContentFields {
356
359
357
360
fn try_from ( content : EncodedContent ) -> Result < Self , Self :: Error > {
358
361
let content_type_id = content. r#type . unwrap_or_default ( ) ;
359
- let reference_id = match (
360
- content_type_id. type_id . as_str ( ) ,
361
- content_type_id . version_major ,
362
- ) {
362
+
363
+ let type_id_str = content_type_id. type_id . clone ( ) ;
364
+
365
+ let reference_id = match ( type_id_str . as_str ( ) , content_type_id . version_major ) {
363
366
( ReactionCodec :: TYPE_ID , major) if major >= 2 => {
364
367
ReactionV2 :: decode ( content. content . as_slice ( ) )
365
368
. ok ( )
@@ -376,6 +379,7 @@ impl TryFrom<EncodedContent> for QueryableContentFields {
376
379
version_minor : content_type_id. version_minor as i32 ,
377
380
authority_id : content_type_id. authority_id . to_string ( ) ,
378
381
reference_id,
382
+ should_push : should_push ( type_id_str) ,
379
383
} )
380
384
}
381
385
}
@@ -791,8 +795,12 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
791
795
self . maybe_update_installations ( provider, update_interval_ns)
792
796
. await ?;
793
797
794
- let message_id =
795
- self . prepare_message ( message, provider, |now| Self :: into_envelope ( message, now) ) ?;
798
+ let message_id = self . prepare_message (
799
+ message,
800
+ provider,
801
+ |now| Self :: into_envelope ( message, now) ,
802
+ true ,
803
+ ) ?;
796
804
797
805
self . sync_until_last_intent_resolved ( provider) . await ?;
798
806
// implicitly set group consent state to allowed
@@ -830,8 +838,12 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
830
838
/// Send a message, optimistically returning the ID of the message before the result of a message publish.
831
839
pub fn send_message_optimistic ( & self , message : & [ u8 ] ) -> Result < Vec < u8 > , GroupError > {
832
840
let provider = self . mls_provider ( ) ?;
833
- let message_id =
834
- self . prepare_message ( message, & provider, |now| Self :: into_envelope ( message, now) ) ?;
841
+ let message_id = self . prepare_message (
842
+ message,
843
+ & provider,
844
+ |now| Self :: into_envelope ( message, now) ,
845
+ true ,
846
+ ) ?;
835
847
Ok ( message_id)
836
848
}
837
849
@@ -865,6 +877,7 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
865
877
message : & [ u8 ] ,
866
878
provider : & XmtpOpenMlsProvider ,
867
879
envelope : F ,
880
+ should_push : bool ,
868
881
) -> Result < Vec < u8 > , GroupError >
869
882
where
870
883
F : FnOnce ( i64 ) -> PlaintextEnvelope ,
@@ -877,7 +890,7 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
877
890
. map_err ( GroupError :: EncodeError ) ?;
878
891
879
892
let intent_data: Vec < u8 > = SendMessageIntentData :: new ( encoded_envelope) . into ( ) ;
880
- self . queue_intent ( provider, IntentKind :: SendMessage , intent_data) ?;
893
+ self . queue_intent ( provider, IntentKind :: SendMessage , intent_data, should_push ) ?;
881
894
882
895
// store this unpublished message locally before sending
883
896
let message_id = calculate_message_id ( & self . group_id , message, & now. to_string ( ) ) ;
@@ -1013,6 +1026,7 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
1013
1026
provider,
1014
1027
IntentKind :: UpdateGroupMembership ,
1015
1028
intent_data. into ( ) ,
1029
+ false ,
1016
1030
) ?;
1017
1031
1018
1032
self . sync_until_intent_resolved ( provider, intent. id ) . await ?;
@@ -1063,6 +1077,7 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
1063
1077
& provider,
1064
1078
IntentKind :: UpdateGroupMembership ,
1065
1079
intent_data. into ( ) ,
1080
+ false ,
1066
1081
) ?;
1067
1082
1068
1083
self . sync_until_intent_resolved ( & provider, intent. id ) . await
@@ -1082,7 +1097,8 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
1082
1097
}
1083
1098
let intent_data: Vec < u8 > =
1084
1099
UpdateMetadataIntentData :: new_update_group_name ( group_name) . into ( ) ;
1085
- let intent = self . queue_intent ( & provider, IntentKind :: MetadataUpdate , intent_data) ?;
1100
+ let intent =
1101
+ self . queue_intent ( & provider, IntentKind :: MetadataUpdate , intent_data, false ) ?;
1086
1102
1087
1103
self . sync_until_intent_resolved ( & provider, intent. id ) . await
1088
1104
}
@@ -1111,7 +1127,8 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
1111
1127
)
1112
1128
. into ( ) ;
1113
1129
1114
- let intent = self . queue_intent ( & provider, IntentKind :: UpdatePermission , intent_data) ?;
1130
+ let intent =
1131
+ self . queue_intent ( & provider, IntentKind :: UpdatePermission , intent_data, false ) ?;
1115
1132
1116
1133
self . sync_until_intent_resolved ( & provider, intent. id ) . await
1117
1134
}
@@ -1147,7 +1164,8 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
1147
1164
}
1148
1165
let intent_data: Vec < u8 > =
1149
1166
UpdateMetadataIntentData :: new_update_group_description ( group_description) . into ( ) ;
1150
- let intent = self . queue_intent ( & provider, IntentKind :: MetadataUpdate , intent_data) ?;
1167
+ let intent =
1168
+ self . queue_intent ( & provider, IntentKind :: MetadataUpdate , intent_data, false ) ?;
1151
1169
1152
1170
self . sync_until_intent_resolved ( & provider, intent. id ) . await
1153
1171
}
@@ -1183,7 +1201,8 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
1183
1201
let intent_data: Vec < u8 > =
1184
1202
UpdateMetadataIntentData :: new_update_group_image_url_square ( group_image_url_square)
1185
1203
. into ( ) ;
1186
- let intent = self . queue_intent ( & provider, IntentKind :: MetadataUpdate , intent_data) ?;
1204
+ let intent =
1205
+ self . queue_intent ( & provider, IntentKind :: MetadataUpdate , intent_data, false ) ?;
1187
1206
1188
1207
self . sync_until_intent_resolved ( & provider, intent. id ) . await
1189
1208
}
@@ -1236,7 +1255,7 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
1236
1255
expire_from_ms,
1237
1256
)
1238
1257
. into ( ) ;
1239
- let intent = self . queue_intent ( provider, IntentKind :: MetadataUpdate , intent_data) ?;
1258
+ let intent = self . queue_intent ( provider, IntentKind :: MetadataUpdate , intent_data, false ) ?;
1240
1259
self . sync_until_intent_resolved ( provider, intent. id ) . await
1241
1260
}
1242
1261
@@ -1248,7 +1267,7 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
1248
1267
let intent_data: Vec < u8 > =
1249
1268
UpdateMetadataIntentData :: new_update_conversation_message_disappear_in_ns ( expire_in_ms)
1250
1269
. into ( ) ;
1251
- let intent = self . queue_intent ( provider, IntentKind :: MetadataUpdate , intent_data) ?;
1270
+ let intent = self . queue_intent ( provider, IntentKind :: MetadataUpdate , intent_data, false ) ?;
1252
1271
self . sync_until_intent_resolved ( provider, intent. id ) . await
1253
1272
}
1254
1273
@@ -1348,7 +1367,8 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
1348
1367
} ;
1349
1368
let intent_data: Vec < u8 > =
1350
1369
UpdateAdminListIntentData :: new ( intent_action_type, inbox_id) . into ( ) ;
1351
- let intent = self . queue_intent ( & provider, IntentKind :: UpdateAdminList , intent_data) ?;
1370
+ let intent =
1371
+ self . queue_intent ( & provider, IntentKind :: UpdateAdminList , intent_data, false ) ?;
1352
1372
1353
1373
self . sync_until_intent_resolved ( & provider, intent. id ) . await
1354
1374
}
@@ -1425,7 +1445,7 @@ impl<ScopedClient: ScopedGroupClient> MlsGroup<ScopedClient> {
1425
1445
/// Update this installation's leaf key in the group by creating a key update commit
1426
1446
pub async fn key_update ( & self ) -> Result < ( ) , GroupError > {
1427
1447
let provider = self . client . mls_provider ( ) ?;
1428
- let intent = self . queue_intent ( & provider, IntentKind :: KeyUpdate , vec ! [ ] ) ?;
1448
+ let intent = self . queue_intent ( & provider, IntentKind :: KeyUpdate , vec ! [ ] , false ) ?;
1429
1449
self . sync_until_intent_resolved ( & provider, intent. id ) . await
1430
1450
}
1431
1451
@@ -2034,7 +2054,7 @@ pub(crate) mod tests {
2034
2054
serialized_welcome,
2035
2055
) ;
2036
2056
let messages = sender_group
2037
- . prepare_group_messages ( vec ! [ serialized_commit. as_slice( ) ] )
2057
+ . prepare_group_messages ( vec ! [ ( serialized_commit. as_slice( ) , false ) ] )
2038
2058
. unwrap ( ) ;
2039
2059
sender_client
2040
2060
. api_client
@@ -4405,6 +4425,7 @@ pub(crate) mod tests {
4405
4425
provider,
4406
4426
IntentKind :: UpdateGroupMembership ,
4407
4427
intent_data. into ( ) ,
4428
+ false ,
4408
4429
)
4409
4430
. unwrap ( ) ;
4410
4431
}
0 commit comments