Skip to content

Commit f23d63a

Browse files
maxholmanclaude
andcommitted
refactor: remove connected field from status, drop duplicate cli version
connected was only set in two explicit connector paths — wrong for auto/relay modes and misleading when peers were present. Removed from NodeState, NodeStatus, StatusResponse proto, REST API, REPL, MCP, and OpenAPI spec. Peer count is the source of truth. Also removed the redundant "cli:" version line from REPL info — it was always identical to the daemon version in unified binary mode. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 767ae74 commit f23d63a

9 files changed

Lines changed: 2 additions & 59 deletions

File tree

crates/api/src/handlers.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ pub struct StatusResponse {
3434
pub version: String,
3535
pub role: String,
3636
pub uptime_ms: u64,
37-
pub connected: bool,
3837
#[serde(skip_serializing_if = "Option::is_none")]
3938
pub peer_addr: Option<String>,
4039
#[serde(skip_serializing_if = "Option::is_none")]
@@ -157,7 +156,6 @@ pub async fn status(State(state): State<ApiState>) -> Result<Json<StatusResponse
157156
version: s.version,
158157
role,
159158
uptime_ms: s.uptime_ms,
160-
connected: s.connected,
161159
peer_addr: if s.peer_addr.is_empty() {
162160
None
163161
} else {

crates/cli/src/output.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ pub fn print_response(resp: &ManagementResponse) -> Result<(), CtlError> {
109109

110110
println!("{:<18} {}", "name:", s.package_name);
111111
println!("{:<18} {}", "role:", role);
112-
println!("{:<18} {}", "connected:", s.connected);
113112
if !s.peer_addr.is_empty() {
114113
println!("{:<18} {}", "peer addr:", s.peer_addr);
115114
}
@@ -121,7 +120,6 @@ pub fn print_response(resp: &ManagementResponse) -> Result<(), CtlError> {
121120
"capabilities:", s.tun_capable, s.listening, s.connecting
122121
);
123122
println!("{:<18} {}", "version:", s.version);
124-
println!("{:<18} {}", "cli:", crate::version::version());
125123
println!("{:<18} {}", "uptime:", uptime);
126124
}
127125
Some(management_response::Response::Stats(s)) => {

crates/core/src/control/handler.rs

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ struct NodeState {
2727
role: NodeRole,
2828
capabilities: Capabilities,
2929
listen_addr: Option<SocketAddr>,
30-
connected: bool,
3130
peer_addr: Option<String>,
3231
}
3332

@@ -45,7 +44,6 @@ impl SharedNodeState {
4544
role,
4645
capabilities: Capabilities::default(),
4746
listen_addr: None,
48-
connected: false,
4947
peer_addr: None,
5048
})))
5149
}
@@ -81,28 +79,6 @@ impl SharedNodeState {
8179
new
8280
});
8381
}
84-
85-
/// Record that the node has connected to a peer.
86-
pub fn set_connected(&self, peer_addr: &str) {
87-
let addr = peer_addr.to_string();
88-
self.0.rcu(|old| {
89-
let mut new = (**old).clone();
90-
new.connected = true;
91-
new.peer_addr = Some(addr.clone());
92-
new.capabilities.connecting = true;
93-
new
94-
});
95-
}
96-
97-
/// Record that the node has disconnected from its peer.
98-
pub fn set_disconnected(&self) {
99-
self.0.rcu(|old| {
100-
let mut new = (**old).clone();
101-
new.connected = false;
102-
new.peer_addr = None;
103-
new
104-
});
105-
}
10682
}
10783

