use sodiumoxide;
use std::sync::mpsc;
use std::thread::spawn;
use id::Id;
use action::Action;
use event::Event;
use routing_node::RoutingNode;
use data::{Data, DataRequest};
use error::RoutingError;
use authority::Authority;
use messages::{ExternalRequest, Content};
type RoutingResult = Result<(), RoutingError>;
#[derive(Clone)]
pub struct RoutingClient {
action_sender: mpsc::Sender<Action>,
get_counter: u8,
}
impl RoutingClient {
pub fn new(event_sender: mpsc::Sender<Event>, keys: Option<Id>) -> RoutingClient {
sodiumoxide::init();
let (action_sender, action_receiver) = mpsc::channel::<Action>();
let mut routing_node =
RoutingNode::new(action_sender.clone(), action_receiver, event_sender, true, keys);
let _ = spawn(move || {
debug!("Started routing client run().");
routing_node.run();
debug!("Routing client node terminated running.");
});
RoutingClient { action_sender: action_sender, get_counter: 0u8 }
}
pub fn get_request(&mut self, location: Authority, data_request: DataRequest) {
self.get_counter = self.get_counter.wrapping_add(1);
let _ = self.action_sender.send(Action::ClientSendContent(
location,
Content::ExternalRequest(
ExternalRequest::Get(data_request, self.get_counter))));
}
pub fn put_request(&self, location: Authority, data: Data) {
debug!("Received put request from Client for {:?}", data);
let _ = self.action_sender.send(Action::ClientSendContent(
location,
Content::ExternalRequest(ExternalRequest::Put(data))));
}
pub fn post_request(&self, location: Authority, data: Data) {
let _ = self.action_sender.send(Action::ClientSendContent(
location,
Content::ExternalRequest(ExternalRequest::Post(data))));
}
pub fn delete_request(&self, location: Authority, data: Data) {
let _ = self.action_sender.send(Action::ClientSendContent(
location,
Content::ExternalRequest(ExternalRequest::Delete(data))));
}
pub fn stop(&mut self) {
let _ = self.action_sender.send(Action::Terminate);
}
}