pub trait ServerProto<T: 'static>: 'static {
type Request: 'static;
type RequestBody: 'static;
type Response: 'static;
type ResponseBody: 'static;
type Error: From<Error> + 'static;
type Transport: Transport<Self::RequestBody, Item = Frame<Self::Request, Self::RequestBody, Self::Error>, SinkItem = Frame<Self::Response, Self::ResponseBody, Self::Error>>;
type BindTransport: IntoFuture<Item = Self::Transport, Error = Error>;
// Required method
fn bind_transport(&self, io: T) -> Self::BindTransport;
}
Expand description
A streaming, multiplexed server protocol.
The T
parameter is used for the I/O object used to communicate, which is
supplied in bind_transport
.
For simple protocols, the Self
type is often a unit struct. In more
advanced cases, Self
may contain configuration information that is used
for setting up the transport in bind_transport
.
§Considerations
There are some difficulties with implementing back pressure in the case that the wire protocol does not support a means by which backpressure can be signaled to the peer.
The problem is the potential for deadlock:
-
The server is busy processing requests on this connection, and stops reading frames from its transport.
-
Meanwhile, the processing logic is blocked waiting for another frame that is currently pending on the socket.
To deal with this, once the connection’s frame buffer is filled, a timeout is set. If no further frames are able to be read before the timeout expires, the connection is killed.
Required Associated Types§
Sourcetype RequestBody: 'static
type RequestBody: 'static
Request body chunks.
Sourcetype ResponseBody: 'static
type ResponseBody: 'static
Response body chunks.
Sourcetype Error: From<Error> + 'static
type Error: From<Error> + 'static
Errors, which are used both for error frames and for the service itself.
Sourcetype Transport: Transport<Self::RequestBody, Item = Frame<Self::Request, Self::RequestBody, Self::Error>, SinkItem = Frame<Self::Response, Self::ResponseBody, Self::Error>>
type Transport: Transport<Self::RequestBody, Item = Frame<Self::Request, Self::RequestBody, Self::Error>, SinkItem = Frame<Self::Response, Self::ResponseBody, Self::Error>>
The frame transport, which usually take T
as a parameter.
Sourcetype BindTransport: IntoFuture<Item = Self::Transport, Error = Error>
type BindTransport: IntoFuture<Item = Self::Transport, Error = Error>
A future for initializing a transport from an I/O object.
In simple cases, Result<Self::Transport, Self::Error>
often suffices.
Required Methods§
Sourcefn bind_transport(&self, io: T) -> Self::BindTransport
fn bind_transport(&self, io: T) -> Self::BindTransport
Build a transport from the given I/O object, using self
for any
configuration.