pub mod req;
pub mod resp;
mod errors;
pub use self::errors::IpcError;
pub use self::req::{
AppExchangeInfo, AuthReq, ContainersReq, IpcReq, Permission, ShareMData, ShareMDataReq,
};
pub use self::resp::{
access_container_enc_key, AccessContInfo, AccessContainerEntry, AppKeys, AuthGranted, IpcResp,
};
use data_encoding::BASE32_NOPAD;
#[cfg(any(test, feature = "testing"))]
use ffi_utils;
use maidsafe_utilities::serialisation::{deserialise, serialise};
use quic_p2p::NodeInfo;
use rand::{self, Rng};
use serde::{Deserialize, Serialize};
use std::collections::HashSet;
use std::u32;
pub type BootstrapConfig = HashSet<NodeInfo>;
#[allow(clippy::large_enum_variant)]
#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub enum IpcMsg {
Req {
req_id: u32,
req: IpcReq,
},
Resp {
req_id: u32,
resp: IpcResp,
},
Revoked {
app_id: String,
},
Err(IpcError),
}
pub fn encode_msg(msg: &IpcMsg) -> Result<String, IpcError> {
let msg = (msg, cfg!(feature = "mock-network"));
Ok(format!("b{}", BASE32_NOPAD.encode(&serialise(&msg)?)))
}
#[cfg(any(test, feature = "testing"))]
pub fn encode_msg_64(msg: &IpcMsg) -> Result<String, IpcError> {
Ok(ffi_utils::base64_encode(&serialise(msg)?))
}
pub fn decode_msg(encoded: &str) -> Result<IpcMsg, IpcError> {
let mut chars = encoded.chars();
let decoded = match chars.next().ok_or(IpcError::InvalidMsg)? {
'b' | 'B' => BASE32_NOPAD.decode(chars.as_str().as_bytes())?,
_ => return Err(IpcError::EncodeDecodeError),
};
let (msg, mock): (IpcMsg, bool) = deserialise(&decoded)?;
if mock ^ cfg!(feature = "mock-network") {
return Err(IpcError::IncompatibleMockStatus);
}
Ok(msg)
}
#[cfg(any(test, feature = "testing"))]
pub fn decode_msg_64(encoded: &str) -> Result<IpcMsg, IpcError> {
Ok(deserialise(
&ffi_utils::base64_decode(encoded).map_err(|_| IpcError::EncodeDecodeError)?,
)?)
}
pub fn gen_req_id() -> u32 {
rand::thread_rng().gen_range(0, u32::MAX) + 1
}