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>
impl<SendType: Serialize + Debug + Send + 'static, ReceiveType: DeserializeOwned + Debug + Send + 'static> ThreadedSocket<SendType, ReceiveType>
sourcepub fn connect(&mut self, addr: Option<Address>)
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
sourcepub fn status(&mut self) -> NetworkStatus
pub fn status(&mut self) -> NetworkStatus
Fetch the latest information about the status of the connection
See ThreadedSocket
for full usage example
sourcepub fn send(&self, data: TextOrT<SendType>)
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
sourcepub async fn async_send(&mut self, data: TextOrT<SendType>)
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
sourcepub fn read(&mut self) -> Option<TextOrT<ReceiveType>>
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
sourcepub async fn async_read(
&mut self,
) -> Either<TextOrT<ReceiveType>, NetworkStatus>
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
sourcepub 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
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
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>
impl<SendType, ReceiveType> Sync for ThreadedSocket<SendType, ReceiveType>
impl<SendType, ReceiveType> !Unpin for ThreadedSocket<SendType, ReceiveType>
impl<SendType, ReceiveType> UnwindSafe for ThreadedSocket<SendType, ReceiveType>
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
source§impl<T> CheckedAs for T
impl<T> CheckedAs for T
source§fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
source§impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
source§fn checked_cast_from(src: Src) -> Option<Dst>
fn checked_cast_from(src: Src) -> Option<Dst>
§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> OverflowingAs for T
impl<T> OverflowingAs for T
source§fn overflowing_as<Dst>(self) -> (Dst, bool)where
T: OverflowingCast<Dst>,
fn overflowing_as<Dst>(self) -> (Dst, bool)where
T: OverflowingCast<Dst>,
source§impl<Src, Dst> OverflowingCastFrom<Src> for Dstwhere
Src: OverflowingCast<Dst>,
impl<Src, Dst> OverflowingCastFrom<Src> for Dstwhere
Src: OverflowingCast<Dst>,
source§fn overflowing_cast_from(src: Src) -> (Dst, bool)
fn overflowing_cast_from(src: Src) -> (Dst, bool)
source§impl<T> SaturatingAs for T
impl<T> SaturatingAs for T
source§fn saturating_as<Dst>(self) -> Dstwhere
T: SaturatingCast<Dst>,
fn saturating_as<Dst>(self) -> Dstwhere
T: SaturatingCast<Dst>,
source§impl<Src, Dst> SaturatingCastFrom<Src> for Dstwhere
Src: SaturatingCast<Dst>,
impl<Src, Dst> SaturatingCastFrom<Src> for Dstwhere
Src: SaturatingCast<Dst>,
source§fn saturating_cast_from(src: Src) -> Dst
fn saturating_cast_from(src: Src) -> Dst
§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self
from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self
is actually part of its subset T
(and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset
but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self
to the equivalent element of its superset.