base_client: Move the session behind a lock.

This commit is contained in:
Damir Jelić 2020-05-06 14:27:53 +02:00
parent 967544bab9
commit 3a30d53437
3 changed files with 14 additions and 11 deletions

View file

@ -300,9 +300,7 @@ impl AsyncClient {
/// Is the client logged in.
pub async fn logged_in(&self) -> bool {
// TODO turn this into a atomic bool so this method doesn't need to be
// async.
self.base_client.read().await.logged_in()
self.base_client.read().await.logged_in().await
}
/// The Homeserver of the client.
@ -806,8 +804,9 @@ impl AsyncClient {
let request_builder = if Request::METADATA.requires_authentication {
let client = self.base_client.read().await;
let session = client.session.read().await;
if let Some(ref session) = client.session {
if let Some(session) = session.as_ref() {
request_builder.bearer_auth(&session.access_token)
} else {
return Err(Error::AuthenticationRequired);

View file

@ -66,7 +66,7 @@ pub type Token = String;
pub struct Client {
/// The current client session containing our user id, device id and access
/// token.
pub session: Option<Session>,
pub session: Arc<RwLock<Option<Session>>>,
/// The current sync token that should be used for the next sync call.
pub sync_token: Arc<RwLock<Option<Token>>>,
/// A map of the rooms our user is joined in.
@ -118,7 +118,7 @@ impl Client {
};
Ok(Client {
session,
session: Arc::new(RwLock::new(session)),
sync_token: Arc::new(RwLock::new(None)),
joined_rooms: Arc::new(RwLock::new(HashMap::new())),
ignored_users: Arc::new(RwLock::new(Vec::new())),
@ -132,8 +132,10 @@ impl Client {
}
/// Is the client logged in.
pub fn logged_in(&self) -> bool {
self.session.is_some()
pub async fn logged_in(&self) -> bool {
// TODO turn this into a atomic bool so this method doesn't need to be
// async.
self.session.read().await.is_some()
}
/// Add `EventEmitter` to `Client`.
@ -153,7 +155,7 @@ impl Client {
/// Returns `true` when a state store sync has successfully completed.
pub(crate) async fn sync_with_state_store(&mut self) -> Result<bool> {
if let Some(store) = self.state_store.as_ref() {
if let Some(sess) = self.session.as_ref() {
if let Some(sess) = self.session.read().await.as_ref() {
if let Some(client_state) = store.load_client_state(sess).await? {
let ClientState {
sync_token,
@ -198,7 +200,7 @@ impl Client {
device_id: response.device_id.clone(),
user_id: response.user_id.clone(),
};
self.session = Some(session);
*self.session.write().await = Some(session);
#[cfg(feature = "encryption")]
{
@ -236,6 +238,8 @@ impl Client {
room_id,
&self
.session
.read()
.await
.as_ref()
.expect("Receiving events while not being logged in")
.user_id,

View file

@ -290,7 +290,7 @@ mod test {
let base_client = client.base_client.read().await;
// assert the synced client and the logged in client are equal
assert_eq!(base_client.session, Some(session));
assert_eq!(*base_client.session.read().await, Some(session));
assert_eq!(
base_client.sync_token().await,
Some("s526_47314_0_7_1_1_1_11444_1".to_string())