Struct remoc::Connect

source ·
pub struct Connect<'transport, TransportSinkError, TransportStreamError>(/* private fields */);
Available on crate feature rch only.
Expand description

Methods for establishing a connection over a physical transport.

You must poll the returned Connect future or spawn it onto a task for the connection to work.

§Physical transport

All functionality in Remoc requires that a connection over a physical transport is established. The underlying transport can either be of packet type (implementing Sink and Stream) or a socket-like object (implementing AsyncRead and AsyncWrite). In both cases it must be ordered and reliable. That means that all packets must arrive in the order they have been sent and no packets must be lost. The maximum packet size can be limited, see the configuration for that.

TCP is an example of an underlying transport that is suitable. But there are many more candidates, for example, UNIX domain sockets, pipes between processes, serial links, Bluetooth L2CAP streams, etc.

The connect functions are used to establish a base channel connection over a physical transport. Then, additional channels can be opened by sending either the sender or receiver half of them over the established base channel or another connected channel. See the examples in the remote channel module for details.

§Convenience functions

Methods from the ConnectExt trait can be used on the return values of all connect methods. They streamline connection handling when a single value, such as a RTC client, should be exchanged over the connection and the flexibility of a base channel is not necessary.

§Example

In the following example the server listens on TCP port 9875 and the client connects to it. Then both ends establish a Remoc connection using Connect::io over the TCP connection. The connection dispatchers are spawned onto new tasks and the client and server functions are called with the established base channel.

use std::net::Ipv4Addr;
use tokio::net::{TcpStream, TcpListener};
use remoc::prelude::*;

#[tokio::main]
async fn main() {
    // For demonstration we run both client and server in
    // the same process. In real life connect_client() and
    // connect_server() would run on different machines.
    futures::join!(connect_client(), connect_server());
}

// This would be run on the client.
async fn connect_client() {
    // Wait for server to be ready.
    tokio::time::sleep(std::time::Duration::from_secs(1)).await;

    // Establish TCP connection.
    let socket = TcpStream::connect((Ipv4Addr::LOCALHOST, 9875)).await.unwrap();
    let (socket_rx, socket_tx) = socket.into_split();

    // Establish Remoc connection over TCP.
    let (conn, tx, rx) =
        remoc::Connect::io(remoc::Cfg::default(), socket_rx, socket_tx).await.unwrap();
    tokio::spawn(conn);

    // Run client.
    client(tx, rx).await;
}

// This would be run on the server.
async fn connect_server() {
    // Listen for incoming TCP connection.
    let listener = TcpListener::bind((Ipv4Addr::LOCALHOST, 9875)).await.unwrap();
    let (socket, _) = listener.accept().await.unwrap();
    let (socket_rx, socket_tx) = socket.into_split();

    // Establish Remoc connection over TCP.
    let (conn, tx, rx) =
        remoc::Connect::io(remoc::Cfg::default(), socket_rx, socket_tx).await.unwrap();
    tokio::spawn(conn);

    // Run server.
    server(tx, rx).await;
}

// This would be run on the client.
async fn client(mut tx: rch::base::Sender<u16>, mut rx: rch::base::Receiver<String>) {
    tx.send(1).await.unwrap();
    assert_eq!(rx.recv().await.unwrap(), Some("1".to_string()));
}

// This would be run on the server.
async fn server(mut tx: rch::base::Sender<String>, mut rx: rch::base::Receiver<u16>) {
    while let Some(number) = rx.recv().await.unwrap() {
        tx.send(number.to_string()).await.unwrap();
    }
}

Implementations§

source§

impl<'transport, TransportSinkError, TransportStreamError> Connect<'transport, TransportSinkError, TransportStreamError>

source

