improvement: bundle typing events and only send on changes
Fixes #67 and #49
This commit is contained in:
		
							parent
							
								
									8328eeb5ac
								
							
						
					
					
						commit
						168f2281fd
					
				
					 4 changed files with 141 additions and 98 deletions
				
			
		| 
						 | 
				
			
			@ -4,6 +4,7 @@ use std::{
 | 
			
		|||
    time::{Duration, SystemTime},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
use crate::{utils, Database, MatrixResult, Ruma};
 | 
			
		||||
use log::{debug, warn};
 | 
			
		||||
use rocket::{delete, get, options, post, put, State};
 | 
			
		||||
use ruma_client_api::{
 | 
			
		||||
| 
						 | 
				
			
			@ -55,7 +56,6 @@ use ruma_events::{
 | 
			
		|||
};
 | 
			
		||||
use ruma_identifiers::{DeviceId, RoomAliasId, RoomId, RoomVersionId, UserId};
 | 
			
		||||
use serde_json::{json, value::RawValue};
 | 
			
		||||
use crate::{utils, Database, MatrixResult, Ruma};
 | 
			
		||||
 | 
			
		||||
const GUEST_NAME_LENGTH: usize = 10;
 | 
			
		||||
const DEVICE_ID_LENGTH: usize = 10;
 | 
			
		||||
| 
						 | 
				
			
			@ -921,18 +921,12 @@ pub fn create_typing_event_route(
 | 
			
		|||
    _user_id: String,
 | 
			
		||||
) -> MatrixResult<create_typing_event::Response> {
 | 
			
		||||
    let user_id = body.user_id.as_ref().expect("user is authenticated");
 | 
			
		||||
    let edu = EduEvent::Typing(ruma_events::typing::TypingEvent {
 | 
			
		||||
        content: ruma_events::typing::TypingEventContent {
 | 
			
		||||
            user_ids: vec![user_id.clone()],
 | 
			
		||||
        },
 | 
			
		||||
        room_id: None, // None because it can be inferred
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    if body.typing {
 | 
			
		||||
        db.rooms
 | 
			
		||||
            .edus
 | 
			
		||||
            .roomactive_add(
 | 
			
		||||
                edu,
 | 
			
		||||
                &user_id,
 | 
			
		||||
                &body.room_id,
 | 
			
		||||
                body.timeout.map(|d| d.as_millis() as u64).unwrap_or(30000)
 | 
			
		||||
                    + utils::millis_since_unix_epoch().try_into().unwrap_or(0),
 | 
			
		||||
| 
						 | 
				
			
			@ -940,7 +934,10 @@ pub fn create_typing_event_route(
 | 
			
		|||
            )
 | 
			
		||||
            .unwrap();
 | 
			
		||||
    } else {
 | 
			
		||||
        db.rooms.edus.roomactive_remove(edu, &body.room_id).unwrap();
 | 
			
		||||
        db.rooms
 | 
			
		||||
            .edus
 | 
			
		||||
            .roomactive_remove(&user_id, &body.room_id, &db.globals)
 | 
			
		||||
            .unwrap();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    MatrixResult(Ok(create_typing_event::Response))
 | 
			
		||||
| 
						 | 
				
			
			@ -2083,30 +2080,23 @@ pub fn sync_route(
 | 
			
		|||
        let mut edus = db
 | 
			
		||||
            .rooms
 | 
			
		||||
            .edus
 | 
			
		||||
            .roomactives_all(&room_id)
 | 
			
		||||
            .roomlatests_since(&room_id, since)
 | 
			
		||||
            .unwrap()
 | 
			
		||||
            .map(|r| r.unwrap())
 | 
			
		||||
            .collect::<Vec<_>>();
 | 
			
		||||
 | 
			
		||||
        if edus.is_empty() {
 | 
			
		||||
            edus.push(
 | 
			
		||||
                EduEvent::Typing(ruma_events::typing::TypingEvent {
 | 
			
		||||
                    content: ruma_events::typing::TypingEventContent {
 | 
			
		||||
                        user_ids: Vec::new(),
 | 
			
		||||
                    },
 | 
			
		||||
                    room_id: None, // None because it can be inferred
 | 
			
		||||
                })
 | 
			
		||||
                .into(),
 | 
			
		||||
            );
 | 
			
		||||
        if db
 | 
			
		||||
            .rooms
 | 
			
		||||
            .edus
 | 
			
		||||
            .last_roomactive_update(&room_id, &db.globals)
 | 
			
		||||
            .unwrap()
 | 
			
		||||
            > since
 | 
			
		||||
        {
 | 
			
		||||
            edus.push(serde_json::from_str(&serde_json::to_string(
 | 
			
		||||
                &EduEvent::Typing(db.rooms.edus.roomactives_all(&room_id).unwrap()),
 | 
			
		||||
            ).unwrap()).unwrap());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        edus.extend(
 | 
			
		||||
            db.rooms
 | 
			
		||||
                .edus
 | 
			
		||||
                .roomlatests_since(&room_id, since)
 | 
			
		||||
                .unwrap()
 | 
			
		||||
                .map(|r| r.unwrap()),
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        joined_rooms.insert(
 | 
			
		||||
            room_id.clone().try_into().unwrap(),
 | 
			
		||||
            sync_events::JoinedRoom {
 | 
			
		||||
| 
						 | 
				
			
			@ -2173,7 +2163,17 @@ pub fn sync_route(
 | 
			
		|||
            .map(|r| r.unwrap())
 | 
			
		||||
            .collect::<Vec<_>>();
 | 
			
		||||
 | 
			
		||||
        edus.extend(db.rooms.edus.roomactives_all(&room_id).map(|r| r.unwrap()));
 | 
			
		||||
        if db
 | 
			
		||||
            .rooms
 | 
			
		||||
            .edus
 | 
			
		||||
            .last_roomactive_update(&room_id, &db.globals)
 | 
			
		||||
            .unwrap()
 | 
			
		||||
            > since
 | 
			
		||||
        {
 | 
			
		||||
            edus.push(serde_json::from_str(&serde_json::to_string(
 | 
			
		||||
                &EduEvent::Typing(db.rooms.edus.roomactives_all(&room_id).unwrap()),
 | 
			
		||||
            ).unwrap()).unwrap());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        left_rooms.insert(
 | 
			
		||||
            room_id.clone().try_into().unwrap(),
 | 
			
		||||
| 
						 | 
				
			
			@ -2324,7 +2324,6 @@ pub fn get_message_events_route(
 | 
			
		|||
 | 
			
		||||
#[get("/_matrix/client/r0/voip/turnServer")]
 | 
			
		||||
pub fn turn_server_route() -> MatrixResult<create_message_event::Response> {
 | 
			
		||||
    warn!("TODO: turn_server_route");
 | 
			
		||||
    MatrixResult(Err(Error {
 | 
			
		||||
        kind: ErrorKind::NotFound,
 | 
			
		||||
        message: "There is no turn server yet.".to_owned(),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue