webterm_agent/models/
pty_activity_writer.rs

1use pty_process::OwnedWritePty;
2use std::sync::Arc;
3use tokio::io::AsyncWriteExt;
4use tokio::sync::{mpsc, Mutex};
5use tracing::info;
6
7pub type TerminalPublisher = mpsc::Sender<Vec<u8>>;
8
9pub struct PtyActivityWriter {
10    _tx: TerminalPublisher,
11}
12
13impl PtyActivityWriter {
14    pub fn new(writer_stream: Arc<Mutex<OwnedWritePty>>) -> Self {
15        let (_tx, mut rx) = mpsc::channel::<Vec<u8>>(16);
16        tokio::spawn(async move {
17            loop {
18                let received = rx.recv().await;
19                match received {
20                    None => {
21                        info!("mpsc rx closed");
22                        break;
23                    }
24                    Some(message) => {
25                        let result = writer_stream.lock().await.write_all(&message).await;
26                        match result {
27                            Ok(_) => {
28                                // continue
29                            }
30                            Err(error) => {
31                                info!("Error sending message to writer stream: {}", error);
32                                break;
33                            }
34                        }
35                    }
36                }
37            }
38        });
39        Self { _tx }
40    }
41
42    pub fn publisher(&self) -> TerminalPublisher {
43        self._tx.clone()
44    }
45}