pub struct Endpoint { /* private fields */ }Expand description
Represents a socket using the QUIC protocol to communicate with peers.
Stream
Receives incoming Connections through [Stream].
Implementations§
§impl Endpoint
impl Endpoint
pub fn new_client() -> Result<Endpoint, Config>
pub fn new_client() -> Result<Endpoint, 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
Connections.
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()?;pub fn new_server(port: u16, key_pair: KeyPair) -> Result<Endpoint, Config>
pub fn new_server(port: u16, key_pair: KeyPair) -> Result<Endpoint, 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
KeyPairis 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"))?;pub async fn connect<U>(&self, url: U) -> Result<Connecting, Connect>
pub async fn connect<U>(&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::ParseUrlif the URL couldn’t be parsederror::Connect::Domainif the URL didn’t contain a domainerror::Connect::Portif the URL didn’t contain a porterror::Connect::ParseDomainif the domain couldn’t be parsederror::Connect::TrustDnsif the URL couldn’t be resolved to an IP address withtrust-dnserror::Connect::StdDnsif the URL couldn’t be resolved to an IP address withToSocketAddrserror::Connect::NoIpif 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?;pub async fn connect_pinned<U>(
&self,
url: U,
server_certificate: &Certificate,
client_key_pair: Option<KeyPair>
) -> Result<Connecting, Connect>
pub async fn connect_pinned<U>( &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::MultipleDomainsif multiple domains are present in theCertificate, which isn’t supportederror::Connect::ParseUrlif the URL couldn’t be parsederror::Connect::Domainif the URL didn’t contain a domainerror::Connect::Portif the URL didn’t contain a porterror::Connect::ParseDomainif the domain couldn’t be parsederror::Connect::TrustDnsif the URL couldn’t be resolved to an IP address withtrust-dnserror::Connect::StdDnsif the URL couldn’t be resolved to an IP address withToSocketAddrserror::Connect::NoIpif 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?;pub 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());pub async fn close(&self)
pub async fn close(&self)
Close all of this Endpoint’s Connections
immediately and cease accepting new Connections.
To close an Endpoint gracefully use
close_incoming,
Sender::finish and
wait_idle.
Examples
use fabruic::Endpoint;
let endpoint = Endpoint::new_client()?;
endpoint.close();pub 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());pub async fn wait_idle(&self)
pub async fn wait_idle(&self)
Wait for all Connections 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§
§impl Dangerous for Endpoint
impl Dangerous for Endpoint
§fn connect_unverified<'life0, 'async_trait, U>(
endpoint: &'life0 Endpoint,
url: U,
client_key_pair: Option<KeyPair>
) -> Pin<Box<dyn Future<Output = Result<Connecting, Connect>> + Send + 'async_trait>>
fn connect_unverified<'life0, 'async_trait, U>( endpoint: &'life0 Endpoint, url: U, client_key_pair: Option<KeyPair> ) -> Pin<Box<dyn Future<Output = Result<Connecting, Connect>> + Send + 'async_trait>>
Connection to a server without
verifying the servers Certificate. The servers
CertificateChain can still be manually
insepcted through
Connection::peer_identity. Read more§impl FusedStream for Endpoint
impl FusedStream for Endpoint
§fn is_terminated(&self) -> bool
fn is_terminated(&self) -> bool
true if the stream should no longer be polled.§impl Stream for Endpoint
impl Stream for Endpoint
§type Item = Connecting
type Item = Connecting
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§
§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
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<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§impl<St> StreamExt for Stwhere
St: Stream + ?Sized,
impl<St> StreamExt for Stwhere
St: Stream + ?Sized,
§fn next(&mut self) -> Next<'_, Self>where
Self: Unpin,
fn next(&mut self) -> Next<'_, Self>where
Self: Unpin,
None if the
stream is finished. Read more§fn try_next<T, E>(&mut self) -> TryNext<'_, Self>
fn try_next<T, E>(&mut self) -> TryNext<'_, Self>
§fn map<T, F>(self, f: F) -> Map<Self, F>
fn map<T, F>(self, f: F) -> Map<Self, F>
§fn map_while<T, F>(self, f: F) -> MapWhile<Self, F>
fn map_while<T, F>(self, f: F) -> MapWhile<Self, F>
None. Read more§fn then<F, Fut>(self, f: F) -> Then<Self, Fut, F>
fn then<F, Fut>(self, f: F) -> Then<Self, Fut, F>
§fn merge<U>(self, other: U) -> Merge<Self, U>where
U: Stream<Item = Self::Item>,
Self: Sized,
fn merge<U>(self, other: U) -> Merge<Self, U>where
U: Stream<Item = Self::Item>,
Self: Sized,
§fn filter<F>(self, f: F) -> Filter<Self, F>
fn filter<F>(self, f: F) -> Filter<Self, F>
§fn filter_map<T, F>(self, f: F) -> FilterMap<Self, F>
fn filter_map<T, F>(self, f: F) -> FilterMap<Self, F>
§fn fuse(self) -> Fuse<Self>where
Self: Sized,
fn fuse(self) -> Fuse<Self>where
Self: Sized,
None. Read more§fn take(self, n: usize) -> Take<Self>where
Self: Sized,
fn take(self, n: usize) -> Take<Self>where
Self: Sized,
n items of the underlying stream. Read more§fn take_while<F>(self, f: F) -> TakeWhile<Self, F>
fn take_while<F>(self, f: F) -> TakeWhile<Self, F>
true. Read more§fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
n first items of the
underlying stream. Read more§fn skip_while<F>(self, f: F) -> SkipWhile<Self, F>
fn skip_while<F>(self, f: F) -> SkipWhile<Self, F>
true. Read more§fn all<F>(&mut self, f: F) -> AllFuture<'_, Self, F>
fn all<F>(&mut self, f: F) -> AllFuture<'_, Self, F>
§fn any<F>(&mut self, f: F) -> AnyFuture<'_, Self, F>
fn any<F>(&mut self, f: F) -> AnyFuture<'_, Self, F>
§fn chain<U>(self, other: U) -> Chain<Self, U>where
U: Stream<Item = Self::Item>,
Self: Sized,
fn chain<U>(self, other: U) -> Chain<Self, U>where
U: Stream<Item = Self::Item>,
Self: Sized,
§fn fold<B, F>(self, init: B, f: F) -> FoldFuture<Self, B, F>
fn fold<B, F>(self, init: B, f: F) -> FoldFuture<Self, B, F>
§fn collect<T>(self) -> Collect<Self, T>where
T: FromStream<Self::Item>,
Self: Sized,
fn collect<T>(self) -> Collect<Self, T>where
T: FromStream<Self::Item>,
Self: Sized,
§fn timeout(self, duration: Duration) -> Timeout<Self>where
Self: Sized,
fn timeout(self, duration: Duration) -> Timeout<Self>where
Self: Sized,
§fn timeout_repeating(self, interval: Interval) -> TimeoutRepeating<Self>where
Self: Sized,
fn timeout_repeating(self, interval: Interval) -> TimeoutRepeating<Self>where
Self: Sized,
§impl<T> StreamExt for Twhere
T: Stream + ?Sized,
impl<T> StreamExt for Twhere
T: Stream + ?Sized,
§fn next(&mut self) -> Next<'_, Self>where
Self: Unpin,
fn next(&mut self) -> Next<'_, Self>where
Self: Unpin,
§fn into_future(self) -> StreamFuture<Self>
fn into_future(self) -> StreamFuture<Self>
§fn map<T, F>(self, f: F) -> Map<Self, F>
fn map<T, F>(self, f: F) -> Map<Self, F>
§fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
§fn filter<Fut, F>(self, f: F) -> Filter<Self, Fut, F>
fn filter<Fut, F>(self, f: F) -> Filter<Self, Fut, F>
§fn filter_map<Fut, T, F>(self, f: F) -> FilterMap<Self, Fut, F>
fn filter_map<Fut, T, F>(self, f: F) -> FilterMap<Self, Fut, F>
§fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F>
fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F>
§fn collect<C>(self) -> Collect<Self, C>
fn collect<C>(self) -> Collect<Self, C>
§fn unzip<A, B, FromA, FromB>(self) -> Unzip<Self, FromA, FromB>
fn unzip<A, B, FromA, FromB>(self) -> Unzip<Self, FromA, FromB>
§fn concat(self) -> Concat<Self>
fn concat(self) -> Concat<Self>
§fn count(self) -> Count<Self>where
Self: Sized,
fn count(self) -> Count<Self>where
Self: Sized,
§fn fold<T, Fut, F>(self, init: T, f: F) -> Fold<Self, Fut, T, F>
fn fold<T, Fut, F>(self, init: T, f: F) -> Fold<Self, Fut, T, F>
§fn any<Fut, F>(self, f: F) -> Any<Self, Fut, F>
fn any<Fut, F>(self, f: F) -> Any<Self, Fut, F>
true if any element in stream satisfied a predicate. Read more§fn all<Fut, F>(self, f: F) -> All<Self, Fut, F>
fn all<Fut, F>(self, f: F) -> All<Self, Fut, F>
true if all element in stream satisfied a predicate. Read more§fn flatten(self) -> Flatten<Self>where
Self::Item: Stream,
Self: Sized,
fn flatten(self) -> Flatten<Self>where
Self::Item: Stream,
Self: Sized,
§fn flatten_unordered(
self,
limit: impl Into<Option<usize>>
) -> FlattenUnorderedWithFlowController<Self, ()>
fn flatten_unordered( self, limit: impl Into<Option<usize>> ) -> FlattenUnorderedWithFlowController<Self, ()>
§fn flat_map_unordered<U, F>(
self,
limit: impl Into<Option<usize>>,
f: F
) -> FlatMapUnordered<Self, U, F>
fn flat_map_unordered<U, F>( self, limit: impl Into<Option<usize>>, f: F ) -> FlatMapUnordered<Self, U, F>
StreamExt::map] but flattens nested Streams
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>
fn scan<S, B, Fut, F>(self, initial_state: S, f: F) -> Scan<Self, S, Fut, F>
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>
fn skip_while<Fut, F>(self, f: F) -> SkipWhile<Self, Fut, F>
true. Read more§fn take_while<Fut, F>(self, f: F) -> TakeWhile<Self, Fut, F>
fn take_while<Fut, F>(self, f: F) -> TakeWhile<Self, Fut, F>
true. Read more§fn take_until<Fut>(self, fut: Fut) -> TakeUntil<Self, Fut>
fn take_until<Fut>(self, fut: Fut) -> TakeUntil<Self, Fut>
§fn for_each<Fut, F>(self, f: F) -> ForEach<Self, Fut, F>
fn for_each<Fut, F>(self, f: F) -> ForEach<Self, Fut, F>
§fn for_each_concurrent<Fut, F>(
self,
limit: impl Into<Option<usize>>,
f: F
) -> ForEachConcurrent<Self, Fut, F>
fn for_each_concurrent<Fut, F>( self, limit: impl Into<Option<usize>>, f: F ) -> ForEachConcurrent<Self, Fut, F>
§fn take(self, n: usize) -> Take<Self>where
Self: Sized,
fn take(self, n: usize) -> Take<Self>where
Self: Sized,
n items of the underlying stream. Read more§fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
n items of the underlying stream. Read more§fn catch_unwind(self) -> CatchUnwind<Self>where
Self: Sized + UnwindSafe,
fn catch_unwind(self) -> CatchUnwind<Self>where
Self: Sized + UnwindSafe,
§fn boxed<'a>(self) -> Pin<Box<dyn Stream<Item = Self::Item> + Send + 'a>>
fn boxed<'a>(self) -> Pin<Box<dyn Stream<Item = Self::Item> + Send + 'a>>
§fn boxed_local<'a>(self) -> Pin<Box<dyn Stream<Item = Self::Item> + 'a>>where
Self: Sized + 'a,
fn boxed_local<'a>(self) -> Pin<Box<dyn Stream<Item = Self::Item> + 'a>>where
Self: Sized + 'a,
§fn buffered(self, n: usize) -> Buffered<Self>
fn buffered(self, n: usize) -> Buffered<Self>
§fn buffer_unordered(self, n: usize) -> BufferUnordered<Self>
fn buffer_unordered(self, n: usize) -> BufferUnordered<Self>
§fn zip<St>(self, other: St) -> Zip<Self, St>where
St: Stream,
Self: Sized,
fn zip<St>(self, other: St) -> Zip<Self, St>where
St: Stream,
Self: Sized,
§fn chain<St>(self, other: St) -> Chain<Self, St>where
St: Stream<Item = Self::Item>,
Self: Sized,
fn chain<St>(self, other: St) -> Chain<Self, St>where
St: Stream<Item = Self::Item>,
Self: Sized,
§fn peekable(self) -> Peekable<Self>where
Self: Sized,
fn peekable(self) -> Peekable<Self>where
Self: Sized,
peek method. Read more§fn chunks(self, capacity: usize) -> Chunks<Self>where
Self: Sized,
fn chunks(self, capacity: usize) -> Chunks<Self>where
Self: Sized,
§fn ready_chunks(self, capacity: usize) -> ReadyChunks<Self>where
Self: Sized,
fn ready_chunks(self, capacity: usize) -> ReadyChunks<Self>where
Self: Sized,
§fn forward<S>(self, sink: S) -> Forward<Self, S>where
S: Sink<Self::Ok, Error = Self::Error>,
Self: TryStream + Sized,
fn forward<S>(self, sink: S) -> Forward<Self, S>where
S: Sink<Self::Ok, Error = Self::Error>,
Self: TryStream + Sized,
§fn inspect<F>(self, f: F) -> Inspect<Self, F>
fn inspect<F>(self, f: F) -> Inspect<Self, F>
§fn left_stream<B>(self) -> Either<Self, B>where
B: Stream<Item = Self::Item>,
Self: Sized,
fn left_stream<B>(self) -> Either<Self, B>where
B: Stream<Item = Self::Item>,
Self: Sized,
§fn right_stream<B>(self) -> Either<B, Self>where
B: Stream<Item = Self::Item>,
Self: Sized,
fn right_stream<B>(self) -> Either<B, Self>where
B: Stream<Item = Self::Item>,
Self: Sized,
§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,
Stream::poll_next] on Unpin
stream types.