atm0s_sdn_network/features/pubsub/
mod.rs

1use atm0s_sdn_identity::NodeId;
2
3use crate::{
4    base::{FeatureControlActor, FeatureOutput, FeatureWorkerOutput},
5    data_plane::NetPair,
6};
7
8use self::msg::{RelayControl, RelayId, SourceHint};
9
10mod controller;
11mod msg;
12mod worker;
13
14pub use controller::PubSubFeature;
15pub use msg::{ChannelId, Feedback};
16pub use worker::PubSubFeatureWorker;
17
18pub const FEATURE_ID: u8 = 5;
19pub const FEATURE_NAME: &str = "pubsub";
20
21#[derive(Debug, Clone, PartialEq, Eq)]
22pub enum ChannelControl {
23    SubAuto,
24    FeedbackAuto(Feedback),
25    UnsubAuto,
26    SubSource(NodeId),
27    UnsubSource(NodeId),
28    PubStart,
29    PubData(Vec<u8>),
30    PubStop,
31}
32
33#[derive(Debug, Clone, PartialEq, Eq)]
34pub struct Control(pub ChannelId, pub ChannelControl);
35
36#[derive(Debug, Clone, PartialEq, Eq)]
37pub enum ChannelEvent {
38    RouteChanged(NodeId),
39    SourceData(NodeId, Vec<u8>),
40    FeedbackData(Feedback),
41}
42
43#[derive(Debug, Clone, PartialEq, Eq)]
44pub struct Event(pub ChannelId, pub ChannelEvent);
45
46#[derive(Debug, Clone, PartialEq, Eq)]
47pub enum RelayWorkerControl<UserData> {
48    SendSub(u64, Option<NetPair>),
49    SendUnsub(u64, NetPair),
50    SendSubOk(u64, NetPair),
51    SendUnsubOk(u64, NetPair),
52    SendRouteChanged,
53    SendFeedback(Feedback, NetPair),
54    RouteSetSource(NetPair),
55    RouteDelSource(NetPair),
56    RouteSetLocal(FeatureControlActor<UserData>),
57    RouteDelLocal(FeatureControlActor<UserData>),
58    RouteSetRemote(NetPair, u64),
59    RouteDelRemote(NetPair),
60}
61
62impl<UserData> RelayWorkerControl<UserData> {
63    pub fn is_broadcast(&self) -> bool {
64        !matches!(
65            self,
66            RelayWorkerControl::SendSub(_, _)
67                | RelayWorkerControl::SendUnsub(_, _)
68                | RelayWorkerControl::SendSubOk(_, _)
69                | RelayWorkerControl::SendUnsubOk(_, _)
70                | RelayWorkerControl::SendRouteChanged
71        )
72    }
73}
74
75#[derive(Debug, Clone)]
76pub enum ToWorker<UserData> {
77    RelayControl(RelayId, RelayWorkerControl<UserData>),
78    SourceHint(ChannelId, Option<NetPair>, SourceHint),
79    RelayData(RelayId, Vec<u8>),
80}
81
82#[derive(Debug, Clone)]
83pub enum ToController {
84    RelayControl(NetPair, RelayId, RelayControl),
85    SourceHint(NetPair, ChannelId, SourceHint),
86}
87
88pub type Output<UserData> = FeatureOutput<UserData, Event, ToWorker<UserData>>;
89pub type WorkerOutput<UserData> = FeatureWorkerOutput<UserData, Control, Event, ToController>;