10884
/// Configuration for the control handler.
@@ -427,7 +403,6 @@ impl crate::node_api::NodeApi for Handler {
427403
let state = self.state.load();
428404
crate::node_api::NodeStatus {
429405
role: state.role,
430-
connected: state.connected,
431406
peer_addr: state.peer_addr.clone(),
432407
capabilities: state.capabilities,
433408
listen_addr: state.listen_addr,
@@ -842,7 +817,6 @@ mod tests {
842817
assert!(!status.capabilities.tun_capable);
843818
assert!(!status.capabilities.listening);
844819
assert!(status.listen_addr.is_none());
845-
assert!(!status.connected);
846820

847821
// Simulate negotiation resolving to Entry.
848822
let state = handler.node_state();
@@ -864,19 +838,5 @@ mod tests {
864838
let status = crate::node_api::NodeApi::status(&handler);
865839
assert_eq!(status.listen_addr, Some(addr));
866840
assert!(status.capabilities.listening);
867-
868-
// Simulate connection.
869-
state.set_connected("1.2.3.4:5678");
870-
871-
let status = crate::node_api::NodeApi::status(&handler);
872-
assert!(status.connected);
873-
assert_eq!(status.peer_addr.as_deref(), Some("1.2.3.4:5678"));
874-
875-
// Simulate disconnection.
876-
state.set_disconnected();
877-
878-
let status = crate::node_api::NodeApi::status(&handler);
879-
assert!(!status.connected);
880-
assert!(status.peer_addr.is_none());
881841
}
882842
}

crates/core/src/ipc.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ fn dispatch_request(request: &ManagementRequest, api: &dyn NodeApi) -> Managemen
300300
let s = api.status();
301301
management_response::Response::Status(StatusResponse {
302302
role: management::NodeRole::from(s.role).into(),
303-
connected: s.connected,
303+
connected: false, // deprecated — derive from peer count instead
304304
peer_addr: s.peer_addr.unwrap_or_default(),
305305
listen_addr: s.listen_addr.map_or_else(String::new, |a| a.to_string()),
306306
version: s.version,

crates/core/src/node_api.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,6 @@ pub struct Metrics {
8585
pub struct NodeStatus {
8686
/// Node's role.
8787
pub role: NodeRole,
88-
/// Whether node is connected to a peer (for exit/relay).
89-
pub connected: bool,
9088
/// Peer address (if connected).
9189
pub peer_addr: Option<String>,
9290
/// Advertised capabilities.

crates/daemon/src/mode/entry.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,11 +187,7 @@ pub async fn run(
187187
"entry nodes do not support both connect and listen simultaneously".into(),
188188
)),
189189
ConnectivitySpec::Listen(spec) => run_entry_listen(global, cfg, spec, res).await,
190-
ConnectivitySpec::Connect(spec) => {
191-
let node_state = res.node_state.clone();
192-
node_state.set_connected(&spec.addr);
193-
run_entry_connect(global, cfg, spec, res).await
194-
}
190+
ConnectivitySpec::Connect(spec) => run_entry_connect(global, cfg, spec, res).await,
195191
}
196192
}
197193

crates/daemon/src/mode/exit.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ pub async fn run(
7474
.into(),
7575
)),
7676
ConnectivitySpec::Connect(spec) => {
77-
ctx.node_state.set_connected(&spec.addr);
7877
run_exit_connector(global, &cfg.name, spec, &security, &ctx).await
7978
}
8079
ConnectivitySpec::Listen(spec) => run_exit_listener(global, &cfg.name, spec, &ctx).await,

crates/mcp/src/convert.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ pub fn format_response(resp: &ManagementResponse) -> Result<String, String> {
1212
let mut out = String::new();
1313
let _ = writeln!(out, "name: {}", s.package_name);
1414
let _ = writeln!(out, "role: {role}");
15-
let _ = writeln!(out, "connected: {}", s.connected);
1615
if !s.peer_addr.is_empty() {
1716
let _ = writeln!(out, "peer addr: {}", s.peer_addr);
1817
}

website/src/data/openapi.json

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
"version",
2828
"role",
2929
"uptime_ms",
30-
"connected",
3130
"capabilities"
3231
],
3332
"properties": {
@@ -48,10 +47,6 @@
4847
"type": "integer",
4948
"description": "Node uptime in milliseconds."
5049
},
51-
"connected": {
52-
"type": "boolean",
53-
"description": "Whether the node has an active peer connection."
54-
},
5550
"peer_addr": {
5651
"type": "string",
5752
"description": "Remote peer address (present only when connected)."

0 commit comments

Comments
 (0)