dk_protocol/
session_status.rs1use 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}