Przeglądaj źródła

app: introduce window start/stop signals, and use those to adjust the outbound connection count in darkirc plugin from 6 -> 1 (or vice versa) when app is opened/closed

jkds 7 miesięcy temu
rodzic
commit
51dc7c4a9b
4 zmienionych plików z 76 dodań i 19 usunięć
  1. 10 10
      bin/app/Makefile
  2. 17 0
      bin/app/src/app/mod.rs
  3. 8 2
      bin/app/src/main.rs
  4. 41 7
      bin/app/src/plugin/darkirc.rs

+ 10 - 10
bin/app/Makefile

@@ -45,17 +45,17 @@ win-release: $(SRC) fonts
 win-debug: $(SRC) fonts
 	$(CARGO) build $(DEBUG_FEATURES)
 	-mv target/debug/darkfi-app.exe .
-android-release: $(SRC) fonts forest_720x1280.mp4
+android-release: $(SRC) fonts assets/forest_720x1280.mp4
 	podman run -v $(shell pwd)/../../:/root/darkfi -w /root/darkfi/bin/app/ -t apk cargo quad-apk build --release $(RELEASE_FEATURES)
 	-mv $(RELEASE_APK) darkfi-app.apk
-android-debug: $(SRC) fonts forest_720x1280.mp4
+android-debug: $(SRC) fonts assets/forest_720x1280.mp4
 	podman run -v $(shell pwd)/../../:/root/darkfi -w /root/darkfi/bin/app/ -t apk cargo quad-apk build $(DEBUG_FEATURES)
 	-mv $(DEBUG_APK) darkfi-app_debug.apk
 
-build-release: $(SRC) fonts forest_1920x1080.ivf
+build-release: $(SRC) fonts assets/forest_1920x1080.ivf
 	$(CARGO) build --release $(RELEASE_FEATURES)
 	-mv target/release/darkfi-app .
-build-debug: $(SRC) fonts forest_1920x1080.ivf
+build-debug: $(SRC) fonts assets/forest_1920x1080.ivf
 	$(CARGO) build $(DEBUG_FEATURES)
 	-mv target/debug/darkfi-app .
 
@@ -71,22 +71,22 @@ NotoColorEmoji.ttf:
 
 # App data
 
-forest_1920x1080.ivf:
-	rm assets/forest_720x1280.mp4
+assets/forest_1920x1080.ivf:
+	rm -f assets/forest_720x1280.mp4
 	wget -P assets/ -c https://dark.fi/assets/forest_1920x1080.ivf
 
-forest_720x1280.mp4:
-	rm assets/forest_1920x1080.ivf
+assets/forest_720x1280.mp4:
+	rm -f assets/forest_1920x1080.ivf
 	wget -P assets/ -c https://dark.fi/assets/forest_720x1280.mp4
 
 # Developer targets
 
-dev: $(SRC) fonts forest_1920x1080.ivf
+dev: $(SRC) fonts assets/forest_1920x1080.ivf
 	$(CARGO) lbuild $(DEV_FEATURES)
 	-mv target/debug/darkfi-app .
 	./darkfi-app
 
-apk: $(SRC) fonts forest_720x1280.mp4
+apk: $(SRC) fonts assets/forest_720x1280.mp4
 	podman run -v $(shell pwd)/../../:/root/darkfi -w /root/darkfi/bin/app/ -t apk cargo quad-apk build $(DEV_FEATURES)
 	$(MAKE) install-apk
 

+ 17 - 0
bin/app/src/app/mod.rs

@@ -95,6 +95,9 @@ impl App {
         prop.set_array_len(2);
         window.add_property(prop).unwrap();
 
+        window.add_signal("start", "App UI started", vec![]).unwrap();
+        window.add_signal("stop", "App UI stopped", vec![]).unwrap();
+
         let setting_root = SceneNode::new("setting", SceneNodeType::SettingRoot);
         let setting_root = setting_root.setup_null();
         let settings_tree = db.open_tree("settings").unwrap();
@@ -235,6 +238,20 @@ impl App {
             _ => panic!("wrong pimpl"),
         }
     }
+
+    pub fn notify_start(&self) {
+        let window = self.sg_root.lookup_node("/window").unwrap();
+        smol::block_on(async {
+            window.trigger("start", vec![]).await.unwrap();
+        });
+    }
+
+    pub fn notify_stop(&self) {
+        let window = self.sg_root.lookup_node("/window").unwrap();
+        smol::block_on(async {
+            window.trigger("stop", vec![]).await.unwrap();
+        });
+    }
 }
 
 // Just for testing

+ 8 - 2
bin/app/src/main.rs

@@ -247,10 +247,13 @@ impl God {
             cv.wait().await;
             app.start(event_pub, epoch).await;
         });
