Skip to main content

HydraClient

Struct HydraClient 

Source
pub struct HydraClient<R> { /* private fields */ }
Expand description

HydraClient connects to the relay server as a producer or consumer, performs handshake, and sends/receives encrypted frames. It maintains an internal memory pool (18 mb) for zero-copy crypto and buffering. The broadcast method allows producers to send encrypted frames to all connected consumers in the same session, while the recv method allows consumers to receive and decrypt frames from the producer.

use hydra_sync::client::{HydraClient, Producer, Consumer};

#[tokio::main]
async fn main() {
    let addr = "127.0.0.1:8000";
    let session_id = [0xFFu8; 64];
    let session_key = [0xAAu8; 32];

    let mut producer = HydraClient::<Producer>::connect(addr, &session_id, session_key).await.unwrap();
    producer.broadcast(b"I luv you >.<").await.unwrap(); // sends to all consumer

    let mut consumer = HydraClient::<Consumer>::connect(addr, &session_id, session_key).await.unwrap();
    consumer.recv().await.unwrap(); // recv whatever next frame on ring buf
}

Implementations§

Source§

impl HydraClient<Producer>

Source

pub async fn connect<A: ToSocketAddrs>( addr: A, session_id: &[u8; 64], session_key: [u8; 32], ) -> Result<Self>

Connects to the server, performs handshake, and sends a join frame with Role::Producer and session_id.

Source

pub async fn broadcast(&mut self, data: &[u8]) -> Result<()>

Broadcasts the given data as an encrypted frame to all connected consumers (zero-copy) in the same session.

Source§

impl HydraClient<Consumer>

Source

pub async fn connect<A: ToSocketAddrs>( addr: A, session_id: &[u8; 64], session_key: [u8; 32], ) -> Result<Self>

Connects to the server, performs handshake, and sends a join frame with the Role::Consumer and session_id.

Source

pub async fn recv(&mut self) -> Result<&[u8]>

Receives the next encrypted frame from the producer, decrypts it, and returns the plaintext data as a byte slice. The returned slice is valid until the next call to recv or broadcast, which may reuse the internal memory pool buffer.

Source§

impl<R> HydraClient<R>

Source

pub async fn close(&mut self) -> Result<()>

Closes the client connection gracefully by flushing and shutting down the writer (proper FIN).

Auto Trait Implementations§

§

impl<R> Freeze for HydraClient<R>

§

impl<R> RefUnwindSafe for HydraClient<R>
where R: RefUnwindSafe,

§

impl<R> Send for HydraClient<R>
where R: Send,

§

impl<R> Sync for HydraClient<R>
where R: Sync,

§

impl<R> Unpin for HydraClient<R>
where R: Unpin,

§

impl<R> UnsafeUnpin for HydraClient<R>

§

impl<R> UnwindSafe for HydraClient<R>
where R: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.