From 6d43a96c311a553cc6796e3edccb8a1c0e263e2d Mon Sep 17 00:00:00 2001 From: Max Audron Date: Sun, 3 Oct 2021 12:40:32 +0200 Subject: statetracker: rewrite sync handling --- examples/statetracker/Cargo.toml | 2 +- examples/statetracker/src/command.rs | 4 +++- examples/statetracker/src/connect.rs | 18 +++++++++++++++--- examples/statetracker/src/main.rs | 32 ++++++++++++++++++++++++-------- examples/statetracker/src/server.rs | 16 +++++++++++----- 5 files changed, 54 insertions(+), 18 deletions(-) diff --git a/examples/statetracker/Cargo.toml b/examples/statetracker/Cargo.toml index d831544..3ac9668 100644 --- a/examples/statetracker/Cargo.toml +++ b/examples/statetracker/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2018" [dependencies] -libquassel = { path = "../../", features = ["framing", "all-quassel-features"] } +libquassel = { path = "../../", features = ["framing", "all-quassel-features", "client", "server"] } druid = { git = "https://github.com/linebender/druid", features = ["im"] } diff --git a/examples/statetracker/src/command.rs b/examples/statetracker/src/command.rs index 2d83edf..09b49d7 100644 --- a/examples/statetracker/src/command.rs +++ b/examples/statetracker/src/command.rs @@ -7,11 +7,13 @@ use libquassel::{ primitive::VariantMap, }; +use crate::server::Direction; + pub const CONNECT: Selector = Selector::new("connect"); pub const ADD_MESSAGE: Selector> = Selector::new("add_message"); pub const ALIASMANAGER_INIT: Selector> = Selector::new("aliasmanager_init"); -pub const ALIASMANAGER_UPDATE: Selector> = +pub const ALIASMANAGER_UPDATE: Selector> = Selector::new("aliasmanager_update"); pub const ALIASMANAGER_ADD_ALIAS: Selector> = Selector::new("aliasmanager_add_alias"); diff --git a/examples/statetracker/src/connect.rs b/examples/statetracker/src/connect.rs index 9298b15..7b207cd 100644 --- a/examples/statetracker/src/connect.rs +++ b/examples/statetracker/src/connect.rs @@ -11,7 +11,7 @@ use tokio_util::codec::Framed; use tracing::debug; use crate::{ - server::{ClientState, Server}, + server::{ClientState, Direction, Server}, StateTracker, }; @@ -69,8 +69,20 @@ impl StateTracker { let c_state = ClientState::Handshake; tokio::join!( - Server::run(s_stream, c_sink, s_state, ctx.clone(), "server -> client"), - Server::run(c_stream, s_sink, c_state, ctx.clone(), "client -> server") + Server::run( + s_stream, + c_sink, + s_state, + ctx.clone(), + Direction::ServerToClient + ), + Server::run( + c_stream, + s_sink, + c_state, + ctx.clone(), + Direction::ClientToServer + ) ); }); }); diff --git a/examples/statetracker/src/main.rs b/examples/statetracker/src/main.rs index 3177b39..65ee4ce 100644 --- a/examples/statetracker/src/main.rs +++ b/examples/statetracker/src/main.rs @@ -10,12 +10,15 @@ use druid::{ }; use druid::{AppLauncher, Data, Env, Lens, LocalizedString, Widget, WidgetExt, WindowDesc}; -use libquassel::message::objects::AliasManager; -use libquassel::message::NetworkMap; +use libquassel::message::{NetworkMap, StatefulSyncableServer}; +use libquassel::{ + message::{objects::AliasManager, StatefulSyncableClient}, + session::Session, +}; use tracing::debug; -use crate::server::{Message, ServerWidget}; +use crate::server::{Direction, Message, ServerWidget}; const SPACING: f64 = 10.0; @@ -98,8 +101,6 @@ impl AppDelegate for StateTrackerDelegate { return druid::Handled::Yes; } else if let Some(msg) = cmd.get(command::ADD_MESSAGE) { - debug!("got ADD_MESSAGE command"); - let list = Arc::make_mut(&mut data.messages); list.push(msg.take().unwrap()); } else if let Some(alias) = cmd.get(command::ALIASMANAGER_ADD_ALIAS) { @@ -109,9 +110,18 @@ impl AppDelegate for StateTrackerDelegate { } else if let Some(alias_manager) = cmd.get(command::ALIASMANAGER_INIT) { data.alias_manager = Arc::new(alias_manager.take().unwrap()); } else if let Some(msg) = cmd.get(command::ALIASMANAGER_UPDATE) { - let syncer = data.syncer.clone(); + let (direction, msg) = msg.take().unwrap(); + + debug!("direction: {:#?}, msg: {:#?}", direction, msg); + let mut alias_manager = Arc::make_mut(&mut data.alias_manager).clone(); - alias_manager.handle_syncmessage(syncer, msg.take().unwrap()); + + if direction == Direction::ServerToClient { + StatefulSyncableClient::sync(&mut alias_manager, &data, msg); + } else { + StatefulSyncableServer::sync(&mut alias_manager, &data, msg); + } + data.alias_manager = Arc::new(alias_manager); } @@ -119,10 +129,16 @@ impl AppDelegate for StateTrackerDelegate { } } +// impl Session for StateTracker { +// fn alias_manager(&mut self) -> &mut AliasManager { +// &mut Arc::make_mut(&mut self.alias_manager).clone() +// } +// } + // TODO make this somehow deref or smth #[derive(Clone)] pub struct Syncer; -impl libquassel::message::SyncProxy for Syncer { +impl libquassel::message::SyncProxy for StateTracker { fn sync( &self, class_name: &str, diff --git a/examples/statetracker/src/server.rs b/examples/statetracker/src/server.rs index 6d56662..63b36f7 100644 --- a/examples/statetracker/src/server.rs +++ b/examples/statetracker/src/server.rs @@ -93,6 +93,12 @@ impl Data for Message { } } +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum Direction { + ServerToClient, + ClientToServer, +} + impl Server { pub async fn init( &self, @@ -116,7 +122,7 @@ impl Server { mut sink: SplitSink, Vec>, mut state: ClientState, ctx: ExtEventSink, - direction: &str, + direction: Direction, ) { // Start event loop while let Some(msg) = stream.next().await { @@ -141,7 +147,7 @@ impl Server { async fn handle_login_message( buf: &[u8], state: &mut ClientState, - direction: &str, + direction: Direction, _ctx: ExtEventSink, ) -> Result { use libquassel::HandshakeDeserialize; @@ -149,7 +155,7 @@ impl Server { trace!(target: "handshakemessage", "Received bytes: {:x?}", buf); match HandshakeMessage::parse(buf) { Ok((_size, res)) => { - info!("{}: {:#?}", direction, res); + // info!("{}: {:#?}", direction, res); match res { HandshakeMessage::SessionInit(_) => *state = ClientState::Connected, @@ -165,7 +171,7 @@ impl Server { async fn handle_message( buf: &[u8], - _direction: &str, + direction: Direction, ctx: ExtEventSink, ) -> Result { use libquassel::deserialize::*; @@ -182,7 +188,7 @@ impl Server { "update" => ctx .submit_command( command::ALIASMANAGER_UPDATE, - SingleUse::new(msg), + SingleUse::new((direction, msg)), Target::Global, ) .unwrap(), -- cgit v1.2.3