use crate::error::Result; use crate::prelude::encrypted::{EncryptedReadStream, EncryptedWriteStream}; use crate::prelude::{AsyncProtocolStreamSplit, IPCResult}; use crate::protocol::encrypted::{EncryptedListener, EncryptedStream, EncryptionOptions}; use crate::protocol::{AsyncProtocolStream, AsyncStreamProtocolListener}; use async_trait::async_trait; #[async_trait] impl AsyncStreamProtocolListener for EncryptedListener { type AddressType = T::AddressType; type RemoteAddressType = T::RemoteAddressType; type Stream = EncryptedStream; type ListenerOptions = EncryptionOptions; async fn protocol_bind( address: Self::AddressType, options: Self::ListenerOptions, ) -> IPCResult { let inner = T::protocol_bind(address, options.inner_options).await?; Ok(EncryptedListener::new(inner, options.keys)) } async fn protocol_accept(&self) -> IPCResult<(Self::Stream, Self::RemoteAddressType)> { let (inner_stream, remote_addr) = self.inner.protocol_accept().await?; let stream = Self::Stream::from_server_key_exchange(inner_stream, &self.keys).await?; Ok((stream, remote_addr)) } } #[async_trait] impl AsyncProtocolStream for EncryptedStream { type AddressType = T::AddressType; type StreamOptions = EncryptionOptions; async fn protocol_connect( address: Self::AddressType, options: Self::StreamOptions, ) -> Result { let inner = T::protocol_connect(address, options.inner_options).await?; EncryptedStream::from_client_key_exchange(inner, &options.keys).await } } #[async_trait] impl AsyncProtocolStreamSplit for EncryptedStream { type OwnedSplitReadHalf = EncryptedReadStream; type OwnedSplitWriteHalf = EncryptedWriteStream; fn protocol_into_split(self) -> (Self::OwnedSplitReadHalf, Self::OwnedSplitWriteHalf) { (self.read_half, self.write_half) } }