From c87d4f787c77e644771aa735a833768e96097606 Mon Sep 17 00:00:00 2001 From: sawka Date: Sun, 5 Feb 2023 23:01:02 -0800 Subject: [PATCH] move reload url code to model from term --- src/main.tsx | 2 +- src/model.ts | 34 +++++++++++++++++++++++++++--- src/term.ts | 59 +++++++++++++++++++++++----------------------------- src/types.ts | 11 ++++++---- 4 files changed, 65 insertions(+), 41 deletions(-) diff --git a/src/main.tsx b/src/main.tsx index bce148b18..937069ced 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -288,7 +288,7 @@ class TerminalRenderer extends React.Component<{sw : ScreenWindow, line : LineTy console.log("cannot load terminal, no term elem found", termId); return; } - sw.connectElem(termElem, line, cmd, this.props.width); + sw.loadTerminalRenderer(termElem, line, cmd, this.props.width); mobx.action(() => this.termLoaded.set(true))(); } diff --git a/src/model.ts b/src/model.ts index 613dfc4c0..ffd9965cb 100644 --- a/src/model.ts +++ b/src/model.ts @@ -5,8 +5,9 @@ import {debounce} from "throttle-debounce"; import {handleJsonFetchResponse, base64ToArray, genMergeData, genMergeSimpleData, boundInt, isModKeyPress} from "./util"; import {TermWrap} from "./term"; import {v4 as uuidv4} from "uuid"; -import type {SessionDataType, WindowDataType, LineType, RemoteType, HistoryItem, RemoteInstanceType, RemotePtrType, CmdDataType, FeCmdPacketType, TermOptsType, RemoteStateType, ScreenDataType, ScreenWindowType, ScreenOptsType, LayoutType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, UIContextType, HistoryInfoType, HistoryQueryOpts, FeInputPacketType, TermWinSize, RemoteInputPacketType, FeStateType, ContextMenuOpts, RendererContext, RendererModel} from "./types"; +import type {SessionDataType, WindowDataType, LineType, RemoteType, HistoryItem, RemoteInstanceType, RemotePtrType, CmdDataType, FeCmdPacketType, TermOptsType, RemoteStateType, ScreenDataType, ScreenWindowType, ScreenOptsType, LayoutType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, UIContextType, HistoryInfoType, HistoryQueryOpts, FeInputPacketType, TermWinSize, RemoteInputPacketType, FeStateType, ContextMenuOpts, RendererContext, RendererModel, PtyDataType} from "./types"; import {WSControl} from "./ws"; +import {ImageRenderer} from "./imagerenderer"; var GlobalUser = "sawka"; const DefaultCellWidth = 7.203125; @@ -549,7 +550,7 @@ class ScreenWindow { return false; } - connectElem(elem : Element, line : LineType, cmd : Cmd, width : number) { + loadTerminalRenderer(elem : Element, line : LineType, cmd : Cmd, width : number) { let cmdId = cmd.cmdId; let termWrap = this.getRenderer(cmdId); if (termWrap != null) { @@ -2415,6 +2416,33 @@ function cmdPacketString(pk : FeCmdPacketType) : string { return parts.join(" "); } +function _getPtyDataFromUrl(url : string) : Promise { + let ptyOffset = 0; + let fetchHeaders = GlobalModel.getFetchHeaders(); + return fetch(url, {headers: fetchHeaders}).then((resp) => { + if (!resp.ok) { + throw new Error(sprintf("Bad fetch response for /api/ptyout: %d %s", resp.status, resp.statusText)); + } + let ptyOffsetStr = resp.headers.get("X-PtyDataOffset"); + if (ptyOffsetStr != null && !isNaN(parseInt(ptyOffsetStr))) { + ptyOffset = parseInt(ptyOffsetStr); + } + return resp.arrayBuffer(); + }).then((buf) => { + return {pos: ptyOffset, data: new Uint8Array(buf)}; + }); +} + +function getPtyData(sessionId : string, cmdId : string) { + let url = sprintf(GlobalModel.getBaseHostPort() + "/api/ptyout?sessionid=%s&cmdid=%s", sessionId, cmdId); + return _getPtyDataFromUrl(url); +} + +function getRemotePtyData(remoteId : string) { + let url = sprintf(GlobalModel.getBaseHostPort() + "/api/remote-pty?remoteid=%s", this.getContextRemoteId()); + return _getPtyDataFromUrl(url); +} + let GlobalModel : Model = null; let GlobalCommandRunner : CommandRunner = null; if ((window as any).GlobalModel == null) { @@ -2424,6 +2452,6 @@ if ((window as any).GlobalModel == null) { GlobalModel = (window as any).GlobalModel; GlobalCommandRunner = (window as any).GlobalCommandRunner; -export {Model, Session, Window, GlobalModel, GlobalCommandRunner, Cmd, Screen, ScreenWindow, riToRPtr, windowWidthToCols, windowHeightToRows, termWidthFromCols, termHeightFromRows}; +export {Model, Session, Window, GlobalModel, GlobalCommandRunner, Cmd, Screen, ScreenWindow, riToRPtr, windowWidthToCols, windowHeightToRows, termWidthFromCols, termHeightFromRows, getPtyData, getRemotePtyData}; diff --git a/src/term.ts b/src/term.ts index 72a0603a9..845bf650c 100644 --- a/src/term.ts +++ b/src/term.ts @@ -3,9 +3,9 @@ import {Terminal} from 'xterm'; import {sprintf} from "sprintf-js"; import {boundMethod} from "autobind-decorator"; import {v4 as uuidv4} from "uuid"; -import {GlobalModel, GlobalCommandRunner, termHeightFromRows, windowWidthToCols, windowHeightToRows} from "./model"; +import {GlobalModel, GlobalCommandRunner, termHeightFromRows, windowWidthToCols, windowHeightToRows, getPtyData, getRemotePtyData} from "./model"; import {boundInt} from "./util"; -import type {TermOptsType, TermWinSize, RendererContext, WindowSize} from "./types"; +import type {TermOptsType, TermWinSize, RendererContext, WindowSize, PtyDataType} from "./types"; type DataUpdate = { data : Uint8Array, @@ -244,12 +244,17 @@ class TermWrap { this.resize({rows, cols}); } - _getReloadUrl() : string { - if (this.getContextRemoteId() != null) { - return sprintf(GlobalModel.getBaseHostPort() + "/api/remote-pty?remoteid=%s", this.getContextRemoteId()); + _reloadThenHandler(ptydata : PtyDataType) { + this.reloading = false; + this.ptyPos = ptydata.pos; + this.receiveData(ptydata.pos, ptydata.data, "reload-main"); + for (let i=0; i { + this.updateUsedRows(true, "reload"); + }); } reload(delayMs : number) { @@ -258,35 +263,23 @@ class TermWrap { } this.reloading = true; this.terminal.reset(); - let url = this._getReloadUrl(); - let ptyOffset = 0; - let fetchHeaders = GlobalModel.getFetchHeaders(); - fetch(url, {headers: fetchHeaders}).then((resp) => { - if (!resp.ok) { - mobx.action(() => { this.loadError.set(true); })(); - this.dataUpdates = []; - throw new Error(sprintf("Bad fetch response for /api/ptyout: %d %s", resp.status, resp.statusText)); - } - let ptyOffsetStr = resp.headers.get("X-PtyDataOffset"); - if (ptyOffsetStr != null && !isNaN(parseInt(ptyOffsetStr))) { - ptyOffset = parseInt(ptyOffsetStr); - } - return resp.arrayBuffer(); - }).then((buf) => { + let rtnp : Promise = null; + if (this.getContextRemoteId() != null) { + rtnp = getRemotePtyData(this.getContextRemoteId()); + } + else { + let termContext = this.getRendererContext(); + rtnp = getPtyData(termContext.sessionId, termContext.cmdId); + } + rtnp.then((ptydata) => { setTimeout(() => { - this.reloading = false; - this.ptyPos = ptyOffset; - this.receiveData(ptyOffset, new Uint8Array(buf), "reload-main"); - for (let i=0; i { - this.updateUsedRows(true, "reload"); - }); + this._reloadThenHandler(ptydata); }, delayMs); }).catch((e) => { - console.log("error reloading terminal", e); + mobx.action(() => { this.loadError.set(true); })(); + this.dataUpdates = []; + this.reloading = false; + console.log("error reloading terminal", this.termContext, e); }); } diff --git a/src/types.ts b/src/types.ts index fbdff1a90..67aa48126 100644 --- a/src/types.ts +++ b/src/types.ts @@ -343,16 +343,14 @@ type RendererContext = { }; type RendererModel = { - reload : (delayMs : number) => void, dispose : () => void, + reload : (delayMs : number) => void, receiveData : (pos : number, data : Uint8Array, reason? : string) => void, cmdDone : () => void, resizeWindow : (size : WindowSize) => void, resizeCols : (cols : number) => void, giveFocus : () => void, getUsedRows : () => number, - - focusHandler : (focus : boolean) => void; }; type WindowSize = { @@ -360,4 +358,9 @@ type WindowSize = { width: number, }; -export type {SessionDataType, LineType, RemoteType, RemoteStateType, RemoteInstanceType, WindowDataType, HistoryItem, CmdRemoteStateType, FeCmdPacketType, TermOptsType, CmdStartPacketType, CmdDataType, ScreenDataType, ScreenOptsType, ScreenWindowType, LayoutType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, RemotePtrType, UIContextType, HistoryInfoType, HistoryQueryOpts, WatchScreenPacketType, TermWinSize, FeInputPacketType, RemoteInputPacketType, RemoteEditType, FeStateType, ContextMenuOpts, RendererContext, WindowSize, RendererModel}; +type PtyDataType = { + pos : number, + data : Uint8Array, +}; + +export type {SessionDataType, LineType, RemoteType, RemoteStateType, RemoteInstanceType, WindowDataType, HistoryItem, CmdRemoteStateType, FeCmdPacketType, TermOptsType, CmdStartPacketType, CmdDataType, ScreenDataType, ScreenOptsType, ScreenWindowType, LayoutType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, RemotePtrType, UIContextType, HistoryInfoType, HistoryQueryOpts, WatchScreenPacketType, TermWinSize, FeInputPacketType, RemoteInputPacketType, RemoteEditType, FeStateType, ContextMenuOpts, RendererContext, WindowSize, RendererModel, PtyDataType};