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 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}