use routing_client::RoutingClient;
use authority::Authority;
use messages::ResponseContent;
use xor_name::XorName;
pub struct Client {
routing_client: ::routing_client::RoutingClient,
receiver: ::std::sync::mpsc::Receiver<::event::Event>,
full_id: ::id::FullId,
}
impl Client {
pub fn new() -> Client {
let (sender, receiver) = ::std::sync::mpsc::channel::<::event::Event>();
let sign_keys = ::sodiumoxide::crypto::sign::gen_keypair();
let encrypt_keys = ::sodiumoxide::crypto::box_::gen_keypair();
let full_id = ::id::FullId::with_keys(encrypt_keys.clone(), sign_keys.clone());
let routing_client = unwrap_result!(RoutingClient::new(sender, Some(full_id)));
Client {
routing_client: routing_client,
receiver: receiver,
full_id: ::id::FullId::with_keys(encrypt_keys, sign_keys),
}
}
pub fn get(&mut self, request: ::data::DataRequest) -> Option<::data::Data> {
debug!("Get request from Client for {:?}", request);
unwrap_result!(self.routing_client.send_get_request(Authority::NaeManager(request.name()),
request.clone()));
let timeout = ::time::Duration::milliseconds(10000);
let time = ::time::SteadyTime::now();
loop {
while let Ok(event) = self.receiver.try_recv() {
if let ::event::Event::Response(msg) = event {
match msg.content {
ResponseContent::GetSuccess(data) => return Some(data),
ResponseContent::GetFailure { .. } => return None,
_ => debug!("Received unexpected external response {:?},", msg),
};
}
break;
}
if time + timeout < ::time::SteadyTime::now() {
debug!("Timed out waiting for data");
return None;
}
let interval = ::std::time::Duration::from_millis(10);
::std::thread::sleep(interval);
}
}
pub fn put(&self, data: ::data::Data) {
debug!("Put request from Client for {:?}", data);
unwrap_result!(self.routing_client
.send_put_request(Authority::ClientManager(*self.name()), data));
}
pub fn name(&self) -> &XorName {
self.full_id.public_id().name()
}
}