use sodiumoxide;
use std::sync::mpsc;
use std::thread::spawn;
use action::Action;
use event::Event;
use messages::SignedToken;
use routing_node::RoutingNode;
use data::{Data, DataRequest};
use types::{Bytes, CacheOptions};
use error::{RoutingError, ResponseError};
use authority::Authority;
use messages::{ExternalRequest, ExternalResponse, InternalRequest, Content};
type RoutingResult = Result<(), RoutingError>;
#[derive(Clone)]
pub struct Routing {
action_sender: mpsc::Sender<Action>,
}
impl Routing {
pub fn new(event_sender: mpsc::Sender<Event>) -> Routing {
sodiumoxide::init();
let (action_sender, action_receiver) = mpsc::channel::<Action>();
let mut routing_node =
RoutingNode::new(action_sender.clone(), action_receiver, event_sender, false, None);
let _ = spawn(move || {
debug!("Started routing run().");
routing_node.run();
debug!("Routing node terminated running.");
});
Routing { action_sender: action_sender }
}
pub fn get_request(&self, our_authority: Authority, location: Authority,
data_request: DataRequest) {
let _ = self.action_sender.send(Action::SendContent(
our_authority, location,
Content::ExternalRequest(ExternalRequest::Get(data_request, 0u8))));
}
pub fn put_request(&self, our_authority: Authority, location: Authority, data: Data) {
let _ = self.action_sender.send(Action::SendContent(
our_authority, location,
Content::ExternalRequest(ExternalRequest::Put(data))));
}
pub fn post_request(&self, our_authority: Authority, location: Authority, data: Data) {
let _ = self.action_sender.send(Action::SendContent(
our_authority, location,
Content::ExternalRequest(ExternalRequest::Post(data))));
}
pub fn delete_request(&self, our_authority: Authority, location: Authority, data: Data) {
let _ = self.action_sender.send(Action::SendContent(
our_authority, location,
Content::ExternalRequest(ExternalRequest::Delete(data))));
}
pub fn get_response(&self,
our_authority: Authority,
location: Authority,
data: Data,
data_request: DataRequest,
signed_token: Option<SignedToken>) {
let _ = self.action_sender.send(Action::SendContent(
our_authority, location,
Content::ExternalResponse(
ExternalResponse::Get(data, data_request, signed_token))));
}
pub fn put_response(&self,
our_authority: Authority,
location: Authority,
response_error: ResponseError,
signed_token: Option<SignedToken>) {
if response_error == ::error::ResponseError::Abort { return; };
let _ = self.action_sender.send(Action::SendContent(
our_authority, location,
Content::ExternalResponse(
ExternalResponse::Put(response_error, signed_token))));
}
pub fn post_response(&self,
our_authority: Authority,
location: Authority,
response_error: ResponseError,
signed_token: Option<SignedToken>) {
if response_error == ::error::ResponseError::Abort { return; };
let _ = self.action_sender.send(Action::SendContent(
our_authority, location,
Content::ExternalResponse(
ExternalResponse::Post(response_error, signed_token))));
}
pub fn delete_response(&self,
our_authority: Authority,
location: Authority,
response_error: ResponseError,
signed_token: Option<SignedToken>) {
if response_error == ::error::ResponseError::Abort { return; };
let _ = self.action_sender.send(Action::SendContent(
our_authority, location,
Content::ExternalResponse(ExternalResponse::Delete(response_error,
signed_token))));
}
pub fn refresh_request(&self, type_tag: u64, our_authority: Authority, content: Bytes,
cause: ::NameType) {
if !our_authority.is_group() {
error!("refresh request (type_tag {:?}) can only be made as a group authority: {:?}",
type_tag, our_authority);
return; };
let _ = self.action_sender.send(Action::SendContent(our_authority.clone(), our_authority,
Content::InternalRequest(InternalRequest::Refresh(type_tag, content, cause))));
}
pub fn set_cache_options(&self, cache_options: CacheOptions) {
let _ = self.action_sender.send(Action::SetCacheOptions(cache_options));
}
pub fn stop(&mut self) {
let _ = self.action_sender.send(Action::Terminate);
}
}