Struct NativeIO
pub struct NativeIO;Expand description
Default [ProtocolIO] implementation for native platforms.
Wraps TCP/TLS/QUIC for ordered streams, UDP for unreliable datagrams, and the system RNG. All existing protocol behaviour is preserved.
Trait Implementations§
§impl PlatformOps for NativeIO
impl PlatformOps for NativeIO
§fn identify_nat_type(
stun_servers: Option<Vec<String>>,
) -> impl Future<Output = Result<NatType, Error>> + ContextRequirements
fn identify_nat_type( stun_servers: Option<Vec<String>>, ) -> impl Future<Output = Result<NatType, Error>> + ContextRequirements
Identify local NAT type via STUN servers.
Default: returns
NatType::offline() (appropriate for WASM).§fn quic_udp_channel(
conn: Connection,
local_addr: SocketAddr,
) -> Option<UdpSplittableTypes>
fn quic_udp_channel( conn: Connection, local_addr: SocketAddr, ) -> Option<UdpSplittableTypes>
Create a UDP channel from an existing QUIC connection.
Default: returns
None (QUIC not available).§fn c2s_hole_punch<R>(
stream: ReliableOrderedCompatStream<R>,
ratchet: R,
security_level: SecurityLevel,
target_cid: u64,
stun_servers: Option<Vec<String>>,
node_type: RelativeNodeType,
) -> impl Future<Output = Result<Option<UdpSplittableTypes>, NetworkError>> + ContextRequirementswhere
R: Ratchet,
fn c2s_hole_punch<R>(
stream: ReliableOrderedCompatStream<R>,
ratchet: R,
security_level: SecurityLevel,
target_cid: u64,
stun_servers: Option<Vec<String>>,
node_type: RelativeNodeType,
) -> impl Future<Output = Result<Option<UdpSplittableTypes>, NetworkError>> + ContextRequirementswhere
R: Ratchet,
Perform C2S UDP hole punch via
NetworkEndpoint + encrypted hole punch.
Returns the resulting UDP interface, or None if unavailable.
Default: returns Ok(None) (hole punching not available).§fn p2p_hole_punch<R>(
session: CitadelSession<R, NativeIO>,
peer_connection_type: PeerConnectionType,
ticket: Ticket,
peer_nat_info: PeerNatInfo,
channel_signal: NodeResult<R>,
hole_punch_compat_stream: ReliableOrderedCompatStream<R>,
endpoint_ratchet: R,
peer_cid: u64,
sync_instant: Instant,
node_type: RelativeNodeType,
udp_mode: UdpMode,
session_security_settings: SessionSecuritySettings,
cancel_rx: Option<Receiver<()>>,
) -> impl Future<Output = Result<(), NetworkError>> + ContextRequirementswhere
R: Ratchet,
fn p2p_hole_punch<R>(
session: CitadelSession<R, NativeIO>,
peer_connection_type: PeerConnectionType,
ticket: Ticket,
peer_nat_info: PeerNatInfo,
channel_signal: NodeResult<R>,
hole_punch_compat_stream: ReliableOrderedCompatStream<R>,
endpoint_ratchet: R,
peer_cid: u64,
sync_instant: Instant,
node_type: RelativeNodeType,
udp_mode: UdpMode,
session_security_settings: SessionSecuritySettings,
cancel_rx: Option<Receiver<()>>,
) -> impl Future<Output = Result<(), NetworkError>> + ContextRequirementswhere
R: Ratchet,
Orchestrate P2P hole punch: register endpoint, punch, establish
connection, send
channel_signal to kernel.
On failure (or on WASM), sends channel_signal as TCP-only fallback.§fn open_and_validate_for_transfer(
source_path: &Path,
expected_metadata: Option<&VirtualObjectMetadata>,
) -> Result<TransferMetadata, NetworkError>
fn open_and_validate_for_transfer( source_path: &Path, expected_metadata: Option<&VirtualObjectMetadata>, ) -> Result<TransferMetadata, NetworkError>
Open a file and validate it for transfer.
Default: returns an error (file transfer not supported).
§fn async_delete_file(source: PathBuf)
fn async_delete_file(source: PathBuf)
Asynchronously delete a file after transfer.
Default: no-op.
§fn spawn_udp_socket_loader<R>(
session: CitadelSession<R, NativeIO>,
v_target: VirtualConnectionType,
udp_conn: UdpSplittableTypes,
addr: TargettedSocketAddr,
ticket: Ticket,
tcp_conn_awaiter: Option<Receiver<()>>,
)where
R: Ratchet,
fn spawn_udp_socket_loader<R>(
session: CitadelSession<R, NativeIO>,
v_target: VirtualConnectionType,
udp_conn: UdpSplittableTypes,
addr: TargettedSocketAddr,
ticket: Ticket,
tcp_conn_awaiter: Option<Receiver<()>>,
)where
R: Ratchet,
Spawn the UDP socket loader for a session.
On native: spawns an async task for the full UDP subsystem.
Default: no-op.
§impl ProtocolIO for NativeIO
impl ProtocolIO for NativeIO
§type Addr = SocketAddr
type Addr = SocketAddr
Network address type (e.g.
SocketAddr for native, URL for WASM).§type Stream = GenericNetworkStream
type Stream = GenericNetworkStream
Bidirectional ordered reliable stream
(TCP/TLS/QUIC in native, WebSocket in WASM).
§type UnreliableSocket = NativeUdpSocket
type UnreliableSocket = NativeUdpSocket
Unreliable datagram socket (UDP in native, WebRTC DataChannel in WASM).
§type OrderedReliableConfig = NativeOrderedReliableConfig
type OrderedReliableConfig = NativeOrderedReliableConfig
Config for ordered reliable transport without transport-level encryption
(e.g. TCP for native, ws:// WebSocket for WASM).
§type SecureConfig = NativeSecureConfig
type SecureConfig = NativeSecureConfig
Config for ordered reliable transport WITH transport-level encryption
(e.g. TLS for native, wss:// WebSocket for WASM).
§type P2PConfig = NativeP2PConfig
type P2PConfig = NativeP2PConfig
Config for P2P-capable transport with multiplexed streams
(e.g. QUIC for native, WebRTC for WASM).
§type ClientConfig = Arc<ClientConfig>
type ClientConfig = Arc<ClientConfig>
Client-side configuration (TLS client config, WebSocket options, etc.).
§async fn bind(
config: ServerMode<NativeIO>,
addr: <NativeIO as ProtocolIO>::Addr,
) -> Result<(<NativeIO as ProtocolIO>::Listener, <NativeIO as ProtocolIO>::Addr), Error>
async fn bind( config: ServerMode<NativeIO>, addr: <NativeIO as ProtocolIO>::Addr, ) -> Result<(<NativeIO as ProtocolIO>::Listener, <NativeIO as ProtocolIO>::Addr), Error>
Bind a server listener to the given address.
§async fn connect(
config: &<NativeIO as ProtocolIO>::ClientConfig,
addr: <NativeIO as ProtocolIO>::Addr,
) -> Result<<NativeIO as ProtocolIO>::Stream, Error>
async fn connect( config: &<NativeIO as ProtocolIO>::ClientConfig, addr: <NativeIO as ProtocolIO>::Addr, ) -> Result<<NativeIO as ProtocolIO>::Stream, Error>
Connect to a remote address (client side).
§async fn bind_unreliable(
addr: <NativeIO as ProtocolIO>::Addr,
) -> Result<<NativeIO as ProtocolIO>::UnreliableSocket, Error>
async fn bind_unreliable( addr: <NativeIO as ProtocolIO>::Addr, ) -> Result<<NativeIO as ProtocolIO>::UnreliableSocket, Error>
Create an unreliable datagram socket bound to the given address.
§async fn default_client_config() -> Result<<NativeIO as ProtocolIO>::ClientConfig, Error>
async fn default_client_config() -> Result<<NativeIO as ProtocolIO>::ClientConfig, Error>
Create a default client configuration for this transport. Read more
§fn server_identity(config: &ServerMode<NativeIO>) -> Option<String>
fn server_identity(config: &ServerMode<NativeIO>) -> Option<String>
Extract a TLS/identity domain from the server configuration, if any. Read more
§fn local_addr(
stream: &<NativeIO as ProtocolIO>::Stream,
) -> Result<<NativeIO as ProtocolIO>::Addr, Error>
fn local_addr( stream: &<NativeIO as ProtocolIO>::Stream, ) -> Result<<NativeIO as ProtocolIO>::Addr, Error>
Retrieve the local address of an established stream. Read more
§async fn default_server_config() -> Result<ServerMode<NativeIO>, Error>
async fn default_server_config() -> Result<ServerMode<NativeIO>, Error>
Create a default server configuration for this transport. Read more
§fn config_warnings(config: &ServerMode<NativeIO>)
fn config_warnings(config: &ServerMode<NativeIO>)
Log any warnings about the server configuration. Read more
§fn from_socket_addr(addr: SocketAddr) -> SocketAddr
fn from_socket_addr(addr: SocketAddr) -> SocketAddr
Convert a standard socket address to this protocol’s address type.
§fn to_socket_addr(addr: &SocketAddr) -> SocketAddr
fn to_socket_addr(addr: &SocketAddr) -> SocketAddr
Convert this protocol’s address to a standard socket address.
§fn addr_port(addr: &SocketAddr) -> u16
fn addr_port(addr: &SocketAddr) -> u16
Extract the port number from an address.
§fn peer_addr(stream: &GenericNetworkStream) -> Result<SocketAddr, Error>
fn peer_addr(stream: &GenericNetworkStream) -> Result<SocketAddr, Error>
Get the peer address of an established stream.
§fn take_p2p_connection(
stream: &mut GenericNetworkStream,
) -> Option<Box<dyn Any + Send>>
fn take_p2p_connection( stream: &mut GenericNetworkStream, ) -> Option<Box<dyn Any + Send>>
Extract an opaque P2P connection handle from a stream (if present). Read more
§fn client_config_to_any(
config: &Arc<ClientConfig>,
) -> Option<Box<dyn Any + Send>>
fn client_config_to_any( config: &Arc<ClientConfig>, ) -> Option<Box<dyn Any + Send>>
Extract an opaque handle from the client config for P2P operations. Read more
§async fn bind_with_websocket(
primary: <NativeIO as ProtocolIO>::Listener,
ws_bind_addr: Option<SocketAddr>,
) -> Result<<NativeIO as ProtocolIO>::Listener, Error>
async fn bind_with_websocket( primary: <NativeIO as ProtocolIO>::Listener, ws_bind_addr: Option<SocketAddr>, ) -> Result<<NativeIO as ProtocolIO>::Listener, Error>
Optionally bind an additional WebSocket listener and merge it with
the primary listener. Read more
§impl ProtocolUpgrade<NativeIO> for TcpToQuicUpgrade
impl ProtocolUpgrade<NativeIO> for TcpToQuicUpgrade
§type Signal = QuicRedirectSignal
type Signal = QuicRedirectSignal
Redirect signal sent from server to client over the signaling channel.
§fn build_signal(
target_config: &ServerMode<NativeIO>,
client_addr: SocketAddr,
) -> <TcpToQuicUpgrade as ProtocolUpgrade<NativeIO>>::Signal
fn build_signal( target_config: &ServerMode<NativeIO>, client_addr: SocketAddr, ) -> <TcpToQuicUpgrade as ProtocolUpgrade<NativeIO>>::Signal
Build the redirect signal for a connecting client.
§fn serialize_signal(
signal: &<TcpToQuicUpgrade as ProtocolUpgrade<NativeIO>>::Signal,
) -> Result<Bytes, Error>
fn serialize_signal( signal: &<TcpToQuicUpgrade as ProtocolUpgrade<NativeIO>>::Signal, ) -> Result<Bytes, Error>
Serialize the signal for wire transmission.
§fn deserialize_signal(
bytes: &[u8],
) -> Result<<TcpToQuicUpgrade as ProtocolUpgrade<NativeIO>>::Signal, Error>
fn deserialize_signal( bytes: &[u8], ) -> Result<<TcpToQuicUpgrade as ProtocolUpgrade<NativeIO>>::Signal, Error>
Deserialize signal received from server.
§async fn bind_upgrade_pair(
target_config: ServerMode<NativeIO>,
addr: SocketAddr,
) -> Result<UpgradeListenerPair<NativeIO>, Error>
async fn bind_upgrade_pair( target_config: ServerMode<NativeIO>, addr: SocketAddr, ) -> Result<UpgradeListenerPair<NativeIO>, Error>
Create both the signaling listener and the target listener. Read more
§async fn connect_target(
signal: <TcpToQuicUpgrade as ProtocolUpgrade<NativeIO>>::Signal,
local_addr: SocketAddr,
remote_addr: SocketAddr,
client_config: &Arc<ClientConfig>,
) -> Result<GenericNetworkStream, Error>
async fn connect_target( signal: <TcpToQuicUpgrade as ProtocolUpgrade<NativeIO>>::Signal, local_addr: SocketAddr, remote_addr: SocketAddr, client_config: &Arc<ClientConfig>, ) -> Result<GenericNetworkStream, Error>
Client-side: given the redirect signal, connect to the target transport.
§fn merge_upgrade_listeners(
signal_listener: DualListener,
target_listener: DualListener,
) -> DualListener
fn merge_upgrade_listeners( signal_listener: DualListener, target_listener: DualListener, ) -> DualListener
Merge a signaling listener and target listener into a composite listener. Read more
§fn bind_with_upgrade(
target_config: ServerMode<T>,
addr: <T as ProtocolIO>::Addr,
) -> impl Future<Output = Result<(<T as ProtocolIO>::Listener, <T as ProtocolIO>::Addr), Error>> + Send
fn bind_with_upgrade( target_config: ServerMode<T>, addr: <T as ProtocolIO>::Addr, ) -> impl Future<Output = Result<(<T as ProtocolIO>::Listener, <T as ProtocolIO>::Addr), Error>> + Send
Server: bind a composite listener that redirects on one transport
and accepts real connections on another. Read more
§fn connect_with_upgrade(
remote_addr: <T as ProtocolIO>::Addr,
client_config: &<T as ProtocolIO>::ClientConfig,
) -> impl Future<Output = Result<<T as ProtocolIO>::Stream, Error>> + Send
fn connect_with_upgrade( remote_addr: <T as ProtocolIO>::Addr, client_config: &<T as ProtocolIO>::ClientConfig, ) -> impl Future<Output = Result<<T as ProtocolIO>::Stream, Error>> + Send
Client: connect to the signaling transport, read the redirect signal,
then connect to the target transport.
Auto Trait Implementations§
impl Freeze for NativeIO
impl RefUnwindSafe for NativeIO
impl Send for NativeIO
impl Sync for NativeIO
impl Unpin for NativeIO
impl UnsafeUnpin for NativeIO
impl UnwindSafe for NativeIO
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
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
Causes
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
Causes
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
Causes
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
Causes
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
Causes
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
Causes
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
Causes
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
Causes
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
Formats each item in a sequence. Read more
§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>
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>
Converts
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>
Converts
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 more§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Pipes by value. This is generally the method you want to use. Read more
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
Borrows
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
Mutably borrows
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
Borrows
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
Mutably borrows
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
Borrows
self, then passes self.deref() into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Immutable access to the
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
Mutable access to the
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
Immutable access to the
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
Mutable access to the
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Immutable access to the
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Mutable access to the
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
Calls
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
Calls
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
Calls
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
Calls
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
Calls
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
Calls
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
Calls
.tap_deref() only in debug builds, and is erased in release
builds.