@@ -80,7 +80,7 @@ static DEBOUNCE_DURATION: LazyLock<Duration> = LazyLock::new(|| {
8080
8181pub async fn on_prompt ( ) {
8282 COMPLETION_CACHE . lock ( ) . await . clear ( ) ;
83- TELEMETRY_QUEUE . lock ( ) . await . send_all_items ( ) . await ;
83+ TELEMETRY_QUEUE . lock ( ) . await . send_all_items ( None ) . await ;
8484}
8585
8686struct TelemetryQueue {
@@ -92,13 +92,17 @@ impl TelemetryQueue {
9292 Self { items : Vec :: new ( ) }
9393 }
9494
95- async fn send_all_items ( & mut self ) {
95+ async fn send_all_items ( & mut self , retain : Option < usize > ) {
9696 let start_url = fig_auth:: builder_id_token ( )
9797 . await
9898 . ok ( )
9999 . flatten ( )
100100 . and_then ( |t| t. start_url ) ;
101- for item in self . items . drain ( ..) {
101+
102+ let items_len = self . items . len ( ) ;
103+ let drain_len = retain. map_or ( items_len, |n| items_len. saturating_sub ( n) ) ;
104+
105+ for item in self . items . drain ( ..drain_len) {
102106 let TelemetryQueueItem {
103107 timestamp,
104108 session_id,
@@ -133,6 +137,9 @@ impl TelemetryQueue {
133137 . await ,
134138 )
135139 . await ;
140+
141+ // prevent more than 2 events per second
142+ tokio:: time:: sleep ( Duration :: from_millis ( 500 ) ) . await ;
136143 }
137144 }
138145}
@@ -300,7 +307,8 @@ pub async fn handle_request(
300307 let completion = completion. clone ( ) ;
301308 let buffer = buffer. to_owned ( ) ;
302309 async move {
303- TELEMETRY_QUEUE . lock ( ) . await . items . push ( TelemetryQueueItem {
310+ let mut queue = TELEMETRY_QUEUE . lock ( ) . await ;
311+ queue. items . push ( TelemetryQueueItem {
304312 suggested_chars_len : completion. chars ( ) . count ( ) as i32 ,
305313 number_of_recommendations,
306314 suggestion : completion,
@@ -312,6 +320,9 @@ pub async fn handle_request(
312320 edit_buffer_len : buffer. chars ( ) . count ( ) . try_into ( ) . ok ( ) ,
313321 buffer,
314322 } ) ;
323+ // flush all but 4 messages, this is to retain messages that might have
324+ // an accept waiting
325+ queue. send_all_items ( Some ( 4 ) ) . await ;
315326 }
316327 } ) ;
317328
@@ -356,7 +367,7 @@ pub async fn handle_accept(figterm_request: InlineShellCompletionAcceptRequest,
356367 item. suggestion_state = SuggestionState :: Accept ;
357368 }
358369 }
359- queue. send_all_items ( ) . await ;
370+ queue. send_all_items ( None ) . await ;
360371}
361372
362373pub async fn handle_set_enabled ( figterm_request : InlineShellCompletionSetEnabledRequest , _session_id : String ) {
0 commit comments