[fractal] Reduce number of typing events sent to server



commit 69aa16fe5e368415d46f133015350d7b4341548c
Author: sonjita <sonjaleaheinze gmail com>
Date:   Fri Oct 11 15:03:33 2019 +0200

    Reduce number of typing events sent to server
    
    Before, a typing event was sent to the server on every single key release.
    A lot of sent typing events were redundant due to the timeout functionality
    implemented in the matrix propocol for typing events.
    With this commit, this overload of events sent to the server gets avoided by
    only sending a new typing event, if the last one was sent more than three seconds ago.

 fractal-gtk/src/appop/mod.rs           |  2 ++
 fractal-gtk/src/appop/room.rs          | 12 +++++++++++-
 fractal-matrix-api/src/backend/room.rs |  2 +-
 3 files changed, 14 insertions(+), 2 deletions(-)
---
diff --git a/fractal-gtk/src/appop/mod.rs b/fractal-gtk/src/appop/mod.rs
index cc1f745d..02c246e9 100644
--- a/fractal-gtk/src/appop/mod.rs
+++ b/fractal-gtk/src/appop/mod.rs
@@ -63,6 +63,7 @@ pub struct AppOp {
     pub history: Option<widgets::RoomHistory>,
     pub roomlist: widgets::RoomList,
     pub unsent_messages: HashMap<String, (String, i32)>,
+    pub typing: HashMap<String, std::time::Instant>,
 
     pub state: AppState,
     pub since: Option<String>,
@@ -107,6 +108,7 @@ impl AppOp {
             roomlist: widgets::RoomList::new(None, None),
             since: None,
             unsent_messages: HashMap::new(),
+            typing: HashMap::new(),
 
             logged_in: false,
 
diff --git a/fractal-gtk/src/appop/room.rs b/fractal-gtk/src/appop/room.rs
index e1a3410a..5c2d8e34 100644
--- a/fractal-gtk/src/appop/room.rs
+++ b/fractal-gtk/src/appop/room.rs
@@ -27,6 +27,8 @@ use rand::{thread_rng, Rng};
 
 use glib::functions::markup_escape_text;
 
+use std::time::Instant;
+
 pub struct Force(pub bool);
 
 impl AppOp {
@@ -622,8 +624,16 @@ impl AppOp {
         }
     }
 
-    pub fn send_typing(&self) {
+    pub fn send_typing(&mut self) {
         if let Some(ref active_room) = self.active_room {
+            let now = Instant::now();
+            if let Some(last_typing) = self.typing.get(active_room) {
+                let time_passed = now.duration_since(*last_typing);
+                if time_passed.as_secs() < 3 {
+                    return;
+                }
+            }
+            self.typing.insert(active_room.clone(), now);
             self.backend
                 .send(BKCommand::SendTyping(active_room.clone()))
                 .unwrap();
diff --git a/fractal-matrix-api/src/backend/room.rs b/fractal-matrix-api/src/backend/room.rs
index 768c606f..80a082fe 100644
--- a/fractal-matrix-api/src/backend/room.rs
+++ b/fractal-matrix-api/src/backend/room.rs
@@ -316,7 +316,7 @@ pub fn send_typing(bk: &Backend, roomid: String) -> Result<(), Error> {
     let url = bk.url(&format!("rooms/{}/typing/{}", roomid, userid), vec![])?;
 
     let attrs = json!({
-        "timeout": 30000,
+        "timeout": 4000,
         "typing": true
     });
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]