Merge pull request #16 from jo-so/master

Update ruma client to new Tokio engine, make it thread safe
This commit is contained in:
Jonas Platte 2019-01-22 18:36:14 +01:00 committed by GitHub
commit c50f043c51
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 19 deletions

View File

@ -32,7 +32,7 @@ version = "0.2.2"
[dev-dependencies] [dev-dependencies]
ruma-events = "0.11.0" ruma-events = "0.11.0"
tokio-core = "0.1.17" tokio = "0.1"
[features] [features]
default = ["tls"] default = ["tls"]

View File

@ -9,7 +9,6 @@ use ruma_events::{
EventType, EventType,
}; };
use ruma_identifiers::RoomAliasId; use ruma_identifiers::RoomAliasId;
use tokio_core::reactor::Core;
use url::Url; use url::Url;
// from https://stackoverflow.com/a/43992218/1592377 // from https://stackoverflow.com/a/43992218/1592377
@ -66,8 +65,6 @@ fn main() {
} }
}; };
Core::new() tokio::run(hello_world(homeserver_url.parse().unwrap(), room)
.unwrap() .map_err(|e| { dbg!(e); () }));
.run(hello_world(homeserver_url.parse().unwrap(), room))
.unwrap();
} }

View File

@ -4,7 +4,7 @@
#![deny(missing_docs)] #![deny(missing_docs)]
#![feature(try_from)] #![feature(try_from)]
use std::{cell::RefCell, convert::TryInto, rc::Rc, str::FromStr}; use std::{convert::TryInto, str::FromStr, sync::{Arc, Mutex}};
use futures::{ use futures::{
future::{Future, FutureFrom, IntoFuture}, future::{Future, FutureFrom, IntoFuture},
@ -30,7 +30,7 @@ mod session;
/// A client for the Matrix client-server API. /// A client for the Matrix client-server API.
#[derive(Debug)] #[derive(Debug)]
pub struct Client<C: Connect>(Rc<ClientData<C>>); pub struct Client<C: Connect>(Arc<ClientData<C>>);
/// Data contained in Client's Rc /// Data contained in Client's Rc
#[derive(Debug)] #[derive(Debug)]
@ -40,16 +40,16 @@ where
{ {
homeserver_url: Url, homeserver_url: Url,
hyper: HyperClient<C>, hyper: HyperClient<C>,
session: RefCell<Option<Session>>, session: Mutex<Option<Session>>,
} }
impl Client<HttpConnector> { impl Client<HttpConnector> {
/// Creates a new client for making HTTP requests to the given homeserver. /// Creates a new client for making HTTP requests to the given homeserver.
pub fn new(homeserver_url: Url, session: Option<Session>) -> Self { pub fn new(homeserver_url: Url, session: Option<Session>) -> Self {
Client(Rc::new(ClientData { Client(Arc::new(ClientData {
homeserver_url, homeserver_url,
hyper: HyperClient::builder().keep_alive(true).build_http(), hyper: HyperClient::builder().keep_alive(true).build_http(),
session: RefCell::new(session), session: Mutex::new(session),
})) }))
} }
} }
@ -60,10 +60,10 @@ impl Client<HttpsConnector<HttpConnector>> {
pub fn https(homeserver_url: Url, session: Option<Session>) -> Result<Self, NativeTlsError> { pub fn https(homeserver_url: Url, session: Option<Session>) -> Result<Self, NativeTlsError> {
let connector = HttpsConnector::new(4)?; let connector = HttpsConnector::new(4)?;
Ok(Client(Rc::new(ClientData { Ok(Client(Arc::new(ClientData {
homeserver_url, homeserver_url,
hyper: { HyperClient::builder().keep_alive(true).build(connector) }, hyper: { HyperClient::builder().keep_alive(true).build(connector) },
session: RefCell::new(session), session: Mutex::new(session),
}))) })))
} }
} }
@ -80,10 +80,10 @@ where
homeserver_url: Url, homeserver_url: Url,
session: Option<Session>, session: Option<Session>,
) -> Self { ) -> Self {
Client(Rc::new(ClientData { Client(Arc::new(ClientData {
homeserver_url, homeserver_url,
hyper: hyper_client, hyper: hyper_client,
session: RefCell::new(session), session: Mutex::new(session),
})) }))
} }
@ -115,7 +115,7 @@ where
) )
.map(move |response| { .map(move |response| {
let session = Session::new(response.access_token, response.user_id, response.device_id); let session = Session::new(response.access_token, response.user_id, response.device_id);
*data.session.borrow_mut() = Some(session.clone()); *data.session.lock().unwrap() = Some(session.clone());
session session
}) })
@ -143,7 +143,7 @@ where
) )
.map(move |response| { .map(move |response| {
let session = Session::new(response.access_token, response.user_id, response.device_id); let session = Session::new(response.access_token, response.user_id, response.device_id);
*data.session.borrow_mut() = Some(session.clone()); *data.session.lock().unwrap() = Some(session.clone());
session session
}) })
@ -180,7 +180,7 @@ where
) )
.map(move |response| { .map(move |response| {
let session = Session::new(response.access_token, response.user_id, response.device_id); let session = Session::new(response.access_token, response.user_id, response.device_id);
*data.session.borrow_mut() = Some(session.clone()); *data.session.lock().unwrap() = Some(session.clone());
session session
}) })
@ -250,7 +250,7 @@ where
url.set_query(uri.query()); url.set_query(uri.query());
if E::METADATA.requires_authentication { if E::METADATA.requires_authentication {
if let Some(ref session) = *data1.session.borrow() { if let Some(ref session) = *data1.session.lock().unwrap() {
url.query_pairs_mut() url.query_pairs_mut()
.append_pair("access_token", session.access_token()); .append_pair("access_token", session.access_token());
} else { } else {