From 2f7845e63e12edd0de0ca458e838130855321ccd Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 4 May 2025 15:05:41 +0800 Subject: [PATCH] fix: write echo start on starting --- app/src/store/session.ts | 6 ++-- app/src/utils/socket.ts | 4 +-- app/src/utils/terminal.ts | 61 ++++++++++++++++++++++----------------- 3 files changed, 38 insertions(+), 33 deletions(-) diff --git a/app/src/store/session.ts b/app/src/store/session.ts index d19469b..9a8e35c 100644 --- a/app/src/store/session.ts +++ b/app/src/store/session.ts @@ -53,10 +53,10 @@ const useSession = defineStore('session', { containerName: session.containerName || '', } term.reset() - term.connect( + await socket.connect(this.session) + await term.connect( `/terminal/${session.containerName}/ws?token=${session.token}` ) - await socket.connect(this.session) term.focus() }, async createSession() { @@ -64,7 +64,7 @@ const useSession = defineStore('session', { questId: this.questId, }) await this.setSession(session) - socket.emit('terminal', 'echo start\n') + term.send('echo start\n') }, async getActiveSession() { const session = await trpc.session.getActiveSession.query({ diff --git a/app/src/utils/socket.ts b/app/src/utils/socket.ts index e520533..48666b7 100644 --- a/app/src/utils/socket.ts +++ b/app/src/utils/socket.ts @@ -23,11 +23,9 @@ class SocketWrapper { this.socket.on('connect', () => { console.log('Socket connected to session', session._id) - }) - - this.socket.once('terminal', () => { resolve() }) + this.socket.on('connect_error', reject) this.bindListeners() }) diff --git a/app/src/utils/terminal.ts b/app/src/utils/terminal.ts index a585900..54cd54d 100644 --- a/app/src/utils/terminal.ts +++ b/app/src/utils/terminal.ts @@ -28,33 +28,38 @@ class SocketTerminal { }) } - connect(url: string): void { - console.log('Connecting to terminal', url) - this.socket = new ReconnectingWebSocket(url) - this.socket.onopen = () => { - console.log('Connected to terminal') - this.term.write('\r\n\x1B[1;32mConnected to terminal\x1B[0m\r\n') - } + connect(url: string): Promise { + return new Promise((resolve, reject) => { + console.log('Connecting to terminal', url) + this.socket = new ReconnectingWebSocket(url) + this.socket.onopen = () => { + console.log('Connected to terminal') + this.term.write('\r\n\x1B[1;32mConnected to terminal\x1B[0m\r\n') + resolve() + } - this.socket.onclose = () => { - console.log('Disconnected from terminal') - this.term.write('\r\n\x1B[1;31mDisconnected from terminal\x1B[0m\r\n') - } + this.socket.onclose = () => { + console.log('Disconnected from terminal') + this.term.write('\r\n\x1B[1;31mDisconnected from terminal\x1B[0m\r\n') + reject(new Error('Disconnected from terminal')) + } - this.socket.onerror = (error) => { - console.error('WebSocket error:', error) - this.term.write( - `\r\n\x1B[1;31mWebSocket error: ${'message' in error ? error.message : ''}\x1B[0m\r\n` - ) - } - this.socket.onmessage = (event) => { - console.log('Received message from terminal') - const data = - typeof event.data === 'string' - ? event.data - : new TextDecoder().decode(event.data) - this.term.write(data) - } + this.socket.onerror = (error) => { + console.error('WebSocket error:', error) + this.term.write( + `\r\n\x1B[1;31mWebSocket error: ${'message' in error ? error.message : ''}\x1B[0m\r\n` + ) + reject(error) + } + this.socket.onmessage = (event) => { + console.log('Received message from terminal') + const data = + typeof event.data === 'string' + ? event.data + : new TextDecoder().decode(event.data) + this.term.write(data) + } + }) } resizeScreen(): void { @@ -70,8 +75,10 @@ class SocketTerminal { this.resizeScreen() } - write(message: string): void { - this.term.write(message) + send(message: string): void { + if (this.socket) { + this.socket.send(message) + } } focus(): void {