Using the ezsockets call methods to shoot text at the websocket.

This commit is contained in:
Dave Hrycyszyn
2024-06-11 18:29:02 +01:00
parent b1daec3b84
commit 014462c187
3 changed files with 18 additions and 40 deletions

View File

@@ -37,30 +37,21 @@ async fn main() {
/// Wire everything up outside the application so we can test more easily later /// Wire everything up outside the application so we can test more easily later
async fn setup(name: &String) -> SideNode { async fn setup(name: &String) -> SideNode {
// First, load up the keys and create a bft-crdt
let side_dir = utils::home(name); let side_dir = utils::home(name);
let keys = keys::load_from_file(side_dir); let keys = keys::load_from_file(side_dir);
let crdt = BaseCrdt::<TransactionList>::new(&keys);
// Channels for internal communication, and a tokio task for stdin input
let (incoming_sender, incoming_receiver) = mpsc::channel::<SignedOp>(32); let (incoming_sender, incoming_receiver) = mpsc::channel::<SignedOp>(32);
let (stdin_sender, stdin_receiver) = std::sync::mpsc::channel(); let (stdin_sender, stdin_receiver) = std::sync::mpsc::channel();
let (network_sender, network_receiver) = mpsc::channel::<SignedOp>(32);
task::spawn(async move { task::spawn(async move {
stdin_input(stdin_sender); stdin_input(stdin_sender);
}); });
let crdt = BaseCrdt::<TransactionList>::new(&keys); // Finally, create the node and return it
let node = SideNode::new( let handle = WebSocketClient::new(incoming_sender).await;
crdt, let node = SideNode::new(crdt, keys, incoming_receiver, stdin_receiver, handle);
keys,
incoming_receiver,
stdin_receiver,
network_sender,
);
tokio::spawn(async move {
let handle = WebSocketClient::new(incoming_sender, network_receiver).await;
handle.call("start".to_string()).unwrap();
});
println!("Node setup complete."); println!("Node setup complete.");
node node
} }

View File

@@ -2,14 +2,14 @@ use bft_json_crdt::json_crdt::{BaseCrdt, SignedOp};
use fastcrypto::ed25519::Ed25519KeyPair; use fastcrypto::ed25519::Ed25519KeyPair;
use tokio::sync::mpsc; use tokio::sync::mpsc;
use crate::{crdt::TransactionList, utils}; use crate::{crdt::TransactionList, utils, websocket::WebSocketClient};
pub(crate) struct SideNode { pub(crate) struct SideNode {
crdt: BaseCrdt<TransactionList>, crdt: BaseCrdt<TransactionList>,
keys: fastcrypto::ed25519::Ed25519KeyPair, keys: fastcrypto::ed25519::Ed25519KeyPair,
incoming_receiver: mpsc::Receiver<SignedOp>, incoming_receiver: mpsc::Receiver<SignedOp>,
stdin_receiver: std::sync::mpsc::Receiver<String>, stdin_receiver: std::sync::mpsc::Receiver<String>,
network_sender: mpsc::Sender<SignedOp>, handle: ezsockets::Client<WebSocketClient>,
} }
impl SideNode { impl SideNode {
@@ -18,14 +18,14 @@ impl SideNode {
keys: Ed25519KeyPair, keys: Ed25519KeyPair,
incoming_receiver: mpsc::Receiver<SignedOp>, incoming_receiver: mpsc::Receiver<SignedOp>,
stdin_receiver: std::sync::mpsc::Receiver<String>, stdin_receiver: std::sync::mpsc::Receiver<String>,
network_sender: mpsc::Sender<SignedOp>, handle: ezsockets::Client<WebSocketClient>,
) -> Self { ) -> Self {
let node = Self { let node = Self {
crdt, crdt,
keys, keys,
incoming_receiver, incoming_receiver,
stdin_receiver, stdin_receiver,
network_sender, handle,
}; };
node node
} }
@@ -55,7 +55,8 @@ impl SideNode {
async fn send_to_network(&self, signed_op: SignedOp) { async fn send_to_network(&self, signed_op: SignedOp) {
println!("sending to network: {:?}", signed_op); println!("sending to network: {:?}", signed_op);
self.network_sender.send(signed_op).await.unwrap(); let to_send = serde_json::to_string(&signed_op).unwrap();
self.handle.call(to_send).unwrap();
} }
fn handle_incoming(&mut self, incoming: &SignedOp) { fn handle_incoming(&mut self, incoming: &SignedOp) {

View File

@@ -5,7 +5,6 @@ use tokio::sync::mpsc;
pub(crate) struct WebSocketClient { pub(crate) struct WebSocketClient {
incoming_sender: mpsc::Sender<SignedOp>, incoming_sender: mpsc::Sender<SignedOp>,
network_receiver: mpsc::Receiver<SignedOp>,
handle: ezsockets::Client<WebSocketClient>, handle: ezsockets::Client<WebSocketClient>,
} }
@@ -13,14 +12,12 @@ impl WebSocketClient {
/// Start the websocket client /// Start the websocket client
pub(crate) async fn new( pub(crate) async fn new(
incoming_sender: mpsc::Sender<SignedOp>, incoming_sender: mpsc::Sender<SignedOp>,
network_receiver: mpsc::Receiver<SignedOp>,
) -> ezsockets::Client<WebSocketClient> { ) -> ezsockets::Client<WebSocketClient> {
tracing_subscriber::fmt::init(); tracing_subscriber::fmt::init();
let config = ClientConfig::new("ws://localhost:8080/websocket"); let config = ClientConfig::new("ws://localhost:8080/websocket");
let (handle, future) = ezsockets::connect( let (handle, future) = ezsockets::connect(
|client| WebSocketClient { |client| WebSocketClient {
incoming_sender, incoming_sender,
network_receiver,
handle: client, handle: client,
}, },
config, config,
@@ -31,18 +28,6 @@ impl WebSocketClient {
}); });
handle handle
} }
pub(crate) async fn start(&mut self) {
loop {
match self.network_receiver.try_recv() {
Ok(signed_op) => {
let to_send = serde_json::to_string(&signed_op).unwrap();
self.handle.text(to_send).unwrap();
}
Err(_) => {} // ignore empty channel errors in this PoC
}
}
}
} }
#[async_trait] #[async_trait]
@@ -50,9 +35,9 @@ impl ezsockets::ClientExt for WebSocketClient {
type Call = String; type Call = String;
async fn on_text(&mut self, text: String) -> Result<(), ezsockets::Error> { async fn on_text(&mut self, text: String) -> Result<(), ezsockets::Error> {
tracing::info!("received text: {text:?}");
let incoming: bft_json_crdt::json_crdt::SignedOp = serde_json::from_str(&text).unwrap(); let incoming: bft_json_crdt::json_crdt::SignedOp = serde_json::from_str(&text).unwrap();
tracing::info!("received signed op: {incoming:?}"); self.incoming_sender.send(incoming).await?;
self.incoming_sender.send(incoming).await.unwrap();
Ok(()) Ok(())
} }
@@ -62,8 +47,9 @@ impl ezsockets::ClientExt for WebSocketClient {
} }
async fn on_call(&mut self, call: Self::Call) -> Result<(), ezsockets::Error> { async fn on_call(&mut self, call: Self::Call) -> Result<(), ezsockets::Error> {
println!("received call: {call}"); let to_send = serde_json::to_string(&call).unwrap();
self.start().await; tracing::info!("sending signed op: {to_send:?}");
self.handle.text(to_send)?;
Ok(()) Ok(())
} }
} }