Skip to content

Commit 1742c19

Browse files
authored
resize terminal on restoring state (#1100) (backport from dev0.9) (#1116)
1 parent d65eabe commit 1742c19

File tree

3 files changed

+33
-5
lines changed

3 files changed

+33
-5
lines changed

frontend/app/store/services.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ class BlockServiceType {
1010
GetControllerStatus(arg2: string): Promise<BlockControllerRuntimeStatus> {
1111
return WOS.callBackendService("block", "GetControllerStatus", Array.from(arguments))
1212
}
13-
SaveTerminalState(arg2: string, arg3: string, arg4: string, arg5: number): Promise<void> {
13+
14+
// save the terminal state to a blockfile
15+
SaveTerminalState(blockId: string, state: string, stateType: string, ptyOffset: number, termSize: TermSize): Promise<void> {
1416
return WOS.callBackendService("block", "SaveTerminalState", Array.from(arguments))
1517
}
1618
SaveWaveAiData(arg2: string, arg3: OpenAIPromptMessageType[]): Promise<void> {

frontend/app/view/term/termwrap.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,21 @@ export class TermWrap {
216216
if (cacheFile != null) {
217217
ptyOffset = cacheFile.meta["ptyoffset"] ?? 0;
218218
if (cacheData.byteLength > 0) {
219+
const curTermSize: TermSize = { rows: this.terminal.rows, cols: this.terminal.cols };
220+
const fileTermSize: TermSize = cacheFile.meta["termsize"];
221+
let didResize = false;
222+
if (
223+
fileTermSize != null &&
224+
(fileTermSize.rows != curTermSize.rows || fileTermSize.cols != curTermSize.cols)
225+
) {
226+
console.log("terminal restore size mismatch, temp resize", fileTermSize, curTermSize);
227+
this.terminal.resize(fileTermSize.cols, fileTermSize.rows);
228+
didResize = true;
229+
}
219230
this.doTerminalWrite(cacheData, ptyOffset);
231+
if (didResize) {
232+
this.terminal.resize(curTermSize.cols, curTermSize.rows);
233+
}
220234
}
221235
}
222236
const { data: mainData, fileInfo: mainFile } = await fetchWaveFile(this.blockId, TermFileName, ptyOffset);
@@ -268,8 +282,9 @@ export class TermWrap {
268282
return;
269283
}
270284
const serializedOutput = this.serializeAddon.serialize();
271-
console.log("idle timeout term", this.dataBytesProcessed, serializedOutput.length);
272-
services.BlockService.SaveTerminalState(this.blockId, serializedOutput, "full", this.ptyOffset);
285+
const termSize: TermSize = { rows: this.terminal.rows, cols: this.terminal.cols };
286+
console.log("idle timeout term", this.dataBytesProcessed, serializedOutput.length, termSize);
287+
services.BlockService.SaveTerminalState(this.blockId, serializedOutput, "full", this.ptyOffset, termSize);
273288
this.dataBytesProcessed = 0;
274289
}
275290

pkg/service/blockservice/blockservice.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,14 @@ func (bs *BlockService) GetControllerStatus(ctx context.Context, blockId string)
3838
return bc.GetRuntimeStatus(), nil
3939
}
4040

41-
func (bs *BlockService) SaveTerminalState(ctx context.Context, blockId string, state string, stateType string, ptyOffset int64) error {
41+
func (*BlockService) SaveTerminalState_Meta() tsgenmeta.MethodMeta {
42+
return tsgenmeta.MethodMeta{
43+
Desc: "save the terminal state to a blockfile",
44+
ArgNames: []string{"ctx", "blockId", "state", "stateType", "ptyOffset", "termSize"},
45+
}
46+
}
47+
48+
func (bs *BlockService) SaveTerminalState(ctx context.Context, blockId string, state string, stateType string, ptyOffset int64, termSize waveobj.TermSize) error {
4249
_, err := wstore.DBMustGet[*waveobj.Block](ctx, blockId)
4350
if err != nil {
4451
return err
@@ -52,7 +59,11 @@ func (bs *BlockService) SaveTerminalState(ctx context.Context, blockId string, s
5259
if err != nil {
5360
return fmt.Errorf("cannot save terminal state: %w", err)
5461
}
55-
err = filestore.WFS.WriteMeta(ctx, blockId, "cache:term:"+stateType, filestore.FileMeta{"ptyoffset": ptyOffset}, true)
62+
fileMeta := filestore.FileMeta{
63+
"ptyoffset": ptyOffset,
64+
"termsize": termSize,
65+
}
66+
err = filestore.WFS.WriteMeta(ctx, blockId, "cache:term:"+stateType, fileMeta, true)
5667
if err != nil {
5768
return fmt.Errorf("cannot save terminal state meta: %w", err)
5869
}

0 commit comments

Comments
 (0)