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::{AuthGranted, IpcResp};
use bincode::{deserialize, serialize};
use data_encoding::BASE32_NOPAD;
#[cfg(any(test, feature = "testing"))]
use rand::{self};
use serde::{Deserialize, Serialize};
use std::{collections::HashSet, net::SocketAddr, u32};
pub type BootstrapConfig = HashSet<SocketAddr>;
#[allow(clippy::large_enum_variant)]
#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub enum IpcMsg {
Req {
req_id: u32,
request: IpcReq,
},
Resp {
req_id: u32,
response: 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(&serialize(&msg)?)))
}
#[cfg(any(test, feature = "testing"))]
pub fn encode_msg_64(msg: &IpcMsg) -> Result<String, IpcError> {
Ok(ffi_utils::base64_encode(&serialize(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) = deserialize(&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(deserialize(
&ffi_utils::base64_decode(encoded).map_err(|_| IpcError::EncodeDecodeError)?,
)?)
}
pub fn gen_req_id() -> u32 {
use rand::Rng;
rand::thread_rng().gen_range(0, u32::max_value()) + 1
}