mirror of
https://github.com/wavetermdev/waveterm.git
synced 2025-03-09 13:00:53 +01:00
move reload url code to model from term
This commit is contained in:
parent
5e7fe63877
commit
c87d4f787c
@ -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))();
|
||||
}
|
||||
|
||||
|
34
src/model.ts
34
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<PtyDataType> {
|
||||
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};
|
||||
|
||||
|
||||
|
59
src/term.ts
59
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.dataUpdates.length; i++) {
|
||||
this.receiveData(this.dataUpdates[i].pos, this.dataUpdates[i].data, "reload-update-" + i);
|
||||
}
|
||||
let termContext = this.getRendererContext();
|
||||
return sprintf(GlobalModel.getBaseHostPort() + "/api/ptyout?sessionid=%s&cmdid=%s", termContext.sessionId, termContext.cmdId);
|
||||
this.dataUpdates = [];
|
||||
this.terminal.write(new Uint8Array(), () => {
|
||||
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<PtyDataType> = 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.dataUpdates.length; i++) {
|
||||
this.receiveData(this.dataUpdates[i].pos, this.dataUpdates[i].data, "reload-update-" + i);
|
||||
}
|
||||
this.dataUpdates = [];
|
||||
this.terminal.write(new Uint8Array(), () => {
|
||||
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);
|
||||
});
|
||||
}
|
||||
|
||||
|
11
src/types.ts
11
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};
|
||||
|
Loading…
Reference in New Issue
Block a user