rustdesk/rustdesk · info

Closed manually by the web console

Error message

Closed manually by the web console

What it means

Raised when a message received on `hbbs_rx` (the channel from the rendezvous/signaling server) indicates this connection's id is in a list of connections to close — i.e., an operator closed the session via the web console. The error is intentional administrative termination, not a fault.

Source

Thrown at src/server/connection.rs:1286

                        }
                    },
                    res = self.stream.next() => {
                        if let Some(res) = res {
                            last_recv_time = Instant::now();
                            timeout(SEND_TIMEOUT_OTHER, forward.send(res?)).await??;
                        } else {
                            bail!("Stream reset by the peer");
                        }
                    },
                    _ = self.timer.tick() => {
                        if last_recv_time.elapsed() >= H1 {
                            bail!("Timeout");
                        }
                    }
                    Ok(conns) = hbbs_rx.recv() => {
                        if conns.contains(&self.inner.id) {
                            // todo: check reconnect
                            bail!("Closed manually by the web console");
                        }
                    }
                }
            }
        }
        Ok(())
    }

    async fn send_permission(&mut self, permission: Permission, enabled: bool) {
        let mut misc = Misc::new();
        misc.set_permission_info(PermissionInfo {
            permission: permission.into(),
            enabled,
            ..Default::default()
        });
        let mut msg_out = Message::new();
        msg_out.set_misc(misc);
        self.send(msg_out).await;

View on GitHub (pinned to 91c9fccbb0)

Solutions

  1. Confirm with the admin/console operator that the session was intentionally closed
  2. Have the client detect this specific error and show 'session closed by administrator' instead of a generic failure
  3. Implement the pending 'check reconnect' TODO to auto-reconnect when appropriate
  4. Audit console access logs to rule out unauthorized closures
Defensive patterns

Strategy: try-catch

Try / catch

match session_result {
    Err(e) if e.to_string().contains("Closed manually by the web console") =>
        show_admin_closed_notice(),
    other => propagate(other),
}

Prevention

When it happens

Trigger: An administrator selects 'close connection' for this peer's id in the web console; the `hbbs_rx.recv()` branch receives `Ok(conns)` whose vector contains `self.inner.id`.

Common situations: IT admin terminates a user's remote session from the management console; compliance policy auto-kills sessions; mistaken closure targeting the wrong id.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.


AI-assisted analysis of rustdesk/rustdesk@91c9fccbb0 (2026-09-10). Data as JSON: /api/errors/f7f9e9aecdc3100f. Report an issue: GitHub.