Skip to main content

ControlChannel

Struct ControlChannel 

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

The shared control-WS transport. Construct one per live session handle.

Implementations§

Source§

impl ControlChannel

Source

pub fn new( control_url: impl Into<String>, headers: Vec<(String, String)>, call_timeout_ms: Option<u64>, ) -> Self

Source

pub fn connected(&self) -> bool

Whether the control channel is open.

Source

pub fn set_control_url(&self, url: impl Into<String>)

Point the channel at a (possibly new) control URL.

Source

pub async fn connect(&self) -> Result<(), SolariError>

Open the control WebSocket. Idempotent: concurrent callers serialize on connecting, and an already-open socket resolves immediately. Transient fast-failing connects are retried (not a full connect timeout).

Source

pub async fn reconnect(&self) -> Result<(), SolariError>

Reconnect after a drop (re-opens the socket).

Source

pub fn close(&self)

Close the channel and reject any in-flight calls + stream waits.

Source

pub async fn call( &self, method: &str, params: Value, ) -> Result<Value, SolariError>

Send one JSON-RPC call and await its correlated reply.

Source

pub fn register_command(&self, cmd_id: &str) -> UnboundedReceiver<AsyncFrame>

Register a receiver for a command’s cmd.data + cmd.exit frames, keyed on cmdId. Flushes any orphan frames that beat this registration.

If the channel is ALREADY torn down when this is called, return a receiver whose sender is dropped immediately — its first recv() yields None, so the caller’s wait resolves to “Control channel closed” instead of blocking forever. A caller registers this AFTER the cmd.start reply resolves; if the channel closed in that window fail_all has already cleared frame_handlers, so a fresh sender inserted here would never be dropped and the wait would hang. This window is genuinely reachable: the read task runs concurrently and can call fail_all between the reply and this registration.

Source

pub fn unregister_command(&self, cmd_id: &str)

Drop a command’s frame handlers (its terminal cmd.exit was seen).

Trait Implementations§

Source§

impl Drop for ControlChannel

Dropping the last reference closes the socket. Without this the reader task kept the channel state alive, the state kept the outbound sender alive, and the writer task waited on that sender, so a dropped Sandbox left its socket and both tasks running until the server hung up.

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. 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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + 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: Sized + 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> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

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 = !

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

fn try_from(value: U) -> Result<T, !>

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