+
+        self.app.notify_start();
     }
 
     /// Put the app to sleep until the next restart.
     pub fn stop_app(&self) {
+        self.app.notify_stop();
         self.fg_runtime.stop();
         self.app.stop();
         info!(target: "main", "App stopped");
@@ -276,10 +279,14 @@ async fn load_plugins(
     let plugin = plugin.setup_null();
     sg_root.link(plugin.clone());
 
+    // DarkIrc needs /window to start
+    cv.wait().await;
     let darkirc = create_darkirc("darkirc");
     let darkirc = darkirc
         .setup(|me| async {
-            plugin::DarkIrc::new(me, ex.clone()).await.expect("DarkIrc pimpl setup")
+            plugin::DarkIrc::new(me, sg_root.clone(), ex.clone())
+                .await
+                .expect("DarkIrc pimpl setup")
         })
         .await;
 
@@ -357,7 +364,6 @@ async fn load_plugins(
     darkirc.register("connect", slot).unwrap();
     let sg_root2 = sg_root.clone();
     let listen_connect = ex.spawn(async move {
-        cv.wait().await;
         let net0 = sg_root2.lookup_node("/window/netstatus_layer/net0").unwrap();
         let net1 = sg_root2.lookup_node("/window/netstatus_layer/net1").unwrap();
         let net2 = sg_root2.lookup_node("/window/netstatus_layer/net2").unwrap();

+ 41 - 7
bin/app/src/plugin/darkirc.rs

@@ -46,7 +46,7 @@ use sled_overlay::sled;
 use crate::{
     error::{Error, Result},
     prop::{BatchGuardPtr, PropertyAtomicGuard, PropertyStr, Role},
-    scene::{MethodCallSub, Pimpl, SceneNode, SceneNodeType, SceneNodeWeak},
+    scene::{MethodCallSub, Pimpl, SceneNode, SceneNodePtr, SceneNodeType, SceneNodeWeak, Slot},
     ui::{
         chatview::{MessageId, Timestamp},
         OnModify,
@@ -61,6 +61,9 @@ const COOLOFF_SLEEP_TIME: u64 = 20;
 const COOLOFF_SYNC_ATTEMPTS: usize = 6;
 const SYNC_MIN_PEERS: usize = 2;
 
+const P2P_OUTBOUND_ACTIVE: usize = 6;
+const P2P_OUTBOUND_SLEEP: usize = 1;
+
 /// Due to drift between different machine's clocks, if the message timestamp is recent
 /// then we will just correct it to the current time so messages appear sequential in the UI.
 const RECENT_TIME_DIST: u64 = 25_000;
@@ -184,7 +187,7 @@ pub struct DarkIrc {
 }
 
 impl DarkIrc {
-    pub async fn new(node: SceneNodeWeak, ex: ExecutorPtr) -> Result<Pimpl> {
+    pub async fn new(node: SceneNodeWeak, sg_root: SceneNodePtr, ex: ExecutorPtr) -> Result<Pimpl> {
         let node_ref = &node.upgrade().unwrap();
         let nick = PropertyStr::wrap(node_ref, Role::Internal, "nick", 0).unwrap();
 
@@ -235,8 +238,8 @@ impl DarkIrc {
             profile.channel_handshake_timeout = 30;
             p2p_settings.profiles.insert("tcp+tls".to_string(), profile);
 
-            p2p_settings.outbound_connections = 3;
-            p2p_settings.inbound_connections = 0;
+            p2p_settings.outbound_connections = 5;
+            p2p_settings.inbound_connections = 2;
 
             p2p_settings.seeds.push(url::Url::parse("tcp+tls://lilith0.dark.fi:25551").unwrap());
             p2p_settings.seeds.push(url::Url::parse("tcp+tls://lilith1.dark.fi:25551").unwrap());
@@ -291,7 +294,7 @@ impl DarkIrc {
             nick,
             settings,
         });
-        self_.clone().start(ex).await;
+        self_.clone().start(sg_root, ex).await;
         Ok(Pimpl::DarkIrc(self_))
     }
 
@@ -514,7 +517,7 @@ impl DarkIrc {
         self_.settings.update_p2p_settings(&mut write_guard);
     }
 
-    async fn start(self: Arc<Self>, ex: ExecutorPtr) {
+    async fn start(self: Arc<Self>, sg_root: SceneNodePtr, ex: ExecutorPtr) {
         i!("Registering EventGraph P2P protocol");
         let event_graph_ = Arc::clone(&self.event_graph);
         let registry = self.p2p.protocol_registry();
@@ -555,7 +558,38 @@ impl DarkIrc {
         let channel_sub = self.p2p.hosts().subscribe_channel().await;
         let dag_task = ex.spawn(self.clone().dag_sync(channel_sub));
 
-        let mut tasks = vec![send_method_task, ev_task, dag_task];
+        // Subscribe to window start/stop signals for dynamic outbound connections
+        let window_node = sg_root.lookup_node("/window").unwrap();
+
+        let (start_slot, start_recv) = Slot::new("app_start");
+        window_node.register("start", start_slot).unwrap();
+        let p2p = self.p2p.clone();
+        let start_task = ex.spawn(async move {
+            while let Ok(_) = start_recv.recv().await {
+                i!("App started: set outbound connections to {P2P_OUTBOUND_ACTIVE}");
+                if let Err(e) =
+                    p2p.session_outbound().set_outbound_connections(P2P_OUTBOUND_ACTIVE).await
+                {
+                    e!("Failed to set outbound connections: {e}");
+                }
+            }
+        });
+
+        let (stop_slot, stop_recv) = Slot::new("app_stop");
+        window_node.register("stop", stop_slot).unwrap();
+        let p2p = self.p2p.clone();
+        let stop_task = ex.spawn(async move {
+            while let Ok(_) = stop_recv.recv().await {
+                i!("App stopped: set outbound connections to {P2P_OUTBOUND_SLEEP}");
+                if let Err(e) =
+                    p2p.session_outbound().set_outbound_connections(P2P_OUTBOUND_SLEEP).await
+                {
+                    e!("Failed to set outbound connections: {e}");
+                }
+            }
+        });
+
+        let mut tasks = vec![send_method_task, ev_task, dag_task, start_task, stop_task];
         tasks.append(&mut on_modify.tasks);
         self.tasks.set(tasks).unwrap();
     }