Merge branch 'state-reviews' into messages
commit
178c6c06f8
|
@ -48,7 +48,7 @@ use crate::api;
|
||||||
use crate::base_client::Client as BaseClient;
|
use crate::base_client::Client as BaseClient;
|
||||||
use crate::models::Room;
|
use crate::models::Room;
|
||||||
use crate::session::Session;
|
use crate::session::Session;
|
||||||
use crate::state::{ClientState, StateStore};
|
use crate::state::StateStore;
|
||||||
use crate::VERSION;
|
use crate::VERSION;
|
||||||
use crate::{Error, EventEmitter, Result};
|
use crate::{Error, EventEmitter, Result};
|
||||||
|
|
||||||
|
@ -674,7 +674,6 @@ impl AsyncClient {
|
||||||
for mut event in &mut room.timeline.events {
|
for mut event in &mut room.timeline.events {
|
||||||
let decrypted_event = {
|
let decrypted_event = {
|
||||||
let mut client = self.base_client.write().await;
|
let mut client = self.base_client.write().await;
|
||||||
let mut timeline_update = false;
|
|
||||||
let (decrypt_ev, timeline_update) = client
|
let (decrypt_ev, timeline_update) = client
|
||||||
.receive_joined_timeline_event(room_id, &mut event)
|
.receive_joined_timeline_event(room_id, &mut event)
|
||||||
.await;
|
.await;
|
||||||
|
@ -748,12 +747,6 @@ impl AsyncClient {
|
||||||
let mut client = self.base_client.write().await;
|
let mut client = self.base_client.write().await;
|
||||||
client.receive_sync_response(&mut response, updated).await?;
|
client.receive_sync_response(&mut response, updated).await?;
|
||||||
|
|
||||||
if updated {
|
|
||||||
if let Some(store) = client.state_store.as_ref() {
|
|
||||||
let state = ClientState::from_base_client(&client);
|
|
||||||
store.store_client_state(state).await?;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok(response)
|
Ok(response)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -148,27 +148,16 @@ impl Client {
|
||||||
|
|
||||||
/// When a client is provided the state store will load state from the `StateStore`.
|
/// When a client is provided the state store will load state from the `StateStore`.
|
||||||
///
|
///
|
||||||
/// Returns `true` when a sync has successfully completed.
|
/// Returns `true` when a state store sync has successfully completed.
|
||||||
pub(crate) async fn sync_with_state_store(&mut self) -> Result<bool> {
|
pub(crate) async fn sync_with_state_store(&mut self) -> Result<bool> {
|
||||||
if let Some(store) = self.state_store.as_ref() {
|
if let Some(store) = self.state_store.as_ref() {
|
||||||
if let Some(sess) = self.session.as_ref() {
|
if let Some(sess) = self.session.as_ref() {
|
||||||
if let Some(client_state) = store.load_client_state(sess).await? {
|
if let Some(client_state) = store.load_client_state(sess).await? {
|
||||||
let ClientState {
|
let ClientState {
|
||||||
user_id,
|
|
||||||
device_id,
|
|
||||||
sync_token,
|
sync_token,
|
||||||
ignored_users,
|
ignored_users,
|
||||||
push_ruleset,
|
push_ruleset,
|
||||||
} = client_state;
|
} = client_state;
|
||||||
|
|
||||||
if let Some(sess) = self.session.as_mut() {
|
|
||||||
if let Some(device) = device_id {
|
|
||||||
sess.device_id = device;
|
|
||||||
}
|
|
||||||
if let Some(user) = user_id {
|
|
||||||
sess.user_id = user;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
self.sync_token = sync_token;
|
self.sync_token = sync_token;
|
||||||
self.ignored_users = ignored_users;
|
self.ignored_users = ignored_users;
|
||||||
self.push_ruleset = push_ruleset;
|
self.push_ruleset = push_ruleset;
|
||||||
|
|
|
@ -22,7 +22,7 @@ use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::base_client::{Client as BaseClient, Token};
|
use crate::base_client::{Client as BaseClient, Token};
|
||||||
use crate::events::push_rules::Ruleset;
|
use crate::events::push_rules::Ruleset;
|
||||||
use crate::identifiers::{DeviceId, RoomId, UserId};
|
use crate::identifiers::{RoomId, UserId};
|
||||||
use crate::{Result, Room, Session};
|
use crate::{Result, Room, Session};
|
||||||
|
|
||||||
/// `ClientState` holds all the information to restore a `BaseClient`
|
/// `ClientState` holds all the information to restore a `BaseClient`
|
||||||
|
@ -33,10 +33,6 @@ use crate::{Result, Room, Session};
|
||||||
/// when needed in `StateStore::load/store_client_state`
|
/// when needed in `StateStore::load/store_client_state`
|
||||||
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
|
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
|
||||||
pub struct ClientState {
|
pub struct ClientState {
|
||||||
/// The `UserId` for the current logged in user.
|
|
||||||
pub user_id: Option<UserId>,
|
|
||||||
/// The `DeviceId` of the current logged in user.
|
|
||||||
pub device_id: Option<DeviceId>,
|
|
||||||
/// The current sync token that should be used for the next sync call.
|
/// The current sync token that should be used for the next sync call.
|
||||||
pub sync_token: Option<Token>,
|
pub sync_token: Option<Token>,
|
||||||
/// A list of ignored users.
|
/// A list of ignored users.
|
||||||
|
@ -48,15 +44,12 @@ pub struct ClientState {
|
||||||
impl ClientState {
|
impl ClientState {
|
||||||
pub fn from_base_client(client: &BaseClient) -> ClientState {
|
pub fn from_base_client(client: &BaseClient) -> ClientState {
|
||||||
let BaseClient {
|
let BaseClient {
|
||||||
session,
|
|
||||||
sync_token,
|
sync_token,
|
||||||
ignored_users,
|
ignored_users,
|
||||||
push_ruleset,
|
push_ruleset,
|
||||||
..
|
..
|
||||||
} = client;
|
} = client;
|
||||||
Self {
|
Self {
|
||||||
user_id: session.as_ref().map(|s| s.user_id.clone()),
|
|
||||||
device_id: session.as_ref().map(|s| s.device_id.clone()),
|
|
||||||
sync_token: sync_token.clone(),
|
sync_token: sync_token.clone(),
|
||||||
ignored_users: ignored_users.clone(),
|
ignored_users: ignored_users.clone(),
|
||||||
push_ruleset: push_ruleset.clone(),
|
push_ruleset: push_ruleset.clone(),
|
||||||
|
@ -97,14 +90,12 @@ mod test {
|
||||||
let room = Room::new(&id, &user);
|
let room = Room::new(&id, &user);
|
||||||
|
|
||||||
let state = ClientState {
|
let state = ClientState {
|
||||||
user_id: Some(user.clone()),
|
|
||||||
device_id: None,
|
|
||||||
sync_token: Some("hello".into()),
|
sync_token: Some("hello".into()),
|
||||||
ignored_users: vec![user],
|
ignored_users: vec![user],
|
||||||
push_ruleset: None,
|
push_ruleset: None,
|
||||||
};
|
};
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
r#"{"user_id":"@example:example.com","device_id":null,"sync_token":"hello","ignored_users":["@example:example.com"],"push_ruleset":null}"#,
|
r#"{"sync_token":"hello","ignored_users":["@example:example.com"],"push_ruleset":null}"#,
|
||||||
serde_json::to_string(&state).unwrap()
|
serde_json::to_string(&state).unwrap()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -146,8 +137,6 @@ mod test {
|
||||||
let room = Room::new(&id, &user);
|
let room = Room::new(&id, &user);
|
||||||
|
|
||||||
let state = ClientState {
|
let state = ClientState {
|
||||||
user_id: Some(user.clone()),
|
|
||||||
device_id: None,
|
|
||||||
sync_token: Some("hello".into()),
|
sync_token: Some("hello".into()),
|
||||||
ignored_users: vec![user],
|
ignored_users: vec![user],
|
||||||
push_ruleset: None,
|
push_ruleset: None,
|
||||||
|
|
|
@ -84,12 +84,6 @@ impl StateStore for JsonStore {
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn store_client_state(&self, state: ClientState) -> Result<()> {
|
async fn store_client_state(&self, state: ClientState) -> Result<()> {
|
||||||
if !self.user_path_set.load(Ordering::SeqCst) {
|
|
||||||
if let Some(user) = &state.user_id {
|
|
||||||
self.user_path_set.swap(true, Ordering::SeqCst);
|
|
||||||
self.path.write().await.push(user.localpart())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let mut path = self.path.read().await.clone();
|
let mut path = self.path.read().await.clone();
|
||||||
path.push("client.json");
|
path.push("client.json");
|
||||||
|
|
||||||
|
@ -193,18 +187,19 @@ mod test {
|
||||||
device_id: "Tester".to_string(),
|
device_id: "Tester".to_string(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let store = JsonStore::open(path).unwrap();
|
|
||||||
|
|
||||||
let state = ClientState {
|
let state = ClientState {
|
||||||
user_id: Some(user.clone()),
|
|
||||||
device_id: None,
|
|
||||||
sync_token: Some("hello".into()),
|
sync_token: Some("hello".into()),
|
||||||
ignored_users: vec![user],
|
ignored_users: vec![user],
|
||||||
push_ruleset: None,
|
push_ruleset: None,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let mut path_with_user = PathBuf::from(path);
|
||||||
|
path_with_user.push(sess.user_id.localpart());
|
||||||
|
// we have to set the path since `JsonStore::store_client_state()` doesn't append to the path
|
||||||
|
let store = JsonStore::open(path_with_user).unwrap();
|
||||||
store.store_client_state(state.clone()).await.unwrap();
|
store.store_client_state(state.clone()).await.unwrap();
|
||||||
|
|
||||||
|
// the newly loaded store sets it own user_id local part when `load_client_state`
|
||||||
let store = JsonStore::open(path).unwrap();
|
let store = JsonStore::open(path).unwrap();
|
||||||
let loaded = store.load_client_state(&sess).await.unwrap();
|
let loaded = store.load_client_state(&sess).await.unwrap();
|
||||||
assert_eq!(loaded, Some(state));
|
assert_eq!(loaded, Some(state));
|
||||||
|
|
Loading…
Reference in New Issue