@@ -14,7 +14,7 @@ use prost::Message;
1414use crate :: client:: PolycentricClient ;
1515use crate :: query:: event:: dedup:: { EventDedupKey , event_dedup_key} ;
1616use crate :: query:: feed:: { FakeCursorToken , merge_page_info} ;
17- use crate :: query:: validation:: retain_validated_bundles;
17+ use crate :: query:: validation:: { retain_validated_bundles, retain_validated_hints } ;
1818use crate :: query:: { QueryClient , QueryKey , QueryObservable , QueryOpts , channel} ;
1919
2020#[ derive( Clone , Debug , uniffi:: Record ) ]
@@ -68,6 +68,7 @@ fn merge_follows_responses(values: &[Vec<u8>], client: &Arc<Mutex<PolycentricCli
6868 for v in values {
6969 if let Ok ( incoming) = ListFollowsResponse :: decode ( v. as_slice ( ) ) {
7070 merged. event_bundles . extend ( incoming. event_bundles ) ;
71+ merged. event_hints . extend ( incoming. event_hints ) ;
7172 merged. page_info = merge_page_info ( merged. page_info , incoming. page_info ) ;
7273 }
7374 }
@@ -91,8 +92,17 @@ fn merge_follows_responses(values: &[Vec<u8>], client: &Arc<Mutex<PolycentricCli
9192 Reverse ( created_at)
9293 } ) ;
9394
95+ let mut seen_hints: HashSet < EventDedupKey > = HashSet :: new ( ) ;
96+ merged. event_hints . retain (
97+ |hint| match hint. event_bundle . as_ref ( ) . and_then ( event_dedup_key) {
98+ Some ( k) => seen_hints. insert ( k) ,
99+ None => true ,
100+ } ,
101+ ) ;
102+
94103 let c = client. lock ( ) . unwrap ( ) ;
95104 retain_validated_bundles ( & c, & mut merged. event_bundles ) ;
105+ retain_validated_hints ( & c, & mut merged. event_hints ) ;
96106 drop ( c) ;
97107
98108 merged. encode_to_vec ( )
@@ -139,7 +149,16 @@ pub fn list_following(
139149 prepare_page_info ( & mut response, & server_url, backward_offset, forward_offset) ?;
140150 let bytes = response. encode_to_vec ( ) ;
141151
142- client. lock ( ) . unwrap ( ) . copy_bundles ( response. event_bundles ) ;
152+ let hint_bundles: Vec < _ > = response
153+ . event_hints
154+ . into_iter ( )
155+ . filter_map ( |h| h. event_bundle )
156+ . collect ( ) ;
157+ {
158+ let mut c = client. lock ( ) . unwrap ( ) ;
159+ c. copy_bundles ( hint_bundles) ;
160+ c. copy_bundles ( response. event_bundles ) ;
161+ }
143162 Ok ( bytes)
144163 }
145164 } ;
@@ -188,7 +207,16 @@ pub fn list_followers(
188207 prepare_page_info ( & mut response, & server_url, backward_offset, forward_offset) ?;
189208 let bytes = response. encode_to_vec ( ) ;
190209
191- client. lock ( ) . unwrap ( ) . copy_bundles ( response. event_bundles ) ;
210+ let hint_bundles: Vec < _ > = response
211+ . event_hints
212+ . into_iter ( )
213+ . filter_map ( |h| h. event_bundle )
214+ . collect ( ) ;
215+ {
216+ let mut c = client. lock ( ) . unwrap ( ) ;
217+ c. copy_bundles ( hint_bundles) ;
218+ c. copy_bundles ( response. event_bundles ) ;
219+ }
192220 Ok ( bytes)
193221 }
194222 } ;
@@ -208,6 +236,7 @@ mod tests {
208236 fn response_from ( server : & str , has_next_page : bool ) -> Vec < u8 > {
209237 let mut response = ListFollowsResponse {
210238 event_bundles : Vec :: new ( ) ,
239+ event_hints : Vec :: new ( ) ,
211240 page_info : Some ( PageInfo {
212241 start_cursor : "start" . to_string ( ) ,
213242 end_cursor : "end" . to_string ( ) ,
0 commit comments