Skip to main content

Channel

Struct Channel 

Source
pub struct Channel<'a, Req, Resp> { /* private fields */ }
Expand description

Bidirectional channel: read decoded requests, write framed responses, over the upgraded transport.

Handed to a BidiResponder. Turn-taking by construction — both recv and send take &mut self, so the underlying &mut Upgrade is never aliased. For producers that need to run concurrently with the request loop, spawn a task on the runtime.

The response initial metadata was committed before the upgrade (by the prologue), so there is no way to mutate it here. The trailing metadata, emitted after the loop alongside grpc-status, is still open: write it through response_trailers_mut (the bag was seeded with whatever the prologue set).

Implementations§

Source§

impl<'a, Req, Resp> Channel<'a, Req, Resp>

Source

pub fn response_trailers_mut(&mut self) -> &mut Headers

The response’s trailing metadata, emitted alongside grpc-status once the loop ends. Seeded with whatever the prologue set; write to it to add trailing metadata (including grpc-status-details-bin error details) from inside the loop.

Source

pub async fn recv(&mut self) -> Option<Result<Req, Status>>

Read the next decoded request. None on clean EOF (client closed the request side); Some(Err(_)) ends the read side.

Source

pub async fn send(&mut self, value: Resp) -> Result<(), Status>

Frame and write one response message.

Auto Trait Implementations§

§

impl<'a, Req, Resp> Freeze for Channel<'a, Req, Resp>

§

impl<'a, Req, Resp> !RefUnwindSafe for Channel<'a, Req, Resp>

§

impl<'a, Req, Resp> Send for Channel<'a, Req, Resp>

§

impl<'a, Req, Resp> Sync for Channel<'a, Req, Resp>

§

impl<'a, Req, Resp> Unpin for Channel<'a, Req, Resp>

§

impl<'a, Req, Resp> UnsafeUnpin for Channel<'a, Req, Resp>

§

impl<'a, Req, Resp> !UnwindSafe for Channel<'a, Req, Resp>

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, 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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

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

Source§

async fn unary<Req, Resp>( conn: Conn, f: impl AsyncFnOnce(&mut GrpcServerConn<Self>, Req) -> Result<Resp, Status>, ) -> Conn
where Self: Codec<Req> + Codec<Resp>, Req: Send + 'static, Resp: Send + 'static,

Unary RPC: read exactly one request, await the user function, emit one response frame followed by grpc-status trailers.
Source§

async fn client_streaming<Resp>( conn: Conn, f: impl AsyncFnOnce(&mut GrpcServerConn<Self>) -> Result<Resp, Status>, ) -> Conn
where Self: Codec<Resp>, Resp: Send + 'static,

Client-streaming RPC: hand the user a GrpcServerConn from which they read the request stream (conn.requests::<Req>()); emit the single response frame and grpc-status trailers.
Source§

async fn server_streaming<Req, Resp, S>( conn: Conn, f: impl AsyncFnOnce(&mut GrpcServerConn<Self>, Req) -> Result<S, Status>, ) -> Conn
where Self: Codec<Req> + Codec<Resp>, Req: Send + 'static, Resp: Send + 'static, S: Stream<Item = Result<Resp, Status>> + Send + 'static,

Server-streaming RPC: read one request, await the user function for a response Stream, then frame each item lazily into the response body with grpc-status trailers derived from how the stream ended.
Source§

async fn bidi<Req, Resp, R>( conn: Conn, prologue: impl AsyncFnOnce(&mut GrpcServerConn<Self>) -> Result<R, Status>, ) -> Conn
where Self: Codec<Req> + Codec<Resp>, Req: Send + 'static, Resp: Send + 'static, R: BidiResponder<Req, Resp>,

Bidirectional-streaming RPC — the run-phase prologue. Hand the user a GrpcServerConn from which they may read early request messages (to decide response headers) and set initial metadata, then return a BidiResponder that drives the read-while-write loop after the head is flushed. Returning Err(Status) rejects before the flush (trailers-only, no upgrade). See crate::server::bidi for the seam mechanics.
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.