feat(terminal): add WebGL renderer and addon APIs

This commit is contained in:
zhangheng
2026-06-23 16:48:53 +08:00
parent f76d341501
commit 69a670939d
15 changed files with 4199 additions and 740 deletions

View File

@@ -1,9 +1,7 @@
use std::io::{Read, Write};
use std::sync::{Arc, Mutex};
use portable_pty::{
ChildKiller, CommandBuilder, MasterPty, PtySize, native_pty_system,
};
use portable_pty::{ChildKiller, CommandBuilder, MasterPty, PtySize, native_pty_system};
use tokio::sync::mpsc;
#[derive(Clone, Copy, Debug)]
@@ -43,9 +41,7 @@ pub struct PtySession {
}
impl PtySession {
pub fn spawn(
size: TerminalSize,
) -> Result<(Self, mpsc::UnboundedReceiver<Vec<u8>>), String> {
pub fn spawn(size: TerminalSize) -> Result<(Self, mpsc::UnboundedReceiver<Vec<u8>>), String> {
let pty_system = native_pty_system();
let pair = pty_system
.openpty(size.into_pty_size())
@@ -89,9 +85,8 @@ impl PtySession {
}
}
Err(error) => {
let _ = tx.send(
format!("\r\n[terminal read error] {error}\r\n").into_bytes(),
);
let _ =
tx.send(format!("\r\n[terminal read error] {error}\r\n").into_bytes());
break;
}
}
@@ -103,12 +98,11 @@ impl PtySession {
.and_then(|mut child| child.wait().ok())
.map(|status| status.exit_code() as i32);
let payload = serde_json::to_vec(&app::terminal::protocol::ServerTerminalMessage::Exit {
code: exit_code,
})
.unwrap_or_else(|_| {
br#"{"type":"exit","code":null}"#.to_vec()
});
let payload =
serde_json::to_vec(&app::terminal::protocol::ServerTerminalMessage::Exit {
code: exit_code,
})
.unwrap_or_else(|_| br#"{"type":"exit","code":null}"#.to_vec());
let _ = tx.send(payload);
});

View File

@@ -67,8 +67,7 @@ async fn handle_terminal_socket(socket: WebSocket) {
match client_message {
ClientTerminalMessage::Input { data } => {
if let Err(error) = session.write(&data) {
let _ = server_tx
.send(ServerTerminalMessage::Error { message: error });
let _ = server_tx.send(ServerTerminalMessage::Error { message: error });
}
}
ClientTerminalMessage::Resize {
@@ -83,8 +82,7 @@ async fn handle_terminal_socket(socket: WebSocket) {
pixel_width,
pixel_height,
}) {
let _ = server_tx
.send(ServerTerminalMessage::Error { message: error });
let _ = server_tx.send(ServerTerminalMessage::Error { message: error });
}
}
ClientTerminalMessage::Ping => {