opendev_web/state/
bridge.rs1use std::sync::Arc;
4
5use tokio::sync::mpsc;
6
7use super::{AgentExecutor, AppState, INJECTION_QUEUE_CAPACITY};
8
9impl AppState {
10 pub async fn is_bridge_mode(&self) -> bool {
14 self.inner.bridge.read().await.active
15 }
16
17 pub async fn bridge_session_id(&self) -> Option<String> {
19 let bridge = self.inner.bridge.read().await;
20 if bridge.active {
21 bridge.session_id.clone()
22 } else {
23 None
24 }
25 }
26
27 pub async fn set_bridge_session(&self, session_id: String) {
32 let mut bridge = self.inner.bridge.write().await;
33 bridge.active = true;
34 bridge.session_id = Some(session_id);
35 }
36
37 pub async fn clear_bridge_session(&self) {
39 let mut bridge = self.inner.bridge.write().await;
40 bridge.active = false;
41 bridge.session_id = None;
42 }
43
44 pub async fn is_bridge_guarded(&self, session_id: &str) -> bool {
50 let bridge = self.inner.bridge.read().await;
51 bridge.active && bridge.session_id.as_deref() == Some(session_id)
52 }
53
54 pub async fn get_or_create_injection_queue(
62 &self,
63 session_id: &str,
64 ) -> (mpsc::Sender<String>, Option<mpsc::Receiver<String>>) {
65 let mut queues = self.inner.injection_queues.lock().await;
66 if let Some(tx) = queues.get(session_id) {
67 (tx.clone(), None)
68 } else {
69 let (tx, rx) = mpsc::channel(INJECTION_QUEUE_CAPACITY);
70 queues.insert(session_id.to_string(), tx.clone());
71 (tx, Some(rx))
72 }
73 }
74
75 pub async fn try_inject_message(
79 &self,
80 session_id: &str,
81 message: String,
82 ) -> Result<(), String> {
83 let queues = self.inner.injection_queues.lock().await;
84 if let Some(tx) = queues.get(session_id) {
85 tx.try_send(message)
86 .map_err(|e| format!("Injection queue full or closed: {}", e))
87 } else {
88 Err("No injection queue for session".to_string())
89 }
90 }
91
92 pub async fn clear_injection_queue(&self, session_id: &str) {
94 self.inner.injection_queues.lock().await.remove(session_id);
95 }
96
97 pub async fn set_agent_executor(&self, executor: Arc<dyn AgentExecutor>) {
101 *self.inner.agent_executor.lock().await = Some(executor);
102 }
103
104 pub async fn agent_executor(&self) -> Option<Arc<dyn AgentExecutor>> {
106 self.inner.agent_executor.lock().await.clone()
107 }
108}