webterm_agent/models/
pty_activity_writer.rs1use 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 }
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}