use std::{
net::SocketAddr,
sync::{Arc, RwLock},
};
use opcua_types::status_code::StatusCode;
use crate::session::SessionManager;
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum TransportState {
New,
WaitingHello,
ProcessMessages,
Finished(StatusCode),
}
pub trait Transport {
fn state(&self) -> TransportState;
fn has_received_hello(&self) -> bool {
!matches!(
self.state(),
TransportState::New | TransportState::WaitingHello
)
}
fn finish(&mut self, status_code: StatusCode);
fn is_finished(&self) -> bool {
matches!(self.state(), TransportState::Finished(_))
}
fn client_address(&self) -> Option<SocketAddr>;
fn session_manager(&self) -> Arc<RwLock<SessionManager>>;
}