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