use zenoh_config::{wrappers::ZenohId, WhatAmI};
#[cfg(feature = "unstable")]
use zenoh_core::{Resolve, ResolveClosure};
use zenoh_link::LinkAuthId;
use zenoh_protocol::core::{Locator, Reliability};
use zenoh_transport::TransportPeer;
#[cfg(feature = "unstable")]
use crate::api::builders::info_links::{LinkEventsListenerBuilder, LinksBuilder};
#[cfg(feature = "unstable")]
use crate::api::builders::info_transport::{TransportEventsListenerBuilder, TransportsBuilder};
#[cfg(feature = "unstable")]
use crate::api::handlers::DefaultHandler;
use crate::api::{
builders::info::{PeersZenohIdBuilder, RoutersZenohIdBuilder, ZenohIdBuilder},
handlers::CallbackParameter,
sample::SampleKind,
session::WeakSession,
};
pub struct SessionInfo {
pub(crate) session: WeakSession,
}
impl SessionInfo {
pub fn zid(&self) -> ZenohIdBuilder<'_> {
ZenohIdBuilder::new(self.session.runtime())
}
pub fn routers_zid(&self) -> RoutersZenohIdBuilder<'_> {
RoutersZenohIdBuilder::new(self.session.runtime())
}
pub fn peers_zid(&self) -> PeersZenohIdBuilder<'_> {
PeersZenohIdBuilder::new(self.session.runtime())
}
#[zenoh_macros::unstable]
pub fn locators(&self) -> impl Resolve<Vec<Locator>> + '_ {
ResolveClosure::new(|| self.session.runtime().get_locators())
}
#[zenoh_macros::unstable]
pub fn transports(&self) -> TransportsBuilder<'_> {
TransportsBuilder::new(self.session.runtime())
}
#[zenoh_macros::unstable]
pub fn links(&self) -> LinksBuilder<'_> {
LinksBuilder::new(&self.session)
}
#[zenoh_macros::unstable]
pub fn transport_events_listener(&self) -> TransportEventsListenerBuilder<'_, DefaultHandler> {
TransportEventsListenerBuilder::new(&self.session)
}
#[zenoh_macros::unstable]
pub fn link_events_listener(&self) -> LinkEventsListenerBuilder<'_, DefaultHandler> {
LinkEventsListenerBuilder::new(&self.session)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Transport {
pub(crate) zid: ZenohId,
pub(crate) whatami: WhatAmI,
pub(crate) is_qos: bool,
pub(crate) is_multicast: bool,
#[cfg(feature = "shared-memory")]
pub(crate) is_shm: bool,
}
impl Transport {
pub(crate) fn new(peer: &TransportPeer, is_multicast: bool) -> Self {
Transport {
zid: peer.zid.into(),
whatami: peer.whatami,
is_qos: peer.is_qos,
is_multicast,
#[cfg(feature = "shared-memory")]
is_shm: peer.is_shm,
}
}
#[zenoh_macros::internal]
pub fn empty() -> Self {
Transport {
zid: ZenohId::default(),
whatami: WhatAmI::default(),
is_qos: false,
is_multicast: false,
#[cfg(feature = "shared-memory")]
is_shm: false,
}
}
#[zenoh_macros::internal]
pub fn new_from_fields(
zid: ZenohId,
whatami: WhatAmI,
is_qos: bool,
is_multicast: bool,
#[cfg(feature = "shared-memory")] is_shm: bool,
) -> Self {
Transport {
zid,
whatami,
is_qos,
is_multicast,
#[cfg(feature = "shared-memory")]
is_shm,
}
}
}
#[cfg(feature = "unstable")]
impl Transport {
#[inline]
pub fn zid(&self) -> &ZenohId {
&self.zid
}
#[inline]
pub fn whatami(&self) -> WhatAmI {
self.whatami
}
#[inline]
pub fn is_qos(&self) -> bool {
self.is_qos
}
#[cfg(feature = "shared-memory")]
#[inline]
pub fn is_shm(&self) -> bool {
self.is_shm
}
#[inline]
pub fn is_multicast(&self) -> bool {
self.is_multicast
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Link {
pub(crate) zid: ZenohId,
pub(crate) src: Locator,
pub(crate) dst: Locator,
pub(crate) group: Option<Locator>,
pub(crate) mtu: u16,
pub(crate) is_streamed: bool,
pub(crate) interfaces: Vec<String>,
pub(crate) auth_identifier: Option<String>,
pub(crate) priorities: Option<(u8, u8)>,
pub(crate) reliability: Option<Reliability>,
}
impl Link {
pub(crate) fn new(zid: ZenohId, link: &zenoh_link_commons::Link, is_qos: bool) -> Self {
let auth_identifier = match &link.auth_identifier {
LinkAuthId::Tls(Some(s)) | LinkAuthId::Quic(Some(s)) => Some(s.clone()),
LinkAuthId::Tls(None)
| LinkAuthId::Quic(None)
| LinkAuthId::Tcp
| LinkAuthId::Udp
| LinkAuthId::Serial
| LinkAuthId::Unixpipe
| LinkAuthId::UnixsockStream
| LinkAuthId::Vsock
| LinkAuthId::Ws => None, };
let priorities = if is_qos {
link.priorities
.as_deref()
.map(|p| (*p.start() as u8, *p.end() as u8))
.or(Some((
zenoh_protocol::core::Priority::MAX as u8,
zenoh_protocol::core::Priority::MIN as u8,
)))
} else {
None
};
let reliability = if is_qos {
Some(link.reliability.unwrap_or_else(|| {
let inspector = zenoh_link::LocatorInspector::default();
if inspector.is_reliable(&link.src).unwrap_or(false)
&& inspector.is_reliable(&link.dst).unwrap_or(false)
{
Reliability::Reliable
} else {
Reliability::BestEffort
}
}))
} else {
None
};
Link {
zid,
src: link.src.clone(),
dst: link.dst.clone(),
group: link.group.clone(),
mtu: link.mtu,
is_streamed: link.is_streamed,
interfaces: link.interfaces.clone(),
auth_identifier,
priorities,
reliability,
}
}
#[zenoh_macros::internal]
pub fn empty() -> Self {
Link {
zid: ZenohId::default(),
src: Locator::empty(),
dst: Locator::empty(),
group: None,
mtu: 0,
is_streamed: false,
interfaces: Vec::new(),
auth_identifier: None,
priorities: None,
reliability: None,
}
}
}
#[cfg(feature = "unstable")]
impl Link {
#[inline]
pub fn zid(&self) -> &ZenohId {
&self.zid
}
#[inline]
pub fn src(&self) -> &Locator {
&self.src
}
#[inline]
pub fn dst(&self) -> &Locator {
&self.dst
}
#[inline]
pub fn group(&self) -> Option<&Locator> {
self.group.as_ref()
}
#[inline]
pub fn mtu(&self) -> u16 {
self.mtu
}
#[inline]
pub fn is_streamed(&self) -> bool {
self.is_streamed
}
#[inline]
pub fn interfaces(&self) -> &[String] {
&self.interfaces
}
#[inline]
pub fn auth_identifier(&self) -> Option<&str> {
self.auth_identifier.as_deref()
}
#[inline]
pub fn priorities(&self) -> Option<(u8, u8)> {
self.priorities
}
#[inline]
pub fn reliability(&self) -> Option<Reliability> {
self.reliability
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TransportEvent {
pub(crate) kind: SampleKind, pub(crate) transport: Transport,
}
impl TransportEvent {
#[zenoh_macros::internal]
pub fn empty() -> Self {
TransportEvent {
kind: SampleKind::Put,
transport: Transport::empty(),
}
}
}
#[cfg(feature = "unstable")]
impl TransportEvent {
pub fn kind(&self) -> SampleKind {
self.kind
}
pub fn transport(&self) -> &Transport {
&self.transport
}
pub fn transport_mut(&mut self) -> &mut Transport {
&mut self.transport
}
}
impl CallbackParameter for TransportEvent {
type Message<'a> = Self;
fn from_message(msg: Self::Message<'_>) -> Self {
msg
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct LinkEvent {
pub(crate) kind: SampleKind, pub(crate) link: Link,
}
impl LinkEvent {
#[zenoh_macros::internal]
pub fn empty() -> Self {
LinkEvent {
kind: SampleKind::Put,
link: Link::empty(),
}
}
}
#[cfg(feature = "unstable")]
impl LinkEvent {
pub fn kind(&self) -> SampleKind {
self.kind
}
pub fn link(&self) -> &Link {
&self.link
}
pub fn link_mut(&mut self) -> &mut Link {
&mut self.link
}
}
impl CallbackParameter for LinkEvent {
type Message<'a> = Self;
fn from_message(msg: Self::Message<'_>) -> Self {
msg
}
}
#[cfg(all(test, feature = "internal"))]
mod tests {
use zenoh_protocol::core::WhatAmI;
use super::*;
#[test]
fn test_new_from_fields_equals_new_from_peer() {
let peer = TransportPeer {
zid: ZenohId::default().into(),
whatami: WhatAmI::Router,
is_qos: true,
#[cfg(feature = "shared-memory")]
is_shm: false,
links: vec![],
region_name: None,
};
let via_new = Transport::new(&peer, false);
let via_fields = Transport::new_from_fields(
peer.zid.into(),
peer.whatami,
peer.is_qos,
false,
#[cfg(feature = "shared-memory")]
peer.is_shm,
);
assert_eq!(via_new, via_fields);
}
}