ConnectionHandle

Struct ConnectionHandle 

Source
pub struct ConnectionHandle { /* private fields */ }
Expand description

Handle for making outgoing RPC calls.

This is the client-side API. It can be cloned and used from multiple tasks. The actual I/O is driven by the Driver future which must be spawned.

§Example

let (handle, driver) = establish_connection(transport, dispatcher).await?;
tokio::spawn(driver);

// Use handle to make calls
let response = handle.call_raw(method_id, payload).await?;

Implementations§

Source§

impl ConnectionHandle

Source

pub fn new( driver_tx: Sender<DriverMessage>, role: Role, initial_credit: u32, ) -> Self

Create a new handle for the root connection (conn_id = 0).

All messages (Call/Data/Close/Response) go through a single unified channel to ensure FIFO ordering.

Source

pub fn new_with_diagnostics( conn_id: ConnectionId, driver_tx: Sender<DriverMessage>, role: Role, initial_credit: u32, diagnostic_state: Option<Arc<DiagnosticState>>, ) -> Self

Create a new handle with a specific connection ID and optional diagnostic state.

If diagnostic_state is provided, all RPC calls and channels will be tracked for debugging purposes.

Source

pub fn conn_id(&self) -> ConnectionId

Get the connection ID for this handle.

Source

pub fn diagnostic_state(&self) -> Option<&Arc<DiagnosticState>>

Get the diagnostic state, if any.

Source

pub async fn call<T: Facet<'static>>( &self, method_id: u64, args: &mut T, ) -> Result<ResponseData, TransportError>

Make a typed RPC call with automatic serialization and stream binding.

Walks the args using Poke reflection to find any Rx<T> or Tx<T> fields, binds stream IDs, and sets up the stream infrastructure before serialization.

§Arguments
  • method_id - The method ID to call
  • args - Arguments to serialize (typically a tuple of all method args). Must be mutable so stream IDs can be assigned.
§Stream Binding

For Rx<T> in args (caller passes receiver, keeps sender to push data):

  • Allocates a stream ID
  • Takes the receiver and spawns a task to drain it, sending Data messages
  • The caller keeps the Tx<T> from roam::channel() to send values

For Tx<T> in args (caller passes sender, keeps receiver to pull data):

  • Allocates a stream ID
  • Takes the sender and registers for incoming Data routing
  • The caller keeps the Rx<T> from roam::channel() to receive values
§Example
// For a streaming method sum(numbers: Rx<i32>) -> i64
let (tx, rx) = roam::channel::<i32>();
let response = handle.call(method_id::SUM, &mut (rx,)).await?;
// tx.send(&42).await to push values

Make an RPC call with default (empty) metadata.

Source

pub async fn call_with_metadata<T: Facet<'static>>( &self, method_id: u64, args: &mut T, metadata: Metadata, ) -> Result<ResponseData, TransportError>

Make an RPC call with custom metadata.

Source

pub async fn call_raw( &self, method_id: u64, payload: Vec<u8>, ) -> Result<Vec<u8>, TransportError>

Make a raw RPC call with pre-serialized payload.

Returns the raw response payload bytes. Note: For streaming calls, use call() which handles channel binding.

Source

pub async fn call_raw_with_metadata( &self, method_id: u64, payload: Vec<u8>, metadata: Vec<(String, MetadataValue)>, ) -> Result<Vec<u8>, TransportError>

Make a raw RPC call with pre-serialized payload and metadata.

Returns the raw response payload bytes.

Source

pub async fn connect( &self, metadata: Metadata, dispatcher: Option<Box<dyn ServiceDispatcher>>, ) -> Result<ConnectionHandle, ConnectError>

Open a new virtual connection on the link.

Sends a Connect message to the remote peer and waits for an Accept or Reject response. Returns a new ConnectionHandle for the virtual connection if accepted.

r[impl core.conn.open]

§Arguments
  • metadata - Optional metadata to send with the Connect request (e.g., authentication tokens, routing hints).
  • dispatcher - Optional dispatcher for handling incoming requests on the virtual connection. If None, the connection can only make calls, not receive them.
