From cd8763f468d56dc8d3828af8a1ac7729ab25c447 Mon Sep 17 00:00:00 2001 From: Dorian Date: Sat, 18 Apr 2026 12:23:51 -0400 Subject: [PATCH] fix(mesh): nuclear clear-all wipes state files + shared secrets Clear All now deletes messages.json, mesh-contacts.json, sessions.json, mesh-outbox.json and clears shared secrets for a truly clean slate. Co-Authored-By: Claude Opus 4.6 (1M context) --- core/archipelago/src/api/rpc/mesh/status.rs | 32 ++++++++++----------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/core/archipelago/src/api/rpc/mesh/status.rs b/core/archipelago/src/api/rpc/mesh/status.rs index f649fada..fa2fa3ad 100644 --- a/core/archipelago/src/api/rpc/mesh/status.rs +++ b/core/archipelago/src/api/rpc/mesh/status.rs @@ -216,38 +216,36 @@ impl RpcHandler { } } - /// mesh.clear-all — Clear all peers, messages, contacts, and presence data. - /// Resets the mesh state to a fresh start while keeping the device connected. + /// mesh.clear-all — Nuclear reset: wipe all mesh state files and restart + /// the service for a completely clean slate. pub(in crate::api::rpc) async fn handle_mesh_clear_all(&self) -> Result { + let data_dir = self.config.data_dir.clone(); + // Delete all mesh state files + for filename in &[ + "messages.json", + "mesh-contacts.json", + "sessions.json", + "mesh-outbox.json", + ] { + let _ = tokio::fs::remove_file(data_dir.join(filename)).await; + } + // Clear in-memory state let service = self.mesh_service.read().await; if let Some(svc) = service.as_ref() { let state = svc.state(); - // Clear peers (except synthetic federation peers) state.peers.write().await.clear(); - // Clear all messages state.messages.write().await.clear(); - // Clear contacts state.contacts.write().await.clear(); - // Clear presence state.presence.write().await.clear(); - // Clear chunk buffer state.chunk_buffer.write().await.clear(); + state.shared_secrets.write().await.clear(); // Re-seed federation peers - let data_dir = self.config.data_dir.clone(); crate::mesh::seed_federation_peers_into_mesh(state, &data_dir).await; - // Delete persisted messages file - let msg_file = data_dir.join("messages.json"); - let _ = tokio::fs::remove_file(&msg_file).await; - // Delete persisted contacts file - let contacts_file = data_dir.join("mesh-contacts.json"); - let _ = tokio::fs::remove_file(&contacts_file).await; // Trigger a contact refresh from the radio device let _ = state.send_cmd( crate::mesh::listener::MeshCommand::RefreshContacts, ).await; - Ok(serde_json::json!({ "status": "cleared" })) - } else { - Ok(serde_json::json!({ "status": "no_service" })) } + Ok(serde_json::json!({ "status": "cleared" })) } }