pub async fn framed<TransportSink, TransportStream, Tx, Rx, Codec>( cfg: Cfg, transport_sink: TransportSink, transport_stream: TransportStream ) -> Result<(Connect<'transport, TransportSinkError, TransportStreamError>, Sender<Tx, Codec>, Receiver<Rx, Codec>), ConnectError<TransportSinkError, TransportStreamError>>
where TransportSink: Sink<Bytes, Error = TransportSinkError> + Send + Sync + Unpin + 'transport, TransportSinkError: Error + Send + Sync + 'static, TransportStream: Stream<Item = Result<Bytes, TransportStreamError>> + Send + Sync + Unpin + 'transport, TransportStreamError: Error + Send + Sync + 'static, Tx: RemoteSend, Rx: RemoteSend, Codec: Codec,

Establishes a connection over a framed transport (a sink and a stream of binary data) and returns a remote sender and receiver.

This establishes a chmux connection over the transport and opens a remote channel.

You must poll the returned Connect future or spawn it for the connection to work.

§Panics

Panics if the chmux configuration is invalid.

source§

impl<'transport> Connect<'transport, Error, Error>

source

pub async fn io<Read, Write, Tx, Rx, Codec>( cfg: Cfg, input: Read, output: Write ) -> Result<(Connect<'transport, Error, Error>, Sender<Tx, Codec>, Receiver<Rx, Codec>), ConnectError<Error, Error>>
where Read: AsyncRead + Send + Sync + Unpin + 'transport, Write: AsyncWrite + Send + Sync + Unpin + 'transport, Tx: RemoteSend, Rx: RemoteSend, Codec: Codec,

Establishes a connection over an IO transport (an AsyncRead and AsyncWrite) and returns a remote sender and receiver.

A chmux connection is established over the transport and a remote channel is opened. This prepends a length header to each chmux packet for transportation over the unframed connection.

This method performs no buffering of read and writes and thus may exhibit suboptimal performance if the underlying reader and writer are unbuffered. In this case use io_buffered instead.

You must poll the returned Connect future or spawn it for the connection to work.

§Panics

Panics if the chmux configuration is invalid.

source

pub async fn io_buffered<Read, Write, Tx, Rx, Codec>( cfg: Cfg, input: Read, output: Write, buffer: usize ) -> Result<(Connect<'transport, Error, Error>, Sender<Tx, Codec>, Receiver<Rx, Codec>), ConnectError<Error, Error>>
where Read: AsyncRead + Send + Sync + Unpin + 'transport, Write: AsyncWrite + Send + Sync + Unpin + 'transport, Tx: RemoteSend, Rx: RemoteSend, Codec: Codec,

Establishes a buffered connection over an IO transport (an AsyncRead and AsyncWrite) and returns a remote sender and receiver.

A chmux connection is established over the transport and a remote channel is opened. This prepends a length header to each chmux packet for transportation over the unframed connection.

This method performs internal buffering of reads and writes.

You must poll the returned Connect future or spawn it for the connection to work.

§Panics

Panics if the chmux configuration is invalid.

Trait Implementations§

source§

impl<'transport, TransportSinkError, TransportStreamError> Future for Connect<'transport, TransportSinkError, TransportStreamError>

§

type Output = Result<(), ChMuxError<TransportSinkError, TransportStreamError>>

Result of connection after it has been terminated.

source§

fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>

This future runs the dispatcher for this connection.

Auto Trait Implementations§

§

impl<'transport, TransportSinkError, TransportStreamError> Freeze for Connect<'transport, TransportSinkError, TransportStreamError>

§

impl<'transport, TransportSinkError, TransportStreamError> !RefUnwindSafe for Connect<'transport, TransportSinkError, TransportStreamError>

§

impl<'transport, TransportSinkError, TransportStreamError> Send for Connect<'transport, TransportSinkError, TransportStreamError>

§

impl<'transport, TransportSinkError, TransportStreamError> !Sync for Connect<'transport, TransportSinkError, TransportStreamError>

§

impl<'transport, TransportSinkError, TransportStreamError> Unpin for Connect<'transport, TransportSinkError, TransportStreamError>

§

impl<'transport, TransportSinkError, TransportStreamError> !UnwindSafe for Connect<'transport, TransportSinkError, TransportStreamError>

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> FutureExt for T
where T: Future + ?Sized,

source§

fn map<U, F>(self, f: F) -> Map<Self, F>
where F: FnOnce(Self::Output) -> U, Self: Sized,

Map this future’s output to a different type, returning a new future of the resulting type. Read more
source§

fn map_into<U>(self) -> MapInto<Self, U>
where Self::Output: Into<U>, Self: Sized,

Map this future’s output to a different type, returning a new future of the resulting type. Read more
source§

fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F>
where F: FnOnce(Self::Output) -> Fut, Fut: Future, Self: Sized,

Chain on a computation for when a future finished, passing the result of the future to the provided closure f. Read more
source§

fn left_future<B>(self) -> Either<Self, B>
where B: Future<Output = Self::Output>, Self: Sized,

Wrap this future in an Either future, making it the left-hand variant of that Either. Read more
source§

fn right_future<A>(self) -> Either<A, Self>
where A: Future<Output = Self::Output>, Self: Sized,

Wrap this future in an Either future, making it the right-hand variant of that Either. Read more
source§

fn into_stream(self) -> IntoStream<Self>
where Self: Sized,

Convert this future into a single element stream. Read more
source§

fn flatten(self) -> Flatten<Self>
where Self::Output: Future, Self: Sized,

Flatten the execution of this future when the output of this future is itself another future. Read more
source§

fn flatten_stream(self) -> FlattenStream<Self>
where Self::Output: Stream, Self: Sized,

Flatten the execution of this future when the successful result of this future is a stream. Read more
source§

fn fuse(self) -> Fuse<Self>
where Self: Sized,

Fuse a future such that poll will never again be called once it has completed. This method can be used to turn any Future into a FusedFuture. Read more
source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where F: FnOnce(&Self::Output), Self: Sized,

Do something with the output of a future before passing it on. Read more
source§

fn catch_unwind(self) -> CatchUnwind<Self>
where Self: Sized + UnwindSafe,

Catches unwinding panics while polling the future. Read more
source§

fn shared(self) -> Shared<Self>
where Self: Sized, Self::Output: Clone,

Create a cloneable handle to this future where all handles will resolve to the same result. Read more
source§

fn remote_handle(self) -> (Remote<Self>, RemoteHandle<Self::Output>)
where Self: Sized,

Turn this future into a future that yields () on completion and sends its output to another future on a separate task. Read more
source§

fn boxed<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + Send + 'a>>
where Self: Sized + Send + 'a,

Wrap the future in a Box, pinning it. Read more
source§

fn boxed_local<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + 'a>>
where Self: Sized + 'a,

Wrap the future in a Box, pinning it. Read more
source§

fn unit_error(self) -> UnitError<Self>
where Self: Sized,

source§

fn never_error(self) -> NeverError<Self>
where Self: Sized,

source§

fn poll_unpin(&mut self, cx: &mut Context<'_>) -> Poll<Self::Output>
where Self: Unpin,

A convenience for calling Future::poll on Unpin future types.
source§

fn now_or_never(self) -> Option<Self::Output>
where Self: Sized,

Evaluates and consumes the future, returning the resulting output if the future is ready after the first call to Future::poll. Read more
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<F> IntoFuture for F
where F: Future,

§

type Output = <F as Future>::Output

The output that the future will produce on completion.
§

type IntoFuture = F

Which kind of future are we turning this into?
source§

fn into_future(self) -> <F as IntoFuture>::IntoFuture

Creates a future from a value. Read more
source§

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

§

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<F, T, E> TryFuture for F
where F: Future<Output = Result<T, E>> + ?Sized,

§

type Ok = T

The type of successful values yielded by this future
§

type Error = E

The type of failures yielded by this future
source§

fn try_poll( self: Pin<&mut F>, cx: &mut Context<'_> ) -> Poll<<F as Future>::Output>

Poll this TryFuture as if it were a Future. Read more
source§

impl<Fut> TryFutureExt for Fut
where Fut: TryFuture + ?Sized,

source§

fn flatten_sink<Item>(self) -> FlattenSink<Self, Self::Ok>
where Self::Ok: Sink<Item, Error = Self::Error>, Self: Sized,

Flattens the execution of this future when the successful result of this future is a Sink. Read more
source§

fn map_ok<T, F>(self, f: F) -> MapOk<Self, F>
where F: FnOnce(Self::Ok) -> T, Self: Sized,

Maps this future’s success value to a different value. Read more
source§

fn map_ok_or_else<T, E, F>(self, e: E, f: F) -> MapOkOrElse<Self, F, E>
where F: FnOnce(Self::Ok) -> T, E: FnOnce(Self::Error) -> T, Self: Sized,

Maps this future’s success value to a different value, and permits for error handling resulting in the same type. Read more
source§

fn map_err<E, F>(self, f: F) -> MapErr<Self, F>
where F: FnOnce(Self::Error) -> E, Self: Sized,

Maps this future’s error value to a different value. Read more
source§

fn err_into<E>(self) -> ErrInto<Self, E>
where Self: Sized, Self::Error: Into<E>,

Maps this future’s Error to a new error type using the Into trait. Read more
source§

fn ok_into<U>(self) -> OkInto<Self, U>
where Self: Sized, Self::Ok: Into<U>,

Maps this future’s Ok to a new type using the Into trait.
source§

fn and_then<Fut, F>(self, f: F) -> AndThen<Self, Fut, F>
where F: FnOnce(Self::Ok) -> Fut, Fut: TryFuture<Error = Self::Error>, Self: Sized,

Executes another future after this one resolves successfully. The success value is passed to a closure to create this subsequent future. Read more
source§

fn or_else<Fut, F>(self, f: F) -> OrElse<Self, Fut, F>
where F: FnOnce(Self::Error) -> Fut, Fut: TryFuture<Ok = Self::Ok>, Self: Sized,

Executes another future if this one resolves to an error. The error value is passed to a closure to create this subsequent future. Read more
source§

fn inspect_ok<F>(self, f: F) -> InspectOk<Self, F>
where F: FnOnce(&Self::Ok), Self: Sized,

Do something with the success value of a future before passing it on. Read more
source§

fn inspect_err<F>(self, f: F) -> InspectErr<Self, F>
where F: FnOnce(&Self::Error), Self: Sized,

Do something with the error value of a future before passing it on. Read more
source§

fn try_flatten(self) -> TryFlatten<Self, Self::Ok>
where Self::Ok: TryFuture<Error = Self::Error>, Self: Sized,

Flatten the execution of this future when the successful result of this future is another future. Read more
source§

fn try_flatten_stream(self) -> TryFlattenStream<Self>
where Self::Ok: TryStream<Error = Self::Error>, Self: Sized,

Flatten the execution of this future when the successful result of this future is a stream. Read more
source§

fn unwrap_or_else<F>(self, f: F) -> UnwrapOrElse<Self, F>
where Self: Sized, F: FnOnce(Self::Error) -> Self::Ok,

Unwraps this future’s output, producing a future with this future’s Ok type as its Output type. Read more
source§

fn into_future(self) -> IntoFuture<Self>
where Self: Sized,

Wraps a TryFuture into a type that implements Future. Read more
source§

fn try_poll_unpin( &mut self, cx: &mut Context<'_> ) -> Poll<Result<Self::Ok, Self::Error>>
where Self: Unpin,

A convenience method for calling TryFuture::try_poll on Unpin future types.
source§

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

§

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