extern crate time;
pub struct Client {
routing_client: ::routing_client::RoutingClient,
receiver: ::std::sync::mpsc::Receiver<::event::Event>,
id: ::id::Id,
}
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 id = ::id::Id::with_keys(sign_keys.clone(), encrypt_keys.clone());
let public_id = ::public_id::PublicId::new(&id);
let routing_client = ::routing_client::RoutingClient::new(sender, Some(id));
debug!("Client name {:?}", public_id.clone());
Client {
routing_client: routing_client,
receiver: receiver,
id: ::id::Id::with_keys(sign_keys, encrypt_keys),
}
}
pub fn get(&mut self, request: ::data::DataRequest) -> Option<::data::Data> {
debug!("Get request from Client for {:?}", request);
self.routing_client.get_request(
::authority::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() {
debug!("Client received routing event: {:?}", event);
match event {
::event::Event::Response{ response, our_authority: _, from_authority : _} => {
match response {
::messages::ExternalResponse::Get(data, _, _) => {
debug!("Client received data {:?} for get request.", data);
debug!("Get took {:?} to arrive.",
::time::SteadyTime::now() - time);
return Some(data);
},
_ => debug!("Received unexpected external response {:?},", response),
};
},
_ => {},
};
break;
}
if time + timeout < ::time::SteadyTime::now() {
debug!("Timed out waiting for data");
return None;
}
::std::thread::sleep_ms(10);
}
}
pub fn put(&self, data: ::data::Data) {
debug!("Put request from Client for {:?}", data);
self.routing_client.put_request(::authority::Authority::ClientManager(self.name()), data);
}
pub fn name(&self) -> ::NameType {
self.id.name()
}
}