Add connected technician tracking to dashboard
- Add ViewerInfo struct to track viewer name and connection time - Update session manager to track viewers with names - Update API to return viewer list for each session - Update dashboard to display "Mike Connected (3 min)" on machine bars - Update viewer.html to pass viewer_name parameter 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -34,6 +34,12 @@ pub struct AgentParams {
|
||||
#[derive(Debug, Deserialize)]
|
||||
pub struct ViewerParams {
|
||||
session_id: String,
|
||||
#[serde(default = "default_viewer_name")]
|
||||
viewer_name: String,
|
||||
}
|
||||
|
||||
fn default_viewer_name() -> String {
|
||||
"Technician".to_string()
|
||||
}
|
||||
|
||||
/// WebSocket handler for agent connections
|
||||
@@ -58,9 +64,10 @@ pub async fn viewer_ws_handler(
|
||||
Query(params): Query<ViewerParams>,
|
||||
) -> impl IntoResponse {
|
||||
let session_id = params.session_id;
|
||||
let viewer_name = params.viewer_name;
|
||||
let sessions = state.sessions.clone();
|
||||
|
||||
ws.on_upgrade(move |socket| handle_viewer_connection(socket, sessions, session_id))
|
||||
ws.on_upgrade(move |socket| handle_viewer_connection(socket, sessions, session_id, viewer_name))
|
||||
}
|
||||
|
||||
/// Handle an agent WebSocket connection
|
||||
@@ -242,6 +249,7 @@ async fn handle_viewer_connection(
|
||||
socket: WebSocket,
|
||||
sessions: SessionManager,
|
||||
session_id_str: String,
|
||||
viewer_name: String,
|
||||
) {
|
||||
// Parse session ID
|
||||
let session_id = match uuid::Uuid::parse_str(&session_id_str) {
|
||||
@@ -256,7 +264,7 @@ async fn handle_viewer_connection(
|
||||
let viewer_id = Uuid::new_v4().to_string();
|
||||
|
||||
// Join the session (this sends StartStream to agent if first viewer)
|
||||
let (mut frame_rx, input_tx) = match sessions.join_session(session_id, viewer_id.clone()).await {
|
||||
let (mut frame_rx, input_tx) = match sessions.join_session(session_id, viewer_id.clone(), viewer_name.clone()).await {
|
||||
Some(channels) => channels,
|
||||
None => {
|
||||
warn!("Session not found: {}", session_id);
|
||||
@@ -264,7 +272,7 @@ async fn handle_viewer_connection(
|
||||
}
|
||||
};
|
||||
|
||||
info!("Viewer {} joined session: {}", viewer_id, session_id);
|
||||
info!("Viewer {} ({}) joined session: {}", viewer_name, viewer_id, session_id);
|
||||
|
||||
let (mut ws_sender, mut ws_receiver) = socket.split();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user