@@ -51,52 +51,104 @@ export const useTerminalStore = defineStore('terminal', () => {
5151 } )
5252 }
5353
54+ // 存储事件处理器引用,便于清理
55+ const eventHandlers = {
56+ sshConnected : null ,
57+ sshData : null ,
58+ sshError : null ,
59+ sshClosed : null ,
60+ disconnect : null
61+ }
62+
5463 // 监听Socket事件(在Socket连接建立后设置)
5564 const setupSocketListeners = ( ) => {
5665 if ( ! socket . value || socket . value . _listenersSetup ) return
5766
5867 // 标记已设置监听器,避免重复设置
5968 socket . value . _listenersSetup = true
6069
61- socket . value . on ( 'ssh-connected' , ( ) => {
70+ // 创建事件处理器
71+ eventHandlers . sshConnected = ( ) => {
6272 isConnected . value = true
6373 isConnecting . value = false
6474 connectionError . value = null
6575 console . log ( 'SSH连接成功' )
66- } )
76+ }
6777
68- socket . value . on ( 'ssh-data' , ( data ) => {
78+ eventHandlers . sshData = ( data ) => {
6979 // 确保数据是字符串格式
7080 const output = typeof data === 'string' ? data : String ( data )
7181 terminalOutput . value += output
72-
82+
7383 // 限制输出长度,防止内存溢出
7484 if ( terminalOutput . value . length > 50000 ) {
7585 terminalOutput . value = terminalOutput . value . slice ( - 25000 )
7686 }
77- } )
87+ }
7888
79- socket . value . on ( 'ssh-error' , ( data ) => {
89+ eventHandlers . sshError = ( data ) => {
8090 isConnecting . value = false
8191 isConnected . value = false
8292 connectionError . value = data . error
8393 console . error ( 'SSH连接错误:' , data . error )
84- } )
94+ }
8595
86- socket . value . on ( 'ssh-closed' , ( ) => {
96+ eventHandlers . sshClosed = ( ) => {
8797 isConnected . value = false
8898 isConnecting . value = false
8999 currentConnection . value = null
90100 console . log ( 'SSH连接已关闭' )
91- } )
101+ }
92102
93- socket . value . on ( ' disconnect' , ( ) => {
103+ eventHandlers . disconnect = ( ) => {
94104 isConnected . value = false
95105 isConnecting . value = false
96106 console . log ( 'Socket连接断开' )
97107 // 清除监听器标记
108+ if ( socket . value ) {
109+ socket . value . _listenersSetup = false
110+ }
111+ }
112+
113+ // 注册事件监听器
114+ socket . value . on ( 'ssh-connected' , eventHandlers . sshConnected )
115+ socket . value . on ( 'ssh-data' , eventHandlers . sshData )
116+ socket . value . on ( 'ssh-error' , eventHandlers . sshError )
117+ socket . value . on ( 'ssh-closed' , eventHandlers . sshClosed )
118+ socket . value . on ( 'disconnect' , eventHandlers . disconnect )
119+ }
120+
121+ // 移除所有事件监听器
122+ const removeSocketListeners = ( ) => {
123+ if ( ! socket . value ) return
124+
125+ if ( eventHandlers . sshConnected ) {
126+ socket . value . off ( 'ssh-connected' , eventHandlers . sshConnected )
127+ }
128+ if ( eventHandlers . sshData ) {
129+ socket . value . off ( 'ssh-data' , eventHandlers . sshData )
130+ }
131+ if ( eventHandlers . sshError ) {
132+ socket . value . off ( 'ssh-error' , eventHandlers . sshError )
133+ }
134+ if ( eventHandlers . sshClosed ) {
135+ socket . value . off ( 'ssh-closed' , eventHandlers . sshClosed )
136+ }
137+ if ( eventHandlers . disconnect ) {
138+ socket . value . off ( 'disconnect' , eventHandlers . disconnect )
139+ }
140+
141+ // 清空处理器引用
142+ eventHandlers . sshConnected = null
143+ eventHandlers . sshData = null
144+ eventHandlers . sshError = null
145+ eventHandlers . sshClosed = null
146+ eventHandlers . disconnect = null
147+
148+ // 清除标记
149+ if ( socket . value ) {
98150 socket . value . _listenersSetup = false
99- } )
151+ }
100152 }
101153
102154 // 连接到SSH服务器
@@ -169,10 +221,13 @@ export const useTerminalStore = defineStore('terminal', () => {
169221 // 断开Socket连接
170222 const disconnectSocket = ( ) => {
171223 if ( socket . value ) {
224+ // 先移除所有事件监听器
225+ removeSocketListeners ( )
226+ // 断开连接
172227 socket . value . disconnect ( )
173228 socket . value = null
174229 }
175-
230+
176231 isConnected . value = false
177232 isConnecting . value = false
178233 currentConnection . value = null
0 commit comments