From 80eed533058b06fcef78e60186ee46359c493e06 Mon Sep 17 00:00:00 2001 From: jaberjaber23 Date: Sun, 15 Mar 2026 06:23:02 +0300 Subject: [PATCH] community fixes --- crates/openfang-api/src/channel_bridge.rs | 2 +- crates/openfang-api/src/routes.rs | 2 +- crates/openfang-api/src/server.rs | 2 +- crates/openfang-api/src/ws.rs | 2 +- crates/openfang-kernel/src/kernel.rs | 22 ++++++++-------------- 5 files changed, 12 insertions(+), 18 deletions(-) diff --git a/crates/openfang-api/src/channel_bridge.rs b/crates/openfang-api/src/channel_bridge.rs index c6a524a4..6affca54 100644 --- a/crates/openfang-api/src/channel_bridge.rs +++ b/crates/openfang-api/src/channel_bridge.rs @@ -925,7 +925,7 @@ impl ChannelBridgeHandle for KernelBridgeAdapter { return "OFP peer network is disabled. Set network_enabled = true in config.toml." .to_string(); } - match &self.kernel.peer_registry { + match self.kernel.peer_registry.get() { Some(registry) => { let peers = registry.all_peers(); if peers.is_empty() { diff --git a/crates/openfang-api/src/routes.rs b/crates/openfang-api/src/routes.rs index 96f271e6..365b1962 100644 --- a/crates/openfang-api/src/routes.rs +++ b/crates/openfang-api/src/routes.rs @@ -4805,7 +4805,7 @@ pub async fn network_status(State(state): State>) -> impl IntoResp && !state.kernel.config.network.shared_secret.is_empty(); let (node_id, listen_address, connected_peers, total_peers) = - if let Some(ref peer_node) = state.kernel.peer_node { + if let Some(peer_node) = state.kernel.peer_node.get() { let registry = peer_node.registry(); ( peer_node.node_id().to_string(), diff --git a/crates/openfang-api/src/server.rs b/crates/openfang-api/src/server.rs index 70d3b1bf..80771558 100644 --- a/crates/openfang-api/src/server.rs +++ b/crates/openfang-api/src/server.rs @@ -45,7 +45,7 @@ pub async fn build_router( let state = Arc::new(AppState { kernel: kernel.clone(), started_at: Instant::now(), - peer_registry: kernel.peer_registry.as_ref().map(|r| Arc::new(r.clone())), + peer_registry: kernel.peer_registry.get().map(|r| Arc::new(r.clone())), bridge_manager: tokio::sync::Mutex::new(bridge), channels_config: tokio::sync::RwLock::new(channels_config), shutdown_notify: Arc::new(tokio::sync::Notify::new()), diff --git a/crates/openfang-api/src/ws.rs b/crates/openfang-api/src/ws.rs index c4097d76..2624ac9a 100644 --- a/crates/openfang-api/src/ws.rs +++ b/crates/openfang-api/src/ws.rs @@ -949,7 +949,7 @@ async fn handle_command( let msg = if !state.kernel.config.network_enabled { "OFP network disabled.".to_string() } else { - match &state.kernel.peer_registry { + match state.kernel.peer_registry.get() { Some(registry) => { let peers = registry.all_peers(); if peers.is_empty() { diff --git a/crates/openfang-kernel/src/kernel.rs b/crates/openfang-kernel/src/kernel.rs index e96a903b..9d58fe65 100644 --- a/crates/openfang-kernel/src/kernel.rs +++ b/crates/openfang-kernel/src/kernel.rs @@ -141,10 +141,10 @@ pub struct OpenFangKernel { pub hooks: openfang_runtime::hooks::HookRegistry, /// Persistent process manager for interactive sessions (REPLs, servers). pub process_manager: Arc, - /// OFP peer registry — tracks connected peers. - pub peer_registry: Option, - /// OFP peer node — the local networking node. - pub peer_node: Option>, + /// OFP peer registry — tracks connected peers (OnceLock for safe init after Arc creation). + pub peer_registry: OnceLock, + /// OFP peer node — the local networking node (OnceLock for safe init after Arc creation). + pub peer_node: OnceLock>, /// Boot timestamp for uptime calculation. pub booted_at: std::time::Instant, /// WhatsApp Web gateway child process PID (for shutdown cleanup). @@ -1036,8 +1036,8 @@ impl OpenFangKernel { auto_reply_engine, hooks: openfang_runtime::hooks::HookRegistry::new(), process_manager: Arc::new(openfang_runtime::process_manager::ProcessManager::new(5)), - peer_registry: None, - peer_node: None, + peer_registry: OnceLock::new(), + peer_node: OnceLock::new(), booted_at: std::time::Instant::now(), whatsapp_gateway_pid: Arc::new(std::sync::Mutex::new(None)), channel_adapters: dashmap::DashMap::new(), @@ -4184,14 +4184,8 @@ impl OpenFangKernel { "OFP peer node started" ); - // SAFETY: These fields are only written once during startup. - // We use unsafe to set them because start_background_agents runs - // after the Arc is created and the kernel is otherwise immutable. - let self_ptr = Arc::as_ptr(self) as *mut OpenFangKernel; - unsafe { - (*self_ptr).peer_registry = Some(registry.clone()); - (*self_ptr).peer_node = Some(node.clone()); - } + let _ = self.peer_registry.set(registry.clone()); + let _ = self.peer_node.set(node.clone()); // Connect to bootstrap peers for peer_addr_str in &self.config.network.bootstrap_peers {