diff --git a/src/types.ts b/src/types.ts index bd50f7eb..87e0a570 100644 --- a/src/types.ts +++ b/src/types.ts @@ -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}; diff --git a/src/webshare-elems.tsx b/src/webshare-elems.tsx index af01b946..02ebf9a6 100644 --- a/src/webshare-elems.tsx +++ b/src/webshare-elems.tsx @@ -18,7 +18,9 @@ type OArr = mobx.IObservableArray; type OMap = mobx.ObservableMap; // 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)) { diff --git a/src/webshare-model.ts b/src/webshare-model.ts index 77af2f87..77e4846b 100644 --- a/src/webshare-model.ts +++ b/src/webshare-model.ts @@ -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 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 { + 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); diff --git a/src/webshare-ws.ts b/src/webshare-ws.ts index bee0a7ef..030723f6 100644 --- a/src/webshare-ws.ts +++ b/src/webshare-ws.ts @@ -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); } }