dtn7/core/
application_agent.rs

1use bp7::{Bundle, EndpointID};
2use enum_dispatch::enum_dispatch;
3use log::{debug, trace};
4use std::collections::VecDeque;
5use std::fmt::Debug;
6use tokio::sync::mpsc::Sender;
7
8use crate::dtnd::ws::BundleDelivery;
9use crate::store_remove_if_singleton_bundle;
10//use crate::dtnd::ws::WsAASession;
11
12#[enum_dispatch]
13#[derive(Debug)]
14pub enum ApplicationAgentEnum {
15    SimpleApplicationAgent,
16}
17
18#[enum_dispatch(ApplicationAgentEnum)]
19pub trait ApplicationAgent: Debug {
20    fn eid(&self) -> &EndpointID;
21    fn push(&mut self, bundle: &Bundle);
22    fn pop(&mut self) -> Option<Bundle>;
23    fn set_delivery_addr(&mut self, addr: Sender<BundleDelivery>);
24    fn clear_delivery_addr(&mut self);
25    fn delivery_addr(&self) -> Option<Sender<BundleDelivery>>;
26}
27
28#[derive(Debug, Clone)]
29pub struct SimpleApplicationAgent {
30    eid: EndpointID,
31    bundles: VecDeque<Bundle>,
32    delivery: Option<Sender<BundleDelivery>>,
33}
34
35impl ApplicationAgent for SimpleApplicationAgent {
36    fn eid(&self) -> &EndpointID {
37        &self.eid
38    }
39    fn push(&mut self, bundle: &Bundle) {
40        debug!("Received {:?} | {:?}", bundle.id(), bp7::dtn_time_now());
41        trace!("Received raw: {:?}", bundle);
42
43        // attempt direct delivery to websocket
44        if let Some(addr) = self.delivery_addr() {
45            // TODO: remove clone and work with reference
46
47            if addr.try_send(BundleDelivery(bundle.clone())).is_err() {
48                self.bundles.push_back(bundle.clone());
49            } else {
50                store_remove_if_singleton_bundle(bundle);
51            }
52        } else {
53            // save in temp buffer for delivery
54            self.bundles.push_back(bundle.clone());
55        }
56    }
57    fn pop(&mut self) -> Option<Bundle> {
58        let bundle = self.bundles.pop_front();
59        if let Some(bndl) = bundle.as_ref() {
60            store_remove_if_singleton_bundle(bndl);
61        };
62        bundle
63    }
64
65    fn set_delivery_addr(&mut self, addr: Sender<BundleDelivery>) {
66        self.delivery = Some(addr);
67    }
68
69    fn clear_delivery_addr(&mut self) {
70        self.delivery = None;
71    }
72
73    fn delivery_addr(&self) -> Option<Sender<BundleDelivery>> {
74        self.delivery.clone()
75    }
76}
77
78impl SimpleApplicationAgent {
79    pub fn with(eid: EndpointID) -> SimpleApplicationAgent {
80        SimpleApplicationAgent {
81            eid,
82            bundles: VecDeque::new(),
83            delivery: None,
84        }
85    }
86}