§Example
// Open a new virtual connection that can receive calls
let dispatcher = Box::new(MyDispatcher::new());
let virtual_conn = handle.connect(vec![], Some(dispatcher)).await?;

// Use the new connection for calls
let response = virtual_conn.call_raw(method_id, payload).await?;
Source

pub fn alloc_channel_id(&self) -> ChannelId

Allocate a stream ID for an outgoing stream.

Used internally when binding streams during call().

Source

pub fn alloc_request_id(&self) -> u64

Allocate a unique request ID for an outgoing call.

Used when manually constructing DriverMessage::Call.

Source

pub fn register_incoming(&self, channel_id: ChannelId, tx: Sender<Vec<u8>>)

Register an incoming stream (we receive data from peer).

Used when schema has Tx<T> (callee sends to caller) - we receive that data.

Source

pub fn register_outgoing_credit(&self, channel_id: ChannelId)

Register credit tracking for an outgoing stream.

The actual receiver is owned by the driver, not the registry.

Source

pub async fn route_data( &self, channel_id: ChannelId, payload: Vec<u8>, ) -> Result<(), ChannelError>

Route incoming stream data to the appropriate Rx.

Source

pub fn close_channel(&self, channel_id: ChannelId)

Close an incoming stream.

Source

pub fn reset_channel(&self, channel_id: ChannelId)

Reset a stream.

Source

pub fn contains_channel(&self, channel_id: ChannelId) -> bool

Check if a stream exists.

Source

pub fn receive_credit(&self, channel_id: ChannelId, bytes: u32)

Receive credit for an outgoing stream.

Source

pub fn driver_tx(&self) -> Sender<DriverMessage>

Get a clone of the driver message sender.

Used for forwarding/proxy scenarios where messages need to be sent on this connection’s wire.

Source

pub fn bind_response_streams<T: Facet<'static>>( &self, response: &mut T, channels: &[u64], )

Bind receivers for Rx<T> streams in a deserialized response.

After deserializing a response, any Rx<T> values are “hollow” - they have channel IDs but no actual receiver. This method walks the response using reflection and binds receivers for each Rx<T> so data can be received.

§How it works

For each Rx<T> found in the response:

  1. Read the channel_id that was set during deserialization
  2. Create a new channel (tx, rx)
  3. Set the receiver slot on the Rx
  4. Register the sender with the channel registry for incoming data routing

This mirrors server-side ChannelRegistry::bind_streams but for responses.

IMPORTANT: The channels parameter contains the authoritative channel IDs from the Response framing. For forwarded connections (via ForwardingDispatcher), these IDs may differ from the IDs serialized in the payload. We patch them first.

Trait Implementations§

Source§

impl Caller for ConnectionHandle

Source§

async fn call_with_metadata<T: Facet<'static> + Send>( &self, method_id: u64, args: &mut T, metadata: Metadata, ) -> Result<ResponseData, TransportError>

Make an RPC call with the given method ID, arguments, and metadata. Read more
Source§

fn bind_response_streams<T: Facet<'static>>( &self, response: &mut T, channels: &[u64], )

Bind receivers for Rx<T> streams in the response. Read more
Source§

fn call<T: Facet<'static> + Send>( &self, method_id: u64, args: &mut T, ) -> impl Future<Output = Result<ResponseData, TransportError>> + Send

Make an RPC call with the given method ID and arguments. Read more
Source§

impl Clone for ConnectionHandle

Source§

fn clone(&self) -> ConnectionHandle

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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§

fn if_supports_color<'a, Out, ApplyFn>( &'a self, stream: impl Into<Stream>, apply: ApplyFn, ) -> SupportsColorsDisplay<'a, Self, Out, ApplyFn>
where ApplyFn: Fn(&'a Self) -> Out,

Apply a given transformation function to all formatters if the given stream supports at least basic ANSI colors, allowing you to conditionally apply given styles/colors. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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.