Skip to main content

zenoh_transport/
lib.rs

1//
2// Copyright (c) 2023 ZettaScale Technology
3//
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// http://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
7// which is available at https://www.apache.org/licenses/LICENSE-2.0.
8//
9// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
10//
11// Contributors:
12//   ZettaScale Zenoh Team, <zenoh@zettascale.tech>
13//
14
15//! ⚠️ WARNING ⚠️
16//!
17//! This crate is intended for Zenoh's internal use.
18//!
19//! [Click here for Zenoh's documentation](https://docs.rs/zenoh/latest/zenoh)
20pub mod common;
21pub mod manager;
22pub mod multicast;
23pub mod unicast;
24
25#[cfg(feature = "shared-memory")]
26pub mod shm;
27#[cfg(feature = "shared-memory")]
28mod shm_context;
29
30use std::{any::Any, sync::Arc};
31
32pub use manager::*;
33use serde::Serialize;
34use zenoh_link::Link;
35use zenoh_protocol::{
36    core::{WhatAmI, ZenohIdProto},
37    network::NetworkMessageMut,
38};
39use zenoh_result::ZResult;
40
41use crate::{multicast::TransportMulticast, unicast::TransportUnicast};
42
43/*************************************/
44/*            TRANSPORT              */
45/*************************************/
46pub trait TransportEventHandler: Send + Sync {
47    fn new_unicast(
48        &self,
49        peer: TransportPeer,
50        transport: TransportUnicast,
51    ) -> ZResult<Arc<dyn TransportPeerEventHandler>>;
52
53    fn new_multicast(
54        &self,
55        _transport: TransportMulticast,
56    ) -> ZResult<Arc<dyn TransportMulticastEventHandler>>;
57}
58
59#[derive(Default)]
60pub struct DummyTransportEventHandler;
61
62impl TransportEventHandler for DummyTransportEventHandler {
63    fn new_unicast(
64        &self,
65        _peer: TransportPeer,
66        _transport: TransportUnicast,
67    ) -> ZResult<Arc<dyn TransportPeerEventHandler>> {
68        Ok(Arc::new(DummyTransportPeerEventHandler))
69    }
70
71    fn new_multicast(
72        &self,
73        _transport: TransportMulticast,
74    ) -> ZResult<Arc<dyn TransportMulticastEventHandler>> {
75        Ok(Arc::new(DummyTransportMulticastEventHandler))
76    }
77}
78
79/*************************************/
80/*            MULTICAST              */
81/*************************************/
82pub trait TransportMulticastEventHandler: Send + Sync {
83    fn new_peer(&self, peer: TransportPeer) -> ZResult<Arc<dyn TransportPeerEventHandler>>;
84    fn closed(&self);
85    fn as_any(&self) -> &dyn Any;
86}
87
88// Define an empty TransportCallback for the listener transport
89#[derive(Default)]
90pub struct DummyTransportMulticastEventHandler;
91
92impl TransportMulticastEventHandler for DummyTransportMulticastEventHandler {
93    fn new_peer(&self, _peer: TransportPeer) -> ZResult<Arc<dyn TransportPeerEventHandler>> {
94        Ok(Arc::new(DummyTransportPeerEventHandler))
95    }
96    fn closed(&self) {}
97    fn as_any(&self) -> &dyn Any {
98        self
99    }
100}
101
102/*************************************/
103/*             CALLBACK              */
104/*************************************/
105#[derive(Clone, Debug, Serialize, PartialEq, Eq)]
106#[serde(rename = "Transport")]
107pub struct TransportPeer {
108    pub zid: ZenohIdProto,
109    pub whatami: WhatAmI,
110    pub is_qos: bool,
111    #[serde(skip)]
112    pub links: Vec<Link>,
113    #[cfg(feature = "shared-memory")]
114    pub is_shm: bool,
115}
116
117pub trait TransportPeerEventHandler: Send + Sync {
118    fn handle_message(&self, msg: NetworkMessageMut) -> ZResult<()>;
119    fn new_link(&self, src: Link);
120    fn del_link(&self, link: Link);
121    fn closed(&self);
122    fn as_any(&self) -> &dyn Any;
123}
124
125// Define an empty TransportCallback for the listener transport
126#[derive(Default)]
127pub struct DummyTransportPeerEventHandler;
128
129impl TransportPeerEventHandler for DummyTransportPeerEventHandler {
130    fn handle_message(&self, _message: NetworkMessageMut) -> ZResult<()> {
131        Ok(())
132    }
133
134    fn new_link(&self, _link: Link) {}
135    fn del_link(&self, _link: Link) {}
136    fn closed(&self) {}
137
138    fn as_any(&self) -> &dyn Any {
139        self
140    }
141}