Skip to main content

dk_protocol/
session_status.rs

1use tonic::Status;
2
3use crate::server::ProtocolServer;
4use crate::{SessionStatusRequest, SessionStatusResponse};
5
6pub async fn handle_get_session_status(
7    server: &ProtocolServer,
8    req: SessionStatusRequest,
9) -> Result<tonic::Response<SessionStatusResponse>, Status> {
10    let session = server.validate_session(&req.session_id)?;
11    crate::require_live_session::require_live_session(server, &req.session_id).await?;
12    server.session_mgr().touch_session(&session.id);
13
14    let ws = server
15        .engine()
16        .workspace_manager()
17        .get_workspace(&session.id)
18        .ok_or_else(|| Status::not_found("workspace not found for session"))?;
19
20    let files_modified = ws.overlay.list_paths();
21    let overlay_size_bytes = ws.overlay.total_bytes() as u64;
22    let repo_id = ws.repo_id;
23    let base_commit = ws.base_commit.clone();
24    let changeset_id = ws.changeset_id;
25    drop(ws);
26
27    let active_other = server
28        .engine()
29        .workspace_manager()
30        .active_sessions_for_repo(repo_id, Some(session.id))
31        .len() as u32;
32
33    let symbols_modified = match server
34        .engine()
35        .changeset_store()
36        .get_affected_symbols(changeset_id)
37        .await
38    {
39        Ok(syms) => syms.into_iter().map(|(_, qn)| qn).collect(),
40        Err(_) => vec![],
41    };
42
43    Ok(tonic::Response::new(SessionStatusResponse {
44        session_id: session.id.to_string(),
45        base_commit,
46        files_modified,
47        symbols_modified,
48        overlay_size_bytes,
49        active_other_sessions: active_other,
50    }))
51}