pub struct ComHub {
pub endpoint: Endpoint,
pub options: ComHubOptions,
pub interface_factories: RefCell<HashMap<String, ComInterfaceFactoryFn>>,
pub interfaces: RefCell<HashMap<ComInterfaceUUID, (Rc<RefCell<dyn ComInterface>>, InterfacePriority)>>,
pub sockets: RefCell<HashMap<ComInterfaceSocketUUID, (Arc<Mutex<ComInterfaceSocket>>, HashSet<Endpoint>)>>,
pub endpoint_sockets_blacklist: RefCell<HashMap<Endpoint, HashSet<ComInterfaceSocketUUID>>>,
pub fallback_sockets: RefCell<Vec<(ComInterfaceSocketUUID, u16, InterfaceDirection)>>,
pub endpoint_sockets: RefCell<HashMap<Endpoint, Vec<(ComInterfaceSocketUUID, DynamicEndpointProperties)>>>,
pub block_handler: BlockHandler,
/* private fields */
}Fields§
§endpoint: Endpointthe runtime endpoint of the hub (@me)
options: ComHubOptionsComHub configuration options
interface_factories: RefCell<HashMap<String, ComInterfaceFactoryFn>>a list of all available interface factories, keyed by their interface type
interfaces: RefCell<HashMap<ComInterfaceUUID, (Rc<RefCell<dyn ComInterface>>, InterfacePriority)>>a list of all available interfaces, keyed by their UUID
sockets: RefCell<HashMap<ComInterfaceSocketUUID, (Arc<Mutex<ComInterfaceSocket>>, HashSet<Endpoint>)>>a list of all available sockets, keyed by their UUID contains the socket itself and a list of endpoints currently associated with it
endpoint_sockets_blacklist: RefCell<HashMap<Endpoint, HashSet<ComInterfaceSocketUUID>>>a blacklist of sockets that are not allowed to be used for a specific endpoint
fallback_sockets: RefCell<Vec<(ComInterfaceSocketUUID, u16, InterfaceDirection)>>fallback sockets that are used if no direct endpoint reachable socket is available sorted by priority
endpoint_sockets: RefCell<HashMap<Endpoint, Vec<(ComInterfaceSocketUUID, DynamicEndpointProperties)>>>a list of all available sockets for each endpoint, with additional DynamicEndpointProperties metadata
block_handler: BlockHandlerImplementations§
Source§impl ComHub
impl ComHub
pub fn new(endpoint: impl Into<Endpoint>) -> ComHub
pub async fn init(&self) -> Result<(), ComHubError>
Sourcepub fn register_interface_factory(
&self,
interface_type: String,
factory: ComInterfaceFactoryFn,
)
pub fn register_interface_factory( &self, interface_type: String, factory: ComInterfaceFactoryFn, )
Registers a new interface factory for a specific interface implementation. This allows the ComHub to create new instances of the interface on demand.
Sourcepub async fn create_interface(
&self,
interface_type: &str,
setup_data: ValueContainer,
priority: InterfacePriority,
) -> Result<Rc<RefCell<dyn ComInterface>>, ComHubError>
pub async fn create_interface( &self, interface_type: &str, setup_data: ValueContainer, priority: InterfacePriority, ) -> Result<Rc<RefCell<dyn ComInterface>>, ComHubError>
Creates a new interface instance using the registered factory for the specified interface type if it exists. The interface is opened and added to the ComHub.
pub fn get_interface_by_uuid<T: ComInterface>( &self, interface_uuid: &ComInterfaceUUID, ) -> Option<Rc<RefCell<T>>>
pub fn has_interface(&self, interface_uuid: &ComInterfaceUUID) -> bool
pub fn get_dyn_interface_by_uuid( &self, uuid: &ComInterfaceUUID, ) -> Option<Rc<RefCell<dyn ComInterface>>>
pub async fn open_and_add_interface( &self, interface: Rc<RefCell<dyn ComInterface>>, priority: InterfacePriority, ) -> Result<(), ComHubError>
pub fn add_interface( &self, interface: Rc<RefCell<dyn ComInterface>>, priority: InterfacePriority, ) -> Result<(), ComHubError>
Sourcepub async fn remove_interface(
&self,
interface_uuid: ComInterfaceUUID,
) -> Result<(), ComHubError>
pub async fn remove_interface( &self, interface_uuid: ComInterfaceUUID, ) -> Result<(), ComHubError>
User can proactively remove an interface from the hub. This will destroy the interface and it’s sockets (perform deep cleanup)
Sourcepub fn register_socket_endpoint(
&self,
socket: Arc<Mutex<ComInterfaceSocket>>,
endpoint: Endpoint,
distance: i8,
) -> Result<(), SocketEndpointRegistrationError>
pub fn register_socket_endpoint( &self, socket: Arc<Mutex<ComInterfaceSocket>>, endpoint: Endpoint, distance: i8, ) -> Result<(), SocketEndpointRegistrationError>
Registers a new endpoint that is reachable over the socket if the socket is not already registered, it will be added to the socket list. If the provided endpoint is not the same as the socket endpoint, it is registered as an indirect socket to the endpoint
Sourcepub async fn wait_for_update_async(&self)
pub async fn wait_for_update_async(&self)
Waits for all background tasks scheduled by the update() function to finish
This includes block flushes from flush_outgoing_blocks()
and interface (re)-connections from update_interfaces()
Sourcepub async fn update_async(&self)
pub async fn update_async(&self)
Updates all sockets and interfaces, collecting incoming data and sending out queued blocks. In contrast to the update() function, this function is asynchronous and will wait for all background tasks scheduled by the update() function to finish
Sourcepub fn _start_update_loop(self_rc: Rc<Self>)
pub fn _start_update_loop(self_rc: Rc<Self>)
Runs the update loop for the ComHub. This method will continuously handle incoming data, send out queued blocks and update the sockets. This is only used for internal tests - in a full runtime setup, the main runtime update loop triggers ComHub updates.
Sourcepub fn update(&self)
pub fn update(&self)
Update all sockets and interfaces,
collecting incoming data and sending out queued blocks.
Updates are scheduled in local tasks and are not immediately visible.
To wait for the block update to finish, use wait_for_update_async().
Sourcepub fn send_own_block(&self, block: DXBBlock) -> Result<(), Vec<Endpoint>>
pub fn send_own_block(&self, block: DXBBlock) -> Result<(), Vec<Endpoint>>
Public method to send an outgoing block from this endpoint. Called by the runtime.
Sourcepub async fn send_own_block_await_response(
&self,
block: DXBBlock,
options: ResponseOptions,
) -> Vec<Result<Response, ResponseError>>
pub async fn send_own_block_await_response( &self, block: DXBBlock, options: ResponseOptions, ) -> Vec<Result<Response, ResponseError>>
Sends a block and wait for a response block. Fix number of exact endpoints -> Expected responses are known at send time. TODO #189: make sure that mutating blocks are always send to specific endpoint instances (@jonas/0001), not generic endpoints like @jonas. @jonas -> response comes from a specific instance of @jonas/0001
Sourcepub fn send_block(
&self,
block: DXBBlock,
exclude_sockets: Vec<ComInterfaceSocketUUID>,
forked: bool,
) -> Result<(), Vec<Endpoint>>
pub fn send_block( &self, block: DXBBlock, exclude_sockets: Vec<ComInterfaceSocketUUID>, forked: bool, ) -> Result<(), Vec<Endpoint>>
Sends a block to all endpoints specified in the block header. The routing algorithm decides which sockets are used to send the block, based on the endpoint. A block can be sent to multiple endpoints at the same time over a socket or to multiple sockets for each endpoint. The original_socket parameter is used to prevent sending the block back to the sender. When this method is called, the block is queued in the send queue. Returns an Err with a list of unreachable endpoints if the block could not be sent to all endpoints.
Source§impl ComHub
impl ComHub
pub async fn record_trace( &self, endpoint: impl Into<Endpoint>, ) -> Option<NetworkTraceResult>
pub async fn record_trace_with_options( &self, options: TraceOptions, ) -> Option<NetworkTraceResult>
pub async fn record_trace_multiple( &self, endpoints: Vec<impl Into<Endpoint>>, ) -> Vec<NetworkTraceResult>
pub async fn record_trace_multiple_with_options( &self, options: TraceOptions, ) -> Vec<NetworkTraceResult>
Trait Implementations§
Auto Trait Implementations§
impl !Freeze for ComHub
impl !RefUnwindSafe for ComHub
impl !Send for ComHub
impl !Sync for ComHub
impl Unpin for ComHub
impl !UnwindSafe for ComHub
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi Quirk value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);