diff --git a/html/src/components/terminal/xterm/index.ts b/html/src/components/terminal/xterm/index.ts index 18caf62..ffd9bc0 100644 --- a/html/src/components/terminal/xterm/index.ts +++ b/html/src/components/terminal/xterm/index.ts @@ -104,9 +104,10 @@ export class Xterm { private intervalID: NodeJS.Timeout; private writeFunc = (data: ArrayBuffer) => this.writeData(new Uint8Array(data)); private status = false; - private titleStatus = false; - private checkStatus = false; - private connectStatus = false; + private hostTitle = ""; + private postAttachCommand = []; + private postAttachCommandStatus = false; + private workdir = ""; private beforeCommand?: string; constructor( private options: XtermOptions, @@ -352,26 +353,17 @@ export class Xterm { ) .then(response => response.json()) .then(data => { + if (this.workdir === ''){ + this.workdir = data.workdir; + } if (data.status !== '4' && data.status !== '0') { this.sendData(data.command); } else { clearInterval(this.intervalID); if (data.status === '4') { - fetch( - 'http://' + options.get('domain') + ':'+ options.get('port') +'/' + - options.get('user') + - '/' + - options.get('repo') + - '/devcontainer/command?' + - params - ) - .then(response => response.json()) - .then(data => { - this.sendData(data.command); - }) - .catch(error => { - console.error('Error:', error); - }); + const parts = data.command.split('\n'); + this.sendData(parts[0]+"\n"); + this.postAttachCommand = parts; } } }) @@ -422,50 +414,40 @@ export class Xterm { const data = rawData.slice(1); switch (cmd) { case Command.OUTPUT: - console.log(this.status + ': ' + textDecoder.decode(data) + this.connectStatus + ' ' + this.checkStatus + ' ' + this.titleStatus ); + console.log(this.status + ': ' + textDecoder.decode(data)); const options = new URLSearchParams(decodeURIComponent(window.location.search)); if (options.get('type') === 'docker') { + // 保存host的标题 + if (this.hostTitle === ""){ + this.hostTitle = textDecoder.decode(data).replace(/\s/g, ''); + } + // 检测是否退出devcontainer,标题等于host的标题 + if (this.status && textDecoder.decode(data).replace(/\s/g, '').includes(this.hostTitle)){ + this.status = false + } + // this.status = true 连接完成 if ( this.status === false && - textDecoder.decode(data).replace(/\s/g, '').includes('Successfully connected to the container'.replace(/\s/g, '')) + textDecoder.decode(data).replace(/\s/g, '').includes('Successfully connected to the devcontainer'.replace(/\s/g, '')) ) { - if(this.connectStatus == true){ - this.status = true; - } - this.connectStatus = true; - } - if (this.checkStatus) { - if (textDecoder.decode(data).replace(/\s/g, '').includes('You have out the container. Please refresh the terminal to reconnect.'.replace(/\s/g, ''))) { - this.checkStatus = false; - this.status = false; - this.connectStatus = false; - } - if(textDecoder.decode(data).includes('\x1b')){ - this.checkStatus = false; - } - } - if (this.titleStatus && textDecoder.decode(data).includes('\x1b')) { - this.titleStatus = false; - this.checkStatus = true; - this.sendData( - `echo $WEB_TERMINAL\n` - ); + this.status = true; } + // 连接完成之前,不输出标题和docker命令 if ( - !(this.status === false && (textDecoder.decode(data).includes('\x1b') || textDecoder.decode(data).replace(/\s/g, '').includes('docker'))) && - this.titleStatus !== true && - this.checkStatus !== true + !(this.status === false && (textDecoder.decode(data).includes('\x1b') || textDecoder.decode(data).replace(/\s/g, '').includes('docker'))) ){ this.writeFunc(data); } - if (textDecoder.decode(data).replace(/\s/g, '').includes('exit')) { - this.titleStatus = true; + if (this.status && textDecoder.decode(data).replace(/\s/g, '').includes(this.workdir) && !this.postAttachCommandStatus){ + for (let i = 1; i < this.postAttachCommand.length; i++){ + this.sendData(this.postAttachCommand[i]+"\n"); + } + this.postAttachCommandStatus = true; } - } else { this.writeFunc(data); } - console.log(this.status + ': ' + textDecoder.decode(data) + this.connectStatus + ' ' + this.checkStatus + ' ' + this.titleStatus ); + console.log(this.status + ': ' + textDecoder.decode(data)); break; case Command.SET_WINDOW_TITLE: console.log('SET_WINDOW_TITLESET_WINDOW_TITLE');