From 827c33095bd3cc8025aea3b1e42782c2471a03ad Mon Sep 17 00:00:00 2001 From: sawka Date: Thu, 7 Jul 2022 13:27:44 -0700 Subject: [PATCH] hook up cmd cmdstr and prompt --- src/main.tsx | 62 ++++++++++++++++++++++++++++++++++++++++---- src/session.ts | 70 +++++++++++++++++++++++++++++++++++++++++++++++--- src/term.ts | 6 ++--- 3 files changed, 127 insertions(+), 11 deletions(-) diff --git a/src/main.tsx b/src/main.tsx index 9d0299f0..ac433c04 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -8,7 +8,7 @@ import {If, For, When, Otherwise, Choose} from "tsx-control-statements/component import cn from "classnames" import {TermWrap} from "./term"; import {getDefaultSession, getLineId, Session} from "./session"; -import type {LineType} from "./session"; +import type {LineType, CmdDataType, RemoteType} from "./session"; import localizedFormat from 'dayjs/plugin/localizedFormat'; dayjs.extend(localizedFormat) @@ -115,6 +115,54 @@ class LineCmd extends React.Component<{line : LineType, session : Session, chang } return cmdText; } + + replaceHomePath(path : string, homeDir : string) : string { + if (path == homeDir) { + return "~"; + } + if (path.startsWith(homeDir + "/")) { + return "~" + path.substr(homeDir.length); + } + return path; + } + + renderCmdText(cmd : CmdDataType, remote : RemoteType) : any { + if (cmd == null) { + return ( +
+ (cmd not found) +
+ ); + } + let promptStr = ""; + if (remote.remotevars.local) { + promptStr = sprintf("%s@%s", remote.remotevars.remoteuser, "local") + } + else if (remote.remotevars.remotehost) { + promptStr = sprintf("%s@%s", remote.remotevars.remoteuser, remote.remotevars.remotehost) + } + else { + let host = remote.remotevars.host || "unknown"; + if (remote.remotevars.user) { + promptStr = sprintf("%s@%s", remote.remotevars.user, host) + } + else { + promptStr = host; + } + } + let cwd = "(unknown)"; + if (cmd.remotestate && cmd.remotestate.cwd) { + cwd = cmd.remotestate.cwd; + } + if (remote.remotevars.home) { + cwd = this.replaceHomePath(cwd, remote.remotevars.home) + } + return ( +
+ [{promptStr} {cwd}] {this.singleLineCmdText(cmd.cmdstr)} +
+ ); + } render() { let {session, line} = this.props; @@ -128,7 +176,12 @@ class LineCmd extends React.Component<{line : LineType, session : Session, chang let termSize = termWrap.getSize(); let formattedTime = getLineDateStr(line.ts); let cellHeightPx = 17; - let totalHeight = cellHeightPx * termWrap.usedRows.get(); + let totalHeight = cellHeightPx * termWrap.usedRows; + let cmd : CmdDataType = session.getCmd(line.cmdid); + let remote : RemoteType = null; + if (cmd != null) { + remote = session.getRemote(cmd.remoteid); + } return (
= 5}, {"running": running})}> @@ -145,9 +198,7 @@ class LineCmd extends React.Component<{line : LineType, session : Session, chang 0}>({termSize.rows}x{termSize.cols}) {termWrap.ptyPos} bytes, v{renderVersion}
-
- [mike@local ~] {this.singleLineCmdText(line.cmdtext)} -
+ {this.renderCmdText(cmd, remote)}
@@ -446,3 +497,4 @@ class Main extends React.Component<{}, {}> { export {Main}; + diff --git a/src/session.ts b/src/session.ts index 6b0021d4..83e427e2 100644 --- a/src/session.ts +++ b/src/session.ts @@ -20,7 +20,6 @@ type LineType = { linetype : string, text : string, cmdid : string, - cmdtext : string, isnew : boolean, }; @@ -32,6 +31,7 @@ type RemoteType = { remotetype : string, remoteid : string, remotename : string, + remotevars : Record, status : string, defaultstate : RemoteStateType, }; @@ -86,7 +86,40 @@ type FeCmdPacketType = { remotestate : CmdRemoteStateType, } +type TermOptsType = { + rows : number, + cols : number, + flexrows : boolean, +}; + +type CmdStartPacketType = { + type : string, + respid : string, + ts : number, + ck : string, + pid : number, + mshellpid : number, +}; + +type CmdDonePacketType = { + type : string, + ts : number, + ck : string, + exitcode : number, + durationms : number, +}; + type CmdDataType = { + sessionid : string, + cmdid : string, + remoteid : string, + cmdstr : string, + remotestate : RemoteStateType, + termopts : TermOptsType, + status : string, + startpk : CmdStartPacketType, + donepk : CmdDonePacketType, + runout : any[], }; class Session { @@ -100,6 +133,7 @@ class Session { loading : mobx.IObservableValue = mobx.observable.box(false); remotes : RemoteInstanceType[] = []; globalRemotes : RemoteType[]; + cmds : CmdDataType[]; constructor() { } @@ -171,6 +205,30 @@ class Session { }); } + getCmd(cmdId : string) : CmdDataType { + if (!cmdId) { + return null; + } + for (let i=0; i handleJsonFetchResponse(url, resp)).then((data) => { mobx.action(() => { if (data.data != null && data.data.line != null) { - this.addLine(data.data.line); + let line = data.data.line; + line.isnew = true; + this.addLine(line); + } + if (data.data != null && data.data.cmd != null) { + this.cmds.push(data.data.cmd); } })(); }).catch((err) => { @@ -325,6 +388,7 @@ function initSession() { DefaultSession.windows[i].linesLoading = mobx.observable.box(false); } DefaultSession.remotes = sdata.remotes || []; + DefaultSession.cmds = sdata.cmds || []; DefaultSession.setActiveWindow(sdata.windows[0].windowid); sessionLoaded = true; if (remotesLoaded && sessionLoaded) { @@ -343,4 +407,4 @@ function getDefaultSession() : Session { (window as any).getDefaultSession = getDefaultSession; export {Session, getDefaultSession, getLineId, initSession}; -export type {LineType, WindowDataType}; +export type {LineType, WindowDataType, CmdDataType, RemoteType}; diff --git a/src/term.ts b/src/term.ts index 8a09b2a2..ef7a4c6e 100644 --- a/src/term.ts +++ b/src/term.ts @@ -33,14 +33,14 @@ class TermWrap { atRowMax : boolean = false; initialized : boolean = false; changeSizeCallback : (TermWrap) => void = null; - usedRows : mobx.IObservableValue = null; + usedRows : number; constructor(sessionId : string, cmdId : string) { this.termId = uuidv4(); this.sessionId = sessionId; this.cmdId = cmdId; this.terminal = new Terminal({rows: 25, cols: 80, theme: {foreground: "#d3d7cf"}}); - this.usedRows = mobx.observable.box(2, {name: "usedRows"}); + this.usedRows = 2; } destroy() { @@ -109,7 +109,7 @@ class TermWrap { usedRows = i+1; } } - this.usedRows.set(usedRows); + this.usedRows = usedRows; return; }