pub struct IoForwardService { /* private fields */ }std only.Expand description
A proxy Service which takes a BridgeIo
and copies the bytes of both the source and target Ios
bidirectionally.
The service observes shutdown via the ShutdownGuard of the
Executor passed at construction (if any), enforces an optional
idle timeout that closes the bridge when neither direction has made
byte progress within the configured window, and emits a single
structured close event when the bridge ends.
Implementations§
Source§impl IoForwardService
impl IoForwardService
Sourcepub fn new(executor: Executor) -> Self
pub fn new(executor: Executor) -> Self
Create a new IoForwardService using the given Executor.
Sourcepub fn maybe_with_idle_timeout(self, timeout: Option<Duration>) -> Self
pub fn maybe_with_idle_timeout(self, timeout: Option<Duration>) -> Self
Per-direction idle timeout. When set, the bridge closes with reason
BridgeCloseReason::IdleTimeout if no byte progress is observed
in either direction within timeout.
None (the default) disables idle detection.
Sourcepub fn maybe_set_idle_timeout(&mut self, timeout: Option<Duration>) -> &mut Self
pub fn maybe_set_idle_timeout(&mut self, timeout: Option<Duration>) -> &mut Self
Per-direction idle timeout. When set, the bridge closes with reason
BridgeCloseReason::IdleTimeout if no byte progress is observed
in either direction within timeout.
None (the default) disables idle detection.
Sourcepub fn with_idle_timeout(self, timeout: Duration) -> Self
pub fn with_idle_timeout(self, timeout: Duration) -> Self
Per-direction idle timeout. When set, the bridge closes with reason
BridgeCloseReason::IdleTimeout if no byte progress is observed
in either direction within timeout.
None (the default) disables idle detection.
Sourcepub fn set_idle_timeout(&mut self, timeout: Duration) -> &mut Self
pub fn set_idle_timeout(&mut self, timeout: Duration) -> &mut Self
Per-direction idle timeout. When set, the bridge closes with reason
BridgeCloseReason::IdleTimeout if no byte progress is observed
in either direction within timeout.
None (the default) disables idle detection.
Sourcepub fn without_idle_timeout(self) -> Self
pub fn without_idle_timeout(self) -> Self
Per-direction idle timeout. When set, the bridge closes with reason
BridgeCloseReason::IdleTimeout if no byte progress is observed
in either direction within timeout.
None (the default) disables idle detection.
Sourcepub fn unset_idle_timeout(&mut self) -> &mut Self
pub fn unset_idle_timeout(&mut self) -> &mut Self
Per-direction idle timeout. When set, the bridge closes with reason
BridgeCloseReason::IdleTimeout if no byte progress is observed
in either direction within timeout.
None (the default) disables idle detection.
Sourcepub fn maybe_with_first_byte_timeout(self, timeout: Option<Duration>) -> Self
pub fn maybe_with_first_byte_timeout(self, timeout: Option<Duration>) -> Self
Response first-byte timeout. When set, the bridge closes with reason
BridgeCloseReason::FirstByteTimeout if the upstream (right /
egress) half writes no byte within timeout of the window’s start
(see first_byte_timeout_start).
This targets a silent origin that accepts the connection but never
responds: the client’s bytes still flow toward the upstream, so the
flow never looks idle. It keys off the upstream -> client direction
only, once the first upstream byte arrives the timer disarms
permanently and idle_timeout takes over.
Where the window is anchored (bridge open vs the client’s first sent
byte) is controlled by
first_byte_timeout_start.
None (the default) disables first-byte detection.
Sourcepub fn maybe_set_first_byte_timeout(
&mut self,
timeout: Option<Duration>,
) -> &mut Self
pub fn maybe_set_first_byte_timeout( &mut self, timeout: Option<Duration>, ) -> &mut Self
Response first-byte timeout. When set, the bridge closes with reason
BridgeCloseReason::FirstByteTimeout if the upstream (right /
egress) half writes no byte within timeout of the window’s start
(see first_byte_timeout_start).
This targets a silent origin that accepts the connection but never
responds: the client’s bytes still flow toward the upstream, so the
flow never looks idle. It keys off the upstream -> client direction
only, once the first upstream byte arrives the timer disarms
permanently and idle_timeout takes over.
Where the window is anchored (bridge open vs the client’s first sent
byte) is controlled by
first_byte_timeout_start.
None (the default) disables first-byte detection.
Sourcepub fn with_first_byte_timeout(self, timeout: Duration) -> Self
pub fn with_first_byte_timeout(self, timeout: Duration) -> Self
Response first-byte timeout. When set, the bridge closes with reason
BridgeCloseReason::FirstByteTimeout if the upstream (right /
egress) half writes no byte within timeout of the window’s start
(see first_byte_timeout_start).
This targets a silent origin that accepts the connection but never
responds: the client’s bytes still flow toward the upstream, so the
flow never looks idle. It keys off the upstream -> client direction
only, once the first upstream byte arrives the timer disarms
permanently and idle_timeout takes over.
Where the window is anchored (bridge open vs the client’s first sent
byte) is controlled by
first_byte_timeout_start.
None (the default) disables first-byte detection.
Sourcepub fn set_first_byte_timeout(&mut self, timeout: Duration) -> &mut Self
pub fn set_first_byte_timeout(&mut self, timeout: Duration) -> &mut Self
Response first-byte timeout. When set, the bridge closes with reason
BridgeCloseReason::FirstByteTimeout if the upstream (right /
egress) half writes no byte within timeout of the window’s start
(see first_byte_timeout_start).
This targets a silent origin that accepts the connection but never
responds: the client’s bytes still flow toward the upstream, so the
flow never looks idle. It keys off the upstream -> client direction
only, once the first upstream byte arrives the timer disarms
permanently and idle_timeout takes over.
Where the window is anchored (bridge open vs the client’s first sent
byte) is controlled by
first_byte_timeout_start.
None (the default) disables first-byte detection.
Sourcepub fn without_first_byte_timeout(self) -> Self
pub fn without_first_byte_timeout(self) -> Self
Response first-byte timeout. When set, the bridge closes with reason
BridgeCloseReason::FirstByteTimeout if the upstream (right /
egress) half writes no byte within timeout of the window’s start
(see first_byte_timeout_start).
This targets a silent origin that accepts the connection but never
responds: the client’s bytes still flow toward the upstream, so the
flow never looks idle. It keys off the upstream -> client direction
only, once the first upstream byte arrives the timer disarms
permanently and idle_timeout takes over.
Where the window is anchored (bridge open vs the client’s first sent
byte) is controlled by
first_byte_timeout_start.
None (the default) disables first-byte detection.
Sourcepub fn unset_first_byte_timeout(&mut self) -> &mut Self
pub fn unset_first_byte_timeout(&mut self) -> &mut Self
Response first-byte timeout. When set, the bridge closes with reason
BridgeCloseReason::FirstByteTimeout if the upstream (right /
egress) half writes no byte within timeout of the window’s start
(see first_byte_timeout_start).
This targets a silent origin that accepts the connection but never
responds: the client’s bytes still flow toward the upstream, so the
flow never looks idle. It keys off the upstream -> client direction
only, once the first upstream byte arrives the timer disarms
permanently and idle_timeout takes over.
Where the window is anchored (bridge open vs the client’s first sent
byte) is controlled by
first_byte_timeout_start.
None (the default) disables first-byte detection.
Sourcepub fn with_first_byte_timeout_start(self, start: FirstByteTimeoutStart) -> Self
pub fn with_first_byte_timeout_start(self, start: FirstByteTimeoutStart) -> Self
Anchor for the response first-byte window: see
FirstByteTimeoutStart. Only meaningful when
first_byte_timeout is set.
Default: FirstByteTimeoutStart::ClientFirstByte.
Sourcepub fn set_first_byte_timeout_start(
&mut self,
start: FirstByteTimeoutStart,
) -> &mut Self
pub fn set_first_byte_timeout_start( &mut self, start: FirstByteTimeoutStart, ) -> &mut Self
Anchor for the response first-byte window: see
FirstByteTimeoutStart. Only meaningful when
first_byte_timeout is set.
Default: FirstByteTimeoutStart::ClientFirstByte.
Sourcepub fn with_shutdown_grace(self, grace: Duration) -> Self
pub fn with_shutdown_grace(self, grace: Duration) -> Self
Per-half cap on graceful shutdown. When the bridge unwinds it calls
shutdown() on each write half bounded by this duration; if the
inner type blocks (e.g. a TLS layer waiting for close_notify),
the shutdown is abandoned and the half is dropped.
Default: 50ms.
Sourcepub fn set_shutdown_grace(&mut self, grace: Duration) -> &mut Self
pub fn set_shutdown_grace(&mut self, grace: Duration) -> &mut Self
Per-half cap on graceful shutdown. When the bridge unwinds it calls
shutdown() on each write half bounded by this duration; if the
inner type blocks (e.g. a TLS layer waiting for close_notify),
the shutdown is abandoned and the half is dropped.
Default: 50ms.
Sourcepub fn with_buf_size(self, size: usize) -> Self
pub fn with_buf_size(self, size: usize) -> Self
Per-direction copy buffer size (in bytes).
Default: 8 KiB.
Sourcepub fn set_buf_size(&mut self, size: usize) -> &mut Self
pub fn set_buf_size(&mut self, size: usize) -> &mut Self
Per-direction copy buffer size (in bytes).
Default: 8 KiB.
Trait Implementations§
Source§impl Clone for IoForwardService
impl Clone for IoForwardService
Source§fn clone(&self) -> IoForwardService
fn clone(&self) -> IoForwardService
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for IoForwardService
impl Debug for IoForwardService
Source§impl Default for IoForwardService
impl Default for IoForwardService
Source§impl<S, T> Service<BridgeIo<S, T>> for IoForwardService
impl<S, T> Service<BridgeIo<S, T>> for IoForwardService
Auto Trait Implementations§
impl Freeze for IoForwardService
impl RefUnwindSafe for IoForwardService
impl Send for IoForwardService
impl Sync for IoForwardService
impl Unpin for IoForwardService
impl UnsafeUnpin for IoForwardService
impl UnwindSafe for IoForwardService
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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> Pointable for T
impl<T> Pointable for T
Source§impl<T, U> RamaTryFrom<T> for Uwhere
U: TryFrom<T>,
impl<T, U> RamaTryFrom<T> for Uwhere
U: TryFrom<T>,
Source§impl<T, U, CrateMarker> RamaTryInto<U, CrateMarker> for Twhere
U: RamaTryFrom<T, CrateMarker>,
impl<T, U, CrateMarker> RamaTryInto<U, CrateMarker> for Twhere
U: RamaTryFrom<T, CrateMarker>,
type Error = <U as RamaTryFrom<T, CrateMarker>>::Error
fn rama_try_into(self) -> Result<U, <U as RamaTryFrom<T, CrateMarker>>::Error>
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<V, F> ValueFormatter<&V> for F
impl<V, F> ValueFormatter<&V> for F
Source§const SHAPE: FieldShape<'static>
const SHAPE: FieldShape<'static>
metrique_require_explicit_impls only.Source§fn format_value(writer: impl ValueWriter, value: &&V)
fn format_value(writer: impl ValueWriter, value: &&V)
value to writerSource§impl<V, F> ValueFormatter<Arc<V>> for F
impl<V, F> ValueFormatter<Arc<V>> for F
Source§const SHAPE: FieldShape<'static>
const SHAPE: FieldShape<'static>
metrique_require_explicit_impls only.Source§fn format_value(writer: impl ValueWriter, value: &Arc<V>)
fn format_value(writer: impl ValueWriter, value: &Arc<V>)
value to writerSource§impl<V, F> ValueFormatter<Box<V>> for F
impl<V, F> ValueFormatter<Box<V>> for F
Source§const SHAPE: FieldShape<'static>
const SHAPE: FieldShape<'static>
metrique_require_explicit_impls only.Source§fn format_value(writer: impl ValueWriter, value: &Box<V>)
fn format_value(writer: impl ValueWriter, value: &Box<V>)
value to writerSource§impl<V, F> ValueFormatter<Cow<'_, V>> for F
impl<V, F> ValueFormatter<Cow<'_, V>> for F
Source§const SHAPE: FieldShape<'static>
const SHAPE: FieldShape<'static>
metrique_require_explicit_impls only.Source§fn format_value(writer: impl ValueWriter, value: &Cow<'_, V>)
fn format_value(writer: impl ValueWriter, value: &Cow<'_, V>)
value to writerSource§impl<V, F> ValueFormatter<Option<V>> for Fwhere
F: ValueFormatter<V> + ?Sized,
impl<V, F> ValueFormatter<Option<V>> for Fwhere
F: ValueFormatter<V> + ?Sized,
Source§const SHAPE: FieldShape<'static>
const SHAPE: FieldShape<'static>
metrique_require_explicit_impls only.Source§fn format_value(writer: impl ValueWriter, value: &Option<V>)
fn format_value(writer: impl ValueWriter, value: &Option<V>)
value to writer