base: Store the sync token.

master
Damir Jelić 2021-01-01 14:44:24 +01:00
parent d121a856c4
commit 4d7da05b90
3 changed files with 53 additions and 64 deletions

View File

@ -289,11 +289,12 @@ impl BaseClient {
}; };
let session = Arc::new(RwLock::new(None)); let session = Arc::new(RwLock::new(None));
let store = Store::new(session.clone(), store); let sync_token = Arc::new(RwLock::new(None));
let store = Store::new(session.clone(), sync_token.clone(), store);
Ok(BaseClient { Ok(BaseClient {
session, session,
sync_token: RwLock::new(None).into(), sync_token,
store, store,
#[cfg(feature = "encryption")] #[cfg(feature = "encryption")]
olm: Mutex::new(None).into(), olm: Mutex::new(None).into(),
@ -707,7 +708,7 @@ impl BaseClient {
} }
} }
let mut changes = StateChanges::default(); let mut changes = StateChanges::new(response.next_batch.clone());
let mut rooms = Rooms::default(); let mut rooms = Rooms::default();
for (room_id, new_info) in response.rooms.join { for (room_id, new_info) in response.rooms.join {

View File

@ -68,19 +68,25 @@ impl Room {
) -> Self { ) -> Self {
let room_id = Arc::new(room_id.clone()); let room_id = Arc::new(room_id.clone());
let room_info = RoomInfo {
room_id,
room_type,
notification_counts: Default::default(),
summary: Default::default(),
members_synced: false,
last_prev_batch: None,
base_info: BaseRoomInfo::new(),
};
Self::restore(own_user_id, store, room_info)
}
pub fn restore(own_user_id: &UserId, store: SledStore, room_info: RoomInfo) -> Self {
Self { Self {
own_user_id: Arc::new(own_user_id.clone()), own_user_id: Arc::new(own_user_id.clone()),
room_id: room_id.clone(), room_id: room_info.room_id.clone(),
store, store,
inner: Arc::new(SyncRwLock::new(RoomInfo { inner: Arc::new(SyncRwLock::new(room_info)),
room_id,
room_type,
notification_counts: Default::default(),
summary: Default::default(),
members_synced: false,
last_prev_batch: None,
base_info: BaseRoomInfo::new(),
})),
} }
} }

View File

@ -27,15 +27,21 @@ use crate::{
pub struct Store { pub struct Store {
inner: SledStore, inner: SledStore,
session: Arc<RwLock<Option<Session>>>, session: Arc<RwLock<Option<Session>>>,
sync_token: Arc<RwLock<Option<String>>>,
rooms: Arc<DashMap<RoomId, Room>>, rooms: Arc<DashMap<RoomId, Room>>,
stripped_rooms: Arc<DashMap<RoomId, StrippedRoom>>, stripped_rooms: Arc<DashMap<RoomId, StrippedRoom>>,
} }
impl Store { impl Store {
pub fn new(session: Arc<RwLock<Option<Session>>>, inner: SledStore) -> Self { pub fn new(
session: Arc<RwLock<Option<Session>>>,
sync_token: Arc<RwLock<Option<String>>>,
inner: SledStore,
) -> Self {
Self { Self {
inner, inner,
session, session,
sync_token,
rooms: DashMap::new().into(), rooms: DashMap::new().into(),
stripped_rooms: DashMap::new().into(), stripped_rooms: DashMap::new().into(),
} }
@ -43,13 +49,11 @@ impl Store {
pub fn open_default(path: impl AsRef<Path>) -> Self { pub fn open_default(path: impl AsRef<Path>) -> Self {
let inner = SledStore::open_with_path(path); let inner = SledStore::open_with_path(path);
Self::new(
Self { Arc::new(RwLock::new(None)),
Arc::new(RwLock::new(None)),
inner, inner,
session: Arc::new(RwLock::new(None)), )
rooms: DashMap::new().into(),
stripped_rooms: DashMap::new().into(),
}
} }
pub(crate) fn get_bare_room(&self, room_id: &RoomId) -> Option<Room> { pub(crate) fn get_bare_room(&self, room_id: &RoomId) -> Option<Room> {
@ -141,6 +145,7 @@ pub struct SledStore {
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct StateChanges { pub struct StateChanges {
pub sync_token: Option<String>,
pub session: Option<Session>, pub session: Option<Session>,
pub account_data: BTreeMap<String, AnyBasicEvent>, pub account_data: BTreeMap<String, AnyBasicEvent>,
pub presence: BTreeMap<UserId, PresenceEvent>, pub presence: BTreeMap<UserId, PresenceEvent>,
@ -157,6 +162,13 @@ pub struct StateChanges {
} }
impl StateChanges { impl StateChanges {
pub fn new(sync_token: String) -> Self {
Self {
sync_token: Some(sync_token),
..Default::default()
}
}
pub fn add_presence_event(&mut self, event: PresenceEvent) { pub fn add_presence_event(&mut self, event: PresenceEvent) {
self.presence.insert(event.sender.clone(), event); self.presence.insert(event.sender.clone(), event);
} }
@ -205,15 +217,6 @@ impl StateChanges {
} }
} }
impl From<Session> for StateChanges {
fn from(session: Session) -> Self {
Self {
session: Some(session),
..Default::default()
}
}
}
impl SledStore { impl SledStore {
fn open_helper(db: Db) -> Self { fn open_helper(db: Db) -> Self {
let session = db.open_tree("session").unwrap(); let session = db.open_tree("session").unwrap();
@ -277,6 +280,13 @@ impl SledStore {
.map(|f| String::from_utf8_lossy(&f).to_string()) .map(|f| String::from_utf8_lossy(&f).to_string())
} }
pub async fn get_sync_token(&self) -> Option<String> {
self.session
.get("sync_token")
.unwrap()
.map(|t| String::from_utf8_lossy(&t).to_string())
}
pub async fn save_changes(&self, changes: &StateChanges) { pub async fn save_changes(&self, changes: &StateChanges) {
let now = SystemTime::now(); let now = SystemTime::now();
@ -303,7 +313,7 @@ impl SledStore {
profiles, profiles,
joined, joined,
invited, invited,
summaries, rooms,
state, state,
room_account_data, room_account_data,
presence, presence,
@ -311,8 +321,8 @@ impl SledStore {
stripped_members, stripped_members,
stripped_state, stripped_state,
)| { )| {
if let Some(s) = &changes.session { if let Some(s) = &changes.sync_token {
session.insert("session", serde_json::to_vec(s).unwrap())?; session.insert("sync_token", s.as_str())?;
} }
for (room, events) in &changes.members { for (room, events) in &changes.members {
@ -381,9 +391,8 @@ impl SledStore {
} }
} }
for (room_id, summary) in &changes.room_infos { for (room_id, room_info) in &changes.room_infos {
summaries rooms.insert(room_id.as_bytes(), serde_json::to_vec(room_info).unwrap())?;
.insert(room_id.as_bytes(), serde_json::to_vec(summary).unwrap())?;
} }
for (sender, event) in &changes.presence { for (sender, event) in &changes.presence {
@ -500,13 +509,6 @@ impl SledStore {
.map(|r| serde_json::from_slice(&r.unwrap().1).unwrap()), .map(|r| serde_json::from_slice(&r.unwrap().1).unwrap()),
) )
} }
pub fn get_session(&self) -> Option<Session> {
self.session
.get("session")
.unwrap()
.map(|s| serde_json::from_slice(&s).unwrap())
}
} }
#[cfg(test)] #[cfg(test)]
@ -518,21 +520,17 @@ mod test {
room::member::{MemberEventContent, MembershipState}, room::member::{MemberEventContent, MembershipState},
Unsigned, Unsigned,
}, },
identifiers::{room_id, user_id, DeviceIdBox, EventId, UserId}, identifiers::{room_id, user_id, EventId, UserId},
}; };
use matrix_sdk_test::async_test; use matrix_sdk_test::async_test;
use super::{SledStore, StateChanges}; use super::{SledStore, StateChanges};
use crate::{responses::MemberEvent, Session}; use crate::responses::MemberEvent;
fn user_id() -> UserId { fn user_id() -> UserId {
user_id!("@example:localhost") user_id!("@example:localhost")
} }
fn device_id() -> DeviceIdBox {
"DEVICEID".into()
}
fn membership_event() -> MemberEvent { fn membership_event() -> MemberEvent {
let content = MemberEventContent { let content = MemberEventContent {
avatar_url: None, avatar_url: None,
@ -553,22 +551,6 @@ mod test {
} }
} }
#[async_test]
async fn test_session_saving() {
let session = Session {
user_id: user_id(),
device_id: device_id(),
access_token: "TEST_TOKEN".to_owned(),
};
let store = SledStore::open();
store.save_changes(&session.clone().into()).await;
let stored_session = store.get_session().unwrap();
assert_eq!(session, stored_session);
}
#[async_test] #[async_test]
async fn test_member_saving() { async fn test_member_saving() {
let store = SledStore::open(); let store = SledStore::open();