atm0s_sdn_network/features/pubsub/
mod.rs1use 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>;