@@ -2,7 +2,7 @@ use std::collections::HashMap;
22use std:: sync:: Arc ;
33
44use tokio:: {
5- io:: { AsyncReadExt , AsyncWriteExt } ,
5+ io:: { split , AsyncReadExt , AsyncWriteExt , ReadHalf , WriteHalf } ,
66 sync:: { Mutex , RwLock } ,
77} ;
88
@@ -16,7 +16,7 @@ pub struct TermManager {
1616}
1717
1818pub struct TermInfo {
19- pub pty : Arc < Mutex < Pty > > ,
19+ pub writer : Arc < Mutex < WriteHalf < Pty > > > ,
2020 pub child : Arc < Mutex < Option < Child > > > ,
2121}
2222
@@ -29,9 +29,9 @@ impl TermManager {
2929}
3030
3131impl TermInfo {
32- pub fn new ( pty : Pty , child : Child ) -> Self {
32+ pub fn new ( writer : WriteHalf < Pty > , child : Child ) -> Self {
3333 TermInfo {
34- pty : Arc :: new ( Mutex :: new ( pty ) ) ,
34+ writer : Arc :: new ( Mutex :: new ( writer ) ) ,
3535 child : Arc :: new ( Mutex :: new ( Some ( child) ) ) ,
3636 }
3737 }
@@ -48,32 +48,29 @@ pub async fn create_terminal(
4848 . spawn ( pts)
4949 . map_err ( |e| format ! ( "Failed to spawn shell: {}" , e) ) ?;
5050
51- let ( term_id, pty_ref) = {
51+ let ( reader, writer) = split ( pty) ;
52+
53+ let ( term_id, writer_ref) = {
5254 let mut terms = term_info. terminals . write ( ) . await ;
5355 let term_id = format ! ( "term-{}" , terms. len( ) + 1 ) ;
54- let info = TermInfo :: new ( pty , child) ;
55- let pty_ref = info. pty . clone ( ) ;
56+ let info = TermInfo :: new ( writer , child) ;
57+ let writer_ref = info. writer . clone ( ) ;
5658 terms. insert ( term_id. clone ( ) , info) ;
57- ( term_id, pty_ref )
59+ ( term_id, writer_ref )
5860 } ;
5961
6062 let window = window. clone ( ) ;
6163 let term_id_clone = term_id. clone ( ) ;
6264 tokio:: spawn ( async move {
65+ let mut reader: ReadHalf < Pty > = reader;
6366 let mut buffer = [ 0u8 ; 4096 ] ;
6467
6568 loop {
66- let read_result = {
67- let mut pty_guard = pty_ref. lock ( ) . await ;
68- pty_guard. read ( & mut buffer) . await
69- } ;
70-
71- match read_result {
72- Ok ( 0 ) => break , // EOF
69+ match reader. read ( & mut buffer) . await {
70+ Ok ( 0 ) => break ,
7371 Ok ( n) => {
74- let data = String :: from_utf8_lossy ( & buffer[ ..n] ) . into_owned ( ) ;
75- if !data. is_empty ( ) {
76- let _ = window. emit ( "terminal" , ( & term_id_clone, & data) ) ;
72+ if let Ok ( data) = std:: str:: from_utf8 ( & buffer[ ..n] ) {
73+ let _ = window. emit ( "terminal" , ( & term_id_clone, data) ) ;
7774 }
7875 }
7976 Err ( _) => break ,
@@ -90,22 +87,17 @@ pub async fn write_terminal(
9087 id : String ,
9188 data : String ,
9289) -> Result < ( ) , String > {
93- println ! ( "Writing to terminal {}: {}" , id, data) ;
94-
95- let pty_ref = {
90+ let writer = {
9691 let terms = term_info. terminals . read ( ) . await ;
97- match terms. get ( & id ) {
98- Some ( info ) => info . pty . clone ( ) ,
99- None => return Err ( "Terminal ID not found" . to_string ( ) ) ,
100- }
92+ terms
93+ . get ( & id )
94+ . map ( |info| info . writer . clone ( ) )
95+ . ok_or_else ( || "Terminal ID not found" . to_string ( ) ) ?
10196 } ;
10297
103- let mut pty_guard = pty_ref. lock ( ) . await ;
104- println ! ( "PTY found, writing data" ) ;
105- pty_guard
98+ let mut guard = writer. lock ( ) . await ;
99+ guard
106100 . write_all ( data. as_bytes ( ) )
107101 . await
108- . map_err ( |e| format ! ( "Failed to write to terminal: {}" , e) ) ?;
109-
110- Ok ( ( ) )
102+ . map_err ( |e| format ! ( "Failed to write to terminal: {}" , e) )
111103}
0 commit comments