fix: 重复关闭

This commit is contained in:
bietiaop
2025-02-02 15:09:38 +08:00
parent a0a4b0dd1d
commit 0fdd0175b7

View File

@@ -11,6 +11,8 @@ interface TerminalInstance {
pty: IPty; // 改用 PTY 实例 pty: IPty; // 改用 PTY 实例
lastAccess: number; lastAccess: number;
sockets: Set<WebSocket>; sockets: Set<WebSocket>;
// 新增标识,用于防止重复关闭
isClosing: boolean;
} }
class TerminalManager { class TerminalManager {
@@ -85,7 +87,8 @@ class TerminalManager {
ws.on('close', () => { ws.on('close', () => {
instance.sockets.delete(ws); instance.sockets.delete(ws);
if (instance.sockets.size === 0) { if (instance.sockets.size === 0 && !instance.isClosing) {
instance.isClosing = true;
instance.pty.kill(); instance.pty.kill();
} }
}); });
@@ -117,6 +120,7 @@ class TerminalManager {
pty, pty,
lastAccess: Date.now(), lastAccess: Date.now(),
sockets: new Set(), sockets: new Set(),
isClosing: false,
}; };
pty.onData((data: any) => { pty.onData((data: any) => {
@@ -139,7 +143,10 @@ class TerminalManager {
closeTerminal(id: string) { closeTerminal(id: string) {
const instance = this.terminals.get(id); const instance = this.terminals.get(id);
if (instance) { if (instance) {
if (!instance.isClosing) {
instance.isClosing = true;
instance.pty.kill(); instance.pty.kill();
}
instance.sockets.forEach((ws) => ws.close()); instance.sockets.forEach((ws) => ws.close());
this.terminals.delete(id); this.terminals.delete(id);
} }