steamkit/networking/steam3/
i_connection.rs1use std::net::{IpAddr, SocketAddr};
15use std::sync::Arc;
16use std::time::Duration;
17
18use async_trait::async_trait;
19use bytes::Bytes;
20use parking_lot::Mutex;
21use tokio::sync::{broadcast, mpsc};
22
23use crate::error::SteamError;
24
25use super::disconnected_event_args::DisconnectedEventArgs;
26use super::net_msg_event_args::NetMsgEventArgs;
27use super::protocol_type::ProtocolTypes;
28
29pub const CONNECTION_EVENT_CAPACITY: usize = 64;
32
33#[async_trait]
35pub trait IConnection: Send + Sync {
36 fn current_end_point(&self) -> Option<SocketAddr>;
41
42 fn protocol_types(&self) -> ProtocolTypes;
44
45 async fn connect(&self, end_point: SocketAddr, timeout: Duration) -> Result<(), SteamError>;
47
48 async fn disconnect(&self, user_initiated: bool);
50
51 async fn send(&self, data: Bytes) -> Result<(), SteamError>;
53
54 fn local_ip(&self) -> Option<IpAddr>;
56}
57
58#[derive(Clone, Debug, PartialEq, Eq)]
60pub enum ConnectionEvent {
61 NetMsgReceived(NetMsgEventArgs),
63 Connected,
65 Disconnected(DisconnectedEventArgs),
67}
68
69pub trait ConnectionEvents: Send + Sync {
72 fn events(&self) -> mpsc::UnboundedReceiver<ConnectionEvent>;
78
79 fn net_msg_received(&self) -> broadcast::Receiver<NetMsgEventArgs>;
81
82 fn connected(&self) -> broadcast::Receiver<()>;
84
85 fn disconnected(&self) -> broadcast::Receiver<DisconnectedEventArgs>;
87}
88
89pub trait Connection: IConnection + ConnectionEvents {}
93
94impl<T> Connection for T where T: IConnection + ConnectionEvents + ?Sized {}
95
96#[derive(Clone, Debug)]
99pub struct ConnectionEventSenders {
100 net_msg_received: broadcast::Sender<NetMsgEventArgs>,
101 connected: broadcast::Sender<()>,
102 disconnected: broadcast::Sender<DisconnectedEventArgs>,
103 subscribers: Arc<Mutex<Vec<mpsc::UnboundedSender<ConnectionEvent>>>>,
107}
108
109impl ConnectionEventSenders {
110 pub fn new(capacity: usize) -> Self {
112 let (net_msg_received, _) = broadcast::channel(capacity);
113 let (connected, _) = broadcast::channel(capacity);
114 let (disconnected, _) = broadcast::channel(capacity);
115
116 Self {
117 net_msg_received,
118 connected,
119 disconnected,
120 subscribers: Arc::new(Mutex::new(Vec::new())),
121 }
122 }
123
124 pub fn with_default_capacity() -> Self {
126 Self::new(CONNECTION_EVENT_CAPACITY)
127 }
128
129 pub fn subscribe_events(&self) -> mpsc::UnboundedReceiver<ConnectionEvent> {
131 let (sender, receiver) = mpsc::unbounded_channel();
132 self.subscribers.lock().push(sender);
133 receiver
134 }
135
136 pub fn event_subscriber_count(&self) -> usize {
138 let mut subscribers = self.subscribers.lock();
139 subscribers.retain(|subscriber| !subscriber.is_closed());
140 subscribers.len()
141 }
142
143 pub fn subscribe_net_msg_received(&self) -> broadcast::Receiver<NetMsgEventArgs> {
145 self.net_msg_received.subscribe()
146 }
147
148 pub fn subscribe_connected(&self) -> broadcast::Receiver<()> {
150 self.connected.subscribe()
151 }
152
153 pub fn subscribe_disconnected(&self) -> broadcast::Receiver<DisconnectedEventArgs> {
155 self.disconnected.subscribe()
156 }
157
158 pub fn emit_net_msg_received(&self, args: NetMsgEventArgs) {
160 let mut subscribers = self.subscribers.lock();
161 if self.net_msg_received.receiver_count() > 0 {
162 let _ = self.net_msg_received.send(args.clone());
163 }
164 publish(&mut subscribers, ConnectionEvent::NetMsgReceived(args));
165 }
166
167 pub fn emit_connected(&self) {
169 let mut subscribers = self.subscribers.lock();
170 let _ = self.connected.send(());
171 publish(&mut subscribers, ConnectionEvent::Connected);
172 }
173
174 pub fn emit_disconnected(&self, args: DisconnectedEventArgs) {
176 let mut subscribers = self.subscribers.lock();
177 let _ = self.disconnected.send(args);
178 publish(&mut subscribers, ConnectionEvent::Disconnected(args));
179 }
180}
181
182fn publish(subscribers: &mut Vec<mpsc::UnboundedSender<ConnectionEvent>>, event: ConnectionEvent) {
185 if let [only] = subscribers.as_slice() {
186 if only.send(event).is_err() {
188 subscribers.clear();
189 }
190 return;
191 }
192
193 subscribers.retain(|subscriber| subscriber.send(event.clone()).is_ok());
194}
195
196impl Default for ConnectionEventSenders {
197 fn default() -> Self {
198 Self::with_default_capacity()
199 }
200}