Skip to main content

Bridge

Struct Bridge 

Source
pub struct Bridge<U: BridgePeer, C> { /* private fields */ }
Expand description

Carries envelopes to upstream under one agreement and brings the answers back.

The second parameter is the codec the reply path translates through, injected like the peer. It is not defaulted: a default would have to name the crate’s own adapter, and application code must not know which adapter it is wired to.

§Why there is no downstream peer

A bridge used to take one, and the type said “carries envelopes from downstream to upstream”. It never did: forward takes the envelope as an argument and returns the answer, which is what a call from a loop that already reads the client wants. The peer was reachable only through client — which nothing called — and close, so every caller passed a second handle on the client’s connection that was never used to talk to the client and closed at the end on a guess.

The client channel belongs to whoever owns the client’s connection, which is the loop: it reads frames from a source and writes replies to a sink. This type is the part that does not care.

Implementations§

Source§

impl<U: BridgePeer, C: ToolResultCodec> Bridge<U, C>

Source

pub const fn new( agreement: Agreement, policy: DegradePolicy, upstream: U, codec: C, ) -> Self

A bridge over a peer that has already agreed.

Source

pub const fn agreement(&self) -> &Agreement

What the bridge can serve.

Source

pub const fn upstream_version(&self) -> ProtocolVersion

The version the upstream peer speaks.

Source

pub const fn upstream(&self) -> &U

The peer this bridge forwards through.

The owner of the upstream connection, not a handle opened for convenience: a bridge that could talk to the server by a second path would have two owners of one session. Exposed because the frames a peer receives unasked for belong to it and nobody else — see BridgePeer::take_pending.

Source

pub async fn forward( &self, envelope: &Map<String, Value>, ) -> Result<Forwarded, BridgeError>

Forwards one envelope and brings the answer back.

A tools/call reply is translated into the client’s revision on the way back, and only if the client’s revision cannot read what the server said. Every other reply, and every reply that needs no translation, comes back as the upstream wrote it — see content for why rebuilding a reply that was not asking to be rebuilt is a bug.

§Errors

BridgeError — the envelope was unreadable, the two peers share no feature for the method asked, the upstream could not be reached, or the reply could not be expressed at the client’s revision. The method is checked against the agreement before anything is sent, so a doomed call never reaches the wire.

Source

pub async fn close(&self) -> Result<(), BridgeError>

Ends the conversation with the upstream peer.

The client’s connection is not this type’s to close: the loop that read the frames opened it, and it ends when the client’s stream does.

§Errors

BridgeError when the upstream refused to close.

Trait Implementations§

Source§

impl<U: Debug + BridgePeer, C: Debug> Debug for Bridge<U, C>

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<U, C> Freeze for Bridge<U, C>
where U: Freeze, Translator<C>: Freeze,

§

impl<U, C> RefUnwindSafe for Bridge<U, C>

§

impl<U, C> Send for Bridge<U, C>
where Translator<C>: Send,

§

impl<U, C> Sync for Bridge<U, C>
where Translator<C>: Sync,

§

impl<U, C> Unpin for Bridge<U, C>
where U: Unpin, Translator<C>: Unpin,

§

impl<U, C> UnsafeUnpin for Bridge<U, C>

§

impl<U, C> UnwindSafe for Bridge<U, C>

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<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,

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