@@ -80,7 +80,7 @@ static DEBOUNCE_DURATION: LazyLock<Duration> = LazyLock::new(|| {
80
80
81
81
pub async fn on_prompt ( ) {
82
82
COMPLETION_CACHE . lock ( ) . await . clear ( ) ;
83
- TELEMETRY_QUEUE . lock ( ) . await . send_all_items ( ) . await ;
83
+ TELEMETRY_QUEUE . lock ( ) . await . send_all_items ( None ) . await ;
84
84
}
85
85
86
86
struct TelemetryQueue {
@@ -92,13 +92,17 @@ impl TelemetryQueue {
92
92
Self { items : Vec :: new ( ) }
93
93
}
94
94
95
- async fn send_all_items ( & mut self ) {
95
+ async fn send_all_items ( & mut self , retain : Option < usize > ) {
96
96
let start_url = fig_auth:: builder_id_token ( )
97
97
. await
98
98
. ok ( )
99
99
. flatten ( )
100
100
. 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) {
102
106
let TelemetryQueueItem {
103
107
timestamp,
104
108
session_id,
@@ -133,6 +137,9 @@ impl TelemetryQueue {
133
137
. await ,
134
138
)
135
139
. await ;
140
+
141
+ // prevent more than 2 events per second
142
+ tokio:: time:: sleep ( Duration :: from_millis ( 500 ) ) . await ;
136
143
}
137
144
}
138
145
}
@@ -300,7 +307,8 @@ pub async fn handle_request(
300
307
let completion = completion. clone ( ) ;
301
308
let buffer = buffer. to_owned ( ) ;
302
309
async move {
303
- TELEMETRY_QUEUE . lock ( ) . await . items . push ( TelemetryQueueItem {
310
+ let mut queue = TELEMETRY_QUEUE . lock ( ) . await ;
311
+ queue. items . push ( TelemetryQueueItem {
304
312
suggested_chars_len : completion. chars ( ) . count ( ) as i32 ,
305
313
number_of_recommendations,
306
314
suggestion : completion,
@@ -312,6 +320,9 @@ pub async fn handle_request(
312
320
edit_buffer_len : buffer. chars ( ) . count ( ) . try_into ( ) . ok ( ) ,
313
321
buffer,
314
322
} ) ;
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 ;
315
326
}
316
327
} ) ;
317
328
@@ -356,7 +367,7 @@ pub async fn handle_accept(figterm_request: InlineShellCompletionAcceptRequest,
356
367
item. suggestion_state = SuggestionState :: Accept ;
357
368
}
358
369
}
359
- queue. send_all_items ( ) . await ;
370
+ queue. send_all_items ( None ) . await ;
360
371
}
361
372
362
373
pub async fn handle_set_enabled ( figterm_request : InlineShellCompletionSetEnabledRequest , _session_id : String ) {
0 commit comments