Struct quic_rpc_utils::RpcChannel
source · pub struct RpcChannel<S, C, SInner = S>{
pub send: <C as ConnectionCommon<<S as Service>::Req, <S as Service>::Res>>::SendSink,
pub recv: <C as ConnectionCommon<<S as Service>::Req, <S as Service>::Res>>::RecvStream,
pub map: Arc<dyn MapService<S, SInner>>,
}Expand description
A channel for requests and responses for a specific service.
This just groups the sink and stream into a single type, and attaches the information about the service type.
Sink and stream are independent, so you can take the channel apart and use them independently.
Fields§
§send: <C as ConnectionCommon<<S as Service>::Req, <S as Service>::Res>>::SendSinkSink to send responses to the client.
recv: <C as ConnectionCommon<<S as Service>::Req, <S as Service>::Res>>::RecvStreamStream to receive requests from the client.
map: Arc<dyn MapService<S, SInner>>Mapper to map between S and S2
Implementations§
source§impl<S, C> RpcChannel<S, C>where
S: Service,
C: ServiceEndpoint<S>,
impl<S, C> RpcChannel<S, C>where
S: Service,
C: ServiceEndpoint<S>,
sourcepub fn new(
send: <C as ConnectionCommon<<S as Service>::Req, <S as Service>::Res>>::SendSink,
recv: <C as ConnectionCommon<<S as Service>::Req, <S as Service>::Res>>::RecvStream,
) -> RpcChannel<S, C>
pub fn new( send: <C as ConnectionCommon<<S as Service>::Req, <S as Service>::Res>>::SendSink, recv: <C as ConnectionCommon<<S as Service>::Req, <S as Service>::Res>>::RecvStream, ) -> RpcChannel<S, C>
Create a new RPC channel.
source§impl<S, C, SInner> RpcChannel<S, C, SInner>
impl<S, C, SInner> RpcChannel<S, C, SInner>
sourcepub fn map<SNext>(self) -> RpcChannel<S, C, SNext>
pub fn map<SNext>(self) -> RpcChannel<S, C, SNext>
Map this channel’s service into an inner service.
This method is available if the required bounds are upheld: SNext::Req: IntoSInner::Req + TryFromSInner::Req, SNext::Res: IntoSInner::Res + TryFromSInner::Res,
Where SNext is the new service to map to and SInner is the current inner service.
This method can be chained infintely.
source§impl<S, C, SInner> RpcChannel<S, C, SInner>
impl<S, C, SInner> RpcChannel<S, C, SInner>
sourcepub async fn bidi_streaming<M, F, Str, T>(
self,
req: M,
target: T,
f: F,
) -> Result<(), RpcServerError<C>>where
M: BidiStreamingMsg<SInner>,
F: FnOnce(T, M, UpdateStream<S, C, <M as BidiStreamingMsg<SInner>>::Update, SInner>) -> Str + Send + 'static,
Str: Stream<Item = <M as BidiStreamingMsg<SInner>>::Response> + Send + 'static,
T: Send + 'static,
pub async fn bidi_streaming<M, F, Str, T>(
self,
req: M,
target: T,
f: F,
) -> Result<(), RpcServerError<C>>where
M: BidiStreamingMsg<SInner>,
F: FnOnce(T, M, UpdateStream<S, C, <M as BidiStreamingMsg<SInner>>::Update, SInner>) -> Str + Send + 'static,
Str: Stream<Item = <M as BidiStreamingMsg<SInner>>::Response> + Send + 'static,
T: Send + 'static,
handle the message M using the given function on the target object
If you want to support concurrent requests, you need to spawn this on a tokio task yourself.
source§impl<S, C, SInner> RpcChannel<S, C, SInner>
impl<S, C, SInner> RpcChannel<S, C, SInner>
sourcepub async fn client_streaming<M, F, Fut, T>(
self,
req: M,
target: T,
f: F,
) -> Result<(), RpcServerError<C>>where
M: ClientStreamingMsg<SInner>,
F: FnOnce(T, M, UpdateStream<S, C, <M as ClientStreamingMsg<SInner>>::Update, SInner>) -> Fut + Send + 'static,
Fut: Future<Output = <M as ClientStreamingMsg<SInner>>::Response> + Send + 'static,
T: Send + 'static,
pub async fn client_streaming<M, F, Fut, T>(
self,
req: M,
target: T,
f: F,
) -> Result<(), RpcServerError<C>>where
M: ClientStreamingMsg<SInner>,
F: FnOnce(T, M, UpdateStream<S, C, <M as ClientStreamingMsg<SInner>>::Update, SInner>) -> Fut + Send + 'static,
Fut: Future<Output = <M as ClientStreamingMsg<SInner>>::Response> + Send + 'static,
T: Send + 'static,
handle the message M using the given function on the target object
If you want to support concurrent requests, you need to spawn this on a tokio task yourself.
source§impl<S, C, SInner> RpcChannel<S, C, SInner>
impl<S, C, SInner> RpcChannel<S, C, SInner>
sourcepub async fn rpc<M, F, Fut, T>(
self,
req: M,
target: T,
f: F,
) -> Result<(), RpcServerError<C>>
pub async fn rpc<M, F, Fut, T>( self, req: M, target: T, f: F, ) -> Result<(), RpcServerError<C>>
handle the message of type M using the given function on the target object
If you want to support concurrent requests, you need to spawn this on a tokio task yourself.
sourcepub async fn rpc_map_err<M, F, Fut, T, R, E1, E2>(
self,
req: M,
target: T,
f: F,
) -> Result<(), RpcServerError<C>>
pub async fn rpc_map_err<M, F, Fut, T, R, E1, E2>( self, req: M, target: T, f: F, ) -> Result<(), RpcServerError<C>>
A rpc call that also maps the error from the user type to the wire type
This is useful if you want to write your function with a convenient error type like anyhow::Error, yet still use a serializable error type on the wire.
source§impl<S, C, SInner> RpcChannel<S, C, SInner>
impl<S, C, SInner> RpcChannel<S, C, SInner>
sourcepub async fn server_streaming<M, F, Str, T>(
self,
req: M,
target: T,
f: F,
) -> Result<(), RpcServerError<C>>where
M: ServerStreamingMsg<SInner>,
F: FnOnce(T, M) -> Str + Send + 'static,
Str: Stream<Item = <M as ServerStreamingMsg<SInner>>::Response> + Send + 'static,
T: Send + 'static,
pub async fn server_streaming<M, F, Str, T>(
self,
req: M,
target: T,
f: F,
) -> Result<(), RpcServerError<C>>where
M: ServerStreamingMsg<SInner>,
F: FnOnce(T, M) -> Str + Send + 'static,
Str: Stream<Item = <M as ServerStreamingMsg<SInner>>::Response> + Send + 'static,
T: Send + 'static,
handle the message M using the given function on the target object
If you want to support concurrent requests, you need to spawn this on a tokio task yourself.
source§impl<S, C, SInner> RpcChannel<S, C, SInner>
impl<S, C, SInner> RpcChannel<S, C, SInner>
sourcepub async fn try_server_streaming<M, F, Fut, Str, T>(
self,
req: M,
target: T,
f: F,
) -> Result<(), RpcServerError<C>>where
M: TryServerStreamingMsg<SInner>,
Result<<M as TryServerStreamingMsg<SInner>>::Item, <M as TryServerStreamingMsg<SInner>>::ItemError>: Into<<SInner as Service>::Res> + TryFrom<<SInner as Service>::Res>,
Result<StreamCreated, <M as TryServerStreamingMsg<SInner>>::CreateError>: Into<<SInner as Service>::Res> + TryFrom<<SInner as Service>::Res>,
F: FnOnce(T, M) -> Fut + Send + 'static,
Fut: Future<Output = Result<Str, <M as TryServerStreamingMsg<SInner>>::CreateError>> + Send + 'static,
Str: Stream<Item = Result<<M as TryServerStreamingMsg<SInner>>::Item, <M as TryServerStreamingMsg<SInner>>::ItemError>> + Send + 'static,
T: Send + 'static,
pub async fn try_server_streaming<M, F, Fut, Str, T>(
self,
req: M,
target: T,
f: F,
) -> Result<(), RpcServerError<C>>where
M: TryServerStreamingMsg<SInner>,
Result<<M as TryServerStreamingMsg<SInner>>::Item, <M as TryServerStreamingMsg<SInner>>::ItemError>: Into<<SInner as Service>::Res> + TryFrom<<SInner as Service>::Res>,
Result<StreamCreated, <M as TryServerStreamingMsg<SInner>>::CreateError>: Into<<SInner as Service>::Res> + TryFrom<<SInner as Service>::Res>,
F: FnOnce(T, M) -> Fut + Send + 'static,
Fut: Future<Output = Result<Str, <M as TryServerStreamingMsg<SInner>>::CreateError>> + Send + 'static,
Str: Stream<Item = Result<<M as TryServerStreamingMsg<SInner>>::Item, <M as TryServerStreamingMsg<SInner>>::ItemError>> + Send + 'static,
T: Send + 'static,
handle the message M using the given function on the target object
If you want to support concurrent requests, you need to spawn this on a tokio task yourself.
Compared to RpcChannel::server_streaming, with this method the stream creation is via a function that returns a future that resolves to a stream.