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;
}