TCPClient

Struct TCPClient 

Source
pub struct TCPClient { /* private fields */ }
Available on (crate features clients or servers) and crate feature clients only.
Expand description

A generic TCP client that can handle connections to multiple TCP Servers.

This client allows for connecting to many servers all at once, or creating a real “TCP Server” that allows people to connect to it (for SDIO). Because of the weirdness of our SDIO client, and the hooks for scientists this client ends up accepting a lot of parameters, see the module documentation for more information.

Implementations§

Source§

impl TCPClient

Source

pub fn new( service_name: &'static str, guard: impl Into<NagleGuard>, nagle_hooks: (Option<&'static dyn PreNagleFnTy>, Option<&'static dyn PostNagleFnTy>), trace_io_during_debug: bool, ) -> Self

Construct a new TCP Client.

This TCP client will by default not connect to anything/listen to any ports. Instead you will have to call TCPClient::connect, and TCPClient::bind manually to setup connections.

Remember the default TCPClient::send, and TCPClient::receive will only return responses to the “primary” connection (whichever connection has the oldest connection). That is unless you call TCPClient::set_primary_stream.

Source

pub const fn set_cat_dev_slowdown(&mut self, slowdown: Option<Duration>)

Set the slowdown to before sending bytes from this server.

Source

pub const fn should_keep_all_responses(&mut self)

Mark that this client should keep all responses (e.g. those from the non active upstreams).

Source

pub const fn set_keep_all_responses(&mut self, keep: bool)

Set directly whether or not this client should keep all responses.

Source

pub fn set_primary_stream(&mut self, stream_id: u64)

Set the primary stream to receive responses from.

Source

pub const fn chunk_output_at_size(&self) -> Option<usize>

Source

pub const fn set_chunk_output_at_size(&mut self, new_size: Option<usize>)

Source

pub const fn slowloris_timeout(&self) -> Duration

Source

pub const fn set_slowloris_timeout(&mut self, slowloris_timeout: Duration)

Source

pub const fn on_stream_begin( &self, ) -> Option<&UnderlyingOnStreamBeginService<()>>

Source

pub fn set_raw_on_stream_begin( &mut self, on_start: Option<UnderlyingOnStreamBeginService<()>>, ) -> Result<(), CommonNetAPIError>

Set a hook to run when a stream has been created.

This is what happens when a new machine connects. So it may also be refered to as “on connect”. This assumes you’re assigning a service that already exists and is in the raw storage type, you may want to look into Self::set_on_stream_begin, or Self::set_on_stream_begin_service.

§Errors

If the stream beginning hook has already been registered. If you’re looking to perform multiple actions at once, look into layer-ing.

Source

pub fn set_on_stream_begin<HandlerTy, HandlerParamsTy>( &mut self, handler: HandlerTy, ) -> Result<(), CommonNetAPIError>
where HandlerParamsTy: Send + 'static, HandlerTy: OnRequestStreamBeginHandler<HandlerParamsTy, ()> + Clone + Send + 'static,

Set a function hook to run when a stream has been created.

This is what happens when a new machine connects. So it may also be refered to as “on connect”. This assumes you’re assigning a function to on stream begin otherwise use Self::set_raw_on_stream_begin, or Self::set_on_stream_begin_service.

§Errors

If the stream beginning hook has already been registered. If you’re looking to perform multiple actions at once, look into layer-ing.

Source

pub fn set_on_stream_begin_service<ServiceTy>( &mut self, service_ty: ServiceTy, ) -> Result<(), CommonNetAPIError>
where ServiceTy: Clone + Send + Service<RequestStreamEvent<()>, Response = bool, Error = CatBridgeError> + 'static, ServiceTy::Future: Send + 'static,

Set a function hook to run when a stream has been created.

This is what happens when a new machine connects. So it may also be refered to as “on connect”. This assumes you’re assigning a Service to on stream begin otherwise use Self::set_raw_on_stream_begin, or Self::set_on_stream_begin.

§Errors

If the stream beginning hook has already been registered. If you’re looking to perform multiple actions at once, look into layer-ing.

Source

pub fn layer_on_stream_begin<LayerTy, ServiceTy>( &mut self, layer: LayerTy, ) -> Result<(), CommonNetAPIError>
where LayerTy: Layer<UnderlyingOnStreamBeginService<()>, Service = ServiceTy>, ServiceTy: Service<RequestStreamEvent<()>, Response = bool, Error = CatBridgeError> + Clone + Send + 'static, <LayerTy::Service as Service<RequestStreamEvent<()>>>::Future: Send + 'static,

Add a layer to the service to process when a stream begins, or a new connection is created.

§Errors

If there is no on stream begin handler that is currently active.

Source

pub const fn on_stream_end(&self) -> Option<&UnderlyingOnStreamEndService<()>>

Source

pub fn set_raw_on_stream_end( &mut self, on_end: Option<UnderlyingOnStreamEndService<()>>, ) -> Result<(), CommonNetAPIError>

Set a hook to run when a stream is being destroyed.

This is what happens when a machine disconnects. So it may also be refered to as “on disconnect”. This assumes you’re assigning a service that already exists and is in the raw storage type, you may want to look into Self::set_on_stream_end, or Self::set_on_stream_end_service.

§Errors

If the stream ending hook has already been registered. If you’re looking to perform multiple actions at once, look into layer-ing.

Source

pub fn set_on_stream_end<HandlerTy, HandlerParamsTy>( &mut self, handler: HandlerTy, ) -> Result<(), CommonNetAPIError>
where HandlerParamsTy: Send + 'static, HandlerTy: OnRequestStreamEndHandler<HandlerParamsTy, ()> + Clone + Send + 'static,

Set a function hook to run when a stream is being destroyed.

This is what happens when a machine disconnects. So it may also be refered to as “on disconnect”. This assumes you’re assigning a function to on stream end otherwise use Self::set_raw_on_stream_end, or Self::set_on_stream_end_service.

§Errors

If the stream ending hook has already been registered. If you’re looking to perform multiple actions at once, look into layer-ing.

Source

pub fn set_on_stream_end_service<ServiceTy>( &mut self, service_ty: ServiceTy, ) -> Result<(), CommonNetAPIError>
where ServiceTy: Clone + Send + Service<RequestStreamEvent<()>, Response = (), Error = CatBridgeError> + 'static, ServiceTy::Future: Send + 'static,

Set a function hook to run when a stream is being destroyed.

This is what happens when a machine disconnects. So it may also be refered to as “on disconnect”. This assumes you’re assigning a Service to on stream end otherwise use Self::set_raw_on_stream_end, or Self::set_on_stream_end.

§Errors

If the stream beginning hook has already been registered. If you’re looking to perform multiple actions at once, look into layer-ing.

Source

pub fn layer_on_stream_end<LayerTy, ServiceTy>( &mut self, layer: LayerTy, ) -> Result<(), CommonNetAPIError>
where LayerTy: Layer<UnderlyingOnStreamEndService<()>, Service = ServiceTy>, ServiceTy: Service<RequestStreamEvent<()>, Response = (), Error = CatBridgeError> + Clone + Send + 'static, <LayerTy::Service as Service<RequestStreamEvent<()>>>::Future: Send + 'static,

Add a layer to the service to process when a stream ends, or a new connection is destroyed.

§Errors

If there is no on stream end handler that is currently active.

Source

pub async fn bind<AddrTy: ToSocketAddrs>( &self, address: AddrTy, ) -> Result<(), CatBridgeError>

“Bind” this client to listen on a specific address.

I know this is unusual for a “TCP Client”, binding is for servers? I mean who exactly would be binding to an address as a client? However, certain protocols used for PCFS & the like are “reverse”. E.g. the pc the server connects to the “client” the MION listening on a server.

TCP Servers also have a “connect” method for this very reason.

§Errors

If we cannot spin up a server to listen on this host. This doesn’t mean someone is connected, just that we’re listening. You may want to use: TCPClient::wait_for_connection.

Source

pub async fn wait_for_connection(&self)

This will be an async function that will not return until at least one server has connected to our client.

Source

pub async fn connect<AddrTy: ToSocketAddrs>( &self, address: AddrTy, ) -> Result<u64, CatBridgeError>

Connect to a new server as a raw TCP client.

This method will return the stream id to use for later requests to specific streams.

§Errors

If we can’t connect to the remote TCP Server completing the three way handshake, or if we the stream begin handler returns an error/failure of some kind.

Source

pub async fn send<ErrorTy: Debug, BodyTy: TryInto<Bytes, Error = ErrorTy>>( &self, body: BodyTy, wait_for_response_timeout: Option<Duration>, ) -> Result<(u64, RequestID, Option<Response>), NetworkError>

Send a series of bytes over the wire potentially receiving responses back.

This will always only take the response from the ‘primary server’. Even if other servers respond first or at all. It will always be the primary response.

If you want to truly access all the client streams at once use Self::broadcast_send to send to all, and receive all their responses back.

This will return the stream that was used as the ‘primary’, the request-id to wait for a response later or otherwise, and the optional response if we waited for one.

§Errors

This function will error if we run into any issues writing or reading the bytes from the stream in a timely manner.

Source

pub async fn send_with_read_amount<ErrorTy: Debug, BodyTy: TryInto<Bytes, Error = ErrorTy>>( &self, body: BodyTy, wait_for_response_timeout: Option<Duration>, explicit_read_amount: usize, ) -> Result<(u64, RequestID, Option<Response>), NetworkError>

Send a series of bytes over the wire potentially receiving responses back.

This will always only take the response from the ‘primary server’. Even if other servers respond first or at all. It will always be the primary response.

If you want to truly access all the client streams at once use Self::broadcast_send to send to all, and receive all their responses back.

This will return the stream that was used as the ‘primary’, the request-id to wait for a response later or otherwise, and the optional response if we waited for one.

§Errors

This function will error if we run into any issues writing or reading the bytes from the stream in a timely manner.

Source

pub async fn broadcast_send<ErrorTy: Debug, BodyTy: TryInto<Bytes, Error = ErrorTy>>( &self, body: BodyTy, wait_for_response_timeout: Duration, ) -> Result<FnvHashMap<u64, Option<Response>>, CatBridgeError>

The equivalent of [send], but get all the responses back out of this client.

§Errors

If we timeout, or run into any sort of error sending or receiving content from a stream.

Source

pub async fn receive( &self, wait_until: Duration, ) -> Result<Option<Response>, NetworkError>

Receive a packet from the primary stream.

Used for out-of-band receiving of packets that don’t have an associated Self::send call.

§Errors

If we timeout, or have another series of failures reading bytes from our stream.

Source

pub async fn take_all_response_for_request_id( &self, request_id: &RequestID, wait_for: Duration, ) -> FnvHashMap<u64, Option<Response>>

Get all the responses for a particular request id.

In order to keep memory from ballooning up, and the fact that TCP is ordered. This API also expects to be called in an ‘ordered’ way. Previous requests that do not match the request id will be dropped.

Trait Implementations§

Source§

impl Debug for TCPClient

Source§

fn fmt(&self, fmt: &mut Formatter<'_>) -> FmtResult

Formats the value using the given formatter. Read more
Source§

impl Structable for TCPClient

Source§

fn definition(&self) -> StructDef<'_>

Returns the struct’s definition. Read more
Source§

impl Valuable for TCPClient

Source§

fn as_value(&self) -> Value<'_>

Converts self into a Value instance. Read more
Source§

fn visit(&self, visitor: &mut dyn Visit)

Calls the relevant method on Visit to extract data from self. Read more
Source§

fn visit_slice(slice: &[Self], visit: &mut dyn Visit)
where Self: Sized,

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<D> OwoColorize for D

Source§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
Source§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
Source§

fn black(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
Source§

fn on_black(&self) -> BgColorDisplay<'_, Black, Self>

Change the background color to black
Source§

fn red(&self) -> FgColorDisplay<'_, Red, Self>

Change the foreground color to red
Source§

fn on_red(&self) -> BgColorDisplay<'_, Red, Self>

Change the background color to red
Source§

fn green(&self) -> FgColorDisplay<'_, Green, Self>

Change the foreground color to green
Source§

fn on_green(&self) -> BgColorDisplay<'_, Green, Self>

Change the background color to green
Source§

fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>

Change the foreground color to yellow
Source§

fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>

Change the background color to yellow
Source§

fn blue(&self) -> FgColorDisplay<'_, Blue, Self>

Change the foreground color to blue
Source§

fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>

Change the background color to blue
Source§

fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to magenta
Source§

fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to magenta
Source§

fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to purple
Source§

fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to purple
Source§

fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>

Change the foreground color to cyan
Source§

fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>

Change the background color to cyan
Source§

fn white(&self) -> FgColorDisplay<'_, White, Self>

Change the foreground color to white
Source§

fn on_white(&self) -> BgColorDisplay<'_, White, Self>

Change the background color to white
Source§

fn default_color(&self) -> FgColorDisplay<'_, Default, Self>

Change the foreground color to the terminal default
Source§

fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>

Change the background color to the terminal default
Source§

fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>

Change the foreground color to bright black
Source§

fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>

Change the background color to bright black
Source§

fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>

Change the foreground color to bright red
Source§

fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>

Change the background color to bright red
Source§

fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>

Change the foreground color to bright green
Source§

fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>

Change the background color to bright green
Source§

fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>

Change the foreground color to bright yellow
Source§

fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>

Change the background color to bright yellow
Source§

fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>

Change the foreground color to bright blue
Source§

fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>

Change the background color to bright blue
Source§

fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright magenta
Source§

fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright magenta
Source§

fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright purple
Source§

fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright purple
Source§

fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>

Change the foreground color to bright cyan
Source§

fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>

Change the background color to bright cyan
Source§

fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>

Change the foreground color to bright white
Source§

fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>

Change the background color to bright white
Source§

fn bold(&self) -> BoldDisplay<'_, Self>

Make the text bold
Source§

fn dimmed(&self) -> DimDisplay<'_, Self>

Make the text dim
Source§

fn italic(&self) -> ItalicDisplay<'_, Self>

Make the text italicized
Source§

fn underline(&self) -> UnderlineDisplay<'_, Self>

Make the text underlined
Make the text blink
Make the text blink (but fast!)
Source§

fn reversed(&self) -> ReversedDisplay<'_, Self>

Swap the foreground and background colors
Source§

fn hidden(&self) -> HiddenDisplay<'_, Self>

Hide the text
Source§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>

Cross out the text
Source§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either OwoColorize::fg or a color-specific method, such as OwoColorize::green, Read more
Source§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either OwoColorize::bg or a color-specific method, such as OwoColorize::on_yellow, Read more
Source§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
Source§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
Source§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
Source§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
Source§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,