core_pb::threaded_websocket

Struct ThreadedSocket

source
pub struct ThreadedSocket<SendType: Debug, ReceiveType: Debug> {
    status: NetworkStatus,
    addr_sender: Sender<Option<Address>>,
    sender: Sender<TextOrT<SendType>>,
    status_receiver: Receiver<NetworkStatus>,
    receiver: Receiver<TextOrT<ReceiveType>>,
}
Expand description

Simple poll-based wrapper around a socket (websocket or TCP) connection that runs in a separate thread

Associated methods return immediately even when (for some) the operation might not be completed. Supports normal std environments as well as WASM.

Use [ThreadedSocket::default] for a websocket, or ThreadedSocket::new to specify another socket type.

§Usage

use core_pb::threaded_websocket::{TextOrT, ThreadedSocket};
use std::thread::sleep;
use std::time::Duration;
use core_pb::messages::NetworkStatus;

// initialization
// by default, doesn't connect to anything
let mut connection: ThreadedSocket<usize, usize> = ThreadedSocket::with_name("test connection".to_string());
// try to connect to an address (with infinite retries)
connection.connect(Some(([127, 0, 0, 1], 20_000)));
// wait until connected
while connection.status() != NetworkStatus::Connected {
    sleep(Duration::from_millis(100))
}
// send a message to the server (returns immediately)
connection.send(TextOrT::T(1));
connection.send(TextOrT::Text("hello".to_string()));
// wait for a message
loop {
    // note: read() never blocks, and only returns
    // some message when one is available
    if let Some(msg) = connection.read() {
        println!("Got a message: {msg:?}");
        break;
    }
    sleep(Duration::from_millis(100))
}
// stop connecting to the server
connection.connect(None);

Fields§

§status: NetworkStatus§addr_sender: Sender<Option<Address>>§sender: Sender<TextOrT<SendType>>§status_receiver: Receiver<NetworkStatus>§receiver: Receiver<TextOrT<ReceiveType>>

Implementations§

source§

impl<SendType: Serialize + Debug + Send + 'static, ReceiveType: DeserializeOwned + Debug + Send + 'static> ThreadedSocket<SendType, ReceiveType>

source

pub fn connect(&mut self, addr: Option<Address>)

Specify an address to connect to (or None to suspend current connection and future attempts)

See ThreadedSocket for full usage example

source

pub fn status(&mut self) -> NetworkStatus

Fetch the latest information about the status of the connection

See ThreadedSocket for full usage example

source

pub fn send(&self, data: TextOrT<SendType>)

Queue something to be sent to the socket

If the connection is not available, the data will be discarded

See ThreadedSocket for full usage example

source

pub async fn async_send(&mut self, data: TextOrT<SendType>)

Queue something to be sent to the socket (blocking await)

If the connection is not available, the data will be discarded

See ThreadedSocket for full usage example

source

pub fn read(&mut self) -> Option<TextOrT<ReceiveType>>

Read new data from the socket, if it is available

Expects to be called frequently

See ThreadedSocket for full usage example

source

pub async fn async_read( &mut self, ) -> Either<TextOrT<ReceiveType>, NetworkStatus>

Read new data from the socket (blocking await)

Expects to be called frequently

See ThreadedSocket for full usage example

source

pub fn new<SocketType: ThreadableSocket<SendType, ReceiveType> + 'static, Serializer: FnMut(bool, TextOrT<SendType>) -> Result<Vec<u8>, SerializeResult> + Send + 'static, SerializeResult: Debug + 'static, Deserializer: FnMut(bool, &[u8]) -> Result<Vec<TextOrT<ReceiveType>>, DeserializeResult> + Send + 'static, DeserializeResult: Debug + 'static>( name: String, addr: Option<Address>, serializer: Serializer, deserializer: Deserializer, ) -> Self

Create a new ThreadedSocket

§Usage
use core_pb::threaded_websocket::ThreadedSocket;

// websocket for either std environment or WASM
// let websocket = ThreadedSocket::with_name("test connection".to_string());
// tcp socket to be supported in the future

See ThreadedSocket for full usage example

source§

impl<SendType: Serialize + Debug + Send + 'static, ReceiveType: DeserializeOwned + Debug + Send + 'static> ThreadedSocket<SendType, ReceiveType>

source

pub fn with_name(name: String) -> Self

Create a new ThreadedSocket with a name for logging

Auto Trait Implementations§

§

impl<SendType, ReceiveType> Freeze for ThreadedSocket<SendType, ReceiveType>

§

impl<SendType, ReceiveType> RefUnwindSafe for ThreadedSocket<SendType, ReceiveType>

§

impl<SendType, ReceiveType> Send for ThreadedSocket<SendType, ReceiveType>
where SendType: Send, ReceiveType: Send,

§

impl<SendType, ReceiveType> Sync for ThreadedSocket<SendType, ReceiveType>
where SendType: Send, ReceiveType: Send,

§

impl<SendType, ReceiveType> !Unpin for ThreadedSocket<SendType, ReceiveType>

§

impl<SendType, ReceiveType> UnwindSafe for ThreadedSocket<SendType, ReceiveType>

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> Az for T

source§

fn az<Dst>(self) -> Dst
where T: Cast<Dst>,

Casts the value.
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<Src, Dst> CastFrom<Src> for Dst
where Src: Cast<Dst>,

source§

fn cast_from(src: Src) -> Dst

Casts the value.
source§

impl<T> CheckedAs for T

source§

fn checked_as<Dst>(self) -> Option<Dst>
where T: CheckedCast<Dst>,

Casts the value.
source§

impl<Src, Dst> CheckedCastFrom<Src> for Dst
where Src: CheckedCast<Dst>,

source§

fn checked_cast_from(src: Src) -> Option<Dst>

Casts the value.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> OverflowingAs for T

source§

fn overflowing_as<Dst>(self) -> (Dst, bool)
where T: OverflowingCast<Dst>,

Casts the value.
source§

impl<Src, Dst> OverflowingCastFrom<Src> for Dst
where Src: OverflowingCast<Dst>,

source§

fn overflowing_cast_from(src: Src) -> (Dst, bool)

Casts the value.
source§

impl<T> Same for T

source§

type Output = T

Should always be Self
source§

impl<T> SaturatingAs for T

source§

fn saturating_as<Dst>(self) -> Dst
where T: SaturatingCast<Dst>,

Casts the value.
source§

impl<Src, Dst> SaturatingCastFrom<Src> for Dst
where Src: SaturatingCast<Dst>,

source§

fn saturating_cast_from(src: Src) -> Dst

Casts the value.
§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
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.
source§

impl<T> UnwrappedAs for T

source§

fn unwrapped_as<Dst>(self) -> Dst
where T: UnwrappedCast<Dst>,

Casts the value.
source§

impl<Src, Dst> UnwrappedCastFrom<Src> for Dst
where Src: UnwrappedCast<Dst>,

source§

fn unwrapped_cast_from(src: Src) -> Dst

Casts the value.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
source§

impl<T> WrappingAs for T

source§

fn wrapping_as<Dst>(self) -> Dst
where T: WrappingCast<Dst>,

Casts the value.
source§

impl<Src, Dst> WrappingCastFrom<Src> for Dst
where Src: WrappingCast<Dst>,

source§

fn wrapping_cast_from(src: Src) -> Dst

Casts the value.