diff --git a/src/main.tsx b/src/main.tsx index cc77b3767..ec8707f46 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -77,7 +77,7 @@ class LineCmd extends React.Component<{line : LineType, session : Session}, {}> doRefresh() { let {session, line} = this.props; let termWrap = session.getTermWrapByLine(line); - termWrap.reloadTerminal(line.sessionid, line.cmdid, 500); + termWrap.reloadTerminal(true, 500); } @boundMethod diff --git a/src/session.ts b/src/session.ts index df8d7cadb..edd7200e0 100644 --- a/src/session.ts +++ b/src/session.ts @@ -69,12 +69,11 @@ class Session { if (termWrap != null) { return termWrap; } - termWrap = new TermWrap(); + termWrap = new TermWrap(line.sessionid, line.cmdid); this.termMap[termKey] = termWrap; this.termMapById[termWrap.termId] = termWrap; termWrap.initialized = true; - termWrap.reloadTerminal(0); - termWrap.startPtyTail(line.sessionid, line.cmdid); + termWrap.reloadTerminal(true, 0); return termWrap; } diff --git a/src/term.ts b/src/term.ts index 2eb592be6..b3d5f86e7 100644 --- a/src/term.ts +++ b/src/term.ts @@ -21,6 +21,8 @@ function loadPtyOut(term : Terminal, sessionId : string, cmdId : string, delayMs class TermWrap { terminal : Terminal; termId : string; + sessionId : string; + cmdId : string; ptyPos : number = 0; runPos : number = 0; runData : string = ""; @@ -32,8 +34,10 @@ class TermWrap { atRowMax : boolean = false; initialized : boolean = false; - constructor() { + constructor(sessionId : string, cmdId : string) { this.termId = uuidv4(); + this.sessionId = sessionId; + this.cmdId = cmdId; this.terminal = new Terminal({rows: 2, cols: 80}); } @@ -41,12 +45,23 @@ class TermWrap { } - startPtyTail(sessionId : string, cmdId : string) { + @boundMethod + onKeyHandler(event : any) { + let inputPacket = { + type: "input", + sessionid: this.sessionId, + cmdid: this.cmdId, + inputdata: event.key, + }; + GlobalWS.pushMessage(inputPacket); + } + + startPtyTail() { let getCmdPacket = { type: "getcmd", reqid: this.termId, - sessionid: sessionId, - cmdid: cmdId, + sessionid: this.sessionId, + cmdid: this.cmdId, ptypos: this.ptyPos, tail: true, }; @@ -121,12 +136,15 @@ class TermWrap { mobx.action(() => this.renderVersion.set(this.renderVersion.get() + 1))(); } - reloadTerminal(sessionId : string, cmdId : string, delayMs : number) { - loadPtyOut(this.terminal, sessionId, cmdId, delayMs, (ptyoutLen) => { + reloadTerminal(startTail : boolean, delayMs : number) { + loadPtyOut(this.terminal, this.sessionId, this.cmdId, delayMs, (ptyoutLen) => { mobx.action(() => { this.incRenderVersion(); this.ptyPos = ptyoutLen; })(); + if (startTail) { + this.startPtyTail(); + } }); } @@ -138,6 +156,7 @@ class TermWrap { this.terminal.textarea.addEventListener("blur", () => { this.setFocus(false); }); + this.terminal.onKey(this.onKeyHandler); } } diff --git a/src/ws.ts b/src/ws.ts index c900d622a..b5396c108 100644 --- a/src/ws.ts +++ b/src/ws.ts @@ -33,6 +33,10 @@ class WSControl { return; } this.reconnectTimes++; + if (this.reconnectTimes > 20) { + console.log("websocket cannot connect, giving up"); + return; + } let timeoutArr = [0, 0, 2, 5, 10, 10, 30, 60]; let timeout = 60; if (this.reconnectTimes < timeoutArr.length) {