pub struct Endpoint { /* private fields */ }
Expand description
Represents a socket using the QUIC protocol to communicate with peers.
Stream
Receives incoming Connection
s through [Stream
].
Implementations
sourceimpl Endpoint
impl Endpoint
sourcepub fn new_client() -> Result<Self, Config>
pub fn new_client() -> Result<Self, Config>
Simplified version of creating a client. See Builder
for more
sophisticated configuration options. Must be called from inside a Tokio
Runtime
.
Notes
This configuration will not be able to receive incoming
Connection
s.
Errors
std::io::Error
if the socket couldn’t be bound to the given
address
.
Panics
If not called from inside a Tokio Runtime
.
Examples
use fabruic::Endpoint;
let endpoint = Endpoint::new_client()?;
sourcepub fn new_server(port: u16, key_pair: KeyPair) -> Result<Self, Config>
pub fn new_server(port: u16, key_pair: KeyPair) -> Result<Self, Config>
Simplified version of creating a server. See Builder
for more
sophisticated configuration options. Must be called from inside a Tokio
Runtime
.
Errors
std::io::Error
if the socket couldn’t be bound to the given
address
.
Panics
- if the given
KeyPair
is invalid - can’t happen if properly validated throughKeyPair::from_parts
- if not called from inside a Tokio
Runtime
Examples
use fabruic::{Endpoint, KeyPair};
let endpoint = Endpoint::new_server(0, KeyPair::new_self_signed("self-signed"))?;
sourcepub async fn connect<U: AsRef<str>>(
&self,
url: U
) -> Result<Connecting, Connect>
pub async fn connect<U: AsRef<str>>(
&self,
url: U
) -> Result<Connecting, Connect>
Establishes a new Connection
to a server. The
servers Certificate
will be validated aggainst the root certificate
store and the domain in the URL.
Attempts to resolve the IP from the given URL. Uses
trust-dns
by default if the crate feature trust-dns
is enabled.
Otherwise ToSocketAddrs
is used.
See Builder::set_trust_dns
or Builder::disable_trust_dns
for
more control.
Notes
The following settings are used when using
trust-dns
:
- all system configurations are ignored, see
Builder::set_hosts_file
- Cloudflare with DoH is used as the name server
- DNSSEC is enabled, see
Builder::set_dnssec
- IPv6 is preferred over IPv4 if the bound socket is IPv6
Errors
error::Connect::ParseUrl
if the URL couldn’t be parsederror::Connect::Domain
if the URL didn’t contain a domainerror::Connect::Port
if the URL didn’t contain a porterror::Connect::ParseDomain
if the domain couldn’t be parsederror::Connect::TrustDns
if the URL couldn’t be resolved to an IP address withtrust-dns
error::Connect::StdDns
if the URL couldn’t be resolved to an IP address withToSocketAddrs
error::Connect::NoIp
if no IP address was found for that domain
Examples
use fabruic::Endpoint;
let endpoint = Endpoint::new_client()?;
// not going to actually work because `localhost` can't have a valid certificate
let connecting = endpoint.connect("quic://localhost:443").await?;
sourcepub async fn connect_pinned<U: AsRef<str>>(
&self,
url: U,
server_certificate: &Certificate,
client_key_pair: Option<KeyPair>
) -> Result<Connecting, Connect>
pub async fn connect_pinned<U: AsRef<str>>(
&self,
url: U,
server_certificate: &Certificate,
client_key_pair: Option<KeyPair>
) -> Result<Connecting, Connect>
Establishes a new Connection
to a server.
See connect
for more information on host name
resolution.
Notes
The root certificate store will be ignored and the given Certificate
will validate the server.
A client certificate KeyPair
set with
Builder::set_client_key_pair
will be ignored, use client_key_pair
to add a client certificate to this connection.
This method is intended for direct connection to a known server, the
domain name in the URL is not checked against the Certificate
.
Multiple domain names in the Certificate
aren’t supported.
Errors
error::Connect::MultipleDomains
if multiple domains are present in theCertificate
, which isn’t supportederror::Connect::ParseUrl
if the URL couldn’t be parsederror::Connect::Domain
if the URL didn’t contain a domainerror::Connect::Port
if the URL didn’t contain a porterror::Connect::ParseDomain
if the domain couldn’t be parsederror::Connect::TrustDns
if the URL couldn’t be resolved to an IP address withtrust-dns
error::Connect::StdDns
if the URL couldn’t be resolved to an IP address withToSocketAddrs
error::Connect::NoIp
if no IP address was found for that domain
Panics
Panics if the given Certificate
or KeyPair
are invalid. Can’t
happen if they were properly validated through Certificate::from_der
or KeyPair::from_parts
.
Examples
use fabruic::Endpoint;
let endpoint = Endpoint::new_client()?;
// the server certificate has to be imported from somewhere else
let connecting = endpoint
.connect_pinned("quic://localhost:443", &server_certificate, None)
.await?;
sourcepub fn local_address(&self) -> Result<SocketAddr, Error>
pub fn local_address(&self) -> Result<SocketAddr, Error>
Get the local SocketAddr
the underlying socket is bound to.
Errors
std::io::Error
if aquiring the local address failed.
Examples
use fabruic::Endpoint;
let endpoint = Endpoint::new_client()?;
assert!(endpoint.local_address().is_ok());
sourcepub async fn close(&self)
pub async fn close(&self)
Close all of this Endpoint
’s Connection
s
immediately and cease accepting new Connection
s.
To close an Endpoint
gracefully use
close_incoming
,
Sender::finish
and
wait_idle
.
Examples
use fabruic::Endpoint;
let endpoint = Endpoint::new_client()?;
endpoint.close();
sourcepub async fn close_incoming(&self) -> Result<(), AlreadyClosed>
pub async fn close_incoming(&self) -> Result<(), AlreadyClosed>
Prevents any new incoming connections. Already incoming connections will
finish first. This will always return error::AlreadyClosed
if the
Endpoint
wasn’t started with a listener.
See Builder::set_server_key_pair
.
Errors
error::AlreadyClosed
if it was already closed.
Examples
use fabruic::{Endpoint, KeyPair};
let endpoint = Endpoint::new_server(0, KeyPair::new_self_signed("test"))?;
assert!(endpoint.close_incoming().await.is_ok());
sourcepub async fn wait_idle(&self)
pub async fn wait_idle(&self)
Wait for all Connection
s to the Endpoint
to
be cleanly shut down. Does not close existing connections or cause
incoming connections to be rejected. See
close_incoming
.
Examples
use fabruic::Endpoint;
let endpoint = Endpoint::new_client()?;
endpoint.wait_idle().await;
Trait Implementations
sourceimpl Dangerous for Endpoint
impl Dangerous for Endpoint
sourcefn connect_unverified<'life0, 'async_trait, U>(
endpoint: &'life0 Self,
url: U,
client_key_pair: Option<KeyPair>
) -> Pin<Box<dyn Future<Output = Result<Connecting, Connect>> + Send + 'async_trait>> where
U: 'async_trait + AsRef<str> + Send,
'life0: 'async_trait,
Self: 'async_trait,
fn connect_unverified<'life0, 'async_trait, U>(
endpoint: &'life0 Self,
url: U,
client_key_pair: Option<KeyPair>
) -> Pin<Box<dyn Future<Output = Result<Connecting, Connect>> + Send + 'async_trait>> where
U: 'async_trait + AsRef<str> + Send,
'life0: 'async_trait,
Self: 'async_trait,
dangerous
only.Establishes a new Connection
to a server without
verifying the servers Certificate
. The servers
CertificateChain
can still be manually
insepcted through
Connection::peer_identity
. Read more
sourceimpl FusedStream for Endpoint
impl FusedStream for Endpoint
sourcefn is_terminated(&self) -> bool
fn is_terminated(&self) -> bool
Returns true
if the stream should no longer be polled.
sourceimpl Stream for Endpoint
impl Stream for Endpoint
type Item = Connecting
type Item = Connecting
Values yielded by the stream.
Auto Trait Implementations
impl !RefUnwindSafe for Endpoint
impl Send for Endpoint
impl Sync for Endpoint
impl Unpin for Endpoint
impl !UnwindSafe for Endpoint
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
sourceimpl<T> Instrument for T
impl<T> Instrument for T
sourcefn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
sourcefn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
impl<T> StreamExt for T where
T: Stream + ?Sized,
impl<T> StreamExt for T where
T: Stream + ?Sized,
fn next(&mut self) -> Next<'_, Self> where
Self: Unpin,
fn next(&mut self) -> Next<'_, Self> where
Self: Unpin,
Creates a future that resolves to the next item in the stream. Read more
fn into_future(self) -> StreamFuture<Self> where
Self: Unpin,
fn into_future(self) -> StreamFuture<Self> where
Self: Unpin,
fn map<T, F>(self, f: F) -> Map<Self, F> where
F: FnMut(Self::Item) -> T,
fn map<T, F>(self, f: F) -> Map<Self, F> where
F: FnMut(Self::Item) -> T,
Maps this stream’s items to a different type, returning a new stream of the resulting type. Read more
fn enumerate(self) -> Enumerate<Self>
fn enumerate(self) -> Enumerate<Self>
Creates a stream which gives the current iteration count as well as the next value. Read more
fn filter<Fut, F>(self, f: F) -> Filter<Self, Fut, F> where
F: FnMut(&Self::Item) -> Fut,
Fut: Future<Output = bool>,
fn filter<Fut, F>(self, f: F) -> Filter<Self, Fut, F> where
F: FnMut(&Self::Item) -> Fut,
Fut: Future<Output = bool>,
Filters the values produced by this stream according to the provided asynchronous predicate. Read more
fn filter_map<Fut, T, F>(self, f: F) -> FilterMap<Self, Fut, F> where
F: FnMut(Self::Item) -> Fut,
Fut: Future<Output = Option<T>>,
fn filter_map<Fut, T, F>(self, f: F) -> FilterMap<Self, Fut, F> where
F: FnMut(Self::Item) -> Fut,
Fut: Future<Output = Option<T>>,
Filters the values produced by this stream while simultaneously mapping them to a different type according to the provided asynchronous closure. Read more
fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F> where
F: FnMut(Self::Item) -> Fut,
Fut: Future,
fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F> where
F: FnMut(Self::Item) -> Fut,
Fut: Future,
Computes from this stream’s items new items of a different type using an asynchronous closure. Read more
fn collect<C>(self) -> Collect<Self, C> where
C: Default + Extend<Self::Item>,
fn collect<C>(self) -> Collect<Self, C> where
C: Default + Extend<Self::Item>,
Transforms a stream into a collection, returning a future representing the result of that computation. Read more
fn unzip<A, B, FromA, FromB>(self) -> Unzip<Self, FromA, FromB> where
FromA: Default + Extend<A>,
FromB: Default + Extend<B>,
Self: Stream<Item = (A, B)>,
fn unzip<A, B, FromA, FromB>(self) -> Unzip<Self, FromA, FromB> where
FromA: Default + Extend<A>,
FromB: Default + Extend<B>,
Self: Stream<Item = (A, B)>,
Converts a stream of pairs into a future, which resolves to pair of containers. Read more
fn concat(self) -> Concat<Self> where
Self::Item: Extend<<Self::Item as IntoIterator>::Item>,
Self::Item: IntoIterator,
Self::Item: Default,
fn concat(self) -> Concat<Self> where
Self::Item: Extend<<Self::Item as IntoIterator>::Item>,
Self::Item: IntoIterator,
Self::Item: Default,
Concatenate all items of a stream into a single extendable destination, returning a future representing the end result. Read more
fn count(self) -> Count<Self>
fn count(self) -> Count<Self>
Drives the stream to completion, counting the number of items. Read more
fn fold<T, Fut, F>(self, init: T, f: F) -> Fold<Self, Fut, T, F> where
F: FnMut(T, Self::Item) -> Fut,
Fut: Future<Output = T>,
fn fold<T, Fut, F>(self, init: T, f: F) -> Fold<Self, Fut, T, F> where
F: FnMut(T, Self::Item) -> Fut,
Fut: Future<Output = T>,
Execute an accumulating asynchronous computation over a stream, collecting all the values into one final result. Read more
fn any<Fut, F>(self, f: F) -> Any<Self, Fut, F> where
F: FnMut(Self::Item) -> Fut,
Fut: Future<Output = bool>,
fn any<Fut, F>(self, f: F) -> Any<Self, Fut, F> where
F: FnMut(Self::Item) -> Fut,
Fut: Future<Output = bool>,
Execute predicate over asynchronous stream, and return true
if any element in stream satisfied a predicate. Read more
fn all<Fut, F>(self, f: F) -> All<Self, Fut, F> where
F: FnMut(Self::Item) -> Fut,
Fut: Future<Output = bool>,
fn all<Fut, F>(self, f: F) -> All<Self, Fut, F> where
F: FnMut(Self::Item) -> Fut,
Fut: Future<Output = bool>,
Execute predicate over asynchronous stream, and return true
if all element in stream satisfied a predicate. Read more
fn flatten(self) -> Flatten<Self> where
Self::Item: Stream,
fn flatten(self) -> Flatten<Self> where
Self::Item: Stream,
Flattens a stream of streams into just one continuous stream. Read more
fn flatten_unordered(
self,
limit: impl Into<Option<usize>>
) -> FlattenUnordered<Self> where
Self::Item: Stream,
Self::Item: Unpin,
fn flatten_unordered(
self,
limit: impl Into<Option<usize>>
) -> FlattenUnordered<Self> where
Self::Item: Stream,
Self::Item: Unpin,
Flattens a stream of streams into just one continuous stream. Polls inner streams concurrently. Read more
fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F> where
F: FnMut(Self::Item) -> U,
U: Stream,
fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F> where
F: FnMut(Self::Item) -> U,
U: Stream,
Maps a stream like [StreamExt::map
] but flattens nested Stream
s. Read more
fn flat_map_unordered<U, F>(
self,
limit: impl Into<Option<usize>>,
f: F
) -> FlatMapUnordered<Self, U, F> where
U: Stream + Unpin,
F: FnMut(Self::Item) -> U,
fn flat_map_unordered<U, F>(
self,
limit: impl Into<Option<usize>>,
f: F
) -> FlatMapUnordered<Self, U, F> where
U: Stream + Unpin,
F: FnMut(Self::Item) -> U,
Maps a stream like [StreamExt::map
] but flattens nested Stream
s
and polls them concurrently, yielding items in any order, as they made
available. Read more
fn scan<S, B, Fut, F>(self, initial_state: S, f: F) -> Scan<Self, S, Fut, F> where
F: FnMut(&mut S, Self::Item) -> Fut,
Fut: Future<Output = Option<B>>,
fn scan<S, B, Fut, F>(self, initial_state: S, f: F) -> Scan<Self, S, Fut, F> where
F: FnMut(&mut S, Self::Item) -> Fut,
Fut: Future<Output = Option<B>>,
Combinator similar to [StreamExt::fold
] that holds internal state
and produces a new stream. Read more
fn skip_while<Fut, F>(self, f: F) -> SkipWhile<Self, Fut, F> where
F: FnMut(&Self::Item) -> Fut,
Fut: Future<Output = bool>,
fn skip_while<Fut, F>(self, f: F) -> SkipWhile<Self, Fut, F> where
F: FnMut(&Self::Item) -> Fut,
Fut: Future<Output = bool>,
Skip elements on this stream while the provided asynchronous predicate
resolves to true
. Read more
fn take_while<Fut, F>(self, f: F) -> TakeWhile<Self, Fut, F> where
F: FnMut(&Self::Item) -> Fut,
Fut: Future<Output = bool>,
fn take_while<Fut, F>(self, f: F) -> TakeWhile<Self, Fut, F> where
F: FnMut(&Self::Item) -> Fut,
Fut: Future<Output = bool>,
Take elements from this stream while the provided asynchronous predicate
resolves to true
. Read more
fn take_until<Fut>(self, fut: Fut) -> TakeUntil<Self, Fut> where
Fut: Future,
fn take_until<Fut>(self, fut: Fut) -> TakeUntil<Self, Fut> where
Fut: Future,
Take elements from this stream until the provided future resolves. Read more
fn for_each<Fut, F>(self, f: F) -> ForEach<Self, Fut, F> where
F: FnMut(Self::Item) -> Fut,
Fut: Future<Output = ()>,
fn for_each<Fut, F>(self, f: F) -> ForEach<Self, Fut, F> where
F: FnMut(Self::Item) -> Fut,
Fut: Future<Output = ()>,
Runs this stream to completion, executing the provided asynchronous closure for each element on the stream. Read more
fn for_each_concurrent<Fut, F>(
self,
limit: impl Into<Option<usize>>,
f: F
) -> ForEachConcurrent<Self, Fut, F> where
F: FnMut(Self::Item) -> Fut,
Fut: Future<Output = ()>,
fn for_each_concurrent<Fut, F>(
self,
limit: impl Into<Option<usize>>,
f: F
) -> ForEachConcurrent<Self, Fut, F> where
F: FnMut(Self::Item) -> Fut,
Fut: Future<Output = ()>,
Runs this stream to completion, executing the provided asynchronous closure for each element on the stream concurrently as elements become available. Read more
fn take(self, n: usize) -> Take<Self>
fn take(self, n: usize) -> Take<Self>
Creates a new stream of at most n
items of the underlying stream. Read more
fn skip(self, n: usize) -> Skip<Self>
fn skip(self, n: usize) -> Skip<Self>
Creates a new stream which skips n
items of the underlying stream. Read more
fn fuse(self) -> Fuse<Self>
fn fuse(self) -> Fuse<Self>
fn catch_unwind(self) -> CatchUnwind<Self> where
Self: UnwindSafe,
fn catch_unwind(self) -> CatchUnwind<Self> where
Self: UnwindSafe,
Catches unwinding panics while polling the stream. Read more
fn boxed<'a>(
self
) -> Pin<Box<dyn Stream<Item = Self::Item> + Send + 'a, Global>> where
Self: 'a + Send,
fn boxed<'a>(
self
) -> Pin<Box<dyn Stream<Item = Self::Item> + Send + 'a, Global>> where
Self: 'a + Send,
Wrap the stream in a Box, pinning it. Read more
fn boxed_local<'a>(self) -> Pin<Box<dyn Stream<Item = Self::Item> + 'a, Global>> where
Self: 'a,
fn boxed_local<'a>(self) -> Pin<Box<dyn Stream<Item = Self::Item> + 'a, Global>> where
Self: 'a,
Wrap the stream in a Box, pinning it. Read more
fn buffered(self, n: usize) -> Buffered<Self> where
Self::Item: Future,
fn buffered(self, n: usize) -> Buffered<Self> where
Self::Item: Future,
An adaptor for creating a buffered list of pending futures. Read more
fn buffer_unordered(self, n: usize) -> BufferUnordered<Self> where
Self::Item: Future,
fn buffer_unordered(self, n: usize) -> BufferUnordered<Self> where
Self::Item: Future,
An adaptor for creating a buffered list of pending futures (unordered). Read more
fn zip<St>(self, other: St) -> Zip<Self, St> where
St: Stream,
fn zip<St>(self, other: St) -> Zip<Self, St> where
St: Stream,
An adapter for zipping two streams together. Read more
fn chain<St>(self, other: St) -> Chain<Self, St> where
St: Stream<Item = Self::Item>,
fn chain<St>(self, other: St) -> Chain<Self, St> where
St: Stream<Item = Self::Item>,
Adapter for chaining two streams. Read more
fn chunks(self, capacity: usize) -> Chunks<Self>
fn chunks(self, capacity: usize) -> Chunks<Self>
An adaptor for chunking up items of the stream inside a vector. Read more
fn ready_chunks(self, capacity: usize) -> ReadyChunks<Self>
fn ready_chunks(self, capacity: usize) -> ReadyChunks<Self>
An adaptor for chunking up ready items of the stream inside a vector. Read more
fn inspect<F>(self, f: F) -> Inspect<Self, F> where
F: FnMut(&Self::Item),
fn inspect<F>(self, f: F) -> Inspect<Self, F> where
F: FnMut(&Self::Item),
Do something with each item of this stream, afterwards passing it on. Read more
fn left_stream<B>(self) -> Either<Self, B> where
B: Stream<Item = Self::Item>,
fn left_stream<B>(self) -> Either<Self, B> where
B: Stream<Item = Self::Item>,
Wrap this stream in an Either
stream, making it the left-hand variant
of that Either
. Read more
fn right_stream<B>(self) -> Either<B, Self> where
B: Stream<Item = Self::Item>,
fn right_stream<B>(self) -> Either<B, Self> where
B: Stream<Item = Self::Item>,
Wrap this stream in an Either
stream, making it the right-hand variant
of that Either
. Read more
fn poll_next_unpin(&mut self, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> where
Self: Unpin,
fn poll_next_unpin(&mut self, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> where
Self: Unpin,
fn select_next_some(&mut self) -> SelectNextSome<'_, Self> where
Self: Unpin + FusedStream,
fn select_next_some(&mut self) -> SelectNextSome<'_, Self> where
Self: Unpin + FusedStream,
sourceimpl<T> ToOwned for T where
T: Clone,
impl<T> ToOwned for T where
T: Clone,
type Owned = T
type Owned = T
The resulting type after obtaining ownership.
sourcefn clone_into(&self, target: &mut T)
fn clone_into(&self, target: &mut T)
toowned_clone_into
)Uses borrowed data to replace owned data, usually by cloning. Read more
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
fn vzip(self) -> V
sourceimpl<T> WithSubscriber for T
impl<T> WithSubscriber for T
sourcefn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> where
S: Into<Dispatch>,
Attaches the provided Subscriber
to this type, returning a
WithDispatch
wrapper. Read more
sourcefn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Attaches the current default Subscriber
to this type, returning a
WithDispatch
wrapper. Read more