From c01dc943389f860098123e65b3cc49dc446d365d Mon Sep 17 00:00:00 2001 From: cloudwithax Date: Thu, 19 Feb 2026 12:19:43 -0500 Subject: [PATCH] feat(app): directory protocol types, behaviour, relay_discoverable setting - protocol/directory.rs: DirectoryRequest/Response/ProfileEntry + DIRECTORY_PROTOCOL - node/behaviour.rs: directory_service field on DuskBehaviour - node/swarm.rs: outbound directory_service cbor behaviour - storage/disk.rs: relay_discoverable bool in UserSettings (default true) - types.ts: relay_discoverable added to UserSettings interface Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude Co-Authored-By: Happy --- src-tauri/src/node/behaviour.rs | 3 +++ src-tauri/src/node/swarm.rs | 7 +++++++ src-tauri/src/protocol/directory.rs | 27 +++++++++++++++++++++++++++ src-tauri/src/protocol/mod.rs | 1 + src-tauri/src/storage/disk.rs | 5 +++++ src/lib/types.ts | 3 +++ 6 files changed, 46 insertions(+) create mode 100644 src-tauri/src/protocol/directory.rs diff --git a/src-tauri/src/node/behaviour.rs b/src-tauri/src/node/behaviour.rs index 3107faf..b8e3c48 100644 --- a/src-tauri/src/node/behaviour.rs +++ b/src-tauri/src/node/behaviour.rs @@ -1,3 +1,4 @@ +use crate::protocol::directory::{DirectoryRequest, DirectoryResponse}; use crate::protocol::gif::{GifRequest, GifResponse}; use libp2p::{ gossipsub, identify, kad, mdns, ping, relay, rendezvous, request_response::cbor, @@ -15,4 +16,6 @@ pub struct DuskBehaviour { pub ping: ping::Behaviour, // gif search: sends requests to the relay, receives responses pub gif_service: cbor::Behaviour, + // directory search: register/search/remove profiles on the relay + pub directory_service: cbor::Behaviour, } diff --git a/src-tauri/src/node/swarm.rs b/src-tauri/src/node/swarm.rs index 072134b..8c1f379 100644 --- a/src-tauri/src/node/swarm.rs +++ b/src-tauri/src/node/swarm.rs @@ -9,6 +9,7 @@ use libp2p::{ }; use super::behaviour::DuskBehaviour; +use crate::protocol::directory::{DirectoryRequest, DirectoryResponse, DIRECTORY_PROTOCOL}; use crate::protocol::gif::{GifRequest, GifResponse, GIF_PROTOCOL}; pub fn build_swarm( @@ -85,6 +86,12 @@ pub fn build_swarm( request_response::Config::default() .with_request_timeout(Duration::from_secs(15)), ), + // directory search via request-response to the relay (outbound only) + directory_service: cbor::Behaviour::::new( + [(DIRECTORY_PROTOCOL, ProtocolSupport::Outbound)], + request_response::Config::default() + .with_request_timeout(Duration::from_secs(15)), + ), } })? .with_swarm_config(|cfg| cfg.with_idle_connection_timeout(Duration::from_secs(300))) diff --git a/src-tauri/src/protocol/directory.rs b/src-tauri/src/protocol/directory.rs new file mode 100644 index 0000000..8e921b1 --- /dev/null +++ b/src-tauri/src/protocol/directory.rs @@ -0,0 +1,27 @@ +// directory protocol types for the relay-backed peer discovery service. +// the client sends DirectoryRequests to the relay and receives DirectoryResponses. + +use libp2p::StreamProtocol; + +pub const DIRECTORY_PROTOCOL: StreamProtocol = + StreamProtocol::new("/dusk/directory/1.0.0"); + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum DirectoryRequest { + Register { display_name: String }, + Search { query: String }, + Remove, +} + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum DirectoryResponse { + Ok, + Results(Vec), +} + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct DirectoryProfileEntry { + pub peer_id: String, + pub display_name: String, + pub last_seen: u64, +} diff --git a/src-tauri/src/protocol/mod.rs b/src-tauri/src/protocol/mod.rs index 147f2a9..a0c15bf 100644 --- a/src-tauri/src/protocol/mod.rs +++ b/src-tauri/src/protocol/mod.rs @@ -1,4 +1,5 @@ pub mod community; +pub mod directory; pub mod gif; pub mod identity; pub mod messages; diff --git a/src-tauri/src/storage/disk.rs b/src-tauri/src/storage/disk.rs index 3e74e53..626336a 100644 --- a/src-tauri/src/storage/disk.rs +++ b/src-tauri/src/storage/disk.rs @@ -27,8 +27,12 @@ pub struct UserSettings { pub font_size: String, #[serde(default)] pub custom_relay_addr: Option, + #[serde(default = "default_true")] + pub relay_discoverable: bool, } +fn default_true() -> bool { true } + impl Default for UserSettings { fn default() -> Self { Self { @@ -43,6 +47,7 @@ impl Default for UserSettings { message_display: "cozy".to_string(), custom_relay_addr: None, font_size: "default".to_string(), + relay_discoverable: true, } } } diff --git a/src/lib/types.ts b/src/lib/types.ts index 692e445..2e3d063 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -68,6 +68,9 @@ export interface UserSettings { // network custom_relay_addr?: string; + + // discovery + relay_discoverable: boolean; } export interface CommunityMeta {