pub struct Server { /* private fields */ }Expand description
A bound listener that has not started accepting yet.
Binding is separated from serving so the caller can learn the address —
which matters when binding port 0 — without racing the accept loop.
Implementations§
Source§impl Server
impl Server
Sourcepub async fn bind(addr: impl ToSocketAddrs) -> Result<Server, Error>
pub async fn bind(addr: impl ToSocketAddrs) -> Result<Server, Error>
Binds a listener without accepting anything yet.
§Errors
Returns std::io::Error if the address cannot be bound.
Sourcepub const fn with_config(self, config: ServeConfig) -> Server
pub const fn with_config(self, config: ServeConfig) -> Server
Applies limits to this server.
Sourcepub fn local_addr(&self) -> Result<SocketAddr, Error>
pub fn local_addr(&self) -> Result<SocketAddr, Error>
The address actually bound, which is the only way to learn the port when
binding to 0.
§Errors
Returns std::io::Error if the socket cannot report its address.
Sourcepub async fn serve_with_shutdown(
self,
dispatcher: impl Dispatcher,
shutdown: impl Future<Output = ()> + Send,
) -> ServeReport
pub async fn serve_with_shutdown( self, dispatcher: impl Dispatcher, shutdown: impl Future<Output = ()> + Send, ) -> ServeReport
Accepts until shutdown resolves, then ends the work in flight and
drains.
The order is what makes it graceful:
- Stop accepting. The listener is dropped.
- End in-flight tasks. When the dispatcher has a
request_handler,RequestHandler::finish_in_flightfirst lets tasks finish on their own for up toServeConfig::completion_grace, then fires every remaining task’s cancellation token and waits up toServeConfig::task_gracefor the executors to act on it: cancel what they delegated, and end their tasks with a terminal event that reaches every open stream. - Drain connections, for up to
ServeConfig::drain_timeout. Streams whose tasks have ended close on their own, so this is usually quick.
It used to drain first. An open SSE stream is a connection that does not close until its task ends, so the drain waited out its whole timeout on tasks nobody had cancelled, and a delegating executor’s downstream work outlived the process.
Returns once both phases have finished or run out of time — never
before, which is the whole point of it existing. Call
RequestHandler::shutdown after it
to run the executor’s cleanup hook.
Trait Implementations§
Auto Trait Implementations§
impl !Freeze for Server
impl RefUnwindSafe for Server
impl Send for Server
impl Sync for Server
impl Unpin for Server
impl UnsafeUnpin for Server
impl UnwindSafe for Server
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
Source§fn with_current_context(self) -> WithContext<Self> ⓘ
fn with_current_context(self) -> WithContext<Self> ⓘ
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
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 moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request