use crate::{peers_get_for_node, BundleID, BundlePack, DtnPeer, PeerAddress, RoutingNotifcation};
use bp7::{Bundle, EndpointID};
use serde::{Deserialize, Serialize};
use std::collections::{BTreeMap, HashMap};
pub mod processing;
pub mod ws_client;
#[derive(Serialize, Deserialize, Clone)]
#[serde(tag = "type")]
pub enum Packet {
RequestSenderForBundle(RequestSenderForBundle),
ResponseSenderForBundle(ResponseSenderForBundle),
Error(Error),
Timeout(Timeout),
SendingFailed(SendingFailed),
SendingSucceeded(SendingSucceeded),
IncomingBundle(IncomingBundle),
IncomingBundleWithoutPreviousNode(IncomingBundleWithoutPreviousNode),
EncounteredPeer(EncounteredPeer),
DroppedPeer(DroppedPeer),
PeerState(PeerState),
ServiceState(ServiceState),
ServiceAdd(AddService),
}
impl From<RoutingNotifcation> for Packet {
fn from(notification: RoutingNotifcation) -> Self {
match notification {
RoutingNotifcation::SendingFailed(bid, cla_sender) => {
Packet::SendingFailed(SendingFailed { bid, cla_sender })
}
RoutingNotifcation::SendingSucceeded(bid, cla_sender) => {
Packet::SendingSucceeded(SendingSucceeded { bid, cla_sender })
}
RoutingNotifcation::IncomingBundle(bndl) => {
Packet::IncomingBundle(IncomingBundle { bndl })
}
RoutingNotifcation::IncomingBundleWithoutPreviousNode(bid, node_name) => {
Packet::IncomingBundleWithoutPreviousNode(IncomingBundleWithoutPreviousNode {
bid,
node_name,
})
}
RoutingNotifcation::EncounteredPeer(eid) => Packet::EncounteredPeer(EncounteredPeer {
name: eid.node().unwrap(),
eid: eid.clone(),
peer: peers_get_for_node(&eid).unwrap(),
}),
RoutingNotifcation::DroppedPeer(eid) => Packet::DroppedPeer(DroppedPeer {
name: eid.node().unwrap(),
eid,
}),
}
}
}
#[derive(Serialize, Deserialize, Clone)]
pub struct Sender {
pub remote: PeerAddress,
pub port: Option<u16>,
pub agent: String,
pub next_hop: EndpointID,
}
#[derive(Serialize, Deserialize, Clone)]
pub struct RequestSenderForBundle {
pub clas: Vec<String>,
pub bp: BundlePack,
}
#[derive(Serialize, Deserialize, Clone)]
pub struct Error {
pub reason: String,
}
#[derive(Serialize, Deserialize, Clone)]
pub struct ResponseSenderForBundle {
pub bp: BundlePack,
pub clas: Vec<Sender>,
pub delete_afterwards: bool,
}
#[derive(Serialize, Deserialize, Clone)]
pub struct Timeout {
pub bp: BundlePack,
}
#[derive(Serialize, Deserialize, Clone)]
pub struct SendingFailed {
pub bid: BundleID,
pub cla_sender: String,
}
#[derive(Serialize, Deserialize, Clone)]
pub struct SendingSucceeded {
pub bid: BundleID,
pub cla_sender: String,
}
#[derive(Serialize, Deserialize, Clone)]
pub struct IncomingBundle {
pub bndl: Bundle,
}
#[derive(Serialize, Deserialize, Clone)]
pub struct IncomingBundleWithoutPreviousNode {
pub bid: BundleID,
pub node_name: String,
}
#[derive(Serialize, Deserialize, Clone)]
pub struct EncounteredPeer {
pub name: String,
pub eid: EndpointID,
pub peer: DtnPeer,
}
#[derive(Serialize, Deserialize, Clone)]
pub struct DroppedPeer {
pub name: String,
pub eid: EndpointID,
}
#[derive(Serialize, Deserialize, Clone)]
pub struct PeerState {
pub peers: BTreeMap<String, DtnPeer>,
}
#[derive(Serialize, Deserialize, Clone)]
pub struct AddService {
pub tag: u8,
pub service: String,
}
#[derive(Serialize, Deserialize, Clone)]
pub struct ServiceState {
pub service_list: HashMap<u8, String>,
}