ws merging working

This commit is contained in:
sawka 2023-03-30 01:00:04 -07:00
parent 7609909e6d
commit 62f6be22ea
4 changed files with 99 additions and 6 deletions

View File

@ -537,4 +537,26 @@ type WebFullScreen = {
vts : number,
}
export type {SessionDataType, LineType, RemoteType, RemoteStateType, RemoteInstanceType, HistoryItem, CmdRemoteStateType, FeCmdPacketType, TermOptsType, CmdStartPacketType, CmdDataType, ScreenDataType, ScreenOptsType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, RemotePtrType, UIContextType, HistoryInfoType, HistoryQueryOpts, WatchScreenPacketType, TermWinSize, FeInputPacketType, RemoteInputPacketType, RemoteEditType, FeStateType, ContextMenuOpts, RendererContext, WindowSize, RendererModel, PtyDataType, BookmarkType, ClientDataType, PlaybookType, PlaybookEntryType, HistoryViewDataType, RenderModeType, AlertMessageType, HistorySearchParams, ScreenLinesType, FocusTypeStrs, HistoryTypeStrs, RendererOpts, RendererPluginType, SimpleBlobRendererComponent, RendererModelContainerApi, RendererModelInitializeParams, RendererOptsUpdate, ClientMigrationInfo, WebShareOpts, RemoteStatusTypeStrs, WebFullScreen, WebScreen, WebLine, WebCmd, RemoteTermContext, TermContextUnion, WebRemote};
type PtyDataUpdate = {
screenid : string,
lineid : string,
ptypos : number,
data : string,
};
type WebScreenUpdate = {
type : string,
screenid : string,
screen : WebScreen,
lines : WebLine[],
cmds : WebCmd[],
ptydata : PtyDataUpdate[],
};
type WebShareWSMessage = {
type : string,
screenid : string,
viewkey : string,
}
export type {SessionDataType, LineType, RemoteType, RemoteStateType, RemoteInstanceType, HistoryItem, CmdRemoteStateType, FeCmdPacketType, TermOptsType, CmdStartPacketType, CmdDataType, ScreenDataType, ScreenOptsType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, RemotePtrType, UIContextType, HistoryInfoType, HistoryQueryOpts, WatchScreenPacketType, TermWinSize, FeInputPacketType, RemoteInputPacketType, RemoteEditType, FeStateType, ContextMenuOpts, RendererContext, WindowSize, RendererModel, PtyDataType, BookmarkType, ClientDataType, PlaybookType, PlaybookEntryType, HistoryViewDataType, RenderModeType, AlertMessageType, HistorySearchParams, ScreenLinesType, FocusTypeStrs, HistoryTypeStrs, RendererOpts, RendererPluginType, SimpleBlobRendererComponent, RendererModelContainerApi, RendererModelInitializeParams, RendererOptsUpdate, ClientMigrationInfo, WebShareOpts, RemoteStatusTypeStrs, WebFullScreen, WebScreen, WebLine, WebCmd, RemoteTermContext, TermContextUnion, WebRemote, WebScreenUpdate, PtyDataUpdate, WebShareWSMessage};

View File

@ -18,7 +18,9 @@ type OArr<V> = mobx.IObservableArray<V>;
type OMap<K,V> = mobx.ObservableMap<K,V>;
// TODO selection
// TODO websocket
// TODO bug with finishing up the ptydata
// TODO bug with ptydata late -- not updating usedrows
// TODO scroll screen when new cmds arrive (selection)
function makeFullRemoteRef(ownerName : string, remoteRef : string, name : string) : string {
if (isBlank(ownerName) && isBlank(name)) {

View File

@ -1,7 +1,7 @@
import * as mobx from "mobx";
import {sprintf} from "sprintf-js";
import {boundMethod} from "autobind-decorator";
import {handleJsonFetchResponse, isModKeyPress} from "./util";
import {handleJsonFetchResponse, isModKeyPress, base64ToArray} from "./util";
import * as T from "./types";
import {TermWrap} from "./term";
import * as lineutil from "./lineutil";
@ -58,12 +58,81 @@ class WebShareModelClass {
return 12;
}
mergeLine(fullScreen : T.WebFullScreen, newLine : T.WebLine) {
for (let i=0; i<fullScreen.lines.length; i++) {
let line = fullScreen.lines[i];
if (line.lineid == newLine.lineid) {
fullScreen.lines[i] = newLine;
return;
}
if (line.linenum > newLine.linenum) {
fullScreen.lines.splice(i, 0, newLine);
return;
}
}
fullScreen.lines.push(newLine);
}
mergeCmd(fullScreen : T.WebFullScreen, newCmd : T.WebCmd) {
for (let i=0; i<fullScreen.cmds.length; i++) {
let cmd = fullScreen.cmds[i];
if (cmd.lineid == newCmd.lineid) {
fullScreen.cmds[i] = newCmd;
return;
}
}
fullScreen.cmds.push(newCmd);
}
mergeUpdate(msg : T.WebScreenUpdate) {
if (msg.screenid != this.screenId) {
console.log("bad WebScreenUpdate, wrong screenid", msg.screenid);
return;
}
console.log("merge", msg);
mobx.action(() => {
let fullScreen = this.screen.get();
if (msg.screen) {
fullScreen.screen = msg.screen;
}
if (msg.lines != null && msg.lines.length > 0) {
for (let line of msg.lines) {
this.mergeLine(fullScreen, line);
}
}
if (msg.cmds != null && msg.cmds.length > 0) {
for (let cmd of msg.cmds) {
this.mergeCmd(fullScreen, cmd);
}
}
if (msg.ptydata != null && msg.ptydata.length > 0) {
for (let data of msg.ptydata) {
let termWrap = this.getTermWrap(data.lineid);
if (termWrap == null) {
continue;
}
termWrap.receiveData(data.ptypos, base64ToArray(data.data));
}
}
})();
}
wsMessageCallback(msg : any) {
if (msg.type == "webscreen:update") {
this.mergeUpdate(msg);
return;
}
console.log("ws message", msg);
}
setWebFullScreen(screen : T.WebFullScreen) {
mobx.action(() => {
if (screen.lines == null) {
screen.lines = [];
}
if (screen.cmds == null) {
screen.cmds = [];
}
this.screen.set(screen);
if (screen.lines != null && screen.lines.length > 0) {
this.selectedLine.set(screen.lines[screen.lines.length-1].linenum);

View File

@ -1,7 +1,7 @@
import * as mobx from "mobx";
import {sprintf} from "sprintf-js";
import {boundMethod} from "autobind-decorator";
import {WatchScreenPacketType} from "./types";
import {WebShareWSMessage} from "./types";
import dayjs from "dayjs";
class WebShareWSControl {
@ -153,7 +153,7 @@ class WebShareWSControl {
this.messageCallback(eventData);
}
catch (e) {
this.log("[error] messageCallback", e);
this.log("[error] messageCallback " + e);
}
}
}
@ -182,7 +182,7 @@ class WebShareWSControl {
}
sendWebShareInit() {
let pk : WatchScreenPacketType = {"type": "webshare", screenid: this.screenId, viewkey: this.viewKey};
let pk : WebShareWSMessage = {"type": "webshare", screenid: this.screenId, viewkey: this.viewKey};
this.pushMessage(pk);
}
}